Aumenta all’ennesima potenza i tuoi sistemi di trading lineare
Introduzione
L'articolo di oggi mostra ai programmatori MQL5 di livello intermedio come possono ottenere maggiori profitti dai loro sistemi di trading lineare (Fixed Lot) implementando facilmente la cosiddetta tecnica di esponenziazione. Il termine generale di esponenziazione è usato qui per riferirsi a quei modelli di gestione monetaria che adattano la dimensione o il numero delle posizioni collocate sul mercato in base al rischio che si assume. Questo perché la crescita della curva azionaria risultante è quindi geometrica, o esponenziale, assumendo la forma di una parabola. Il termine "lineare" è usato anche nel contesto attuale che è a metà strada tra quello matematico e quello di programmazione. Nello specifico, implementeremo una pratica variante MQL5 del dimensionamento a posizione frazionaria fissa sviluppato da Ralph Vince.
Figure 1. Parabola matematica
Facciamo ora un breve riepilogo dei modelli di gestione del denaro e vediamo come possiamo implementare una variante del dimensionamento della posizione frazionaria fissa di Ralph Vince. Sei pronto? Non perdere l'occasione di ottenere molto di più dalle tue strategie di trading!
1. Cosa sono i modelli di gestione del denaro?
In poche parole, i modelli di gestione del denaro sono i quadri concettuali, in base ai quali prendi decisioni in relazione alle dimensioni della tua posizione, all'uso dei tuoi stop loss e ai tuoi calcoli di margine e costi di negoziazione. Ci sono molti modelli di gestione del denaro là fuori! Se lo desideri, puoi cercare su Google Fixed Lot, Fixed Fractional, Fixed Ratio, Kelly's Percentage o Effective Cost per approfondire le tue conoscenze su quei framework classici. Come ho detto, questo articolo copre solo una variante di Fixed Fractional.
1.2. Frazionario fisso
L'idea alla base di questo modello di gestione del denaro è dimensionare le operazioni in base al rischio stimato ad esse associato. Il rischio è la stessa frazione della rete su ogni operazione.
L'equazione per il numero di contratti in posizione frazionaria fissa dimensionata è la seguente:
N = f * Rischio azionario / di trading
N è il numero di contratti, f è la frazione fissa (un numero compreso tra 0 e 1), l'equity è il valore corrente del patrimonio netto del conto e il rischio di trading è il rischio del trading per contratto per il quale viene calcolato il numero di contratti. Per favore, leggi l'articolo Fixed Fractional Position Sizing scritto da Michael R. Bryant per saperne di più su questo modello.
Una proprietà interessante del modello frazionario fisso è che poiché la dimensione delle operazioni è mantenuta proporzionale al saldo netto del conto, è teoricamente impossibile perdere tutto il capitale. Il rischio di rovina è pari a zero. D'altra parte, poiché le percentuali di capitale di rischio sono inferiori, una serie di operazioni vincenti o perdenti non ha un impatto drammatico sulla curva dei profitti.
2. Aggiunta di frazionario fisso al tuo sistema di trading
2.1. Prendi il tuo sistema di trading lineare
Naturalmente, prima di tutto è necessario un sistema di trading lineare per sperimentare il potere esponenziale a basso rischio! Questo sistema servirà come base di potere, per così dire. Per sistema lineare intendo un sistema di trading che si rivela vincente per un certo periodo di tempo e la cui curva azionaria sembra una linea retta. Ad esempio, HawaiianTsunamiSurfer è un cosiddetto sistema di trading lineare disponibile in Code Base. La sua curva azionaria sembra una linea retta da gennaio 2012 a marzo 2012.
Figure 2. La curva azionaria di HawaiianTsunamiSurfer da gennaio 2012 a marzo 2012
Lo scopo di questo articolo non è quello di sviluppare un sistema di trading lineare da zero, ma di darti gli strumenti necessari in modo da poter ottenere più ricavi dai tuoi sistemi. Quindi, d'ora in poi, presumo che tu abbia già sviluppato un sistema di trading come questo sotto il paradigma orientato agli oggetti. In questo caso, dovresti aggiungere il pezzo OO, che spiego di seguito.
2.2. CEvolution, la classe MQL5 di base per elevare il sistema alla potenza
Quindi ancora una volta adottiamo l'approccio orientato agli oggetti per codificare il nostro EA. Ti consiglio di leggere prima gli articoli Un'altra classe OOP MQL5 e Building an Automatic News Trader per ottenere le basi tecniche per lavorare in questo modo OO. Se lo hai già fatto, tieni presente che i progetti discussi in quegli articoli incorporano un elemento molto importante chiamato CEvolution. Questo ci permette di tenere traccia di alcune importanti informazioni temporali come lo stato del robot in un dato momento, la cronologia delle operazioni eseguite, ecc.
Questa volta codireremo in CEvolution la logica necessaria per gestire i nostri soldi. Poiché la frazione fissa rischiata rimane proporzionale all'equità, in cui siamo tutti d'accordo che non è costante, ma variabile, questa roba logica deve essere codificata in CEvolution. O semplicemente, mentre la pendenza della curva azionaria si evolve con il tempo, è in CEvolution che tutte queste cose devono essere implementate. Questa è l'idea astratta del nostro design orientato agli oggetti. Viene lasciato come esercizio per integrare la seguente classe OO con il tuo sistema di trading in stile orientato agli oggetti.
Classe CEvolution.mqh:
//+------------------------------------------------------------------+ //| CEvolution.mqh | //| Copyright © 2013, Jordi Bassagañas | //+------------------------------------------------------------------+ #include <Mine\Enums.mqh> //+------------------------------------------------------------------+ //| CEvolution Class | //+------------------------------------------------------------------+ class CEvolution { protected: ENUM_STATUS_EA m_status; // The current EA's status ENUM_EXP_EQUITY_CURVE_LEVEL m_expEquityLevel; // The current exponential equity level double m_originalEquity; // The original equity value double m_lotSize; // The current lot size public: //--- Constructor and destructor methods CEvolution(ENUM_STATUS_EA status,ENUM_EXP_EQUITY_CURVE_LEVEL exp_equity_level); ~CEvolution(void); //--- Getter methods ENUM_STATUS_EA GetStatus(void); ENUM_EXP_EQUITY_CURVE_LEVEL GetExpEquityLevel(void); double GetOriginalEquity(void); double GetLotSize(void); //--- Setter methods void SetStatus(ENUM_STATUS_EA status); void SetExpEquityLevel(ENUM_EXP_EQUITY_CURVE_LEVEL exp_equity_level); void SetOriginalEquity(double equity); void SetLotSize(double size); //--- CEvolution specific methods double CalcEquityGrowth(double currentEquity); void RefreshExpEquityLevel(double currentEquity); void RefreshLotSize(); }; //+------------------------------------------------------------------+ //| Constructor | //+------------------------------------------------------------------+ CEvolution::CEvolution(ENUM_STATUS_EA status,ENUM_EXP_EQUITY_CURVE_LEVEL exp_equity_level) { m_status=status; m_expEquityLevel=exp_equity_level; RefreshLotSize(); m_originalEquity=AccountInfoDouble(ACCOUNT_EQUITY); } //+------------------------------------------------------------------+ //| Destructor | //+------------------------------------------------------------------+ CEvolution::~CEvolution(void) { } //+------------------------------------------------------------------+ //| GetStatus | //+------------------------------------------------------------------+ ENUM_STATUS_EA CEvolution::GetStatus(void) { return m_status; } //+------------------------------------------------------------------+ //| GetExpEquityLevel | //+------------------------------------------------------------------+ ENUM_EXP_EQUITY_CURVE_LEVEL CEvolution::GetExpEquityLevel(void) { return m_expEquityLevel; } //+------------------------------------------------------------------+ //| GetEquity | //+------------------------------------------------------------------+ double CEvolution::GetOriginalEquity(void) { return m_originalEquity; } //+------------------------------------------------------------------+ //| GetLotSize | //+------------------------------------------------------------------+ double CEvolution::GetLotSize(void) { return m_lotSize; } //+------------------------------------------------------------------+ //| SetStatus | //+------------------------------------------------------------------+ void CEvolution::SetStatus(ENUM_STATUS_EA status) { m_status=status; } //+------------------------------------------------------------------+ //| SetExpEquityLevel | //+------------------------------------------------------------------+ void CEvolution::SetExpEquityLevel(ENUM_EXP_EQUITY_CURVE_LEVEL exp_equity_level) { m_expEquityLevel=exp_equity_level; } //+------------------------------------------------------------------+ //| SetEquity | //+------------------------------------------------------------------+ void CEvolution::SetOriginalEquity(double equity) { m_originalEquity=equity; } //+------------------------------------------------------------------+ //| SetLotSize | //+------------------------------------------------------------------+ void CEvolution::SetLotSize(double lot_size) { m_lotSize=lot_size; } //+------------------------------------------------------------------+ //| CalcEquityGrowth | //+------------------------------------------------------------------+ double CEvolution::CalcEquityGrowth(double currentEquity) { return NormalizeDouble(currentEquity * 100 / m_originalEquity - 100,2); } //+------------------------------------------------------------------+ //| RefreshExpEquityLevel | //+------------------------------------------------------------------+ void CEvolution::RefreshExpEquityLevel(double currentEquity) { double growth = CalcEquityGrowth(currentEquity); //--- is the current equity less than 10% of the original amount? if(growth <= 10) { SetExpEquityLevel(LEVEL_ONE); } //--- is the current equity more than 10% of the original amount and less than 20%? else if(growth > 10 && growth <= 20) { SetExpEquityLevel(LEVEL_TWO); } //--- is the current equity more than 20% of the original amount and less than 30%? else if(growth > 20 && growth <= 30) { SetExpEquityLevel(LEVEL_THREE); } //--- is the current equity more than 30% of the original amount and less than 40%? else if(growth > 30 && growth <= 40) { SetExpEquityLevel(LEVEL_FOUR); } //--- is the current equity more than 40% of the original amount and less than 50%? else if(growth > 40 && growth <= 50) { SetExpEquityLevel(LEVEL_FIVE); } //--- is the current equity more than 50% of the original amount and less than 60%? else if(growth > 50 && growth <= 60) { SetExpEquityLevel(LEVEL_SEVEN); } //--- is the current equity more than 60% of the original amount and less than 70%? else if(growth > 60 && growth <= 70) { SetExpEquityLevel(LEVEL_EIGHT); } //--- is the current equity more than 70% of the original amount and less than 80%? else if(growth > 70 && growth <= 80) { SetExpEquityLevel(LEVEL_NINE); } //--- is the current equity more than 90% of the original amount? else if(growth > 90) { SetExpEquityLevel(LEVEL_TEN); } } //+------------------------------------------------------------------+ //| RefreshLotSize | //+------------------------------------------------------------------+ void CEvolution::RefreshLotSize() { switch(m_expEquityLevel) { case LEVEL_ONE: SetLotSize(0.01); break; case LEVEL_TWO: SetLotSize(0.02); break; case LEVEL_THREE: SetLotSize(0.03); break; case LEVEL_FOUR: SetLotSize(0.04); break; case LEVEL_FIVE: SetLotSize(0.05); break; case LEVEL_SIX: SetLotSize(0.06); break; case LEVEL_SEVEN: SetLotSize(0.07); break; case LEVEL_EIGHT: SetLotSize(0.08); break; case LEVEL_NINE: SetLotSize(0.09); break; case LEVEL_TEN: SetLotSize(0.1); break; } } //+------------------------------------------------------------------+
Commentiamo ora alcune parti importanti di questa classe!
Quando viene creato l'Expert Advisor, il valore della curva azionaria originale viene memorizzato in m_originalEquity:
//+------------------------------------------------------------------+ //| Constructor | //+------------------------------------------------------------------+ CEvolution::CEvolution(ENUM_STATUS_EA status,ENUM_EXP_EQUITY_CURVE_LEVEL exp_equity_level) { m_status=status; m_expEquityLevel=exp_equity_level; RefreshLotSize(); m_originalEquity=AccountInfoDouble(ACCOUNT_EQUITY); }
Il metodo CEvolution::CalcEquityGrowth è per calcolare la crescita della curva azionaria, sempre rispetto al suo valore originale:
//+------------------------------------------------------------------+ //| CalcEquityGrowth | //+------------------------------------------------------------------+ double CEvolution::CalcEquityGrowth(double currentEquity) { return NormalizeDouble(currentEquity * 100 / m_originalEquity - 100,2); }
Infine, CEvolution::RefreshExpEquityLevel è per aggiornare il livello di equità su ogni tick (osserva come dipende assolutamente dalla crescita azionaria) e CEvolution::RefreshLotSize è per aggiornare la dimensione del lotto su ogni tick. Questo perché dovresti aggiornare tali informazioni nel metodo OnTick del tuo EA in questo modo:
GetEvolution().RefreshExpEquityLevel(AccountInfoDouble(ACCOUNT_EQUITY)); GetEvolution().RefreshLotSize();
A proposito, questa soluzione richiede l'uso della seguente enumerazione MQL5 personalizzata:
//+------------------------------------------------------------------+ //| Exponential equity curve level enumeration | //+------------------------------------------------------------------+ enum ENUM_EXP_EQUITY_CURVE_LEVEL { LEVEL_ONE, LEVEL_TWO, LEVEL_THREE, LEVEL_FOUR, LEVEL_FIVE, LEVEL_SIX, LEVEL_SEVEN, LEVEL_EIGHT, LEVEL_NINE, LEVEL_TEN };Diciamo che questa implementazione è una variante di Fixed Fractional perché in effetti introduce alcune specificità. Ad esempio, la curva azionaria crescerà esponenzialmente fino a raggiungere il cosiddetto livello dieci, successivamente il sistema diventerà lineare. Tuttavia, CEvolution mantiene l'idea di base di aumentare costantemente la dimensione delle posizioni in proporzione alla curva azionaria.
2.3. Prendere le tue decisioni frazionarie fisse
Con tutto quanto sopra, puoi già prendere le tue decisioni di gestione del denaro in base allo stato attuale del tuo robot.
Da qualche parte nel metodo OnTick del tuo EA:
switch(GetEvolution().GetStatus()) { case BUY: tp = ask + m_takeProfit * _Point; sl = bid - m_stopLoss * _Point; GetTrade().PositionOpen(GetBrain().GetSymbol(),ORDER_TYPE_BUY,m_evolution.GetLotSize(),ask,sl,tp); break; case SELL: sl = ask + m_takeProfit * _Point; tp = bid - m_stopLoss * _Point; GetTrade().PositionOpen(GetBrain().GetSymbol(),ORDER_TYPE_SELL,m_evolution.GetLotSize(),bid,sl,tp); break; case DO_NOTHING: // Nothing... break; }
Ho rinominato il mio nuovo sistema esponenziale in ExponentialHawaiian.
3. Backtesting del sistema esponenziato
Una volta aggiunta la logica OO spiegata sopra al tuo sistema, non dimenticare di eseguire i tuoi test! Ora sto testando ExponentialHawaiian, la variante frazionaria fissa di HawaiianTsunamiSurfer:
Figure 3. Curva azionaria di ExponentialHawaiian da gennaio 2012 a marzo 2012
La curva sopra rimarrà esponenziale mentre il sistema sottostante rimarrà lineare. Quando questa condizione non è più vera, il sistema diventa instabile con un rischio teorico di rovina.
Conclusione
Oggi abbiamo imparato come ottenere maggiori profitti dai nostri sistemi di trading lineare, quelli che implementano un modello di gestione del denaro a lotto fisso, elevandoli al potere di esponenziazione.
Abbiamo iniziato presentando alcuni modelli classici di gestione del denaro (Fixed Lot, Fixed Fractional, Fixed Ratio, Kelly's Percentage, Effective Cost) e abbiamo deciso di concentrarci su Fixed Fractional, un modello semplice in cui la dimensione delle operazioni viene mantenuta proporzionale al saldo netto del conto. Infine, abbiamo preso un sistema di trading che mostra risultati lineari per un periodo di tempo, abbiamo implementato in MQL5 una variante di Fixed Fractional e mostrato i risultati lanciati da Strategy Tester di MetaTrader.
Ancora una volta, abbiamo adottato l'approccio orientato agli oggetti per codificare i nostri Expert Advisor. Si consiglia vivamente di leggere prima gli articoli Un'altra classe OOP MQL5 e Building an Automatic News Trader per ottenere la base tecnica per lavorare in questo modo OO.
Tradotto dall’inglese da MetaQuotes Ltd.
Articolo originale: https://www.mql5.com/en/articles/734
- App di trading gratuite
- Oltre 8.000 segnali per il copy trading
- Notizie economiche per esplorare i mercati finanziari
Accetti la politica del sito e le condizioni d’uso