English Русский 中文 Español Deutsch 日本語 Português 한국어 Français Türkçe
Strategie d'Ordine. Expert Advisor Multiuso

Strategie d'Ordine. Expert Advisor Multiuso

MetaTrader 5Trading | 9 dicembre 2021, 14:57
515 0
Dmitry Fedoseev
Dmitry Fedoseev

 

Introduzione

L'elemento chiave iniziale di qualsiasi strategia di trading è l'analisi dei prezzi e l'analisi degli indicatori tecnici che costituiscono la base per l'apertura di una posizione. La chiameremo analisi di mercato, cioè tutto ciò che accade nel mercato ed è al di fuori del nostro controllo.

Inoltre, le strategie possono richiedere un altro tipo di analisi. La chiameremo analisi della situazione di trading attuale. Comprende l'analisi dello stato della posizione di trading e l'analisi di eventuali ordini in sospeso disponibili/mancanti (se presenti in una strategia). I risultati di tale analisi ci portano a decidere se determinate azioni con posizioni o ordini devono essere eseguite, ad esempio chiusura, spostamento di Stop Loss, inserimento o eliminazione di ordini in sospeso, ecc. In altre parole, tale analisi include lo studio della nostra attività di mercato, le azioni in base alla situazione che noi (o un Expert Advisor) abbiamo creato e le regole della strategia in uso.

Un Trailing Stop comunemente noto può essere considerato in una certa misura il secondo tipo di elemento in una strategia di trading. Considera la seguente analisi: se c'è una posizione aperta con il profitto superiore al valore impostato, mentre lo Stop Loss non è impostato o è più lontano della distanza dal prezzo corrente come specificato nelle impostazioni, lo Stop Loss verrà spostato.

Trailing Stop è una funzione abbastanza semplice per essere di particolare interesse. Inoltre, può essere classificato come una categoria totalmente diversa di elementi di strategia di trading, essendo una funzione di gestione della posizione. Pertanto, una strategia di trading può essere composta da tre categorie di elementi:

  1. Analisi di mercato e azioni basate su di essa.

  2. Analisi della situazione di trading e azioni basate su di essa.

  3. Gestione della posizione.

Questo articolo è incentrato sulle strategie che utilizzano attivamente gli ordini in sospeso (le chiameremo in breve strategie sugli ordini), un metalinguaggio che può essere creato per descrivere tali strategie e lo sviluppo e l'uso di uno strumento multiuso (Expert Advisor) il cui funzionamento si basa su quelle descrizioni.

 

Esempi di Strategie d'Ordine

Il trading normalmente inizia con l'apertura di una posizione iniziale. Ciò può avvenire in diversi modi:

  1. Apertura di una posizione di mercato:

    • Nella direzione suggerita dagli indicatori.

    • Nella direzione selezionata dall'utente nella finestra delle proprietà dell’Expert Advisor.

    • In base ai risultati della chiusura dell'ultima posizione. Tale posizione, anziché essere una posizione iniziale, può essere una fase operativa intermedia.

  2. Due ordini Stop opposti. Quando uno degli ordini si attiva, il secondo ordine viene eliminato.

  3. Due ordini Limit opposti. Quando uno degli ordini si attiva, il secondo ordine viene eliminato.

  4. Ordine limite e ordine Stop piazzati nella stessa direzione. In questo caso, è necessario decidere sulla direzione degli ordini, come in 1.

Una volta aperta la posizione iniziale, puoi utilizzare diverse strategie di ordine.

Ridimensionamento nell'Uso degli Ordini Limit (Fig. 1.)

Apri una posizione iniziale e imposti uno o più ordini Limit nella stessa direzione con l'aumento della dimensione del lotto. Quando si attivano gli ordini Limit, vengono impostati nuovi ordini Limit fino alla chiusura della posizione al Take Profit. Quando la posizione viene chiusa a Take Profit, gli ordini in sospeso rimanenti vengono eliminati.

Fig. 1. Ridimensionamento nell'Uso degli Ordini Limit
Fig. 1. Ridimensionamento nell'Uso degli Ordini Limit

Stop e Reverse (Fig. 2.)

Si apre una posizione iniziale e si imposta l'ordine Stop opposto con una dimensione del lotto maggiore al livello di Stop Loss della posizione iniziale. Quando la posizione viene chiusa allo Stop Loss, l'ordine in sospeso avvia un nuovo ordine Stop opposto che viene nuovamente impostato al suo livello di Stop Loss, e così via fino a quando la posizione non viene chiusa al Take Profit. Quando la posizione viene chiusa a Take Profit, l'ordine in sospeso rimanente viene eliminato.

Fig. 2. Stop e Reverse
Fig. 2. Stop e Reverse

Piramide (Fig. 3.)

Apri una posizione iniziale e se sembra essere vincente, ne aumenti il volume (ridimensionamento) e sposti lo Stop Loss su Breakeven. Se la posizione viene chiusa a Take Profit, si prevede che a quel punto avrà raggiunto un volume piuttosto elevato e, di conseguenza, un profitto. Se invece lo Stop Loss scatta durante la fase intermedia, semplicemente non ci sarà profitto.

 Fig. 3. Piramide
Fig. 3. Piramide

Riapertura (Fig. 4.)

Apri una posizione di mercato. La chiusura allo Stop Loss è seguita da una nuova apertura con un lotto maggiorato, e così via fino alla chiusura della posizione al Take Profit. Questa strategia è simile al ridimensionamento nell'utilizzo degli ordini Limit.

titleFig. 4. RiaperturatitlealtFig. 4. Riaperturaalt
Fig. 4. Riapertura

È abbastanza possibile combinare tutte le strategie di descritte sopra. Se una posizione sembra vincente, la piramide è utile; in caso contrario, se sono in corso delle perdite, potrebbe essere opportuno ridimensionare utilizzando ordini Limit. Detto questo, il ridimensionamento nell'utilizzo degli ordini Limit non deve essere continuo. Ad esempio, puoi prima ridimensionare di tre volte, quindi eseguire diversi Stop e Reverse e passare al ridimensionamento utilizzando nuovamente gli ordini Limit, ecc.

In pratica, lo sviluppo di strategie di ordine può richiedere molto tempo non solo a causa della portata della codifica richiesta, ma anche a causa della necessità di utilizzare il pensiero creativo in ogni singolo caso. Cerchiamo di facilitare la programmazione di tali strategie creando un Expert Advisor multiuso che ci permetta di implementare qualsiasi strategia di ordine.

 

Principi di Base

Il principio di base dello sviluppo della strategia dell'ordine è l'identificazione della fase operativa della strategia corrente e l'esecuzione delle azioni in base in tale fase.

Diamo un'occhiata al seguente esempio: dobbiamo aprire una posizione di mercato, diciamo, questa sarà una posizione di acquisto. Una volta aperta la posizione, è necessario impostare due ordini in sospeso: un ordine Stop superiore e un ordine Limite inferiore. All'inizio, non c'è posizione o ordine nel mercato, quindi identifichiamo la fase come la fase operativa iniziale in cui dobbiamo aprire una posizione. L'esistenza di una posizione di mercato farebbe pensare che questa sia la prossima fase operativa. Quindi, le fasi che possono essere individuate sono le seguenti:

  1. Non esistono posizioni o ordini. Occorre aprire una posizione.

  2. C'è una posizione ma nessun ordine è impostato. È richiesto un ordine Stop.

  3. C'è una posizione e un ordine Stop. È richiesto un ordine Limit.

Il lavoro in linea con queste regole sarà implementato in modo affidabile, tuttavia richiederà tre tick: il primo tick per identificare la mancanza della posizione e l'apertura della posizione, il tick successivo per identificare la posizione e la mancanza di ordini e il terzo tick per identificare la posizione e un ordine. La strategia richiede che tutte e tre le azioni vengano eseguite in una sola volta.

Dovremmo, quindi, cercare di eseguire tutte le azioni contemporaneamente: se non vi sono posizioni o ordini, dovremmo aprire una posizione. Se la posizione è stata aperta con successo, dovremmo inviare una richiesta per impostare un ordine Stop e un'altra richiesta per impostare un ordine Limit. Può darsi che nessuna delle richieste inviate per impostare un ordine in sospeso venga accettata (a causa di problemi di connettività, mancanza di informazioni sui prezzi, ecc.) ma la situazione di trading è passata a un'altra fase in cui abbiamo una posizione aperta. Ciò significa che tutte le possibili fasi intermedie dovrebbero essere coperte:

  1. Non vi sono posizioni. Occorre aprire una posizione. Se la posizione è stata aperta con successo, devono essere inviate le richieste di ordine Stop e ordine Limit.

  2. C'è una posizione ma non c'è nessun ordine in sospeso. Le richieste per l'ordine Stop e l'ordine Limit devono essere inviate.

  3. C'è una posizione e un ordine Stop ma manca l'ordine Limit. Dovrebbe essere inviata una richiesta per un ordine Limit.

  4. C'è una posizione e un ordine Limit ma manca l'ordine Stop. Deve essere inviata una richiesta per un ordine Stop.

Si noti che per identificare la fase nell'esempio fornito, la situazione di trading deve corrispondere completamente alle regole di identificazione fornite. Ci dovrebbero essere determinati set di ordini: solo una posizione e nessun ordine o una posizione e uno degli ordini - non ci può essere altro modo. La descrizione delle fasi operative della strategia che seguono questo principio può diventare molto lunga e rendere l'intero processo molto dispendioso in termini di tempo a causa della necessità di tenere conto di tutte le possibili opzioni che alla fine possono rivelarsi irrealizzabili. Le regole di funzionamento per l'esempio precedente possono essere stabilite in un modo leggermente diverso:

  1. Non ci sono posizioni. Occorre aprire una posizione. Se la posizione viene aperta con successo, devono essere inviate le richieste per un ordine Stop e un ordine Limit.

  2. C'è una posizione. In questo caso, dovrebbero esserci due ordini in sospeso sul mercato. Controlla se c'è un ordine Stop nel mercato e impostalo se manca. Controlla se c'è un ordine Limite nel mercato e impostalo se manca.

In questo caso, abbiamo un set minimo di regole per l'identificazione della fase operativa e una descrizione completa di una situazione di trading in cui dovremmo essere in quella fase.

L'applicazione di tale principio richiederà l'identificazione della posizione stessa al fine di distinguere se si tratta della posizione iniziale o se è già scattato un determinato ordine. In queste circostanze, non sarà necessario tentare di effettuare il secondo ordine poiché il sistema è nella nuova fase operativa. Sarà richiesta anche l'identificazione degli ordini, ma daremo un'occhiata alla posizione e all'identificazione dell'ordine più avanti. Stabiliamo ora il principio base per descrivere le strategie d'ordine in modo più chiaro e compatto:

  1. Abbiamo bisogno di un metodo per l'identificazione della fase operativa corrente con il minor numero possibile di informazioni.

  2. Ogni fase operativa deve avere una descrizione completa della situazione corrispondente a quella fase.

  3. Se in una determinata fase sono necessarie azioni di mercato (apertura, chiusura, scalabilità in entrata, scalabilità in uscita, ecc.) o ordini in sospeso, tale fase deve essere suddivisa in due sottofasi: prima dell'andamento dell'azione di mercato e dopo (in modo da consentirci di eseguire tutte le azioni in una volta sola e ripetere i tentativi di ordine in sospeso falliti).

  4. Se in una determinata fase sono richieste azioni di mercato (apertura, chiusura, scalabilità in entrata, scalabilità indietro, ecc.) o ordini in sospeso, gli ordini in sospeso devono essere evasi dopo il completamento positivo dell'azione di mercato.

  5. Una fase può corrispondere solo a un'azione di mercato e a qualsiasi numero di azioni con ordini in sospeso.

 

Identificazione dell'Ordine e della Posizione

Le posizioni e gli ordini possono essere identificati in diversi modi: utilizzando il commento dell'ordine, il numero magico o le variabili globali. Usiamo i commenti. I problemi principali derivanti dall'uso dei commenti sono la dimensione limitata dei commenti e il fatto che il broker possa aggiungere al commento qualcosa di suo. Se non c'è abbastanza spazio per l'inserimento da parte del broker, una parte del commento verrà tagliata.

Dovresti quindi occupare il minor spazio possibile nel commento e cercare di trovare un modo per separarlo dai possibili inserimenti del broker. Ogni ordine necessita di un solo identificatore. In pratica può essere 1 o 2 cifre o una combinazione di una lettera e una o due cifre. Alla fine dell'identificatore metteremo un segno, diciamo, "=" (non si è mai notato che fosse usato dai broker nelle loro voci). Quindi abbiamo un massimo di 4 caratteri. Per ottenere l'identificatore da un commento, possiamo utilizzare la seguente funzione:

//+------------------------------------------------------------------+
//|   Function for obtaining the identifier from the aComment string |
//+------------------------------------------------------------------+
string GetID(string aComment)
  {
   int    p =StringFind(aComment,"=",0); // Determine the position of the separator
   string id=StringSubstr(aComment,0,p); // Get the substring located before the separator
   return(id);
  }
//+------------------------------------------------------------------+

Se la posizione o l'ordine devono essere verificati rispetto a qualsiasi identificatore noto, è possibile farlo come segue:

//+------------------------------------------------------------------+
//|   Checking the comment against the set identifier                |
//+------------------------------------------------------------------+
bool FitsID(string aID,string aComment)
  {
   return(StringFind(aComment,aID+"=",0)==0);
  }
//+------------------------------------------------------------------+

 

Metalinguaggio per la Descrizione delle Strategie dell’Ordine

Definiamo ora il linguaggio da utilizzare per impostare le strategie dell’ordine. Dovrebbe essere conciso, chiaro e intuitivo e allo stesso tempo essere in linea con la MQL5 per garantire una rapida esecuzione dei suoi comandi senza calcoli inutili. Lascio ai lettori la decisione se il risultato è stato positivo o meno.

La descrizione della strategia viene fatta in un file di testo che viene poi collegato all'Expert Advisor specificandone il nome nella finestra delle proprietà dell'Expert Advisor.

Una riga del file corrisponde ad una fase operativa del sistema. La riga è divisa in due campi. Il primo campo contiene le regole di identificazione della fase. Il secondo riguarda l'elenco delle azioni. I campi sono separati dalla linea verticale "|". Le regole di identificazione e le voci dell'elenco delle azioni sono indicate, separate da un punto e virgola ";".

Oltre ai comandi, la parte destra di ogni riga può contenere un commento separato dal resto del testo ad es da "#":

Nothing | Buy(M1,1,0,0) #If there is no position or order in the market, open a Buy position, mark it with "М1", lot 1, no Stop Loss, no Take Profit.

 

Identificazione della Fase

L'identificazione della fase può richiedere informazioni sull'attuale posizione di mercato, sugli ordini in sospeso o sull'ultima operazione. Oltre allo stato della posizione, potrebbero essere richiesti alcuni dettagli della posizione, come prezzo, profitto, valore di Stop Loss, se impostato, ecc. Le informazioni richieste sull'ultima operazione possono includere i risultati dell'operazione. Per gli ordini in sospeso potrebbe essere necessario specificare il loro prezzo di apertura, Stop Loss, Take Profit (che molto probabilmente sarà richiesto in fase di esecuzione).

Queste informazioni possono essere ottenute utilizzando i comandi di accesso ai dati di trading. La maggior parte di questi comandi avrà due parametri: identificatore di posizione o ordine e identificatore del parametro. Se l'identificatore del parametro non è specificato, sarà soggetta a controllo solo l'esistenza dell'oggetto di trading specificato dal comando e dall'identificatore.

Ad esempio, il comando Buy(M1) suggerisce che deve esserci una posizione di mercato con l'identificatore "M1". Il solo comando Buy() (o semplicemente Buy senza le parentesi) significa che deve esserci una posizione Buy con qualsiasi identificatore. Se specifichi l'identificatore del parametro, indicherà il valore del parametro, ad es. Buy(M1,StopLossInPoints) - Valore Stop Loss in punti impostato per una posizione Buy con l'identificatore "M1". Se non viene specificato alcun identificatore - Buy(,StopLossInPoints), lo consideriamo uno Stop Loss di una posizione Buy con qualsiasi identificatore (purché vi sia una posizione Buy).

Il valore ottenuto può essere utilizzato nell'espressione per verificare le condizioni, ad esempio Buy(M1,StopLossInPoints)>=0 - la posizione è in pareggio. Se non c'è una posizione o c'è una posizione con un identificatore diverso, la fase così espressa nelle regole di identificazione non sarà identificata, cioè non c'è bisogno di tenere conto di due condizioni: controllare lo stato della posizione e il valore di Stop Loss. In questo caso, però, sarà necessario verificare preventivamente l'esistenza dello Stop Loss - Buy(M1,StopLossExists); Buy(M1,StopLossInPoints)>=0.

Quando si controllano i valori, è possibile utilizzare qualsiasi espressione di confronto: ">=", "<=", "==", "!=", ">", "<". Il valore nella parte destra del confronto può essere espresso come un numero o essere rappresentato da variabili speciali: Var1, Var2 ... Var20. "p" aggiunto a un numero o a una variabile suggerirà che il valore verrà ulteriormente moltiplicato per il valore in punti (la variabile _Pointvariable).

In alternativa, potrebbe esserci un'espressione aritmetica più complessa nella parte destra dell'espressione di confronto. Può essere come segue: X1*X2+X3*X4 ("+" può essere sicuramente sostituito con "-"), dove X1, X2, X3 e X4 possono essere numeri, variabili o comandi di accesso ai dati. L'esempio seguente può essere teoricamente considerato corretto (se ignoriamo il suo valore pratico):

-BuyStop(BS1,StopLossInPoints)*-SellLimit(SL1,StopLossInPoints)+-SellStop(SS1,StopLossInPoints)*-BuyLimit(SL1,StopLossInPoints)

La tabella 1 mostra l'elenco di tutti i comandi di accesso.

Tabella 1 Comandi di accesso ai dati

Indice Comando Parametri possibili Scopo
0 Nothing Nessun parametro Non ci sono posizioni o ordini in sospeso sul mercato
1 NoPos Nessun parametro Non ci sono posizioni sul mercato
2 Pending Identificatore dell'oggetto, identificatore del parametro dell'ordine Qualsiasi ordine in sospeso con l'identificatore dell'oggetto specificato. Se l'identificatore dell'oggetto non è specificato, allora qualsiasi ordine in sospeso indipendentemente dal valore dell'identificatore dell'oggetto
3 Buy Identificatore dell'oggetto, identificatore del parametro di posizione Una posizione Buy con l'identificatore dell'oggetto specificato. Se l'identificatore dell'oggetto non è specificato, allora solo una posizione Buy
4 Sell Identificatore dell'oggetto, identificatore del parametro di posizione Una posizione Sell con l'identificatore dell'oggetto specificato. Se l'identificatore dell'oggetto non è specificato, allora solo una posizione Sell
5 BuyStop Identificatore dell'oggetto, identificatore del parametro dell'ordine Un ordine BuyStop con l'identificatore dell'oggetto specificato. Se l'identificatore dell'oggetto non è specificato, allora solo un ordine BuyStop
6 SellStop Identificatore dell'oggetto, identificatore del parametro dell'ordine Un ordine SellStop con l'identificatore dell'oggetto specificato. Se l'oggetto identificato non è specificato, allora solo un ordine SellStop
7 BuyLimit Identificatore dell'oggetto, identificatore del parametro dell'ordine Un ordine BuyLimit con l'identificatore dell'oggetto specificato. Se l'identificatore dell'oggetto non è specificato, allora solo un ordine BuyLimit
8 SelLimit Identificatore dell'oggetto, identificatore del parametro dell'ordine Un ordine SellLimit con l'identificatore dell'oggetto specificato. Se l'identificatore dell'oggetto non è specificato, allora solo un ordine SellLimit
9 BuyStopLimit Identificatore dell'oggetto, identificatore del parametro dell'ordine Un ordine BuyStopLimit con l'identificatore dell'oggetto specificato. Se l'identificatore dell'oggetto non è specificato, allora solo un ordine BuyStopLimit
10 SellStopLimit Identificatore dell'oggetto, identificatore del parametro dell'ordine Un ordine SellStopLimit con l'identificatore dell'oggetto specificato. Se l'identificatore dell'oggetto non è specificato, allora solo un ordine SellStopLimit
11 LastDeal Vuoto, identificatore del parametro di trading L'ultimo trade
12 LastDealBuy Vuoto, identificatore del parametro di trading L'ultimo trade è il Buy trade
13 LastDealSell Vuoto, identificatore del parametro di trading L'ultimo trade è il Sell trade
14 NoLastDeal Nessun parametro Non ci sono dati sull’operazione nella cronologia; ciò è necessario nel caso in cui l'Expert Advisor abbia appena iniziato ad operare sull’account
15 SignalOpenBuy Nessun parametro Segnale dell’indicatore per aprire una posizione Buy
16 SignalOpenSell Nessun parametro Segnale dell’indicatore per aprire una posizione Sell
17 SignalCloseBuy Nessun parametro Segnale dell’indicatore per chiudere una posizione Buy
18 SignalCloseSell Nessun parametro Segnale dell’indicatore per chiudere una posizione Sell
19 UserBuy Nessun parametro Comando dell’utente per acquistare
20 UserSell Nessun parametro Comando dell’utente per vendere
21 Bid Nessun parametro Prezzo Bid
22 Ask Nessun parametro Prezzo Ask
23 ThisOpenPrice Nessun parametro Prezzo di apertura dell'ordine il cui parametro viene calcolato. Viene utilizzato nei comandi di azione per gli ordini in sospeso, ad eccezione degli ordini di tipo StopLimit
24 ThisOpenPrice1 Nessun parametro Prezzo di apertura-1 dell'ordine di cui viene calcolato il parametro. Viene utilizzato nei comandi di azione per gli ordini in sospeso del tipo StopLimit
25 ThisOpenPrice2 Nessun parametro Prezzo di apertura-2 dell'ordine di cui viene calcolato il parametro. Viene utilizzato nei comandi di azione per gli ordini in sospeso del tipo StopLimit
26 LastEADeal Identificatore dell'oggetto, identificatore del parametro di trading L'ultima operazione eseguita dall'Expert Advisor. L'ultima operazione che ha "=" nel suo commento viene cercato nella cronologia e, quindi, confrontato con l'identificatore dell'oggetto
27 LastEADealBuy Identificatore dell'oggetto, identificatore del parametro di trading L'ultima operazione eseguita dall'Expert Advisor è l'operazione di acquisto. L'ultimo commercio che ha "=" nel suo commento viene cercato nella cronologia e, quindi, confrontato con l'identificatore dell'oggetto e la direzione dell’operazione.
28 LastEADealSell Identificatore dell'oggetto, identificatore del parametro dell’operazione L'ultima operazione eseguita dall'Expert Advisor è l'operazione di vendita. L'ultimo commercio che ha "=" nel suo commento viene cercato nella cronologia e, quindi, confrontato con l'identificatore dell'oggetto e la direzione dell’operazione.
29 NoTradeOnBar Nessun parametro Non ci sono operazioni sull'ultima barra

 

I comandi riportati nella Tabella 1 consentono di accedere ai seguenti tipi di oggetti di trading: posizioni, ordini, operazioni e ordini da impostare. Oggetti diversi hanno set di parametri diversi.

La tabella 2 presenta tutti gli identificatori dei parametri insieme ai tipi di oggetti a cui possono essere applicati.

Tabella 2. Identificatori di accesso ai dati.

Indice Identificatore Scopo Tipo di oggetto di trading
0 ProfitInPoints Guadagno in punti Posizione
1 ProfitInValute Profitto nella valuta di deposito Posizioni, operazioni
2 OpenPrice Prezzo di apertura Posizioni, ordini in sospeso (ad eccezione degli ordini StopLimit)
3 LastPrice Prezzo Operazioni
4 OpenPrice1 Prezzo di transizione StopLimit-to-Limit Ordini in sospeso di tipo StopLimit. L'identificatore OpenPrice si applica quando l'ordine passa a Limit
5 OpenPrice2 Prezzo di transizione StopLimit-to-position Ordini in sospeso di tipo StopLimit. L'identificatore OpenPrice si applica quando l'ordine passa a Limit
6 StopLossValue Valore StopLoss Posizioni, ordini in sospeso
7 TakeProfitValue Valore Take Profit Posizioni, ordini in sospeso
8 StopLossInPoints Stop Loss in punti Posizioni, ordini in sospeso
9 TakeProfitInPoints Prendi profitto in punti Posizioni, ordini in sospeso
10 StopLossExists Esistenza di Stop Loss Posizioni, ordini in sospeso
11 TakeProfitExists Esistenza di Take Profit Posizioni, ordini in sospeso
12 Direction Direzione 1 - Acquista, -1 - Vendi Posizioni, ordini in sospeso, operazioni

 

Descrizione delle Azioni

Le azioni comprendono l'apertura e la chiusura di posizioni di mercato, l'impostazione, la modifica e la cancellazione degli ordini in sospeso, l'esecuzione delle funzioni di gestione: Trailing Stop, Breakeven, Trailing Stop per un ordine in sospeso (qualsiasi altra funzione di gestione della posizione).

Le azioni di apertura di una posizione e di impostazione di un ordine implicano l'uso di parametri necessari per eseguire queste azioni. Questi parametri verranno specificati dopo il comando tra parentesi, nel modo in cui vengono solitamente chiamate le funzioni. L'identificatore è il primo parametro per tutti i comandi. Quando si specificano i parametri, è possibile utilizzare valori numerici, variabili e parametri della posizione o dell'ordine esistenti. È inoltre possibile utilizzare espressioni aritmetiche come X1*X2+X3*X4 descritte nella sezione Identificazione di fase per tutti i parametri dei comandi di azione.

La tabella 3 mostra tutti i comandi di azione.

Tabella 3. Comandi di azione

Indice Comando Scopo
0 Buy(ID,Lot,StopLoss,TakeProfit) Apertura di una posizione Buy
1 Sell(ID,Lot,StopLoss,TakeProfit) Apertura di una posizione Sell
2 Close(ID) Chiusura di una posizione di mercato
3 BuyStop(ID,Lot,Price,StopLoss,TakeProfit) Impostazione di un ordine BuyStop
4 SellStop(ID,Lot,Price,StopLoss,TakeProfit) Impostazione di un ordine SellStop
5 BuyLimit(ID,Lot,Price,StopLoss,TakeProfit) Impostazione di un ordine BuyLimit
6 SellLimit(ID,Lot,Price,StopLoss,TakeProfit) Impostazione di un ordine SellLimit
7 BuyStopLimit(ID,Lot,Price1,Price2,StopLoss,TakeProfit) Impostazione di un ordine BuyStopLimit
8 SellStopLimit(ID,Lot,Price1,Price2,StopLoss,TakeProfit) Impostazione di un ordine SellStopLimit
9 Delete(ID) Cancellazione di un ordine in sospeso
10 DeleteAll(ID,BuyStop,SellStop,BuyLimit,SellLimit,BuyStopLimit,SellStopLimit) Eliminazione dei tipi specificati di ordini in sospeso
11 Modify(ID,Price1,Price2,StopLoss,TakeProfit) Posizione o modifica dell'ordine
12 TrailingStop Funzionamento della funzione Trailing Stop. I parametri della funzione sono definiti nella finestra delle proprietà dell’Expert Advisor
13 BreakEven Funzionamento della funzione di pareggio. I parametri della funzione sono definiti nella finestra delle proprietà dell’Expert Advisor

 

Le descrizioni dei parametri dei comandi di azione sono fornite nella Tabella 4.

Tabella 4. Parametri del comando di azione

Parametro Scopo
ID Identificatore dell'oggetto di trading (posizione, ordine)
Lot Dimensioni del lotto in unità. La variabile Lotti che definisce il valore dell'unità può essere trovata nella finestra delle proprietà dell’Expert Advisor
StopLoss Valore Stop Loss
TakeProfit Valore Take Profit
Price Valore dell'ordine in sospeso (ad eccezione degli ordini di tipo StopLimit)
Price1 Prezzo di transizione StopLimit-to-Limit
Price2 Prezzo di transizione StopLimit-to-position

 

Proviamo ora a mettere giù le strategie di ordine esaminate in precedenza nel nostro nuovo metalinguaggio.

 

Esempi di strategie d'ordine in Metalinguaggio

I programmi vengono visualizzati in tabelle in cui tutti i comandi di identificazione delle fasi e di azione sono disposti in colonne per una migliore comprensione e annotati con commenti. In allegato all'articolo, ci sono tutti i programmi in file di testo nella forma in cui dovrebbero essere usati nell'Expert Advisor.

Nota importante: "+", "-" e "*" non sono consentiti negli identificatori. È meglio usare semplicemente i numeri.

 

Ridimensionamento nell'Uso degli Ordini Limit

La posizione iniziale verrà aperta secondo la direzione specificata dall'utente nella finestra delle proprietà. Il ridimensionamento è consentito fino a 5 volte (Ordini Limit). Possono esserci solo tre ordini sul mercato contemporaneamente.

Tabella 5. Metaprogramma per il Ridimensionamento nell'Uso degli Ordini Limit

Numero di fase Identificazione della Fase Azioni Commenti
1 Nothing
UserBuy
Buy(1,1,0,Ask+Var1p);
BuyLimit(2,2,Buy(1,OpenPrice)-Var2p,0,ThisOpenPrice+Var3p);
BuyLimit(3,4,BuyLimit(2,OpenPrice)-Var2p,0,ThisOpenPrice+Var3p);
BuyLimit(4,8,BuyLimit(3,OpenPrice)-Var2p,0,ThisOpenPrice+Var3p)
Se non ci sono posizioni o ordini nel mercato, la direzione Buy è impostata nelle proprietà dell’Expert Advisor, apriamo una posizione con un lotto iniziale. Se la posizione è stata aperta con successo, proveremo a impostare tre ordini Limit. Detto ciò, ogni ordine successivo verrà impostato con successo solo se quello precedente è stato impostato perché il prezzo dell'ordine è calcolato in base al prezzo dell'ordine precedente.
2 Buy(1) BuyLimit(2,2,Buy(1,OpenPrice)-Var2p,0,ThisOpenPrice+Var3p);
BuyLimit(3,4,BuyLimit(2,OpenPrice)-Var2p,0,ThisOpenPrice+Var3p);
BuyLimit(4,8,BuyLimit(3,OpenPrice)-Var2p,0,ThisOpenPrice+Var3p)
Se la posizione è stata aperta con successo nella fase 1 ma non sono stati impostati tutti gli ordini in sospeso, i tentativi di impostare tutti gli ordini in sospeso continueranno.
3 Buy(2) BuyLimit(3,4,Buy(2,OpenPrice)-Var2p,0,ThisOpenPrice+Var3p);
BuyLimit(4,8,BuyLimit(3,OpenPrice)-Var2p,0,ThisOpenPrice+Var3p);
BuyLimit(5,16,BuyLimit(4,OpenPrice)-Var2p,0,ThisOpenPrice+Var3p)
Se il primo ordine Limit (con identificatore 2) è entrato, i tentativi di impostare gli altri due ordini che avrebbero dovuto essere impostati (ma non sono stati impostati) durante le fasi precedenti continuano e viene impostato un nuovo ordine in modo che ci sia sempre un totale di tre ordini Limit nel mercato.
4 Buy(3) BuyLimit(4,8,Buy(3,OpenPrice)-Var2p,0,ThisOpenPrice+Var3p);
BuyLimit(5,16,BuyLimit(4,OpenPrice)-Var2p,0,ThisOpenPrice+Var3p);
BuyLimit(6,32,BuyLimit(4,OpenPrice)-Var2p,0,ThisOpenPrice+Var3p)
Si è attivato un altro ordine limite e dobbiamo garantire la presenza di tre ordini Limit sul mercato, come nella fase precedente.
5 Buy(4) BuyLimit(5,16,Buy(4,OpenPrice)-Var2p,0,ThisOpenPrice+Var3p);
BuyLimit(6,32,BuyLimit(5,OpenPrice)-Var2p,0,ThisOpenPrice+Var3p)
Questa fase garantisce la presenza di due soli ordini in sospeso in quanto gli ordini totali sono prossimi al numero massimo di ordini.
6 Buy(5) BuyLimit(6,32,Buy(5,OpenPrice)-Var2p,0,ThisOpenPrice+Var3p) Questa fase ha solo un ultimo ordine.
7 Buy(6) Modify(6,,,Buy(6,OpenPrice)-Var4p,) Se è stato eseguito l'ultimo ordine, viene impostato uno Stop Loss per esso.
8 Nothing
UserSell
Sell(1,1,0,Var1p); SellLimit(2,2,Sell(1,OpenPrice)+Var2p,0,ThisOpenPrice-Var3p);
SellLimit(3,4,SellLimit(2,OpenPrice)+Var2p,0,ThisOpenPrice-Var3p);
SellLimit(4,8,SellLimit(3,OpenPrice)+Var2p,0,ThisOpenPrice-Var3p)
Simile alla fase 1 ma per la direzione Sell.
9 Sell(1) SellLimit(2,2,Sell(1,OpenPrice)+Var2p,0,ThisOpenPrice-Var3p);
SellLimit(3,4,SellLimit(2,OpenPrice)+Var2p,0,ThisOpenPrice-Var3p);
SellLimit(4,8,SellLimit(3,OpenPrice)+Var2p,0,ThisOpenPrice-Var3p)
Simile alla fase 2 ma per la direzione Sell
10 Sell(2) SellLimit(3,4,Sell(2,OpenPrice)+Var2p,0,Var3);
SellLimit(4,8,SellLimit(3,OpenPrice)+Var2p,0,ThisOpenPrice-Var3p);
SellLimit(5,16,SellLimit(4,OpenPrice)+Var2p,0,ThisOpenPrice-Var3p)
Simile alla fase 3 ma per la direzione Sell.
11 Sell(3) SellLimit(4,8,Sell(3,OpenPrice)+Var2p,0,Var3);
SellLimit(5,16,SellLimit(4,OpenPrice)+Var2p,0,ThisOpenPrice-Var3p);
SellLimit(6,32,SellLimit(4,OpenPrice)+Var2p,0,ThisOpenPrice-Var3p)
Simile alla fase 4 ma per la direzione Sell.
12 Sell(4) SellLimit(5,16,Sell(4,OpenPrice)+Var2p,0,Var3);
SellLimit(6,32,SellLimit(5,OpenPrice)+Var2p,0,ThisOpenPrice-Var3p)
Simile alla fase 5 ma per la direzione Sell.
13 Sell(5) SellLimit(6,32,Sell(5,OpenPrice)+Var2p,0,ThisOpenPrice-Var3p) Simile alla fase 6 ma per la direzione Sell.
14 Sell(6) Modify(6,,,Sell(6,OpenPrice)+Var4p,) Simile alla fase 7 ma per la direzione Sell.
15 NoPos;
Pending
DeleteAll(,0,0,1,1,0,0) Ci sono ordini in sospeso ma nessuna posizione. Questo accade quando viene attivato il Take Profit della posizione. In questo caso, gli ordini dovrebbero essere cancellati. Dopo la cancellazione degli ordini, il sistema passa alla fase 1 o 9. Se l'utente ha disabilitato la direzione iniziale durante il funzionamento del sistema, non verrà eseguita alcuna azione.

 

Uso delle variabili: Var1 - Take Profit dell'ordine iniziale, Var2 - livello al quale vengono impostati gli ordini Limit rispetto al prezzo di apertura dell'ordine precedente, Var3 - Stop Loss dell'ultimo ordine.

La Fig. 5 è il grafico che mostra le prestazioni di questo metaprogramma.

Fig. 5. Prestazioni del metaprogramma per lo Scaling nell'Uso degli Ordini Limit
Fig. 5. Prestazioni del metaprogramma per lo Scaling nell'Uso degli Ordini Limit

Nota: le regole per le direzioni Sell e Buy sono delineate separatamente. Ogni successivo livello di ordine in sospeso viene calcolato in base al livello di ordine precedente. Se un tentativo di impostare un ordine fallisce, l'ordine successivo non verrà impostato a causa della mancanza del parametro richiesto. Sarebbe sbagliato calcolare il livello in base al prezzo di posizione di mercato. In tal caso, alcuni degli ordini possono essere persi.

 

Stop e Reverse

Il lavoro inizia con due ordini Stop in sospeso. È consentito avere fino a cinque “reverse”

Tabella 6. Metaprogramma per Stop e Reverse

Numero di fase Identificazione della Fase Azioni Commenti
1 Nothing BuyStop(1,1,Ask+Var1p,ThisOpenPrice-Var2p,ThisOpenPrice+Var3p);
SellStop(1,1,Bid-Var1p,ThisOpenPrice+Var2p,ThisOpenPrice-Var3p)
Non ci sono posizioni o ordini nel mercato; proviamo a impostare due ordini Stop con identificatore 1.
2 NoPos;
BuyStop(1)
SellStop(1,1,Bid-Var1p,ThisOpenPrice+Var2p,ThisOpenPrice-Var3p) Non esiste una posizione ma esiste un BuyStop con identificatore 1, il che significa che dovrebbe esserci un SellStop con identificatore 1.
3 NoPos;
SellStop(1)
BuyStop(1,1,Ask+Var1p,ThisOpenPrice-Var2p,ThisOpenPrice+Var3p) Non esiste una posizione ma esiste un SellStop con identificatore 1, il che significa che dovrebbe esserci un BuyStop con identificatore 1.
4 Buy(1) Delete(1);
SellStop(2,2,Buy(1,StopLossValue),ThisOpenPrice+Var2p,ThisOpenPrice-Var3p)
C'è una posizione Buy con identificatore 1 nel mercato; in questo caso non dovrebbero esserci altri ordini con identificatore 1 ma dovrebbe esserci un SellStop con identificatore 2.
5 Sell(1) Delete(1);
BuyStop(2,2,Sell(1,StopLossValue),ThisOpenPrice-Var2p,ThisOpenPrice+Var3p)
Simile alla fase 4 ma si è attivato il primo SellStop.
6 Buy(2) SellStop(3,4,Buy(2,StopLossValue),ThisOpenPrice+Var2p,ThisOpenPrice-Var3p) Il secondo BuyStop è iniziato, quindi il terzo SellStop dovrebbe essere impostato.
7 Sell(2) BuyStop(3,4,Sell(2,StopLossValue),ThisOpenPrice-Var2p,ThisOpenPrice+Var3p) Il secondo SellStop è iniziato, quindi il terzo BuyStop dovrebbe essere impostato.
8 Buy(3) SellStop(4,8,Buy(3,StopLossValue),ThisOpenPrice+Var2p,ThisOpenPrice-Var3p) Il terzo BuyStop è stato attivato, quindi il quarto SellStop dovrebbe essere impostato.
9 Sell(3) BuyStop(4,8,Sell(3,StopLossValue),ThisOpenPrice-Var2p,ThisOpenPrice+Var3p) Il terzo SellStop è iniziato, quindi il quarto BuyStop dovrebbe essere impostato.
10 Buy(4) SellStop(5,16,Buy(4,StopLossValue),ThisOpenPrice+Var2p,ThisOpenPrice-Var3p) Il quarto BuyStop è iniziato, quindi dovrebbe essere impostato il quinto SellStop.
11 Sell(4) BuyStop(5,16,Sell(4,StopLossValue),ThisOpenPrice-Var2p,ThisOpenPrice+Var3p) Il quarto SellStop è iniziato, quindi dovrebbe essere impostato il quinto BuyStop.
12 Buy(5) SellStop(6,32,Buy(5,StopLossValue),ThisOpenPrice+Var2p,ThisOpenPrice-Var3p) Il quinto BuyStop è iniziato, quindi il sesto SellStop dovrebbe essere impostato.
13 Sell(5) BuyStop(6,32,Sell(5,StopLossValue),ThisOpenPrice-Var2p,ThisOpenPrice+Var3p) Il quinto SellStop è iniziato, quindi il sesto BuyStop dovrebbe essere impostato.
14 NoPos;
BuyStop(2)
Delete(2) Non c'è posizione ma abbiamo ancora BuyStop; questo può accadere quando la posizione è chiusa a Take Profit. In questo caso, l'ordine residuo viene cancellato e il sistema passa alla fase 1.
15 NoPos;
SellStop(2)
Delete(2) Simile alla fase 14.
16 NoPos;
BuyStop(3)
Delete(3) Simile alla fase 14.
17 NoPos;
SellStop(3)
Delete(3) Simile alla fase 14.
18 NoPos;
BuyStop(4)
Delete(4) Simile alla fase 14.
19 NoPos;
SellStop(4)
Delete(4) Simile alla fase 14.
20 NoPos;
BuyStop(5)
Delete(5) Simile alla fase 14.
21 NoPos;
SellStop(5)
Delete(5) Simile alla fase 14.
22 NoPos;
BuyStop(6)
Delete(6) Simile alla fase 14.
23 NoPos;
SellStop(6) |
Delete(6) Simile alla fase 14.

 

Uso delle variabili: Var1 - livello al quale vengono impostati gli ordini iniziali dal prezzo di mercato corrente, Var2 - Stop Loss, Var3 - Take Profit.

La Fig. 6 è il grafico che mostra le prestazioni di questo metaprogramma.

Fig. 6. Prestazione del metaprogramma per Stop e Reverse
Fig. 6. Prestazioni del metaprogramma per Stop e Reverse

 

Piramide

Viene aperta una posizione iniziale in base al segnale dell'indicatore. È consentito ridimensionare fino a cinque volte.

Tabella 7. Metaprogramma per Pyramiding"

Numero di fase Identificazione della Fase Azioni Commenti
1 Nothing
SignalOpenBuy
Buy(1,1,Ask-Var1p,Ask+Var2p*6) Non c'è posizione o ordine nel mercato; riceviamo un segnale dagli indicatori per aprire una posizione Buy a seguito della quale viene aperta la posizione. Take Profit viene prima impostato alla distanza pari a Var2p*6, al passaggio successivo verrà impostato a Var2p*5 e così via per garantire che Take Profit sia all'incirca allo stesso livello di prezzo.
2 Buy(1);
Buy(1,ProfitInPoints)>=Var3
Buy(2,1,Ask-Var1p,Ask+Var2p*5) C'è una posizione buy che mostra un buon profitto, quindi ci inoltriamo.
3 Buy(2) Modify(2,,,Buy(2,OpenPrice),) La posizione nel mercato ha l'indice 2 che suggerisce che questa posizione non è iniziale e deve essere stata ridimensionata; Lo Stop Loss dovrebbe essere al Pareggio.
4 Buy(2);
Buy(2,ProfitInPoints)>=Var3
Buy(3,1,Ask-Var1p,Ask+Var2p*4) La posizione è di nuovo vincente, quindi ci adattiamo.
5 Buy(3) Modify(3,,,Buy(3,OpenPrice),) Lo Stop Loss viene spostato su Breakeven ogni volta che si ridimensiona.
6 Buy(3);
Buy(3,ProfitInPoints)>=Var3
Buy(4,1,Ask-Var1p,Ask+Var2p*3) Simile alla fase 4.
7 Buy(4) Modify(4,,,Buy(4,OpenPrice),) Simile alla fase 5.
8 Buy(4);
Buy(4,ProfitInPoints)>=Var3
Buy(5,1,Ask-Var1p,Ask+Var2p*2) Simile alla fase 4.
9 Buy(5) Modify(5,,,Buy(5,OpenPrice),) Simile alla fase 5.
10 Buy(5);
Buy(5,ProfitInPoints)>=Var3
Buy(6,1,Ask-Var1p,Ask+Var2p) Simile alla fase 4.
11 Buy(6) Modify(6,,,Buy(6,OpenPrice),) Simile alla fase 5.
12 Nothing
SignalOpenSell
Sell(1,1,Bid+Var1p,Bid-Var2p*6) Simile alla fase 1 ma rispetto a una posizione Sell.
13 Sell(1);
Sell(1,ProfitInPoints)>=Var3
Sell(2,1,Bid+Var1p,Bid-Var2p*5) Simile alla fase 2 ma rispetto a una posizione Sell.
14 Sell(2) Modify(2,,,Sell(2,OpenPrice),) Simile alla fase 3 ma rispetto a una posizione Sell.
15 Sell(2);
Sell(2,ProfitInPoints)>=Var3
Sell(3,1,Bid+Var1p,Bid-Var2p*4) Simile alla fase 4 ma rispetto a una posizione Sell.
16 Sell(3); Modify(3,,,Sell(3,OpenPrice),) Simile alla fase 5 ma rispetto a una posizione Sell.
17 Sell(3);
Sell(3,ProfitInPoints)>=Var3
Sell(4,1,Bid+Var1p,Bid-Var2p*3) Simile alla fase 6 ma rispetto a una posizione Sell.
18 Sell(4); Modify(4,,,Sell(4,OpenPrice),) Simile alla fase 7 ma rispetto a una posizione Sell.
19 Sell(4);
Sell(4,ProfitInPoints)>=Var3
Sell(5,1,Bid+Var1p,Bid-Var2p*2) Simile alla fase 8 ma rispetto a una posizione Sell.
20 Sell(5); Modify(5,,,Sell(5,OpenPrice),) Simile alla fase 9 ma rispetto a una posizione Sell.
21 Sell(5);
Sell(5,ProfitInPoints)>=Var3
Sell(6,1,Bid+Var1p,Bid-Var2p) Simile alla fase 10 ma rispetto a una posizione Sell.
22 Sell(6); Modify(6,,,Sell(6,OpenPrice),) Simile alla fase 11 ma rispetto a una posizione Sell.

 

Uso delle variabili: Var1 - Stop Loss iniziale, Var2 - Take Profit dell'ultimo ordine, Var3 - profitto in punti in cui ridimensioniamo e spostiamo Stop Loss a Breakeven.

La Fig. 7 è il grafico che mostra le prestazioni di questo metaprogramma.

Fig. 7. Prestazioni del metaprogramma per Pyramiding
Fig. 7. Prestazioni del metaprogramma per Pyramiding

 

Riapertura

All'inizio, impostiamo due ordini Limit. Non appena uno si è attivato, l'altro viene eliminato. Quindi, quando entra in gioco lo Stop Loss, viene aperta una nuova posizione fino a quando non si chiude al Take Profit o fino all'esaurimento del numero massimo di posizioni (5).

Tabella 8. Metaprogramma per la Riapertura

Numero di fase Identificazione della Fase Azioni Commenti
1 Nothing
NoLastDeal
BuyLimit(1,1,Ask-Var1p,ThisOpenPrice-Var2p,ThisOpenPrice+Var3p);
SellLimit(1,1,Bid+Var1p,ThisOpenPrice+Var2p,ThisOpenPrice-Var3p)
Non ci sono posizioni o ordini nel mercato e la cronologia dell’account non mostra operazioni sul simbolo. Significa che questo è l'inizio del funzionamento del sistema. Due ordini Limit sono impostati come azione iniziale.
2 Nothing
LastDeal(,ProfitInValute)>0
BuyLimit(1,1,Ask-Var1p,ThisOpenPrice-Var2p,ThisOpenPrice+Var3p);
SellLimit(1,1,Bid+Var1p,ThisOpenPrice+Var2p,ThisOpenPrice-Var3p)
Non ci sono posizioni o ordini nel mercato, ma la cronologia mostra un'operazione che si è chiusa con profitto. Suggerisce che la fase precedente è completa e che dobbiamo iniziare dall'inizio e impostare due ordini Limit come nella fase 1.
3 Nothing
LastEADeal(5)
BuyLimit(1,1,Ask-Var1p,ThisOpenPrice-Var2p,ThisOpenPrice+Var3p);
SellLimit(1,1,Bid+Var1p,ThisOpenPrice+Var2p,ThisOpenPrice-Var3p)
Non ci sono posizioni o ordini nel mercato, ma la cronologia contiene un'operazione con l'ultimo identificatore. In questo caso, il profitto ottenuto nell'operazione non ha importanza in quanto la fase si considera comunque conclusa; partiamo dall'inizio e impostiamo due ordini Limit come nella fase 1.
4 NoPos;
BuyLimit(1)
SellLimit(1,1,Bid+Var1p,ThisOpenPrice-Var2p,ThisOpenPrice+Var3p) Non ci sono posizioni nel mercato ma sappiamo che c'è un ordine Limit, il che significa che dovrebbe esserci anche il secondo.
5 NoPos;
SellLimit(1)
BuyLimit(1,1,Ask-Var1p,ThisOpenPrice+Var2p,ThisOpenPrice-Var3p) Simile alla fase 4.
6 Buy(1);
SellLimit(1)
Delete(1) Esiste una posizione con identificatore 1. Ciò significa che uno degli ordini Limit è stato attivato e il secondo ordine deve essere eliminato.
7 Sell(1);
BuyLimit(1)
Delete(1) Simile alla fase 6.
8 Nothing
LastDeal(1,ProfitInValute)<=0;
LastEADeal(1,Direction)==1
Buy(2,2,Ask-Var2p,Ask+Var3p) Non ci sono posizioni e l'ultima operazione non è stata redditizia. Controlla la direzione dell'ultima operazione eseguita dall'Expert Advisor; se si trattava di un'operazione Buy, la posizione successiva che devi aprire è una posizione Buy.
9 Nothing
LastDeal(1,ProfitInValute)<=0;
LastEADeal(1,Direction)==-1
Sell(2,2,Bid+Var2p,Bid-Var3p) Non ci sono posizioni e l'ultima operazione non è stata redditizia. Controlla la direzione dell'ultima operazione eseguita dall'Expert Advisor; se si trattava di un'operazione Sell, la posizione successiva che devi aprire è una posizione Sell.
10 Nothing
LastDeal(2,ProfitInValute)<=0;
LastEADeal(2,Direction)==1
Buy(3,4,Ask-Var2p,Ask+Var3p) Simile alla fase 8.
11 Nothing
LastDeal(2,ProfitInValute)<=0;
LastEADeal(2,Direction)==-1
Sell(3,4,Bid+Var2p,Bid-Var3p) Simile alla fase 9.
12 Nothing
LastDeal(3,ProfitInValute)<=0;
LastEADeal(3,Direction)==1
Buy(4,8,Ask-Var2p,Ask+Var3p) Simile alla fase 8.
13 Nothing
LastDeal(3,ProfitInValute)<=0;
LastEADeal(3,Direction)==-1
Sell(4,8,Bid+Var2p,Bid-Var3p) Simile alla fase 9.
14 Nothing
LastDeal(4,ProfitInValute)<=0;
LastEADeal(4,Direction)==1
Buy(5,16,Ask-Var2p,Ask+Var3p) Simile alla fase 8.
15 Nothing
LastDeal(4,ProfitInValute)<=0;
LastEADeal(4,Direction)==-1
Sell(5,16,Bid+Var2p,Bid-Var3p) Simile alla fase 9.

 

Uso delle variabili: Var1 - livello dal prezzo di mercato al quale sono impostati gli ordini Limit, Var2 - Stop Loss, Var3 - Take Profit.

La Fig. 8 è il grafico che mostra le prestazioni di questo metaprogramma.

Fig. 8. Prestazioni del metaprogramma per la  Riapertura
Fig. 8. Prestazioni del metaprogramma per la Riapertura

Di seguito, puoi trovare alcuni programmi più semplici per vedere il funzionamento di funzioni come Segnali di Trading, Trailing Stop e Breakeven.

 

Segnali di Trading

L'entrata e l'uscita si basano sui segnali di trading.

Tabella 9. Metaprogramma per i Segnali di Trading"

Numero di fase Identificazione della Fase Azioni Commenti
1 Nothing
SignalOpenBuy;
NoTradeOnBar
Buy(1,1,0,0) Non ci sono posizioni o ordini nel mercato, ma possiamo vedere un segnale per aprire una posizione Buy. Non ci sono operazioni sulla barra corrente e apriamo una posizione Buy.
2 Nothing
SignalOpenSell;
NoTradeOnBar
Sell(1,1,0,0) Non ci sono posizioni o ordini nel mercato, ma possiamo vedere un segnale per aprire una posizione Sell. Non ci sono operazioni sulla barra corrente e apriamo una posizione Sell.
3 SignalCloseBuy;
Buy(1)
Close(1); C'è una posizione Buy e un segnale per chiuderla; la posizione Buy è in fase di chiusura.
4 SignalCloseSell;
Sell(1)
Close(1); C'è una posizione Sell e un segnale per chiuderla; la posizione Sell viene chiusa.

 

La Fig. 9 è il grafico che mostra le prestazioni di questo metaprogramma.

Fig. 9. Prestazioni del metaprogramma per i Segnali di Trading
Fig. 9. Prestazioni del metaprogramma per i Segnali di Trading

 

Segnali di Trading con un Trailing Stop

Tabella 10. Metaprogramma per Segnali di Trading con Trailing Stop

Numero di fase Identificazione della Fase Azioni Commenti
1 Nothing
SignalOpenBuy;
NoTradeOnBar
Buy(1,1,0,0) Non ci sono posizioni o ordini nel mercato, ma possiamo vedere un segnale per aprire una posizione Buy. Non ci sono operazioni sulla barra corrente e apriamo una posizione Buy.
2 Nothing
SignalOpenSell;
NoTradeOnBar
Sell(1,1,0,0) Non ci sono posizioni o ordini nel mercato, ma possiamo vedere un segnale per aprire una posizione Sell. Non ci sono operazioni sulla barra corrente e apriamo una posizione Sell.
3 SignalCloseBuy;
Buy(1)
Close(1); C'è una posizione Buy e un segnale per chiuderla; la posizione Buy è in fase di chiusura.
4 SignalCloseSell;
Sell(1)
Close(1); C'è una posizione Sell e un segnale per chiuderla; la posizione Sell viene chiusa.
5 Buy(1) TrailingStop C'è una posizione Buy nel mercato; La funzione Trailing Stop dovrebbe essere attivata.
6 Sell(1) TrailingStop C'è una posizione Sell nel mercato; la funzione Trailing Stop dovrebbe essere attivata.

 

La Fig. 10 è il grafico che mostra le prestazioni di questo metaprogramma.

Fig. 10. Prestazioni del metaprogramma per Segnali di Trading con Trailing Stop
Fig. 10. Prestazioni del metaprogramma per i Segnali di Trading con Trailing Stop

 

Segnali di Trading con Funzione di Pareggio

Tabella 11. Metaprogramma per Segnali di Trading con Funzione di Pareggio

Numero di fase Identificazione della Fase Azioni Commenti
1 Nothing
SignalOpenBuy;
NoTradeOnBar
Buy(1,1,0,0) Non ci sono posizioni o ordini nel mercato, ma possiamo vedere un segnale per aprire una posizione Buy. Poiché non ci sono operazioni sulla barra corrente, viene aperta la posizione Buy.
2 Nothing
SignalOpenSell;
NoTradeOnBar
Sell(1,1,0,0) Non ci sono posizioni o ordini nel mercato, ma possiamo vedere un segnale per aprire una posizione Sell. Poiché non ci sono operazioni sulla barra corrente, viene aperta la posizione Sell.
3 SignalCloseBuy;
Buy(1)
Close(1); C'è una posizione Buy e un segnale per chiuderla; la posizione Buy è in fase di chiusura.
4 SignalCloseSell;
Sell(1)
Close(1); C'è una posizione Sell e un segnale per chiuderla; la posizione Sell viene chiusa.
5 Buy(1) BreakEven C'è una posizione Buy nel mercato; la funzione di Pareggio dovrebbe essere attivata.
6 Sell(1) BreakEven C'è una posizione Sell nel mercato; la funzione di Pareggio dovrebbe essere attivata.

 

La Fig. 11 è il grafico che mostra le prestazioni di questo metaprogramma.

Fig. 11 Prestazioni del metaprogramma per i Segnali di Trading con Funzione di Pareggio

Fig. 11. Prestazioni del metaprogramma per i Segnali di Trading con Funzione di Pareggio

 

Interprete dei comandi

L'approccio di cui sopra per la formalizzazione delle strategie d'ordine ci consente di comprenderle meglio e di elaborare un algoritmo per la loro ulteriore implementazione in un Expert Advisor, nonché di interpretare e seguire direttamente le regole elaborate. L'Expert Advisor eInterpretator è stato creato con questo scopo in mente (vedi i file allegati). I parametri dell'Expert Advisor e le loro descrizioni sono forniti nella Tabella 12.

Tabella 12. Parametri dell'Expert Advisor eInterpretator

Parametri Scopo
Lots Volume dell'ordine quando il coefficiente di lotto è uguale a 1.
UserTradeDir Direzione dell’operazione specificata dall'utente (viene verificata all'identificazione della fase durante l'esecuzione dei comandi UserBuy e UserSell).
ProgramFileName Nome del file del metaprogramma (quando si lavora sull'account). Durante il test o l'ottimizzazione, il metaprogramma deve essere inserito nel file TesterMetaProgram.txt
DeInterpritate Interpretazione inversa dei comandi. Al termine, nella cartella File apparirà un file con il prefisso "De_" e sarà possibile vedere come l'Expert Advisor "ha compreso" il metaprogramma dal file ProgramFileName.
Variabili dell’utente
Var1 - Var20 Variabili dell’utente.
Trailing Stop
TR_ON Attivazione della funzione Trailing Stop.
TR_Start Profitto della posizione nei punti in cui il Trailing Stop inizia a lavorare.
TR_Level Livello Trailing Stop. Distanza in punti dal prezzo di mercato corrente allo Stop Loss.
TR_Step Step in punti per la modifica dello Stop Loss.
Break Even
BE_ON Attivazione della funzione di Pareggio.
BE_Start Guadagno della posizione in punti che innesca il Pareggio.
BE_Level Livello a cui viene spostato lo Stop Loss quando viene attivato il Pareggio. Il BE_Start-BE_Level dei punti di profitto è fisso.
Segnali Aperti
OS_ON Attivazione segnali di apertura.
OS_Shift Barra su cui vengono controllati gli indicatori: 0 - nuovo, 1 - completato.
OS_TimeFrame Intervallo dell'indicatore.
OS_MA2FastPeriod Periodo MA veloce.
OS_MA2FastShift Spostamento MA veloce.
OS_MA2FastMethod Metodo MA veloce.
OS_MA2FastPrice Prezzo MA veloce.
OS_MA2SlowPeriod Periodo MA lento.
OS_MA2SlowShift Spostamento MA lento.
OS_MA2SlowMethod Metodo MA lento.
OS_MA2SlowPrice Prezzo MA lento.
Segnali di Chiusura
CS_ON Attivazione segnali di chiusura.
CS_Shift Barra su cui vengono controllati gli indicatori: 0 - nuovo, 1 - completato.
CS_TimeFrame Intervallo dell'indicatore.
CS_CCIPeriod Periodo CCI.
CS_CCIPrice Prezzo CCI.
CS_CCILevel Livello CCI superiore (per chiudere una posizione Buy). Un segnale per la chiusura di una posizione Buy appare all'incrocio verso il basso del livello. È esattamente l'opposto per chiudere una posizione Sell.

 

Come Funziona l’Expert Advisor

All'inizio, l'Expert Advisor carica il metaprogramma dal file per esaminarlo ed analizzarlo. Se viene rilevato un errore grossolano nel metaprogramma, verrà visualizzato un avviso di errore. Analizzando il metaprogramma, l’Expert Advisor compila le strutture dati con valori numerici corrispondenti a comandi di testo per garantire le massime prestazioni dell'Expert Advisor. Al termine dell'analisi del metaprogramma, sul log viene stampato il seguente messaggio: "Inizializzazione dell'interprete completata".

Se la variabile DeInterpritate è inclusa, l'Expert Advisor eseguirà un test di interpretazione inversa dei comandi (per cui verrà disconnesso dal grafico e qualsiasi test nello Strategy Tester effettuato in quel momento verrà interrotto). Durante l'interpretazione inversa, l'Expert Advisor trasforma i valori numerici trovati nelle strutture in comandi di testo. E nonostante le voci di comando nel file siano diverse, il metaprogramma interpretato in modo inverso ti consentirà di avere un'idea migliore di come l'Expert Advisor analizza i comandi.

Vediamolo usando la seguente stringa dal file del metaprogramma:

Buy(6) | Modify(6,,,ThisOpenPrice-Var4p,)

Seguendo l'interpretazione inversa, questa stringa avrà il seguente aspetto:

Buy(6)==1*1+0*0; | Modify(6,,,ThisOpenPrice()*1-0.0025*1,)

Come possiamo vedere, un semplice comando Buy(6) viene trasformato in un'espressione di confronto in cui il lato destro contiene l'espressione aritmetica X1*X2+X3*X4 che dà 1 come risultato dei calcoli. Nel campo azione, la variabile utente viene sostituita con il valore numerico.

 

Suggerimenti sulla Personalizzazione dell'Expert Advisor

Alcuni di voi probabilmente vorranno personalizzare questo Expert Advisor aggiungendo i propri comandi sia alla fase di analisi che all'esecuzione dei comandi e includere altre funzioni di gestione della posizione. A causa della struttura dell'Expert Advisor, tale personalizzazione può essere abbastanza semplice, altrimenti l'intero lavoro svolto sull'Expert Advisor non avrebbe avuto alcun valore pratico.

Aggiungere Comandi di Dati

Un elenco di comandi per ottenere i dati è disponibile nell'array InfoCommand. I comandi sono organizzati in colonne con cinque comandi in fila che ci consentono di contare facilmente il loro numero e trovare il valore dell'indice per il comando da aggiungere.

Dopo aver aggiunto il comando all'array InfoCommand, aggiungiamo un nuovo caso corrispondente al nuovo indice del comando alla struttura switch nella funzione SetValue(). Per ottenere il valore, dobbiamo prima selezionare l'oggetto da cui verrà ottenuto il valore e solo dopo ottenere il valore. A seconda del tipo di oggetto da cui si ottengono i dati, vengono utilizzate diverse funzioni per selezionare l'oggetto. Queste funzioni sono mostrate nella Tabella 13.

Tabella 13. Funzioni dell'Expert Advisor per la selezione degli oggetti di trading

Funzione Scopo e Parametri
Pos.Select(_Symbol) Selezione della posizione. Metodo di classe standard simile alla funzione PositionSelect().
SelectOrder(long aType, string aID, bool & aSelected) Funzione per la selezione di un ordine tramite il simbolo dell'Expert Advisor, tipo (aType) e valore identificativo (aID). Se l'oggetto viene trovato e selezionato, la variabile aSeleted per riferimento restituisce true.
bool SelectLastDeal(int aType,bool & aSelected) Funzione per la selezione dell'ultima operazione tramite il simbolo dell'Expert Advisor e il tipo (aType). Se l'oggetto viene trovato e selezionato, la variabile aSeleted per riferimento restituisce true.
SelectLastEADeal(int aType,string aID,bool & aSelected) Funzione per la selezione dell'ultima operazione eseguita dall'Expert Advisor tramite il simbolo dell'Expert Advisor e il tipo (aType). Se l'oggetto viene trovato e selezionato, la variabile aSeleted per riferimento restituisce true.

 

La differenza tra l'ultima operazione e l'ultima operazione eseguita dall'Expert Advisor è che l'ultima operazione copre le operazioni Stop Loss e Take Profit. Potrebbero essere necessari i dati dell'ultima operazione per determinare il risultato della chiusura dell'ultima posizione, mentre le informazioni sull'ultima operazione eseguita dall'Expert Advisor potrebbero essere necessarie per identificare l'ultima direzione dell'operazione o la fase operativa dell'Expert Advisor.

Oltre ai dati dell'oggetto di trading, è possibile accedere ai dati di mercato, come il prezzo, ecc. L'importante è assicurarsi che i dati possano essere ottenuti. Dopo un tentativo di selezione dell'oggetto, dobbiamo assicurarci che l'oggetto sia stato realmente selezionato (verificando il valore di aSelected), ottenere il parametro richiesto, assegnarne il valore alla variabile Val.Value e restituire true.

La Tabella 14 presenta le funzioni utilizzate per ottenere i parametri di vari oggetti di trading.

Tabella. Funzioni dell'Expert Advisor per ottenere i parametri dell'oggetto di trading selezionato

Funzione Scopo e Parametri
double SelPosParam(int aIndex) Ottenere il parametro di posizione dall'indice aIndex impostato.
double SelOrdParam(int aIndex) Ottenere il parametro dell'ordine dall'indice aIndex impostato.
double SelDealParam(int aIndex) Ottenere il parametro dell’operazione dall'indice aIndex impostato.

 

Nella funzione viene trasmesso l'indice identificativo dei dati da ottenere. Il valore dell'indice è contenuto nella variabile Val.InfoIdentifierIndex.

Quando si aggiunge un nuovo comando di accesso, potrebbe essere necessario aggiungere anche l'identificatore dei dati da ottenere o aggiungere solo l'identificatore dei dati da acquisire.

 

Aggiungere Identificatori di Dati

È possibile trovare un elenco di identificatori nell'array InfoIdentifier. Dobbiamo aggiungere il nuovo identificatore all'array, trovare il suo indice e aggiornare le funzioni SelPosParam(), SelOrdParam() e SelDealParam(). Gli aggiornamenti possono riguardare alcune o tutte le funzioni a seconda che il nuovo identificatore possa essere applicato a tutti gli oggetti di trading. Gli aggiornamenti delle funzioni consistono nell'aggiungere un nuovo caso corrispondente al nuovo indice identificativo alla struttura dello switch.

 

Aggiunta di Comandi di Azione

I comandi di azione vengono aggiunti all'array ActCommand. I comandi nell'array sono organizzati in una stringa, rendendo un po' più difficile trovare l'indice necessario. Gli elementi rappresentano una stringa poiché oltre ad aggiungere un comando è necessario specificare il numero dei suoi parametri e il tipo. Il numero di parametri è specificato nell'array ActCmndPrmCnt e il tipo è indicato nell'array ActCmndType. I tipi possibili includono: 0 - azione di mercato, 1 - azione con un ordine in sospeso, 2 - gestione della posizione.

Dopo che il comando è stato aggiunto all'array, troviamo la funzione DoAction() e aggiungiamo un altro caso per la nuova chiamata di funzione al suo switch. La nuova funzione deve essere di tipo bool e restituire true se eseguita correttamente o false in caso di errore. Se il controllo delle prestazioni della funzione non è necessario, come nella funzione Trailing Stop, può semplicemente restituire true.

Tieni presente che le funzioni che si occupano di ordini in sospeso, come le funzioni per l'impostazione degli stessi, richiedono verifiche preliminari per l'esistenza dell'ordine.

 

Modifiche alle Funzioni dei Segnali di Trading

L'intero lavoro relativo all'acquisizione dei segnali di trading nell'Expert Advisor viene svolto in due funzioni (due funzioni per i segnali di chiusura e due funzioni per i segnali di apertura).

La funzione CloseSignalsInit() (inizializzazione dei segnali per la chiusura) e la funzione OpenSignalsInit() (inizializzazione dei segnali per l'apertura) vengono chiamate dalla funzione OnInit() dell'Expert Advisor. Queste funzioni sono responsabili del caricamento degli indicatori. Le funzioni principali - CloseSignalsMain() (identificazione dei segnali di trading per la chiusura) e OpenSignalsMain() (identificazione dei segnali di trading per l'apertura) vengono chiamate dalla funzione OnTick() su ogni tick.

All'inizio dell'esecuzione della funzione, GlobalCloseBuySignal, GlobalCloseSellSignal (segnali per la chiusura) e GlobalOpenBuySignal, GlobalOpenSellSignal (segnali per l'apertura) dovrebbero essere assegnati false e, quindi, true alle letture dell'indicatore corrispondente.

Inoltre, nella funzione OnDeinit() dell'Expert Advisor, devi eseguire IndicatorRelease().

 

Allegati

  • eInterpretator.mq5 - Expert Advisor che dovrebbe essere inserito in MQL5/Experts della directory dei dati del terminale.

  • LimitAdd.txt - Metaprogramma per il ridimensionamento nell'utilizzo degli ordini limite.

  • StopRev.txt - Metaprogramma per Stop e Reverse.

  • Piramiding.txt - Metaprogramma per Pyramiding.

  • ReOpen.txt.txt - Metaprogramma per la Riapertura.

  • TradeSignals.txt - Metaprogramma per i Segnali di Trading.

  • TradeSignalsTR.txt - Metaprogramma per Segnali di Trading con Trailing Stop.

  • TradeSignalsBE.txt - Metaprogramma per Segnali di Trading con Funzione di Pareggio.

  • limitadd.set- file di parametri per il Ridimensionamento nell'Uso degli ordini Limit.

  • stoprev.set - file di parametri per Stop e Reverse.

  • piramiding.set - file di parametri per Pyramiding.

  • open.set - file di parametri per la Riapertura.

  • tradesignals.set - file di parametri per i Segnali di Trading.

  • tradesignalstr.set - file di parametri per Segnali di Trading con Trailing Stop.

  • tradesignalsbe.set - file di parametri per i Segnali di Trading con Funzione di Pareggio.

Nota. Quando si utilizzano programmi con Segnali di Trading, Trailing Stop e Breakeven, ricorda sempre di abilitare le relative funzioni nella finestra delle proprietà dell'Expert Advisor. Quando si testano le strategie nello Strategy Tester, copiare i file del metaprogramma nel file TesterMetaProgram.txt (questo è necessario per consentire l'uso di agents di test remoto). Il file dovrebbe essere inserito in MQL5/Files della directory dei dati del terminale (puoi aprirlo dal terminale: File -> Open Data Folder).

Le prestazioni dei programmi visualizzati nei grafici che si trovano nella sezione Esempi di Strategie d'Ordine in Metalinguaggio si basano sui parametri specificati nei file dei parametri. I test sono stati eseguiti negli ultimi mesi (dal 29.08.2012), per il modello EURUSD H1, OHLC su M1.

 

Conclusione

Molto spesso, la prima sensazione che si prova quando si inizia con lo sviluppo della strategia degli ordini è la confusione: da cosa iniziare, cosa tenere a mente, come garantire la stabilità dell'Expert Advisor in un ambiente reale, come combinare l'esecuzione di un algoritmo di strategia di trading con l’affidabilità del suo funzionamento?

Questo articolo dovrebbe, per lo meno, aiutare sia gli sviluppatori che i trader che effettuano ordini per lo sviluppo dell’EA con la formalizzazione iniziale delle loro strategie e aiutarli a capire le fasi dello sviluppo della strategia, cosa comporta ogni fase e cosa dovremmo prendere in considerazione. L'Expert Advisor eInterpretator apre grandi possibilità per sperimentare strategie di ordine con il minimo tempo e sforzo.

Inoltre, vorrei dire che non posso trattenere la mia ammirazione per il terminale MetaTrader 5. La velocità operativa dell'Expert Advisor eInterpretator nello Strategy Tester è andata oltre le mie aspettative!

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

File allegati |
files__4.zip (23.39 KB)
L'Istogramma dei Prezzi (Market Profile) e la sua implementazione in MQL5 L'Istogramma dei Prezzi (Market Profile) e la sua implementazione in MQL5
The Market Profile è stato sviluppato dal geniale pensatore Peter Steidlmayer. Ha suggerito di utilizzare la rappresentazione alternativa delle informazioni sui movimenti di mercato "orizzontali" e "verticali" che porta a un insieme completamente diverso di modelli. Ha assunto che ci sia un impulso sottostante del mercato o un modello fondamentale chiamato ciclo di equilibrio e squilibrio. In questo articolo considererò Price Histogram - un modello semplificato di Market Profile e descriverò la sua implementazione in MQL5.
Operazioni di Trading in MQL5 - È Facile Operazioni di Trading in MQL5 - È Facile
Quasi tutti i trader vengono sul mercato per fare soldi, ma alcuni trader apprezzano anche il processo in sé. Tuttavia, non è solo il trading manuale che ti può offrire un'esperienza entusiasmante. Anche lo sviluppo automatizzato dei sistemi di trading può essere piuttosto coinvolgente. Creare un robot di trading può essere interessante quanto leggere un buon romanzo giallo.
Come Scambiare i Dati: Una DLL per MQL5 in 10 minuti Come Scambiare i Dati: Una DLL per MQL5 in 10 minuti
Ora, non sono così tanti gli sviluppatori che ricordano come scrivere una semplice DLL e quali sono le caratteristiche speciali dei diversi binding di sistema. Usando diversi esempi, cercherò di mostrare l'intero processo di creazione della semplice DLL in 10 minuti, oltre a discutere alcuni dettagli tecnici della nostra implementazione vincolante. Mostrerò il processo passo dopo passo della creazione di DLL in Visual Studio con esempi di scambio di diversi tipi di variabili (numeri, array, stringhe, ecc.). Inoltre spiegherò come proteggere il tuo terminale client da arresti anomali nelle DLL personalizzate.
Tuffo veloce in MQL5 Tuffo veloce in MQL5
Hai deciso di studiare il linguaggio di programmazione delle strategie di trading MQL5, ma non ne sai nulla? Abbiamo cercato di esaminare il terminale MQL5 e MetaTrader 5 dal punto di vista dei principianti ​​e abbiamo scritto questo breve articolo introduttivo. In questo articolo, puoi trovare una breve idea delle possibilità del linguaggio, oltre ad alcuni suggerimenti su come lavorare con MetaEditor 5 ed il terminale.