English Русский 中文 Español Deutsch 日本語 Português 한국어 Français Türkçe
Grafico liquido

Grafico liquido

MetaTrader 5Trading | 12 gennaio 2022, 11:41
166 0
Serhii Shevchuk
Serhii Shevchuk

Introduzione

Una volta ho notato che i grafici con l'intervallo di tempo H4 e superiore sembravano diversi per ogni broker. La ragione alla base era che i broker si trovavano in fusi orari diversi. In alcuni casi alcune parti degli stessi grafici erano significativamente diverse nonostante una piccola differenza tra i fusi orari. Su un grafico c'era un modello di inversione distinto e la stessa parte dell'altro non rappresentava alcun modello preciso.

Poi mi è passato per la mente di scrivere un indicatore che ridisegnerebbe il grafico H1 in modo che ci sia sempre una barra di chiusura completa sulla destra. Il periodo M1 è stato scelto come fonte di prezzi. Di conseguenza, un grafico orario è stato ridisegnato ogni minuto e in un'ora ho avuto 60 versioni dello stesso grafico orario. La sua forma stava cambiando in modo fluido e scorrevole rivelando schemi nascosti a cui il modello iniziale non aveva nemmeno accennato.

Ho chiamato questo indicatore "grafico liquido" per il suo aspetto specifico. A seconda della modalità di stampa, il grafico "scorre" (viene ridisegnato) quando viene visualizzata una nuova barra del periodo di base o quando il valore dello spostamento statico viene modificato. In questo articolo considereremo i principi di tracciamento di un "grafico liquido", quindi scriveremo un indicatore e confronteremo l'efficienza dell'utilizzo di questa tecnologia per gli Expert che negoziano con indicatori e gli Expert che negoziano con i modelli.



1. Principio di plottaggio

Prima di iniziare, definiremo i termini.

Lo shift è una differenza tra i prezzi di apertura delle barre del grafico risultanti e i prezzi di apertura delle barre del grafico di origine.

L'intervallo di tempo corrente è l'intervallo di tempo del grafico di origine.

L'intervallo di tempo di base è un intervallo di tempo con i prezzi che useremo per formare le barre del grafico risultante.

Il periodo di base non può superare quello corrente. Il periodo corrente deve essere diviso per il periodo di base senza resto. Maggiore è il rapporto tra l'intervallo di tempo corrente e quello di base, più diverse saranno le variazioni del grafico risultante. Tuttavia, se il rapporto è troppo grande, i dati storici dell'intervallo di tempo di base potrebbero non essere sufficienti per disegnare il numero necessario delle barre del grafico risultanti.

Esistono tre tipi di tracciatura di un grafico.

  • Grafico con uno spostamento statico (Static Shift o SS).
  • Grafico con uno spostamento dinamico in modalità di apertura (Dynamic Shift, just Open o DSO).
  • Grafico con uno spostamento dinamico in modalità di chiusura (Dynamic Shift, expected Close o DSC).

Nella modalità di spostamento statico, i tempi di apertura delle barre vengono spostati dall'ora impostata. Lo spostamento dinamico nella modalità di apertura fa sembrare che una barra sia appena stata aperta, mentre nella modalità di chiusura questo fa sembrare che la barra verrà presto chiusa.

Diamo un'occhiata più da vicino.


1.1. Grafico con spostamento statico

In questa modalità l'orario di apertura di ogni barra viene spostato del numero di minuti equivalente al numero impostato di intervalli di tempo di base. Lo chiameremo un shift. In questo modo, se lo shift impostato è uguale a 0, il grafico è esattamente lo stesso di quello di origine. Lo shift 1, a condizione che l'intervallo di tempo di base sia di 15 minuti, è pari a 15 minuti. Shift 2 è uguale a 30 minuti e così via.

Lo shift non può superare (k-1), dove k è un rapporto tra l'intervallo di tempo corrente e quello di base. Significa che con l'attuale intervallo di tempo H1 e quello di base M1, lo shift massimo consentito è 60/1 - 1 = 59 dei tempi di base, cioè 59 minuti. Se il periodo di tempo di base è M5, lo shift massimo consentito è 60/5 - 1 = 11 dei tempi di base, ovvero 55 minuti.

L'orario di apertura delle barre per l'intervallo di tempo corrente H1 e lo shift di 15 minuti, è 00:15, 01:15, 02:15 e così via. Per l'intervallo di tempo corrente M15 e lo shift di 1 minuto, l'orario di apertura delle barre è 00:16, 00:31, 00:46, 01:01 e così via.

Quando gli shift sono vicini ai valori limite, tale grafico è raramente diverso da quello di origine. Differenze significative si affiorano quando un valore di spostamento è vicino alla metà dell'intervallo consentito.

Grafico con shift statico

Fig. 1. Esempio di formazione di barre orarie sul timeframe di base di M15 con il valore di spostamento pari a 1


1.2. Grafico con uno spostamento dinamico nella modalità di apertura

In questa modalità lo spostamento viene ricalcolato ogni volta che viene visualizzata una nuova barra dell'intervallo di tempo di base. Allo stesso tempo, lo spostamento viene calcolato in modo che il tempo di esistenza della barra alla fine del grafico (gli ultimi prezzi) non superi il valore dell'intervallo di tempo di base. Se l'intervallo di tempo corrente è H1 e quello di base è M5, sembrerà che la barra all'estrema destra sia stata aperta non prima di cinque minuti fa.

Grafico con spostamento dinamico, inizio della barra

Fig. 2. Esempio di formazione di barre orarie sul timeframe di base di M15 con spostamento dinamico in modalità di apertura


1.3. Grafico con uno spostamento dinamico in modalità di chiusura

In questa modalità, lo shift viene ricalcolato ogni volta che viene visualizzata una nuova barra dell'intervallo di tempo di base, come nella modalità di apertura. L'unica differenza è che lo shift è calcolato in modo che il tempo di esistenza della barra alla fine del grafico (gli ultimi prezzi) fosse maggiore o uguale alla differenza tra gli intervalli di tempo correnti e di base. Nell'attuale intervallo di tempo di H1 e in quello di base di M5, sembra che la barra all'estrema destra si chiuda entro e non oltre cinque minuti.

Grafico con spostamento dinamico, completamento del

Fig. 3. Esempio di formazione di barre orarie sul timeframe di base di M15 e spostamento dinamico in modalità di chiusura


2. Trasformazione dei dati

La funzione GetRatesLC() è stata scritta per convertire i dati storici tenendo conto dello spostamento impostato. Scrive i dati storici modificati nella matrice di strutture del tipo MqlRates, in modo simile alla funzione CopyRates().

int GetRatesLC(
   int             start_pos    // source for copying
   int             len,         // amount to copy
   MqlRates&       rates[],     // target array
   ENUM_TIMEFRAMES base_period, // basic timeframe
   int&            shift        // shift
   );

Parametri

  start_pos

   [in]  Indice del primo elemento nel periodo di tempo corrente. È il punto di partenza della conversione e della copia dei dati in un buffer.

  len

   [in]  Numero di elementi copiati.

  Tassi[]

   [fuori]  Matrice del tipo MqlRates.

  base_period

   [in]  Tempistica di base. 

  shift

   [in] [out]  Shift. Può accettare i seguenti valori:

ValoreDescrizione
 -2
 Calcola lo spostamento nella modalità di apertura (inizio della formazione della barra)
 -1
 Calcola lo spostamento nella modalità di chiusura (fine della formazione della barra)
 0 ... N
 Applica lo shift impostato. Può accettare valori da 0 a N.
 N = Tcur/Tbase - 1. Dove Tcur è l'intervallo di tempo corrente, Tbase è uno di base.

Tabella 1. Valori consentiti del parametro shift

Se la funzione viene implementata correttamente, shift riceverà il valore dello spostamento calcolato se sono stati passati i valori di -2 o -1.

Valore restituito

Numero di elementi copiati o codice di errore:

CodiceDescrizione
 -1
 Intervallo di tempo di base specificato in modo errato
 -2
 Shift specificato in modo errato

Tabella 2. Codici di errore restituiti

Di seguito è riportato il codice della funzione GetRatesLC() dal file liquidchart.mqh.

int GetRatesLC(int start_pos,int len,MqlRates &rates[],ENUM_TIMEFRAMES base_period,int& shift)
  {
   //--- number of basic timeframes contained in the current one  
   int k=PeriodSeconds()/PeriodSeconds(base_period);
   if(k==0)
      return(-1);//basic timeframe specified incorrectly
   //---
   MqlRates r0[];
   ArrayResize(rates,len);
   if(CopyRates(_Symbol,_Period,start_pos,1,r0)<1)
      return(0);// no data
   //---
   int sh;
   if(shift>=0)
     {
      //--- fixed shift
      if(shift<k)
         sh=shift;
      else
         return(-2);//--- shift specified incorrectly   
     }
   else if(shift==-1)
     {
      //--- shift to be calculated (dynamic, beginning of the bar formation)
      sh=int((TimeCurrent()-r0[0].time)/PeriodSeconds(base_period));
     }
   else if(shift==-2)
     {
      //--- shift to be calculated (dynamic, end of the bar formation)
      sh=1+int((TimeCurrent()-r0[0].time)/PeriodSeconds(base_period));
      if(sh>=k)
         sh = 0;
     }
   else
      return(-2);//shift specified incorrectly       
   //--- opening time of the basic period bar, which is the beginning of the current period bar formation
   //--- synchronization of the time of opening bars takes place relative to the tO time
   datetime tO;
   //--- closing time of the bar under formation, i.e. opening time of the last bar of basic timeframe in the series
   datetime tC;
   tO=r0[0].time+sh*PeriodSeconds(base_period);
   if(tO>TimeCurrent())
      tO-=PeriodSeconds();
   tC=tO+PeriodSeconds()-PeriodSeconds(base_period);
   if(tC>TimeCurrent())
      tC=TimeCurrent();
   int cnt=0;
   while(cnt<len)
     {
      ArrayFree(r0);
      int l=CopyRates(_Symbol,base_period,tC,k,r0);
      if(l<1)
         break;
      //--- time of the bar with the (l-1) index does not have to be equal to tC
      //--- if there is no bar with the tC time, it can be the nearest bar
      //--- in any case its time is assigned to the tC time
      tC=r0[l-1].time;
      //--- check if tO has the correct value and modify if needed.
      while(tO>tC)
         tO-=PeriodSeconds();
      //--- the time values of tO and tC have actual meaning for the bar under formation  
      int index=len-1-cnt;
      rates[index].close=0;
      rates[index].open=0;
      rates[index].high=0;
      rates[index].low=0;
      rates[index].time=tO;
      for(int i=0; i<l; i++)
         if(r0[i].time>=tO && r0[i].time<=tC)
           {
            if(rates[index].open==0)
              {
               rates[index].open= r0[i].open;
               rates[index].low = r0[i].low;
               rates[index].high= r0[i].high;
                 }else{
               if(rates[index].low > r0[i].low)
                  rates[index].low=r0[i].low;
               if(rates[index].high < r0[i].high)
                  rates[index].high=r0[i].high;
              }
            rates[index].close=r0[i].close;
           }
      //--- specifying closing time of the next bar in the loop
      tC=tO-PeriodSeconds(base_period);
      //
      cnt++;
     }
   if(cnt<len)
     {
      //-- less data than required, move to the beginning of the buffer
      int d=len-cnt;
      for(int j=0; j<cnt; j++)
         rates[j]=rates[j+d];
      for(int j=cnt;j<len;j++)
        {
         //--- fill unused array elements with zeros
         rates[j].close=0;
         rates[j].open=0;
         rates[j].high=0;
         rates[j].low=0;
         rates[j].time=0;
        }
     }
   shift = sh;  
   return(cnt);
  }

Alcuni punti importanti dovrebbero essere evidenziati.

  • La funzione non restituisce i volumi tick. La ragione di ciò è che nella modalità DSC la funzione non restituisce mai il volume uguale a uno come accade all'apertura della barra. È abbastanza logico. Se il tuo Expert Advisor utilizza il volume del tick uguale a uno come segnale di una nuova formazione di barre, non riceverà mai quel segnale. Questo metodo viene utilizzato nell’Expert Advisor Moving Average. È possibile aggiungere un conteggio dei volumi tick alla funzione, ma non funzionerebbe correttamente. Per evitare confusione, non misurerò affatto i volumi dei tick.
  • La funzione restituisce il numero richiesto di barre, ma ciò non significa che il tempo tra la prima e l'ultima barra sarà commisurato all'intervallo di tempo corrispondente sul grafico di origine. Su un segmento continuo di dati storici però ci sarà corrispondenza. Se il segmento specificato contiene i fine settimana, le "barre fantasma" potrebbero apparire al limite.

La figura seguente rappresenta un esempio di "barra fantasma". Questa barra è stata formata per il primo minuto di ottobre, il 27, che è stato incluso nella barra insieme all'orario di apertura delle 23:01 del 26 ottobre. Va notato che dopo tali barre il grafico dell'indicatore verrà spostato a sinistra in relazione al grafico sorgente. Le barre con l'ora corrispondente all'ora iniziale (ad esempio, 21:00 -> 21:01), avranno indici diversi.

Barra fantasma

Fig. 4. Barra fantasma 26.10.2014 alle 23:01



3. Implementazione dell'indicatore

Scriviamo un indicatore che mostra un "grafico liquido" in una finestra separata. L'indicatore dovrebbe funzionare in tutte e tre le modalità: la modalità di spostamento statico, lo spostamento dinamico nella modalità di apertura della barra e lo spostamento dinamico nella modalità di chiusura della barra. L'indicatore deve anche avere elementi di controllo per cambiare la modalità e il valore di spostamento senza la necessità di chiamare la finestra di dialogo dei parametri dell'indicatore.

Per cominciare useremo la funzione GetRatesLC() dal file liquidchart.mqh. Lo chiameremo dalla funzione RefreshBuffers(), che, a sua volta, è chiamata dalla funzione OnCalculate. Può anche essere chiamato da OnChartEvent, a condizione che siano necessarie alcune modifiche nella modalità o lo spostamento e il ricalcolo dei buffer dell'indicatore. La funzione OnChartEvent gestirà la pressione dei pulsanti e la modificazione dei valori dello shift e della modalità.

numero di parametri di input dell'indicatore;

input ENUM_TIMEFRAMES   BaseTF=PERIOD_M1;       // LC Base Period
input int               Depth=100;              // Depth, bars
input ENUM_LC_MODE      inp_LC_mode=LC_MODE_SS; // LC mode
input int               inp_LC_shift=0;         // LC shift

dove Profondità è il numero di barre del grafico risultante e ENUM_LC_MODE è il tipo che descrive le modalità di plottaggio dell'indicatore:

enum ENUM_LC_MODE
  {//plotting mode
   LC_MODE_SS=0,  // Static Shift
   LC_MODE_DSO=1, // Dynamic Shift, just Open
   LC_MODE_DSC=2  // Dynamic Shift, expected Close
  };
I parametri inp_LC_mode e inp_LC_shift vengono duplicati da LC_mode e LC_shift di conseguenza. Questo design consente di modificare i loro valori premendo il pulsante. Le azioni di disegnare i pulsanti e manovrare premendo i pulsanti, non saranno considerate in quanto non sono rilevanti per l'argomento di questo articolo. Consideriamo la funzione RefreshBuffers() in dettaglio.
bool RefreshBuffers(int total,
                    double &buff1[],
                    double &buff2[],
                    double &buff3[],
                    double &buff4[],
                    double &col_buffer[])
  {
   MqlRates rates[];
   ArrayResize(rates,Depth);
//---
   int copied=0;
   int shift=0;
   if(LC_mode==LC_MODE_SS)
      shift = LC_shift; //static shift
   else if(LC_mode==LC_MODE_DSO)
      shift = -1;       //calculate shift (beginning of the bar formation)
   else if(LC_mode==LC_MODE_DSC)
      shift = -2;       //calculate shift (end of the bar formation)
   else
      return(false);
//---
   copied=GetRatesLC(0,Depth,rates,BaseTF,shift);
//---
   if(copied<=0)
     {
      Print("No data");
      return(false);
     }
   LC_shift = shift;
   refr_keys();
//--- initialize buffers with empty values
   ArrayInitialize(buff1,0.0);
   ArrayInitialize(buff2,0.0);
   ArrayInitialize(buff3,0.0);
   ArrayInitialize(buff4,0.0);
//---
   int buffer_index=total-copied;
   for(int i=0;i<copied;i++)
     {
      buff1[buffer_index]=rates[i].open;
      buff2[buffer_index]=rates[i].high;
      buff3[buffer_index]=rates[i].low;
      buff4[buffer_index]=rates[i].close;
      //---
      if(rates[i].open<=rates[i].close)
         col_buffer[buffer_index]=1;//bullish or doji
      else
         col_buffer[buffer_index]=0;//bearish
      //
      buffer_index++;
     }
//
   return(true);
  }

All'inizio, un valore rilevante della variabile shift deve essere passato alla funzione GetRatesLC() a seconda della modalità. Nella modalità statica sarà una copia del parametro LC_shift e nelle modalità di apertura o chiusura della barra sarà -1 o -2 corrispondentemente. Dopo l'esecuzione corretta della funzione, GetRatesLC() restituisce il valore corrente dello shift alla variabile shift. Viene ricalcolato o lasciato così com'è. In ogni caso, assegniamo il suo valore alla variabile LC_shift e quindi chiamiamo il ridisegno degli elementi grafici da parte della funzione refr_keys().

Successivamente, rinnoviamo i valori OHLC e i colori delle barre nei buffer degli indicatori.

Il codice completo dell'indicatore si trova nel file liquid_chart.mq5. Dopo il lancio, l'indicatore appare come segue:

L'indicatore del grafico liquido, shift 0

Fig. 5. L'indicatore del grafico liquido

Gli elementi di controllo.

  • Il pulsante SS commuta l'indicatore in modalità di spostamento statico. I pulsanti con frecce sono attivi in questa modalità e possono essere utilizzati per impostare il valore richiesto dello shift.
  • Il pulsante DSO commuta l'indicatore in modalità di spostamento dinamico, all'inizio della formazione della barra. In questa modalità il valore di shift viene calcolato e non può essere modificato manualmente.
  • Il pulsante DSC commuta l'indicatore nella modalità di shift dinamico, fine della formazione della barra. In questa modalità non è disponibile neanche la modifica manuale dello shift.

In modalità SS, quando il valore di spostamento è 0, l'indicatore duplica i valori del grafico iniziale. Se si modifica lo shift, verrà visualizzato il grafico che viene ridisegnato. Una differenza notevole appare già al valore di 28. Invece di deboli "rotaie" c'è un distinto "martello". È tempo di comprare?

L'indicatore del grafico liquido, shift 28

Fig. 6. Indicatore del grafico liquido, shift statico 28

Passa l'indicatore alla modalità DSO e una barra appena formata sarà sempre sulla destra. Nella modalità DSC c'è una barra che si chiude entro e non oltre un valore di intervallo di tempo di base.


4. Creare un EA

Creeremo due Expert. Il primo fa trading dalla media mobile e il secondo dal modello "pin bar".

Prendiamo l'Expert di media mobile dagli esempi standard (la cartella Experts\Examples\Moving Average) come modello. In questo modo saremo in grado di confrontare i risultati di ottimizzazione di due strategie essenzialmente diverse per capire quando l'uso dello shift statico o dinamico è rilevante e di una certa importanza.


4.1. Expert Trading per media mobile

All'inizio è necessario definire i parametri di input. Ce ne sono quattro:

input double MaximumRisk    = 0.1// Maximum Risk in percentage
input double DecreaseFactor = 3;    // Decrease factor
input int    MovingPeriod   = 12;   // Moving Average period
input int    MovingShift    = 6;    // Moving Average shift

Dopo la modernizzazione verranno aggiunti altri tre parametri:

input ENUM_TIMEFRAMES  BaseTF=PERIOD_M1;  // LC Base Period
input bool             LC_on = true;      // LC mode ON
input int              LC_shift = 0;      // LC shift

Il parametro LC_on sarà utile per verificare se GetRatesLC() funziona correttamente. La combinazione (LC_on == true && LC_shift == 0) deve avere lo stesso risultato di (LC_on == false).

Per la modernizzazione dell’ Expert media mobile pronto all’uso con lo shift, è necessario includere il file liquidchart.mqh e le funzioni CopyRates() devono essere sostituite con le funzioni GetRatesLC() per quei casi in cui la funzione shift è abilitata (il parametro di input LC_on è true):

   int copied;
   if(LC_on==true)
     {
      int shift = LC_shift;
      copied=GetRatesLC(0,2,rt,BaseTF,shift);
     }
   else
      copied = CopyRates(_Symbol,_Period,0,2,rt);
   if(copied!=2)
     {
      Print("CopyRates of ",_Symbol," failed, no history");
      return;
     }

Deve essere fatto sia nelle funzioni CheckForOpen() che CheckForClose(). Dobbiamo rifiutare l’utilizzo delle maniglie degli indicatori e calcolare manualmente le medie mobili. Per questo abbiamo aggiunto la funzione CopyMABuffer():

int CopyMABuffer(int len,double &ma[])
  {
   if(len<=0)
      return(0);
   MqlRates rates[];
   int l=len-1+MovingPeriod;
   int copied;
   if(LC_on==true)
     {
      int shift = LC_shift;
      ArrayResize(rates,l);
      copied=GetRatesLC(MovingShift,l,rates,BaseTF,shift);
     }
   else
      copied=CopyRates(_Symbol,_Period,MovingShift,l,rates);
//      
   if(copied<l)
      return(0);
//
   for(int i=0;i<len;i++)
     {
      double sum=0;
      for(int j=0;j<MovingPeriod;j++)
        {
         if(LC_on==true)
            sum+=rates[j+i].close;
         else
            sum+=rates[copied-1-j-i].close;
        }
      ma[i]=sum/MovingPeriod;
     }
   return(len);
  }

Restituisce un numero richiesto di valori o 0 nel buffer ma[] se per qualche motivo non sono stati ottenuti.

Il controllo delle barre di apertura è un altro punto importante da considerare. Nella versione originale dell’Expert Advisor Media Mobile è stato implementato utilizzando i valori tick:

   if(rt[1].tick_volume>1)
      return;

Nel nostro caso non ci sono volumi tick e quindi scriveremo la funzione newbar() per controllare l'apertura della barra:

bool newbar(datetime t)
  {
   static datetime t_prev=0;
   if(t!=t_prev)
     {
      t_prev=t;
      return(true);
     }
   return(false);
  }

Il principio di funzionamento sta nel confronto tra l'orario di apertura della barra e il suo valore precedente. Sostituiamo il controllo del volume tick per la chiamata della funzione newbar() nelle funzioni CheckForOpen() e CheckForClose():

   if(newbar(rt[1].time)==false)
      return;

Il codice completo dell'Expert già pronto si trova nel file moving_average_lc.mq5.


4.2. Expert Advisor Trading dal modello "Pin Bar"

Pin Bar o Barra di Pinocchio è un modello composto da tre barre. La barra centrale deve avere una lunga ombra o "naso", che indica una probabile inversione del movimento dei prezzi. Le barre laterali sono chiamate "occhi". I loro punti estremi non dovrebbero uscire dall'ombra della barra vicina. Questo modello è popolare tra i trader che commerciano con modelli a candela.

La nostra barra dei pin deve soddisfare le seguenti condizioni per invertire il prezzo verso il basso:

  • La barra r[0] deve essere rialzista.
  • La barra r[2] deve essere ribassista.
  • Il valore più elevato dei prezzi A e C non deve superare B, dove A e C sono valori elevati rispettivamente delle barre r[0] e r[2]. B è il prezzo Elevato della barra r[1].
  • Il corpo della barra centrale, cioè il modulo di differenza tra Apri e Chiudi (OC alla figura) della barra r[1], non deve superare il numero di punti impostato dal parametro esterno.
  • L'ombra della barra centrale, o la differenza tra il prezzo elevato e il più grande dei valori di Apertura e chiusura della barra r[1], non deve essere inferiore al numero di punti impostato dal parametro esterno.
  • Il rapporto tra l'ombra della barra centrale e il suo corpo non deve essere inferiore al valore impostato dal parametro esterno.

Il controllo del modello verrà effettuato al momento dell'apertura della barra r[3].

Pinbar

Fig. 7. Il modello "Pin Bar"

Il codice che definisce la presenza della barra dei pin per l'inversione verso il basso dovrebbe essere simile a:

   if(r[0].open<r[0].close && r[2].open>r[2].close && r[1].high>MathMax(r[0].high,r[2].high))
     {
     //--- eyes of the upper pin bar
      double oc=MathAbs(r[1].open-r[1].close)/_Point;
      if(oc>inp_pb_max_OC)
         return(0);
      double shdw=(r[1].high-MathMax(r[1].open,r[1].close))/_Point;
      if(shdw<inp_pb_min_shdw)
         return(0);
      if(oc!=0)
        {
         if((shdw/oc)<inp_pb_min_ratio)
            return(0);
        }
      return(1);
     }

Lo stesso vale per l'inversione verso l'alto. Quindi, la funzione di controllo della presenza della barra dei pin sarà la seguente:

int IsPinbar(MqlRates &r[])
  {
   //--- there must be 4 values in the r[] array
   if(ArraySize(r)<4)
      return(0);
   if(r[0].open<r[0].close && r[2].open>r[2].close && r[1].high>MathMax(r[0].high,r[2].high))
     {
      //--- eyes of the upper pin bar
      double oc=MathAbs(r[1].open-r[1].close)/_Point;
      if(oc>inp_pb_max_OC)
         return(0);
      double shdw=(r[1].high-MathMax(r[1].open,r[1].close))/_Point;
      if(shdw<inp_pb_min_shdw)
         return(0);
      if(oc!=0)
        {
         if((shdw/oc)<inp_pb_min_ratio)
            return(0);
        }
      return(1);
     }
   else if(r[0].open>r[0].close && r[2].open<r[2].close && r[1].low<MathMin(r[0].low,r[2].low))
     {
      //--- eyes of the lower pin bar
      double oc=MathAbs(r[1].open-r[1].close)/_Point;
      if(oc>inp_pb_max_OC)
         return(0);
      double shdw=(MathMin(r[1].open,r[1].close)-r[1].low)/_Point;
      if(shdw<inp_pb_min_shdw)
         return(0);
      if(oc!=0)
        {
         if((shdw/oc)<inp_pb_min_ratio)
            return(0);
        }
      return(-1);
     }
   return(0);
  }

La matrice passata di dati storici non deve avere meno di quattro elementi. Nel caso in cui venga rilevata la barra dei pin superiore (ovvero la barra dei pin che indica l'inversione verso il basso), la funzione restituirà il valore di 1. Nel caso in cui ci sia una barra dei pin inferiore (presunta inversione verso l'alto), la funzione restituirà il valore di -1. La funzione restituirà 0 se non ci sono barre dei pin. La funzione utilizza anche i seguenti parametri di input:

input uint   inp_pb_min_shdw     = 40;    // Pin bar min shadow, point
input uint   inp_pb_max_OC       = 20;    // Pin bar max OC, point
input double inp_pb_min_ratio    = 2.0;   // Pin bar shadow to OC min ratio

Faremo trading con la strategia di trading più semplice dalla barra dei pin. Venderemo se è prevista un'inversione verso il basso e compreremo se l'inversione è verso l'alto. Normalmente, sono necessarie conferme di indicatori, ma questa volta non le useremo per mantenere l'integrità sperimentale. Useremo solo la barra dei pin.

Il trading di Expert Advisor secondo il modello "Pin Bar" si baserà sul trading di Expert di Moving Average. La funzione CopyMABuffer() deve essere eliminata da quest'ultimo e deve chiamare questa funzione dalle funzioni CheckForOpen() CheckForClose(). Il numero di dati storici richiesti deve essere aumentato da due a quattro. L'ora della barra r[3] verrà utilizzata nel controllo dell'apertura della nuova barra.

   int copied;
   if(LC_on==true)
   {
      int shift = LC_shift;
      copied=GetRatesLC(0,4,rt,BaseTF,shift);
   }
   else
      copied = CopyRates(_Symbol,_Period,0,4,rt);
   if(copied!=4)
     {
      Print("CopyRates of ",_Symbol," failed, no history");
      return;
     }
   if(newbar(rt[3].time)==false)
      return;

Il controllo di un segnale per l'apertura della posizione sarà simile a:

   int pb=IsPinbar(rt);
   if(pb==1)       // upper pin bar
      signal=ORDER_TYPE_SELL; // sell conditions
   else if(pb==-1) // lower pin bar
      signal=ORDER_TYPE_BUY// buy conditions

Per chiudere la posizione dalla barra dei pin opposta:

   if(type==(long)POSITION_TYPE_BUY && pb==1)
      signal=true;
   if(type==(long)POSITION_TYPE_SELL && pb==-1)
      signal=true;

Si prega di notare che in condizioni rigorose di parametri di input, la barra dei pin si verifica raramente. Pertanto, quando si chiude una posizione solo da una barra dei pin opposta, c'è il rischio di perdere profitto o chiudere in perdita.

A questo proposito, aggiungiamo i livelli Take Profit e Stop Loss. Saranno impostati dai parametri esterni rispettivamente inp_tp_pp inp_sl_pp:

   double sl=0,tp=0,p=0;
   double ask=SymbolInfoDouble(_Symbol,SYMBOL_ASK);
   double bid=SymbolInfoDouble(_Symbol,SYMBOL_BID);
   if(signal==ORDER_TYPE_SELL)
   {
     p=bid;
     if(inp_sl_pp!=0)
       sl=NormalizeDouble(ask+inp_sl_pp*_Point,_Digits);
     if(inp_tp_pp!=0)
       tp=NormalizeDouble(ask-inp_sl_pp*_Point,_Digits);
   } else {
     p=ask;
     if(inp_sl_pp!=0)
       sl=NormalizeDouble(bid-inp_sl_pp*_Point,_Digits);
     if(inp_tp_pp!=0)
       tp=NormalizeDouble(bid+inp_sl_pp*_Point,_Digits);
   }
   CTrade trade;
   trade.PositionOpen(_Symbol,signal,TradeSizeOptimized(),p,sl,tp);

Se il valore di inp_tp_pp o inp_sl_pp è zero, il livello corrispondente di Take Profit o Stop Loss non verrà impostato.

La modifica è completa. L'Esperto è pronto. Il codice completo può essere trovato nel file pinbar_lc.mq5.


5. Ottimizzazione dell’Expert

Per valutare l'efficacia dei grafici con uno shift in diverse strategie, utilizzeremo l'ottimizzazione Expert con un ulteriore confronto dei migliori risultati. I parametri più importanti qui sono il profitto, il drawdown e il numero di operazioni. Il trading di Expert Advisor con Media Mobile servirà da esempio di strategia di indicatore e il trading di Expert con modello "Pin Bar" rappresenterà un caso di strategia senza indicatore.

L'ottimizzazione sarà effettuata tramite preventivi per l'ultimo semestre dal server MetaQuotes-Demo. L'esperimento sarà condotto per EURUSD, GBPUSD e USDJPY. Il deposito iniziale è di 3000 USD con leva di 1:100. La modalità di test è "All ticks". Modalità di ottimizzazione - veloce(algoritmo generico),Balance Max.


5.1. Analisi dei risultati di ottimizzazione di un Expert trading tramite media mobile

Confrontiamo i risultati dell'ottimizzazione di un Expert quando lavora in diverse modalità: con shift zero, con shift statico e con shift dinamico (DSO e DSC).

Il test sarà condotto per EURUSD, GBPUSD e USDJPY nel periodo 2014.04.01 - 2014.10.25 (ultimi sei mesi). PERIOD_H1

Parametri di input dell’Expert:

Parametro
Valore
 Rischio massimo in percentuale
 0.1
 Fattore di decrescita
 3.0
 Periodo medio mobile
 12
 Shift della Media Mobile
 6
 BaseTF
 1 minuto
 LC_on
 true
 LC_shift
 0

Tabella 3. Parametri di input dell'Expert LC della media mobile

5.1.1. Ottimizzazione dell’Expert con la modalità Shift disabilitata

Parametri ottimizzati:

Parametro
 Inizio FaseFine
 Periodo medio mobile
 12
 1
 90
 Shift della Media Mobile
 6
 1
 30

Tabella 4. Parametri ottimizzati del Moving Average LC Expert in modalità zero shift

Grafico raffigurante l'ottimizzazione dell’Expert nella modalità shift disabilita, EURUSD:

Ottimizzazione in modalità zero shift, EURUSD

Fig. 8. Ottimizzazione dell'Expert LC della media mobile in modalità zero shift, EURUSD

Migliori risultati:

 Result
 ProfittoEstrazione %
Il numero di trades
MovingPeriod MovingShift
 3796,43 796,43 16,18 111 24 12
 3776,98 776,98 17,70 77 55
 22
 3767,45 767,45 16,10 74 59
 23
 3740,38 740,38 15,87 78 55
 17
 3641,16 641,16 15,97 105 12
 17

Tabella 5. I migliori risultati del Mobile Average LC Expert per EURUSD in modalità zero shift

Grafico raffigurante l'ottimizzazione dell’Expert in modalità zero shift, GBPUSD:

Ottimizzazione nella modalità zero shift, GBPUSD

Fig. 9. Ottimizzazione del Moving Average LC Expert in modalità zero shift, GBPUSD

Migliori risultati:

 Result ProfittoEstrazione %
 Il numero di trades
 MovingPeriodMovingShift
 4025,75 1025,75 8,08 80 18
 22
 3857,90 857,90 15,04 74 55
 13
 3851,40 851,40 18,16 80 13
 24
 3849,48 849,48 13,05 69 34
 29
 3804,70 804,70 16,57 137 25
 8

Tabella 6. I migliori risultati dell'ottimizzazione di Moving Average LC Expert per GBPUSD in modalità zero shift

Grafico raffigurante l'ottimizzazione dell’Expert con modalità shift disabilitata, USDJPY:

Ottimizzazione in modalità zero shift, USDJPY

Fig. 10. Ottimizzazione del Mobile Average LC Expert in modalità zero shift, USDJPY

Migliori risultati:

Result
Profitto
Estrazione %
Il numero di trades
 MovingPeriod MovingShift
5801,632801,6311,5448
65
23
5789,172789,1714,0350
44
27
5539,062539,0617,1446
67
27
5331,342331,3415,0561
70
9
5045,192045,1912,6148
83
15

Tabella 7. I migliori risultati del Mobile Average LC Expert per USDJPY in modalità zero shift

5.1.2. Ottimizzazione dell’Expert nella modalità Static Shift

Parametri ottimizzati:

Parametro
 Inizio FaseFine
 Periodo medio mobile
 12
 1
 90
 Shift della Media Mobile
 6
 1
 30
 LC_shift 1 1 59

Tabella 8. Parametri ottimizzati del Mobile Average LC Expert in modalità shift statico

Grafico raffigurante l'ottimizzazione dell’Expert in modalità di static shift, EURUSD:

Ottimizzazione nella modalità static shift, EURUSD

Fig. 11. Ottimizzazione del Mobile Average LC Expert in modalità shift statico, EURUSD

Migliori risultati:

Result
Profitto
 Estrazione %
 Il numero di trades
MovingPeriod
MovingShift
LC_shift
 4385,06
 1385,06
 12,87 100 32 11 8
 4149,63
 1149,63
 14,22 66 77 25 23
 3984,92
 984,92
 21,52 122 12 11 26
 3969,35
 969,35
 16,08 111 32 11 24
 3922,95
 922,95
 12,29 57 77 25 10

Tabella 9. I migliori risultati di ottimizzazione del Mobile Average LC Expert per EURUSD in modalità shift statico

Grafico raffigurante l'ottimizzazione di Expert nella modalità shift statico, GBPUSD:

Ottimizzazione nella modalità di shift statico, GBPUSD

Fig. 12. Ottimizzazione del Mobile Average LC Expert in modalità shift statico, GBPUSD

Migliori risultati:

 Result ProfittoEstrazione %
Il numero di trades
 MovingPeriod MovingShiftLC_shift
 4571,07 1571,07 14,90 79 12
 25
 42
 4488,90 1488,90 15,46 73 12
 25
 47
 4320,31 1320,31 9,59 107 12
 16
 27
 4113,47 1113,47 10,96 75 12
 25
 15
 4069,21 1069,21 15,27 74 12
 25
 50

Tabella 10. I migliori risultati di ottimizzazione del Mobile Average LC Expert per GBPUSD in modalità shift statico

Grafico raffigurante l'ottimizzazione di Expert nella modalità shift statico, USDJPY:

Ottimizzazione nella modalità di shift statico,USDJPY

Fig. 13. Ottimizzazione della media mobile LC Expert in modalità shift statico, USDJPY

Migliori risultati:

Result
Profitto
Estrazione %
Il numero di trades
MovingPeriod
 MovingShiftLC_shift
 6051,39 3051,39 15,94 53
 76
 12
 31
 5448,98 2448,98 10,71 54
 44
 30
 2
 5328,15 2328,15 11,90 50
 82
 13
 52
 5162,82 2162,82 10,46 71
 22
 26
 24
 5154,71 2154,71 14,34 54
 75
 14
 58

Tabella 11. I migliori risultati di ottimizzazione del Mobile Average LC Expert per USDJPY in modalità shift statico

5.1.3. Ottimizzazione dell’Expert nella modalità Dynamic Shift

Parametri ottimizzati:

Parametro
 Inizio FaseFine
 Periodo medio mobile
 12
 1
 90
 Shift della Media Mobile
 6
 1
 30
 LC_shift -2 1 -1

Tabella 12. Parametri ottimizzati del Mobile Average LC Expert nella modalità Dynamic Shift

Grafico raffigurante l'ottimizzazione dell’Expert nella modalità dynamic shift, EURUSD:

Ottimizzazione nella modalità dynamic shift, EURUSD

Fig. 14. Ottimizzazione del Moving Average LC Expert in modalità dynamic shift, EURUSD

Migliori risultati:

Result
Profitto
Estrazione %
Il numero di trades
MovingPeriod
MovingShift
LC_shift
 3392,64 392,64 27,95 594 15 13 -2
 3140,26 140,26 23,35 514 12 17 -2
 2847,12 -152,88 17,04 390 79 23 -1
 2847,12 -152,88 17,04 390 79 12 -1
 2826,25 -173,75 20,12 350 85 22 -1

Tabella 13. I migliori risultati di ottimizzazione del Mobile Average LC Expert per EURUSD in modalità dynamic shift

Grafico raffigurante l'ottimizzazione dell’Expert nella modalità dynamic shift, GBPUSD:

Ottimizzazione nella modalità dynamic shift, GBPUSD

Fig. 15. Ottimizzazione del Mobile Average LC Expert in modalità dynamic shift, GBPUSD

Migliori risultati:

 ResultProfitto
 Estrazione %
Il numero di trades
MovingPeriod
 MovingShiftLC_shift
 5377,58 2377,58 19,73 391 12
 26
 -2
 3865,50 865,50 18,18 380 23
 23
 -2
 3465,63 465,63 21,22 329 48
 21
 -2
 3428,99 428,99 24,55 574 51
 16
 -1
 3428,99 428,99 24,55 574 51
 15
 -1

Tabella14. I migliori risultati di ottimizzazione del Mobile Average LC Expert per GBPUSD in modalità dynamic shift

Grafico raffigurante l'ottimizzazione di Expert nella modalità dynamic shift, USDJPY:

Ottimizzazione nella modalità dynamic shift, USDJPY

Fig. 16. Ottimizzazione del Mobile Average LC Expert in modalità dynamic shift, USDJPY

Migliori risultati:

Result
Profitto
Estrazione %
 Il numero di trades
MovingPeriod
MovingShift
 LC_shift
 6500,19 3500,19 17,45 244
 42
 28
 -2
 6374,18 3374,18 19,91 243
 54
 24
 -2
 6293,29 3293,29 19,30 235
 48
 27
 -2
 5427,69 2427,69 17,65 245
 90
 8
 -2
 5421,83 2421,83 16,30 301
 59
 12
 -2

Tabella 15. I migliori risultati di ottimizzazione del Mobile Average LC Expert per USDJPY nella modalità dynamic shift

5.2. Analisi dei risultati di ottimizzazione dell'Expert Trading tramite il modello "Pin Bar"

Confrontiamo i risultati dell'ottimizzazione di un Expert quando lavora in diverse modalità: con shift zero, con shift statico e con shift dinamico (DSO e DSC). Il test sarà effettuato per EURUSD, GBPUSD e USDJPY, nel periodo 2014.04.01 - 2014.10.25. PERIOD_H1

Parametri di input dell’Expert:

 ParametroValore
Rischio massimo in percentuale
0.1
Fattore di diminuzione
3.0
Pin bar min ombra, punti
40
Pin bar max OC, punti
110
Rapporto ombra barra pin/minimo OC
1.4
SL, punti (0 per OFF)
150
TP, punti (0 per OFF)
300
Periodo base LC
1 minuto
Modalità LC ON
true
Turno LC
0

Tabella 16. Parametri di input del Pin Bar LC Expert

Ottimizzeremo i parametri che definiscono la forma della barra dei pin: lunghezza del "naso", rapporto tra la lunghezza del "naso" e il corpo della barra centrale e dimensione massima del corpo. Anche i livelli Take Profit e Stop Loss devono essere ottimizzati.


5.2.1. Ottimizzazione dell’Expert con la modalità Shift disabilitata

Parametri ottimizzati:

 Parametro Inizio Fase Fine
Pin bar min ombra, punti
100
20
400
Pin bar max OC, punti
20
20
100
Rapporto ombra barra pin/minimo OC
1
0.2
3
SL, punti (0 per OFF)
150
50
500
TP, punti (0 per OFF)
150
50
500

Tabella17. Parametri ottimizzati del Pin Bar LC Expert nella modalità shift disabilitata

Grafico raffigurante l'ottimizzazione dell’Expert nella modalità shift disabilita, EURUSD:

Ottimizzazione con zero shift, EURUSD

Fig. 17. Ottimizzazione della Pin Bar LC Expert in modalità zero shift, EURUSD

Migliori risultati:

Result
Profitto
 Estrazione %
 Il numero di trades
 Pin bar min, ombra
 Pin bar max OC
 Ombra della barra dei pin
rapporto OC min
 SL TP
 3504,59
 504,59
 9,82
 33
 100
 60
 1.8
 450
 500
 3428,89
 428,89
 8,72
 21
 120
 60
 2.8
 450
 350
 3392,37
 392,37
 9,94
 30
 100
 60
 2,6
 450
 250
 3388,54
 388,54
 9,93
 31
 100
 80
 2,2
 450
 300
 3311,84
 311,84
 6,84
 13
 140
 60
 2,2
 300
 450

Tabella 18. I migliori risultati di ottimizzazione del Pin Bar LC Expert per EURUSD in modalità zero shift

Grafico raffigurante l'ottimizzazione dell’Expert in modalità zero shift, GBPUSD:

Ottimizzazione con zero shift, GBPUSD

Fig. 18. Ottimizzazione della Pin Bar LC Expert in modalità zero shift, GBPUSD

Migliori risultati:

Result
Profitto
 Estrazione %
 Il numero di trades
 Pin Bar min, ombra
 Pin Bar max OC
 Pin Bar ombra
rapporto OC min
 SL TP
 3187,13
 187,13
 11,10
 13
 160
 60
 2,6
 500
 350
 3148,73
 148,73
 3,23
 4
 220
 40
 2,8
 400
 400
 3142,67
 142,67
 11,27
 17
 160
 100
 1,8
 500
 350
 3140,80
 140,80
 11,79
 13
 180
 100
 2
 500
 500
 3094,20
 94,20
 1,62
 1
 260
 60
 1,6
 500
 400

Tabella19. I migliori risultati di ottimizzazione del Pin Bar LC Expert per GBPUSD in modalità zero shift

Grafico raffigurante l'ottimizzazione dell’Expert con modalità shift disabilitata, USDJPY:

Ottimizzazione con zero shift, USDJPY

Fig. 19. Ottimizzazione del Pin Bar LC Expert in modalità zero shift, USDJPY

Migliori risultati:

Result
Profitto
 Estrazione %
 Il numero di trades
 Pin bar min, ombra
 Pin bar max OC
 Ombra della barra dei pin
rapporto OC min
 SL TP
 3531,99
 531,99
 9,00
 6
 160
 60
 2.2
 450
 500
 3355,91
 355,91
 18,25
 16
 120
 60
 1,6
 450
 400
 3241,93
 241,93
 9,11
 4
 160
 40
 2,8
 450
 500
 3180,43
 180,43
 6,05
 33
 100
 80
 1,8
 150
 450
 3152,97
 152,97
 3,14
 6
 160
 80
 2,8
 150
 500

Tabella 20. I migliori risultati di ottimizzazione del Pin Bar LC Expert per USDJPY in modalità zero shift

5.2.2. Ottimizzazione dell’Expert nella modalità Static Shift

Parametri ottimizzati:

 Parametro Inizio Fase Fine
 Pin bar min ombra, punti
 100
 20
 400
 Pin bar max OC, punti
 20
 20
 100
 Rapporto ombra barra pin/minimo OC
 1
 0.2
 3
 SL, punti (0 per OFF)
 150
 50
 500
 TP, punti (0 per OFF)
 150
 50
 500
 Turno LC
 1 1 59

Tabella 21. Parametri ottimizzati della Pin Bar LC Expert in modalità shift statico

Grafico raffigurante l'ottimizzazione dell’Expert in modalità di static shift, EURUSD:

Ottimizzazione nella modalità static shift, EURUSD

Fig. 20. Ottimizzazione del Pin Bar LC Expert in modalità shift statico, EURUSD

Migliori risultati:

Result
Profitto
 Estrazione %
 Il numero di trades
 Pin bar min, ombra
 Pin bar max OC
 Ombra della barra dei pin
rapporto OC min
 SL TP Turno LC
 4843,54
 1843,54
 10,14
 19
 120
 80
 1,6
 500
 500
 23
 4714,81
 1714,81
 10,99
 28
 100
 100
 1,6
 500
 500
 23
 4672,12
 1672,12
 10,16
 18 120
 80
 1,8
 500
 500
 23
 4610,13
 1610,13
 9,43
 19
 120
 80
 1,6
 450
 450
 23
 4562,21
 1562,21
 13,94
 27
 100
 100
 1,6
 500
 400
 25

Tabella 22. I migliori risultati di ottimizzazione del Pin Bar LC Expert per EURUSD in modalità shift statico

Grafico raffigurante l'ottimizzazione di Expert nella modalità shift statico, GBPUSD:

Ottimizzazione nella modalità static shift, GBPUSD

Fig. 21. Ottimizzazione del Pin Bar LC Expert in modalità shift statico, GBPUSD

Migliori risultati:

Result
Profitto
 Estrazione %
 Il numero di trades
 Pin bar min, ombra
 Pin bar max OC
 Ombra della barra dei pin
rapporto OC min
 SL TP Turno LC
 4838,10
 1838,10
 5,60
 34
 100
 40
 2,4
 450
 500
 24
 4797,09
 1797,09
 5,43
 35
 100
 40
 2,6
 400
 500
 24
 4755,57
 1755,57
 7,36
 42
 100
 100
 2
 400
 500
 24
 4725,41
 1725,41
 8,35
 45
 100
 80
 1
 400
 500
 24
 4705,61
 1705,61
 8,32
 41
 100
 100
 2
 450
 500
 24

Tabella 23. I migliori risultati di ottimizzazione del Pin Bar LC Expert per GBPUSD in modalità static shift

Grafico raffigurante l'ottimizzazione di Expert nella modalità shift statico, USDJPY:

Ottimizzazione nella modalità static shift, USDJPY

Fig. 22. Ottimizzazione del Pin Bar LC Expert in modalità shift statico, USDJPY

Migliori risultati:

Result
Profitto
 Estrazione %
 Il numero di trades
 Pin Bar min, ombra
 Pin bar max OC
 Ombra della barra dei pin
rapporto OC min
 SL TP Turno LC
 4108,83
 1108,83
 6,45
 9
 140
 40
 1,4
 500
 450
 55
 3966,74
 966,74
 7,88
 12
 140
 60
 2,8
 450
 500
 45
 3955,32
 955,32
 9,91
 21
 120
 80
 2
 500
 500
 45
 3953,80
 953,80
 6,13
 10
 140
 60
 2,8
 450
 450
 47
 3944,33
 944,33
 6,42
 6
 160
 100
 2,6
 500
 400
 44

Tabella 24. I migliori risultati di ottimizzazione del Pin Bar LC Expert per USDJPY in modalità static shift

5.2.3. Ottimizzazione dell’Expert nella modalità Dynamic Shift

Parametri ottimizzati:

 Parametro Inizio Fase Fine
 Pin bar min ombra, punti
 100
 20
 400
 Pin bar max OC, punti
 20
 20
 100
 Rapporto ombra barra pin/minimo OC
 1
 0.2
 3
 SL, punti (0 per OFF)
 150
 50
 500
 TP, punti (0 per OFF)
 150
 50
 500
 Turno LC
 -2 1 -1

Tabella 25. Parametri ottimizzati dell’Expert Pin Bar LC in modalità dynamic shift

Grafico raffigurante l'ottimizzazione dell’Expert nella modalità dynamic shift, EURUSD:

Ottimizzazione nella modalità dynamic shift, EURUSD

Fig. 23. Ottimizzazione dell’Expert Pin Bar LC nella modalità dynamic shift, EURUSD

Migliori risultati:

Result
Profitto
 Estrazione %
 Il numero di trades
 Pin bar min, ombra
 Pin bar max OC
 Ombra della barra dei pin
rapporto OC min
 SL TP Turno LC
 4185,65
 1185,65
 13,22
 49
 200
 100
 1,8
 450
 500
 -2
 4011,80
 1011,80
 13,75
 49
 200
 100
 2
 400
 500
 -2
 3989,28
 989,28
 12,01
 76
 140
 20
 1,2
 350
 200
 -1
 3979,50
 979,50
 16,45
 157
 100
 20
 1
 450
 500
 -1
 3957,25
 957,25
 16,68
 162
 100
 20
 1
 400
 500
 -1

Tabella 26. I migliori risultati di ottimizzazione del Pin Bar LC Expert per EURUSD in modalità shift statico

Grafico raffigurante l'ottimizzazione dell’Expert nella modalità dynamic shift per GBPUSD:

Ottimizzazione nella modalità dynamic shift, GBPUSD

Fig. 24. Ottimizzazione dell’Expert Pin Bar LC in modalità dynamic shift, GBPUSD

Migliori risultati:

Result
Profitto
 Estrazione %
 Il numero di trades
 Pin bar min, ombra
 Pin bar max OC
 Ombra della barra dei pin
rapporto OC min
 SL TP Turno LC
 4906,84
 1906,84
 10,10
 179
 120
 40
 1,8
 500
 500
 -2
 4316,46
 1316,46
 10,71
 151
 120
 20
 2,4
 450
 500
 -1
 4250,96
 1250,96
 12,40
 174
 120
 40
 1,8
 500
 500
 -1
 4040,82
 1040,82
 12,40
 194
 120
 60
 2
 500
 200
 -2
 4032,85
 1032,85
 11,70
 139
 140
 40
 2
 400
 200
 -1

Tabella 27. I migliori risultati di ottimizzazione dell’Expert Pin Bar LC per GBPUSD in modalità dynamic shift

Grafico raffigurante l'ottimizzazione di Expert nella modalità dynamic shift, USDJPY:

Ottimizzazione nella modalità dynamic shift, USDJPY

Fig. 25. Ottimizzazione dell’Expert Pin Bar LC in modalità dynamic shift, USDJPY

Migliori risultati:

Result
Profitto
 Estrazione %
 Il numero di trades
 Pin bar min, ombra
 Pin bar max OC
 Ombra della barra dei pin
rapporto OC min
 SL TP Turno LC
 5472,67
 2472,67
 13,01
 138
 100
 20
 2,4
 500
 500
 -1
 4319,84
 1319,84
 15,87
 146
 100
 20
 2,2
 400
 500
 -1
 4259,54
 1259,54
 19,71
 137
 100
 20
 2,4
 500
 500
 -2
 4197,57
 1197,57
 15,98
 152
 100
 20
 1
 350
 500
 -1
 3908,19
 908,19
 16,79
 110
 120
 40
 3
 400
 400
 -1

Tabella 28. I migliori risultati di ottimizzazione dell’Expert Pin Bar LC per USDJPY in modalità dynamic shift


6. Confronto dei Risultati di Ottimizzazione

Per creare una tabella di confronto, selezioniamo i valori massimi di profitto, drawdown e una serie di operazioni da ogni tabella dei migliori risultati. Accanto al valore ricevuto nelle modalità dynamic o static shift, scriveremo la variazione (in percentuale) o questo valore in relazione allo stesso valore nella modalità di zero shift.


6.1. Expert Trading per media mobile

Profitto:

 Nessuno shift
 statico
Shift
Dinamico
Shift
 EURUSD
 796,43
 1385,06 (+74%)
 392,64 (-51%)
 GBPUSD
 1025,75
 1571,07 (+53%)
 2377,58 (+132%)
 USDJPY
 2801,63
 3051,39 (+9%)
 3500,19 (+25%)

Tabella 29. Confronto dei valori massimi di profitto dalla tabella dei migliori risultati di ottimizzazione dell’Expert Mobile Average LC

Drawdown:

 Nessuno shift
 statico
Shift
Dynamic
Shift
 EURUSD
 17,7
 21,52 (+22%)   
 27,95 (+58%)      
 GBPUSD
 18,16
 15,46 (-15%)
 24,55 (+35%)
 USDJPY
 17,14
 15,94 (-7%)
 19,91 (+16%)

Tabella 30. Confronto dei valori massimi di drawdown dalla tabella dei migliori risultati di ottimizzazione dell’Expert Mobile Average LC

Il numero di trade:

 Nessuno shift
 statico
Shift
Dinamico
Shift
 EURUSD
 111
 122 (+10%)     
 594 (+435%)       
 GBPUSD
 137
 107 (-22%)
 574 (+319%)
 USDJPY
 61
 71 (+16%)
 301 (+393%)

Tabella 31. Confronto dei valori massimi del numero di operazioni dalla tabella dei migliori risultati di ottimizzazione dell'Expert Moving Average LC

La prima cosa che salta subito all'occhio è un aumento significativo dei punti di ingresso nella modalità dynamic shift. Allo stesso tempo, tuttavia, il drawdown è notevolmente aumentato e il profitto è diminuito di due volte per EURUSD.

La modalità static shift è più redditizia per questo Expert Advisor. Qui possiamo vedere la diminuzione del drawdown per GBPUSD e USDJPY e un significativo aumento del profitto per EURUSD e GBPUSD.


6.2. Expert Trading dal modello "Pin Bar"

Profitto:

 Nessuno shift
 statico
Shift
Dinamico
Shift
 EURUSD
504,59
1843,54 (+265%)
1185,65 (+135%)
 GBPUSD
187,13
1838,10 (+882%)
1906,84 (+919%)
 USDJPY
531,99
1108,83 (+108%)2472,67 (+365%)

Tabella 32. Confronto dei valori massimi di profitto dalle tabelle dei migliori risultati di ottimizzazione dell’Expert Pin Bar LC

Drawdown:

 Nessuno shift
 statico
Shift
Dinamico
Shift
 EURUSD
9,94
13,94 (+40%)
16,68 (+68%)
 GBPUSD
11,79
8,35 (-29%)
12,4 (+5%)
 USDJPY
18,25
9,91 (-46%)
19,71 (+8%)

Tabella 33. Confronto dei valori massimi di drawdown dalla tabella dei migliori risultati di ottimizzazione dell’Expert Pin Bar LC

Il numero di trade:

 Nessuno shift
 statico
Shift
Dinamico
Shift
 EURUSD
33
28 (-15%)
162 (+391%)
 GBPUSD
17
45 (+165%)
194 (+1041%)
 USDJPY
33
21 (-36%)
152 (+361%)

Tabella 34. Confronto dei valori massimi del numero di operazioni dalla tabella dei migliori risultati di ottimizzazione dell’Expert Pin Bar LC

Qui vediamo un sostanziale aumento del numero di operazioni nella modalità dynamic shift. In questo caso, tuttavia, un aumento significativo del drawdown, come nel caso simile con l'Expert Moving Average LC, avviene solo per EURUSD. Per altre coppie il drawdown aumenta in modo significativo, approssimativamente del 5-8 percento.

Nella modalità static shift, l'ottimizzazione ha mostrato un profitto limitato per GBPUSD e USDJPY. Tuttavia, possiamo vedere una significativa diminuzione del drawdown per le stesse coppie e il suo aumento per EURUSD. La modalità static shift sembra meno redditizia per questo Expert Advisor.


Conclusione

In questo articolo abbiamo considerato i principi di tracciatura del "grafico liquido" e confrontato l'influenza delle sue modalità operative sul risultato di ottimizzazione dell'Expert in base a strategie con indicatori e con non-indicatori.

Da qui possiamo trarre le seguenti conclusioni:

  • Per gli Expert che utilizzano strategie di indicatori (ad esempio il trading tramite media mobile) la modalità static shift è più adatta. Garantisce un ingresso più preciso nel mercato, che si traduce in una diminuzione del drawdown e in un aumento del profitto.
  • La modalità dynamic shift è migliore per gli Expert che fanno trading con modelli. Questa modalità aumenta il numero di punti di ingresso anche se il drawdown aumenta allo stesso tempo.
  • La modalità dynamic shift insieme a una gestione del denaro ben organizzata può dare risultati impressionanti.
  • Sebbene sembri molto promettente per le strategie con indicatori, la modalità static shift presenta uno svantaggio significativo. Il valore di shift che fornisce il miglior risultato è un'altra variabile nell'elenco dei parametri di input che deve essere indovinata correttamente.

Tradotto dal russo da MetaQuotes Ltd.
Articolo originale: https://www.mql5.com/ru/articles/1208

File allegati |
liquid_chart.mq5 (27.15 KB)
pinbar_lc.mq5 (18.61 KB)
liquidchart.mqh (8.32 KB)

Altri articoli di questo autore

Fondamenti di programmazione MQL5: Variabili Globali del Terminale Fondamenti di programmazione MQL5: Variabili Globali del Terminale
Questo articolo evidenzia le capacità orientate agli oggetti del linguaggio MQL5 per la creazione di oggetti che facilitano il lavoro con le variabili globali del terminale. Come esempio pratico considero un caso in cui le variabili globali vengono utilizzate come punti di controllo per l'implementazione delle fasi del programma.
Tracciare linee di tendenza basate su frattali utilizzando MQL4 e MQL5 Tracciare linee di tendenza basate su frattali utilizzando MQL4 e MQL5
L'articolo descrive l'automazione del tracciamento delle linee di tendenza in base all'indicatore Fractals utilizzando MQL4 e MQL5. La struttura dell'articolo fornisce una vista comparativa della soluzione per due lingue. Le linee di tendenza vengono tracciate utilizzando gli ultimi due frattali conosciuti.
Manuale statistico del trader ipotesi Manuale statistico del trader ipotesi
Questo articolo considera l'ipotesi, una delle idee di base della statistica matematica. Varie ipotesi vengono esaminate e verificate attraverso esempi utilizzando metodi di statistica matematica. I dati effettivi vengono generalizzati utilizzando metodi non parametrici. Per l'elaborazione dei dati vengono utilizzati il pacchetto Statistica e la libreria di analisi numerica ALGLIB MQL5 pilotata.
Manuale MQL5: Gestione di BookEvent Manuale MQL5: Gestione di BookEvent
Questo articolo parla di BookEvent - un evento Depth of Market e il principio della sua elaborazione. Un programma MQL che serve a gestire gli stati di Depth of Market, servirà da esempio. È scritto utilizzando l'approccio orientato agli oggetti. I risultati della gestione vengono visualizzati sullo schermo come un pannello e livelli di Depth of Market.