Ciao Roberto, e’ possibile creare un graph che indichi il profitto netto di un Ts depurato dallo slippage?
Sarebbe da calcolare il numero di eseguiti del Ts, moltiplicarli per i pips di slippage (diversi da strumento a strumento ed orario, ma questo ora è secondario), il tutto da sottrarre al profitto della strategia (strategyProfit).
Il problema principale che ho è come determinare il numero di eseguiti complessivi, anche perchè alcuni derivano da ordini a mercato, altri da ordini pendenti.
Riesci a creare questo graph? Grazie
Se è utile per semplificare il calcolo gli ordini pendenti individuati dalle funzioni SET STOP… si potrebbero anche eliminare e riscrivere nelle condizioni di entrata in forma equivalente.
Es.. al posto di: set stop %loss 0.7, si potrebbe scrivere dopo le mie condizioni:
stopLoss =close*0.993
buy 1 contract at market
sell at stopLoss STOP
endif
…
Lo slippage non si può sapere, quindi non è possibile tenerne conto.
STRATEGYPROFIT è il risultato, aggiornato all’ultima operazione chiusa, del totale dei profitti/perdite di ogni operazione, a mercato o pendente che sia.
Se vuoi puoi aggiungerci, ogni barra, il profitto temporaneo dato da:
// Pips (per posizione) = PositionPerf * PositionPrice / PipSize
// Pips (totali) = PositionPerf * PositionPrice / PipSize * abs(CountOfPosition)
//
// Money (per posizione) = PositionPerf * PositionPrice / PipSize * pipvalue / abs(CountOfPosition)
// Money (totale) = PositionPerf * PositionPrice / PipSize * pipvalue
è più precisa, poi puoi farci una media, oppure una percentuale di variazione tra la barra corrente e N barre precedenti, ecc…
Lo so che lo slippage preciso non si può sapere, ma a me basta una cifra indicativa. Es, se sul Nasdaq c’è un punto di spread (che corrisponde a 10 pips), mi basta togliere 10 pips ad eseguito. Poi sottrarre da strategyProfit il numero di operazioni per questa cifra indicativa di slippage.
Non si avrà un equityLine perfetta, ma abbastanza indicativa (del resto anche gli stop, se non garantiti possono essere diversi….).
E’ fattibile in questo modo creare una formula non troppo complessa?
Se vuoi puoi usare una media puoi farlo. La formula è:
Slippage = X * Y * PipValue
dove:
- X è il numero di pips per operazione
- Y è il numero di operazioni eseguite
Calcolare Y non è sempre perfetto; questo metodo è il più preciso che sia riuscito a codificare:
If not OnMarket then
Y = 0
Else
Temp = abs(Countofposition) - abs(Countofposition[1])
If Temp = 0 then
If StrategyProfit <> StrategyProfit[1] then
Temp = 1
Endif
Endif
Y = Y + max(0,Temp)
Endif
Non funziona il contatore di operazioni Y. Se lo si visualizza con un graph si vede che non si sommano le posizioni di un certo periodo di backTest. Inoltre anche all’interno dei singoli giorni non funziona correttamente (non somma le operazioni).
Ho capito, ho sbagliato ad azzerare Y.
Sostituisci la riga 2 con:
ONCE Y = 0
Verrà eseguita una sola volta.
Ho modificato un pò il codice per renderlo più flessibile e trasparente. Controlla se va bene. Grazie
onePipValue = 0.10 //(es. cfd Nasdaq) // valore in euro di 1 pip
pipsPointRatio = 10 //(es. cfd Nasdaq) // numero di pips che compongono 1 punto
nContracts = 1 // numero di contratti utilizzati dal TS
onePointValue = onePipValue*pipsPointRatio
If not OnMarket then
ONCE A = 0 // A = numero di operazioni
Else
Temp = abs(Countofposition) - abs(Countofposition[1])
If Temp = 0 then
If StrategyProfit <> StrategyProfit[1] then
Temp = 1
Endif
Endif
A = A + max(0,Temp)
B = 2 * A // B = numero di eseguiti
C = 2 * A * nContracts * onePointValue // C = numero di eseguiti * numero di contratti
Endif
netEquity=strategyProfit-(C*pointValue)
Ecco i due graph:
graph strategyProfit //profitto lordo
graph netEquity coloured(0,191,255) //profitto netto con slippage incorporato
Se riesci probabilmente è meglio rendere più trasparente l’inserimento dello slippage all’inizio del codice. Nel caso sopra riportato ho messo 1 punto (= 10 pips) ad eseguito.
Il calcolo va bene, non penso possa essere migliorato. Il problema dell’assoluta precisione c’è, perché se tu sei a mercato con 4 posizioni e ad un certo punto 1 esce e ne entrano altre due (tutto sulla stessa barra), lo vedrai come un’operazione in più mentre in realtà sono due in più. Però questo NON può essere corretto perché non si sa quante sono le operazioni chiuse e quelle aperte. Forse si potrebbe SEMPRE aggiungere 1 quando STRATEGYPROFIT è <> dal precedente, invece che metterlo solo quando la differenza delle operazioni è zero. Si, credo questa variazione possa rendere quasi preciso al 100% il conteggio (ho spostato anche ONCE), resterebbero fuori solo doppie/triple posizioni chiuse, cioè se ne chiudono 2 e ne entrano 3 te ne segnala due e non tre (ma credo sia rarissimo):
ONCE Y = 0
If OnMarket then
Temp = abs(Countofposition) - abs(Countofposition[1])
Y = Y + max(0,Temp)
If StrategyProfit <> StrategyProfit[1] then
Y = Y + 1
Endif
Endif
E’ ovvio che è un valore medio, non può essere preciso ma credo possa darti un’idea concreta.
L’Equity Curve è quasi identica, si discosta leggermente sempre di più prioprio a causa dello slippage calcolato.
Su una cosa ho un dubbio, ma lo slippage influisce davvero? Se gestisci te, con ordini pendenti, sia lo SL che il TP allora si perché tu metti un ordine Stop e Limit ad un certo prezzo e se l’entrata è diversa ottieni uno Stop maggiore ed un TP minore, però se usi SET STOP LOSS X e SET TARGET PROFIT Y, non cambia niente con lo slippage, perché se hai messo 100 punti di SL e TP, che entri a mercato a 20000 o 20002 non fa differenza, avrai sempre X e Y punti di perdita o profitto alla fine in quanto è ProOrder che li gestisce automaticamente.
Sono d’accordo che con SET STOP LOSS e SET TARGET PROFIT cambia poco per quanto riguarda lo slippage.
Forse è più utile utilizzare la formula per calcolare soprattutto l’impatto dello spread sulla equityLine (come ho fatto involontariamente nel mio esempio in cui ho messo uno slippage predeterminato ad ogni operazione).
Questo (lo spread) è noto, ma SEMPRE largamente sottostimato nella equityLine fino a che non si calcola precisamente!
Se la curva del proBackTest venisse depurata dallo spread, da qualche slippage, e si tenesse conto dell’impatto del capital gain (considerato poi il regime dichiarativo, altrimenti l’impatto dell’amministrato è anche esso nettamente sottostimato) curve molto belle cambierebbero aspetto!
Alla fine penso di utilizare il tuo codice per visualizzare un equityLine senza spread (lo slippage come dicevi è poco influente e non si conosce mai). Per me è un codice utile.
Ho sistemato le due formule, guarda se vanno bene nel caso le volesse utilizzare qualche utente . CIAO
A)
onePipValue = 0.10 //(es. cfd Nasdaq) // valore in euro di 1 pip
nPipsSpread = 10 //(es. cfd Nasdaq) //inserire lo spread dello strumento tradato
nContracts = 1 // inserire il numero dei contratti utilizzati dal TS
spread=onePipValue*nPipsSpread
If not OnMarket then
ONCE A = 0 // A = numero di operazioni
else
Temp = abs(Countofposition) - abs(Countofposition[1])
if Temp = 0 then
If StrategyProfit <> StrategyProfit[1] then
Temp = 1
endif
endif
A = A + max(0,Temp)
B = 2 * A // B = numero di eseguiti
C = nContracts * B * spread // C = numero di eseguiti * numero di contratti * spread medio
Endif
netEquity=strategyProfit-(C*pointValue) // equityLine netta depurata dallo spread medio
//-------------------------------------------
graph strategyProfit //profitto lordo
graph netEquity coloured(0,191,255) //profitto netto con slippage incorporato
// ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
B) “Forse si potrebbe SEMPRE aggiungere 1 quando STRATEGYPROFIT è <> dal precedente, invece che metterlo solo quando la differenza delle operazioni è zero.
Si, credo questa variazione possa rendere quasi preciso al 100% il conteggio (ho spostato anche ONCE), resterebbero fuori solo doppie/triple posizioni chiuse, cioè se ne chiudono 2 e ne entrano 3 te ne segnala due e non tre (ma credo sia rarissimo)” (Roberto Gozzi)
onePipValue = 0.10 //(es. cfd Nasdaq) // valore in euro di 1 pip
nPipsSpread = 10 //(es. cfd Nasdaq) //inserire lo spread dello strumento tradato
nContracts = 1 // inserire il numero dei contratti utilizzati dal TS
spread=onePipValue*nPipsSpread
ONCE A = 0 // A = numero di operazioni
If OnMarket then
Temp = abs(Countofposition) - abs(Countofposition[1])
A = A + max(0,Temp)
If StrategyProfit <> StrategyProfit[1] then
A = A + 1
B = 2 * A // B = numero di eseguiti
C = nContracts * B * spread // C = numero di eseguiti * numero di contratti * spread medio
Endif
Endif
netEquity=strategyProfit-(C*pointValue) // equityLine netta depurata dallo spread medio
//---------------------------------------------
graph strategyProfit //profitto lordo
graph netEquity coloured(0,191,255) //profitto netto con slippage incorporato
//-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
in fondo nel graph va scritto: ” profitto netto con spread incorporato”
Perfetto, in un test le due equity erano identiche, in un altro con più accumuli, entrate ed uscite, la equity line nera era uguale, mentre quella celeste leggermente peggiore (ma di poco più di 100 euro).
Bene, credo sia molto utile per tutti.
Grazie per l’idea e per avere pubblicato un codice “chiavi in mano” che ognuno può aggiungere al proprio senza modificare niente (a parte i due valori iniziali)!