English Русский 中文 Español Deutsch 日本語 Português 한국어 Français Türkçe
Trading bidirezionale e copertura delle posizioni in MetaTrader 5 utilizzando il pannello HedgeTerminal, parte 1

Trading bidirezionale e copertura delle posizioni in MetaTrader 5 utilizzando il pannello HedgeTerminal, parte 1

MetaTrader 5Trading | 12 gennaio 2022, 11:45
704 0
Vasiliy Sokolov
Vasiliy Sokolov

Sommario


Introduzione

Negli ultimi 18 mesi MetaQuotes ha effettuato dei lavori di miglioramento sul consolidamento delle piattaforme MetaTrader 4 e MetaTrader 5 in un ecosistema di trading unificato. Ora entrambe le piattaforme condividono un mercato comune: Market, offrendo molti prodotti da sviluppatori esterni. Anche i compilatori per entrambe le piattaforme sono stati uniti. Di conseguenza entrambe le piattaforme hanno un compilatore comune basato su MQL5 e un linguaggio di programmazione - MQL con un diverso set di funzioni a seconda della piattaforma in uso. Sono stati inoltre rivisti tutti i codici sorgente pubblicamente disponibili situati nel Code Base e alcuni di essi sono stati adattati per essere compatibili con il nuovo compilatore.

Questa importante unificazione delle piattaforme non ha tenuto conto dell'unificazione delle loro parti di trading. I modelli di trading di MetaTrader 4 e MetaTrader 5 sono ancora fondamentalmente incompatibili nonostante il fatto che la maggior parte dell'ambiente di trading sia condiviso. MetaTrader 4 facilita la gestione individuale delle posizioni di trading attraverso il sistema di ordini, ovvero entità di programmi speciali che semplificano il trading bidirezionale in questo terminale. MetaTrader 5 è inteso per il commercio di scambio in cui la rappresentazione principale degli obblighi di un trader è la sua posizione netta aggregata. Gli ordini in MetaTrader 5 sono semplicemente istruzioni per acquistare o vendere uno strumento finanziario.

La differenza tra le prestazioni di trading di queste due piattaforme ha generato accese discussioni. Tuttavia, le discussioni sono rimaste discussioni. Sfortunatamente, dall’uscita di MetaTrader 5, non è stata pubblicata una sola soluzione funzionante che potesse consentire di presentare gli obblighi di un trader come posizioni bidirezionali, come in MetaTrader 4. Sebbene numerosi articoli pubblicati suggeriscano varie soluzioni, non sono abbastanza flessibili da essere convenientemente utilizzati su larga scala. Inoltre, nessuna di queste decisioni è adatta per il trading in borsa, che comporta molte sfumature che devono essere prese in considerazione.

Questo articolo dovrebbe calmare le polemiche tra i fan della quarta e della quinta versione della piattaforma MetaTrader. Ciò fornirà una soluzione universale sotto forma di specifiche del programma e sottoforma di soluzione esatta del programma implementata da questa specifica. Questo articolo discute un pannello visivo e la libreria di virtualizzazione HedgeTerminal, che consentono di presentare l'obbligo di un trader come posizioni bidirezionali come in MetaTrader 4. Allo stesso tempo, il modello sottostante HedgeTerminal tiene conto del carattere dell'esecuzione degli ordini di negoziazione. Ciò significa che può essere implementato con successo sia nel mercato FOREX over-the-counter che negli scambi centralizzati come, ad esempio, il trading di titoli derivati nella sezione dei derivati di Moscow Exchange.

HedgeTerminal è un terminale di trading completo all'interno del terminale MetaTrader 5. Attraverso il meccanismo di virtualizzazione esso cambia la rappresentazione delle posizioni attuali in modo che un trader o un robot di trading possano gestire le proprie posizioni di trading individuali. Né il numero delle posizioni, né la loro direzione hanno alcuna importanza. Vorrei porre l'accento sul fatto che stiamo parlando di virtualizzazione - un meccanismo specifico che trasforma la presentazione degli obblighi di un trader ma non le loro caratteristiche qualitative.

Non si tratta di distorcere i risultati dell'attività finanziaria del trader, ma di trasformare la rappresentazione di questa attività. HedgeTerminal si basa sull'ambiente di trading MetaTrader 5 e sul linguaggio di programmazione MQL5. Non porta nuove informazioni di trading al terminale, semplicemente ci fa cedere l’ambiente di trading attuale da una prospettiva diversa. Ciò significa che HedgeTerminal è essenzialmente MetaTrader 5 ed è la sua applicazione nativa. Anche se potremmo mettere il simbolo ‘uguale’ tra di loro, un segno di inclusione è più appropriato in quanto HedgeTerminal è solo una piccola e una delle tante applicazioni MetaTrader 5.

La possibilità di virtualizzazione e l'esistenza di HedgeTerminal si basano su tre paradigmi:

  1. Concettualmente è possibile garantire una completa convertibilità della rappresentazione netta delle posizioni in singole operazioni di negoziazione bidirezionali. Questa affermazione dimostra il fatto che in alcune piattaforme di trading esterne, comprese quelle progettate per il trading in borsa, esiste un mezzo per gestire le posizioni bidirezionali;
  2. Il modello di trading di MetaTrader 5 a livello dell'utente consente di creare collegamenti unidirezionali di ordini tra loro. I calcoli hanno dimostrato che i collegamenti progettati in un certo modo saranno resistenti alle collisioni. Inoltre, anche in caso di anamnesi corrotta o di eventuali situazioni di forza maggiore, le operazioni bidirezionali potrebbero essere rettificate retroattivamente e ricondotte ad un risultato finanziario calcolato a rappresentazione netta;
  3. L'API avanzata in MQL5 consente di inserire il segno di identità tra MQL5 e il terminale MetaTrader 5. In altre parole, quasi tutto in MetaTrader 5 è accessibile tramite l'interfaccia del programma e il linguaggio di programmazione MQL5. Ad esempio, la tua versione del terminale può essere scritta all'interno del terminale MetaTrader 5 come HedgeTerminal.

Questo articolo illustra gli algoritmi sottostanti e il funzionamento di HedgeTerminal. Le specifiche e gli algoritmi che garantiscono un trading bidirezionale coerente sono discussi in dettaglio in questo articolo. Indipendentemente dal fatto che tu decida di utilizzare HedgeTerminal o di creare la tua libreria per gestire i tuoi algoritmi di trading, troverai informazioni utili in questo articolo e nella sua continuazione.

Questo articolo non si rivolge specificamente ai programmatori. Se non hai alcuna esperienza nella programmazione, lo capirai comunque. Il codice sorgente MQL non è incluso deliberatamente in questo articolo. Tutto il codice sorgente è stato sostituito con diagrammi, tabelle e immagini più illustrativi, che rappresentano schematicamente il principio di funzionamento e l'organizzazione dei dati. Posso dire per esperienza che anche avendo una buona conoscenza dei principi di programmazione, è molto più facile vedere un modello comune del codice che analizzarlo.

Nella seconda parte di questo articolo, parleremo dell'integrazione di Expert Advisors con la libreria di visualizzazione HedgeTerminalAPI e quindi in questo caso parleremo di programmazione. Tuttavia, anche in quel caso, si è fatto di tutto per facilitare la comprensione del codice soprattutto per i programmatori alle prime armi. Ad esempio, le costruzioni orientate agli oggetti come le classi, non vengono utilizzate sebbene HedgeTerminal sia un'applicazione orientata agli oggetti.


Come leggere questo articolo

Questo articolo è piuttosto lungo. Da un lato, questo è positivo poiché la risposta a praticamente qualsiasi domanda su questo argomento può essere trovata qui. Molti utenti, invece, preferiscono leggere solo le informazioni più importanti leggendo le sezioni che gli servono in quel momento. Questo articolo copre per intero in modo coerente tutto materiale. Come per i libri, forniremo un breve riassunto di ogni capitolo per facilitare l’orientamento del lettore.

  • Parte 1, Capitolo 1. Teoria dell'organizzazione commerciale bidirezionale. Questo capitolo contiene le funzioni principali di HedgeTerminal. Se non desideri informazioni approfondite sull'organizzazione del trading bidirezionale, questo capitolo è sufficiente per avere un'idea dei principi generali del funzionamento di HedgeTerminal. Questo capitolo è consigliato a tutti i lettori.

  • Parte 1, Capitolo 2. Installazione di HedgeTerminal, primo avvio. Questo capitolo descrive l'avvio e la configurazione del pannello visivo di HedgeTerminal. Se non hai intenzione di utilizzare un pannello visivo di HedgeTerminal, puoi saltare questo capitolo. Se, tuttavia, utilizzerai la libreria HedgeTerminalAPI, dovrai esaminare le sezioni 2.1 e 2.2 di questo capitolo. Sono dedicate al programma di installazione di HedgeTerminal. Il programma di installazione è il componente comune a tutti i prodotti HedgeTerminal.

  • Parte 1, Capitolo 3. Esploriamo in dettaglio HedgeTerminal. Caratteristiche e principio di funzionamento. Questo capitolo evidenzia la disposizione interna di HedgeTerminal, il suo algoritmo e l'organizzazione interna dei dati. Coloro che sono interessati al trading bidirezionale possono trovare questo capitolo interessante. Anche i trader algoritmici professionisti che sviluppano le proprie librerie di virtualizzazione e utilizzano molti robot contemporaneamente possono trovare utile questo capitolo.

  • Parte 2, Capitolo 1. Comunicazione tra Expert Advisor con HedgeTerminal e il suo pannello. Questo capitolo piacerà sia a coloro che stanno solo esplorando questo aspetto, sia a coloro che sono professionisti del trading algoritmico. Descrive i principi comuni di lavoro con la libreria HedgeTerminal e l'architettura del trading robot.

  • Parte 2, Capitolo 2. Documentazione per l'API HedgeTerminal. Contiene la documentazione sull'utilizzo delle funzioni della libreria HedgeTerminalAPI. Il capitolo è scritto sotto forma di elenco di documentazione a cui si può fare riferimento a seconda del bisogno. Non sono presenti discussioni inutili e testi troppo lunghi. Questo capitolo contiene solo prototipi di funzioni, strutture ed enumerazioni, nonché brevi esempi del loro utilizzo.

  • Parte 2, Capitolo 3. Nozioni di base sulle operazioni di trading asincrono. HedgeTerminal utilizza operazioni asincrone. Questo capitolo parla dell'esperienza durante il loro utilizzo. In questo capitolo ogni lettore dovrebbe poter trovare alcune informazioni utili indipendentemente da cosa vuole fare, per utilizzare HedgeTerminal nel proprio lavoro.

  • Parte 2, Capitolo 4. Nozioni di base sulla programmazione multi-thread nell'ambiente MetaTrader. Questo capitolo spiega cos'è il multi-threading, come organizzarlo e quali modelli di organizzazione dei dati possono essere utilizzati. Come il Capitolo 3, questo capitolo descrive agli utenti di MetaTrader l'esperienza dello sviluppo di applicazioni multi-thread.

Spero che questo articolo sia abbastanza interessante da leggerlo fino alla fine.


Capitolo 1. Teoria organizzativa del trading bidirezionale

1.1. MetaTrader 5 opportunità nell'organizzazione del trading bidirezionale

L'articolo "Principi del prezzo di scambio attraverso l'esempio del mercato dei derivati della borsa di Mosca" descrive attentamente le sfumature della formazione del prezzo di scambio e i metodi di calcolo dei risultati finanziari degli attori del mercato. Dice che i prezzi e il calcolo sulla Borsa di Mosca differiscono significativamente dai concetti e dai metodi di calcolo accettati nel commercio FOREX.

Nel complesso, la formazione del prezzo di scambio è più complessa e contiene molti dettagli significativi nascosti durante il trading Forex e nel terminale MetaTrader 4.

Ad esempio, in MetaTrader 4 le operazioni che hanno eseguito l'ordine del trader sono nascoste mentre in MetaTrader 5 tali informazioni sono disponibili. D'altra parte, non sono sempre richieste informazioni dettagliate sul commercio in MetaTrader 5. Questo potrebbe rendere difficile il lavoro di un utente inesperto o di un programmatore alle prime armi e causare malintesi. Ad esempio, in MetaTrader 4, per scoprire il prezzo dell'ordine eseguito, è sufficiente cercare il valore corrispondente nella colonna "Prezzo". Nel linguaggio di programmazione MQL4, è sufficiente chiamare la funzione OrderOpenPrice() In MetaTrader 5 è necessario trovare tutte le operazioni che hanno eseguito l'ordine, esaminarle e calcolare il prezzo medio ponderato. Questo prezzo è il prezzo dell'esecuzione dell'ordine.

Ci sono altre situazioni in cui la rappresentazione estesa dell'ambiente di trading in MetaTrader 5 richiede ulteriori sforzi per analizzare queste informazioni. Ciò fa sorgere domande logiche:

C'è un modo per rendere il processo di trading in MetaTrader 5 semplice e chiaro come in MetaTrader 4 e mantenere un comodo accesso a tutti i dettagli di trading richiesti? Esiste un modo per organizzare lo scambio bidirezionale utilizzando MetaTrader 5 nello stesso modo semplice di MetaTrader 4? - La risposta a queste domande è: "Si C'è"!

Facciamo riferimento al diagramma delle capacità dei terminali MetaTrader 4 e MetaTrader 5 per capire come ciò sia possibile:

Fig. 1 Funzionalità di MetaTrader 4 e MetaTrader 5

Fig. 1 Funzionalità di MetaTrader 4 e MetaTrader 5

Come possiamo vedere, il set "MetaTrader 5" include il sottoinsieme "MetaTrader 4". Significa che tutto quello che si può fare in MetaTrader 4 può essere fatto in MetaTrader 5 mentre il contrario è falso. Le nuove funzionalità di MetaTrader 5 aumentano inevitabilmente la quantità e la complessità della presentazione delle informazioni commerciali. Questa difficoltà può essere delegata a speciali programmi di assistenza che lavorano nell'ambiente MetaTrader 5. Questi programmi possono sopportare questa complessità, lasciando le capacità del terminale allo stesso livello. Uno di questi programmi HedgeTerminal è appunto l’argomento principale di questo capitolo.

HedgeTerminal è un terminale di trading a tutti gli effetti, creato all'interno del terminale MetaTrader 5. Utilizza l'ambiente di trading MetaTrader 5, lo trasforma con il linguaggio MQL5 e lo visualizza come una comoda interfaccia grafica - pannello HedgeTerminalUltimate e interfaccia speciale HedgeTerminalAPI per l'interazione con algoritmi indipendenti (Expert Advisor, script e indicatori).

MetaTrader 4 offre la possibilità di utilizzare posizioni bidirezionali o ordini di blocco. In MetaTrader 5 c'è anche questa capacità, ma non è esplicita. Può essere abilitata utilizzando un programma aggiuntivo specifico, che essenzialmente è HedgeTerminal. HedgeTerminal è costruito in MetaTrader 5 e utilizza il suo ambiente, raccogliendo informazioni tramite offerte e ordini trasformandole in posizioni integrate molto simili agli ordini in MetaTrader 4 e con tutte le funzionalità di MetaTrader 5.

Tali posizioni possono essere in un ordine di blocco completo o parziale (quando esistono contemporaneamente posizioni lunghe e corte attive). L'opportunità di mantenere tali posizioni non è un obiettivo in sé per HedgeTerminal. Il suo obiettivo principale è congregare le informazioni di trading in gruppi unificati (posizioni) in modo che siano facili da analizzare, gestire e di facile accesso. Le posizioni bidirezionali possono esistere in HedgeTerminal solo perché è molto conveniente. Nel caso in cui più trader stiano negoziando su un conto, o venga utilizzata più di una strategia, è necessario organizzare azioni di trading frazionate.

Inoltre, è necessario prendere in considerazione una serie di sfumature nel trading di borsa come l'esecuzione parziale dell'ordine, il rollover della posizione, il calcolo del margine di variazione, le statistiche ecc. HedgeTerminal è stato sviluppato per affrontare queste sfide. Fornisce all'utente o a un Expert Advisor un'interfaccia standard di alto livello simile a MetaTrader 4 e allo stesso tempo funziona correttamente nell'ambiente di scambio.


1.2. Ordini di abbinamento - le basi del Hedging e statistiche

Per poter gestire tecniche e algoritmi di trading in modo coerente, è necessario sapere con certezza quale azione di trading appartiene a quale algoritmo.  Ho evidenziato le parole "con certezza" perché se c'è anche la più piccola probabilità di fallimento, è inevitabile che si verifichi un crash della gestione della posizione. A sua volta, questo potrebbe danneggiare le statistiche e compromettere l'idea di gestire algoritmi diversi su un unico account.

Una separazione affidabile delle attività commerciali si basa su due casi possibili:

  1. La possibilità di unire o "accoppiare" due ordini di negoziazione tra loro in modo da poter sempre definire quale dei due ordini apre la singola posizione (virtuale) e quale chiude tale posizione;
  2. L'algoritmo, analizzando gli ordini per il loro abbinamento, deve essere completamente deterministico e unificato per tutti i moduli del programma.

Il secondo requisito per il determinismo dell'algoritmo sarà considerato in dettaglio di seguito. Ora ci concentreremo sul primo.

Un ordine è un'istruzione per vendere o acquistare. Un ordine è un'entità definita, che include molti più "campi" di informazioni oltre alle informazioni principali come il numero magico e il numero d'ordine, prezzo richiesto e condizioni di apertura.

Uno di questi campi in MetaTrader 5 si chiama "Order Magic". Questo è un campo specifico utilizzato da un robot di trading o da un Expert Advisor per poter contrassegnare questo ordine con il suo numero univoco individuale chiamato anche "numero magico". Questo campo non viene utilizzato nel commercio manuale sebbene sia molto importante per gli algoritmi di trading: quando un algoritmo di trading analizza i valori di questo campo, può sempre vedere se l'ordine in questione è stato inserito da esso o da qualsiasi altro algoritmo.

Diamo un'occhiata ad un esempio. Supponiamo di dover aprire una classica posizione lunga e poi, dopo un po’ di tempo, chiuderla. Per questo dobbiamo effettuare due ordini. Il primo ordine aprirà questa posizione e il secondo ordine la chiuderà:

Fig. 2. Ordini che formano una posizione netta storica

Fig. 2. Ordini che formano una posizione netta storica

E se al momento dell'invio al mercato scrivessimo il magic number del primo ordine nel campo "Order Magic" del secondo ordine ?

Successivamente, il campo di questo ordine può essere letto e se il valore è uguale al numero del primo ordine, allora si può sicuramente dire che il secondo ordine è correlato al primo ed è opposto ad esso, cioè un ordine di chiusura.

Su un diagramma questo accoppiamento risulterebbe così:

Fig. 3. Ordini di abbinamento

Fig. 3. Ordini di abbinamento

Nominalmente tali ordini possono essere definiti abbinati poiché il secondo ordine contiene un collegamento al primo. Il primo ordine che apre una nuova posizione può essere chiamato ordine di avvio o di apertura. Il secondo ordine può essere chiamato chiusura.

Una coppia di tali ordini può essere chiamata posizione. Per evitare confusione con il concetto di "posizione" in MetaTrader 5, chiameremo tali posizioni accoppiate bidirezionali, di hedging o posizioni HedgeTerminal. Le posizioni in MetaTrader 5 saranno chiamate posizioni nette o posizioni classiche MetaTrader 5.

Apparentemente, il numero di posizioni di HedgeTerminal e le loro direzioni, a differenza di quelle classiche, possono essere qualsiasi. Cosa succede se c'è un ordine eseguito a cui non fa riferimento nessun altro ordine? Tale ordine può essere presentato come una posizione bidirezionale attiva. Infatti, se viene effettuato un ordine opposto che contiene un collegamento a questo ordine, diventerà un ordine che chiude il primo ordine. Tali ordini diventeranno accoppiati e creeranno una posizione bidirezionale chiusa poiché il volume di due ordini sarà uguale e la loro direzione è opposta.

Quindi, definiamo cosa si intende in HedgeTerminal per posizione:

Se un ordine eseguito non è indicato da nessun altro ordine, HedgeTerminal tratta tale ordine come una posizione bidirezionale attiva.

Se un ordine eseguito è riferito a un altro ordine eseguito, allora due di tali ordini formano una coppia e vengono trattati da HedgeTerminal come una posizione storica unificata o bidirezionale chiusa.

In realtà, l'abbinamento degli ordini in HedgeTerminal è più complicato, poiché ogni ordine genera un minimo di un affare e nel commercio di scambio ci possono essere molti di questi affari. In generale, il processo di negoziazione può essere presentato come segue: un trader effettua un ordine per aprire una nuova posizione tramite il terminale MetaTrader 5. Lo scambio esegue questo ordine attraverso una o più operazioni.

Le offerte, come gli ordini, contengono campi per ulteriori informazioni. Uno di questi campi contiene l'id dell'ordine, in base al quale l'operazione è stata eseguita. Questo campo contiene informazioni sull'ordine a cui appartiene un determinato affare. Il contrario è falso. L'ordine non sa quali operazioni gli appartengano. Questo succede perché al momento dell'ordine non è chiaro quali operazioni eseguiranno l'ordine e se l'ordine verrà eseguito.

In questo modo si osserva la causalità o il determinismo delle azioni. Le offerte si riferiscono agli ordini e gli ordini si riferiscono l'uno all'altro. Tale struttura può essere presentata come una lista collegata singolarmente.

Le operazioni eseguite dell'ordine di apertura generano una posizione classica in MetaTrader 5 e le operazioni che appartengono a un ordine di chiusura, al contrario, chiudono questa posizione. Queste coppie sono rappresentate nella figura seguente:

Fig. 4. Schema della relazione tra ordini, offerte e scambio

Fig. 4. Schema della relazione tra ordini, offerte e scambio

Torneremo all'analisi dettagliata di questo diagramma poiché la direzione delle relazioni è molto importante per costruire un sistema rigorosamente determinato di registrazione delle azioni del trader, che è HedgeTerminal.


1.3. Relazione tra le posizioni nette di MetaTrader 5 e le posizioni di HedgeTerminal

Dal punto di vista di HedgeTerminal, due ordini opposti con gli stessi volumi possono essere due posizioni diverse. In questo caso la loro posizione netta sarà zero. Ecco perché HedgeTerminal non utilizza le informazioni sulle posizioni nette effettive aperte in MetaTrader 5. Pertanto, le posizioni in HedgeTerminal non sono collegate alle posizioni in MetaTrader 5. L'unico momento in cui le posizioni nette correnti vengono verificate è il momento del lancio di HedgeTerminal. I volumi totali delle posizioni attive opposte devono essere identici ai valori delle posizioni nette effettive.

In caso contrario, su HedgeTerminal apparirà un punto esclamativo di avviso in un riquadro, Le posizioni non sono uguali, indicando che le posizioni in HedgeTerminal e le posizioni in MetaTrader 5 non sono uguali. Questa asimmetria non pregiudica l'efficienza di HedgeTerminal, ma per continuare a fare un lavoro corretto deve essere eliminata.

Nella maggior parte dei casi, può apparire quando gli utenti commettono errori durante la modifica dei file degli ordini esclusi ExcludeOrders.xml, anche se puo apparire quando vi è una corruzione dell'ordine e della cronologia delle trattative sul server. In ogni caso, queste discrepanze possono essere rimosse dal meccanismo di esclusione implementato tramite il file ExcludeOrders.xml.


1.4. Requisiti degli algoritmi che implementano il trading bidirezionale

Requisiti piuttosto severi sono imposti agli algoritmi che implementano il trading bidirezionale. Devono essere soddisfatti durante lo sviluppo di HedgeTerminal. Altrimenti, HedgeTerminal si trasformerebbe rapidamente in un programma che funziona in modo stocastico. Il programma sarebbe "l'ennesima soluzione che potrebbe funzionare o no con la stessa probabilità"

Di seguito sono riportati alcuni requisiti specificati per il suo sviluppo:

  1. La rappresentazione delle posizioni bidirezionali dei trader deve essere affidabile. Qualsiasi idea implementata in HedgeTerminal non deve creare ad ambiguità o potenziali errori nella logica di business. Se qualche proprietà o opportunità non soddisfa questi requisiti, allora questa idea non sarà utilizzata nonostante la sua convenienza e nonostante sia molto richiesta;
  2. Tutti gli algoritmi devono essere basati il più possibile sull'ambiente di trading MetaTrader 5. La memorizzazione di informazioni aggiuntive nei file è consentita nei casi in cui ciò sia strettamente necessario. Gli algoritmi di virtualizzazione devono ricevere la maggior parte delle informazioni dall'ambiente di trading. Questa proprietà aumenta il livello totale di affidabilità in quanto la maggior parte delle modifiche viene veicolata attraverso il server e quindi accessibile da qualsiasi punto del mondo;
  3. Tutte le azioni sulla trasformazione dell'ambiente di trading devono essere eseguite dietro le quinte. Non dovrebbero essere necessarie una configurazione complessa e l'inizializzazione della libreria API HedgeTerminal. Un utente dovrebbe essere in grado di avviare l'applicazione "out of the box" e ricevere il risultato atteso;
  4. Il pannello visivo di HedgeTerminal deve adattarsi all'interfaccia generale di MetaTrader 5 nel modo più fluido possibile, fornendo strumenti visivi semplici e comprensibili per lavorare con posizioni bidirezionali familiari a tutti gli utenti di MetaTrader 4 e 5. In altre parole, il pannello visivo deve essere intuitivamente chiaro e semplice per tutti gli utenti;
  5. Il pannello visivo di HedgeTerminal deve essere progettato tenendo in considerazione gli elevati requisiti dei trader algoritmici. Ad esempio, il pannello deve essere configurabile, l'utente deve poter modificarne l'aspetto e persino aggiungere moduli personalizzati;
  6. Deve fornire un'interfaccia di programma (API) intuitiva e semplice che consenta interazioni con gli Expert esterni. La parte del programma delle interazioni tra gli esperti esterni e gli algoritmi di HedgeTerminal deve adattarsi perfettamente allo standard esistente dell'interazione del programma degli esperti personalizzati con le funzioni del sistema MetaTrader 4/5. In realtà, l'API HedgeTerminal sembra essere un ibrido tra le API MetaTrader 4 e MetaTrader 5;
  7. HedgeTerminal deve garantire un lavoro affidabile nell'ambiente di scambio, tenendo conto di tutte le sfumature dell'esecuzione degli ordini di scambio. HedgeTerminal è scritto sulla base dell'articolo canonico Principi dei prezzi di scambio attraverso l'esempio del mercato dei derivati della borsa di Mosca". Inizialmente, questo articolo faceva parte di un lungo articolo su HedgeTerminal, che in seguito è stato diviso in diversi articoli indipendenti a causa delle sue dimensioni. Si può dire che HedgeTerminal è un'implementazione del programma delle idee discusse in questo articolo.

Molte di queste idee non sono del tutto collegate tra loro. Ad esempio, è difficile mettere in relazione l'abbondanza delle informazioni di scambio che deve riflettersi nel trading di borsa, con la semplicità di questa rappresentazione delle informazioni.

Un'altra difficoltà è stata quella di creare un pannello che potesse essere facile da usare per i trader alle prime armi e allo stesso tempo fornire ampie opportunità per i trader algoritmici professionisti. Tuttavia, valutando il risultato, è chiaro che queste proprietà, che si escludono a vicenda, sono state implementate con successo in HedgeTerminal.


Capitolo 2. Installazione di HedgeTerminal, primo avvio

2.1. Installazione di HedgeTerminal

Sappiamo che tutti gli ordini eseguiti in HedgeTerminal sono considerati posizioni. Le posizioni possono consistere in due ordini accoppiati, che creano una posizione storica chiusa, o un ordine non vincolato, che crea una posizione aperta o attiva.

Se prima dell'installazione di HedgeTerminal c'erano alcune azioni sul conto di trading e la cronologia di trading contiene molti ordini eseguiti, dal punto di vista di HedgeTerminal tutti questi ordini saranno posizioni aperte, poiché i collegamenti tra di loro non sono stati creati. Non importa se la cronologia dell'account contiene 2-3 ordini eseguiti. Se ce ne sono migliaia, HedgeTerminal genererà migliaia di posizioni aperte. Cosa si può fare con queste posizioni? Questi ordini possono essere "chiusi", inserendo ordini opposti contenenti collegamenti agli ordini di avvio tramite HedgeTerminal. C'è un lato negativo però. Se al momento dell'installazione di HedgeTerminal ce ne sono troppi, questo può rovinare il trader poiché si troverà a pagare la commissione di intermediazione e le spese di slippage.

Per evitare ciò, HedgeTerminal avvia una procedura guidata di installazione dedicata all'inizio della sua installazione, in cui vengono suggerite diverse soluzioni a questo problema. Lanciamo HedgeTerminal, chiamiamo questa procedura guidata e descriviamo il suo lavoro in dettaglio. Per questo scarica e installa HedgeTerminalDemo dal MetaTrader 5 Market.

Simile a HedgeTerminalUltimate, assomiglia ad un Expert Advisor e per avviarlo basta trascinare la sua icona ( disponibile nella cartella "Navigatore" ) su un grafico libero .

Trascinando questa icona verrà visualizzata una finestra standard che suggerisce di avviare Expert Advisor sul grafico:


Fig. 5. La finestra di HedgeTerminal prima del lancio

In questa fase è sufficiente impostare il flag "Consenti AutoTrading", consentendo all'EA di eseguire azioni commerciali. HedgeTerminal seguirà i tuoi ordini in quanto non ha una propria logica di trading, ma per eseguire operazioni avrà comunque bisogno della tua autorizzazione.

Affinché qualsiasi Expert Advisor possa iniziare a fare trading, l'autorizzazione generale per il trading tramite Expert Advisor deve essere abilitata sul pannello oltre all'autorizzazione personale per fare trading in MetaTrader 5.

Fig. 6. Abilitazione del trading automatizzato

Fig. 6. Abilitazione del trading automatizzato

HedgeTerminal è stato progettato in modo da evitare configurazioni lunghe e complesse da parte dell’utente.

Ecco perché tutte le impostazioni disponibili sono incluse in uno speciale file di testo XML. L'unico parametro esplicito per HedgeTerminal è il nome effettivo di questi file di impostazione:

Fig. 7. Finestra Impostazioni del pannello HedgeTerminal

Fig. 7. Finestra delle impostazioni del pannello HedgeTerminal

La natura di queste impostazioni e il modo per modificarle verranno discussi in seguito.

Dopo aver premuto "OK", viene avviata la procedura guidata di installazione di HedgeTerminal. Il processo di installazione consiste nella creazione di alcuni file nella directory condivisa per i terminali MetaTrader 4 e MetaTrader 5.

HedgeTerminal richiede l'autorizzazione per installare tali file:


Fig. 8. Finestra di dialogo di avvio dell'installazione

Se non vuoi che alcuni file vengano installati sul tuo computer, premi "Annulla". In questo caso HedgeTerminal terminerà il lavoro. Per continuare l'installazione premere "OK".

L'aspetto della seguente finestra di dialogo dipenderà dall'account con cui avvii HedgeTerminal. Se non sono state eseguite operazioni sul conto di trading, HedgeTerminal completerà l’operazione.

Se alcune operazioni sono già state eseguite, HedgeTerminal visualizzerà la seguente finestra di dialogo:


Fig. 9. Finestra di dialogo che rileva il primo avvio di HedgeTerminal

Sulla figura qui sopra, HedgeTerminal ha identificato 5 ordini attivi. Nel tuo caso il loro numero sarà diverso (è probabile che sia grande come e uguale al numero totale di ordini eseguiti della durata dell'account). Questi ordini non fanno coppia con un ordine di chiusura in quanto dal punto di vista di HedgeTerminal, queste sono posizioni attive.

HedgeTerminal suggerisce diverse opzioni.

  1. Escludi questi ordini da HedgeTerminal: "Puoi nasconderli in HedgeTerminal... Per nascondere questi ordini, fai clic su "S" e vai al passaggio successivo". Se scegli questa opzione e premi "YES", HedgeTerminal li inserirà in una lista specifica e da quel momento smetterà di contabilizzare il loro contributo alla posizione netta aggregata così come il loro risultato finanziario. Questi ordini possono essere inseriti nella lista solo se non ci sono posizioni nette attualmente aperte. Se hai una posizione aperta su uno o più simboli, HedgeTerminal richiamerà una finestra di dialogo aggiuntiva suggerendo di chiudere le posizioni esistenti.
  2. Lascia gli ordini così come sono e chiudili in seguito, se necessario: "Puoi... chiudere manualmente più tardi... Fare clic su "No" se si desidera chiudere manualmente questi ordini in un secondo momento. In questo caso, devi eseguire 5 operazioni di direzioni opposte". In questo caso, se si preme "No", HedgeTerminal riporterà dopo il lancio tutti questi ordini nella scheda "attivi" (cioè come posizioni attive). Successivamente questi ordini possono essere chiusi con altri ordini tramite il pannello HedgeTerminal. Successivamente si trasformeranno in posizioni chiuse e verranno trasferite nella scheda "Cronologia" (posizioni storiche). Se questi ordini sono molto numerosi, è meglio nasconderli piuttosto che chiudere nuovamente tutti gli ordini eseguiti e pagare le commissioni di intermediazione.
  3. È possibile interrompere l'installazione: "Se non sei pronto per continuare, premi Annulla. In questo caso HedgeTerminal completa l’operazione". Se scegli questa opzione e premi "Annulla", HedgeTerminal interromperà il processo.

Se non sono presenti posizioni attive al momento dell'installazione di HedgeTerminal, l'installazione verrà interrotta in questa fase.

Se hai selezionato la seconda opzione e hai attualmente una o più posizioni aperte, HedgeTerminal richiamerà una finestra di dialogo aggiuntiva suggerendo di chiuderle:


Fig. 10. Finestra di dialogo che suggerisce di chiudere automaticamente le posizioni nette

HedgeTerminal richiede la chiusura di tutte le posizioni esistenti poiché tutti gli ordini eseguiti devono essere inseriti nell'elenco degli ordini esclusi. Se non ci sono posizioni nette, qualsiasi ordine successivo inizializzerà una nuova posizione netta. La direzione e il volume in questo caso sono gli stessi di HedgeTerminal e ciò garantisce di evitare la non sincronizzazione delle posizioni nette con le posizioni totali in HedgeTerminal.

HedgeTerminal può chiudere automaticamente tutte le posizioni nette: "HedgeTerminal può chiudere automaticamente tutte le posizioni attive". Se sei d’accordo, premi "OK". In questo caso il programma cercherà di chiudere le posizioni e se avrà successo terminerà il lavoro. Se per qualsiasi motivo le posizioni non possono essere chiuse, esso passerà alla finestra di dialogo di chiusura manuale della posizione. Se si seleziona la chiusura manuale della posizione, "Fare clic su 'Annulla' se si desidera chiudere manualmente una posizione", premere "Annulla".

La finestra di dialogo di chiusura della posizione manuale viene richiamata quando viene scelto il tipo di chiusura manuale nella finestra di dialogo precedente o quando la chiusura della posizione automatica è impossibile.


Fig. 11. Finestra di dialogo che suggerisce di chiudere manualmente le posizioni nette

A questo punto tutte le posizioni attive devono essere chiuse manualmente tramite MetaTrader 5 o l'installazione deve essere annullata premendo "Annulla". Dopo che tutte le posizioni sono state chiuse, premere "Riprova".


2.2. Installazione in tre fasi. Schema di installazione e soluzione dei possibili problemi

Per semplificare il più possibile il processo di installazione, esso può essere ridotto a tre passaggi:

  1. Prima di installare HedgeTerminal, chiudi tutte le posizioni nette attualmente attive nel terminale MetaTrader 5;
  2. Per avviare l'installazione, avvia HedgeTerminal sul grafico e premi "Sì" nella finestra visualizzata della procedura guidata di installazione. HedgeTerminal in questo caso installerà tutti i file necessari al suo funzionamento;
  3. Nella finestra successiva, se appare, seleziona la seconda opzione e premi "Sì". In questo caso le posizioni attive non appariranno all'avvio di HedgeTerminal e le informazioni sugli ordini eseguiti in precedenza verranno trasferite automaticamente al file ExcludeOrders.xml in quanto non ci sono posizioni attive da chiudere.

Il modo più semplice per descriverlo è il seguente: chiudi tutte le posizioni prima di avviare Hedge Terminal e quindi premi "Sì" due volte nell'installazione guidata di HedgeTerminal.

Lo schema completo della procedura guidata di installazione è rappresentato nel diagramma sottostante. Questo ti aiuterà a rispondere ad eventuali domande ed ad eseguire correttamente l'installazione:


Fig. 12. Procedura guidata di installazione

Cosa bisogna fare se l'installazione non è stata eseguita correttamente o è necessario eliminare HedgeTerminal dal computer? Nel caso in cui l'installazione fosse errata, è sufficiente eliminare tutti i file installati. Per fare questo, vai alla cartella dove i programmi per MetaTrader memorizzano le informazioni condivise (di norma si trova in: c:\Users\<your_user_name>\AppData\Roaming\MetaQuotes\Terminal\Common\Files\). Se desideri eliminare le informazioni sull'installazione di HedgeTerminal da tutti gli account, cerca la cartella "HedgeTerminal" in questa directory ed eliminala. Se desideri eliminare le informazioni sull'installazione di HedgeTerminal solo per un determinato account, vai alla directory \HedgeTerminal\Brokers e seleziona la cartella contenente il nome del tuo broker e il numero di conto che assomiglia a "Nome del broker - numero di conto". Elimina questa cartella. La prossima volta, l'installazione guidata si avvierà di nuovo all'avvio di HedgeTerminal su questo account.

Installazione sul terminale connesso all'account già funzionante con HedgeTerminal. Può succedere che HedgeTerminal debba essere installato sul terminale collegato all'account dove è già operativo HedgeTerminal. Come già saprai, il processo di installazione consiste nella creazione e configurazione dei file di sistema. Se tutti questi file sono già stati creati su un altro computer e configurati correttamente, non è necessario installare HedgeTerminal. Di norma, questi file vengono archiviati in c:\Users\<your_user_name>\AppData\Roaming\MetaQuotes\Terminal\Common\Files\HedgeTerminal. Trasferisci semplicemente questa cartella nello stesso posto sul tuo computer. Dopo aver copiato la directory, avvia nuovamente HedgeTerminal. La procedura guidata di installazione non verrà chiamata poiché tutti i file sono presenti e configurati. In questo caso le posizioni attive saranno simili alla visualizzazione su altri terminali e computer.

Installazione di HedgeTerminalAPI e utilizzo della libreria in modalità test. HedgeTerminal è implementato sia come pannello visivo che come libreria di funzioni del programma - HedgeTerminalAPI. La libreria contiene una procedura guidata di installazione simile, richiamata in tempo reale al primo avvio di HedgeTerminalAPI. L'installazione dei file quando si utilizza la libreria è simile. Alla prima chiamata di qualsiasi funzione, l'Esperto visualizzerà un MessageBox pertinente suggerendo di avviare l'installazione. In tal caso l'utente deve fare la stessa cosa: chiudere tutte le posizioni prima di chiamare HedgeTerminalAPI ed eseguire l'installazione in tre passaggi.

Non è necessario installare HedgeTerminal quando si avvia la libreria in modalità di test. Poiché in modalità test l'Esperto si avvia ogni volta che si lavora con un nuovo account virtuale, non è necessario nascondere l'ordine eseguito in precedenza e installare i file. Le impostazioni memorizzate nel file Settings.xml,, nella libreria, possono essere definite grammaticalmente richiamando le relative funzioni.


2.3. Introduzione a HedgeTerminal, primo avvio

Dopo che HedgeTerminal ha installato tutti i file necessari per poter funzionare correttamente, si avvierà sul grafico e visualizzerà il suo pannello:

Fig. 13. Come appare HedgeTerminal al suo primo avvio

Fig. 13. Come appare HedgeTerminal al suo primo avvio

Poiché tutti gli ordini esistenti sono nascosti, non vengono visualizzate posizioni attive. Il pannello superiore contiene un pulsante del menu HedgeTerminal sul lato sinistro e icone dedicate che mostrano lo stato del pannello. I pulsanti hanno le seguenti funzioni:

  •  - Indica che è stata avviata la versione demo del pannello. Questa non supporta il trading su conti reali. Essa visualizza le posizioni solo sui simboli AUDCAD e VTBR*. In questa modalità, lo storico delle posizioni è limitato anche dalle ultime 10 posizioni chiuse.
  •  - Indica che le posizioni in HedgeTerminal non sono uguali alla posizione netta totale in MetaTrader 5. Questo non è un errore critico ma è necessario eliminarlo. Se l'installazione di HedgeTerminal non è corretta, fai riferimento alla sezione di questo articolo che descrive come eliminare l'errore.
  •  - L'icona indica che è impossibile fare trading. Passa il mouse su questa icona: apparirà un suggerimento a comparsa che mostrerà dove si trova il problema. Possibili ragioni: nessuna connessione con il server; all'Expert Advisor è vietato operare; il trading con Expert Advisors non è consentito in MetaTrader 5.
  • - Questa icona indica che lo scambio è consentito; HedgeTerminal può eseguire qualsiasi azione commerciale.

Quando HedgeTerminal viene avviato ed è pronto per il lavoro, ti invitiamo ad eseguire delle operazioni e a osservare come queste vengono visualizzate. Se HedgeTerminal viene lanciato sul Forex, le azioni di trading devono essere eseguite sul simbolo AUDCAD. Non dovrebbero esserci posizioni nette aperte in quanto l'installazione di HedgeTerminal potrebbe avere successo solo in quel caso. Se questo non dovesse essere il caso per qualche motivo, chiudi tutte le posizioni attive.

Se HedgeTerminal viene lanciato su un conto collegato alla Borsa di Mosca, il trading dovrebbe essere eseguito su uno dei future del gruppo VTBR*, ad esempio VTBR-13.15 o VTBR-06.15. A titolo illustrativo, acquista 0.4 lotti di AUDCAD al prezzo corrente attraverso la finestra standard "NewOrder". In pochi istanti, l'ordine e l'operazione che lo ha eseguito si appariranno nella cronologia degli ordini del terminale:

Fig. 14. Ordine storico e relativo accordo in MetaTrader 5

Fig. 14. Ordine storico e relativo accordo in MetaTrader 5

La scheda delle posizioni attive conterrà una posizione lunga corrispondente di 0,4 lotti:

Fig. 15. Posizione netta attiva in MetaTrader 5

Fig. 15. Posizione netta attiva in MetaTrader 5

Allo stesso tempo, HedgeTerminal visualizzerà l'ordine storico come posizione attiva:

Fig. 16. Posizione bidirezionale attiva in HedgeTerminal e relativo accordo

Fig. 16. Posizione attiva bidirezionale in HedgeTerminal e la sua operazione

Come possiamo vedere, i risultati sono gli stessi, poiché una posizione in HedgeTerminal corrisponde a 1 posizione netta in MetaTrader 5.

Nota che oltre all'ordine, la posizione in HedgeTerminal contiene un accordo che ha eseguito questa posizione (per vederlo, massimizzare la stringa di posizione premendo )

Una parte di una posizione attiva può essere nascosta. Per questo è sufficiente inserire un nuovo valore di volume nel campo "Vol". (Volume). Il nuovo volume dovrebbe essere inferiore a quello attuale. La differenza tra i volumi attuali e quelli nuovi sarà coperta dal nuovo ordine che formerà una posizione storica e che verrà visualizzato nella relativa scheda delle posizioni storiche. Immettere il valore di 0,2 in questo campo e quindi premere Invio. Dopo un po’ il volume della posizione attiva sarà 0.2 e la scheda delle posizioni storiche conterrà la prima transazione storica con il volume di 0.2 lot (0.4 - 0.2 = 0.2):

Fig. 17. Posizione storica bidirezionale in HedgeTerminal

Fig. 17. Posizione storica bidirezionale in HedgeTerminal


In altre parole, abbiamo chiuso metà della nostra posizione attiva. Il risultato finanziario comune della posizione storica e attiva sarà identico al risultato nel terminale.

Ora chiuderemo il resto della posizione attiva. Per questo premere il pulsante di chiusura di una posizione in HedgeTerminal:

Fig. 18. Pulsante di chiusura di una posizione bidirezionale in HedgeTerminal

Fig. 18. Pulsante di chiusura di una posizione bidirezionale in HedgeTerminal

Dopo aver premuto questo pulsante, la posizione rimanente deve essere chiusa con l'ordine opposto e trasferita nella scheda della posizione storica. In questo modo le posizioni attive (sia in MetaTrader 5 che in HedgeTerminal) verranno chiuse.


2.4. Copertura e calcolo delle operazioni finanziarie

In questa sezione descriveremo i metodi di lavoro con HedgeTerminal utilizzando come esempio alcune posizioni bidirezionali.

Attualmente non abbiamo posizioni attive. Apri una nuova posizione lunga con il volume di 0.2 lot su AUDCAD. Per fare questo è sufficiente aprire la finestra di dialogo "nuovo ordine" ed effettuare un ordine corrispondente. Dopo che la posizione è stata aperta, bloccala nella posizione opposta: vendi 0,2 lotti tramite il terminale MetaTrader 5.

Questa volta i risultati del trading in HedgeTerminal e nella finestra del terminale MetaTrader 5 sono diversi. HedgeTerminal visualizza due posizioni:

Fig. 19. Posizioni bidirezionali opposte in HedgeTerminal (blocco)

Fig. 19. Posizioni bidirezionali opposte in HedgeTerminal (blocco)

In MetaTrader 5 non sono presenti:

Fig. 20. Assenza di una posizione netta attiva in MetaTrader 5

Fig. 20. Assenza di una posizione netta attiva in MetaTrader 5

Valutiamo il risultato. Sono stati eseguiti 4 accordi. Sono nella cornice rossa nello screenshot qui sotto:

Fig. 21. Risultato delle operazioni eseguite in MetaTrader 5

Fig. 21. Risultato delle operazioni eseguite in MetaTrader 5

Metti queste offerte in una tabella:

TipoDirezioneCostoVolumeProfitto, pips
Acquista   in0,980880,2
Sell   In uscita0,980890,21
Acquista   in0,982070,2
Sell   In uscita0,982080,21

Tabella 1. Visualizzazione delle offerte nel terminale MetaTrader 5

È ovvio che 2 punti sono stati guadagnati su 4 deal. Il valore di ogni punto è di circa 0,887 dollari quando si scambia 1 lotto. Quindi, il risultato finanziario è 0,18 dollari per posizione (0,887*0,2*1) o 34 centesimi per entrambe le posizioni. La colonna "Profitto" mostra che questo risultato è corretto. L'utile netto è di 34 centesimi.

Ora guarda il risultato in HedgeTerminal:

 Fig. 22. Risultato delle posizioni storiche bidirezionali in HedgeTerminal

Fig. 22. Risultato delle posizioni storiche bidirezionali in HedgeTerminal

All'inizio sembrano differire in modo significativo. Calcoliamo il risultato per le nostre due posizioni bidirezionali:

DirezionePrezzo d'ingressoPrezzo di uscitaProfitto, pipsProfitto
Acquista0,980880,982080.0012021,28
Sell0,980890,98207-0.00118-20,92

Tabella 2. Visualizzazione delle posizioni in HedgeTerminal

La differenza tra loro è di 0.34$ (21,28$ - 20,92$), che è esattamente lo stesso del risultato ottenuto nel trading netto.


2.5. One Click Trading

HedgeTerminal si avvale di un peculiare sistema di gestione. Ciò si basa sull'immissione diretta dei valori richiesti nel campo di posizione attivo. Non esiste una gestione alternativa.

Ad esempio, per inserire StopLoss per una posizione attiva, è sufficiente inserire il valore richiesto nel campo StopLoss e quindi premere Invio:

Fig. 23. Inserimento del livello di StopLoss direttamente al tavolo

Fig. 23. Inserimento del livello di StopLoss direttamente nella tabella

In questo modo un trader può modificare il volume, posizionare TakeProfit o modificare il livello, modificare il commento iniziale.

In generale, la linea di posizione in HedgeTerminal è simile alla visualizzazione della posizione in MetaTrader 4/5. Le colonne della tabella con le posizioni hanno nomi e valori identici utilizzati nei terminali MetaTrader. Ci sono anche differenze. Una posizione in HedgeTerminal ha due commenti mentre in MetaTrader una posizione ha un solo commento. Ciò significa che una posizione in HedgeTerminal è formata da due ordini e ciascuno di essi ha il proprio campo per i commenti. Poiché HedgeTerminal non utilizza questi commenti per memorizzare informazioni tecniche, è possibile creare una posizione con un commento di apertura e chiusura.

HedgeTerminal offre la possibilità di aggiungere colonne non altrimenti visualizzate con le impostazioni predefinite. Ad esempio, una colonna che riflette il nome dell'Expert Advisor che ha aperto la posizione. La sezione dedicata alla configurazione del file Settings.xml descrive il modo per farlo.


2.6. Posizionamento di StopLoss e TakeProfit, Trailing Stop

HedgeTerminal permette di chiudere posizioni a livello di StopLoss o TakeProfit.

Per vedere come si fa, inserisci i livelli StopLoss e TakeProfit nella posizione attiva e poi attendi che uno di questi livelli si attivi. Nel nostro caso è stato attivato TakeProfit. Ha chiuso la posizione e l'ha spostata nella lista delle transazioni storiche:

Fig. 24. Posizione storica bidirezionale e relativi livelli di StopLoss e TakeProfit

Fig. 24. Posizione storica bidirezionale e relativi livelli di StopLoss e TakeProfit

Il segno verde nel livello TakeProfit indica che TakeProfit è stato attivato e la posizione è stata chiusa da quel livello. Oltre a TakeProfit, una posizione contiene informazioni sul livello di StopLoss che è stato utilizzato anche quando la posizione era attiva. Allo stesso modo, se si attivasse il livello StopLoss, la cella StopLoss sarebbe evidenziata in rosa e TakeProfit non sarebbe colorato.

HedgeTerminal supporta TrailingStop e le versioni future consentiranno di scrivere uno specifico modulo personalizzato contenente la logica di riporto dello StopLoss. Attualmente il lavoro con Trailing Stop in HedgeTerminal è diverso dallo stesso Trailing Stop nel terminale MetaTrader. Per abilitarlo è necessario inserire il livello di StopLoss nella cella StopLoss della posizione corrispondente. Quando viene posizionato lo StopLoss, l'opzione di prezzo può essere contrassegnata nella cella contrassegnata da un segno :

Fig. 25. Posizionamento di Trailing Stop in HedgeTerminal

Fig. 25. Posizionamento di Trailing Stop in HedgeTerminal

Dopo la segnalazione, HedgeTerminal fissa la distanza tra il prezzo corrente e il livello di StopLoss. Se aumenta, StopLoss seguirà il prezzo in modo che la distanza rimanga la stessa. Trailing Stop funziona solo quando HedgeTerminal è in funzione e viene cancellato all'uscita.

In HedgeTerminal, StopLoss è implementato con gli ordini BuyStop e SellStop. Ogni volta che viene piazzato uno StopLoss, viene piazzato anche un ordine corrispondente con un numero magico connesso alla posizione attiva. Se questo ordine in sospeso viene eliminato nel terminale MetaTrader, il livello di StopLoss in HedgeTerminal scomparirà. La modifica del prezzo dell'ordine in sospeso attiverà la modifica dello StopLoss in HedgeTerminal.

TakeProfit funziona in modo leggermente diverso. Questo è virtuale e nasconde il suo livello di trigger al broker. Significa che HedgeTerminal chiude autonomamente una posizione di TakeProfit. Pertanto, se vuoi che il tuo TakeProfit si attivi, devi mantenere il tuo HedgeTerminal funzionante.


2.7. Generazione del report

HedgeTerminal permette di salvare le informazioni sulle sue posizioni bidirezionali in file designati, che possono essere caricati su programmi statistici di analisi di terze parti, ad esempio su Microsoft Excel.

Poiché attualmente HedgeTerminal non dispone di un sistema di analisi e raccolta di statistiche, questa funzione è particolarmente importante. Al momento, è supportato un solo formato di salvataggio del report: CSV (Comma-Separated Values). Vediamo come funziona. Per salvare le posizioni bidirezionali nel file CSV, selezionare l'opzione "Salva report CVS" nel menu dopo aver avviato HedgeTerminal:


Fig. 26. Salvataggio di un report tramite il menu "Salva report CSV"

Dopo aver selezionato quei punti nel menu, HedgeTerminal genererà due file in formato CSV. Uno di essi comprenderà le informazioni sulle posizioni attive e un altro su quelle storiche completate. Il motivo per cui vengono generati due file diversi è perché ognuno di essi ha un diverso insieme di colonne. Inoltre, il numero di posizioni attive può variare costantemente, quindi è più conveniente analizzarle separatamente. I file generati sono disponibili nel percorso relativo .\HedgeTerminal\Brokers\<Nome Broker - numero di conto> \. Alla fine devono esserci due file: History.csv and Active.csv. Il primo contiene informazioni sulle posizioni storiche e il secondo sulle posizioni attive.

I file possono essere caricati nei programmi statistici di analisi. Esaminiamo questa procedura utilizzando Microsoft Excel come esempio. Avvia questo programma e seleziona "Dati" -> "Dal testo". Nella procedura guidata di esportazione dei dati visualizzata, selezionare la modalità con separatori. Nella finestra successiva, seleziona il punto e virgola come separatore. Premi "Avanti". Nella finestra seguente cambia il formato generale della rappresentazione del numero in virgola mobile. Per farlo premere "Dettagli". Nella finestra visualizzata selezionare il carattere punto come separatore delle parti intere e frazionarie:

Fig. 27. Esporta il rapporto CSV in Microsoft Excel

Fig. 27. Esporta il rapporto CSV in Microsoft Excel

Premi "ОК", quindi "Fine". La tabella visualizzata conterrà informazioni sulle posizioni attive:

Fig. 28. Informazioni sulle posizioni attive esportate in Excel

Fig. 28. Informazioni sulle posizioni attive esportate in Excel

I dati sulle posizioni storiche possono essere caricati nello stesso modo nel foglio successivo. Il numero di colonne corrisponderà al numero effettivo di colonne in HedgeTerminal. Se una delle colonne viene eliminata dal pannello HedgeTerminal, non verrà inclusa nel report. Questo è un modo conveniente per formare un report basato solo sui dati richiesti.

Le versioni successive del programma consentiranno di salvare un report nei formati XML e HTML. In aggiunta a ciò, un report salvato in HTML sarà simile a un report HTML standard in MetaTrader 5, anche se sarà costituito da posizioni bidirezionali completate.


2.8. Presentazione dello scambio di valuta

Lo swap valuta è una combinazione di due operazioni di conversione bidirezionali operate sulla stessa somma con date di valutazione diverse.

In parole povere, lo swap è un'operazione derivata sulla maturazione della differenza dei tassi di interesse pagati per detenere due valute che formano una posizione netta.

Non esiste una cronologia delle posizioni nette in MetaTrader 5. Ci sono invece ordini e operazioni storici che hanno formato e chiuso posizioni nette storiche. Non essendoci posizioni storiche, lo swap viene assegnato all'ordine che chiude una posizione storica:

 Fig. 29. Lo swap di valuta come transazione indipendente

Fig. 29. Swp di valuta come transazione indipendente

Sarebbe più accurato presentare lo swap come un'operazione derivata indipendente che risulta da un prolungamento della posizione netta.

La versione corrente di HedgeTerminal non supporta la rappresentazione dello scambio sebbene le versioni successive presenteranno tale opzione. Lì uno swap verrà mostrato come una posizione storica separata nella scheda della posizione storica. L'identificativo dello swap corrisponderà all'identificativo della posizione netta su cui è stato maturato. Lo swap includerà il nome della coppia di valute e il suo risultato finanziario.


2.9. Riga inferiore

Simile a MetaTrader, HedgeTerminal mostra l'ultima riga con caratteristiche comuni per l'intero conto nella tabella delle offerte. Per la tabella delle posizioni attive e storiche queste caratteristiche ed i loro valori sono di seguito elencati:

    Saldo – Saldo totale. Pari al valore simile "Profitto" nella finestra delle posizioni attive in MetaTrader. Ciò non tiene conto dell'utile o della perdita fluttuante dalle posizioni aperte.
    P/L fluttuante – Profitto/perdita fluttuante. Questo è uguale alla somma del profitto di tutte le posizioni attualmente attive.
    Margine: contiene una quota di fondi in pegno dal saldo del conto in percentuale. Può variare dallo 0% al 100%. Indica un grado del carico in deposito.
    P/L Totale – Contiene la somma di tutti i profitti e delle perdite per le posizioni chiuse.
    Pos.:# - Visualizza il numero di posizioni storiche.

Per una corretta visualizzazione della riga inferiore, è necessario aggiungere al sistema il carattere "Arial Rounded MT Bold".


2.10. Modifica dell'aspetto delle tabelle HedgeTerminal

Come accennato in precedenza, HedgeTerminal ha un solo parametro esplicito nella finestra di avvio dell’Expert. Questo è il nome del file delle impostazioni. Questo perché le impostazioni di HedgeTerminal non possono essere inserite nella finestra delle impostazioni Expert. Queste impostazioni sono numerose e sono troppo specifiche per una finestra del genere. Ecco perché tutte le impostazioni vengono inserite nel file di configurazione designato Settings.xml. Per ogni versione avviata di HedgeTerminal, può essere presente il proprio file di impostazioni. Ciò offre l'opportunità di configurare singolarmente ogni versione avviata di HedgeTerminal.

HedgeTerminal attualmente non consente la modifica di questo file tramite le finestre visive delle impostazioni. Pertanto, l'unico modo per modificare il comportamento di HedgeTerminal è quello di modificare il file manualmente. Il file delle impostazioni è configurato in modo ottimale come impostazione predefinita e quindi la maggior parte delle volte non è necessario modificare il contenuto. Potrebbero verificarsi situazioni in cui tale modifica potrebbe essere richiesta. Tale modifica è necessaria per la messa a punto e la personalizzazione dell'aspetto del pannello. Ad esempio, quando un file è stato modificato, è possibile eliminare le colonne non necessarie o, al contrario, aggiungere le colonne non visualizzate dall’impostazione predefinita.

Vediamo il contenuto di questo file e vediamo come personalizzarlo. Per farlo, cerca questo file nella directory in cui HedgeTerminal ha installato i suoi file. Questa directory, come accennato in precedenza, può trovarsi all'indirizzo c:\Users\<your user name>\AppData\Roaming\MetaQuotes\Terminal\Common\Files\HedgeTerminal. Il file Settings.xml dovrebbe trovarsi al suo interno. Aprilo con l'aiuto di un qualsiasi editor di testo:

<!--This settings valid for HedgeTerminal only. For settings HedgeTerminalAPI using API function and special parameters.-->
<Hedge-Terminal-Settings>
        <!--This section defines what columns will be showed on the panel.-->
        <Show-Columns>
                <!--You can change the order of columns or comment not using columns.-->
                <!--You can change the value of 'Width' for a better scaling of visual table.-->
                <!--You can change the value of 'Name' to install your column name.-->
                
                <!--This columns for tab 'Active'-->
                <Active-Position>       
                        <Column ID="CollapsePosition" Name="CollapsePos." Width="20"/>
                        <!-- Unset this comment if you want auto trading and want see name of your expert:
                        <Column ID="Magic" Name="Magic" Width="100"/>-->
                        <Column ID="Symbol" Name="Symbol" Width="70"/>
                        <Column ID="EntryID" Name="Entry ID" Width="80"/>
                        <Column ID="EntryDate" Name="Entry Date" Width="110"/>
                        <Column ID="Type" Name="Type" Width="80"/>
                        <Column ID="Volume" Name="Vol." Width="30"/>
                        <Column ID="EntryPrice" Name="EntryPrice" Width="50"/>
                        <Column ID="TralStopLoss" Name="TralSL" Width="20"/>
                        <Column ID="StopLoss" Name="S/L" Width="50"/>
                        <Column ID="TakeProfit" Name="T/P" Width="50"/>
                        <Column ID="CurrentPrice" Name="Price" Width="50"/>
                        <Column ID="Commission" Name="Comm." Width="40"/>
                        <Column ID="Profit" Name="Profit" Width="60"/>
                        <Column ID="EntryComment" Name="Entry Comment" Width="100"/>
                        <Column ID="ExitComment" Name="Exit Comment" Width="100"/>
                </Active-Position>
                <!--This columns for tab 'History'-->
                <History-Position>
                        <Column ID="CollapsePosition" Name="CollapsePos." Width="20"/>
                        <!-- Unset this comment if you want auto trading and want see name of your expert:
                        <Column ID="Magic" Name="Magic" Width="100"/>-->
                        <Column ID="Symbol" Name="Symbol" Width="70"/>
                        <Column ID="EntryID" Name="Entry ID" Width="80"/>
                        <Column ID="EntryDate" Name="Entry Date" Width="110"/>
                        <Column ID="Type" Name="Type" Width="40"/>
                        <Column ID="EntryPrice" Name="Entry Price" Width="50"/>
                        <Column ID="Volume" Name="Vol." Width="30"/>
                        <Column ID="ExitPrice" Name="Exit Price" Width="50"/>
                        <Column ID="ExitDate" Name="Exit Date" Width="110"/>
                        <Column ID="ExitID" Name="Exit ID" Width="80"/>
                        <Column ID="StopLoss" Name="S/L" Width="50"/>
                        <Column ID="TakeProfit" Name="T/P" Width="50"/>
                        <Column ID="Commission" Name="Comm." Width="40"/>
                        <Column ID="Profit" Name="Profit" Width="50"/>
                        <Column ID="EntryComment" Name="Entry Comment" Width="90"/>
                        <Column ID="ExitComment" Name="Exit Comment" Width="90"/>
                </History-Position>
        </Show-Columns>
        <Other-Settings>
                <Deviation Value="30"/>
                <Timeout Seconds="180"/>
                <!-- If your computer is not fast enough - set a value 'Milliseconds' greater than 200, such as 500 or 1000. -->
                <RefreshRates Milliseconds="200"/>
        </Other-Settings>
</Hedge-Terminal-Settings>

Questo file contiene un documento speciale scritto in il linguaggio di markup xml, che descrive il comportamento e l'aspetto di HedgeTerminal.

La cosa principale da fare prima dell'inizio della modifica è creare una copia di backup nel caso in cui il file venga danneggiato accidentalmente. Il file ha una struttura gerarchica ed è composto da più sezioni racchiuse l'una nell'altra. La sezione principale si chiama <Hedge-Terminal-Settings> e contiene due sottosezioni principali: <Show-Columns> e <Other-Settings>. Come si capisce dai loro nomi, la prima sezione regola le colonne visualizzate e la loro larghezza condizionale, mentre la seconda sezione contiene le impostazioni per il pannello stesso e la libreria HedgeTerminalAPI.

Modifica della dimensione e del nome delle colonne. Facciamo riferimento alla sezione <Show-Columns> e consideriamo la sua struttura. Questa sezione contiene essenzialmente due insiemi di colonne: una per la tabella delle posizioni attive nella scheda "Attivi" e l'altra per la tabella delle posizioni storiche nella scheda "Storico". Ogni colonna in uno dei set ha il seguente aspetto:

<Column ID="Symbol" Name="Symbol" Width="70"/>

La colonna deve contenere un identificatore (ID="Symbol"), il nome della colonna (Name="Symbol") e la larghezza condizionale (Width="70").

L'identificatore contiene un nome interno univoco della colonna. Richiede a HedgeTerminal come visualizzare questa colonna e quale valore inserire in essa. L'identificatore non può essere modificato e dovrebbe essere supportato da HedgeTerminal.

Il nome della colonna definisce con quale nome verrà visualizzata la colonna nella tabella. Se il nome viene cambiato con un altro, ad esempio: Name="Currency Pair", al prossimo lancio di HedgeTerminal, il nome della colonna che riporta il simbolo cambierà:


Fig. 30. Modifica dei nomi delle colonne nel pannello HedgeTerminal

Questa proprietà permette di creare una versione localizzata del pannello in cui il nome di ogni colonna verrà visualizzato nella lingua preferita, ad esempio in russo:

 Fig. 31. La localizzazione del pannello HedgeTerminal

Fig. 31. La localizzazione del pannello HedgeTerminal

Il tag successivo contiene la larghezza condizionale della colonna. Un motore grafico allinea automaticamente la dimensione della tabella con la larghezza della finestra in cui viene avviato il pannello. Più ampia è la finestra, più ampia sarà ogni colonna. È impossibile impostare con precisione la larghezza della colonna, ma le proporzioni possono essere specificate impostando la larghezza di base della colonna. La larghezza di base è la larghezza della colonna in pixel quando la larghezza della finestra è di 1280 pixel.

Se il display è più ampio, la dimensione effettiva della colonna sarà maggiore. Per vedere come funziona il ridimensionamento uniforme, imposta la larghezza della colonna Simbolo su 240 pixel condizionali: Larghezza="240". Quindi salvare il file e ripristinare il pannello:

Fig. 32. La larghezza della colonna Simbolo è impostata su 240 pixel.

Fig. 32. La larghezza della colonna Simbolo è impostata su 240 pixel.

La larghezza della colonna con i simboli è aumentata in modo significativo. Tuttavia, va notato che la sua larghezza è stata acquisita a scapito della larghezza di altre colonne (Entry ID" e "Entry Date").

Altre colonne ora hanno un aspetto peggiore, gli ultimi valori non si adattano alla larghezza consentita. La dimensione delle colonne dovrebbe essere modificata con attenzione, trovando la giusta dimensione per ognuna di esse. Le impostazioni standard hanno valori precisi per la maggior parte dei display e normalmente non è necessario modificarne le dimensioni.

Eliminazione di colonne. Oltre a modificare le dimensioni delle colonne e le relative intestazioni, è possibile aggiungere o eliminare anche le colonne. Ad esempio, proviamo a eliminare la colonna "Symbol" dall'elenco. Per farlo, commenta semplicemente il tag della colonna nel file Settings.xml (evidenziato in giallo):

<Column ID="CollapsePosition" Name="CollapsePos." Width="20"/>
<!-- Unset this comment if you want auto trading and want see name of your expert:
<Column ID="Magic" Name="Magic" Width="100"/>-->
<!--<Column ID="Symbol" Name="Symbol" Width="70"/>-->
<Column ID="EntryID" Name="Entry ID" Width="80"/>

In xml un tag specificato <!-- content of the comment ha il ruolo del commento. La colonna commentata deve trovarsi nel tag. Dopo che le modifiche al file sono state salvate e HedgeTerminal è stato riavviato, il suo set di colonne per le posizioni storiche cambierà. Non conterrà una colonna che mostri il simbolo:

Fig. 33. Eliminazione della colonna Simbolo dalla tabella delle posizioni attive

Fig. 33. Eliminazione della colonna Simbolo dalla tabella delle posizioni attive

È possibile eliminare più colonne contemporaneamente.

Commentiamo tutte le colonne tranne il nome del simbolo e la dimensione del profitto, quindi rilanciamo HedgeTerminal sul grafico:

 Fig. 34. Eliminazione delle colonne principali dal pannello HedgeTerminal

Fig. 34. Eliminazione delle colonne principali dal pannello HedgeTerminal

Come possiamo vedere, la tabella HedgeTerminal si è notevolmente ridotta. Bisogna fare attenzione con l'eliminazione delle colonne in quanto in alcuni casi contengono elementi di gestione della posizione. Nel nostro caso, la colonna che consente di invertire le posizioni e visualizzare le loro operazioni è stata eliminata. Anche la colonna "Profitto" dalla tabella delle posizioni attive può essere eliminata. Questa colonna, però, contiene un pulsante di posizione di chiusura. In questo caso una posizione non verrà chiusa poiché manca il pulsante di chiusura.

Aggiunta di colonne e visualizzazione degli alias degli Expert. Le colonne possono essere eliminate modificandole e possono essere aggiunte, se HedgeTerminal è stato programmato per funzionare con esse. In futuro, un utente potrà creare le proprie colonne e calcolare i propri parametri. Tali colonne possono essere collegate tramite l'interfaccia dell'indicatore esterno iCustom e il manifesto di interazione con i moduli di estensione, scritto in xml.

Attualmente non esiste tale funzionalità e sono disponibili solo le colonne supportate da HedgeTerminal. L'unica colonna supportata dal pannello ma non visualizzata nelle impostazioni per impostazione predefinita, è la colonna che contiene il numero magico dell'Expert.

La posizione può essere aperta non solo manualmente ma anche utilizzando un robot. In questo caso, per ogni posizione può essere visualizzato l'identificativo del robot che ha aperto una posizione. Il tag della colonna commentata che include il numero dell'Expert Advisor è già presente nel file delle impostazioni. Decommentiamolo:

<Column ID="Magic" Name="Magic" Width="100"/>

Salva le modifiche e riavvia il pannello:

Fig. 35. Aggiunta della colonna Magic alla tabella HedgeTerminal

Fig. 35. Aggiunta della colonna Magic alla tabella HedgeTerminal

Come possiamo vedere nell'immagine sopra, è apparsa una colonna chiamata "Magic". Questo è l'identificativo dell'Expert Advisor che ha aperto una posizione. La posizione è stata aperta manualmente e quindi l'identificatore è uguale a zero. Una posizione aperta da un robot di norma contiene un identificatore diverso da zero. In tal caso, nella colonna verrà visualizzato il numero magico corrispondente dell'Esperto.

È più comodo però vedere i nomi degli Expert Advisor invece dei loro numeri. HedgeTerminal ha questa opzione. Prende gli alias (nomi) degli EA presi dal file ExpertAliases.xml e li visualizza al posto dei corrispondenti numeri magici.

Ad esempio, se hai un Expert chiamato "ExPro 1.1" e fai trading con il magic number 123847, è sufficiente inserire la seguente tag nel file ExpertsAliases.xml nella sezione <Expert-Aliases>:

<Expert Magic="123847" Name="ExPro 1.1"></Expert>

D'ora in poi, quando il tuo robot aprirà una nuova posizione, avrà il proprio nome:

Fig. 36. Visualizzazione del nome dell'Expert nella colonna Magic

Fig. 36. Visualizzazione del nome dell'Expert nella colonna Magic

Il numero di robot e dei loro nomi non è limitato. L'unica condizione qui è che i loro numeri siano diversi.

Altre impostazioni di HedgeTerminal. Abbiamo descritto tutte le impostazioni del pannello visivo attualmente disponibili. La sezione successiva <Altre Impostazioni>contiene le impostazioni che definiscono il lavoro interno del terminale. Si noti che la libreria di chiamate del programma HedgeTerminalAPI utilizza queste impostazioni come valori predefiniti. L'Expert Advisor, tuttavia, può modificare i valori correnti di queste impostazioni utilizzando le funzioni speciali Imposta.... Per ottenere i valori di tali impostazioni, l'Esperto deve solo chiamare funzioni speciali Get.... Parleremo dei tag con le impostazioni in modo più dettagliato.

<Deviation Value="30"/>

Contiene il valore della deviazione estrema dal prezzo richiesto in unità di variazione minima del prezzo. Quindi, per la coppia EURUSD quotata alla quinta cifra decimale, sarà 0,0003 punti. Per il future sull'indice RTS questo valore sarà di 300 punti poiché il passaggio minimo della variazione del prezzo è di 10 punti. Se la deviazione del prezzo è maggiore, l'ordine di chiusura o modifica del prezzo non verrà eseguito. Questo meccanismo esiste per proteggere dallo slittamento sfavorevole.

<Timeout Seconds="180"/>

Questo tag contiene il valore della risposta massima consentita dal server. HedgeTerminal funziona in modalità asincrona. Ciò significa che HedgeTerminal invia un segnale di trading al server senza attendere di ricevere una risposta da quest'ultimo. Al contrario, HedgeTerminal controlla la sequenza di eventi che indicano che l'ordine è stato effettuato correttamente. L'evento potrebbe non svolgersi affatto. Questo è il motivo per cui è così importante impostare il periodo di timeout di attesa, durante il quale HedgeTerminal attenderà la risposta del server. Se non c'è risposta durante quel periodo, l'attività verrà annullata, HedgeTerminal sbloccherà la posizione e continuerà il suo lavoro.

Il periodo di timeout di attesa può essere abbreviato o esteso. Per impostazione predefinita, questo è 180 secondi.

È importante capire che nel trading reale questa limitazione non viene mai raggiunta. Le risposte ai segnali di trading ritornano rapidamente, la maggior parte di esse viene eseguita entro 150 – 200 millisecondi.

Maggiori dettagli sul lavoro di HedgeTerminal e sulle peculiarità del lavoro in modalità asincrona possono essere trovati nella terza sezione di questo articolo: "Come funziona in dettaglio il HedgeTerminal"

<RefreshRates Milliseconds="200"/>

Questo tag imposta la frequenza degli aggiornamenti del pannello. Contiene il tempo in millisecondi trascorso tra due successivi aggiornamenti del pannello. Minore è questo valore, maggiore è la frequenza di aggiornamento del pannello e maggiori sono le risorse CP utilizzate. Se il tuo processore non è molto potente e non può far fronte alla frequenza di aggiornamento di 200 millisecondi (valore predefinito), puoi aumentarla fino a 500 o anche a 1000 millisecondi modificando il tag.

In questo caso il carico CP diminuirà notevolmente. Non sono consigliati valori inferiori a 100 millisecondi. Aumentando la frequenza di aggiornamento, il carico CP aumenterà in modo non lineare. È importante capire che la frequenza di aggiornamento definisce la discrezione del terminale. Alcune delle sue azioni sono definite da questo timer e avvengono con una certa velocità.


2.11. Funzionalità pianificate ma non implementate

HedgeTerminal ha un'architettura flessibile e intelligente, grazie alla quale è possibile implementare nuove funzionalità più complesse. Oggi queste capacità non sono state implementate, anche se potrebbero apparire in futuro nel caso saranno richieste da molti utenti. Di seguito le principali:

Utilizzo di combinazioni di colori e skin. HedgeTerminal utilizza il proprio motore grafico. Questo si basa sul grafiche primitive come un'etichetta rettangolare o un normale testo. La grafica basata sulle immagini non viene utilizzata. Ciò offre l'opportunità di modificare il colore, la dimensione e il carattere di tutti gli elementi visualizzati in HedgeTerminal. In questo modo è facile creare una descrizione dei caratteri e della combinazione di colori sotto forma di skin e caricarla all'avvio di HedgeTerminal, modificandone l'aspetto.

Collegamento di moduli Trailing Stop personalizzati. Ogni Expert (HedgeTerminal è essenzialmente un Expert), può effettuare il calcolo di un indicatore arbitrario attraverso un'interfaccia di programma specifica (funzione iCustom()). Permette di chiamare il calcolo dell'indicatore, che dipende dall'insieme di parametri arbitrari. Trailing Stop è un algoritmo che posiziona un nuovo livello di prezzo o mantiene il vecchio a seconda del prezzo corrente. Questo algoritmo e i suoi livelli di prezzo possono essere implementati come indicatore. Se i parametri passati sono concordati, HedgeTerminal può chiamare tale indicatore e calcolare il livello di prezzo richiesto. HedgeTerminal può occuparsi dei meccanismi di trasferimento del Trailing Stop. In questo modo, qualsiasi utente di HedgeTerminal può scrivere il proprio (anche il più insolito) modulo di gestione del Trailing Stop.

Aggiunta di nuove colonne per la tabella delle posizioni. Questo include anche le colonne personalizzate. Le tabelle HedgeTerminal sono progettate in modo da consentire l'aggiunta di nuove colonne. Il supporto di nuove colonne può essere programmato all'interno di HedgeTerminal e implementato col solito metodo tramite l'interfaccia iCustom(). Ogni cella nella riga di una posizione rappresenta un parametro (ad esempio, prezzo di apertura o livello di Take Profit). Questo parametro può essere calcolato da un indicatore, il che significa che è possibile scrivere un numero illimitato di indicatori in modo che ciascuno di essi calcoli un parametro per una posizione. Se il passaggio dei parametri è coordinato per tali indicatori, sarà possibile aggiungere un numero illimitato di colonne personalizzate a una tabella in HedgeTerminal.

Collegamento dei moduli di estensione. Altri algoritmi di calcolo possono essere calcolati attraverso il meccanismo della chiamata dell'indicatore personalizzato. Ad esempio, il sistema di report include molti parametri di calcolo come il payoff atteso e l'indice di Sharpe. Molti di questi parametri possono essere ricevuti spostando il loro blocco di calcolo nell'indicatore personalizzato.

Copiare offerte, ricevere e trasmettere offerte da altri account. HedgeTerminal è essenzialmente un manager di posizione. Questa può essere facilmente la base per una copiatrice di offerte poiché le funzionalità principali sono già state implementate. Tale copiatrice sarà in grado di copiare le posizioni MetaTrader 4 bidirezionali sul terminale MetaTrader 5. La copiatrice mostrerà quelle posizioni come bidirezionali, come in MetaTrader 4, con la possibilità di gestire ogni posizione individualmente.

Report e statistiche. Il grafico Equity e la scheda "Riepilogo". Il conteggio delle posizioni bidirezionali permette di analizzare il contributo al risultato di ogni strategia o trader. Oltre alle statistiche, è possibile eseguire un'analisi del portfolio. Questo report può differire notevolmente da quello in MetaTrader 5 e aggiungere delle informazioni. Nel report della scheda Riepilogo, oltre ai parametri generalmente accettati come il payoff previsto, il drawdown massimo, il fattore di profitto, ecc., verranno inclusi anche altri parametri. I nomi e i valori di questi ultimi possono essere ottenuti dai moduli di estensione personalizzati. Invece del solito grafico del saldo su un'immagine, è possibile utilizzare il grafico dell'Equity sotto forma di un grafico di scambio a candele personalizzato.

Ordinare le colonne. Di solito, quando si clicca sull'intestazione della tabella, le righe vengono ordinate in ordine crescente o decrescente (secondo clic). La versione corrente di HedgeTerminal non supporta questa opzione poiché l'ordinamento è collegato al filtro delle offerte e al set personalizzato di colonne, che al momento non sono disponibili. Le versioni successive avranno questa opzione.

Invio di un rapporto commerciale via e-mail, ftp. Notifiche push. HedgeTerminal può utilizzare le funzioni di sistema per inviare e-mail, file ftp e persino notifiche push. Ad esempio può formare un report html una volta al giorno e inviarlo all'elenco degli utenti. Poiché HedgeTerminal è un gestore di Expert Advisor e conosce tutte le azioni di trading di altri EA, può informare gli utenti sulle azioni di trading di altri Expert Advisor. Ad esempio, se uno degli EA apre una nuova posizione, HedgeTerminal può inviare una notifica push informando gli utenti che un determinato Expert è entrato in una nuova posizione. HedgeTerminal specificherà anche la direzione della voce, la sua data, ora e volume. L'EA stesso non avrà bisogno di essere configurato, sarà sufficiente aggiungere il suo nome nel file alias.

Filtrare le posizioni con la console delle espressioni regolari. Questo è il più potente degli sviluppi pianificati. Porterà il lavoro di HedgeTerminal a un livello mai visto. Le espressioni regolari possono essere utilizzate per filtrare le posizioni storiche e attive in modo che vengano visualizzate solo quelle che soddisfano i requisiti di questo filtro. Le espressioni regolari possono essere combinate e inserite in una console dedicata sopra la tabella delle posizioni attive e storiche. Ecco come potrebbe apparire questa console nelle future versioni di HedgeTerminal:

Fig. 37. Richiedi la console nella versione futura di HedgeTerminal

Fig. 37. Richiedi console nella versione futura di HedgeTerminal

Le espressioni regolari possono formare condizioni molto flessibili per filtrare le posizioni seguite da calcoli statistici su di esse. Ad esempio, per visualizzare le posizioni storiche solo con il simbolo AUDCAD, è sufficiente inserire il simbolo "AUDCAD" nella cella "Simbolo". Le condizioni possono essere combinate. Ad esempio, le posizioni di AUDCAD eseguite da un particolare robot possono essere visualizzate per il periodo dal 01.09.2014 al 01.10.2014. Basta inserire le condizioni nelle celle corrispondenti. Dopo che il filtro ha visualizzato i risultati, il report della scheda "Riepilogo" cambierà in base alle nuove condizioni del filtro.

Le espressioni regolari saranno costituite da un piccolo numero di operatori semplici. Tuttavia, usati insieme, permetteranno di creare filtri molto flessibili.

In consolle è necessaria e sufficiente la presenza dei seguenti operatori:

    Operatore = - Uguaglianza stretta. Se nel campo "Simbolo" viene inserita la parola AUDСAD, verranno trovati tutti i simboli che contengono questa sottostringa, ad esempio AUDCAD_m1 o AUDCAD_1. Ciò significa che verrà utilizzato un operatore di inserimento implicito. L'uguaglianza rigorosa "=" richiede una corrispondenza completa dell'espressione e quindi tutti i simboli tranne AUDCAD verranno esclusi. AUDCAD_m1 o EURUSD saranno esclusi.

    Operatore > - Visualizza solo i valori maggiori di quello specificato.

    Operatore < - Visualizza solo i valori inferiori a quello specificato.

    Operatore ! – Negazione logica. Riflette solo i valori che non sono uguali a quello specificato.

    Operatore | - Logico "OR". Consente di specificare due o più condizioni in una riga contemporaneamente. Allo stesso tempo, per soddisfare il criterio, è sufficiente soddisfare almeno una condizione. Ad esempio, l'espressione "> 10106825|=10106833" inserita nella cella "Entry Order" della console delle espressioni, mostrerà tutte le posizioni con identificatore dell'ordine in entrata maggiore di 10106825 o uguale a 10106833. 

    Operatore & - Logico "AND". Consente di specificare due o più condizioni in una riga contemporaneamente, ciascuna di esse deve essere soddisfatta. L'espressione ">10106825&<10105939" inserita nella cella "Entry Order" mostra tutte le posizioni con identificatore in entrata maggiore di 10106825 o minore di 10105939. Le posizioni con identificatori tra questi due numeri, ad esempio 10106320, verranno filtrate.

Correzione e gestione delle posizioni tramite comandi speciali. Ulteriori simboli possono essere inseriti nelle celle che riflettono il volume o i livelli di StopLoss e TakeProfit. Ciò rende possibile una gestione della posizione più complessa. Ad esempio, per chiudere metà del volume della posizione corrente, inserire nel campo "Volume" il valore "50%" corrispondente alla posizione attiva.

Invece di inserire i livelli StopLoss e TakeProfit, è possibile inserire un valore, ad esempio "1%", in tali celle. HedgeTerminal calcolerà automaticamente il livello di StopLoss e TakeProfit in modo che vengano posti a una distanza dell'1% dal prezzo di entrata. I numeri con il suffisso "p" possono essere inseriti in queste celle. Ad esempio, "200p" significherà l'ordine: "posizionare i livelli StopLoss e TakeProfit a 200 punti dal prezzo di entrata della posizione". In futuro, se viene messo un meno prima del volume nella colonna "Volume",, il volume si chiuderà con il valore specificato dopo quel segno. Ad esempio, se hai una posizione con il volume 1.0 e vogliamo chiudere una parte del volume (ad esempio 0.3), allora è sufficiente inserire "-0.3" nella cella del volume.


Capitolo 3. Come funziona in dettaglio HedgeTerminal. Specifiche e principio di funzionamento

3.1. Contorni globali e locali. Contesto, trasferimento e conservazione delle informazioni

L'aspetto di HedgeTerminal e il processo di trading ricordano quello di MetaTrader 4. Ciò è possibile grazie alla virtualizzazione e alla trasformazione della visualizzazione dei dati, quando le informazioni di trading disponibili tramite MetaTrader 5 vengono visualizzate dal pannello in un modo più conveniente. Questo capitolo descrive i meccanismi che consentono di creare tale virtualizzazione e i meccanismi di elaborazione dei dati in gruppo.

Come sapete, HedgeTerminal è presente in diversi prodotti. I principali sono il pannello visivo e la libreria con l'interfaccia del programma. Quest'ultimo consente di implementare la gestione delle posizioni bidirezionali in qualsiasi Expert Advisor esterno e di integrarlo anche nel pannello visivo di HedgeTerminal. Ad esempio, una posizione attiva di un EA può essere chiusa direttamente dal pannello. L'Expert Advisor otterrà le informazioni e le elaborerà di conseguenza.

Apparentemente, una tale struttura richiede un'interazione di gruppo tra gli Expert Advisor. Il panel, che è essenzialmente un Expert Advisor, deve conoscere tutte le azioni di trading che hanno luogo. Al contrario, ogni Expert Advisor che utilizza la libreria HedgeTerminal deve conoscere le azioni di trading eseguite manualmente (da programmi di terze parti o utilizzando il pannello HedgeTerminal).

In generale, le informazioni sulle azioni di trading possono essere ricevute dall'ambiente di trading. Ad esempio, quando l'utente apre una nuova posizione, il numero di ordini cambia. L'ultimo ordine può dire per quale simbolo è stata aperta la posizione e quale volume aveva. Le informazioni su ordini e offerte sono memorizzate sul server. Ecco perché è disponibile per qualsiasi terminale collegato al conto di trading. Questa informazione può essere definita globale poiché è disponibile per tutti e viene distribuita attraverso il canale di comunicazione globale. La comunicazione con il server di trading ha il formato "Richiesta - risposta".

Pertanto tale comunicazione può essere presentata come un contorno globale. "Contorno" è un concetto della teoria dei grafi. In parole semplici, un contorno è una linea chiusa con alcuni nodi che interagiscono tra loro. Questa definizione non è esauriente, ma per questo contesto è sufficiente. La cosa importante per noi è presentare il processo di trading come una sequenza chiusa di azioni.

Non tutte le informazioni richieste possono essere passate attraverso il contorno globale. Una parte delle informazioni non può essere trasmessa poiché MetaTrader 5 non supporta tale passaggio, inoltre queste informazioni non esistono esplicitamente. La sequenza delle azioni di trading è:

  1. Un commerciante effettua un ordine di acquisto.
  2. L'ordine viene eseguito in un po' di tempo.
  3. L'ambiente commerciale cambia. L'ordine eseguito entra nella lista degli ordini storici. La posizione aggregata del simbolo cambia.
  4. Il trader o un Expert Advisor rileva il cambiamento nell'ambiente di trading e prende la decisione successiva.

Si lascia passare un po’ di tempo tra la prima e la quarta azione. Può essere significativo. Se solo un trader opera sul conto, allora lui/lei sanno quali azioni vengono intraprese e attendono quindi la risposta appropriata dal server. Se ci sono anche solo pochi trader o Expert Advisor che fanno trading contemporaneamente sullo stesso conto, possono occorrere errori di gestione.

Ad esempio, il secondo trader può effettuare un ordine per chiudere una posizione esistente nel tempo compreso tra il primo e il quarto passaggio. Riesci a vedere un potenziale problema? Il secondo ordine viene piazzato quando viene eseguito il primo. In altre parole, un ordine di chiusura di una posizione verrà inviato due volte.

Questo esempio sembra inverosimile e improbabile se il trader fa trading sul conto da solo e manualmente e utilizza metodi sincroni per effettuare ordini. Quando ci sono diversi robot che fanno trading sul conto ed eseguono operazioni di trading indipendenti, c'è un'alta probabilità di tali errori.

Poiché HedgeTerminal è un manager di posizione, che lavora in modalità asincrona e garantisce il lavoro parallelo simultaneo di un numero di esperti, può incorrere in tali errori. Per evitare ciò, HedgeTerminal sincronizza le azioni tra tutte le sue copie avviate (non importa se si tratta della libreria HedgeTerminalAPI o del pannello visivo) attraverso il meccanismo del contorno locale implementato come lettura multi-thread e modifica del file ActivePositions.xml. L'interazione con il file ActivePositions.xml è il cuore del contorno locale, la parte più importante di HedgeTerminal. Questo meccanismo è descritto di seguito.

In poche parole, HedgeTerminal si occupa della cooperazione con un contorno locale e uno globale come nella figura seguente:

Fig. 38. Uno schema semplificato di scambio di informazioni tra il contorno globale e locale

Fig. 38. Uno schema semplificato di scambio di informazioni tra il contorno globale e locale

Qualsiasi azione di trading (l'etichetta start sul diagramma) in HedgeTerminal inizia con la scrittura di un tag speciale in ActivePositions.xml, che blocca ulteriori cambiamenti della posizione che viene modificata.

Dopo che il blocco di posizione è stato impostato e il contorno locale è stato superato con successo, HedgeTerminal invia un ordine di negoziazione al server. Ad esempio, un contrordine per chiudere la posizione. Dopo un po’, l'ordine viene eseguito e l'ambiente di trading viene modificato. HedgeTerminal elabora questa modifica e rileva che il contorno globale è stato superato con successo e l'ordine è stato eseguito. Sblocca la posizione e ritorna allo stato iniziale (etichetta di finish sul diagramma).

Può verificarsi una situazione in cui un ordine non può essere eseguito. In questo caso HedgeTerminal sblocca anche la posizione e registra il motivo dell'errore nel registro del terminale MetaTrader 5.

In realtà lo schema della comunicazione delle informazioni è più complesso. Come abbiamo già detto, in un terminale MetaTrader 5 possono essere eseguite allo stesso momento diverse copie di HedgeTerminal. Possono essere la libreria o il pannello visivo. Ogni copia può fungere da ascoltatore e scrittore. Quando HedgeTerminal esegue un'azione di trading, questo è uno scrittore perché blocca la posizione per le modifiche utilizzando i record del tag xml designato. Tutte le altre copie di HedgeTerminal sono listener poiché leggono il file ActivePositions.xml con una certa periodicità e bloccano una posizione per le modifiche che hanno incontrato il tag di blocco.

Questo meccanismo garantisce la diffusione delle informazioni tra thread indipendenti. Facilita il lavoro parallelo tra più pannelli ed Expert utilizzando la libreria HedgeTerminalAPI.

Ecco un diagramma realistico, che mostra il lavoro di HedgeTerminal nelle condizioni di cooperazione multi-thread:

Fig. 39. Schema quasi naturale dello scambio di informazioni tra copie di HedgeTerminal

Fig. 39. Schema quasi naturale dello scambio di informazioni tra le copie di HedgeTerminal

L'efficienza di tale organizzazione dei dati è molto elevata. Le operazioni di lettura e scrittura del file ActivePositions.xml normalmente richiedono meno di 1 millisecondo, mentre il passaggio del contorno globale con l'invio e l'esecuzione dell'ordine può richiedere fino a 150-200 millisecondi. Per vedere la differenza tra la scala di questi valori, dai un'occhiata al diagramma.

La larghezza del rettangolo verde mostra il tempo di passaggio del contorno locale e la larghezza di quello blu è il tempo di esecuzione dell'ordine di trading:

Fig. 40. Tempistiche di registrazione del file e tempo necessario per l'esecuzione dell'ordine

Fig. 40. Tempistiche di registrazione del file e tempo necessario per l'esecuzione dell'ordine

Come puoi vedere, il rettangolo verde sembra più una linea verticale. In realtà la differenza tra le scale è ancora maggiore.

Rapide operazioni di lettura e registrazione possono facilitare un complesso scambio di dati tra Expert e la creazione di sistemi di trading distribuiti ad alta frequenza.


3.2. Memorizzazione di informazioni globali e locali

Convenzionalmente, tutte le informazioni di trading utilizzate da HedgeTerminal possono essere suddivise in due parti:

  • Informazioni locali. Queste vengono memorizzate nei file del computer e sono passate esclusivamente attraverso il contorno locale;
  • Informazioni globali. Queste informazioni sono memorizzate sul server di trading. Vengono passate attraverso il contorno globale e sono disponibili da qualsiasi terminale connesso all'account.

Gli ordini, le offerte e le informazioni sull'account appartengono a informazioni globali. Queste informazioni sono disponibili tramite funzioni specifiche di MetaTrader 5, come HistoryOrderGetInteger() o AccountInfoInteger(). HedgeTerminal utilizza principalmente queste informazioni. A causa di ciò, HedgeTerminal visualizza i seguenti dati:

  • Posizioni attive e storiche di HedgeTerminal;
  • StopLoss degli ordini attivi e storici;
  • Livelli TakeProfit attivati delle posizioni storiche;
  • Commento in entrata di una posizione attiva, commenti in entrata e in uscita di posizioni storiche;
  • Tutte le altre proprietà di posizioni attive e storiche non incluse nell'elenco delle informazioni locali.

Poiché tutte queste proprietà sono globali, la loro visualizzazione è univoca per tutte le copie di HedgeTerminal, in esecuzione su computer diversi. Ad esempio, se una posizione bidirezionale viene chiusa in uno dei terminali, questa posizione verrà chiusa nell'altro HedgeTerminal anche se avviato su un altro computer.

Oltre ai dati globali, HedgeTerminal utilizza le informazioni locali durantz il suo lavoro. Le informazioni locali sono disponibili solo all'interno di un computer. Queste informazioni sono alla base delle seguenti proprietà:

  • Livelli TakeProfit delle posizioni attive;
  • Livelli TakeProfit delle posizioni storiche che non si sono innescate;
  • Commento in uscita di una posizione attiva;
  • Flag di servizio, che blocca un cambio di posizione bidirezionale.

I livelli di take profit che non sono stati attivati vengono archiviati nel file HistoryPositions.xml. Il resto delle informazioni locali è memorizzato nel file ActivePositions.xml.

L'archiviazione locale dei dati significa che se metti un TakeProfit, sarà visibile solo nelle copie di HedgeTerminal in esecuzione sul tuo computer. Nessuno tranne te conoscerà questo livello.


3.3. Stop Loss e Take Profit. Problemi del sistema di ordini e ordini OCO

In MetaTrader 5 così come in MetaTrader 4, esiste il concetto di livelli StopLoss e TakeProfit. Questi sono da considerarsi come dei freni protettivi. Come MetaTrader 4, essi chiudono una posizione nel caso in cui raggiunga un certo livello di perdita (StopLoss) o profitto (TakeProfit). In MetaTrader 4, tuttavia, tali stop sono attivi singolarmente per ogni ordine aperto. In MetaTrader 5 questi stop funzionano per l'intera posizione netta aggregata.

Il problema qui è che una posizione netta non è collegata alle posizioni bidirezionali di Expert e in particolare di HedgeTerminal. Ciò significa che i normali livelli StopLoss e TakeProfit non possono essere utilizzati per le posizioni bidirezionali, tuttavia, questi livelli possono essere presentati come ordini in sospeso separati. Se hai una posizione lunga aperta, due ordini in sospeso emuleranno rispettivamente il lavoro di TakeProfit e StopLoss. Uno di questi è SellLimit posizionato al di sopra del prezzo di apertura di questa posizione e un altro è SellStop posizionato al di sotto di questo prezzo.

Infatti, se il prezzo dopo l'apertura raggiunge il SellLimit dell'ordine, quest'ultimo chiuderà la posizione con profitto e se il prezzo raggiunge l'ordine SellStop chiuderà la posizione con una perdita. L'unico inconveniente è che dopo l'attivazione di un ordine, il secondo ordine non smetterà di esistere e se il prezzo cambia direzione, il secondo ordine può attivarsi dopo il primo.

Non essendoci alcuna posizione in quel momento, l'attivazione del secondo ordine aprirà una nuova posizione netta invece di chiudere quella precedente.

La figura seguente illustra questo problema nell'esempio dell'utilizzo di arresti di protezione in una posizione lunga:

Fig. 41. Emulazione di StopLoss e TakeProfit utilizzando gli ordini SellStop e SellLimit

Fig. 41. Emulare StopLoss e TakeProfit utilizzando gli ordini SellStop e SellLimit

Per evitare tale incoerenza, nelle negoziazioni in borsa vengono utilizzati gli ordini OCO (" ("Uno Annulla l'Altro").

Si tratta di due ordini in sospeso collegati tra loro, quindi l'attivazione di un ordine annulla l'altro. Nel nostro esempio, dopo l'attivazione di un ordine, il secondo ordine viene annullato dal server di trading e quindi non verranno aperte nuove posizioni (esattamente quello che stiamo cercando di fare). Il lavoro di questo tipo di ordini è presentato nello schema seguente:

Fig. 42. Ordini OCO come StopLoss e TakeProfit

Fig. 42. Ordini OCO come StopLoss e TakeProfit

MetaTrader 5 non supporta gli ordini OCO. Poiché non è possibile utilizzare un pacchetto di tre ordini, gli ordini che agiscono contemporaneamente come StopLoss e TakeProfit non sono adatti. È possibile utilizzare una coppia di due ordini! Quindi, può essere StopLoss o TakeProfit. 

Infatti, se è stato piazzato un ordine in sospeso connesso con l'ordine eseguito che inizializza una nuova posizione bidirezionale (ad esempio StopLoss), allora tale costruzione è sicura. Non ci sarà un secondo ordine in sospeso e non sarà possibile aprire una nuova posizione bidirezionale. In realtà, ci saranno solo tre scenari:

  • Un ordine in sospeso verrà annullato per qualche motivo da un broker o da un utente;
  • Si attiverà un ordine in sospeso;
  • Un ordine in sospeso non si attiverà.

Non ci sono altri scenari. Se un ordine in sospeso viene annullato, sarà uguale all'annullamento di StopLoss o TakeProfit. Se un ordine in sospeso si attiva, chiuderà la posizione. Se l'ordine non si attiva, una posizione bidirezionale rimarrà attiva con uno StopLoss piazzato.

Anche se HedgeTerminal è disabilitato quando viene attivato l'ordine in sospeso, in seguito, quando viene avviato, sarà in grado di elaborare il suo trigger e capire che la posizione è stata chiusa da questo ordine. È possibile stabilire se la posizione è stata chiusa da StopLoss o TakeProfit se il campo con il numero magico contiene informazioni di servizio speciali che indicano se l'ordine di chiusura è un ordine normale, TakeProfit o StopLoss. Il modo in cui il collegamento e le informazioni sul servizio sono memorizzati nel campo con il numero magico è spiegato in dettaglio nella sezione successiva.

Poiché due arresti protettivi reali non possono essere utilizzati contemporaneamente, durante la progettazione di HedgeTerminal è stato raggiunto un compromesso:

Le posizioni bidirezionali in HedgeTerminal sono protette dagli ordini reali di BuyStop e SellStop che svolgono un ruolo di StopLoss. I livelli TakeProfit sono virtuali e supportati a livello di copie HedgeTerminal eseguite su un computer e non disponibili a livello globale.

Vengono scelti i livelli di StopLoss, in quanto questi livelli sono quelli richiesti per avere un alto livello di affidabilità di attivazione. Se TakeProfit non funziona, non sarà un grosso problema: il conto non verrà chiuso tramite richiesta di margine, mentre la non attivazione di StopLoss può portare il conto in bancarotta.

Tuttavia, esiste un'opportunità algoritmica per scegliere un modo per seguire una posizione. Puoi scegliere tra uno StopLoss reale e un TakeProfit virtuale o uno StopLoss virtuale e un TakeProfit reale. I livelli StopLoss e TakeProfit possono anche essere virtuali. Al momento questa funzionalità non è stata implementata ma se fosse richiesta, potrebbe apparire.

La virtualizzazione del livello TakeProfit ne riduce l'affidabilità generale, anche se non in modo significativo. I livelli TakeProfit sono distribuiti localmente e sono disponibili per ogni copia di HedgeTerminal. Affinché TakeProfit venga eseguito, è sufficiente avere almeno una copia in esecuzione di HedgeTerminal come Expert Advisor che utilizza la libreria o il pannello HedgeTerminal. Quando sono in esecuzione più copie di HedgeTerminal, solo una di esse eseguirà TakeProfit. Sarà questa la prima a mettere un tag di blocco sulla posizione bidirezionale. In questo senso, le istanze di HedgeTerminal sono in competizione tra loro nella modalità multi-thread di scrittura e lettura dei dati.

Per un utente, che fa trading manualmente tramite il pannello HedgeTerminal o che utilizza la libreria di virtualizzazione negli EA, il lavoro con TakeProfit non è diverso dal lavoro con StopLoss. Tutte le differenze effettive tra questi livelli sono nascoste dietro le quinte di HedgeTerminal. È sufficiente che il trader inserisca "TakeProfit" e "StopLoss". Questi livelli saranno presenti contemporaneamente e le indicazioni avranno lo stesso colore delle indicazioni di avvertimento sull'attivazione di uno dei livelli.


3.4. Gli ordini OCO possono risolvere i problemi con la protezione delle posizioni bidirezionali?

Gli ordini OCO consentono di utilizzare contemporaneamente i livelli reali di StopLoss e TakeProfit. Sono davvero così versatili nell'organizzare il commercio bidirezionale? Di seguito le loro caratteristiche. Sappiamo già che gli ordini OCO consentono di annullare un ordine quando si attiva l'altro.

Sembra che proteggerà la nostra posizione bidirezionale da entrambe le parti poiché in quel caso Stop-Loss e Take-Profit possono essere ordini reali che non richiedono l'esecuzione di HedgeTerminal sul computer. Il fatto è che nell'esecuzione dell'ordine di scambio è necessario prendere in considerazione esecuzione parziale dell’ordine. Questa proprietà può distruggere la logica di business dell'applicazione. Consideriamo un semplice esempio:

  1. Viene aperta una posizione lunga con un volume di 10 contratti. Vengono inseriti due ordini OCO collegati che implementano i livelli StopLoss e TakeProfit;
  2. L'ordine SellLimit viene eseguito parzialmente quando viene raggiunto il livello TakeProfit. 7 contratti su 10 sono stati chiusi da esso e i restanti 3 sono rimasti aperti come posizione lunga;
  3. L'ordine SellStop, implementando il livello StopLoss, verrà annullato in quanto l'ordine SellLimit ad esso collegato è stato eseguito, anche se solo parzialmente.
  4. La posizione in tre contratti non ha più uno stop protettivo.

Questo scenario è presentato nella figura seguente:

Fig. 43. Esecuzione parziale degli arresti di protezione

Fig. 43. Esecuzione parziale di arresti di protezione

Potrebbe esserci un'obiezione sul fatto che gli ordini OCO possano essere progettati in modo da tenere conto di un'esecuzione parziale e che consente di evitare tale compensazione degli stop protettivi. I volumi di due ordini OCO possono essere interconnessi. In questo caso sarà sicuramente prevista l'esecuzione parziale. Tuttavia, ciò complicherà le logiche abbastanza complesse del sistema di ordini utilizzato nel trading netto.

Il problema principale qui è che gli ordini OCO non possono fornire le stesse opportunità di MetaTrader 4, anche tenendo conto dell'esecuzione parziale. Ad esempio, sarà difficile piazzare un ordine in sospeso con i livelli TakeProfit e StopLoss. Il motivo è che due ordini interconnessi non possono tenere conto dell'attivazione dell'ordine di avvio.

Per scrivere un algoritmo veramente versatile che permetta di gestire posizioni simili a MetaTrader 4, gli ordini OCO devono avere le seguenti caratteristiche:

  1. Ogni ordine collegato deve adeguare il proprio volume in funzione al grado di esecuzione dell'ordine ad esso collegato. Ad esempio, se TakeProfit ha eseguito 7 contatti su 10, lo StopLoss ad esso collegato deve cambiare il suo volume da 10 a 3 (10 - 7 = 3);
  2. Ciascuno degli ordini collegati deve tenere conto del volume dell'esecuzione dell'ordine di inizializzazione. Nel caso in cui un trader effettui un ordine in sospeso del tipo BuyLimit e lo protegga con StopLoss e TakeProfit sotto forma di ordini, non significa necessariamente che BuyLimit sia garantito per l'esecuzione dell'intero volume. Anche questi casi devono essere soddisfatti dagli ordini accoppiati.
  3. Oltre alla condizione per l'annullamento, un ordine abbinato deve avere una condizione aggiuntiva per l'attivazione. Può attivarsi solo quando si attiva un ordine aggiuntivo ad esso connesso. Ciò significa che un ordine OCO deve avere collegamenti a due ordini. Il primo collegamento è all'ordine la cui attivazione attiverà l'ordine corrente. Il secondo collegamento è l'ordine la cui attivazione annullerà l'ordine corrente. Tale meccanismo consentirà di creare una posizione con un ordine di inizializzazione pendente;

Tali meccanismi, anche se appaiono, saranno molto complessi per un utente con esperienza limitata. La loro idoneità non è certa. La virtualizzazione dal lato client, come quella attualmente utilizzata in HedgeTerminal, è più facile da usare.

In alternativa agli ordini OCO, MetaQuotes potrebbe considerare la possibilità di introdurre specifici livelli algoritmici di TakeProfit e StopLoss che garantiscano la protezione di un determinato ordine di negoziazione. Sicuramente, questa è solo una teoria sebbene abbia un nucleo razionale. Tali livelli algoritmici possono nascondere la parte più grossa dell'implementazione e configurazione lato server di trading offrendo agli utenti finali un semplice meccanismo di protezione pronto all'uso.

Riassumendo, il nostro discorso sulle prospettive di integrazione degli ordini OCO nella piattaforma MetaTrader 5:

Gli ordini OCO non sono efficaci quando gli ordini vengono eseguiti parzialmente, non sono abbastanza affidabili e troppo complessi per l’utente medio della piattaforma. 


3.5. Memorizzazione di collegamenti per l'inizializzazione degli ordini

Questa sezione considera una descrizione dettagliata della memorizzazione interna dei collegamenti ad altri ordini e del meccanismo di vincolo tra di essi. Come accennato in precedenza, il campo "Order Magic" contiene l'identificativo dell'Expert Advisor che ha effettuato un ordine. Ciò significa che qualsiasi trader può inserire qualsiasi valore intero in questo campo utilizzando il linguaggio di programmazione MQL5. In tali casi è possibile una collisione, quando l'ordine che inizializza una nuova posizione conterrà l'identificativo di un Expert Advisor corrispondente all'identificativo di un ordine esistente. In questo caso apparirà un link errato all'ordine.

Se un trader utilizza un identificatore per gli EA vicino allo zero, come "1", "7" o "100", e i numeri dell'ordine sono significativamente maggiori dei suddetti numeri, come "10002384732", queste collisioni possono essere evitate. Sarebbe piuttosto ingenuo credere che i trader lo terranno a mente. Ecco perché HedgeTerminal memorizza i collegamenti agli ordini in modo speciale, in modo che la probabilità di collisioni sia molto bassa e i suoi algoritmi non consentono ambiguità ed eliminano automaticamente le collisioni quando si verificano.

Il campo "Order Magic" che memorizza il collegamento richiede 64 bit. A causa della sua larghezza, questo campo può richiedere un numero molto lungo. In realtà, l'intervallo di lavoro degli identificatori d'ordine è molto più piccolo. Ciò consente a Hedge Terminal di utilizzare in modo sicuro cifre più alte di questo campo per le sue esigenze, formando un collegamento all'ordine in modo speciale. Facciamo riferimento allo schema che mostra come HedgeTerminal memorizza un collegamento all'ordine di avvio:

Fig. 44. Un modello di memorizzazione di un collegamento all'ordine di inizializzazione in HedgeTerminal

Fig. 44. Un modello di memorizzazione di un collegamento all'ordine di inizializzazione in HedgeTerminal

La cifra superiore del campo (63) è sempre contrassegnata come 1. Ciò consente un'iterazione molto rapida su tutti gli ordini. Chiaramente, se la cifra successiva non è uguale a 1, l'ordine non può contenere un collegamento a un altro ordine e può essere saltato. Inoltre, assegnare il valore 1 alla cifra più alta rende il numero magico molto grande e ciò aumenta la distanza tra l'intervallo di lavoro degli identificatori d'ordine e l'intervallo di lavoro dei collegamenti in HedgeTerminal, il che riduce al minimo la probabilità di collisione.

HedgeTerminal può riempire i seguenti tre bit con informazioni di servizio. A differenza dell'identificatore dell'ordine, HedgeTerminal memorizza gli identificatori dell'ordine in questo campo al rovescio. All'inizio riempie le cifre più alte e poi quelle più piccole, indicate da una freccia blu nella direzione SI  (informazioni di servizio) in Fig. 44. Questa modalità di archiviazione fa sì che le gamme di informazioni sui servizi e gli identificatori degli ordini si incontrino a metà. In caso di necessità, la loro composizione può essere modificata. La dimensione delle informazioni di servizio può essere aumentata tramite le cifre per la memorizzazione dell'identificativo dell'ordine. Queste informazioni consentono di identificare il tipo di ordine di chiusura.

Il punto è che gli ordini attivi in MetaTrader 4 possono essere chiusi da TakeProfit o StopLoss. Questi sono determinati livelli di prezzo a cui gli ordini vengono chiusi con profitti o perdite fissi. In MetaTrader 5, TakeProfit e StopLoss possono essere applicati solo alle posizioni nette e non sono adatti per ordini accoppiati. Solo gli ordini normali in sospeso possono svolgere un ruolo di ordini TakeProfit e StopLoss.

In HedgeTerminal a tali ordini vengono assegnati identificatori speciali che specificano se si tratta di un ordine TakeProfit o StopLoss. Poiché il numero magico è memorizzato sul server di trading, le informazioni sul servizio diventano disponibili per tutti i trader che hanno accesso al conto di trading. In questo modo, anche più copie di HedgeTerminal in esecuzione su computer diversi avranno le informazioni sul tipo di ordini attivati e visualizzeranno correttamente le informazioni sulle posizioni chiuse.

Le informazioni di riferimento sull'identificatore dell'ordine sono memorizzate nell'intervallo da 0 a 59 cifre. Queste vengono memorizzate nella direzione standard, utilizzando cifre da destra a sinistra, indicate da un ID ordine di direzione della freccia blu. Per valutare la dimensione dello spazio di archiviazione allocato, calcoliamo l'importo necessario per archiviare l'intervallo di tutti gli ordini inviati a Moscow Exchange durante un anno.

Il rapporto del mio broker del 13.06.2013 contiene un ordine con l'identificatore 10 789 965 471. Questo numero utilizza 33.3297 bits  (log2(10 789 965 471)) o 34 cifre su 64. L'identificativo di uno degli ordini effettuati entro il 25.09.2014 è 13 400 775 716. Questo numero utilizza 33.6416 bit. Sebbene siano stati effettuati 2,6 miliardi di ordini in un anno e quattro mesi, la dimensione dell'identificatore è aumentata solo di 0,31263 bit, ovvero meno di un ordine. Non sostengo che il Sole si spegnerà prima che la dimensione dell'identificatore dell'ordine raggiunga la 59a cifra, ma sono abbastanza fiducioso che ciò accadrà non prima di un paio di milioni di anni.

HedgeTerminal non memorizza un collegamento apertamente. Per questo crittografa il campo OrderMagic, lasciando intatta la cifra maggiore. Il codice di HedgeTerminal si basa sul riordino reversibile delle cifre attuato dalla speciale funzione di cifratura operante sulla chiave a lunghezza variabile. Dopo tale crittografia, le informazioni di servizio e l'identificativo dell'ordine vengono mescolate tra loro e nascoste sotto una maschera speciale in modo che all'uscita rappresentino una distribuzione uniforme di uno e zero. La crittografia avviene per due motivi. Prima di tutto, il riarrangiamento delle cifre diminuisce la probabilità che i link e gli identificatori d'ordine si sovrappongano e quindi protegge gli algoritmi interni di HedgeTerminal dall'impatto esterno intenzionale o casuale.

Questa procedura è assolutamente sicura, reversibile e non soggetta a collisioni. Ciò garantisce che, indipendentemente dalle azioni eseguite da un trader che utilizza gli Expert Advisor, queste non influiscono sull'affidabilità degli algoritmi interni di HedgeTerminal. Questo è molto importante in quanto in una situazione reale la gestione di questi collegamenti è impossibile senza complessi algoritmi dedicati.

Allo stesso tempo, se ci limitiamo al solo controllo dei collegamenti, il fallimento della logica di business è inevitabile. Le sezioni seguenti spiegheranno il perché, in quanto sono dedicate alla descrizione dettagliata di questi algoritmi. La crittografia viene utilizzata anche per evitare questo errore. Il rovescio della medaglia di questa restrizione è che non c'è altro modo per gestire le posizioni di HedgeTerminal.


3.6. Limitazioni al lavoro con HedgeTerminal

La particolarità della struttura dell'archiviazione dei collegamenti richiede che HedgeTerminal memorizzi i collegamenti agli ordini in modo uniforme utilizzando i numeri da 9223372036854775808 a 18446744073709551615. Se un campo di 64 cifre è rappresentato come un numero con il segno del tipo lungo, allora questi saranno valori negativi. Qui sorgono tre limitazioni per il lavoro con HedgeTerminal.

La prima limitazione riguarda il trading robot, che lavora con HedgeTerminal. Questo non è un obbligo, e può essere considerato come una raccomandazione:

Un robot di trading o un Expert Advisor che lavora con HedgeTerminal deve avere un identificatore (numero magico dell'esperto) non superiore al valore 9223372036854775808.

In realtà, gli Expert Advisor comuni non incontreranno mai questa restrizione poiché gli identificatori che superano le 5-6 cifre vengono utilizzati molto raramente. L'identificatore più comune per un Expert è "12345" o qualcosa del genere). Questa restrizione può essere applicabile ai robot che memorizzano informazioni di servizio come collegamenti ad altri ordini nei loro numeri magici. HedgeTerminal non è compatibile con tali Expert e non può funzionare insieme ad essi.

Se per qualche motivo il limite indicato viene superato, ci sarà una probabilità di collisione nulla. Questa è molto piccola poiché la coincidenza in un tale intervallo è molto improbabile. Anche in questo caso HedgeTerminal risolverà questa collisione utilizzando i suoi algoritmi. Ciò rallenterà il suo lavoro poiché decifrare un collegamento, confrontare questo collegamento con gli ordini esistenti e analizzare questo ordine per verificarne l'idoneità all'abbinamento con un altro ordine richiederà più tempo. Quindi, per evitare ciò, è meglio non usare numeri lunghi con segno negativo.

La seconda limitazione è difficile ma riguarda solo il broker e l'exchange a cui HedgeTerminal sarà collegato:

Gli identificatori dell'ordine devono utilizzare numeri da 0 a 2^59 o 576 460 752 303 423 488.

Ciò è ovvio in quanto vengono utilizzate solo 59 cifre per memorizzare gli identificatori degli ordini anziché 64. Se il tuo broker utilizza identificatori di ordine maggiori di questo valore, non potrai utilizzare Hedge Terminal nel tuo lavoro.

La terza limitazione deriva dal modo di rappresentazione della posizione:

HedgeTerminal non è compatibile con nessun altro sistema di gestione delle posizioni. Non è compatibile con pannelli di trading esterni dotati della funzione di chiusura delle posizioni e non può essere utilizzato insieme ad essi.


3.7. Meccanismo degli ordini di abbinamento e determinismo delle azioni

Abbiamo esposto in dettaglio la rappresentazione della posizione in HedgeTerminal e la struttura dei suoi collegamenti. Non parleremo della descrizione dell'algoritmo che gestisce gli ordini vincolati. Prendiamo come esempio il caso in cui abbiamo due ordini scelti da una serie di altri ordini e dobbiamo collegarli. Se non ci basiamo sulla regola che un collegamento all'ordine deve essere univoco e appartenere a un solo ordine, tutte le possibili situazioni possono essere suddivise in tre gruppi:

  1. L'ordine non è referenziato da altri ordini;
  2. L'ordine è referenziato da un ordine;
  3. L'ordine è referenziato da due o più ordini.

Il primo gruppo non causa difficoltà e tale ordine è considerato una posizione aperta. Le cose sono molto semplici anche con il terzo gruppo poiché una coppia di ordini chiude una posizione. Cosa possiamo fare con i casi del terzo gruppo? Cosa succede se un ordine è referenziato da altri due ordini? Quale di loro dovrebbe essere collegato al primo e cosa accadrebbe al secondo ordine? È facile rispondere a questa domanda se presentiamo il processo di accoppiamento come sequenziale:

  1. Ci troviamo di fronte ad un ordine che non contiene un collegamento ad un altro ordine. Viene trasferito nella sezione degli ordini attivi (posizioni) e successivamente l'iterazione degli ordini continua;
  2. Poi ci imbattiamo in un altro ordine che ha un riferimento al primo ordine. Quindi l'ordine di riferimento viene ricercato nella sezione degli ordini attivi. Se l'ordine di riferimento si trova in questa sezione, viene abbinato all'ordine corrente ed entrambi vengono trasferiti nella sezione delle transazioni complete sotto forma di posizioni storiche;
  3. Durante un'ulteriore iterazione, ci imbattiamo in un altro ordine che contiene un collegamento all'ordine descritto al punto 1. Quindi l'ordine di riferimento viene ricercato nella sezione degli ordini attivi. Questa volta la ricerca non andrà a buon fine in quanto gli ordini ricercati sono stati riportati da questa sezione alla sezione delle transazioni completate. Poiché l'ordine a cui fa riferimento l'ordine corrente non è stato trovato, l'ordine corrente, nonostante il suo collegamento, rimane un ordine attivo e viene trasferito alla sezione con le posizioni attive.

Poiché gli identificatori di ordine sono compilati in modo coerente e il loro elenco è ordinato in base al tempo, è possibile eseguire la loro iterazione sequenziale. Quindi, l'ordine di inizializzazione sarà abbinato al primissimo ordine che contiene un collegamento ad esso indipendentemente dal numero di altri ordini che contengono gli stessi collegamenti. Tutti gli altri ordini contenenti collegamenti all'ordine di inizializzazione verranno inclusi nell'elenco delle posizioni di avvio attive.

Come abbiamo già detto, l'algoritmo che esegue tale iterazione deve essere completamente deterministico e coerente. HedgeTerminal utilizza un tale algoritmo di iterazione. In realtà, questa non è semplicemente un'iterazione, ma una ripetizione di tutte le azioni di trading che sono state eseguite dal momento della prima operazione. In effetti, ad ogni lancio, HedgeTerminal costruisce costantemente una catena di azioni di trading dall'inizio alla fine. Grazie a ciò, la rappresentazione della sua posizione attuale è il risultato della sua negoziazione retrospettiva al momento del lancio.

Poiché l'iterazione su tutti gli ordini nella cronologia viene eseguita in sequenza, è necessario eseguire in sequenza anche le azioni di trading. Ciò determina la modalità di esecuzione dell'ordine in HedgeTerminal. Ad esempio, è necessario chiudere una posizione HedgeTerminal attiva bidirezionale protetta da StopLoss. Sappiamo che una tale posizione bidirezionale consiste essenzialmente di due ordini: un ordine eseguito che avvia una posizione attiva e un ordine in sospeso buy-stop o sell-stop, che agisce come un ordine stop-loss. Per chiudere tale posizione, è necessario eliminare l'ordine in sospeso e chiudere una posizione bidirezionale attiva con un controordine con lo stesso volume. Quindi, devono essere eseguite due azioni di trading. HedgeTerminal esegue tutti gli ordini di trading in modo asincrono.

In questo modo gli ordini possono essere eseguiti simultaneamente, cioè il primo ordine può essere piazzato per cancellare l'ordine in sospeso e il secondo ordine per eseguire il controordine, che chiuderà la tua posizione. Ciò tuttavia ribalterà il determinismo delle azioni e HedgeTerminal non può farlo. Se per qualche motivo, l'ordine in sospeso non viene annullato e la posizione non viene chiusa dal controordine, si formerà un’ambiguità in quanto la posizione verrà chiusa e il suo StopLoss esisterà ancora. Alla fine, l'ordine che implementa StopLoss può innescare e generare una nuova posizione bidirezionale. Questo non dovrebbe accadere. Ecco perché HedgeTerminal annullerà lo StopLoss e dopo l'annullamento, effettuerà un contrordine. Esiste la possibilità che il contrordine non venga eseguito o eseguito parzialmente nella seconda fase. In tal caso, però, l'ambiguità verrà eliminata in quanto anche un contrordine parzialmente eseguito chiuderà una parte della posizione attiva. Questa è una situazione normale.

Esiste una sequenza più complessa di azioni implementate da HedgeTerminal. Usiamo un esempio simile al precedente ma questa volta chiuderemo una parte della posizione. Ciò significa che HedgeTerminal dovrà eseguire tre azioni:

  1. Eliminare l'ordine in sospeso che ha agito come ordine StopLoss;
  2. Eseguire il controordine chiudendo una parte del volume di una posizione bidirezionale;
  3. Posizionare un nuovo StopLoss con un nuovo volume proteggendo la parte restante della posizione attiva.

Tutte queste azioni saranno eseguite in modo coerente per evitare di interrompere il determinismo delle azioni. Ci si aspetta quindi un aumento della velocità di esecuzione dell'ordine dovuto al collocamento simultaneo dell'ordine, anche se in tal caso non può essere garantita l'esecuzione sequenziale delle operazioni di trading e si potranno verificare delle ambiguità. Un'elaborazione sequenziale dell'ordine non implica alcuna ambiguità.


3.8. Dividere e connettere le offerte: la base dell'aritmetica dell'ordine

La gestione sequenziale degli ordini non è sufficiente. Qui vanno notate due cose:

  • Un ordine può includere più offerte. Il numero di tali offerte può essere casuale;
  • È anche importante prendere in considerazione sia un'esecuzione parziale dell'ordine, sia un caso più comune in cui un volume di un ordine di chiusura potrebbe non essere uguale al volume dell'ordine di avvio;

L'ordine può essere eseguito da più operazioni contemporaneamente e può essere eseguito parzialmente. Se non conosci il motivo per cui questo potrebbe accadere, fai riferimento all'articolo dedicato alla descrizione del prezzo di scambio "Principi del prezzo di scambio attraverso l'esempio del mercato dei derivati della Borsa di Mosca". La domanda "Perché il volume dell'ordine di chiusura non può essere uguale al volume di quello di apertura?" richiede una risposta. Cosa possiamo fare in questo caso?

I loro volumi, infatti, possono essere differenti se si ipotizza un'opportunità di chiusura parziale di una posizione attiva. Se apriamo una posizione attiva con il volume di 50 contratti e chiudiamo una parte delle posizioni con il contrordine con il volume di 20 contratti, allora la posizione attiva sarà divisa in due parti. La prima parte creerà una nuova posizione storica con il volume di 20 ordini con il contrordine, mentre la seconda parte sarà ancora aperta anche se il suo volume diminuirà e sarà di 30 contratti.

Questo algoritmo di chiusura parziale della posizione è implementato in HedgeTerminal. Se viene inserito un nuovo valore di volume nel campo "Volume" del pannello HedgeTerminal, avrà luogo una chiusura parziale. Nella cartella "Cronologia" apparirà una nuova posizione e il volume della posizione corrente sarà uguale al nuovo valore. HedgeTerminal può elaborare la situazione anche quando il volume dell'ordine di chiusura è maggiore del volume di quello di partenza! Una tale situazione può verificarsi se HedgeTerminal per qualche motivo inserisce un volume errato dell'ordine di chiusura o il broker annulla in modo arretrato una serie di operazioni incluse nell'ordine di avvio che trasformeranno il volume eseguito in uno più piccolo.

Per tenere conto di una potenziale differenza di volumi, è necessario utilizzare un algoritmo universale basato sul calcolo del volume totale di tutte le offerte relative all'ordine. In questo caso, sono le offerte, non gli ordini, che determinano tutto. Il volume di un ordine è il volume delle sue offerte. Il prezzo di un ordine eseguito è il prezzo medio delle sue operazioni.

HedgeTerminal utilizza l'algoritmo che collega gli ordini tra loro o li divide. Si basa sull'addizione e la sottrazione delle offerte. Il suo lavoro si basa sull'unione delle trattative tra l'inizializzazione e l'ordine di chiusura con la successiva formazione di una posizione storica.

Per capire come funziona questo algoritmo, supponiamo che siano necessari due ordini da accoppiare per creare una posizione storica. Entrambi gli ordini hanno lo stesso numero di operazioni e il loro volume eseguito è lo stesso. I numeri delle offerte saranno a tre cifre per semplicità:

Ordine n. 1 (in ordine)Volume (10/10)
Deal #2833
Deal #2882
Deal #2945

Tabella 3. Ordine №1 e le sue offerte


Ordine #2 (fuori ordine)Volume (10/10)
Deal #8711
Deal #8823
deal #9216

Tabella 4. Ordine №2 e i suoi deals (offerte)

Mettiamo insieme le loro offerte con i volumi:

Tabella 5. Unire gli ordini

Tabella 5. Unire gli ordini

Seleziona gli ultimi due ordini da ciascuna colonna: №294 e №921. In generale non possono essere sullo stesso livello (come in questo esempio).

Seleziona un affare con il volume minimo. Questo è l'accordo №294 con il volume 5. Dividi l'accordo opposto №921 in due. La prima operazione è pari al volume dell'operazione №294 (5 contratti) e la seconda operazione contiene il volume rimanente di 1 contratto (6 contratti – 5 contratti = 1 contratto). Unisci l'affare #294 con il volume 5 con la prima parte del volume №921 con il volume simile:

Tabella 6. Sottrazione dei volumi

Tabella 6. Sottrazione di volumi

Trasferisci la parte unita in una nuova colonna contenente le offerte della posizione storica.

Questo è evidenziato in verde. Lascia la parte restante dell'accordo #921 con il volume 1 nella colonna iniziale della posizione attiva. Questo è evidenziato in grigio:

Tabella 7. Operazioni frazionate e riporto

Tabella 7. Dividere e riportare le offerte

Abbiamo fatto il primo passo per unire le trattative di due ordini e riportarli in posizione storica. Riflettiamo sulla sequenza di azioni in una forma breve:

Tabella 8. Suddivisione e riporto delle operazioni. Passo 1

Tabella 8. Dividere e riportare le offerte. Fase 1.

Il volume dell'operazione № 294 è stato riportato integralmente alla sezione delle posizioni storiche. L'affare è stato completamente annullato. Quindi l'affare è stato diviso e riportato nella sezione degli ordini storici. Ecco perché al passaggio successivo possiamo procedere al seguente accordo №288 con il volume 2. L'operazione №921 è ancora presente e il suo volume è pari alla restante seconda parte dell'operazione. Nella fase successiva questo volume interagirà con il volume dell'affare № 288.

Al secondo passaggio ripeti la procedura con offerte №288 e №921. Questa volta il volume rimanente dell'operazione №921 (1 contratto) viene unito al volume dell'operazione №288 dopo essere arrivato alla colonna degli ordini storici. Il volume rimanente dell'operazione № 288 è pari a 1 contratto e rimarrà nella colonna della posizione attiva:

 Tabella 9. Suddivisione e riporto delle operazioni. Passaggi 1-2

Tabella 9. Dividere e riportare le offerte. Passaggi 1-2

Ripeti le stesse azioni con le offerte №288 e №882:

Tabella 10. Suddivisione e riporto delle operazioni. Passaggi 1-3

Tabella 10. Dividere e riportare le offerte. Passaggi 1-3

Eseguire i passaggi IV e V allo stesso modo:

Tabella 11. Operazioni di divisione e riporto. Passaggi 1-5

Tabella 11. Dividere e riportare le offerte. Passaggi 1-5

Dopo il passaggio V, il volume dell'ordine di chiusura sarà assolutamente uguale al volume delle negoziazioni dell'ordine di apertura. Le operazioni riportate nella colonna delle posizioni storiche costituiscono una transazione storica completa. Le rimanenti operazioni della posizione attiva creano una posizione attiva. In questo caso non sono rimaste offerte nella colonna della posizione attiva. Ciò significa che dopo tale unità, la posizione attiva cesserà di esistere. Apparirà una nuova posizione storica che includerà tutte le operazioni della posizione attiva.

Dopo che le trattative sono state riportate, molte di esse saranno divise in parti e occuperanno diverse righe. Per evitare ciò, è possibile aggiungere un'opzione sulla raccolta delle offerte all'algoritmo di unione/suddivisione delle offerte. Unisci semplicemente il volume delle offerte con gli stessi identificatori in:

Tabella 12. Unire i deal in un livello

Tabella 12. Unire i deal in un livello

Dopo l'unione, il numero di deal e il loro volume corrispondono completamente alle offerte e ai volumi iniziali. Ciò accade solo perché i loro volumi inizialmente corrispondevano. Se i loro volumi fossero diversi, dopo la procedura di unione, gli accordi avrebbero volumi diversi.

Questo algoritmo è universale in quanto non richiede lo stesso numero di operazioni per l'ordine di avvio e di chiusura. C'è un altro esempio basato su questa proprietà che esamineremo:

 Tabella 13. Unione di ordini con diverso numero di deal

Tabella 13. Unione di ordini con diverso numero di deal

Come possiamo vedere, l'unione degli ordini in una posizione storica ha avuto successo. Nonostante un diverso numero di offerte, il loro volume è tornato a corrispondere.

Ora, immagina che il volume aggregato dell'ordine di chiusura (12 contratti) sia inferiore al volume delle offerte dell'ordine di inizio (22 contratti). Come andrà l'unione in questo caso?

Tabella 14. Unione di ordini con volumi diversi

Tabella 14. Unire ordini con volumi differenti

Come possiamo vedere, al secondo passaggio, il volume delle operazioni dell'ordine di chiusura è pari a zero mentre l'ordine di avvio contiene altre due operazioni №321 con volume 4 e №344 con volume 6. C'è un eccesso di ordini attivi. Questo eccesso esisterà come una posizione bidirezionale attiva. C'è, tuttavia, una nuova posizione storica con i deal riportati nella colonna verde. I suoi volumi iniziali e di uscita di 12 contratti si sono nuovamente sovrapposti.

Nel caso in cui il volume dell'ordine di chiusura sia maggiore dell'ordine di inizio, c'è anche un eccesso anche se questa volta è sul lato dell'ordine di chiusura:

Tabella 15. Unione di ordini con volumi diversi

Tabella 15. Unire ordini con volumi differenti

Come possiamo vedere, l'ordine iniziale con il volume 4 e l'ordine di chiusura con il volume 6 creano due posizioni. La prima è una posizione storica con volume 4 e tratta 625 dell'ordine iniziale e 719, №720 dell'ordine di chiusura. La seconda posizione è un eccesso di offerte di abbinamento di questi ordini. Contiene il deal №719 con il volume 2. Questa transazione insieme all'ordine, creano una posizione attiva nella scheda "Attivo" del pannello HedgeTerminal.

Le offerte e gli ordini possono essere suddivisi dall'algoritmo in posizioni storiche e attive. I volumi possono essere diversi. La cosa principale è che l'algoritmo consente di riunire i volumi degli ordini di avvio e di chiusura formando una posizione storica con volumi uguali di entrata e uscita. Questo assicura che non si verifichi una situazione tale che questi volumi non sono uguali e quindi degli errori di rappresentazione della posizione che causano un'asimmetria della posizione.

Supponiamo che nel primo esempio il broker abbia annullato un'operazione inclusa nell'ordine di chiusura:

Tabella16. Simulazione di eliminazione di un deal dallo storico

Tabella 16. Simulazione dell'eliminazione di un deal dalla cronologia

Una nuova posizione netta con un volume di 6 contratti. Sarà pari al volume delle trattative annullate. Vediamo come funzionerà l'algoritmo di Hedge Terminal in questo caso:

Tabella 17. Ripristino dell'integrità della rappresentazione

Tabella 17. Ripristino dell'integrità della rappresentazione

Come si vede, al secondo passaggio c'è un eccesso di 6 contratti (3+2+1). Questo eccesso si trasformerà in una posizione attiva e quindi il volume e la direzione della posizione bidirezionale sarà uguale a quello della posizione netta.

Riassumendo, possiamo dire che l'algoritmo di unificazione delle operazioni garantisce l'uguaglianza dei volumi degli ordini di avvio e di chiusura nelle posizioni storiche a causa di un'eccessiva operazione non legata. Questo eccesso di operazioni rende attiva una posizione bidirezionale, che rende la posizione netta in MetaTrader 5 uguale alla posizione netta di tutte le posizioni attive in HedgeTerminal.

Questo meccanismo funziona sia in modo retrospettivo che in tempo reale e ciò significa che renderà le posizioni nette in Hedge Terminal anche con la posizione netta in MetaTrader 5 indipendentemente dall'azione del broker sull'annullamento delle azioni di trading. Le combinazioni sulla modifica di una posizione netta e sull'annullamento dell'operazione possono essere in quanto non causano asimmetria tra la posizione netta del terminale e la posizione netta di HedgeTerminal.

Il meccanismo di chiusura parziale della posizione si basa sulla capacità di questo algoritmo di mettere insieme diversi volumi. Questo algoritmo è una delle parti più importanti di HedgeTerminal in quanto garantisce il suo funzionamento stabile come sistema autoadattativo senza bisogno di impostazioni.


3.9. Virtualizzazione di ordini e offerte

Ogni ordine e deal in HedgeTerminal ha un vero prototipo con un identificatore corrispondente. Tuttavia, dal punto di vista di HedgeTerminal un ordine può costituire una posizione attiva e allo stesso tempo far parte di una posizione storica. Le offerte e gli ordini in MetaTrader 5 sono entità indivisibili. Un ordine nella piattaforma può essere in sospeso o eseguito. Anche un deal ha un volume costante ed è sempre una transazione eseguita.

In HedgeTerminal gli stessi ordini e operazioni possono essere presenti in diverse posizioni bidirezionali. Lo stesso deal o ordine in esso può creare una posizione attiva e storica. In altre parole, gli ordini e i deal in HedgeTerminal sono divisi in svariati ordini e deal virtuali. Questa rappresentazione dei dati differisce notevolmente dalla rappresentazione dei dati in MetaTrader 5. Tuttavia, questa rappresentazione consente di essere flessibili e di adattarsi ai cambiamenti retrospettivi delle informazioni di trading e di riunire ordini e operazioni.


3.10. Meccanismo di occultamento degli ordini

Abbiamo menzionato il meccanismo di nascondere gli ordini nella sezione che descrive l'installazione di HedgeTerminal. HedgeTerminal può ignorare alcuni ordini. Affinché un ordine o una transazione smetta di esistere per HedgeTerminal, è sufficiente inserire il suo identificatore nel file designato ExcludeOrders.xml.

Supponiamo di avere più ordini di vendita o di acquisto eseguiti su un simbolo. Il volume aggregato degli ordini di vendita è uguale al volume aggregato degli ordini di acquisto. In questo modo, non importa quanti ordini abbiamo, la loro posizione totale sarà uguale a zero. Se gli identificatori di questi ordini non sono nel file ExcludeOrders.xml, HedgeTerminal visualizzerà ciascuno di essi come una posizione bidirezionale. La loro posizione totale però sarà zero. Pertanto, se una posizione netta in MetaTrader 5 è zero, il contributo di questo ordine impostato alla posizione netta può essere semplicemente ignorato.

Ora, supponiamo che al momento t, abbiamo una posizione netta zero sul simbolo S e un insieme di ordini N eseguiti su questo simbolo a un’ora precisa. Non essendoci una posizione su questo simbolo, il volume totale dell'insieme degli ordini N è insignificante. Infatti, il numero di ordini e il loro volume sono irrilevanti in quanto non essendoci posizione, questi ordini non contribuiscono alla posizione netta totale. Ciò significa che tali ordini possono essere semplicemente ignorati e non è necessario rappresentarli come posizioni bidirezionali.

Questo è lo stesso meccanismo che HedgeTerminal utilizza al momento della sua installazione. Al momento dell'installazione t se non c'è una posizione netta, HedgeTerminal include l'insieme degli ordini N nell'elenco delle eccezioni. Il loro volume e il loro numero totale sono irrilevanti in quanto non esiste una posizione netta. Se c'è una posizione netta al momento dell'installazione di HedgeTerminal, semplicemente non verrà installata finché la posizione netta non sarà chiusa. Dopo l'installazione, i nuovi ordini modificheranno lo stato della posizione netta. Questo stato però sarà sincronizzato con il volume netto delle posizioni bidirezionali in HedgeTerminal.

Apparentemente, potremmo cavarcela senza mettere gli ordini eseguiti al momento di HedgeTerminal nell'elenco delle eccezioni. Allo stesso tempo, può succedere che ci siano molti ordini al momento dell'installazione e dal punto di vista di HedgeTerminal tutti diventeranno posizioni bidirezionali e il loro volume totale cab differirà dal volume netto in MetaTrader 5 .

Il meccanismo di occultamento degli ordini può essere efficace contro la corruzione della cronologia dell'account. Funziona in questo modo: Supponiamo che ci sia una cronologia degli ordini. Quando HedgeTerminal viene lanciato su questo account, itererà tutti gli ordini e creerà una posizione bidirezionale basata su di essi. Se tutti gli ordini sono disponibili dal momento dell'apertura e i dati su questi ordini non sono corrotti, la posizione netta di questi ordini sarà corrispondente alla posizione netta in MetaTrader 5. Apparentemente, la posizione netta in HedgeTerminal sarà pari alla somma di questi ordini. Ciò è illustrato nello schema seguente:

Fig. 45. Schema dello storico (cronologia) completo

Fig. 45. Schema dello storico (cronologia) completo

Una parte della cronologia può mancare o le informazioni sugli ordini possono essere errate.

Non è importante se mancano un solo ordine o più ordini e non importa se mancano informazioni sul conto all'inizio della cronologia o nel mezzo. La posizione netta in HedgeTerminal in esecuzione su tale conto è uguale alla posizione netta di tutti gli ordini disponibili. La posizione netta degli ordini non sarà uguale alla posizione netta effettiva del terminale a causa della parte mancante dello storico. Questa situazione è presentata nel diagramma B:

Fig. 46. Cronologia parzialmente corrotta

Fig. 46. Cronologia parzialmente corrotta

Per sincronizzare una posizione netta in HedgeTerminal con la posizione netta effettiva in MetaTrader 5, non abbiamo bisogno di sapere quali ordini sono scomparsi o corrotti. Tutto ciò di cui abbiamo bisogno è calcolare la differenza tra queste posizioni nette. Nell'esempio sopra, una posizione da acquistare con il volume di 5 contratti è aperta nel terminale MetaTrader 5. In HedgeTerminal ciò corrisponderà a una posizione lunga totale per 8 contratti. La differenza tra queste due posizioni sarà di 3 contratti da acquistare perché 8 BUY – 5 BUY = 3 BUY.

Dopo che la differenza contrattuale è stata calcolata, è necessario inserire un ordine di acquisto o vendita corrispondente, con il volume pari alla differenza. Nel nostro esempio è necessario effettuare un ordine di acquisto di 3 contratti. Quando l'ordine viene eseguito, HedgeTerminal lo visualizzerà nella scheda delle posizioni attive e la sua posizione netta totale aumenterà di 3 contratti e diventerà pari a 11 contratti da acquistare.

Anche la posizione in MetaTrader 5 aumenterà e farà 8 contratti. L'identificatore di questo ordine deve essere inserito nell'elenco di ExcludeOrders.xml. In seguito il terminale dovrà essere riavviato. Quindi, se l'identificatore del nostro ordine è uguale a 101162513, nel file dovrebbe essere scritto il seguente tag:

<Orders-Exclude>
        ...
        <Order AccountID="10052699" ID="101162513"></Order>
</Orders-Exclude>

Dopo aver riavviato HedgeTerminal, questa posizione bidirezionale scomparirà. In questo modo una posizione netta in MetaTrader 5 corrisponderà a una posizione netta in HedgeTerminal e farà 5 contratti da acquistare. La sequenza di azioni descritta è presentata nello schema seguente:

Fig. 47. Schema del ripristino dell'integrità dei dati

Fig. 47. Schema del ripristino dell'integrità dei dati

Il risultato finanziario della posizione scomparsa non verrà registrato nelle statistiche di HedgeTerminal. Sfortunatamente, le posizioni bidirezionali nascoste non prendono parte alle statistiche di trading.

In realtà, una situazione in cui una parte della cronologia non è disponibile o è danneggiata, è altamente improbabile. Tale meccanismo deve essere presente, anche se la maggior parte degli utenti di MetaTrader 5 non si imbatterà mai in una situazione in cui è necessario utilizzarlo. Dopotutto una possibilità di errori di programma di HedgeTerminal non è esclusa. Anche in questo caso dovrebbe esserci uno strumento affidabile per risolvere questi errori.


3.11. Meccanismi di adattamento

Abbiamo considerato i meccanismi che consentono a HedgeTerminal di rappresentare posizioni bidirezionali nell'ambiente netto di MetaTrader 5. Ci sono tre di questi meccanismi:

  1. Iterazione sequenziale dei deal;
  2. Meccanismo di scissione e accorpamento dei deal;
  3. Meccanismo di occultamento degli ordini.

Ciascuno di questi meccanismi affronta i propri problemi e consente di evitare ambiguità ed errori ai propri livelli. Presentiamo ora questi problemi e le loro soluzioni. La prima colonna contiene i problemi e gli eventuali errori di associazione e la seconda colonna i meccanismi che li risolvono:

Problemi, errori, ambiguità che sorgono nell'organizzazione commerciale bidirezionaleMeccanismi di correzione degli errori
Errori nei link agli ordini di apertura; collisione di collegamento; Numeri magici lunghi negli Expert; cancellazione degli ordini dallo storico; Errori di esecuzione dell'operazione di trading.Iterazione sequenziale sugli ordini. Determinismo delle azioni.
Errori di volume; Abbinare ordini con volumi differenti; esecuzione parziale dell'ordine; cancellare i deal dalla cronologia; Coprire un volume più piccolo con uno più grande.Meccanismo di suddivisione e corrispondenza dei deal.
Installazione di HedgeTerminal sul conto con un gran numero di ordini eseguiti; Storia corrotta; Bug di HedgeTerminal nel lavoro con gli ordini.Meccanismo di occultamento degli ordini.

Tabella 18. Possibili errori e meccanismi per la loro eliminazione

Tutti e tre i meccanismi insieme al sistema di memorizzazione dei collegamenti garantiscono una rappresentazione stabile dei dati. In sostanza, questi meccanismi coprono tutti i possibili casi di guasti imprevisti e garantiscono la corrispondenza della posizione netta in HedgeTerminal con la posizione netta in MetaTrader 5.


3.12. Prestazioni e utilizzo della memoria

HedgeTerminal è essenzialmente un'applicazione orientata agli oggetti. A causa dei principi OOP alla base della sua architettura, il terminale ha un'elevata efficienza e bassi requisiti per lo storage. L'unica attività che consuma risorse è l’estrazione della cronologia degli ordini e delle offerte nella memoria del computer al momento dell'avvio del terminale su un grafico.

Dopo che tutte le transazioni richieste sono state estratte dalla memoria, il terminale stamperà un messaggio che informa sul tempo impiegato per questa operazione e anche sull'utilizzo della memoria. L'avvio del pannello HedgeTerminal sull'account contenente più di 20.000 offerte sul computer con processore Intel i7 ha richiesto meno di 30 secondi e ha richiesto 118 Mb di RAM:

2014.11.20 16:26:19.785 hedgeterminalultimate (EURUSD,H1)       We begin. Parsing of history deals (22156) and orders (22237) completed for 28.080 sec. 118MB RAM used.

La libreria HedgeTerminalAPI funziona ancora più velocemente e richiede molta meno memoria poiché non è richiesta la rappresentazione grafica delle transazioni. Di seguito il risultato del lancio sullo stesso account:

2014.11.20 16:21:46.183 TestHedgeTerminalAPI (EURUSD,H1)        We are begin. Parsing of history deals (22156) and orders (22237) completed for 22.792 sec. 44MB RAM used.

Un semplice calcolo mostra che l'estrazione di una posizione richiede da 1 a 1,26 millisecondi a seconda del tipo di programma. La memorizzazione di una transazione richiede: (22 156 deal + 22237 ordini) / 44 Mb = 1 Kb di RAM. La memorizzazione di una rappresentazione grafica aggiuntiva di una transazione richiede circa: (118 Mb – 44 Mb) * 1024 / (22 156 deal + 22237 ordini) = 1,71 Kb di memoria.

La profilazione del codice mostra che la maggior parte del tempo essa è occupata dal solo blocco dell'analisi dell'ordine. La parte principale di quest'ultima è la chiamata alla funzione di sistema. Nelle future versioni questo blocco sarà ottimizzato e ciò consentirà di aumentare l'efficienza al lancio del 10-15%.


Conclusione

Abbiamo considerato i punti chiave dell’utilizzo del pannello visivo HedgeTerminal. Esso rappresenta un esempio di creazione di una nuova classe di pannelli con possibilità di configurazione flessibile.

Schemi e specifiche hanno dato un'idea approfondita dei principi di organizzazione del trading bidirezionale. Se stai creando le tue librerie di virtualizzazione, il secondo capitolo di questo articolo ti aiuterà a progettarle.

Il carattere dell'esecuzione dello scambio richiede di prendere in considerazione i punti chiave nel processo di rappresentazione del deal e dell'ordine come posizioni bidirezionali. Questo articolo ha mostrato che tale rappresentazione sarebbe stata impossibile senza la virtualizzazione di deal e ordini. La virtualizzazione è un meccanismo che "rompe" il volume dei deal eseguiti e clona ordini reali in modo che un ordine possa far parte di diverse transazioni.

Queste manipolazioni con l'ambiente di trading sono piuttosto coraggiose, tuttavia la maggior parte delle informazioni richieste alla virtualizzazione è memorizzata sul server di trading, tale rappresentazione può essere considerata affidabile.


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

Trading bidirezionale e copertura delle posizioni in MetaTrader 5 utilizzando l'API HedgeTerminal, parte 2 Trading bidirezionale e copertura delle posizioni in MetaTrader 5 utilizzando l'API HedgeTerminal, parte 2
Questo articolo descrive un nuovo approccio alla copertura delle posizioni e pone dei limiti nei dibattiti tra gli utenti di MetaTrader 4 e MetaTrader 5 su questo argomento. È una continuazione della prima parte: "Trading bidirezionale e copertura delle posizioni in MetaTrader 5 utilizzando il pannello HedgeTerminal, parte 1". Nella seconda parte, discutiamo dell'integrazione di Expert Advisor personalizzati con HedgeTerminalAPI, che è una libreria di visualizzazione speciale progettata per il trading bidirezionale in un comodo ambiente software che fornisce strumenti per una comoda gestione della posizione.
Principi dei prezzi di scambio attraverso l'esempio del mercato dei derivati della Borsa di Mosca Principi dei prezzi di scambio attraverso l'esempio del mercato dei derivati della Borsa di Mosca
Questo articolo descrive la teoria dei prezzi di cambio e le specifiche di compensazione del mercato dei derivati della Borsa di Mosca. Questo è un articolo completo per i principianti che cercano una prima esperienza di scambio sul trading di derivati, così come per i trader forex esperti che stanno considerando di fare trading su una piattaforma di scambio centralizzata.
Studiare la classe CCanvas. Come disegnare oggetti trasparenti Studiare la classe CCanvas. Come disegnare oggetti trasparenti
La solida grafica scomoda delle medie mobili non ti va più bene? Vuoi disegnare qualcosa di più bello di un semplice rettangolo riempito di colore nel tuo terminale? Puoi disegnare una grafica più accattivante nel tuo terminale. Questo può essere implementato tramite la classe CСanvas, che viene utilizzata per creare grafiche personalizzate. Con questa classe è possibile implementare la trasparenza, fondere i colori e produrre l'illusione della trasparenza mediante la sovrapposizione e la fusione dei colori.
Programmazione delle modalità di EA utilizzando l'approccio orientato agli oggetti Programmazione delle modalità di EA utilizzando l'approccio orientato agli oggetti
Questo articolo parla della programmazione di robot di trading multimodale in MQL5. Ogni modalità è implementata con l'approccio orientato agli oggetti. Vengono fornite istanze sia della gerarchia delle classi di modalità che delle classi per il test. Si suppone che la programmazione multimodale dei robot di trading tenga conto di tutte le peculiarità di ogni modalità operativa di un EA scritto in MQL5. Le funzioni e l'enumerazione vengono create per identificare la modalità.