Discussione sull’articolo "Manuale MQL5: Gestione di BookEvent" - pagina 2

 
denkir:
Molto probabilmente non avete bisogno di un tumbler, ma di un gestore di transazioni di mercato.
Grazie mille!
 
Ho letto l'articolo che hai citato, che è certamente utile, ma nella mia domanda intendevo la possibilità di leggere le azioni sugli ordini di altri partecipanti al mercato, non quelli piazzati da un trader dal suo terminale. In altre parole, il filtro di cui ho parlato dovrebbe essere applicato alle operazioni di mercato in corso. MetaTrader fornisce tali informazioni? Non ho visto questa possibilità nel gestore degli eventi dello stack.
Рецепты MQL5 - обработка события TradeTransaction
Рецепты MQL5 - обработка события TradeTransaction
  • 2014.09.08
  • Dennis Kirichenko
  • www.mql5.com
В статье описываются возможности языка MQL5 с точки зрения событийно-ориентированного программирования. Преимущество данного подхода состоит в том, что программа может получать информацию о поэтапном выполнении торговой операции. Приводится пример того, как с помощью обработчика события TradeTransaction можно получать и обрабатывать информацию о совершаемых торговых действиях. Думаю, что такой подход можно смело применять для целей копирования торговых сделок с терминала на терминал.
 
Rubick:
...ma nella mia domanda intendevo la possibilità di leggere le azioni sugli ordini di altri partecipanti al mercato, non quelle effettuate da un trader dal suo terminale. In altre parole, il filtro di cui ho scritto dovrebbe essere applicato alle operazioni di mercato in corso. MetaTrader fornisce tali informazioni? Non ho visto questa possibilità nel gestore degli eventi dello stack.
Lo stack mostra tutti gli ordini limite presenti sul mercato in quel momento. Cosa intende con l'espressione "operazioni di mercato correnti"?
 
denkir:
Lo stack mostra tutti gli ordini limite correnti che sono sul mercato al momento. Cosa intendete con l'espressione "operazioni di mercato correnti"?

Mi scuso se non mi sono spiegato bene. Provo a spiegarmi meglio. In ENUM_BOOK_TYPE ci sono solo quattro tipi di ordini elencati nello stack. Possono essere suddivisi in due categorie: limitati e di mercato. Ora vi dirò come ho capito l'operazione. Vi avverto che ho dei dubbi, quindi se ho capito qualcosa di sbagliato, vi prego di correggermi. Ecco come stanno le cose. Ci sono due gruppi di possibili varianti.

  1. Quando un ordine limitato incontra un ordine di mercato e si verifica una transazione (Tick). Oppure due offerte di mercato si incontrano e si verifica un'operazione - Tick.
  2. Quando due offerte limitate si incontrano e l'ultima di esse porta a un accordo - Tick.

Il compito che sto considerando è quello di filtrare gli scambi in due categorie: 1° - quelli prodotti da offerte limitate, 2° - quelli prodotti da offerte di mercato. Il motivo di tutto ciò è per me privato, per favore. Posso dire di aver visto l'implementazione di un tale filtro, e per mezzo di 1C! Sono rimasto molto sorpreso quando l'ho visto. Ma l'idea mi è piaciuta. E ora, a quanto ho capito, è necessario agganciare il gestore OnTick con il gestore OnBookEvent. Come farlo, non ne ho idea, quindi chiedo il vostro aiuto.

 
È possibile creare un evento book per il mercato forex per vedere gli ordini pendenti? Naturalmente per un singolo fornitore di liquidità.
 
BlackBart:
È possibile creare un evento book per il mercato forex per vedere gli ordini pendenti? Naturalmente per un singolo fornitore di liquidità.
È necessario un broker che fornisca queste informazioni.
 

"È evidente che tra tutti gli ordini di vendita, l'ordine #6 ha avuto il volume maggiore con un prezzo di 7700 Rub e un volume di 1011 lotti. L'ordine #39 ha avuto il volume maggiore tra tutti gli ordini di acquisto con un prezzo di 7653 Rub e un volume di 534 lotti."

Non si tratta dell'ordine #6, né dell'ordine #39. Si tratta di livelli, ai quali si può accedere da

last_bookArray[6]

oppure

last_bookArray[39]

Gli MqlBookArray sono composti da offerte di vendita da [0] a [ArraySize(bookArray)/2-1], e da offerte di acquisto da [ArraySize(bookArray)/2] a [ArraySize(bookArray)-1]. Per quanto ne so, i libri hanno 2n livelli. Se non sbaglio, i livelli iniziano con l'indice 0 (zero), quindi l'indice della modalità matematica (il volume più alto, l'offerta di vendita più frequente) è 5 (volume 1011, livello/prezzo 7700), mentre la modalità dell'offerta di acquisto è 38 (volume 534, livello/prezzo 7653).

La modalità di offerta di acquisto potrebbe essere considerata un supporto. E la modalità di offerta di vendita potrebbe essere una resistenza.

Vorrei sapere come posso aumentare il numero di livelli...

 
Ciao Denis ;

Ho provato ad utilizzare il tuo indicatore, il BookEventProcessor2.mq5., ma quando cerco di compilarlo all'interno del meta Editor mql5, mi dà il seguente errore, potresti essere così gentile da risolvere questi piccoli problemi per vedere come funziona in questi tempi. Potresti anche dirmi se può includere anche gli ordini limite di vendita e acquisto allo stesso tempo ma con un altro colore.

saluti,

Michele
File:
 
mzapata6724:
Ciao Denis ;

Ho provato ad utilizzare il tuo indicatore, il BookEventProcessor2.mq5., ma quando cerco di compilarlo all'interno del meta Editor mql5, mi dà il seguente errore, potresti essere così gentile da risolvere questi piccoli problemi per vedere come funziona in questi tempi. Potresti anche dirmi se può includere anche gli ordini limite di vendita e acquisto allo stesso tempo ma con un altro colore.

saluti ,

Michele

Michael, grazie per le tue domande. Prima di tutto, BookEventProcessor2 non è un indicatore, ma un Expert Advisor. È sufficiente inserire i file sorgente e i file di intestazione in un'unica cartella. Date un'occhiata alle immagini allegate qui sotto.


Se volete cambiare rapidamente i colori , andate al metodo CBookBarsPanel::Init() :

//+------------------------------------------------------------------+
//| Inizializzazione|
//+------------------------------------------------------------------+
bool CBookBarsPanel::Init(const uint _width,const uint _height)
  {
//--- dimensione del pannello
   this.m_width=_width;
   this.m_height=_height;

//--- allocare la memoria
   if(this.m_obj_arr.Reserve(this.m_arr_size))
     {
      //--- il flag di gestione della memoria 
      this.m_obj_arr.FreeMode(true);
      //--- etichetta del pannello
      CChartObjectRectLabel *ptr_rect_label=new CChartObjectRectLabel;
      if(CheckPointer(ptr_rect_label)==POINTER_DYNAMIC)
         if(ptr_rect_label.Create(0,"Panel",0,15,15,this.m_width,this.m_height))
            if(ptr_rect_label.BorderType(BORDER_RAISED))
               if(this.m_obj_arr.Add(ptr_rect_label))
                 {
                  //--- etichetta a barre 
                  uint curr_x=this.m_width/5;
                  uint curr_y=35;
                  uint mid_idx=this.m_arr_size/2-1;
                  for(uint idx=0;idx<this.m_arr_size;idx++)
                    {
                     color rec_color=(idx<(mid_idx+1))?clrRed:clrGreen;
                     //---
                     CBookRecord *ptr_record=new CBookRecord;
                     if(CheckPointer(ptr_record)==POINTER_DYNAMIC)
                        if(ptr_record.Create(IntegerToString(idx+1),rec_color,curr_x+15,
                           curr_y,curr_x*3,10))
                           if(this.m_obj_arr.Add(ptr_record))
                              curr_y+=(idx==mid_idx)?24:13;
                    }
                 }
     }

//---
   return this.m_obj_arr.Total()==(this.m_arr_size+1);
  }

Oppure potete modificare leggermente i parametri del metodo in questo modo:

//+------------------------------------------------------------------+
//| Inizializzazione|
//+------------------------------------------------------------------+
bool CBookBarsPanel::Init(const uint _width,const uint _height, const color _buy_clr, const color _sell_clr)
  {
//--- dimensione del pannello
   this.m_width=_width;
   this.m_height=_height;

//--- allocare la memoria
   if(this.m_obj_arr.Reserve(this.m_arr_size))
     {
      //--- il flag di gestione della memoria 
      this.m_obj_arr.FreeMode(true);
      //--- etichetta del pannello
      CChartObjectRectLabel *ptr_rect_label=new CChartObjectRectLabel;
      if(CheckPointer(ptr_rect_label)==POINTER_DYNAMIC)
         if(ptr_rect_label.Create(0,"Panel",0,15,15,this.m_width,this.m_height))
            if(ptr_rect_label.BorderType(BORDER_RAISED))
               if(this.m_obj_arr.Add(ptr_rect_label))
                 {
                  //--- etichetta a barre 
                  uint curr_x=this.m_width/5;
                  uint curr_y=35;
                  uint mid_idx=this.m_arr_size/2-1;
                  for(uint idx=0;idx<this.m_arr_size;idx++)
                    {
                     color rec_color=(idx<(mid_idx+1))?_sell_clr:_buy_clr;
                     //---
                     CBookRecord *ptr_record=new CBookRecord;
                     if(CheckPointer(ptr_record)==POINTER_DYNAMIC)
                        if(ptr_record.Create(IntegerToString(idx+1),rec_color,curr_x+15,
                           curr_y,curr_x*3,10))
                           if(this.m_obj_arr.Add(ptr_record))
                              curr_y+=(idx==mid_idx)?24:13;
                    }
                 }
     }

//---
   return this.m_obj_arr.Total()==(this.m_arr_size+1);
  }
 

Ciao Dennis


Grazie per la rapida risposta, l'expert advisor ora funziona abbastanza bene. Ma stavo cercando di parlare di questo riferimento:

Quando si invia una richiesta di negoziazione utilizzando la funzione OrderSend(), alcune operazioni richiedono l'indicazione del tipo di ordine. Il tipo di ordine è specificato nel campo typedella struttura specialeMqlTradeRequest e può accettare valori dell'enumerazione ENUM_ORDER_TYPE.

ENUM_ORDINE_TIPO

Identificatore

Descrizione

TIPO_ORDINE_ACQUISTO

Ordine di acquisto sul mercato

TIPO_ORDINE_SELL

Ordine di vendita al mercato

TIPO_ORDINE_ACQUISTO_LIMITE

Ordine pendente Buy Limit

TIPO_ORDINE_SELL_LIMIT

Ordine pendente Sell Limit

TIPO_ORDINE_BUY_STOP

Ordine pendente Buy Stop

TIPO_ORDINE_SELL_STOP

Ordine pendente Sell Stop

TIPO_ORDINE_ACQUISTO_STOP_LIMITE

Quando si raggiunge il prezzo dell'ordine, viene inserito un ordine Buy Limit al prezzo StopLimit.

TIPO_ORDINE_SELL_STOP_LIMIT

Al raggiungimento del prezzo dell'ordine, viene inserito un ordine Sell Limit al prezzo StopLimit.

TIPO_ORDINE_CHIUDERE_DA

Ordine per chiudere una posizione con una opposta


Posso vedere nel terminale di Mql5, che il consulente esperto mostra ORDER_TYPE_BUY e ORDER_TYPE_BUY, ma la mia domanda è che si può mostrare la transazione nel bookevent circa e cambiare quei colori, perché so come vedere l'ordine di acquisto, ma dove è il grande capo mettendo lì i soldi, con Iceberg e abbracciare ordine pendente a certo livello di prezzo.


è possibile?


I migliori saluti Michael.

RDER_TYPE_SELL_LIMIT

Ordine pendente Sell Limit

TIPO_ORDINE_ACQUISTO_STOP

Ordine pendente Buy Stop

Documentation on MQL5: Constants, Enumerations and Structures / Data Structures / Trade Request Structure
Documentation on MQL5: Constants, Enumerations and Structures / Data Structures / Trade Request Structure
  • www.mql5.com
Trade Request Structure - Data Structures - Constants, Enumerations and Structures - MQL5 Reference - Reference on algorithmic/automated trading language for MetaTrader 5