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.
void CMyRobot::EngineEventHandler(int event_id, constlong &lparam, constdouble &dparam, conststring &sparam, bool testing, long chart_id)
{
if (sparam != m_symbol) return; //--- omitir la gestión de eventos si los símbolos no coincidenif (event_id > SERIES_EVENTS_NO_EVENT && event_id < SERIES_EVENTS_NEXT_CODE) { //--- MANEJO DE EVENTOS DE SERIES TEMPORALESif (event_id == SERIES_EVENTS_NEW_BAR) { // evento "nueva barra": lparam = periodo | dparam = fecha/horathis.RefreshAllIndicators(1);
this.ExecuteFSM(1, chart_id); // ejecuta la máquina de estados finitos (NB: índice de la nueva barra = 1)
}
}
elseif (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ónif (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 pendienteif (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ágicoushort GetMagicID(void) const { returnushort(this.Magic() & 0xFFFF); }
uchar GetGroupID1(void) const { returnuchar(this.Magic()>>16) & 0x0F; }
uchar GetGroupID2(void) const { returnuchar((this.Magic()>>16) & 0xF0)>>4; }
uchar GetPendReqID(void) const { returnuchar(this.Magic()>>24) & 0xFF; }
//...
};
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.
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) { returnthis.m_events.GetList(); }
CEventBaseObj *GetTradeEventByIndex(constint index) { returnthis.m_events.GetTradeEventByIndex(index); }
int GetTradeEventsTotal(void) const { returnthis.m_events.GetTradeEventsTotal(); }
//--- Restablecer el último evento de negociaciónvoid 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 { returnthis.m_last_trade_event; }
int LastAccountEvent(void) const { returnthis.m_last_account_event; }
int LastSymbolsEvent(void) const { returnthis.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 { returnthis.m_is_hedge; }
bool IsTester(void) const { returnthis.m_is_tester; }
bool IsAccountsEvent(void) const { returnthis.m_accounts.IsEvent(); }
bool IsSymbolsEvent(void) const { returnthis.m_symbols.IsEvent(); }
bool IsTradeEvent(void) const { returnthis.m_events.IsEvent(); }
//...//...
};
Не могли бы вы привести мне пример? Я смотрю на класс 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.
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:
Gestor de eventos:
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;-)
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.
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(); } //... //... };Не могли бы вы привести мне пример? Я смотрю на класс 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.
Espere un poco, por favor. El próximo artículo del ru-segmento tratará de los asesores, y allí intentaré explicarlo.
OK, genial - gracias...