Discusión sobre el artículo "Biblioteca para el desarrollo rápido y sencillo de programas para MetaTrader (Parte XXI): Clases comerciales - El objeto comercial multiplataforma básico" - página 3

 
Artyom Trishkin:
Si necesita comparar una solicitud de operación y una posición, la forma más sencilla es establecer el identificador de posición (no mágico). Cada solicitud tiene su propio identificador. La magia del asesor se puede dejar una para todas las posiciones. Entonces por el identificador (está escrito en la magia de una posición u orden y nunca se perderá), puede hacer coincidir con precisión la solicitud y la posición/orden en cualquier momento.

¿Es algo así?

Solicitud de operación:

ulong order_magic = m_engine.SetCompositeMagicNumber(m_magic, 0, 0, m_order_id);
bool submit_ok    = m_engine.PlaceBuyLimit(m_lot_size, m_symbol, m_entry, m_hard_stop, m_ratio_target, order_magic, m_comment, m_expiry);

Gestor de eventos:

void CMyRobot::EngineEventHandler(int event_id, const long &lparam, const double &dparam, const string &sparam, bool testing, long chart_id)
{
   if (sparam != m_symbol) return;                                                  //--- omitir la gestión de eventos si los símbolos no coinciden

   if (event_id > SERIES_EVENTS_NO_EVENT && event_id < SERIES_EVENTS_NEXT_CODE) {   //--- MANEJO DE EVENTOS DE SERIES TEMPORALES
      if (event_id == SERIES_EVENTS_NEW_BAR) {                                      // evento "nueva barra": lparam = periodo | dparam = fecha/hora
         this.RefreshAllIndicators(1);
         this.ExecuteFSM(1, chart_id);                                              // ejecuta la máquina de estados finitos (NB: índice de la nueva barra = 1)
      }
   }
   else
   if (event_id > TRADE_EVENT_NO_EVENT && event_id < TRADE_EVENTS_NEXT_CODE) {      //--- GESTIÓN DE EVENTOS COMERCIALES
      CArrayObj *event_list = m_engine.GetListAllOrdersEvents();                    // obtener la lista de eventos de negociación
      if (event_list == NULL) return;
      
      //--- calcula el desplazamiento del índice del evento respecto al final de la lista
      //--- en back-testing, el valor de shift se pasa en el parámetro 'lparam' al manejador de eventos
      //--- en funcionamiento normal, los eventos de negociación se envían uno a uno y se gestionan en OnChartEvent()
      int shift = testing ? (int)lparam : 0;
      CEvent *event = event_list.At(event_list.Total() - 1 - shift);
      if (event == NULL || event.GetPendReqID() != m_order_id) return;
      
      switch (event.TypeEvent())
      {
         case TRADE_EVENT_PENDING_ORDER_PLASED:                                     //--- orden pendiente
            if (m_state_curr == FSM_PENDING_ORDER && m_ticket == WRONG_VALUE)
                m_ticket = event.TicketOrderEvent();
            break;
      
         // ...
      }
   }
}
 

Problema: el método CEvent::GetPendReqID() que necesito arriba es protected¡¡!! ¿Alguna idea mejor sin tener que cambiar el código fuente de DoEasy? En mi humilde opinión, estos métodos deberían ser públicos;-)

class CEvent : public CObject
  {
//...
protected:
//--- Devuelve (1) el número mágico especificado, el ID del (2) primer grupo, (3) segundo grupo, (4) petición pendiente del valor del número mágico
   ushort            GetMagicID(void)                          const { return ushort(this.Magic() & 0xFFFF);                                 }
   uchar             GetGroupID1(void)                         const { return uchar(this.Magic()>>16) & 0x0F;                                }
   uchar             GetGroupID2(void)                         const { return uchar((this.Magic()>>16) & 0xF0)>>4;                           }
   uchar             GetPendReqID(void)                        const { return uchar(this.Magic()>>24) & 0xFF;                                }
//...
};
 
Dima Diall :

Problema: el método CEvent::GetPendReqID() que necesito arriba es protected ¡¡!! ¿Alguna idea mejor sin tener que cambiar el código fuente de DoEasy? En mi humilde opinión, estos métodos deberían ser públicos;-)

Tienes que vigilar la clase CEngine - sólo ella da acceso a la librería a los programas de usuario.

Todas las demás clases son para las necesidades de la biblioteca, y no están destinadas a los usuarios, con la excepción de las funciones de servicio de la biblioteca que están disponibles en el programa después de conectar la biblioteca a él.

 
Artyom Trishkin:

Es necesario observar la clase CEngine - sólo ella da acceso a la biblioteca a los programas de usuario.

Todas las demás clases son para las necesidades de la biblioteca, y no están destinados a los usuarios, con la excepción de las funciones de servicio de biblioteca que están disponibles en el programa después de conectar la biblioteca a la misma.

¿Puede darme un ejemplo? Estoy mirando la clase CEngine y veo que es posible extraer una lista de eventos, comprobar su tipo, etc... así que puedo acceder a cada evento pero no encuentro ninguna forma obvia de leer detalles específicos del evento empaquetados en el número mágico (grupos & ID de petición) desde el objeto CEngine -- como yo lo veo, todavía necesito leer esta información directamente desde las instancias del objeto CEvent como en mi ejemplo de manejador de eventos de arriba en el método even-handler de mi robot, es decir CEvent:GetPendReq()

class CEngine
  {
//...
//...
//--- Devuelve (1) la lista de eventos de orden, trato y posición, (2) objeto base de eventos de negociación por índice y el (3) número de nuevos eventos de negociación.
   CArrayObj           *GetListAllOrdersEvents(void)                    { return this.m_events.GetList();                     }
   CEventBaseObj       *GetTradeEventByIndex(const int index)           { return this.m_events.GetTradeEventByIndex(index);   }
   int                  GetTradeEventsTotal(void)                 const { return this.m_events.GetTradeEventsTotal();         }
//--- Restablecer el último evento de negociación
   void                 ResetLastTradeEvent(void)                       { this.m_events.ResetLastTradeEvent();                }
//--- Devuelve el (1) último evento de negociación, (2) el último evento en las propiedades de la cuenta y (3) el último evento en las propiedades del símbolo
   ENUM_TRADE_EVENT     LastTradeEvent(void)                      const { return this.m_last_trade_event;                     }
   int                  LastAccountEvent(void)                    const { return this.m_last_account_event;                   }
   int                  LastSymbolsEvent(void)                    const { return this.m_last_symbol_event;                    }
//--- Devuelve la (1) cuenta de cobertura, (2) trabajando en el probador, (3) evento de cuenta, (4) evento de símbolo y (5) bandera de evento de negociación.
   bool                 IsHedge(void)                             const { return this.m_is_hedge;                             }
   bool                 IsTester(void)                            const { return this.m_is_tester;                            }
   bool                 IsAccountsEvent(void)                     const { return this.m_accounts.IsEvent();                   }
   bool                 IsSymbolsEvent(void)                      const { return this.m_symbols.IsEvent();                    }
   bool                 IsTradeEvent(void)                        const { return this.m_events.IsEvent();                     }
//...
//...
  };
 
Dima Diall :

Не могли бы вы привести мне пример? Я смотрю на класс CEngine и вижу, что можно извлечь список событий, проверить их тип и т. Д., Поэтому я могу получить доступ к каждому событию, но не нахожу очевидного способа прочитать конкретные детали события, упакованные в магическое число (группы идентификатор запроса) из объекта CEngine . - как я вижу, мне все еще нужно читать эту информацию непосредственно из экземпляров объекта CEvent, как в моем примере обработчика событий выше в методе обработчика четных событий моего робота, то есть CEvent :: GetPendReqID ()

Espere un poco, por favor. El próximo artículo del ru-segmento será sobre asesores, y allí intentaré explicarlo.

 
Artyom Trishkin:

Espere un poco, por favor. El próximo artículo del ru-segmento tratará de los asesores, y allí intentaré explicarlo.

OK, genial - gracias...