Discusión sobre el artículo "Biblioteca para el desarrollo rápido y sencillo de programas para MetaTrader (Parte XXIV): Clase comercial principal - corrección automática de parámetros erróneos" - página 3

 
hsyhsy863 :
Hola, ¿has encontrado el problema que he mencionado?
No considero ex archivos.
 

Hola Artyom -- trabajando más de cerca con este código, me di cuenta de esta peculiaridad del valor'shift' implementado en EventsHandling() y OnDoEasyEvent() para manejar correctamente los eventos de comercio cuando se ejecuta en el probador ... Entiendo, como señalas en el artículo, que cuando se ejecuta en vivo los eventos de trade se entregan uno a uno desde OnChartEvent( ) según los dispara el motor, mientras que en modo testing se agrupan y se entregan como una lista....

Mi pregunta es: ¿no sería mejor implementar un parámetro de función dedicado en el manejador de eventos en lugar de sacrificar'lparam' que puede contener información útil para el manejador de eventos? También creo que hace el código más simple / más legible, ¿estás de acuerdo?

PD: De todas formas, esta librería me está pareciendo muy potente pero también compleja y difícil de entender, aunque una vez dominada debería permitir desarrollar todo tipo de estrategias EA muy rápidamente... Además de la enorme curva de aprendizaje, también estoy notando que el rendimiento de las pruebas retrospectivas es bastante lento, así que espero que puedan abordar este punto una vez que completen el conjunto de características que previeron para DoEasy.

void EventsHandling(void)
  {
//--- Si hay un evento comercial
   if(engine.IsTradeEvent())
     {
      //--- Número de operaciones realizadas simultáneamente
      int total = engine.GetTradeEventsTotal();
      for (int i = 0; i < total; i++)
        {
         //--- Obtener el siguiente evento de la lista de eventos ocurridos simultáneamente por índice
         CEventBaseObj *event = engine.GetTradeEventByIndex(i);
         if(event == NULL)
            continue;
         int   shift  = i;
         long   lparam = event.LParam();
         double dparam = event.DParam();
         string sparam = event.SParam();
         OnDoEasyEvent(CHARTEVENT_CUSTOM+event.ID(), lparam, dparam, sparam, shift);
        }
     }
   //...
   //...
  }

void OnDoEasyEvent(const int id, const long &lparam, const double &dparam, const string &sparam, int shift=0)
  {
   //...
   //...
//--- Gestión de eventos comerciales
   if(idx > TRADE_EVENT_NO_EVENT && idx < TRADE_EVENTS_NEXT_CODE)
     {
      //--- Obtener la lista de eventos de negociación
      CArrayObj *list = engine.GetListAllOrdersEvents();
      if(list == NULL) return;

      //--- get the event index shift relative to the end of the list
      //--- in the tester, the shift is passed by the lparam parameter to the event handler
      //--- outside the tester, events are sent one by one and handled in OnChartEvent()
      int shift=(testing ? (int)lparam : 0);
      
      CEvent *event=list.At(list.Total()-1-shift);
      if(event==NULL) return;
   //...
   //...
  }


 
Dima Diall :

Hola Artyom -- trabajando más de cerca con este código, me di cuenta de esta peculiaridad del valor ' shift ' implementado en EventsHandling() y OnDoEasyEvent() para manejar correctamente los eventos de comercio cuando se ejecuta en el probador ... Entiendo, como señalas en el artículo, que cuando se ejecuta en vivo los eventos de operación se entregan uno a uno desde OnChartEvent() a medida que son disparados por el motor, mientras que en modo de prueba se agrupan y se entregan como una lista....

Mi pregunta es: ¿no sería mejor implementar un parámetro de función dedicado en el manejador de eventos en lugar de sacrificar ' lparam ' que puede contener información útil para el manejador de eventos? También creo que hace el código más simple / más legible; ¿estás de acuerdo?

PD: De todas formas, esta librería me está pareciendo muy potente pero también compleja y difícil de entender, aunque una vez dominada debería permitir desarrollar todo tipo de estrategias con EA muy rápidamente... Además de la enorme curva de aprendizaje, también estoy notando que el rendimiento de las pruebas retrospectivas es bastante lento, así que espero que puedan abordar este punto una vez que completen el conjunto de características que previeron para DoEasy.


No. Aquí no tenía previsto rehacer nada, y lo más probable es que no lo haga. Todos los datos necesarios ya se entregan a los objetos de evento, y el resto de los datos ya se toman de aquellos objetos cuyo evento fue registrado.

 
Artyom Trishkin:

No. Aquí no pensaba rehacer nada, y lo más probable es que no lo haga. Todos los datos necesarios ya están entregados a los objetos de evento, y el resto de los datos ya están tomados de aquellos objetos cuyo evento fue registrado.

Vale, de acuerdo... Estoy de acuerdo en que todos los datos necesarios están en los objetos de evento.

 
¿Podría darme un ejemplo de código para obtener el ticket de orden/posición y otras propiedades después de recibir el evento de la última operación?
 
leonerd:
¿Podría por favor proporcionar algún código de ejemplo para que cuando se obtiene el último evento de comercio, se puede tirar de la entrada de orden / posición y otras propiedades?
No hasta dentro de una semana - no en el sitio.