Expert Advisor basato sulle "New Trading Dimensions" di Bill Williams

Alexey Klenov | 9 dicembre, 2021


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:


1. Indicatori

Alla base del sistema di trading ci sono segnali da 4 indicatori:

  1. Alligator;
  2. Frattali;
  3. The Awesome Oscillator;
  4. Accelerazione/Decelerazione.

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.

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.

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

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

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

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

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

Figura 5. Un esempio di segnali di trading di quinta dimensione


3. La classe C_TS_BW

3.1. Scopo della classe: 3.2. L'implementazione della classe C_TS_BW

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

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.

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.

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.

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.

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:

Questo metodo è dichiarato nella sezione pubblica, deve essere chiamato dall'EA.

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.

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.

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:

È quindi necessario considerare questa sequenza durante l'installazione della dimensione del lotto "utente".

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:

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.

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.

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.

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:

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

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)

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

Figura 8. Risultati del test

In generale, abbiamo ottenuto un profitto.

Ora prendiamo una tendenza protratta con una minore inclinazione.

Figura 9. Grafico IBM (frammento 2)

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 sullo storico (frammento 2)

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 sullo storico, EURUSD, H1, 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

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.