Discussão do artigo "Biblioteca para criação simples e rápida de programas para MetaTrader (Parte XXI): classes de negociação - objeto básico de negociação multiplataforma" - página 3

 
Artyom Trishkin:
Se você precisar comparar uma solicitação de negociação e uma posição, a maneira mais fácil é definir o identificador da posição (não mágico). Cada solicitação tem seu próprio identificador. A mágica do consultor pode ser deixada em uma só para todas as posições. Então, pelo identificador (ele é gravado na mágica de uma posição ou ordem e nunca será perdido), você pode fazer a correspondência precisa entre a solicitação e a posição/ordem a qualquer momento.

É mais ou menos assim?

Solicitação de negociação:

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);

Manipulador 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;                                                  //--- pular o tratamento de eventos se houver símbolos incompatíveis

   if (event_id > SERIES_EVENTS_NO_EVENT && event_id < SERIES_EVENTS_NEXT_CODE) {   //--- TRATAMENTO DE EVENTOS DE SÉRIE TEMPORAL
      if (event_id == SERIES_EVENTS_NEW_BAR) {                                      // Evento "new bar": lparam = period | dparam = date/time
         this.RefreshAllIndicators(1);
         this.ExecuteFSM(1, chart_id);                                              // executar máquina de estado finito (NB: índice da nova barra = 1)
      }
   }
   else
   if (event_id > TRADE_EVENT_NO_EVENT && event_id < TRADE_EVENTS_NEXT_CODE) {      //--- TRATAMENTO DE EVENTOS DE NEGOCIAÇÃO
      CArrayObj *event_list = m_engine.GetListAllOrdersEvents();                    // obter a lista de eventos de negociação
      if (event_list == NULL) return;
      
      //--- calcular o deslocamento do índice do evento em relação ao final da lista
      //--- no backtesting, o valor de deslocamento é passado no parâmetro 'lparam' para o manipulador de eventos
      //--- em operação normal, os eventos de negociação são enviados um a um e tratados em 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:                                     //--- ordem pendente colocada
            if (m_state_curr == FSM_PENDING_ORDER && m_ticket == WRONG_VALUE)
                m_ticket = event.TicketOrderEvent();
            break;
      
         // ...
      }
   }
}
 

Problema: o método CEvent::GetPendReqID() de que preciso acima é protegido!! Alguma ideia melhor sem que eu tenha que alterar o código-fonte do DoEasy? Na minha humilde opinião, esses métodos deveriam ser públicos;-)

class CEvent : public CObject
  {
//...
protected:
//--- Retorna (1) o número mágico especificado, a ID do (2) primeiro grupo, (3) segundo grupo, (4) solicitação pendente do valor do 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: o método CEvent::GetPendReqID() de que preciso acima é protegido !! Alguma ideia melhor sem que eu tenha que alterar o código-fonte do DoEasy? Na minha humilde opinião, esses métodos deveriam ser públicos;-)

Você precisa observar a classe CEngine - somente ela dá acesso à biblioteca para programas de usuários.

Todas as outras classes são para as necessidades da biblioteca e não são destinadas aos usuários, com exceção das funções de serviço da biblioteca que estão disponíveis no programa após a conexão da biblioteca a ele.

 
Artyom Trishkin:

Você precisa observar a classe CEngine - somente ela dá acesso à biblioteca para os programas de usuário.

Todas as outras classes são para as necessidades da biblioteca e não se destinam aos usuários, com exceção das funções de serviço da biblioteca que estão disponíveis no programa depois de conectar a biblioteca a ele.

Você pode me dar um exemplo? Estou analisando a classe CEngine e vejo que é possível extrair uma lista de eventos, verificar seu tipo etc... Assim, posso acessar cada evento, mas não encontro nenhuma maneira óbvia de ler os detalhes específicos do evento contidos no número mágico (grupos e ID da solicitação) do objeto CEngine - a meu ver, ainda preciso ler essas informações diretamente das instâncias do objeto CEvent, como no meu exemplo de manipulador de eventos acima, no método even-handler do meu robô, ou seja, CEvent:GetPendReq()

class CEngine
  {
//...
//...
//--- Retorna (1) a lista de eventos de ordem, transação e posição, (2) objeto de evento de negociação base por índice e o (3) número de novos eventos de negociação
   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();         }
//--- Redefinir o último evento de negociação
   void                 ResetLastTradeEvent(void)                       { this.m_events.ResetLastTradeEvent();                }
//--- Retorna o (1) último evento de negociação, (2) o último evento nas propriedades da conta e (3) o último evento nas propriedades do 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;                    }
//--- Retornar o sinalizador de (1) conta de hedge, (2) trabalho no testador, (3) evento de conta, (4) evento de símbolo e (5) evento de negociação
   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 ()

Aguarde um pouco, por favor. O próximo artigo do segmento ru será sobre consultores, e lá tentarei explicar.

 
Artyom Trishkin:

Aguarde um pouco, por favor. O próximo artigo do segmento ru será sobre consultores, e lá tentarei explicar.

OK, legal - obrigado...