Buongiorno a tutti,
sto cercando di ricreare in linguaggio probuilder, l’equity di una semplice strategia giornaliera ProOrder che ho pubblicato a questo link (https://www.prorealcode.com/prorealtime-trading-strategies/universal-xbody-strategy-on-cac-1day/) ma sto riscontrando dei problemi nella forma dell’equity che nell’indicatore adhoc non rispecchia perfettamente i risultati in backtest (vorrei l’equity per eseguire delle ottimizzazioni automatiche) . Per ricreare l’equity ho eseguito la differenza dei body delle candele profittevoli meno i body delle candele perdenti. Questo è il codice da correggere, grazie a chiunque mi vorrà aiutare:
//***********************************************************************************************************
//------------------ SYSTEM VARIABLES---------------------------------------
//AUDUSD Values: -------------------------------------------- Ottimization info
period=394// Optimize best value for each Symbol, range=1-1000, with step=1
mode=1// Optimize the best trading mode , range=1-4, with step=1
invertsignal=1// 1=positive signal, -1=negative signal, range=-1-1, with step=2
//***********************************************************************************************
//------------------ SYSTEM FILTER---------------------------------------
filter1=0// to set after the variable optimization, range=1-100, with step=1
filter2=0// to set after the variable optimization, range=1-100, with step=1
//------------------ INDICATOR ---------------------------------------
body=close-open
var=(body-body[1])
sumvar=summation[period](var)
if sumvar>filter1*pipsize then
green=(sumvar)
endif
if sumvar<-filter2*pipsize then
red=(sumvar)
endif
if mode=1 then
c1=red<red[1]
c2=green>green[1]
endif
if mode=2 then
c1=red>red[1]
c2=green<green[1]
endif
if mode=3 then
c1=red<red[1]
c2=green<green[1]
endif
if mode=4 then
c1=red>red[1]
c2=green>green[1]
endif
if c1 then
signal=1*invertsignal
elsif c2 then
signal=-1*invertsignal
endif
if close>open then
sig=1
else
sig=-1
endif
if barindex>a then
once profitto=0
once perdita=0
if signal[1]=sig then
profitto=ABS(body/pipsize)+profitto
elsif signal[1]<>sig then
perdita=ABS(body/pipsize)+perdita
endif
equity=profitto-perdita
endif
return equity as "equity"
Errata corrige
//***********************************************************************************************************
//------------------ SYSTEM VARIABLES---------------------------------------
//AUDUSD Values: -------------------------------------------- Ottimization info
period=394// Optimize best value for each Symbol, range=1-1000, with step=1
mode=1// Optimize the best trading mode , range=1-4, with step=1
invertsignal=1// 1=positive signal, -1=negative signal, range=-1-1, with step=2
//***********************************************************************************************
//------------------ SYSTEM FILTER---------------------------------------
filter1=0// to set after the variable optimization, range=1-100, with step=1
filter2=0// to set after the variable optimization, range=1-100, with step=1
//------------------ INDICATOR ---------------------------------------
body=close-open
var=(body-body[1])
sumvar=summation[period](var)
if sumvar>filter1*pipsize then
green=(sumvar)
endif
if sumvar<-filter2*pipsize then
red=(sumvar)
endif
if mode=1 then
c1=red<red[1]
c2=green>green[1]
endif
if mode=2 then
c1=red>red[1]
c2=green<green[1]
endif
if mode=3 then
c1=red<red[1]
c2=green<green[1]
endif
if mode=4 then
c1=red>red[1]
c2=green>green[1]
endif
if c1 then
signal=1*invertsignal
elsif c2 then
signal=-1*invertsignal
endif
if close>open then
sig=1
else
sig=-1
endif
if barindex>period then
once profitto=0
once perdita=0
if signal[1]=sig then
profitto=ABS(body/pipsize)+profitto
elsif signal[1]<>sig then
perdita=ABS(body/pipsize)+perdita
endif
equity=profitto-perdita
endif
return equity as "equity
Grazie per la tua condivisione Davide! 🙂
Grazie tante Nicholas! Se potessi darmi una mano per migliorare ancora di più questa strategia, non sarei il solo ad essertene grato. Ho bisogno della vostra esperienza di programmatori per renderla più indipendente dal timeframe e userfriendly. L’intento di questo post era quello di ricreare l’equity in ambiente Probuilder, per ottimizzare il periodo della strategia in modo automatico .
Ps: ho già provato a fare una cosa simile, creando tanti indicatori uguali al suddetto, uno per ogni periodo ma in questo modo richiederebbe 1000 indicatori riuniti in un unico indicatore, il che è quasi impossibile.
Parli di strategia ed hai allegato la foto di un backtest, ma questo è un indicatore!
Cosa desideri fare con questo indicatore?
Ciao Roberto.
Si! Nell’immagine si vede nella prima finestra, in alto, la strategia backtestata su AUDUSD, nella seconda è l’equity della strategia calcolata direttamente dall’indicatore, e l’ultima è il prezzo (allego l’immagine insieme al codice della strategia e dell’indicatore). Questo indicatore dovrebbe disegnare la stessa equity della strategia, ma come puoi vedere nell’immagine non sono affatto uguali. La mia domanda è:
C’è un modo per disegnare la stessa equity della strategia con un indicatore?
Per il calcolo del Profitto, nella strategia, aggiungi alla fine queste righe e vedrai che CURVA sarà identica alla Equity Line del backtest (io ho messo 100000 come capitale iniziale, tu metti quello che usi nel tuo backtest):
//------------------------------------------------------------------------------------
IF OnMarket THEN
tempProfit = PositionPrice * PositionPerf * PipValue
ENDIF
Curva = round(StrategyProfit + tempProfit + 100000,1)
graph Curva
//------------------------------------------------------------------------------------
devi quindi cercare di ottenere, nell’indicatore, i valori usati nella strategia:
- calcolare STRATEGYPROFIT quando non sei più a mercato ed è appena stata chiusa un’operazione, dato dal prezzo di uscita – quello d’entrata (o il prezzo medio se accumuli) o viceversa se sei Short
- calcolare il profitto/perdita temporaneo mentre un’operazione è in corso con la formula round(StrategyProfit + tempProfit + 100000,1), sostituendo 100000 con il Capitale che usi nel backtest.
Esatto, si può usare solo in backtest, anche perché LIVE non potrebbe stampare niente, sarebbe inutile!
LIVE si può usare solo la variabile per prendere eventuali decisioni sul da farsi, secondo il suo andamento.