Discussão do artigo "Biblioteca para desenvolvimento fácil e rápido de programas para a MetaTrader (parte VIII): Eventos de modificação de ordens e posições" - página 2

 

Artem, mais uma vez obrigado!
O método"void CEventsCollection::CreateNewEvent(COrderControl* order)" é usado para criar um evento de negociação dependendo do tipo de alteração da ordem, ou seja, ele cria um evento associado a qualquer alteração de ordem.....
E o motivo da alteração da ordem enviado para o evento criado é o mesmo: EVENT_REASON_STOPLIMIT_TRIGGERED.

//--- Criando um evento
   if(event!=NULL)
     {
      event.SetProperty(EVENT_PROP_TIME_EVENT,order.Time());                        // Hora do evento
      event.SetProperty(EVENT_PROP_REASON_EVENT,EVENT_REASON_STOPLIMIT_TRIGGERED);  // Causa do evento (da enumeração ENUM_EVENT_REASON)

Se eu estiver certo, por favor, corrija-o. Caso contrário, explique o que eu não vi.

Muito obrigado pela biblioteca, que simplificou meu trabalho em várias ocasiões,
especialmente quando o trabalho principal não está relacionado à programação.

 
BmC:

Artem, mais uma vez obrigado!
O método"void CEventsCollection::CreateNewEvent(COrderControl* order)" é usado para criar um evento de negociação dependendo do tipo de alteração de ordem, ou seja, ele cria um evento associado a qualquer alteração de ordem.....
E o motivo da alteração de ordem enviado para o evento criado é o mesmo: EVENT_REASON_STOPLIMIT_TRIGGERED.

Se eu estiver certo, corrija-o. Se não estiver, explique o que eu não vi.

Muito obrigado pela biblioteca, que simplificou meu trabalho várias vezes,
especialmente quando o trabalho principal não está relacionado à programação.

Sem o link para o local exato das linhas citadas, não consigo entender do que exatamente você está falando - apenas pesquisando (Shift+Ctrl+F), não consegui encontrar esse código em todos os arquivos da biblioteca...

event.SetProperty(EVENT_PROP_REASON_EVENT,EVENT_REASON_STOPLIMIT_TRIGGERED);

Onde ele está localizado?

 
Aqui estão as linhas da descrição na parte inicial deste artigo e o código no final do artigo:
//+------------------------------------------------------------------+
//|| Cria um evento de negociação dependendo do tipo de alteração da ordem.
//+------------------------------------------------------------------+
void CEventsCollection::CreateNewEvent(COrderControl* order)
  {
   if(!::SymbolInfoTick(order.Symbol(),this.m_tick))
     {
      Print(DFUN,TextByLanguage("Falha ao recuperar os preços atuais por símbolo de evento","Failed to get current prices by event symbol "),order.Symbol());
      return;
     }
   CEvent* event=NULL;
//--- Ordem StopLimit pendente acionada
   if(order.GetChangeType()==CHANGE_TYPE_ORDER_TYPE)
     {
      this.m_trade_event_code=TRADE_EVENT_FLAG_ORDER_PLASED;
      event=new CEventOrderPlased(this.m_trade_event_code,order.Ticket());
     }
//--- Modificação
   else
     {
      //--- Preço modificado da ordem pendente
      if(order.GetChangeType()==CHANGE_TYPE_ORDER_PRICE)
         this.m_trade_event_code=TRADE_EVENT_FLAG_ORDER_MODIFY+TRADE_EVENT_FLAG_PRICE;
      //--- Modificou o preço da ordem pendente e seu StopLoss
      else if(order.GetChangeType()==CHANGE_TYPE_ORDER_PRICE_STOP_LOSS)
         this.m_trade_event_code=TRADE_EVENT_FLAG_ORDER_MODIFY+TRADE_EVENT_FLAG_PRICE+TRADE_EVENT_FLAG_SL;
      //--- Preço da ordem pendente modificada e seu TakeProfit
      else if(order.GetChangeType()==CHANGE_TYPE_ORDER_PRICE_TAKE_PROFIT)
         this.m_trade_event_code=TRADE_EVENT_FLAG_ORDER_MODIFY+TRADE_EVENT_FLAG_PRICE+TRADE_EVENT_FLAG_TP;
      //--- Modificou o preço da ordem pendente, seu StopLoss e TakeProfit
      else if(order.GetChangeType()==CHANGE_TYPE_ORDER_PRICE_STOP_LOSS_TAKE_PROFIT)
         this.m_trade_event_code=TRADE_EVENT_FLAG_ORDER_MODIFY+TRADE_EVENT_FLAG_PRICE+TRADE_EVENT_FLAG_SL+TRADE_EVENT_FLAG_TP;
      //--- StopLoss modificado da ordem pendente
      else if(order.GetChangeType()==CHANGE_TYPE_ORDER_STOP_LOSS)
         this.m_trade_event_code=TRADE_EVENT_FLAG_ORDER_MODIFY+TRADE_EVENT_FLAG_SL;
      //--- TakeProfit modificado da ordem pendente
      else if(order.GetChangeType()==CHANGE_TYPE_ORDER_TAKE_PROFIT)
         this.m_trade_event_code=TRADE_EVENT_FLAG_ORDER_MODIFY+TRADE_EVENT_FLAG_TP;
      //--- StopLoss e TakeProfit modificados da ordem pendente
      else if(order.GetChangeType()==CHANGE_TYPE_ORDER_STOP_LOSS_TAKE_PROFIT)
         this.m_trade_event_code=TRADE_EVENT_FLAG_ORDER_MODIFY+TRADE_EVENT_FLAG_SL+TRADE_EVENT_FLAG_TP;

      //--- Posição de StopLoss modificada
      else if(order.GetChangeType()==CHANGE_TYPE_POSITION_STOP_LOSS)
         this.m_trade_event_code=TRADE_EVENT_FLAG_POSITION_MODIFY+TRADE_EVENT_FLAG_SL;
      //--- Posição TakeProfit modificada
      else if(order.GetChangeType()==CHANGE_TYPE_POSITION_TAKE_PROFIT)
         this.m_trade_event_code=TRADE_EVENT_FLAG_POSITION_MODIFY+TRADE_EVENT_FLAG_TP;
      //--- StopLoss e TakeProfit modificados da posição
      else if(order.GetChangeType()==CHANGE_TYPE_POSITION_STOP_LOSS_TAKE_PROFIT)
         this.m_trade_event_code=TRADE_EVENT_FLAG_POSITION_MODIFY+TRADE_EVENT_FLAG_SL+TRADE_EVENT_FLAG_TP;
      
      //--- Criar um evento de modificação
      event=new CEventModify(this.m_trade_event_code,order.Ticket());
     }
//--- Criando um evento
   if(event!=NULL)
     {
      event.SetProperty(EVENT_PROP_TIME_EVENT,order.Time());                        // Hora do evento
      event.SetProperty(EVENT_PROP_REASON_EVENT,EVENT_REASON_STOPLIMIT_TRIGGERED);  // Causa do evento (da enumeração ENUM_EVENT_REASON)
      event.SetProperty(EVENT_PROP_TYPE_DEAL_EVENT,PositionTypeByOrderType((ENUM_ORDER_TYPE)order.TypeOrderPrev())); // Tipo de ordem, cujo acionamento resultou no evento
      event.SetProperty(EVENT_PROP_TICKET_DEAL_EVENT,order.Ticket());               // Ticket da ordem que acionou o evento
      event.SetProperty(EVENT_PROP_TYPE_ORDER_EVENT,order.TypeOrder());             // Tipo de ordem de evento
      event.SetProperty(EVENT_PROP_TICKET_ORDER_EVENT,order.Ticket());              // Bilhete de pedido de evento
      event.SetProperty(EVENT_PROP_TYPE_ORDER_POSITION,order.TypeOrder());          // Tipo da primeira ordem de posição
      event.SetProperty(EVENT_PROP_TICKET_ORDER_POSITION,order.Ticket());           // Ticket da ordem da primeira posição
      event.SetProperty(EVENT_PROP_POSITION_ID,order.PositionID());                 // Identificador de posição
      event.SetProperty(EVENT_PROP_POSITION_BY_ID,0);                               // Identificador de posição do contador
      event.SetProperty(EVENT_PROP_MAGIC_BY_ID,0);                                  // Número mágico da posição do contador
         
      event.SetProperty(EVENT_PROP_TYPE_ORD_POS_BEFORE,order.TypeOrderPrev());      // Tipo de ordem de posição antes da mudança de direção
      event.SetProperty(EVENT_PROP_TICKET_ORD_POS_BEFORE,order.Ticket());           // Posição do tíquete de pedido antes da mudança de direção
      event.SetProperty(EVENT_PROP_TYPE_ORD_POS_CURRENT,order.TypeOrder());         // Tipo de ordem da posição atual
      event.SetProperty(EVENT_PROP_TICKET_ORD_POS_CURRENT,order.Ticket());          // Ticket da ordem da posição atual
      
      event.SetProperty(EVENT_PROP_PRICE_OPEN_BEFORE,order.PricePrev());            // Preço de configuração do pedido antes da modificação
      event.SetProperty(EVENT_PROP_PRICE_SL_BEFORE,order.StopLossPrev());           // Preço de StopLoss antes da modificação
      event.SetProperty(EVENT_PROP_PRICE_TP_BEFORE,order.TakeProfitPrev());         // Preço TakeProfit antes da modificação
      event.SetProperty(EVENT_PROP_PRICE_EVENT_ASK,this.m_tick.ask);                // Pergunte o preço no momento do evento
      event.SetProperty(EVENT_PROP_PRICE_EVENT_BID,this.m_tick.bid);                // Preço do lance no momento do evento
         
      event.SetProperty(EVENT_PROP_MAGIC_ORDER,order.Magic());                      // Número mágico do pedido
      event.SetProperty(EVENT_PROP_TIME_ORDER_POSITION,order.TimePrev());           // Hora da primeira ordem de posição
      event.SetProperty(EVENT_PROP_PRICE_EVENT,order.PricePrev());                  // O preço no qual o evento ocorreu
      event.SetProperty(EVENT_PROP_PRICE_OPEN,order.Price());                       // Preço de definição do pedido
      event.SetProperty(EVENT_PROP_PRICE_CLOSE,order.Price());                      // Preço de fechamento do pedido
      event.SetProperty(EVENT_PROP_PRICE_SL,order.StopLoss());                      // Preço da ordem StopLoss
      event.SetProperty(EVENT_PROP_PRICE_TP,order.TakeProfit());                    // Preço da ordem TakeProfit
      event.SetProperty(EVENT_PROP_VOLUME_ORDER_INITIAL,order.Volume());            // Volume do pedido solicitado
      event.SetProperty(EVENT_PROP_VOLUME_ORDER_EXECUTED,0);                        // Volume da ordem executada
      event.SetProperty(EVENT_PROP_VOLUME_ORDER_CURRENT,order.Volume());            // Volume restante (não executado) da ordem
      event.SetProperty(EVENT_PROP_VOLUME_POSITION_EXECUTED,0);                     // Volume da posição executada
      event.SetProperty(EVENT_PROP_PROFIT,0);                                       // Lucro
      event.SetProperty(EVENT_PROP_SYMBOL,order.Symbol());                          // Símbolo de pedido
      event.SetProperty(EVENT_PROP_SYMBOL_BY_ID,order.Symbol());                    // Símbolo de posição do contador
      //--- Definição do identificador de programação do programa de controle, decodificação do código do evento e definição do tipo de evento
      event.SetChartID(this.m_chart_id);
      event.SetTypeEvent();
      //--- Se o objeto do evento não estiver na lista - adicione-o
      if(!this.IsPresentEventInList(event))
        {
         this.m_list_trade_events.InsertSort(event);
         //--- Enviar uma mensagem de evento e definir o valor do último evento de negociação
         event.SendEvent();
         this.m_trade_event=event.TradeEvent();
        }
      //--- Se esse evento já estiver na lista - exclua o novo objeto de evento e exiba uma mensagem de depuração
      else
        {
         ::Print(DFUN_ERR_LINE,TextByLanguage("Esse evento já está na lista.","This event is already in the list."));
         delete event;
        }
     }
  }
sublinhe esta linha!
 
Artyom Trishkin:

Sem fazer um link para o local exato das linhas citadas, não consigo entender do que exatamente você está falando - apenas pesquisando (Shift+Ctrl+F), não consegui encontrar esse código em todos os arquivos da biblioteca...

Onde ele está localizado?

Talvez você já tenha corrigido isso nos próximos capítulos da descrição da biblioteca? Para mim, sua biblioteca é muito adequada para minha estratégia e eu a entendo muito bem, pois você criou, além da biblioteca, uma metodologia para a programação correta.
 
BmC:
Aqui estão as linhas da descrição na parte inicial deste artigo e o código no final do artigo: sublinhe esta linha!

No momento, na versão atual da biblioteca, o método é parecido com este:

//+------------------------------------------------------------------+
//|| Cria um evento de negociação dependendo do tipo de alteração da ordem.
//+------------------------------------------------------------------+
void CEventsCollection::CreateNewEvent(COrderControl* order)
  {
   ENUM_EVENT_REASON reason=WRONG_VALUE;
   if(!::SymbolInfoTick(order.Symbol(),this.m_tick))
     {
      ::Print(DFUN,CMessage::Text(MSG_LIB_SYS_NOT_GET_CURR_PRICES),order.Symbol());
      return;
     }
   CEvent* event=NULL;
//--- Ordem StopLimit pendente acionada
   if(order.GetChangeType()==CHANGE_TYPE_ORDER_TYPE)
     {
      reason=EVENT_REASON_STOPLIMIT_TRIGGERED;
      this.m_trade_event_code=TRADE_EVENT_FLAG_ORDER_PLASED;
      event=new CEventOrderPlased(this.m_trade_event_code,order.Ticket());
     }
//--- Modificação
   else
     {
      //--- Preço modificado da ordem pendente
      if(order.GetChangeType()==CHANGE_TYPE_ORDER_PRICE)
         this.m_trade_event_code=TRADE_EVENT_FLAG_ORDER_MODIFY+TRADE_EVENT_FLAG_PRICE;
      //--- Preço da ordem pendente modificada e seu StopLoss
      else if(order.GetChangeType()==CHANGE_TYPE_ORDER_PRICE_STOP_LOSS)
         this.m_trade_event_code=TRADE_EVENT_FLAG_ORDER_MODIFY+TRADE_EVENT_FLAG_PRICE+TRADE_EVENT_FLAG_SL;
      //--- Preço da ordem pendente modificada e seu TakeProfit
      else if(order.GetChangeType()==CHANGE_TYPE_ORDER_PRICE_TAKE_PROFIT)
         this.m_trade_event_code=TRADE_EVENT_FLAG_ORDER_MODIFY+TRADE_EVENT_FLAG_PRICE+TRADE_EVENT_FLAG_TP;
      //--- Modificou o preço da ordem pendente, seu StopLoss e TakeProfit
      else if(order.GetChangeType()==CHANGE_TYPE_ORDER_PRICE_STOP_LOSS_TAKE_PROFIT)
         this.m_trade_event_code=TRADE_EVENT_FLAG_ORDER_MODIFY+TRADE_EVENT_FLAG_PRICE+TRADE_EVENT_FLAG_SL+TRADE_EVENT_FLAG_TP;
      //--- StopLoss modificado da ordem pendente
      else if(order.GetChangeType()==CHANGE_TYPE_ORDER_STOP_LOSS)
         this.m_trade_event_code=TRADE_EVENT_FLAG_ORDER_MODIFY+TRADE_EVENT_FLAG_SL;
      //--- TakeProfit modificado da ordem pendente
      else if(order.GetChangeType()==CHANGE_TYPE_ORDER_TAKE_PROFIT)
         this.m_trade_event_code=TRADE_EVENT_FLAG_ORDER_MODIFY+TRADE_EVENT_FLAG_TP;
      //--- StopLoss e TakeProfit modificados da ordem pendente
      else if(order.GetChangeType()==CHANGE_TYPE_ORDER_STOP_LOSS_TAKE_PROFIT)
         this.m_trade_event_code=TRADE_EVENT_FLAG_ORDER_MODIFY+TRADE_EVENT_FLAG_SL+TRADE_EVENT_FLAG_TP;

      //--- Posição de StopLoss modificada
      else if(order.GetChangeType()==CHANGE_TYPE_POSITION_STOP_LOSS)
         this.m_trade_event_code=TRADE_EVENT_FLAG_POSITION_MODIFY+TRADE_EVENT_FLAG_SL;
      //--- Posição TakeProfit modificada
      else if(order.GetChangeType()==CHANGE_TYPE_POSITION_TAKE_PROFIT)
         this.m_trade_event_code=TRADE_EVENT_FLAG_POSITION_MODIFY+TRADE_EVENT_FLAG_TP;
      //--- StopLoss e TakeProfit modificados da posição
      else if(order.GetChangeType()==CHANGE_TYPE_POSITION_STOP_LOSS_TAKE_PROFIT)
         this.m_trade_event_code=TRADE_EVENT_FLAG_POSITION_MODIFY+TRADE_EVENT_FLAG_SL+TRADE_EVENT_FLAG_TP;
      
      //--- Criar um evento de modificação
      reason=EVENT_REASON_MODIFY;
      event=new CEventModify(this.m_trade_event_code,order.Ticket());
     }
//--- Criando um evento
   if(event!=NULL)
     {
      event.SetProperty(EVENT_PROP_TIME_EVENT,order.Time());                        // Hora do evento
      event.SetProperty(EVENT_PROP_REASON_EVENT,reason);                            // Causa do evento (da enumeração ENUM_EVENT_REASON)
      event.SetProperty(EVENT_PROP_TYPE_DEAL_EVENT,PositionTypeByOrderType((ENUM_ORDER_TYPE)order.TypeOrderPrev())); // Tipo de ordem, cujo acionamento resultou no evento
      event.SetProperty(EVENT_PROP_TICKET_DEAL_EVENT,order.Ticket());               // Ticket da ordem que acionou o evento
      event.SetProperty(EVENT_PROP_TYPE_ORDER_EVENT,order.TypeOrder());             // Tipo de ordem de evento
      event.SetProperty(EVENT_PROP_TICKET_ORDER_EVENT,order.Ticket());              // Bilhete de pedido de evento
      event.SetProperty(EVENT_PROP_TYPE_ORDER_POSITION,order.TypeOrder());          // Tipo da primeira ordem de posição
      event.SetProperty(EVENT_PROP_TICKET_ORDER_POSITION,order.Ticket());           // Ticket da ordem da primeira posição
      event.SetProperty(EVENT_PROP_POSITION_ID,order.PositionID());                 // Identificador de posição
      event.SetProperty(EVENT_PROP_POSITION_BY_ID,0);                               // Identificador de posição do contador
      event.SetProperty(EVENT_PROP_MAGIC_BY_ID,0);                                  // Número mágico da posição do contador
         
      event.SetProperty(EVENT_PROP_TYPE_ORD_POS_BEFORE,order.TypeOrderPrev());      // Tipo de ordem de posição antes da mudança de direção
      event.SetProperty(EVENT_PROP_TICKET_ORD_POS_BEFORE,order.Ticket());           // Posição do tíquete de pedido antes da mudança de direção
      event.SetProperty(EVENT_PROP_TYPE_ORD_POS_CURRENT,order.TypeOrder());         // Tipo de ordem da posição atual
      event.SetProperty(EVENT_PROP_TICKET_ORD_POS_CURRENT,order.Ticket());          // Ticket da ordem da posição atual
      
      event.SetProperty(EVENT_PROP_PRICE_OPEN_BEFORE,order.PricePrev());            // Preço de configuração do pedido antes da modificação
      event.SetProperty(EVENT_PROP_PRICE_SL_BEFORE,order.StopLossPrev());           // Preço de StopLoss antes da modificação
      event.SetProperty(EVENT_PROP_PRICE_TP_BEFORE,order.TakeProfitPrev());         // Preço TakeProfit antes da modificação
      event.SetProperty(EVENT_PROP_PRICE_EVENT_ASK,this.m_tick.ask);                // Pergunte o preço no momento do evento
      event.SetProperty(EVENT_PROP_PRICE_EVENT_BID,this.m_tick.bid);                // Preço do lance no momento do evento
         
      event.SetProperty(EVENT_PROP_MAGIC_ORDER,order.Magic());                      // Número mágico do pedido
      event.SetProperty(EVENT_PROP_TIME_ORDER_POSITION,order.TimePrev());           // Hora da primeira ordem de posição
      event.SetProperty(EVENT_PROP_PRICE_EVENT,order.PricePrev());                  // O preço no qual o evento ocorreu
      event.SetProperty(EVENT_PROP_PRICE_OPEN,order.Price());                       // Preço de definição do pedido
      event.SetProperty(EVENT_PROP_PRICE_CLOSE,order.Price());                      // Preço de fechamento do pedido
      event.SetProperty(EVENT_PROP_PRICE_SL,order.StopLoss());                      // Preço da ordem StopLoss
      event.SetProperty(EVENT_PROP_PRICE_TP,order.TakeProfit());                    // Preço da ordem TakeProfit
      event.SetProperty(EVENT_PROP_VOLUME_ORDER_INITIAL,order.Volume());            // Volume do pedido solicitado
      event.SetProperty(EVENT_PROP_VOLUME_ORDER_EXECUTED,0);                        // Volume da ordem executada
      event.SetProperty(EVENT_PROP_VOLUME_ORDER_CURRENT,order.Volume());            // Volume restante (não executado) da ordem
      event.SetProperty(EVENT_PROP_VOLUME_POSITION_EXECUTED,0);                     // Volume da posição executada
      event.SetProperty(EVENT_PROP_PROFIT,0);                                       // Lucro
      event.SetProperty(EVENT_PROP_SYMBOL,order.Symbol());                          // Símbolo de pedido
      event.SetProperty(EVENT_PROP_SYMBOL_BY_ID,order.Symbol());                    // Símbolo de posição do contador
      //--- Decodificação do código do evento e definição do tipo de evento
      event.SetTypeEvent();
      //--- Se o objeto do evento não estiver na lista - adicione-o
      if(!this.IsPresentEventInList(event))
        {
         this.m_list_trade_events.InsertSort(event);
         //--- Enviar uma mensagem de evento e definir o valor do último evento de negociação
         this.m_trade_event=event.TradeEvent();
         this.m_is_event=true;
         event.SendEvent();
         CBaseObjExt::EventAdd(this.m_trade_event,order.Ticket(),order.Price(),order.Symbol());
        }
      //--- Se esse evento já estiver na lista - exclua o novo objeto de evento e exiba uma mensagem de depuração
      else
        {
         ::Print(DFUN_ERR_LINE,CMessage::Text(MSG_LIB_SYS_EVENT_ALREADY_IN_LIST));
         delete event;
        }
     }
  }
//+------------------------------------------------------------------+

Portanto, ou era um bug e foi corrigido há muito tempo, ou não é crítico na versão discutida da biblioteca. Não me lembro exatamente como era....

 
Artyom Trishkin:

No momento, na versão atual da biblioteca, o método tem a seguinte aparência:

Portanto, ou era um bug e foi corrigido há muito tempo, ou não é crítico na versão discutida da biblioteca. Não me lembro exatamente como era...

Isso é muito importante, e para o autor é ainda mais importante. Se você não abandonou sua ideia original. Para ajudar programadores iniciantes como eu em meu trabalho. Quando você é um iniciante (um estudante) e está aprendendo uma linguagem de programação, ou programação em geral, há muitas dúvidas e perguntas ao estudar seu trabalho (biblioteca). Nesse caso, eu não tinha certeza até o último momento se era um erro ou sua intenção. Analisei seu código mais de uma vez. E, para mim, isso é muito importante: "ou eu não entendi o significado do autor, ou é apenas um erro de digitação do autor em seu grande projeto".
E como você diz que isso não é crítico? Isso é errado de sua parte, portanto, você e eu estamos apenas confundindo os leitores. Que estudam ou aprendem como eu, em sua biblioteca.

 
BmC:

Isso é muito importante e, para o autor, é ainda mais importante. Se você ainda não desistiu de sua ideia original. Para ajudar programadores iniciantes como eu em meu trabalho. Quando você é um iniciante (um estudante) e está aprendendo uma linguagem de programação, ou programação em geral, há muitas dúvidas e perguntas ao estudar seu trabalho (biblioteca). Nesse caso, eu não tinha certeza até o último momento se era um erro ou sua intenção. Analisei seu código mais de uma vez. E, para mim, isso é muito importante: "ou eu não entendi o significado do autor, ou é apenas um erro de digitação do autor em seu grande projeto".
E como você diz que isso não é crítico? Isso é errado de sua parte, portanto, você e eu estamos apenas confundindo os leitores. Que estudam ou aprendem como eu, em sua biblioteca.

:)

Eu lhe mostrei o código com as correções destacadas em cores. Coloque-as na versão da biblioteca anexada a este artigo.

É claro que não me lembro se o erro foi meu ou se não é crítico nessa versão e, portanto, passou despercebido durante a depuração. Afinal de contas, já são quarenta e tantos artigos, e esse foi há muito tempo. O mais provável é que tenha sido um bug, que foi corrigido em artigos posteriores - muitas coisas na biblioteca já são criadas em tempo real. É claro que havia, e mais de uma, versões de teste da biblioteca. Mas, desde o início da descrição de sua criação, muita coisa foi revisada e adicionada. É por isso que esta série de artigos está posicionada como uma descrição da criação da biblioteca. Dessa forma, tento envolver o leitor no processo de sua criação. Com tentativas e erros, e com instruções sobre como corrigi-los, para tornar todo o processo visível, para revelar, por assim dizer, "todas as dores da criação" :) :)

Portanto, peço desculpas por qualquer confusão no seu entendimento do que está acontecendo.....
Basta fazer as alterações sugeridas acima. Ou deixe-as para o artigo em que elas serão corrigidas.

 
Quero obter o símbolo, o tíquete e o tipo do último evento (aberto, fechado, modificado). Como fazer isso corretamente?
 
Andrii Miknevich:
Quero obter o símbolo do último evento, o tíquete e o tipo (aberto, fechado, modificação). Como fazer isso corretamente?

Vejo que Artyom está tão ocupado que nem aparece no fórum. )))))))) Talvez eu possa lhe dar uma dica, pois fiz experiências com a biblioteca dele. Hoje, analisei esses experimentos e encontrei essa função. O comentário diz que a função obtém uma lista de todas as posições em aberto.

void OrderActivated()
{
Print(__FUNCTION__, "***", ENUM_TRADE_EVENT(engine.LastTradeEvent()));
//--- Obter a lista de todas as posições abertas
CArrayObj* list = engine.GetListMarketPosition();
if(list == NULL || list.Total() == 0)
return;
int index = CSelect::FindOrderMax(list, ORDER_PROP_TIME_OPEN);
COrder *pos = list.At(index);
if(pos == NULL)
return;

pos.Print();
}/*******************************************************************/

Infelizmente, não posso explicar para que ela serve, pois esqueci tudo, mas talvez você consiga descobrir....

Bem... se você não conseguir, aguarde. Artem encontrará tempo e responderá.

 

Quando um tique é recebido, no qual uma ordem pendente é definida e simultaneamente ativada (acionada) (testei com Buy Stop), seu mecanismo não registra todos os eventos...

O evento TRADE_EVENT_PENDING_ORDER_PLASED é recebido, mas não o TRADE_EVENT_PENDING_ORDER_ACTIVATED.

Meu código é mais ou menos assim:

//+------------------------------------------------------------------+
//| Processar eventos comerciais|
//+------------------------------------------------------------------+ 
void ProcessTradeEvents(void)
  {
   static ENUM_TRADE_EVENT last_event=WRONG_VALUE;
   static CEvent *last_processed=NULL;
   
   if(engine.LastTradeEvent()!=last_event)
     {      
      if(last_event==TRADE_EVENT_NO_EVENT)
         return;
      CArrayObj *list=engine.GetListAllOrdersEvents();
      if(list==NULL)
         return;
      list=CSelect::ByEventProperty(list,EVENT_PROP_SYMBOL,Symbol(),EQUAL);
      if(list==NULL || list.Total()<=0)
         return;      
      last_event=engine.LastTradeEvent();
      //--- obter o índice do evento antigo
      int index_of_old_event=0;
      if(last_processed==NULL)
         index_of_old_event=-1;
      else
        {
         for(int i=list.Total()-1;i>=0;i--)
           {
            CEvent *event=list.At(i);
            if(event==NULL)
               return;
            ENUM_TRADE_EVENT event_type=event.TypeEvent();
            if(last_processed!=NULL && event.IsEqual(last_processed))
              {
               index_of_old_event=i;
               break;
              }
           }
        }
      //--- verificação de todos os novos eventos
      for(int i=index_of_old_event+1;i<list.Total();i++)
        {
         CEvent *event=list.At(i);
         if(event==NULL)
            break;
         if(last_processed!=NULL && event.IsEqual(last_processed))
            break; 
         Print(__FUNCTION__+": event : ",event.TypeEventDescription());
         switch(event.TypeEvent())
           {
            case TRADE_EVENT_PENDING_ORDER_PLASED:
              {
               // algum código
              }
            break;
            case TRADE_EVENT_PENDING_ORDER_REMOVED:
              {
               // algum código
              }
            break;
            case TRADE_EVENT_PENDING_ORDER_ACTIVATED:
              {
               // algum código
              }
            break;

            case TRADE_EVENT_POSITION_CLOSED:
              {
               // algum código
              }
            break;
            case TRADE_EVENT_POSITION_CLOSED_BY_SL:
              {
               // algum código
              }
            break;
            case TRADE_EVENT_POSITION_CLOSED_BY_TP:
              {
                // algum código
              }
            break;
            case TRADE_EVENT_MODIFY_ORDER_PRICE:
              {
                // algum código
              }
            break;

            case TRADE_EVENT_MODIFY_POSITION_SL:
              {
                // algum código
              }
            break;
            case TRADE_EVENT_MODIFY_POSITION_TP:
              {
                // algum código
              }
            break;
           }
        }
      last_processed=list.At(list.Total()-1);
      Comment("\nLast trade event: ",last_processed.TypeEventDescription());
     }
  }

Primeiro localizo o índice do evento antigo (processado) no loop e, a partir dele, percorro todos os novos até o final. Assim, em uma situação em que em um tick uma ordem de limite é definida e o striggeren recebe um evento sobre a definição... Por favor, comente.

Eu chamo ProcessTradeEvents() em OnTick() seguindo engine.OnTick(rates_data).
Документация по MQL5: Константы, перечисления и структуры / Торговые константы / Свойства ордеров
Документация по MQL5: Константы, перечисления и структуры / Торговые константы / Свойства ордеров
  • www.mql5.com
Свойства ордеров - Торговые константы - Константы, перечисления и структуры - Справочник MQL5 - Справочник по языку алгоритмического/автоматического трейдинга для MetaTrader 5