![Expert Advisor basato sulle "New Trading Dimensions" di Bill Williams](https://c.mql5.com/i/articles/overlay.png)
Expert Advisor basato sulle "New Trading Dimensions" di Bill Williams
Introduzione
In questo articolo parlerò dello sviluppo di un Expert Advisor di trading, basato sul libro New Trading Dimensions: Come Trarre Profitto dal Caos in Azioni, Bond e Materie Prime di B. Williams per la piattaforma MetaTrader 5 nel linguaggio MQL5. La strategia stessa è ben nota ed il suo utilizzo è ancora piuttosto controverso tra i trader.
Attira i nuovi arrivati con il suo pronto studio di segnali che sono "quasi del tutto" privi di un lato soggettivo, a differenza, ad esempio, dell’'interpretazione della teoria delle onde di Elliott. Ma questo è solo a prima vista, in alcuni punti le decisioni dovranno ancora essere prese dal trader. E di questo parleremo ulteriormente nell'articolo.
Gli obiettivi di questo articolo:- Sviluppare, utilizzando il paradigma OOP (Programmazione orientata agli oggetti), una classe di EA, che implementa il trading, basata sulla strategia di B. Williams. Lo chiameremo C_TS_BW;
- Nella classe C_TS_BW quando possibile, utilizzare codici già pronti dalla Libreria Standard.
- Scrivi un EA che utilizzi la classe C_TS_BW;
- Testa l'EA sviluppato nello Strategy Strategy Tester su diversi strumenti Forex e CFD;
- Infine, per confermare o smentire l'attitudine di questa strategia alle attuali condizioni di mercato.
1. Indicatori
Alla base del sistema di trading ci sono segnali da 4 indicatori:
1.1. Alligator
L'Alligator indicatore tecnico è una combinazione di linee di Equilibrio (Moving Averages), che utilizzano la geometria frattale e la dinamica non lineare.- La linea blu (la Mascella dell'Alligatore) - è la Balance Line per il periodo di tempo che è stato utilizzato per costruire un grafico (una media mobile livellata a 13 periodi, spostata di 8 barre nel futuro);
- La linea rossa (i Denti dell'Alligatore)- è la Linea di Equilibrio per un periodo di tempo significativo, inferiore di un ordine (media mobile livellata a 8 periodi, spostata di 5 barre nel futuro);
- La linea verde (le Labbra dell’Alligatore) - è la Linea di Equilibrio per un periodo di tempo significativo, inferiore di un altro ordine (media mobile livellata a 5 periodi, spostata di 3 barre nel futuro).
Le linee Labbra, Denti e Mascelle dell'Alligatore illustrano l'interazione di diversi periodi di tempo. Poiché le tendenze del mercato possono essere identificate solo per il 15-30 percento del tempo, dobbiamo seguire le tendenze e non lavorare su mercati che fluttuano solo entro determinati periodi di prezzo.
Quando le Mascelle, i Denti e le Labbra sono chiuse o intrecciate, l'Alligatore sta per addormentarsi o sta già dormendo. Quando dorme, la sua fame aumenta, quindi più dorme, più sarà affamato quando si sveglia. Quando si sveglia, la prima cosa che fa è aprire la bocca e iniziare a sbadigliare. Quindi, inizia a sentire l'odore del cibo: carne di un toro o di un orso e inizia a cacciarla. Quando l'Alligatore soddisfa la sua fame, inizia a perdere interesse per il prezzo del cibo (le Linee di Equilibrio si uniscono) - questo è il momento di fissare il profitto.
1.2. Frattali
Tutti i mercati sono caratterizzati dal fatto che, per la maggior parte del tempo, i prezzi non oscillano molto e solo per un breve periodo (15-30 percento) si possono osservare cambiamenti di tendenza. I periodi più favorevoli per ottenere il profitto sono quando i prezzi di mercato cambiano secondo un certo trend.Frattali (Frattali) - è uno dei 4 indicatori del sistema di trading di Bill Williams che permette di rilevare il minimo o il massimo. La definizione tecnica di un frattale verso l'alto è una serie di almeno cinque barre successive, in cui ci sono due barre, prima e dopo il massimo più alto, che hanno massimi inferiori. La configurazione opposta (serie di cinque barre, in cui prima e dopo il minimo più basso ci sono due barre con minimi più alti) è un frattale discendente. Su un grafico, i frattali hanno i valori di Alto e Basso e sono indicati da frecce verso l'alto o verso il basso.
I segnali dell'indicatore tecnico Fractals devono essere filtrati, utilizzando l'indicatore tecnico Alligator. In altre parole, non dovremmo concludere un deal per comprare se un frattale si trova sotto i denti dell'Alligatore, e non dovremmo concludere un deal per vendere se un frattale si trova sopra i Denti dell'Alligatore. Dopo che il segnale frattale è stato creato ed è in atto, determinato dalla sua posizione al di là delle Mascelle dell’Alligatore, esso rimane un segnale fino a quando non viene attaccato, o fino a quando emerge un segnale frattale più recente.
1.3. L’AO (Awesome Oscillator)
L'indicatore tecnico Awesome Oscillator di Bill Williams (Awesome Oscillator, AO) - è una media mobile semplice a 34 periodi, costruita dai punti medi delle barre (H + L)/2 che viene sottratta dalla media mobile semplice a 5 periodi, che è costruita dai punti centrali delle barre (H + L)/2. Ci fa sapere cosa sta succedendo in questo momento con la forza motrice del mercato.
1.4. AO (Accelerator Oscillator)
Il prezzo è l'ultimo elemento che cambia. Prima che il prezzo cambi, la forza motrice del mercato cambia e prima che la forza motrice cambi direzione, l'accelerazione della forza motrice dovrebbe rallentare e raggiungere lo zero. Quindi, inizia ad accelerare fino a quando il prezzo non inizia a cambiare direzione.
L'indicatore tecnico di Accelerazione/Decelerazione (Accelerator/Decelerator Oscillator, AC) misura l'accelerazione e la decelerazione della forza motrice attuale. Questo indicatore cambierà direzione prima che avvenga il cambiamento della forza motrice e, a sua volta, cambierà direzione prima che avvenga la variazione del prezzo. Comprendere che l'AC è un segnale di avvertimento anticipato, ha ovvi vantaggi.
2. Segnali
Il sistema di trading, descritto nel libro "New Trading Dimensions" di B. Williams, utilizza segnali provenienti da cinque dimensioni di trading.
- La prima dimensione: superare il frattale oltre le mascelle dell'Alligatore;
- La seconda dimensione: i segnali dall'indicatore AO (Awesome Oscillator);
- La terza dimensione: i segnali dell'indicatore AC (Accelerator Oscillator);
- La quarta dimensione: trading nelle zone;
- La quinta dimensione: linea di equilibrio del trading.
Maggiori informazioni sui segnali di ogni dimensione.
2.1. Descrizione del trading per segnali della prima dimensione
Il frattale "A" (segnale di acquisto) è falso, perché la rottura del prezzo avviene al di sotto della linea della mascella dell'Alligatore. Il frattale "B" viene eseguito e abbiamo una posizione corta aperta. Con la comparsa del frattale "C", chiudiamo la nostra posizione corta e abbiamo già una posizione lunga netta.
Con la rottura del frattale "D" cambiamo nuovamente la posizione da acquisto a vendita. Superando il frattale "E" per comprare, il mercato ci dice ancora una volta che la posizione deve essere cambiata da sell a buy. Con l'esecuzione dei segnali dai frattali "G" e "J", aggiungiamo un altro contratto alla posizione lunga.
Figura 1. Un esempio di trade nei segnali di prima dimensione
2.2. Descrizione del trading per segnali della seconda dimensione
Sono stati implementati due tipi di segnali della seconda dimensione. Questo è il crossover di linea zero dell'indicatore AO (Awesome Oscillator) e il segnale "Saucer". Accettiamo l'indicizzazione delle barre come facciamo in MetaTrader 5, cioè come serie temporali. Il controllo del segnale verrà effettuato sulla barra zero.
Per la formazione di un pattern "Zero line crossover", devono essere presenti due barre dell'indicatore.
Il segnale di acquisto si forma quando la seconda barra dell'indicatore è al di sotto della linea dello zero e la prima barra è al di sopra della linea dello zero. Il prezzo massimo della prima barra sarà il segnale e, se supera, l'ordine di acquisto verrà inviato al server, utilizzando il prezzo corrente. Il segnale di vendita si forma nel caso opposto crossover.
Per la formazione di un pattern "Saucer", devono esserci tre barre consecutive e la seconda deve essere di colore rosso e sopra la linea dello zero, mentre la prima deve essere verde e più in alto della seconda. Il prezzo di segnalazione sarà il prezzo più alto della prima barra, che sarà valida fino a quando non sarà superata dal prezzo corrente o viene formato un nuovo segnale di acquisto. I segnali di vendita del modello "saucer" si formano in modo simile ma sul lato opposto dell'indicatore.
Per la formazione di un pattern "Saucer" devono essere presenti tre barre consecutive, la seconda deve essere di colore rosso e sopra la linea dello zero, mentre la prima deve essere verde e più alta della seconda. Il prezzo di segnalazione sarà il prezzo più alto della prima barra, che sarà valido fino a quando non sarà superato dal prezzo corrente o si formerà un nuovo segnale di acquisto. I segnali di vendita del modello "saucer" si formano in modo simile ma sul lato opposto dell'indicatore.
I segnali "Twin Peaks" e "Twin bottoms" non vengono considerati in questo articolo e non verranno programmati nell'EA in quanto la loro formazione avviene quasi sempre dalla parte opposta dell'Alligator: il twin bottom è al di sotto della linea delle mascelle i twin peak sono sopra questa linea. Il trading su tali segnali contraddice il sistema: per non alimentare l'Alligatore, non possiamo acquistare sotto le mascelle e non possiamo vendere sopra le mascelle dell'Alligatore.
Per una descrizione più dettagliata dei segnali, ti ho consigliato di consultare la fonte originale.
Figura 2. Un esempio di segnali di trading della seconda dimensione
2.3. Descrizione dei segnali di trading della terza dimensione
Nella terza dimensione ci sono i segnali "buy above the zero line" e "buy below the zero line", formati da indicatori AC (AcceleratorOscillator).
Per prima cosa osserviamo il modello specificato nella Figura 3. Il controllo viene eseguito per una barra zero. Se la prima barra è sopra la linea dello zero (caso "A") che consiste in due barre verdi e una rossa di un istogramma. Nel frattempo, la posizione della seconda e della terza barra, rispetto alla linea dello zero, non ha importanza.
Se la prima barra è al di sotto della linea dello zero (caso "B"), avremo bisogno di tre barre verdi e una rossa per la formazione di un segnale di acquisto. Inoltre, non tiene conto delle barre rimanenti, rispetto alla linea dello zero. I segnali di vendita della terza dimensione sono inversamente analoghi.
Per una descrizione più dettagliata ed esempi, fare riferimento alla fonte originale.
Figura 3. Esempio di segnali di trading di terza dimensione
2.4. Descrizione dei segnali di trading della quarta dimensione ("Zone Trading")
La zona verde si forma quando due indicatori (AO+AC) sono verdi per una qualche barra.
La formazione di un segnale di trading richiede due zone verdi consecutive e il prezzo di chiusura della prima barra deve essere superiore al prezzo di chiusura della seconda barra.
L'esecuzione viene implementata una volta aperta una nuova barra. Nell'originale, l'esecuzione dovrebbe essere l'ordine alla chiusura di una barra. Ci sono situazioni in cui l'ultimo tick della chiusura della barra può cambiare il colore delle barre AO o AC e, se ciò si verifica, allora risulta che l'acquisto in base al segnale della zona verde era falso. Per questi motivi, ho sfruttato l'apertura di una nuova barra per comprare.
Inoltre, nella quarta dimensione, c'è un segnale per seguire un ordine di stop per la posizione lunga.
Ciò richiede cinque zone verdi consecutive. Il valore minimo del prezzo della prima zona viene utilizzato per impostare uno Stop Loss. Se l'ordine stop non viene attivato alla barra successiva (dopo la sua chiusura), allora impostiamo lo Stop Loss al prezzo minimo dell'ultima barra completata (dovrebbe essere superiore all'ordine stop) con l'apertura di una nuova, senza considerare il colore della zona sulla barra precedente.
Inoltre, utilizziamo una limitazione all'aggiunta della posizione lunga aperta per il numero di zone verdi consecutive: B. Williams raccomanda 6 o 8 zone. Dopo questo, dovremmo aspettare la comparsa di una zona grigia (questo avviene quando i colori delle colonne per AO e AC sono diversi) o zone rosse, che consentiranno di nuovo di riempire la posizione per acquistare dalla zona verde.
Il segnale di vendita forma una "zona rossa", un'immagine speculare della zona verde. Il colore della zona influenza anche il numero di barre che formano il segnale dalla "Balance Line Trade" (quinta dimensione). Per questa linea, B. Williams ha scelto i "denti" dell'Alligatore.
In questo segnale, voglio sottolineare, che i prezzi OHLC della barra zero partecipano alla formazione del segnale.
Figura 4. Un esempio di segnali di trading di quarta dimensione
2.5. Descrizione dei segnali di trading della quinta dimensione
Il modello "Acquista sopra la linea del saldo" (se la zona è verde) è formato da due barre. Se il prezzo di apertura di una barra zero (anche il prezzo più alto della barra in questo momento) è inferiore all'ultimo prezzo più alto della barra (può essere trovato poche barre indietro), allora il prezzo massimo trovato sarà il prezzo per l'apertura di una posizione di acquisto nella zona verde.
Le zone rosse o grigie richiedono un altro massimo, superiore al prezzo per entrare nella zona verde. Appena lo troviamo (di solito meno di 10 barre indietro e sopra i denti dell'Alligatore [non ho trovato quante barre indietro bisogna cercare per un pattern simile nel testo dell'autore]), ricordatelo come il prezzo per entrare nella zona rossa o grigia, nella direzione per acquistare.
Per aprire una posizione con il segnale "compra al di sopra della linea del saldo", controlliamo il prezzo corrente che supera il prezzo su ogni nuova barra (per le zone verde/rossa/grigia).
Figura 5. Un esempio di segnali di trading di quinta dimensione
3. La classe C_TS_BW
3.1. Scopo della classe: - Se possibile, usa le classi della Libreria Standard;
- Grandi quantità di "dati simili" dovrebbero essere immagazzinate nelle strutture;
- Personalizza le impostazioni;
- Ottenere il numero richiesto di dati calcolati dagli indicatori per l'analisi;
- Quando una nuova barra controlla i segnali dalle cinque dimensioni di trading;
- Quando un nuovo tick controlla il segnale per l'apertura di una posizione;
- Calcolare il lotto, fisso o "piramidale" (imparerai questo algoritmo nel metodo CalcLot di questa classe);
- Consentono di modificare il lotto dell'EA direttamente per ogni tipo di segnale. Implementare l'esigenza personalizzata di algoritmi di gestione del denaro;
- Traccia un ordine di stop della posizione aperta. Se necessario, modificare il prezzo dello Stop Loss, calcolato dall'utente dall'EA;
- Invia l'ordine sul server di trading ed effettua una seconda richiesta in caso di errore;
- Proibire la duplicazione dei segnali di trading (inserire solo una volta per segnale);
- Ridurre al minimo il numero di metodi di classe pubblica;
-
...Se possibile, usa classi e metodi della libreria Standard;
Per eseguire questa attività, devi prima includere i file specifici dalla Libreria Standard.
Questo è implementato dal codice sottostante.
#include <Trade\Trade.mqh> #include <Trade\SymbolInfo.mqh> #include <Trade\PositionInfo.mqh> #include <Trade\HistoryOrderInfo.mqh
Nella sezione privata della classe, dichiarare gli oggetti per l'organizzazione delle richieste di trading, ottenere le informazioni sul simbolo e sulla posizione aperta, nonché accedere allo storico degli ordini.
CTrade exp_trade; // trading methods from the Standard Library CSymbolInfo s_info; // methods of accessing the information on symbol CPositionInfo pos_info; // methods of obtaining the information on position CHistoryOrderInfo h_info; // methods of accessing the history of orders
-
... Nelle strutture sono immagazzinate grandi quantità di "dati simili".
Questa classe utilizza quattro strutture, due delle quali sono dichiarate nella sezione privata. Queste sono le strutture:
struct l_signals // structure of signals and time of the bar, on which they appeared struct l_trade // structure of the time of the last triggered signals
Inoltre, ci sono due strutture nella sezione pubblica:
struct s_input_parametrs // structure of the tuning parameters struct s_actual_action // structure of the appropriate trading order
Gli oggetti di questi tipi di strutture:
l_signals last_signals; // signals l_trade last_trade; // processed signals s_input_parametrs inp_param; // internal structure of the accepted settings s_input_parametrs inp_param_tmp; // receiving structure of the settings (received through a link with the initialization of the class) s_actual_action actual_action; // orders on the serve
Maggiori dettagli sul codice delle strutture possono essere trovati nel file di intestazione allegato.
-
... personalizzare le impostazioni;
Questa attività viene implementata utilizzando il metodo Init dalla sezione pubblica. Parametri per le chiamate dall'EA:
string Symbol_for_trade // symbol, on which the class will trade ENUM_TIMEFRAMES Period_for_trade // the period of the chart symbol, on which the search for signals and its processing will occur s_input_parametrs &inp_param_tmp // receiving structure of the class settings
In questo metodo, avviene anche l'inizializzazione degli indicatori coinvolti e l'organizzazione dei buffer necessari per ricevere i dati dagli stessi.
-
... ottenere il numero richiesto di dati calcolati dagli indicatori per l'analisi;
Ciò può essere eseguito utilizzando il metodo CopyIndValue dalla sezione privata, i parametri
int type // what we request (0- Alligator, 2 - АО, 3 - АС ) int countValue // amount of data
a seconda del tipo di parametro, i buffer di ricezione vengono sostituiti automaticamente ai dati calcolati, organizzati come serie temporali per l'inizializzazione della classe.
-
... durante l'apertura di una nuova barra ...
La ricerca dei segnali verrà eseguita solo una volta dopo l'apertura di una nuova barra. Per fare questo, abbiamo deciso di determinare quel momento. Il metodo NewBar fa questo, non ha parametri di input e in una situazione in cui un tick ricevuto apre una nuova barra, restituisce true, altrimenti restituisce false.
-
... controlla i segnali da cinque dimensioni di trading;
Per ciascuna delle dimensioni di trading, ho avviato un metodo separato. I segnali della prima dimensione vengono controllati da FindSignal_1_dimension.
Chiamata dei parametri
int type // direction of the fractal for the search (0- to buy, 1 to sell) double &price_out[] // this array, after a successful search, will contain the fractal price datetime &time_out[] // in this array, after a successful search, will contain the time of the bar on which the fractal is found
L'analisi della seconda dimensione sarà effettuata con il metodo FindSignal_2_dimension. Chiamata dei parametri
int type // direction of the search (0-in the direction of to buy, 1-in the direction to sell) int sub_type // subtype of the search (0- signal of transferring the zero line, 1- sign "saucer") double &price_out[] // this array, after a successful search, will contain the signal price datetime &time_out[] // this array, after a successful search, will contain the time of the bar signal
L'analisi della terza dimensione viene effettuata utilizzando il metodo FindSignal_3_dimension con parametri di input/output:
int type // direction of the search (0-in the direction of to buy, 1-in the direction of to sell) int sub_type // subtype of the search (0- signal on two identical bars, 1- signal for "three identical bars) double &price_out[] // this array, after a successful search, will contain the signal price datetime &time_out[] // this array, after a successful search, will contain the time of the bar signal
L'elaborazione della quarta dimensione avviene con il metodo FindSignal_4_dimension, con parametri di input/output:
int type // direction of the search (0-in the direction to buy, 1-in the direction to sell) int sub_type // what we are looking for (0- signal from the zones, 1- tailing stop for five consecutive zones of one color) double &price_out[] // this array, after a successful search, will contain the signal price datetime &time_out[] // this array, after a successful search, will contain the time of the signal bar
La quinta dimensione è monitorata dalla dimensioneFindSignal_5_dimension. Parametri di questo metodo:
int type // direction of the search (0-in the direction to buy, 1-in the direction to sell) int sub_type // subtype of the search (0- signal for two bars, 1- signal for three bars) double &price_out[] // this array, after a successful search, will contain the signal price datetime &time_out[] // this array, after a successful search, will contain the time of the bar signal
L'intero controllo è unito dal metodo CheckSignal, non ha parametri di input e contiene:
- Copia dei dati dagli indicatori;
- Un controllo per la chiusura di una posizione (se utilizzata) per qualche linea dell'Alligatore;
- Reset dei segnali della barra precedente;
- Cerca frattali attivi in entrambe le direzioni;
- A seconda della disponibilità di una posizione, ricerca i segnali dalla seconda alla quinta dimensione, in direzione di una posizione aperta.
Questo metodo è dichiarato nella sezione pubblica, deve essere chiamato dall'EA.
- …con l'arrivo di un nuovo tick, verificare la possibilità di attivazione del segnale per l'apertura della posizione;
In questa classe è implementato il metodo CheckForTradeSignal che esegue la ricerca delle possibilità di inserimento di una posizione al prezzo corrente.
Chiamata dei parametri
int dimension // number of the dimension (from the first to the fifth) int type // direction of the trade (0- buy, 1- sell) int sub_type // signal subtype from the trading dimension (described in the signal search) double &price_out[] // signal price datetime &time_out[] // time of the signal bar
Se vengono seguite tutte le regole per l'attivazione di un segnale, allora restituisce true, altrimenti - false.
La verifica delle capacità di elaborazione di tutti i segnali è combinata con il metodo CheckActionOnTick, annunciato nella sezione public, deve essere chiamato dall'EA. Non ci sono parametri per la chiamata. Ogni segnale di successo viene memorizzato nell'oggetto actual_action, verranno successivamente elaborati nel metodo TradeActualSignals.
-
…calcolare il lotto; fisso o "piramidale"
Il metodo CalcLot è dichiarato nella sezione pubblica e può essere chiamato dall'EA. È destinato al calcolo del lotto e all'ulteriore modifica della variabile Lotto, dichiarata nella sezione privata della classe. Chiamata dei parametri
bool external // for the installation of the external calculated lot, you need to direct to this variable true, // then the lot will be set by the value ext_lot. // Inside this class (calculate the lot), the method is called with the parameter false. double ext_lot // external size of the lot int type // type of lot calculation //(0- starting lot (use the value that was transferred during the initialization of the class, //-1 turn over lot (the sum of the lot of the current position and the starting lot), // the values from 5 to 2 are used if the aggressive trading mode is turned on (meaning "pyramiding"). // In this mode: 5 – starting, multiply by 5, // 4 – starting, multiply by 4, // 3 – starting, multiply by 3, // 2 – starting, multiply by 2, // 1 - the filling lot is equal to the starting lot
Ora che abbiamo considerato il lotto fisso, parliamo di più del lotto "piramidale".
Lasciamo che il lotto iniziale sia uguale a 0,1. Ad esempio, aperto dal lotto di partenza per il segnale dal frattale, al di fuori delle mascelle dell'Alligatore, la posizione totale sarà di 0,1 lotti. Dopodiché, iniziamo ad analizzare i segnali in arrivo dalla seconda alle quinta dimensione. Non appena viene attivato il segnale, riempi la posizione aperta di 0,5 lotti (per iniziare, moltiplicato per 5) e ottieni il volume totale della posizione pari a 0,6 lotti. Durante il segnale successivo nella direzione della posizione aperta, riempire di 0,4 lotti e la posizione totale sarà pari a 1,0 lotti.
Il prossimo segnale nella direzione della posizione ci darà altri 0,3 lotti e il suo volume sarà di 1,3 lotti. Il quinto riempimento verrà effettuato per 0,2 lotti e il volume totale della posizione diventerà 1,5 lotti. I successivi riempimenti nella direzione della posizione avverranno solo per 0,1 lotti.
Questo algoritmo di gestione del denaro (ММ) è stato descritto da B. Williams nel Trading Chaos . La possibilità di installazione di un lotto di utenza ci permette di attuare praticamente qualsiasi gestione del capitale.
Per una corretta determinazione della sequenza degli ordini in un deal, utilizzo vari numeri Magici.
Numero | Descrizione dell'ordine |
---|---|
999 | Ordine turn over |
1000 | Ordine di partenza |
1001 | Ordine di riempimento (a partire da Х 1) |
1002 | Ordine di riempimento (a partire da Х 2) |
1003 | Ordine di riempimento (a partire da Х 3) |
1004 | Ordine di riempimento (a partire da Х 4) |
1005 | Ordine di riempimento (a partire da Х 5) |
La classe ha calcolato il numero necessario (usando il metodo CalcMagic), che successivamente identificherà l'operazione di trading sul server prima dell'invio di un nuovo ordine.
-
…Consentono di modificare il lotto dall'EA, direttamente per ogni tipo di segnale.
Se lo desideri, puoi implementare nell'EA una query della struttura current_action, in cui i segnali di trading vengono archiviati sotto forma di variabili bool. Ad ogni tipo e direzione corrisponde una variabile. Se abbiamo un valore true, allora per questo tick la classe proverà a produrre un'operazione di trading dal segnale di trading specificato, dopodiché il lotto per questo segnale può essere modificato. Per ogni tick della variazione di prezzo, la classe invia un solo ordine per la posizione aperta o per il riempimento.
L'impostazione di un lotto è possibile nell'EA dopo la chiamata del metodo CheckActionOnTick e prima della chiamata di TradeActualSignals. Poiché sul tick corrente possono essere presenti più segnali, in attesa dell’ esecuzione, ne verrà selezionato solo uno.
La sequenza di esecuzione del segnale:
- Chiusura della posizione;
- Esecuzione di uno dei segnali dal frattale (apertura, riempimento, capovolgimento della posizione);
- Il segnale "Saucer";
- Il segnale "Zero line crossover";
- AC "due barre dello stesso colore";
- AC "tre barre dello stesso colore";
- Trading nelle zone;
- La linea Balance (segnale a 2 barre);
- La linea Balance (segnale 3 barre);
È quindi necessario considerare questa sequenza durante l'installazione della dimensione del lotto "utente".
-
... Trailing stop della posizione aperta. Se necessario, modifica il prezzo dello Stop Loss, calcolato dall'utente dall'EA.
Nella classe descritta, c’è il mantenimento dello stop price alla posizione, con il metodo Trailing Stop, cioè il pull up dello Stop Loss, solo nella direzione di aumentare i profitti sulla posizione per il triggering a questo prezzo. Esistono cinque modelli di mantenimento:
- Dalla linea Alligator's Lips;
- Dalla linea Alligator's Teeth;
- Dalla linea Alligator's Jaws;
- Da cinque zone consecutive dello stesso colore (zone verdi per acquistare, rosse per vendere);
- Configurazione esterna dello stop price.
La quinta opzione dell'installazione di uno Stop Loss è implementata dal metodo SetStopLoss, con un unico parametro double & stoploss. La chiamata deve essere effettuata dall'EA e prima del metodo di esecuzione TrailingStop che verifica i prezzi per la modifica della posizione e invia la richiesta al server. Dopo una corretta esecuzione di questa procedura, il valore della variabile interna StopLoss viene reimpostato a -1.
-
...Controlla l'invio dell'ordine di apertura al server e, se non va a buon fine, effettua una seconda richiesta.
Per l'invio di un ordine di trading per l'apertura, la chiusura o il capovolgimento di una posizione, viene utilizzato il metodo boolSendOrder. I parametri di chiamata:
ENUM_ORDER_TYPE type // direction of the trading operation double &price_out[] // pointer to the signal price, after a successful execution of the operation, set in -1; datetime &time_out[] // the pointer to the signal time, after a successful execution of the operation, set in -1; string comment // the commentary for the order
Il test di tutti i segnali di trading è combinato con il metodo TradeActualSignals. La struttura current_action memorizza gli ordini di trading. Dopo aver inviato con successo l'ordine al server (SendOrder restituisce true), resetta il segnale di trading nella struttura current_action. Il segnale di trading sarà attivo fino a quando non avremo una risposta positiva all'invio.
C'è anche una funzione nella struttura current_action init, senza parametri, che resetta tutti i segnali attuali. Questa procedura viene utilizzata quando si apre una nuova posizione o si verifica un ribaltamento nella posizione esistente.
-
...Proibisce la duplicazione dei segnali di trading (inserire una sola volta per ogni segnale);
La struttura last_trade memorizza l'ora dell'ultimo segnale di trading per ogni tipo e direzione. Prima di impostare un ordine di trading nella struttura current_action, controlla se questo segnale è già scambiato nella struttura last_trade e, in tal caso, ignoralo. Pertanto, ciò fornisce l'implementazione del controllo dell'esecuzione "usa e getta" di una situazione di trading.
-
Ridurre al minimo il numero di metodi della classe pubblica.
Ecco un elenco di metodi di classe disponibili chiamando dall'EA:
void C_TS_BW(); // Constructor bool Init(string Symbol_for_trade, ENUM_TIMEFRAMES Period_for_trade, s_input_parametrs &inp_param_tmp); // Initialization of the class bool NewBar(); // Check for a new bar on the current symbol\time-frame void CheckSignal(); // Search for signals void CheckActionOnTick(); // Collecting the desired actions on the current tick void TrailingStop(); // Trailing Stop void TradeActualSignals(); // Trading by the current signals void SetStopLoss(double &stoploss); // Set Stop Loss void CalcLot(bool external,double ext_lot,int type); // Calculation of the lot
Sono inoltre disponibili le strutture:
actual_action // Current trading orders for execution inp_param_tmp; // Reception of the structure of settings // (receives the data by the link during the initialization of the class)
4. L'implementazione dell'EA, utilizzando la classe C_TS_BW
La prima cosa da fare è includere il file h_TS_BW.mqh nell'Expert Advisor.
#include <h_TS_BW.mqh>
Dopodiché, dichiara l'oggetto della classe C_TS_BW. Lasciamo che questo sia l'EA_TS_BW.
Avrai anche bisogno della struttura dei parametri regolabili come s_input_parametrs, ad esempio input_parametrs.
Ecco una descrizione dei parametri, integrati in questa struttura:
input_parametrs.alligator_jaw_period // The Alligator: period of the Jaws line input_parametrs.alligator_jaw_shift // The Alligatpr: shift of the Jaws line input_parametrs.alligator_teeth_period // Alligator: period of the Teeth line input_parametrs.alligator_teeth_shift // Alligator: shift of the Teeth line input_parametrs.alligator_lips_period // Alligator: period of the Lips line input_parametrs.alligator_lips_shift // Alligator: shift of the Lips line input_parametrs.add_1_dimension // Allow the addition by Fractals input_parametrs.add_2_dimension_bludce // Allow the addition by the "Saucer" (АО) signal input_parametrs.add_2_dimension_cross_zero // Allow the addition by the "Crossing the zero line" (АО) signal input_parametrs.add_3_dimension_use_2_bars // Allow the addition by the "АС 2 bars" signal input_parametrs.add_3_dimension_use_3_bars // Allow the addition by the "АС 3 bars" signal input_parametrs.add_4_dimension_zone // Allow the addition by the red or the green zone input_parametrs.add_5_dimension // Allow the addition by the Balance Line input_parametrs.max_4_dimension_zone // The maximum amount of consecutive bars of zones of the same color input_parametrs.trall_4_dimension // Allow a trail position using 5 consecutive bars of zones of the same color input_parametrs.agress_trade_mm // Aggressive style of filling in an open position input_parametrs.support_position // Type of trailing stop of the position input_parametrs.lot // Trading lot
Nella sezione OnInit() dell'EA, devi:
- Compilare tutti i valori richiesti della struttura input_parametrs con i dati che verranno poi passati alla classe.
- Usare il metodo Init della classe, eseguire la sua inizializzazione. Esempio:
expert_TS_BW.Init(Symbol(),PERIOD_CURRENT,input_parametrs)
In questo caso, l'EA funzionerà sul simbolo/periodo corrente in cui è installato.
Esempio della sezione OnTick() di Expert Advisor:
// double Sl[1]; if(expert_TS_BW.NewBar()) // new bar on the chart { expert_TS_BW.CheckSignal(); // signal search } expert_TS_BW.CheckActionOnTick(); // check for the required actions on the current tick //---******************* the place of the beginning of external control of the lot, the stop //--- example of setting the lot for trade by the signal from the zones // if(expert_TS_BW.actual_action.zone_buy || expert_TS_BW.actual_action.zone_sell) // {expert_TS_BW.CalcLot(true,0.11,0);} //--- setting the stop by the parabolic // CopyBuffer(h_parabolic,0,0,1,Sl); // if (Sl[0]>0){expert_TS_BW.SetStopLoss(Sl[0]);} //---*******************the place of the end of external control of the lot, the stop expert_TS_BW.TrailingStop(); // pulling-up the stop (if necessary) expert_TS_BW.TradeActualSignals(); // trading of current signals
In questo caso, vengono commentati gli esempi di controllo esterno del prezzo di stop e del lotto di negoziazione, per l'esecuzione della classe.
5. Alcuni test sulla cronologia
L'autore del libro, in base al quale è stato scritto l'EA, sostiene che questo sistema si concentra sulle azioni e sui mercati delle materie prime.
Innanzitutto, controlliamo l'Expert Advisor sul CFD. Supponiamo che il poligono di prova faccia parte della cronologia di IBM. Il sistema è rivolto ai segmenti di tendenza delle quotazioni. Ho preso il primo segmento disponibile, sul quale si può vedere una tendenza ad occhio nudo.
Figura 6. Grafico IBM
Esegui l'Expert Advisor scritto su questo segmento ed ecco cosa otteniamo come ordini.
Figura 7. I segnali di trading di Bill Williams (IBM)
A prima vista, ci sono molti trade in base alla tendenza, che è positivo. Ecco il grafico, creato dallo Strategy Tester.
L'operazione è stata effettuata su 0,1 lotti, senza chiusura per le linee Alligator, senza trailing stop utilizzando le cinque zone consecutive di un colore e senza trading aggressivo (piramide).
Figura 8. Risultati del test
In generale, abbiamo ottenuto un profitto.
Ora prendiamo una tendenza protratta con una minore inclinazione.
Figura 9. GraficoIBM (frammento 2)
Lasciamo che questo sia lo stesso simbolo e periodo di 13 mesi (dal 12.2008.1 al 01. 2010)
Ecco un grafico dello Strategy Tester:
Figura 10. I risultati del test del sistema sulla cronologia (frammento 2)
Diciamo solo che è "non soddisfacente" o "non ha soddisfatto le nostre aspettative".
Poi, vorrei controllare il lavoro sulle coppie di valute.
Prendiamo la nota coppia EURUSD e il periodo H1 del grafico. La profondità della storia è l'anno del 2010.
Figura 11. I risultati del test del sistema sulla cronologia, EURUSD, H1, 2010
Proviamolo sulle barre giornaliere di EURUSD per lo stesso anno (2010).
Il rapporto del tester si presenta così:
Figura 12. I risultati del test del sistema sulla cronologia, EURUSD, D1, 2010
Conclusione
Lo scopo di questo articolo era quello di verificare l'andamento di una delle ben note strategie commerciali di Bill Williams, non solo sui mercati azionari e delle borse delle materie prime, ma anche sul mercato Forex. Il sistema funziona "più o meno" sui grafici giornalieri EURUSD dell'anno passato, ma non porta alcun profitto sui timeframe più piccoli, senza tentativi di ottimizzazione.
I segnali di ingresso di mercato del sistema sono abbastanza precisi (se guardiamo i grafici giornalieri), ma le uscite sono chiaramente ritardate, poiché più della metà del profitto non è fissa. Questo campo serve per affinare un dato sistema in termini di ottimizzazione per timeframe più piccoli.
Il codice completo della classe si trova nel file allegato.
Tradotto dal russo da MetaQuotes Ltd.
Articolo originale: https://www.mql5.com/ru/articles/139
![Sistemi di Trading Adattivi e loro utilizzo nel Client MetaTrader 5](https://c.mql5.com/2/0/Adaptive_Expert_Advisor_MQL5__2.png)
![Valutazione dei Sistemi di Trading - l'Efficacia dell'Entrata, dell'Uscita e dei Trade in Generale](https://c.mql5.com/2/0/Measure_Trade_Efficiency_MQL5.png)
![Guida al Test all'Ottimizzazione degli Expert Advisor in MQL5](https://c.mql5.com/2/0/Testing_Optimization_Guide_MQL5__1.png)
![Diversi Modi per Trovare una Trend in MQL5](https://c.mql5.com/2/0/Determine_Trend_MQL5.png)
![MQL5 - Linguaggio delle strategie di trading integrato nel client terminal MetaTrader 5](https://c.mql5.com/i/registerlandings/logo-2.png)
- 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