Discusión sobre el artículo "Recetas MQL5 - procesamiento del evento BookEvent" - página 2

 
denkir:
Lo más probable es que no necesite un bombo, sino un manipulador de transacciones de mercado.
¡Muchas gracias!
 
He leído el artículo que mencionas, que sin duda también es útil, pero en mi pregunta me refería a la posibilidad de leer las acciones sobre órdenes de otros participantes en el mercado, no las que coloca un operador desde su terminal. Es decir, el filtro sobre el que escribí debería aplicarse a las operaciones actuales del mercado. ¿Proporciona MetaTrader tal información? No he visto tales posibilidades en el manejador de eventos de la pila.
Рецепты MQL5 - обработка события TradeTransaction
Рецепты MQL5 - обработка события TradeTransaction
  • 2014.09.08
  • Dennis Kirichenko
  • www.mql5.com
В статье описываются возможности языка MQL5 с точки зрения событийно-ориентированного программирования. Преимущество данного подхода состоит в том, что программа может получать информацию о поэтапном выполнении торговой операции. Приводится пример того, как с помощью обработчика события TradeTransaction можно получать и обрабатывать информацию о совершаемых торговых действиях. Думаю, что такой подход можно смело применять для целей копирования торговых сделок с терминала на терминал.
 
Rubick:
...pero en mi pregunta me refería a la posibilidad de leer las acciones sobre las órdenes de otros participantes en el mercado, no las colocadas por un operador desde su terminal. Es decir, el filtro sobre el que escribí debería aplicarse a las operaciones actuales del mercado. ¿Proporciona MetaTrader tal información? No he visto tales posibilidades en el controlador de eventos de la pila.
La pila muestra todas las órdenes limitadas actuales que están en el mercado en este momento. ¿Qué quiere decir con el término "operaciones de mercado en curso"?
 
denkir:
La pila muestra todas las órdenes limitadas actuales que están en el mercado en ese momento. ¿Qué quiere decir con el término "operaciones actuales en el mercado"?

Le pido disculpas si no me he explicado con claridad. Intentaré explicarlo un poco más. Mire, en ENUM_BOOK_TYPE sólo hay cuatro tipos de órdenes listadas en la pila. Se pueden dividir en dos categorías: limitadas y de mercado. Ahora te contaré cómo entiendo yo la operación. Os advierto que aquí tengo dudas, así que si entiendo algo mal, corregidme por favor. Así que aquí está. Aquí hay dos grupos de posibles variantes.

  1. Cuando una orden limitada se encuentra con una orden de mercado y se produce una operación - Tick. O dos ofertas de mercado se encuentran y hay un acuerdo - Tick.
  2. Cuando dos ofertas limitadas se encuentran y la última de ellas conduce a un acuerdo - Tick.

La tarea que me planteo es filtrar las operaciones en dos categorías, 1ª - las producidas por ofertas limitadas, 2ª - las producidas por ofertas de mercado. Para que sirve esto es para mi en privado por favor. Puedo decir que he visto la implementación de tal filtro, ¡y por medio de 1C! También me sorprendió mucho cuando lo vi. Pero me gustó la idea. Y ahora, según tengo entendido es necesario acoplar el manejador OnTick con el manejador OnBookEvent. Cómo hacer esto, no tengo ni idea, así que pido su ayuda.

 
¿Es posible crear un evento de libro para el mercado de divisas para ver las órdenes pendientes? Naturalmente para un único proveedor de liquidez.
 
BlackBart:
¿Es posible crear un evento de libro para el mercado de divisas para ver las órdenes pendientes? Naturalmente para un único proveedor de liquidez.
Se necesita un broker que proporcione esta información.
 

"Es evidente que de todas las órdenes de venta, la orden #6 tuvo el mayor volumen con el precio de 7700 Rub y el volumen de 1011 lotes. La orden #39 tuvo el mayor volumen de todas las órdenes de compra con el precio de 7653 Rub y el volumen de 534 lotes".

No es la orden #6, ni la orden #39. Se trata de niveles, a los que se puede acceder mediante

last_bookArray[6]

o

last_bookArray[39]

Los MqlBookArrays se componen de ofertas de venta desde [0] hasta [ArraySize(bookArray)/2-1], y de ofertas de compra desde [ArraySize(bookArray)/2] hasta [ArraySize(bookArray)-1]. Que yo sepa, los libros tienen 2n niveles. Y, si no me equivoco, los niveles empiezan por el índice 0 (cero), por lo que el índice del modo matemático (el volumen más alto, la oferta de venta más frecuente) es 5 (volumen 1011, nivel/precio 7700), mientras que el modo de oferta de compra es 38 (volumen 534, nivel/precio de 7653).

El modo de oferta de compra podría tomarse como soporte. Y el modo de oferta de venta podría ser resistencia.

Me gustaría saber cómo puedo aumentar el número de niveles...

 
Hola Denis ;

He intentado utilizar tu indicador, el BookEventProcessor2.mq5., pero al intentar compilarlo dentro del meta Editor mql5, me da el siguiente error, podrías ser tan amable de solucionarme esos problemillas para ver como funciona en estos momentos. También me podrías decir si también puede incluir las órdenes limitadas de venta y compra a la vez pero con otro color.

saludos,

Michael
Archivos adjuntos:
 
mzapata6724:
Hola Denis ;

He intentado utilizar tu indicador, el BookEventProcessor2.mq5., pero al intentar compilarlo dentro del meta Editor mql5, me da el siguiente error, podrías ser tan amable de solucionarme esos problemillas para ver como funciona en estos momentos. También me podrías decir si también puede incluir las órdenes limitadas de venta y compra al mismo tiempo pero con otro color.

saludos ,

Michael

Michael, gracias por tus preguntas. En primer lugar, BookEventProcessor2 no es un indicador - es un Asesor Experto. Todo lo que necesita es colocar los archivos fuente y de cabecera en una carpeta. Echa un vistazo a las imágenes adjuntas a continuación.


Si desea cambiar los colores rápidamente vaya al método CBookBarsPanel::Init() :

//+------------------------------------------------------------------+
//| Inicialización|
//+------------------------------------------------------------------+
bool CBookBarsPanel::Init(const uint _width,const uint _height)
  {
//--- tamaño del panel
   this.m_width=_width;
   this.m_height=_height;

//--- asignar memoria
   if(this.m_obj_arr.Reserve(this.m_arr_size))
     {
      //--- la bandera de gestión de memoria 
      this.m_obj_arr.FreeMode(true);
      //--- etiqueta del panel
      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))
                 {
                  //--- etiqueta de la barra 
                  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);
  }

O puedes cambiar ligeramente los parámetros del método así:

//+------------------------------------------------------------------+
//| Inicialización|
//+------------------------------------------------------------------+
bool CBookBarsPanel::Init(const uint _width,const uint _height, const color _buy_clr, const color _sell_clr)
  {
//--- tamaño del panel
   this.m_width=_width;
   this.m_height=_height;

//--- asignar memoria
   if(this.m_obj_arr.Reserve(this.m_arr_size))
     {
      //--- la bandera de gestión de memoria 
      this.m_obj_arr.FreeMode(true);
      //--- etiqueta del panel
      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))
                 {
                  //--- etiqueta de la barra 
                  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);
  }
Archivos adjuntos:
 

Hola Dennis


Gracias por la pronta respuesta, el asesor experto ahora funciona bastante bien. Pero yo estaba tratando de hablar de esta referencia:

Al enviar una solicitud de operación utilizando la función OrderSend(), algunas operaciones requieren la indicación del tipo de orden. El tipo de orden se especifica en el campo typede la estructura especialMqlTradeRequest, y puede aceptar valores de la enumeración ENUM_ORDER_TYPE.

ENUM_ORDER_TYPE

Identificador

Descripción

ORDER_TYPE_BUY

Orden de compra de mercado

ORDER_TYPE_SELL

Orden de venta a mercado

ORDER_TYPE_BUY_LIMIT

Orden pendiente con límite de compra

ORDEN_TIPO_VENTA_LIMITE

Orden pendiente de límite de venta

ORDER_TYPE_BUY_STOP

Orden pendiente Buy Stop

ORDER_TYPE_SELL_STOP

Orden pendiente Sell Stop

ORDER_TYPE_BUY_STOP_LIMIT

Al alcanzar el precio de la orden, se coloca una orden pendiente Buy Limit al precio StopLimit

ORDEN_TIPO_VENTA_STOP_LIMITE

Al alcanzar el precio de la orden, se coloca una orden pendiente de venta limitada al precio StopLimit.

ORDER_TYPE_CLOSE_BY

Orden para cerrar una posición por otra contraria


Puedo ver en la terminal de Mql5, que el exper advisor muestra ORDER_TYPE_BUY Y ORDER_TYPE_BUY, pero mi pregunta es se puede mostrar la transaccion en el bookevent sobre y cambiar esos colores, porque se como ver la orden de compra, pero donde esta el gran jefe poniendo su dinero, con Iceberg y abrazar orden pendiente a cierto nivel de precio.


¿es eso posible?


Saludos Michael.

RDER_TYPE_SELL_LIMIT

Orden pendiente Sell Limit

ORDER_TYPE_BUY_STOP

Orden pendiente 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