
Grafico liquido
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.
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.
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.
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:
Valore | Descrizione |
---|---|
-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:
Codice | Descrizione |
---|---|
-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.
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:
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?
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].
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 e 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 | Fase | Fine |
---|---|---|---|
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:
Fig. 8. Ottimizzazione dell'Expert LC della media mobile in modalità zero shift, EURUSD
Migliori risultati:
Result | Profitto | Estrazione % | 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:
Fig. 9. Ottimizzazione del Moving Average LC Expert in modalità zero shift, GBPUSD
Migliori risultati:
Result | Profitto | Estrazione % | Il numero di trades | MovingPeriod | MovingShift |
---|---|---|---|---|---|
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:
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,63 | 2801,63 | 11,54 | 48 | 65 | 23 |
5789,17 | 2789,17 | 14,03 | 50 | 44 | 27 |
5539,06 | 2539,06 | 17,14 | 46 | 67 | 27 |
5331,34 | 2331,34 | 15,05 | 61 | 70 | 9 |
5045,19 | 2045,19 | 12,61 | 48 | 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 | Fase | Fine |
---|---|---|---|
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:
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:
Fig. 12. Ottimizzazione del Mobile Average LC Expert in modalità shift statico, GBPUSD
Migliori risultati:
Result | Profitto | Estrazione % | Il numero di trades | MovingPeriod | MovingShift | LC_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:
Fig. 13. Ottimizzazione della media mobile LC Expert in modalità shift statico, USDJPY
Migliori risultati:
Result | Profitto | Estrazione % | Il numero di trades | MovingPeriod | MovingShift | LC_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 | Fase | Fine |
---|---|---|---|
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:
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:
Fig. 15. Ottimizzazione del Mobile Average LC Expert in modalità dynamic shift, GBPUSD
Migliori risultati:
Result | Profitto | Estrazione % | Il numero di trades | MovingPeriod | MovingShift | LC_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:
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:
Parametro | Valore |
---|---|
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:
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:
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:
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:
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:
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:
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:
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:
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:
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





- 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