Buonasera a tutti. Ho sviluppato un semplice BackTest sulla base di un indicatore per le criptovalute. Il BackTest compra quando l’indicatore e’ +1 e vende (allo scoperto) quando e’ a -1. In entrambi i casi chiude la posizione precedente prima di invertire. Quando l’indicatore e’ a 0 semplicemente aspetta. Tuttavia mi trovo delle operazioni inaspettate anche quando l’indicatore e’ = 0 (vedi figura allegata). C’e’ un modo per fare il debugging e capire perche’ si producono queste operazioni inattese? Grazie.
// Definition of code parameters
DEFPARAM CumulateOrders = False // Cumulating positions deactivated
ONCE InitialCash = 10000
CurrentCash = InitialCash + STRATEGYPROFIT
Units = ( CurrentCash/10 * 0.5 ) / Close
// Conditions to enter long positions
indicator = CALL "MyIndicators: CriptoFondU"
c1 = (indicator = 1)
IF c1 THEN
BUY Units CONTRACTS AT MARKET
ENDIF
// Conditions to enter short positions
c2 = (indicator = -1)
IF c2 THEN
SELLSHORT Units CONTRACTS AT MARKET
ENDIF
Si, per fare debugging aggiungi:
GRAPH NomeVariabile
alla fine del programma (puoi indicare molte varibili, sui conti reali c’è un limite di 5, ma in demo puoi metterne quante ne vuoi).
Quando il backtest termina, ti farà vedere una finestra in più, quella delle variabili (allargala se è troppo piccola, rimpicciolendo le altre e magri restringi la scala di quella sola finestra) e quando terrai il mouse fermo su una candela ti farà vedere tutti i valori relativi a qual preciso periodo, per cui vedrai quando un errore diventa errato ed in quale candela avviene.
Nella foto vedrai che ho aggiunto queste linee alla fine:
GRAPH x1 coloured(255,0,0,255) AS "x1"
GRAPH y1 coloured(0,255,0,255) AS "y1"
GRAPHONPRICE SellPrice coloured(255,0,0,255) AS "SellPrice
Le variabili utilizzate con GRAPH vengono evidenziate nell’apposita finestra, perché sarebbero fuori scala sui prezzi. GRAPHONPRICE plotta invece le variabili SUL prezzo, purché siano in scala, tipo un prezzo o una media, eccc… Se plotti 1 sul grafico DAX deve rimpicciolirti tutto ad 1/12000esimo per farti vedere sia il prezzo che la variabile, col risultato che sarebbe illeggibile.
Ciao Roberto, ho fatto come mi hai consigliato e trovo una discrepanza fra l’output dell’indicatore mostrato da solo e l’output dello stesso indicatore chiamato durante il backtest (CALL). Vedi screenshot allegato. Mi aspetterei lo stesso identico risultato, invece no. Sai da cosa potrebbe dipendere?
È difficile capire dalla foto, non vedo bene l’allineamento tra i segnali e le candele.
Tieni presente che le frecce di entrata delle operazioni sono messe sotto la candela successiva al segnale, perché il segnale lo rileva alla chiusura della candela ed entra all’inizio della successiva.
Non e’ un problema di candela precedente o successiva. Se apri il mio screenshot vedrai le aree evidenziate in giallo verso la sinistra della figura. L’indicatore original e’ l’ultimo in basso. Nell’area evidenziata non produce alcun segnale (il suo valore e’ zero), mentre lo stesso indicatore chiamato nel backtest (aree evidenziate sopra) produce un segnale (andando da -1 a 1) nello stesso identico punto, il che non ha alcun senso.
Il codice è corretto, per quanto riguarda la strategia, l’unica cosa è procare a sostituire la riga 14 con:
IF c1 = 1 THEN
e la riga 21 con:
IF c2 = 1 THEN
Un’altra cosa è di assicurarti di avere un numero più elevato di barre, sul grafico metti 10000 unità ed alla riga 3 metti:
DEFPARAM PreLoadBars = 10000
non vorrei avesse un numero insufficiente di barre per fare i calcoli corretti dell’indicatore.
Nel caso non sia niente di tutto questo… devi postare il codice dell’indicatore per potere replicare le tue operazioni.
Ho provato a simplificare il backtest in modo da usare direttamente l’output dell’indicatore. Ho anche aggiunto la riga che hai consigliato. Niente da fare. A qualsiasi timeframe vedo differenze fra l’indicatore all’interno del backtest e quello direttamente sul prezzo (vedi immagine allegata). Nel caso 1 l’indicatore da’ un segnale sul prezzo ma nel backtest si vedono tre segnali. Nel caso 2 non ci sono segnali dell’indicatore sul prezzo ma nel backtest ci sono due segnali. Credo si tratti di un bug. L’indicatore e’ esattamente lo stesso in entrambi i casi (la stessa funzione), quindi non vedo come possa dipendere dal codice dell’indicatore, a meno che backtest ed indicatore usino in un qualche modo timeframe diversi.
Gli indicatori usano solo il TF del grafico dove sono stati caricati.
La tua strategia utilizza solo il TF da dove è stata eseguita, quindi non è quello il problema.
Prova ad inserire l’indicatore all’interno della strategia, invece di utilizzare CALL, se non è eccessivamente lungo.
in tal modo vedi, anche con GRAPH e/o GRAPHONPRICE se ci sono problemi nel calcolo.
Se non trovi una soluzione l’unica cosa da fare è premere Ctrl+M dalla piattaforma per aprire una richiesta d’assistenza.