English Русский 中文 Español Deutsch 日本語 Português 한국어 Français Türkçe
Un Gestore degli Ordini Virtuale per tenere traccia degli ordini all'interno dell'ambiente MetaTrader 5 incentrato sulla posizione

Un Gestore degli Ordini Virtuale per tenere traccia degli ordini all'interno dell'ambiente MetaTrader 5 incentrato sulla posizione

MetaTrader 5Trading | 16 dicembre 2021, 10:29
164 0
Paul
Paul


1. Introduzione

Probabilmente il più grande cambiamento nella transizione da MetaTrader 4 a MetaTrader 5 è la gestione delle negoziazioni aperte come posizioni. In qualsiasi momento ci può essere una sola posizione aperta per ogni simbolo, e la dimensione di questa posizione si regola su e giù ogni volta che gli ordini vengono elaborati dal broker. Ciò si allinea con la regola FIFO NFA 2-43 (b) introdotta negli Stati Uniti e si adatta anche alla modalità di negoziazione in molte altre entità come future, materie prime e CFD.

Un chiaro esempio della differenza potrebbe essere quando due EA in esecuzione contro lo stesso simbolo emettono ordini in direzioni opposte.  Questa può essere una situazione comune con due EA che lavorano in tempi diversi, come uno scalper e un trend-follower.  In MetaTrader 4, l'elenco di trading aperto mostrerebbe gli ordini aperti di buy e sell con margine zero utilizzato. In MetaTrader 5, nessuna posizione sarebbe aperta.

Guardando nel codice EA stesso, funzioni come l'OpenOrders MQL4 comunemente usata di seguito, o una variante simile, non funzioneranno come previsto quando migrata a MQL5.

int OpenOrders()  // MetaTrader 4 code to count total open orders for this EA
{
  int nOpenOrders=0;
  for (int i=OrdersTotal()-1; i>=0; i--)
  {
    OrderSelect(i,SELECT_BY_POS,MODE_TRADES);
    if (OrderMagicNumber()==magic)
      if (OrderType()==OP_BUY || OrderType()==OP_SELL)
        if (OrderSymbol()==Symbol())
          nOpenOrders++;
  }
  return(nOpenOrders);
}

Quindi l'ambiente incentrato sulla posizione di MetaTrader 5 presenta sfide sconosciute per il programmatore abituato all'approccio di elaborazione degli ordini utilizzato in MetaTrader 4. Quelle che erano semplici funzioni di gestione degli ordini in MetaTrader 4 diventano più complesse in MetaTrader 5 quando più ordini possono essere uniti in un'unica posizione, come più EA che scambiano un simbolo o più ordini da un EA su un simbolo.


2. Modi per lavorare con le posizioni in MetaTrader 5  

Ci sono diversi modi per gestire questo ambiente incentrato sulla posizione in MetaTrader 5, a seconda della complessità delle strategie di trading.

In primo luogo, si noti che la gestione degli ordini in sospeso da parte di MetaTrader 5 è simile a MetaTrader 4, quindi il codice MQL5 scritto per gli ordini in sospeso da solo potrebbe essere una migrazione relativamente semplice dal codice MQL4.

2.1 EA semplice; un EA per simbolo per account

L'approccio più semplice è quello di limitare il trading su un conto a un semplice EA per simbolo.  "EA semplice" in questo caso significa uno che emette solo un singolo ordine alla volta, che è un metodo comune ma esclude strategie come la piramide e il trading di griglia.  Gli EA semplici possono essere scritti in MQL5 in modo simile a MQL4, magari utilizzando il wrapper della libreria CTrade fornito in include\trade\trade.mqh.

2.2 EA Complesso EA: un EA per simbolo per account

Per gli EA complessi, come quelli che hanno una strategia come il pyramiding o il grid trading che può richiedere più di un ordine aperto per un simbolo, un codice di tracciamento degli ordini relativamente semplice aggiunto all'EA può essere tutto ciò che è necessario per gestire la strategia.  Ciò sarà possibile solo se l'EA non condividerà mai posizioni con un altro EA che negozia lo stesso simbolo.

2.3 Più di un EA di qualsiasi tipo per simbolo per account

Questo presenta i requisiti di trading e codifica i più complessi ed è la ragione per lo sviluppo della libreria Virtual Order Manager (VOM).  Questa libreria ha lo scopo di semplificare notevolmente lo sviluppo di un solido codice EA che è pienamente socievole nei confronti degli altri EA.

Il resto di questo articolo descrive in dettaglio la libreria di Virtual Order Manager.


3. Obiettivi di progettazione, vantaggi e svantaggi del Virtual Order Manager 

Il VOM ha quattro obiettivi principali di progettazione:

  1. Socievolezza:il comportamento degli EA scritti correttamente utilizzando le funzioni di trading VOM sarà isolato dalle altre attività di EA
  2. Robustezza: gestione elegante di eventi anomali come errori, interruzioni nella comunicazione client-server e riempimenti di ordini incompleti.
  3. Facilità d'uso: fornitura di funzioni di trading ben documentate e semplici
  4. Possibilità di utilizzo nello Strategy Tester

Questi obiettivi sono implementati come segue:

  • Utilizzo di ordini aperti virtuali, ordini in sospeso, stoploss e takeprofits.  "Virtuale" in questo contesto significa che il loro stato viene mantenuto al terminale client indipendentemente dalle posizioni sul server.  Questi ordini hanno linee orizzontali disegnate sul terminale in modo simile alle posizioni
  • Un arresto di protezione basato su un server ha mantenuto una distanza dalle interruzioni virtuali per la protezione da disastri in caso di guasto del PC o del collegamento Internet

L'approccio VOM consente a un programmatore MQL5 EA di:

  • Codice EA in modo "order-centric", cioè simile all'approccio MetaTrader 4
  • Implementare ciò che molti nella comunità Metatrader chiamano "hedge trading" o, più precisamente, operazioni simultanee nella direzione opposta contro un singolo simbolo 
  • Codifica altre strategie di trading avanzate in modo relativamente semplice come il grid trading, la piramide e gli approcci di gestione del denaro
  • Arresti di emissione e ordini in sospeso più stretti del livello minimo di arresto

Va anche notato che un effetto collaterale dell'approccio VOM è che i suoi stoploss virtuali, i takeprofit e gli ordini in sospeso hanno intrinsecamente un comportamento "stealth", cioè non possono essere visti sul server del broker.  Nascondere i livelli di stoploss è visto da alcuni come necessario per impedire al broker di essere in grado di impegnarsi in stop-hunting.

Il VOM presenta anche degli svantaggi.  La quantità di rischio azionario è aumentata a causa della possibilità di fare affidamento sull'arresto del server protettivo più distante durante un errore esteso del PC o del collegamento Internet.  Inoltre, lo slippage quando si colpisce un ordine virtuale in sospeso, stoploss o takeprofit potrebbe essere molto più alto rispetto al suo equivalente basato sul server durante i periodi di elevata volatilità come gli eventi di notizie.  L'impatto di questi svantaggi può essere ridotto al minimo se gli EA VOM vengono scambiati da un desktop virtuale ad alta affidabilità con un breve tempo di ping al server del broker.


4. Il VOM nella pratica – un semplice EA

Prima di andare oltre, è il momento di mostrare come un VOM EA può essere scritto.  Scriveremo un semplice MA cross EA, a partire dal modello EA fornito nel pacchetto di distribuzione.  Useremo la Media Mobile Frattale, che ha il potenziale per ridurre le negoziazioni inutili durante i mercati laterali, un noto problema con le strategie incrociate MA. Va sottolineato che questo EA è stato fornito come semplice esempio e non è raccomandato per il trading dal vivo: il backtest è redditizio ma il basso numero di operazioni significa che il risultato non è statisticamente significativo.

L'EA è memorizzato in experts\Virtual Order Manager\VOM EAs.

//+------------------------------------------------------------------+
//|                                           FraMA Cross EA VOM.mq5 |
//+------------------------------------------------------------------+
#property copyright "Paul Hampton-Smith"
#property link      "http://paulsfxrandomwalk.blogspot.com"
#property version   "1.00"

// this is the only include required.  It points to the parent folder
#include "..\VirtualOrderManager.mqh"

input double   Lots=0.1;
input int      Fast_MA_Period=2;
input int      Slow_MA_Period=58;
/* 
Because the broker is 3/5 digit, stoplosses and takeprofits should be x10.  
It seems likely that all brokers offering MetaTrader 5 will be 3/5 digit brokers, 
but if this turns out to be incorrect it will not be a major task to add 
digit size detection. */
input int      Stop_Loss=5000;
input int      Take_Profit=0;
/*
We can also change the level of logging.  LOG_VERBOSE is the most prolific 
log level.  Once an EA has been fully debugged the level can be reduced to 
LOG_MAJOR.  Log files are written under the files\EAlogs folder and are 
automatically deleted after 30 days.  */
input ENUM_LOG_LEVEL Log_Level=LOG_VERBOSE;

// The following global variables will store the handles and values for the MAs 
double g_FastFrAMA[];
double g_SlowFrAMA[];
int g_hFastFrAMA;
int g_hSlowFrAMA;
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
   LogFile.LogLevel(Log_Level);

// Need to include this line in all EAs using CVirtualOrderManager  
   VOM.Initialise();
   Comment(VOM.m_OpenOrders.SummaryList());

   g_hFastFrAMA = iFrAMA(_Symbol,_Period,Fast_MA_Period,0,PRICE_CLOSE);
   g_hSlowFrAMA = iFrAMA(_Symbol,_Period,Slow_MA_Period,0,PRICE_CLOSE);
   ArraySetAsSeries(g_FastFrAMA,true);
   ArraySetAsSeries(g_SlowFrAMA,true);

   return(0);
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
// Need to include this line in all EAs using CVirtualOrderManager  
   VOM.OnTick();
   Comment(VOM.m_OpenOrders.SummaryList());

// We now obtain copies of the most recent two FrAMA values in the 
// g_FastFrAMA and  g_SlowFrAMA arrays.  
   if(CopyBuffer(g_hFastFrAMA,0,Shift,2,g_FastFrAMA)!=2) || 
      CopyBuffer(g_hSlowFrAMA,0,Shift,2,g_SlowFrAMA)!=2)
     {
      Print("Not enough history loaded");
      return;
     }

// And now we detect a cross of the fast FrAMA over the slow FrAMA,
// close any opposite orders and Buy a single new one
   if(g_FastFrAMA[0]>g_SlowFrAMA[0] && g_FastFrAMA[1]<=g_SlowFrAMA[1])
     {
      VOM.CloseAllOrders(_Symbol,VIRTUAL_ORDER_TYPE_SELL);
      if(VOM.OpenedOrdersInSameBar()<1 && VOM.OpenOrders()==0)
        {
         VOM.Buy(_Symbol,Lots,Stop_Loss,Take_Profit);
        }
     }

// Opposite for Sell
   if(g_FastFrAMA[0]<g_SlowFrAMA[0] && g_FastFrAMA[1]>=g_SlowFrAMA[1])
     {
      VOM.CloseAllOrders(_Symbol,VIRTUAL_ORDER_TYPE_BUY);
      if(VOM.OpenedOrdersInSameBar()<1 && VOM.OpenOrders()==0)
        {
         VOM.Sell(_Symbol,Lots,Stop_Loss,Take_Profit);
        }
     }
  }
//+------------------------------------------------------------------+

E ora con il rilascio dello Strategy Tester può essere testato in backtesting, vedi Figura 1 di seguito:

 Figura 1. FrAMA Cross EA backtest

Figura 1. FrAMA Cross EA backtest

La sezione di registrazione è illustrata nella Figura 2:

 Figura 2. Registro dei test strategici

Figura 2. Log dello Strategy Tester

 

5. Struttura VOM

La Figura 4 seguente mostra come sono configurati più VOM EA:

Figura 3. VOM EA multipli

Figura 3. EA VOM multipli

Quindi, guardando all'interno del VOM, i componenti principali sono mostrati nella Figura 4 di seguito:

Figura 4. Struttura interna del VOM

Figura 4. Struttura interna del VOM

 Elementi della figura 4 spiegati:

  • Configurazione: VOM utilizza CConfig per archiviare tutti gli elementi di configurazione principali in un'unica posizione in un oggetto Config globale. Per semplificare l'accesso, le variabili membro sono pubbliche e non vengono fornite funzioni get/set.
  • Variabili globali - queste sono le variabili a cui si accede in MQL5 da funzioni come GlobalVariableGet(). Il VOM utilizza le variabili globali  per
    • Registrare e incrementare l'ultimo numero di biglietto dell'ordine virtuale utilizzando CGlobalVariable
    • Mantenere un elenco di tutte le interruzioni virtuali in modo che le interruzioni del server di protezione dalle catastrofi possano essere mantenute
  • Trade aperti e file di cronologia - questi sono i file del disco permanente memorizzati da CVirtualOrderArrays per garantire che lo stato dell'ordine possa essere ristabilito al riavvio.  Una coppia di questi file viene creata e archiviata in File\\VOM per ogni EA che utilizza voM.  Un oggetto CVirtualOrder inizia la sua vita nell'array VOM.m_OpenOrders e viene trasferito all'array VOM.m_OrderHistory quando viene chiuso o eliminato.
  • Log di attività e debug: la maggior parte del codice di qualsiasi complessità richiede la capacità di registrare l'attività e questa funzione è incapsulata dalla classe CLog. Ciò consente di registrare il logging a quattro diversi livelli di dettaglio e importanza e include la pulizia automatica dei vecchi file di registro per garantire la gestione dello spazio su disco.

Gli Expert Advisor che utilizzano il VOM interagiscono con la libreria, come illustrato nella Figura 5 riportata di seguito:

 Figura 5. Interazione EA con la libreria VOM

Figura 5. Interazione EA con la libreria VOM


6. Maggiori informazioni sullo stoploss per la protezione dalle catastrofi

Le fermate virtuali sono state abbastanza comuni tra gli EA MetaTrader 4.  Se uno stoploss viene mantenuto solo alla fine del cliente, il livello di uscita per un trade è invisibile al broker, una strategia spesso implementata nella convinzione che alcuni broker si impegnino nella caccia allo stop.  Da soli, gli stop virtuali aumentano notevolmente il rischio di trade dal momento che una connessione broker-cliente deve essere sempre in atto affinché lo stop venga agito. 

Il VOM controlla questo rischio mantenendo uno stop basato su server a una distanza configurabile dall'arresto virtuale più stretto.  Questo è definito un arresto di protezione da disastro (DPSL) perché normalmente verrà eseguito solo se la connessione broker-client viene interrotta per qualche tempo, come sarebbe la situazione con un'interruzione della connessione Internet o un guasto del PC.  Poiché gli ordini virtuali vengono aperti e chiusi e convertiti in una posizione sul server, la manutenzione del DPSL al livello corretto può essere un po 'complessa, come illustrato nella sequenza seguente.

Virtual Order
Action
Prezzo
di apertura
Virtual SL Posizione
nel server
StopLoss
nel server
Commento
0.1 lotti BUY #1 2.00000 1.99000 0.1 lotti BUY 1.98500 DPSL è 50 pip sotto SL virtuale #1
0.1 lotti BUY #2 2.00000 1.99500 0,2 lotti BUY 1.99000 L'ordine virtuale #2 ha un SL più stretto quindi il DPSL
è stretto a 50 pip al di sotto di SL virtuale #2
Close #2     0.1 lotti BUY 1.98500 Tornare a un DPSL meno rigido
0.1 lotti SELL #3 2.00000 2.00500 none none Gli ordini virtuali #1 e #3 si sono annullati
a vicenda sul server
Close #1     0.1 lotti SELL 2.01000 Virtual Order #3 rimane aperto - DPSL è
ora 50 pip sopra SL virtuale #3

7. Test di Virtual Order Manager

Un progetto di queste dimensioni richiede tempo per essere testato a fondo, quindi ho scritto l’EA VirtualOrderManaerTester.mq5 per consentire agli ordini virtuali di essere creati, modificati, eliminati e chiusi facilmente con i pulsanti di comando sul grafico.  

La Figura 6 di seguito mostra un ordine di acquisto virtuale a 0,1 lotti nella finestra M5 e un ordine di acquisto virtuale di un altro lotto 0,1 aperto nella finestra H4 contro EURUSD (vedi righe di commento), con lo stato del server che mostra correttamente una posizione a 0,2 lotti acquistati. Poiché la posizione complessiva è lunga, il Disaster Protection Stoploss può essere visto al di sotto del più stretto stop di 20,0 pip.

Figura 6. Due EA concordano sulla direzione

Figura 6. Due EA concordano sulla direzione

La Figura 7 mostra ora i due EA di test con ordini virtuali opposti e nessuna posizione è aperta presso il broker:

Figura 7. Due EA con ordini virtuali opposti e nessuna posizione è aperta al broker

Figura 7. Due EA con ordini virtuali opposti e nessuna posizione è aperta presso il broker


8. Una visualizzazione molto semplice di tutti gli ordini aperti VOM

Ogni VOM EA può vedere solo i propri ordini, quindi ho scritto un EA molto semplice che raccoglie gli ordini aperti da tutti i VOM.  Il display è molto semplice e quando il tempo lo permette si potrebbe scrivere una versione migliore, magari con pulsanti di comando per eseguire azioni di modifica, eliminazione o chiusura come richiesto su ogni ordine.  L'EA è incluso nel pacchetto di distribuzione come VOM_OrderDisplay.mq5.


9. Conclusione

Al momento della stesura di questo articolo, il codice VOM è in Beta, proprio come MetaTrader 5 stesso, e il tempo dirà se il concetto VOM diventa popolare o finisce per essere considerato solo un interessante pezzo di programmazione MQL5.

Torniamo agli obiettivi di progettazione nella sezione 3 e vediamo dove siamo arrivati

  1. Socievolezza:il comportamento degli EA scritti correttamente utilizzando le funzioni di trading VOM sarà isolato dalle altre attività di EA
    • Risultato: sì, l'approccio VOM ha raggiunto questo obiettivo
  2. Robustezza: gestione elegante di eventi anomali come errori, interruzioni nella comunicazione client-server e riempimenti di ordini incompleti.
    • Risultato: una certa robustezza è evidente, ma potrebbe esserci un miglioramento man mano che si verificano situazioni di trading reali e possono essere analizzate 
  3. Facilità d'uso: fornitura di funzioni di trading ben documentate e semplici
    • Risultato- Come si vedrà nel pacchetto di distribuzione dei file, è incluso un file della guida .chm
  4. Possibilità di utilizzo nello Strategy Tester
    • Risultato:- i test iniziali nello strategy tester rilasciato di recente indicano che il VOM esegue correttamente il backtest, sebbene l'approccio VOM rallenti notevolmente il test.  Probabilmente è necessario un po 'di lavoro per migliorare la produttività  

Una serie di cambiamenti futuri potrebbe essere ideale

  • Come per qualsiasi sviluppo software complesso, è probabile che ci siano bug rimanenti nel codice
  • Con ogni versione della build Beta di MetaTrader 5 potrebbero essere necessarie modifiche VOM per mantenere la compatibilità
  • Funzioni VomGetLastError() e VomErrorDescription()
  • Possibilità di leggere la configurazione da un file
  • Trailing stop di vario tipo


10. File nel pacchetto di distribuzione compresso

Il pacchetto VOM viene fornito come un numero di file .mqh che devono essere installati in una cartella Experts\Virtual Order Manager,

  • ChartObjectsTradeLines.mqh - CEntryPriceLine, CStopLossLine, CTakeProfitLine
  • StringUtilities.mqh - descrittori di enum globali come ErrorDescription()
  • Log.mqh - CLog
  • GlobalVirtualStopList.mqh - CGlobalVirtualStopList
  • SimpleChartObject.mqh - CButton, CLabel e CEdit
  • VirtualOrder.mqh - CVirtualOrder
  • GlobalVariable.mqh - CGlobalVariable
  • VirtualOrderArray.mqh - CVirtualOrderArray
  • VirtualOrderManager.mqh - CVirtualOrderManager
  • VirtualOrderManagerConfig.mqh - CConfig
  • VirtualOrderManagerEnums.mqh - i vari enumerazione definiti per il VOM
  • VOM_manual.mqh - questa pagina del manuale
  • VOM_doc.chm***

Cinque file EA mq5 sono inclusi anche in Experts\Virtual Order Manager\VOM EAs:

  • VOM_template_EA.mq5 - clonalo per creare i tuoi EA e archiviali in Experts\Virtual Order Manage\VOM EAs
  • VirtualOrderManagerTester.mq5
  • Support_Resistance_EA_VOM.mq5
  • FrAMA_Cross_EA_VOM.mq5
  • VOM_OrderDisplay.mq5 

Potrebbe essere necessario sbloccare il file VOM_doc.chm:


Tradotto dall’inglese da MetaQuotes Ltd.
Articolo originale: https://www.mql5.com/en/articles/88

File allegati |
vom-doc.zip (727.63 KB)
vom2_0.zip (608.43 KB)
vom-sources.zip (40.33 KB)
Un Esempio di un Sistema di Trading Basato su un Indicatore Heiken-Ashi Un Esempio di un Sistema di Trading Basato su un Indicatore Heiken-Ashi
In questo articolo esaminiamo la questione dell'utilizzo di un indicatore Heiken-Ashi nel trading. Sulla base di questo indicatore, viene considerato un semplice sistema di trading e viene scritto un Expert Advisor MQL5. Le operazioni di trading sono implementate sulla base delle classi della libreria di classi Standard. I risultati dello Strategy Tester di trading recensito, si basano sulla cronologia e sono ottenuti utilizzando lo Strategy Tester MetaTrader 5 integrato, sono forniti nell'articolo.
Creazione di un Indicatore Multivaluta, Utilizzando un Numero di Buffer di Indicatori Intermedi Creazione di un Indicatore Multivaluta, Utilizzando un Numero di Buffer di Indicatori Intermedi
C'è stato un recente aumento di interesse per le analisi dei cluster del mercato FOREX. MQL5 apre nuove possibilità di ricerca delle tendenze del movimento delle coppie di valute. Una caratteristica fondamentale di MQL5, che lo differenzia da MQL4, è la possibilità di utilizzare un numero illimitato di buffer indicatori. Questo articolo descrive un esempio di creazione di un indicatore multivaluta.
Guida alla scrittura di una DLL per MQL5 in Delphi Guida alla scrittura di una DLL per MQL5 in Delphi
L'articolo descrive il meccanismo per creare un modulo DLL, utilizzando il popolare linguaggio di programmazione ObjectPascal, all'interno di un ambiente di programmazione Delphi. I materiali, forniti in questo articolo, sono progettati principalmente per i programmatori principianti che stanno affrontando dei problemi, che violano i confini del linguaggio di programmazione integrato di MQL5, collegando i moduli DLL esterni.
Migrazione da MQL4 a MQL5 Migrazione da MQL4 a MQL5
Questo articolo è una guida rapida alle funzioni del linguaggio MQL4, ti aiuterà a migrare i tuoi programmi da MQL4 a MQL5. Per ogni funzione MQL4 (ad eccezione delle funzioni di trading) vengono presentate la descrizione e l'implementazione MQL5, che consente di ridurre significativamente il tempo di conversione. Per comodità, le funzioni MQL4 sono suddivise in gruppi, in modo simile a MQL4 Reference.