Discussão do artigo "Biblioteca para criação simples e rápida de programas para MetaTrader (Parte XXIV): classe básica de negociação, correção automática de parâmetros errados" - página 3

 
hsyhsy863 :
Olá, você encontrou o problema que mencionei?
Não considero os ex-arquivos.
 

Olá, Artyom - ao trabalhar mais de perto com esse código, notei essa peculiaridade do valor'shift' implementado em EventsHandling() e OnDoEasyEvent() para o tratamento correto dos eventos de negociação durante a execução no testador... Entendo que, como você aponta no artigo, ao executar eventos de negociação ao vivo, eles são entregues um a um a partir de OnChartEvent() à medida que são acionados pelo mecanismo, enquanto no modo de teste eles são agrupados e entregues como uma lista...

Minha pergunta é: não seria melhor implementar um parâmetro de função dedicado no manipulador de eventos em vez de sacrificar o'lparam', que pode conter informações úteis para o manipulador de eventos? Também acho que isso torna o código mais simples / mais legível; você concorda?

PS: De qualquer forma, estou achando que essa biblioteca é realmente poderosa, mas também complexa e difícil de entender; no entanto, uma vez dominada, ela deve permitir o desenvolvimento de todos os tipos de estratégias baseadas em EA muito rapidamente... Além da enorme curva de aprendizado, também estou percebendo que o desempenho do back-testing é bastante lento, portanto, espero que você possa resolver esse ponto assim que concluir o conjunto de recursos que imaginou para o DoEasy.

void EventsHandling(void)
  {
//--- Se um evento de negociação estiver presente
   if(engine.IsTradeEvent())
     {
      //--- Número de eventos de negociação ocorridos simultaneamente
      int total = engine.GetTradeEventsTotal();
      for (int i = 0; i < total; i++)
        {
         //--- Obter o próximo evento da lista de eventos ocorridos simultaneamente 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)
  {
   //...
   //...
//--- Tratamento de eventos de negociação
   if(idx > TRADE_EVENT_NO_EVENT && idx < TRADE_EVENTS_NEXT_CODE)
     {
      //--- Obter a lista de eventos de negociação
      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 :

Olá, Artyom - ao trabalhar mais de perto com esse código, notei essa peculiaridade do valor ' shift ' implementado em EventsHandling() e OnDoEasyEvent() para o tratamento correto dos eventos de negociação durante a execução no testador... Entendo que, como você aponta no artigo, ao executar eventos de negociação ao vivo, eles são entregues um a um a partir de OnChartEvent() à medida que são acionados pelo mecanismo, enquanto no modo de teste eles são agrupados e entregues como uma lista...

Minha pergunta é: não seria melhor implementar um parâmetro de função dedicado no manipulador de eventos em vez de sacrificar o ' lparam ' que pode conter informações úteis para o manipulador de eventos? Também acho que isso torna o código mais simples / mais legível; você concorda?

PS: De qualquer forma, estou achando que essa biblioteca é realmente poderosa, mas também complexa e difícil de entender; no entanto, uma vez dominada, ela deve permitir o desenvolvimento de todos os tipos de estratégias baseadas em EA muito rapidamente... Além da enorme curva de aprendizado, também estou percebendo que o desempenho do back-testing é bastante lento, portanto, espero que você possa resolver esse ponto assim que concluir o conjunto de recursos que imaginou para o DoEasy.


Não. Aqui eu não planejei refazer nada, e provavelmente não o farei. Todos os dados necessários já são fornecidos aos objetos de evento, e o restante dos dados já é obtido dos objetos cujo evento foi registrado.

 
Artyom Trishkin:

Não. Aqui eu não planejei refazer nada, e provavelmente não o farei. Todos os dados necessários já foram entregues aos objetos de evento, e o restante dos dados já foi retirado dos objetos cujo evento foi registrado.

OK, é justo... Concordo que todos os dados necessários estão nos objetos de evento.

 
Você poderia me dar um exemplo de código para extrair o tíquete de ordem/posição e outras propriedades depois de obter o último evento de negociação?
 
leonerd:
Você poderia fornecer algum código de exemplo para que, ao obter o último evento de negociação, você possa obter o tíquete de ordem/posição e outras propriedades?
Só daqui a uma semana - não no local.