Salve a tutti, di seguito vi scrivo il codice che uso abitualmente per controllare i miei trading systems:
//////////////////// ******************** CODICE MAX DRAWDOWN - MAX TRADE LOSS CONSECUTIVI E DATA DI SCADENZA ******************** ////////////////////
// Max DRAWDOWN
// Max Trade Lossconsecutivi
// Data Scadenza TS
MaxTradeLoss = 20 // Massimo trade perdenti consecutivi
Scadenza = date >= 20250331 // Data scadenza TS //Marzo 2025
// Max Drawdown
ONCE Capital = 10000
ONCE MinPoint = Capital
ONCE MaxPoint = 0
ONCE MaxRU = 0
ONCE MaxDD = 4200 * size //drawdown 2 deviazioni standard leggermente aumentato rispetto alla simulazione montecarlo
//------------------------------------------
// EQUITY
Equity = Capital + StrategyProfit
TempProfit = PositionPerf * PositionPrice / PipSize
TempEquity = Equity + TempProfit
//------------------------------------------
// DrawDown
MaxPoint = max(MaxPoint,TempEquity)
DD = MaxPoint - TempEquity
MaxDD = max(MaxDD,DD)
//
//------------------------------------------
// Max Trade Loss
if StrategyProfit < StrategyProfit[1] then
Perdo = Perdo+1
else
if StrategyProfit > StrategyProfit[1] then
Perdo=0
endif
endif
if (abs(DD) >= MaxDD) or (perdo >= MaxTradeLoss ) or Scadenza then
quit
endif
//
//////////////////// ******************** FINE CODICE MAX DRAWDOWN - MAX TRADE LOSS CONSECUTIVI E DATA DI SCADENZA ******************** ////////////////////
Oggi uno dei miei TS è stato interrotto, secondo me senza motivo.
La motivazione data dalla piattaforma è stata che si è attivata l’istruzione QUIT posta all’interno del trading system.
Vi allego il performance report del TS dove è chiaro che non siano mai state raggiunte le condizioni di chiusura:
- MAX DRAWDOWN
- MASSIMO TRADE PERDENTI CONSECUTIVI
- DATA DI SCADENZA
Grazie a chi potrà aiutarmi
Questo è il codice per il test (su Dax, 1H):
// test code (Dax,1 hour,50K units)
//
avg = Average[8,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
//////////////////// ******************** CODICE MAX DRAWDOWN - MAX TRADE LOSS CONSECUTIVI E DATA DI SCADENZA ******************** ////////////////////
// Max DRAWDOWN
// Max Trade Lossconsecutivi
// Data Scadenza TS
MaxTradeLoss = 20 // Massimo trade perdenti consecutivi
Scadenza = date >= 20250331 // Data scadenza TS //Marzo 2025
// Max Drawdown
ONCE Capital = 10000
ONCE MinPoint = Capital
ONCE MaxPoint = 0
ONCE MaxRU = 0
ONCE MaxDD = 4200 //* size //drawdown 2 deviazioni standard leggermente aumentato rispetto alla simulazione montecarlo
//------------------------------------------
// EQUITY
Equity = Capital + StrategyProfit
TempProfit = PositionPerf * PositionPrice / PipSize
TempEquity = Equity + TempProfit
//------------------------------------------
// DrawDown
MaxPoint = max(MaxPoint,TempEquity)
DD = MaxPoint - TempEquity
MaxDD = max(MaxDD,DD)
//
//------------------------------------------
// Max Trade Loss
if StrategyProfit < StrategyProfit[1] then
Perdo = Perdo+1
else
if StrategyProfit > StrategyProfit[1] then
Perdo=0
endif
endif
if (abs(DD) >= MaxDD) or (perdo >= MaxTradeLoss ) or Scadenza then
quit
endif
//
//////////////////// ******************** FINE CODICE MAX DRAWDOWN - MAX TRADE LOSS CONSECUTIVI E DATA DI SCADENZA ******************** ////////////////////
graph Perdo
graph DD
graph MaxDD
Nella foto Quit1 vedi che esce con QUIT, siccome sulla candela in cui esce i dati sono azzerati, possiamo fare riferimento solo alla candela precedente, dove le condizioni sembrano non esserci.
Però, se commenti solo la riga del QUIT, in modo che non venga eseguito e se metti un segno sulla candela dov’era uscito per ricordartela, vedrai al backtest che in quella candela la condizione c’era, come da foto Quit2.
Ciao Roberto, in realtà non ho ben capito.
Come posso risolvere il problema?
Il problema, così come l’hai messo, puoi risolverlo solo aumentando MAXDD.
Il DrawDown è un valore che cambia con il tempo, se usi 10K unità è diverso da quello con 100K e da quello con 1M di unità.
Il problema è che se anche la strategia è profittevole, il DrawDown può aumentare ugualmente perché è la massima esposizione finanziaria riscontrata.
Puoi risolvere la cosa stabilendo un’uscita, oppure una riduzione dei contratti, quando il DrawDown supera una percentuale X dell’equity (Capitale + Profitto).
In questo modo può aumentare, ma nel contempo aumentano anche i profitti generati. Se questo non succede, esce o riduce il numero di contratti finché non torna al di sotto di quella percentuale.
Invece di uscire, o diminuire i contratti, appena superata quella percentuale, puoi decidere di farlo solo quando il superamento si verifica per N candele consecutive.
Si tratta di fare delle prove e trovare la soluzione migliore.