English Русский 中文 Español Deutsch 日本語 Português 한국어 Français Türkçe
Aumenta all’ennesima potenza i tuoi sistemi di trading lineare

Aumenta all’ennesima potenza i tuoi sistemi di trading lineare

MetaTrader 5Sistemi di trading | 11 gennaio 2022, 17:07
205 0
laplacianlab
[Eliminato]

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.

Figura 1. Parabola matematica


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.

Figura 2. La curva azionaria di HawaiianTsunamiSurfer 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:

Figura 3. Curva azionaria di ExponentialHawaiian da gennaio 2012 a marzo 2012

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

File allegati |
cevolution.mqh (8.35 KB)
Indicatori tecnici e filtri digitali Indicatori tecnici e filtri digitali
In questo articolo, gli indicatori tecnici sono trattati come filtri digitali. Vengono spiegati i principi di funzionamento e le caratteristiche di base dei filtri digitali. Inoltre, vengono considerati alcuni modi pratici per ricevere il kernel del filtro nel terminale MetaTrader 5 e l'integrazione con un analizzatore di spettro già pronto proposto nell'articolo "Costruire un analizzatore di spettro". Vengono utilizzate come esempi le caratteristiche di impulso e spettro dei tipici filtri digitali.
Stupisci i tuoi clienti MQL5 con un cocktail di tecnologie! Stupisci i tuoi clienti MQL5 con un cocktail di tecnologie!
MQL5 fornisce ai programmatori un set molto completo di funzioni e API orientate agli oggetti grazie alle quali possono fare tutto ciò che vogliono all'interno dell'ambiente MetaTrader. Tuttavia, la tecnologia Web è uno strumento estremamente versatile al giorno d'oggi. Essa può venire in soccorso in alcune situazioni in cui è necessario fare qualcosa di molto specifico, oppure quando vuoi stupire i tuoi clienti con qualcosa di diverso o semplicemente quando non si ha abbastanza tempo per padroneggiare una parte specifica della libreria standard MT5. L'esercizio di oggi ti guida attraverso un esempio pratico su come puoi gestire il tuo tempo di sviluppo allo stesso tempo in cui crei anche un fantastico cocktail tecnologico.
Estensione della MQL5 Standard Library e riutilizzo del codice Estensione della MQL5 Standard Library e riutilizzo del codice
MQL5 Standard Library semplifica la tua vita come sviluppatore. Tuttavia, non implementa tutte le esigenze di tutti gli sviluppatori del mondo, quindi se ritieni di aver bisogno di altre personalizzazioni puoi fare un ulteriore passo avanti ed estendere. Questo articolo illustra l'integrazione dell'indicatore tecnico Zig-Zag di MetaQuotes nella Libreria standard. Ci ispiriamo alla filosofia di design di MetaQuotes per raggiungere il nostro obiettivo.
MQL5 Wizard: Come insegnare a un EA ad aprire ordini pendenti a qualsiasi prezzo MQL5 Wizard: Come insegnare a un EA ad aprire ordini pendenti a qualsiasi prezzo
L'articolo descrive un metodo di modifica del codice di un modulo di segnale di trading per l'implementazione della funzionalità che consente di impostare ordini pendenti a qualsiasi distanza dal prezzo corrente: può essere il prezzo di chiusura o apertura della barra precedente o il valore della media mobile. Ci sono molte opzioni. Importante è che è possibile impostare qualsiasi prezzo di apertura per un ordine pendente. Questo articolo sarà utile ai trader che commerciano con ordini pendenti.