E’ possibile creare una condizione da aggiungere ad un qualsiasi TS (da utilizzare come filtro di Performance Decay della EquityLine) che visualizzi su X trades il rapporto tra RunUp (RU) e DrawDown (DD)? (quindi penso si debba utilizzare strategyProfit per conoscere i profitti dei vari trades)
In pratica vorrei mettere in standBy un TS quando negli ultimi X trades, il rapporto tra RU e DD scenda sotto il 20%.
Esempio: se un TS negli ultimi 50 trades ha un RU di 1000 euro, voglio, per continuare ad utilizzarlo, che il DD sia minore-uguale a 200 euro. Grazie
Si, si può fare, però devi avere un pò di pazienza perché devo farlo a “bocconi”, quando ho qualche momento libero.
Grazie Roberto.
Dopo molti test su molti TS ho notato che uno dei requisiti più importanti per evitare la perdita di performance è il rapporto RU su DD.
Ideale sarebbe che il DD non superi il 10% di RU. Fino al 20% è accettabile, sopra il TS non genera più profitti in quel periodo. Se questo rapporto peggiora, inizia una fase di decadenza della equity line.
Quindi prima di stoppare il TS perchè ha raggiunto il massimo DD, si potrebbe intervenire prima.
Quando lo hai costruito lo puoi provare anche nei tuoi TS cosi mi dici come ti sembra come idea e se si può migliorare. CIAO
Eccolo, ci sono le formule e per ultima il DDRUratio che ti da la percentuale, più è bassa migliore è il rapporto. Dopo c’è un codice che ho usato per i test.
Ci sono delle differenze tra i dati calcolati così e quelli di PRT (anche se non molto grandi), sia considerando il profitto/perdita in corso che non. Sarà una differenza di calcolo di cui non ho capito l’origine. Però il rapporto tra i due valori non cambia di molto:
ONCE Capital = 10000
ONCE MinPoint = Capital
ONCE MaxPoint = 0
ONCE MaxRU = 0
ONCE MaxDD = 0
//------------------------------------------
// EQUITY
Equity = Capital + StrategyProfit
TempProfit = PositionPerf * PositionPrice / PipSize
TempEquity = Equity + TempProfit
//------------------------------------------
// DrawDown
MaxPoint = max(MaxPoint,TempEquity)
DD = MaxPoint - TempEquity
MaxDD = max(MaxDD,DD)
//
//------------------------------------------
// RunUp
MinPoint = min(MinPoint,TempEquity)
RU = TempEquity - MinPoint
MaxRU = max(MaxRU,RU)
//------------------------------------------
// DD/RU ratio
DDRUratio = (MaxDD / MaxRU) * 100
//------------------------------------------
//
// test code (Dax,2 min,25K units)
//
avg = Average[38,1](close)
if close crosses over Avg and Not OnMarket then
buy at Market
elsif close crosses under Avg and Not OnMarket then
sellshort at Market
endif
set target pprofit 2000
set stop ploss 2000
//
if positionperf > 0.0006 then
sell at market
exitshort at market
endif
//
graph DDRUratio
L’esempio l’ho creato apposta per un buon rapporto, non è un codice che abbia molto senso!
Ciao Roberto, lo ho provato ed è utile da alcuni test.
Ho provato ad usarlo in questo modo: se il DDRUratio è maggiore di 20 allora vario l’ampiezza dello stoploss (ad esempio, ma può essere anche il take profit…). Si riescono così ad avere diversi parametri di rischio autoadattivi con l’andamento della equityline.
Un difetto tuttavia è che è cumulativo (caricati periodi differenti si hanno valore differenti).
Per renderlo pienamente efficiente bisognerebbe sommare un numero a scelta di operazioni sui cui calcolare il DDRUratio, es. 50 (ottimizzabile), ed avere così una curva progressiva simile ad una media mobile semplice, per cui dopo 50 operazioni si aggiunge la 51e si toglie la 1 della serie…
É complicato apportare questa modifica?
Si, non è semplicissimo. Occurre usare i vettori per salvare i 50 (o più o meno) valori di ciascun dato ed ogni volta ricalcolare il rapporto.
Non è comunque impossibile.
Con un pò di rtempo a disposizione riuscirò a farlo.
Eccolo:
// test code (DAX,1 hour,50K units) on PERIODS bars
//
ONCE Periods = 10
ONCE Capital = 10000
ONCE MinPoint = Capital
ONCE MaxPoint = 0
ONCE MaxRU = 0
ONCE MaxDD = 0
ONCE j = 0
//
IF BarIndex < 1 THEN
FOR i = 1 TO Periods
$Equity[i] = 0
$TempProfit[i] = 0
$TempEquity[i] = 0
$MaxPoint[i] = 0
$MinPoint[i] = Capital
$DD[i] = 0
$RU[i] = 0
NEXT
ENDIF
//
z1 = OnMarket[1] AND Not OnMarket
z2 = LongOnMarket AND ShortOnMarket[1]
z3 = ShortOnMarket AND LongOnMarket[1]
z4 = (Not OnMarket[1] AND Not OnMarket) AND (StrategyProfit <> StrategyProfit[1])
Cambio = z1 OR z2 OR z3 OR z4 //OR 1
//
IF Cambio THEN
j = min(Periods,j + 1)
//------------------------------------------
// EQUITY
$Equity[j] = Capital + StrategyProfit
$TempProfit[j] = PositionPerf * PositionPrice / PipSize
$TempEquity[j] = $Equity[j] + $TempProfit[j]
//------------------------------------------
// DrawDown
$MaxPoint[j] = max($MaxPoint[j],$TempEquity[j])
$DD[j] = $MaxPoint[j] - $TempEquity[j]
//
//------------------------------------------
// RunUp
$MinPoint[j] = min($MinPoint[j],$TempEquity[j])
$RU[j] = $TempEquity[j] - $MinPoint[j]
//------------------------------------------
// DD/RU ratio
MaxDD = 0
MaxRU = 0
IF j = Periods THEN
FOR i = 1 TO Periods
MaxDD = max(MaxDD,$DD[i])
MaxRU = max(MaxRU,$RU[i])
NEXT
DDRUratio = (MaxDD / MaxRU) * 100
FOR i = Periods DOWNTO 2
$Equity[i - 1] = $Equity[i]
$TempProfit[i - 1] = $TempProfit[i]
$TempEquity[i - 1] = $TempEquity[i]
$MaxPoint[i - 1] = $MaxPoint[i]
$MinPoint[i - 1] = $MinPoint[i]
$DD[i - 1] = $DD[i]
$RU[i - 1] = $RU[i]
NEXT
ENDIF
ENDIF
//------------------------------------------
//
// test code (Dax,1 hour,50K units)
//
avg = Average[100,1](close)
if close crosses over Avg and Not OnMarket then
buy at Market
elsif close crosses under Avg and Not OnMarket then
sellshort at Market
endif
set target pprofit 2000
set stop ploss 2000
//
if positionperf > 0.0005 then
sell at market
exitshort at market
endif
//
graph DDRUratio
graph MaxDD
graph MaxRU
fa questi due tipi di calcoli:
- sulle operazioni effettuate, non sulle barre (ed è quello che ho postato, con le barre dei commenti verso la fine della riga 27 per identificare quando un’operazione è terminata), quindi se indichi 10 PERIODI in realtà intendi 10 operazioni
- sulle barre chiuse (basta che togli il commento dalla riga 27), quindi se indichi 10 PERIODI sono 10 barre (non operazioni)
ho scritto queste due regole perché:
- la prima ti assicura che il calcolo sia fatto effettivamente sull’importo dell’Equity aggiornato, altrimenti se hai messo 10 periodi e ci sono 50 barre senza nessuna operazione, il rapporto sarà ZERO (linea piatta)
- il secondo fa il calcolo sulle barre, ma ha lo svantaggio di diventare piatto quandio ci sono molte barre senza nessuna operazione (più di quelle indicate nei PERIODI)
Se, a parte il discorso delle barre o operazioni fatte sopra, vedi che il rapporto DDRUratio è zero, è perché in quel periodo ci sono state TUTTE operazioni positive (100%).
Com’è adesso la riga 79 (con 0.0005), succederà questo. Basta che la modifichi in 0.0500 e vedrai subito la differenza!
Sopra aggiunto come registro 281 qui …
Libreria di link snippet
Grazie Roberto, un buon lavoro! Per quanto riguarda i punti 1 o 2, ritengo preferibile il punto 1 (periodi=operazioni).
Come numero di operazioni ho visto che da 10 a 30 sono sufficienti per valutare un ratio DDRU sotto 20.