Manuale MQL5: Gestione di BookEvent
Introduzione
Come è noto, il terminale di trading MetaTrader 5 è una piattaforma multi-mercato, che facilita il trading su Forex, mercati azionari, Futures e Contratti per Differenza. Secondo le statistiche della sezione Freelance, il numero di trader che fanno trading è in crescita e non solo sul mercato Forex.
In questo articolo vorrei introdurre i programmatori MQL5 alle prime armi alla gestione di BookEvent. Questo evento è collegato a Depth of Market, uno strumento per la negoziazione di asset azionari e dei loro derivati. I trader Forex, tuttavia, possono trovare utile anche la Depth of Market. Nei conti ECN, i fornitori di liquidità forniscono dati sugli ordini, anche se solo all'interno del loro modello aggregatore. Questi account stanno diventando più popolari.
1. BookEvent
Secondo la Documentazione, questo evento viene generato quando cambia lo stato di Depth of Market. Siamo d'accordo che BookEvent è un evento Depth of Market.
La Depth of Market è una serie di ordini, che differiscono per direzione (vendita e acquisto), prezzo e volume. I prezzi in Depth of Market sono vicini a quelli di mercato e quindi sono considerati i migliori.
Fig.1 Depth of Market in MetaTrader 5
In MetaTrader 5 un "order book" è denominato "Depth of Market" (Fig.1). Informazioni dettagliate sulla Depth of Market sono disponibili nella Guida per l'utente al terminale del cliente.
La struttura MqlBookInfo che fornisce informazioni sulla Depth of Market va menzionata separatamente.
struct MqlBookInfo { ENUM_BOOK_TYPE type; // order type from the ENUM_BOOK_TYPE enumeration double price; // price long volume; // volume };
Contiene tre campi. I dati sul tipo di ordine, prezzo e volume possono essere ottenuti elaborando la struttura dell'ordine.
2. Gestore eventi di BookEvent
La funzione di gestione degli eventi OnBookEvent() accetta una costante come parametro. È un riferimento a un parametro di stringa.
void OnBookEvent (const string& symbol)
Il parametro stringa contiene il nome del simbolo per il quale si è verificato un evento Depth of Market.
Il gestore eventi stesso richiede una preparazione preliminare. Affinché l'EA possa gestire un evento Depth of Market, questo evento deve essere sottoscritto utilizzando la funzione integrata MarketBookAdd(). Di solito si trova nel blocco di inizializzazione di EA. Se un evento Depth of Market non è stato sottoscritto, l'EA lo ignorerà.
Fornire la possibilità di annullare l'iscrizione alla ricezione di eventi è considerata una buona pratica di programmazione. Alla deinizializzazione, è necessario annullare l'iscrizione alla ricezione di tali dati chiamando la funzione MarketBookRelease().
Il meccanismo di sottoscrizione e cancellazione dalla ricezione dei dati è simile alla creazione e all'elaborazione di un timer, che deve essere attivato prima dell'elaborazione.
3. Modello di gestione degli eventi di libro
Creeremo un semplice modello di EA, che chiama la funzione OnBookEvent() e lo chiameremo BookEventProcessor1.mq5.
Il modello comprende un insieme minimo di gestori, che sono gestori di inizializzazione e deinizializzazione dell'EA, nonché gestori di eventi Depth of Market.
Lo stesso gestore di eventi di Depth of Market è molto semplice:
//+------------------------------------------------------------------+ //| BookEvent function | //+------------------------------------------------------------------+ void OnBookEvent(const string &symbol) { Print("Book event for: "+symbol); //--- select the symbol if(symbol==_Symbol) { //--- array of the DOM structures MqlBookInfo last_bookArray[]; //--- get the book if(MarketBookGet(_Symbol,last_bookArray)) { //--- process book data for(int idx=0;idx<ArraySize(last_bookArray);idx++) { MqlBookInfo curr_info=last_bookArray[idx]; //--- print PrintFormat("Type: %s",EnumToString(curr_info.type)); PrintFormat("Price: %0."+IntegerToString(_Digits)+"f",curr_info.price); PrintFormat("Volume: %d",curr_info.volume); } } } }
Poiché questo evento di Depth of Market è trasmesso (dopo l'abbonamento apparirà per tutti i simboli), è necessario specificare uno strumento richiesto.
Va notato però che nelle ultime build sono state introdotte modifiche al lavoro di Depth of Market. Nella versione attuale (build 975) non ho trovato alcun segno di trasmissione. Il conduttore è stato chiamato solo per il simbolo assegnato. Per provare questo fatto, ho semplicemente organizzato l'inserimento delle informazioni nel "Registro degli esperti".
Per farlo, utilizzeremo la funzione integrata MarketBookGet(). Restituirà tutte le informazioni su Depth of Market, ovvero il MqlBookInfo, array di strutture, che contiene i record di Depth of Market per il simbolo specificato. Va notato che questo array varierà di dimensioni, a seconda di un broker.
Il template permette di visualizzare i valori delle strutture array nel Log.
L'EA è stato lanciato per i futures SBRF-12.14 in modalità debug. La sequenza dei record nel registro degli esperti sarà la seguente:
EL 0 11:24:32.250 BookEventProcessor1 (SBRF-12.14,M1) Book event for: SBRF-12.14 MF 0 11:24:33.812 BookEventProcessor1 (SBRF-12.14,M1) Type: BOOK_TYPE_SELL KP 0 11:24:33.812 BookEventProcessor1 (SBRF-12.14,M1) Price: 7708 LJ 0 11:24:33.812 BookEventProcessor1 (SBRF-12.14,M1) Volume: 6 MP 0 11:24:33.812 BookEventProcessor1 (SBRF-12.14,M1) Type: BOOK_TYPE_SELL HF 0 11:24:33.812 BookEventProcessor1 (SBRF-12.14,M1) Price: 7705 LP 0 11:24:33.812 BookEventProcessor1 (SBRF-12.14,M1) Volume: 6 MJ 0 11:24:33.812 BookEventProcessor1 (SBRF-12.14,M1) Type: BOOK_TYPE_SELL GL 0 11:24:33.812 BookEventProcessor1 (SBRF-12.14,M1) Price: 7704 ON 0 11:24:33.812 BookEventProcessor1 (SBRF-12.14,M1) Volume: 3 MD 0 11:24:33.812 BookEventProcessor1 (SBRF-12.14,M1) Type: BOOK_TYPE_SELL FR 0 11:24:33.812 BookEventProcessor1 (SBRF-12.14,M1) Price: 7703 PD 0 11:24:33.812 BookEventProcessor1 (SBRF-12.14,M1) Volume: 2 MN 0 11:24:33.812 BookEventProcessor1 (SBRF-12.14,M1) Type: BOOK_TYPE_SELL DH 0 11:24:33.812 BookEventProcessor1 (SBRF-12.14,M1) Price: 7701 QQ 0 11:24:33.812 BookEventProcessor1 (SBRF-12.14,M1) Volume: 10 GH 0 11:24:33.812 BookEventProcessor1 (SBRF-12.14,M1) Type: BOOK_TYPE_SELL QM 0 11:24:33.812 BookEventProcessor1 (SBRF-12.14,M1) Price: 7700 OK 0 11:24:33.812 BookEventProcessor1 (SBRF-12.14,M1) Volume: 1011 ER 0 11:24:33.812 BookEventProcessor1 (SBRF-12.14,M1) Type: BOOK_TYPE_SELL KS 0 11:24:33.812 BookEventProcessor1 (SBRF-12.14,M1) Price: 7698 EE 0 11:24:33.812 BookEventProcessor1 (SBRF-12.14,M1) Volume: 50 OM 0 11:24:33.812 BookEventProcessor1 (SBRF-12.14,M1) Type: BOOK_TYPE_SELL KI 0 11:24:33.812 BookEventProcessor1 (SBRF-12.14,M1) Price: 7696 IO 0 11:24:33.812 BookEventProcessor1 (SBRF-12.14,M1) Volume: 21 QG 0 11:24:33.812 BookEventProcessor1 (SBRF-12.14,M1) Type: BOOK_TYPE_SELL LO 0 11:24:33.812 BookEventProcessor1 (SBRF-12.14,M1) Price: 7695 MK 0 11:24:33.812 BookEventProcessor1 (SBRF-12.14,M1) Volume: 1 QQ 0 11:24:33.812 BookEventProcessor1 (SBRF-12.14,M1) Type: BOOK_TYPE_SELL KE 0 11:24:33.812 BookEventProcessor1 (SBRF-12.14,M1) Price: 7694 QQ 0 11:24:33.812 BookEventProcessor1 (SBRF-12.14,M1) Volume: 5 QK 0 11:24:33.812 BookEventProcessor1 (SBRF-12.14,M1) Type: BOOK_TYPE_SELL PK 0 11:24:33.812 BookEventProcessor1 (SBRF-12.14,M1) Price: 7691 LO 0 11:24:33.812 BookEventProcessor1 (SBRF-12.14,M1) Volume: 2 QE 0 11:24:33.812 BookEventProcessor1 (SBRF-12.14,M1) Type: BOOK_TYPE_SELL HQ 0 11:24:33.812 BookEventProcessor1 (SBRF-12.14,M1) Price: 7688 OE 0 11:24:33.812 BookEventProcessor1 (SBRF-12.14,M1) Volume: 106 MO 0 11:24:33.812 BookEventProcessor1 (SBRF-12.14,M1) Type: BOOK_TYPE_SELL RG 0 11:24:33.812 BookEventProcessor1 (SBRF-12.14,M1) Price: 7686 IP 0 11:24:33.812 BookEventProcessor1 (SBRF-12.14,M1) Volume: 18 GI 0 11:24:33.812 BookEventProcessor1 (SBRF-12.14,M1) Type: BOOK_TYPE_SELL FL 0 11:24:33.812 BookEventProcessor1 (SBRF-12.14,M1) Price: 7684 QI 0 11:24:33.812 BookEventProcessor1 (SBRF-12.14,M1) Volume: 3 GS 0 11:24:33.812 BookEventProcessor1 (SBRF-12.14,M1) Type: BOOK_TYPE_SELL IR 0 11:24:33.812 BookEventProcessor1 (SBRF-12.14,M1) Price: 7681 LG 0 11:24:33.812 BookEventProcessor1 (SBRF-12.14,M1) Volume: 4 GM 0 11:24:33.812 BookEventProcessor1 (SBRF-12.14,M1) Type: BOOK_TYPE_SELL JH 0 11:24:33.812 BookEventProcessor1 (SBRF-12.14,M1) Price: 7680 RM 0 11:24:33.812 BookEventProcessor1 (SBRF-12.14,M1) Volume: 2 GG 0 11:24:33.812 BookEventProcessor1 (SBRF-12.14,M1) Type: BOOK_TYPE_SELL DN 0 11:24:33.812 BookEventProcessor1 (SBRF-12.14,M1) Price: 7679 HH 0 11:24:33.812 BookEventProcessor1 (SBRF-12.14,M1) Volume: 19 IQ 0 11:24:33.812 BookEventProcessor1 (SBRF-12.14,M1) Type: BOOK_TYPE_SELL ED 0 11:24:33.812 BookEventProcessor1 (SBRF-12.14,M1) Price: 7678 EQ 0 11:24:33.812 BookEventProcessor1 (SBRF-12.14,M1) Volume: 1 IK 0 11:24:33.812 BookEventProcessor1 (SBRF-12.14,M1) Type: BOOK_TYPE_SELL OJ 0 11:24:33.812 BookEventProcessor1 (SBRF-12.14,M1) Price: 7676 DO 0 11:24:33.812 BookEventProcessor1 (SBRF-12.14,M1) Volume: 2 IE 0 11:24:33.812 BookEventProcessor1 (SBRF-12.14,M1) Type: BOOK_TYPE_SELL RP 0 11:24:33.812 BookEventProcessor1 (SBRF-12.14,M1) Price: 7675 EE 0 11:24:33.812 BookEventProcessor1 (SBRF-12.14,M1) Volume: 1 QR 0 11:24:33.812 BookEventProcessor1 (SBRF-12.14,M1) Type: BOOK_TYPE_BUY LF 0 11:24:33.812 BookEventProcessor1 (SBRF-12.14,M1) Price: 7671 LP 0 11:24:33.812 BookEventProcessor1 (SBRF-12.14,M1) Volume: 40 QD 0 11:24:33.812 BookEventProcessor1 (SBRF-12.14,M1) Type: BOOK_TYPE_BUY KL 0 11:24:33.812 BookEventProcessor1 (SBRF-12.14,M1) Price: 7670 QJ 0 11:24:33.812 BookEventProcessor1 (SBRF-12.14,M1) Volume: 21 QN 0 11:24:33.812 BookEventProcessor1 (SBRF-12.14,M1) Type: BOOK_TYPE_BUY CR 0 11:24:33.812 BookEventProcessor1 (SBRF-12.14,M1) Price: 7669 RD 0 11:24:33.812 BookEventProcessor1 (SBRF-12.14,M1) Volume: 20 QP 0 11:24:33.812 BookEventProcessor1 (SBRF-12.14,M1) Type: BOOK_TYPE_BUY DH 0 11:24:33.812 BookEventProcessor1 (SBRF-12.14,M1) Price: 7668 NN 0 11:24:33.812 BookEventProcessor1 (SBRF-12.14,M1) Volume: 17 QJ 0 11:24:33.812 BookEventProcessor1 (SBRF-12.14,M1) Type: BOOK_TYPE_BUY QN 0 11:24:33.812 BookEventProcessor1 (SBRF-12.14,M1) Price: 7667 RK 0 11:24:33.812 BookEventProcessor1 (SBRF-12.14,M1) Volume: 2 OL 0 11:24:33.812 BookEventProcessor1 (SBRF-12.14,M1) Type: BOOK_TYPE_BUY DE 0 11:24:33.812 BookEventProcessor1 (SBRF-12.14,M1) Price: 7666 MQ 0 11:24:33.812 BookEventProcessor1 (SBRF-12.14,M1) Volume: 151 QF 0 11:24:33.812 BookEventProcessor1 (SBRF-12.14,M1) Type: BOOK_TYPE_BUY OJ 0 11:24:33.812 BookEventProcessor1 (SBRF-12.14,M1) Price: 7665 RO 0 11:24:33.812 BookEventProcessor1 (SBRF-12.14,M1) Volume: 2 OH 0 11:24:33.812 BookEventProcessor1 (SBRF-12.14,M1) Type: BOOK_TYPE_BUY FQ 0 11:24:33.812 BookEventProcessor1 (SBRF-12.14,M1) Price: 7664 EF 0 11:24:33.812 BookEventProcessor1 (SBRF-12.14,M1) Volume: 49 OR 0 11:24:33.812 BookEventProcessor1 (SBRF-12.14,M1) Type: BOOK_TYPE_BUY GG 0 11:24:33.812 BookEventProcessor1 (SBRF-12.14,M1) Price: 7663 OS 0 11:24:33.812 BookEventProcessor1 (SBRF-12.14,M1) Volume: 3 ED 0 11:24:33.812 BookEventProcessor1 (SBRF-12.14,M1) Type: BOOK_TYPE_BUY JM 0 11:24:33.812 BookEventProcessor1 (SBRF-12.14,M1) Price: 7662 PI 0 11:24:33.812 BookEventProcessor1 (SBRF-12.14,M1) Volume: 4 CN 0 11:24:33.812 BookEventProcessor1 (SBRF-12.14,M1) Type: BOOK_TYPE_BUY ES 0 11:24:33.812 BookEventProcessor1 (SBRF-12.14,M1) Price: 7661 LD 0 11:24:33.812 BookEventProcessor1 (SBRF-12.14,M1) Volume: 13 CP 0 11:24:33.812 BookEventProcessor1 (SBRF-12.14,M1) Type: BOOK_TYPE_BUY FI 0 11:24:33.812 BookEventProcessor1 (SBRF-12.14,M1) Price: 7660 LM 0 11:24:33.812 BookEventProcessor1 (SBRF-12.14,M1) Volume: 2 IJ 0 11:24:33.812 BookEventProcessor1 (SBRF-12.14,M1) Type: BOOK_TYPE_BUY NO 0 11:24:33.812 BookEventProcessor1 (SBRF-12.14,M1) Price: 7659 II 0 11:24:33.812 BookEventProcessor1 (SBRF-12.14,M1) Volume: 12 IL 0 11:24:33.812 BookEventProcessor1 (SBRF-12.14,M1) Type: BOOK_TYPE_BUY ME 0 11:24:33.812 BookEventProcessor1 (SBRF-12.14,M1) Price: 7658 IP 0 11:24:33.812 BookEventProcessor1 (SBRF-12.14,M1) Volume: 3 GF 0 11:24:33.812 BookEventProcessor1 (SBRF-12.14,M1) Type: BOOK_TYPE_BUY NK 0 11:24:33.812 BookEventProcessor1 (SBRF-12.14,M1) Price: 7657 FM 0 11:24:33.812 BookEventProcessor1 (SBRF-12.14,M1) Volume: 15 GH 0 11:24:33.812 BookEventProcessor1 (SBRF-12.14,M1) Type: BOOK_TYPE_BUY MQ 0 11:24:33.812 BookEventProcessor1 (SBRF-12.14,M1) Price: 7656 DD 0 11:24:33.812 BookEventProcessor1 (SBRF-12.14,M1) Volume: 6 MS 0 11:24:33.812 BookEventProcessor1 (SBRF-12.14,M1) Type: BOOK_TYPE_BUY NG 0 11:24:33.812 BookEventProcessor1 (SBRF-12.14,M1) Price: 7655 KR 0 11:24:33.812 BookEventProcessor1 (SBRF-12.14,M1) Volume: 9 KE 0 11:24:33.812 BookEventProcessor1 (SBRF-12.14,M1) Type: BOOK_TYPE_BUY OM 0 11:24:33.812 BookEventProcessor1 (SBRF-12.14,M1) Price: 7654 IK 0 11:24:33.812 BookEventProcessor1 (SBRF-12.14,M1) Volume: 14 KO 0 11:24:33.812 BookEventProcessor1 (SBRF-12.14,M1) Type: BOOK_TYPE_BUY NS 0 11:24:33.812 BookEventProcessor1 (SBRF-12.14,M1) Price: 7653 DF 0 11:24:33.812 BookEventProcessor1 (SBRF-12.14,M1) Volume: 534 MQ 0 11:24:33.812 BookEventProcessor1 (SBRF-12.14,M1) Type: BOOK_TYPE_BUY OI 0 11:24:33.812 BookEventProcessor1 (SBRF-12.14,M1) Price: 7652 IO 0 11:24:33.812 BookEventProcessor1 (SBRF-12.14,M1) Volume: 25
È come appariva la Depth of Market in un determinato momento. Il primo elemento dell'array di strutture è un ordine di vendita al prezzo più alto (7708 Rub). L'ultimo elemento dell'array è un ordine da acquistare al prezzo più basso (7652 Rub). Quindi, i dati sulla Depth of Market vengono letti nell'array dall'alto verso il basso.
Per comodità, ho raccolto i dati nella tabella 1.
Tabella 1. Depth of Market per SBRF-12.14
Il blocco superiore evidenziato in rosso contiene ordini di vendita (limiti di vendita). Il blocco inferiore evidenziato in verde include ordini di acquisto (buy-limits).
È ovvio che tra tutti gli ordini di vendita, l'ordine n. 6 ha avuto il volume maggiore con il prezzo di 7700 Rub e un volume di 1011 lotti. L'ordine #39 ha avuto il volume più grande di tutti gli ordini di acquisto con il prezzo di 7653 Rub e un volume di 534 lotti.
I dati di origine in Depth of Market sono le informazioni che un trader analizza per elaborare una strategia di trading. L'idea di trading più semplice è che la raccolta e il raggruppamento di ordini con volumi significativi a livelli di prezzo contigui creano zone di supporto e resistenza. Nella sezione seguente, creeremo un indicatore che terrà traccia dei cambiamenti nella Depth of Market.
4. Depth of Market
Esistono molti indicatori diversi che funzionano con i dati sulla Depth of Market. Puoi trovarne alcuni interessanti nel Market di MetaTrader 5. Mi piace più di tutti Ishift. Yury Kulikov, lo sviluppatore, è riuscito a creare uno strumento compatto e informativo.
Tutti i programmi, che lavorano con i dati sulla Depth of Market, avranno una forma di Expert Advisor o di un indicatore, poiché solo questi programmi MQL5 dispongono del gestore di eventi BookEvent.
Creiamo un breve programma che mostrerà dati in tempo reale sulla Depth of Market. Per prima cosa dobbiamo specificare i dati da visualizzare. Sarà un pannello, con barre orizzontali che indicano il volume dell'ordine. La dimensione delle barre, tuttavia, sarà di natura relativa. Il volume massimo di tutti gli ordini correnti sarà considerato pari al 100%. La Fig. 2 mostra che l'ordine al prezzo di 7507 Rub ha il volume maggiore di 519 lotti.
Per una corretta inizializzazione del pannello è necessario specificare l'esatta Depth of Market o il numero di livelli (parametro "DOM depth"). Questo numero varia da broker a broker.
Fig. 2 Pannello Depth of Market
Il codice del programma per il pannello è scritto con approccio di programmazione orientata agli oggetti. La classe responsabile dell'operazione del pannello è denominata CBookBarsPanel.
//+------------------------------------------------------------------+ //| Book bars class | //+------------------------------------------------------------------+ class CBookBarsPanel { private: //--- Data members CArrayObj m_obj_arr; uint m_arr_size; //--- uint m_width; uint m_height; //--- Methods public: void CBookBarsPanel(const uint _arr_size); void ~CBookBarsPanel(void){}; //--- bool Init(const uint _width,const uint _height); void Deinit(void){this.m_obj_arr.Clear();}; void Refresh(const MqlBookInfo &_bookArray[]); };
Questa classe contiene quattro membri di dati.
- L'attributo m_obj_arr è un contenitore per i puntatori agli oggetti del tipo CObject. Viene utilizzato per memorizzare i dati sulla Depth of Market. Per quest'ultimo verrà creata una classe separata.
- L'attributo m_arr_size è responsabile del numero di livelli di Depth of Market.
- Gli attributi m_width e m_height memorizzano le dimensioni del pannello (larghezza e altezza in pixel).
Per quanto riguarda i metodi, il loro insieme oltre a costruttore e distruttore standard include:
- metodo di inizializzazione
- metodo di deinizializzazione
- metodo di aggiornamento
Creeremo la classe CBookRecord separata per ogni riga del pannello (livello di Depth of Market) specificando il prezzo, la barra orizzontale e il volume.
Comprenderà tre puntatori. Uno di questi punterà all'oggetto del tipo CChartObjectRectLabel (etichetta rettangolare per lavorare con una barra orizzontale) e due puntatori del tipo CChartObjectLabel (etichette di testo per il prezzo e il volume).
//+------------------------------------------------------------------+ //| Book record class | //+------------------------------------------------------------------+ class CBookRecord : public CObject { private: //--- Data members CChartObjectRectLabel *m_rect; CChartObjectLabel *m_price; CChartObjectLabel *m_vol; //--- color m_color; //--- Methods public: void CBookRecord(void); void ~CBookRecord(void); bool Create(const string _name,const color _color,const int _X, const int _Y,const int _X_size,const int _Y_size); //--- data bool DataSet(const long _vol,const double _pr,const uint _len); bool DataGet(long &_vol,double &_pr) const; private: string StringVolumeFormat(const long _vol); };
Tra i metodi ci sono:
- metodo di creazione di un record;
- metodo di impostazione dei dati;
- modalità di ricezione dei dati;
- metodo di formattazione di grandi numeri.
Quindi il gestore di BookEvent per EA e, in sostanza, l'indicatore, apparirà come segue:
//+------------------------------------------------------------------+ //| BookEvent function | //+------------------------------------------------------------------+ void OnBookEvent(const string &symbol) { //--- select the symbol if(symbol==_Symbol) { //--- array of the DOM structures MqlBookInfo last_bookArray[]; //--- get the book if(MarketBookGet(_Symbol,last_bookArray)) //--- refresh panel myPanel.Refresh(last_bookArray); } }
Quindi, ogni volta che viene generato BookEvent, il pannello aggiornerà i suoi dati. Chiameremo la versione aggiornata del programma come BookEventProcessor2.mq5.
Nel video qui sopra puoi vedere come funziona l'EA.
Conclusione
Questo articolo è dedicato a un altro evento del Terminal: l'evento Depth of Market. Questo evento è spesso al centro degli algoritmi di trading ad alta frequenza (HFT). Questo tipo di trading sta guadagnando popolarità tra i trader.
Spero che i trader che iniziano a programmare su MQL5 troveranno utili esempi inclusi di gestione dell'evento Depth of Market. I file sorgente allegati a questo articolo sono comodi da inserire nella cartella del progetto. Nel mio caso è \MQL5\Projects\BookEvent.
Tradotto dal russo da MetaQuotes Ltd.
Articolo originale: https://www.mql5.com/ru/articles/1179
- App di trading gratuite
- Oltre 8.000 segnali per il copy trading
- Notizie economiche per esplorare i mercati finanziari
Accetti la politica del sito e le condizioni d’uso