Discusión sobre el artículo "Biblioteca para el desarrollo rápido y sencillo de programas para MetaTrader (Parte IV): Eventos comerciales" - página 3

 

Es como una conferencia muy interesante en cuanto a contenido. Sin duda seguiré toda la serie.

Desgraciadamente, puede que incluso haya pequeños errores a propósito: el contenido es muy complejo y tal vez deberían seguirlo.

En el "

CMarketCollection::Refresh

" no se encuentra el campo total_market - esto ya ocurría antes con ORDER_STATUS_MARKET. El cambio de simple a complejo es muy impresionante.

En el punto de actualización no pude ir más allá, ya que el siguiente objeto tampoco quería ejecutarse directamente. Así que me conformé con la descarga.

mfG

Marc Tolkmitt

 

Extraño, no puedo realizar la lógica más simple con sus métodos...

Aquí necesito obtener la hora de cierre de la última operación. Parece que la librería tiene un mecanismo para trabajar con órdenes abstractas a la MT4, pero no veo ningún método para trabajar con ellas.

Solicito Deals, pero ORDER_PROP_TIME_CLOSE no está soportado:

bool last_trade_time_filter=true;
   CArrayObj *all_trades=engine.GetListDeals();
   if(all_trades!=NULL && all_trades.Total()>0)
     {
      CArrayObj *sym_all_trades=CSelect::ByOrderProperty(all_trades,ORDER_PROP_SYMBOL,Symbol(),EQUAL);
      if(sym_all_trades!=NULL && sym_all_trades.Total()>0)
        {
         CArrayObj *sym_all_trades_recent=CSelect::ByOrderProperty(sym_all_trades,ORDER_PROP_TIME_CLOSE,iTime(NULL,PERIOD_CURRENT,1),EQUAL_OR_MORE);
         if(sym_all_trades_recent.Total()>0)
           {
            // no viene aquí
            last_trade_time_filter=false;
           }
            
        }
     }
 
leonerd obtener la hora de cierre de la última operación. Parece que la biblioteca tiene un mecanismo para trabajar con órdenes abstractas a la MT4, pero no veo ningún método para trabajar con ellos.

Solicito Deals, pero ORDER_PROP_TIME_CLOSE no está soportado:

ok, de alguna manera es incorrecto solicitar la hora de cierre de una operación. Pero tampoco funciona con GetListHistoryOrders()...

 
leonerd obtener la hora de cierre de la última operación. Parece que la biblioteca tiene un mecanismo para trabajar con órdenes abstractas a la MT4, pero no veo ningún método para trabajar con ellos.

Solicito Deals, pero ORDER_PROP_TIME_CLOSE no está soportado:

En el Asesor Experto de prueba, en el manejador de pulsación de botón.

//+------------------------------------------------------------------+
//| Manejo de pulsaciones de botón|
//+------------------------------------------------------------------+
void PressButtonEvents(const string button_name)

(y esto es sólo un ejemplo de cómo manejar eventos y obtener datos).

Allí hay bloques de código que se encargan de cerrar posiciones. Usted puede ver cómo se implementa allí. Por ejemplo, un bloque de código para cerrar una compra por el símbolo actual con el máximo beneficio:

      //--- Si se pulsa el botón BUTT_CLOSE_BUY: Cerrar la compra con el máximo beneficio
      else if(button==EnumToString(BUTT_CLOSE_BUY))
        {
         //--- Obtener la lista de todas las posiciones abiertas
         CArrayObj* list=engine.GetListMarketPosition();
         //--- Seleccionar de la lista sólo posiciones de compra y sólo por el símbolo actual
         list=CSelect::ByOrderProperty(list,ORDER_PROP_SYMBOL,Symbol(),EQUAL);
         list=CSelect::ByOrderProperty(list,ORDER_PROP_TYPE,POSITION_TYPE_BUY,EQUAL);
         //--- Ordenar la lista por beneficio teniendo en cuenta la comisión y el swap
         list.Sort(SORT_BY_ORDER_PROFIT_FULL);
         //--- Obtener el índice de la posición de compra con el mayor beneficio
         int index=CSelect::FindOrderMax(list,ORDER_PROP_PROFIT_FULL);
         if(index>WRONG_VALUE)
           {
            //--- Obtener el objeto de posición Buy y cerrar la posición del ticket
            COrder* position=list.At(index);
            if(position!=NULL)
              {
               //--- Si no se pulsan los botones para crear una solicitud pendiente - cierre la posición
               if(!pressed_pending_close_buy)
                  engine.ClosePosition((ulong)position.Ticket());
               //--- En caso contrario - crear una solicitud pendiente para cerrar una posición en un ticket
               //--- y establecer condiciones dependiendo de los botones activos
               else
                 {
                  int id=engine.ClosePositionPending(position.Ticket());
                  if(id>0)
                    {
                     //--- fijar el precio y el tiempo de activación de la solicitud pendiente y establecer los parámetros de activación
                     double bid=SymbolInfoDouble(NULL,SYMBOL_BID);
                     double price_activation=NormalizeDouble(bid+distance_pending_request*g_point,g_digits);
                     ulong  time_activation=TimeCurrent()+bars_delay_pending_request*PeriodSeconds();
                     SetPReqCriterion((uchar)id,price_activation,time_activation,BUTT_CLOSE_BUY,EQUAL_OR_MORE,bid,TimeCurrent());
                    }
                 }
              }
           }
        }

Sobre las posiciones cerradas - lo hice hace mucho tiempo, ahora no puedo decirte cómo conseguir lo que necesitas de un vistazo. Voy a echar un vistazo más tarde y escribir - Estoy muy ocupado en este momento.

 
Artyom Trishkin #:

En el Asesor Experto de prueba, en el manejador de pulsación de botón

(y esto es sólo un ejemplo de cómo procesar eventos y obtener datos).

Hay bloques de código que son responsables de cerrar posiciones. Usted puede ver cómo se implementa allí. Por ejemplo, un bloque de código para cerrar una compra en el símbolo actual con el máximo beneficio:

Acerca de las posiciones cerradas - lo hice hace mucho tiempo, ahora no puedo decirte cómo conseguir lo que necesitas de un vistazo. Voy a echar un vistazo más tarde y escribir - Estoy muy ocupado en este momento.

Gracias, pero no hay necesidad de coger el evento.

 
ORDER_STATUS_MARKET_ORDER da error : undeclared identifier. parece que las cosas han cambiado en versiones recientes para MQL 5, ¡aparece tanto en COrder::OrderMagicNumber como en CMarketOrder Constructor!
 
theonementor # :
ORDER_STATUS_MARKET_ORDER da error : undeclared identifier. parece que las cosas han cambiado en las últimas versiones para MQL 5, ¡aparece tanto en COrder::OrderMagicNumber como en CMarketOrder Constructor!

He descargado el archivo MQL5.zip adjunto al artículo - cada archivo individualmente y todos juntos (al compilar Engine.mqh o TestDoEasyPart04.mq5) se compilan sin errores.

¿Qué estás haciendo exactamente que usted está recibiendo un error de compilación?

 
Artyom Trishkin #:

He descargado el archivo MQL5.zip adjunto al artículo - cada archivo individualmente y todos juntos (al compilar Engine.mqh o TestDoEasyPart04.mq5) se compilan sin errores.

¿Qué es exactamente lo que está haciendo que usted está recibiendo un error de compilación?

Lo resolví, había una entrada que faltaba en el define enum. de alguna manera faltaba (aunque copie y pegue el código del tutorial en el editor)
 
theonementor # :
Lo resolví, faltaba una entrada en el define enum. de alguna manera faltaba (aunque copie y pegue el código del tutorial en el editor)

Los códigos en el artículo no siempre coinciden con los códigos en los archivos adjuntos. A veces se me escapa algo durante la descripción, y a veces se añade algo después de escribir el artículo. El artículo no es una guía paso a paso al estilo "leer y copiar", sino sólo una explicación detallada en forma de material de formación. Y los pequeños errores y omisiones te hacen pensar, y eso es bueno)