Discussão do artigo "Biblioteca para o desenvolvimento fácil e rápido de programas para a MetaTrader (parte IV): eventos de negociação" - página 3

 

É como uma palestra muito interessante em termos de conteúdo. Com certeza acompanharei toda a série.

Infelizmente, pode até haver pequenos erros de propósito - o conteúdo é muito complexo e talvez você deva ficar atento.

Na seção "

CMarketCollection::Refresh

" o campo total_market não é encontrado - isso já aconteceu antes com ORDER_STATUS_MARKET. A mudança de simples para complexo é muito impressionante.

No ponto de atualização, não pude ir além, pois o próximo objeto também não queria ser executado imediatamente. Portanto, fiquei feliz em usar o download.

mfG

Marc Tolkmitt

 

Estranho, não consigo entender a lógica mais simples com seus métodos...

Aqui eu preciso obter o horário de fechamento da última negociação. Parece que a biblioteca tem um mecanismo para trabalhar com ordens abstratas à la MT4, mas não vejo nenhum método para trabalhar com elas.

Eu solicito Deals, mas ORDER_PROP_TIME_CLOSE não é suportado:

bool last_trade_time_filter=true;
   CArrayObj *all_trades=engine.GetListDeals();
   if(all_trades!=NULL && all_trades.Total()>0)
     {
      CArrayObj *sym_all_trades=CSelect::ByOrderProperty(all_trades,ORDER_PROP_SYMBOL,Symbol(),EQUAL);
      if(sym_all_trades!=NULL && sym_all_trades.Total()>0)
        {
         CArrayObj *sym_all_trades_recent=CSelect::ByOrderProperty(sym_all_trades,ORDER_PROP_TIME_CLOSE,iTime(NULL,PERIOD_CURRENT,1),EQUAL_OR_MORE);
         if(sym_all_trades_recent.Total()>0)
           {
            // ele não vem aqui
            last_trade_time_filter=false;
           }
            
        }
     }
 
leonerd obter o horário de fechamento da última negociação. Parece que a biblioteca tem um mecanismo para trabalhar com ordens abstratas à la MT4, mas não vejo nenhum método para trabalhar com elas.

Solicito Deals, mas ORDER_PROP_TIME_CLOSE não é compatível:

Ok, de alguma forma é incorreto solicitar o horário de fechamento de uma negociação. Mas isso também não funciona com GetListHistoryOrders()...

 
leonerd obter o horário de fechamento da última negociação. Parece que a biblioteca tem um mecanismo para trabalhar com ordens abstratas à la MT4, mas não vejo nenhum método para trabalhar com elas.

Solicito Deals, mas ORDER_PROP_TIME_CLOSE não é compatível:

No Expert Advisor de teste, no manipulador de pressionamento de botão.

//+------------------------------------------------------------------+
//| Tratamento de pressionamentos de botão|
//+------------------------------------------------------------------+
void PressButtonEvents(const string button_name)

(e esse é apenas um exemplo de como lidar com eventos e obter dados).

Há blocos de código que são responsáveis pelo fechamento de posições. Você pode ver como isso é implementado lá. Por exemplo, um bloco de código para fechar uma compra pelo símbolo atual com lucro máximo:

      //--- Se o botão BUTT_CLOSE_BUY for pressionado: Fechar a compra com lucro máximo
      else if(button==EnumToString(BUTT_CLOSE_BUY))
        {
         //--- Obter a lista de todas as posições abertas
         CArrayObj* list=engine.GetListMarketPosition();
         //--- Selecione na lista somente posições de compra e somente pelo símbolo atual
         list=CSelect::ByOrderProperty(list,ORDER_PROP_SYMBOL,Symbol(),EQUAL);
         list=CSelect::ByOrderProperty(list,ORDER_PROP_TYPE,POSITION_TYPE_BUY,EQUAL);
         //--- Classifique a lista por lucro com comissão e swap levados em conta
         list.Sort(SORT_BY_ORDER_PROFIT_FULL);
         //--- Obter o índice da posição de compra com o maior lucro
         int index=CSelect::FindOrderMax(list,ORDER_PROP_PROFIT_FULL);
         if(index>WRONG_VALUE)
           {
            //--- Obtenha o objeto Buy position e feche a posição do tíquete
            COrder* position=list.At(index);
            if(position!=NULL)
              {
               //--- Se os botões para criar uma solicitação pendente não forem pressionados - feche a posição
               if(!pressed_pending_close_buy)
                  engine.ClosePosition((ulong)position.Ticket());
               //--- Caso contrário - crie uma solicitação pendente para fechar uma posição em um tíquete
               //--- e definir condições dependendo dos botões ativos
               else
                 {
                  int id=engine.ClosePositionPending(position.Ticket());
                  if(id>0)
                    {
                     //--- definir o preço e o tempo de ativação da solicitação pendente e definir os parâmetros de ativação
                     double bid=SymbolInfoDouble(NULL,SYMBOL_BID);
                     double price_activation=NormalizeDouble(bid+distance_pending_request*g_point,g_digits);
                     ulong  time_activation=TimeCurrent()+bars_delay_pending_request*PeriodSeconds();
                     SetPReqCriterion((uchar)id,price_activation,time_activation,BUTT_CLOSE_BUY,EQUAL_OR_MORE,bid,TimeCurrent());
                    }
                 }
              }
           }
        }

Sobre posições fechadas - eu fiz isso há muito tempo, agora não sei dizer como obter o que você precisa em um piscar de olhos. Darei uma olhada mais tarde e escreverei - estou muito ocupado no momento.

 
Artyom Trishkin #:

No Expert Advisor de teste, no manipulador de pressionamento de botão

(e esse é apenas um exemplo de como processar eventos e obter dados).

Há blocos de código que são responsáveis pelo fechamento de posições. Você pode ver como isso é implementado lá. Por exemplo, um bloco de código para fechar uma compra no símbolo atual com lucro máximo:

Sobre posições fechadas - eu fiz isso há muito tempo, agora não sei dizer como obter o que você precisa em um piscar de olhos. Darei uma olhada mais tarde e escreverei - estou muito ocupado no momento.

Obrigado, mas não há necessidade de participar do evento.

 
ORDER_STATUS_MARKET_ORDER dá erro: identificador não declarado. Parece que as coisas mudaram nas versões recentes do MQL 5, ele aparece tanto no COrder::OrderMagicNumber quanto no CMarketOrder Constructor!
 
theonementor # :
ORDER_STATUS_MARKET_ORDER dá erro: identificador não declarado. Parece que as coisas mudaram nas versões recentes do MQL 5, ele aparece tanto no COrder::OrderMagicNumber quanto no CMarketOrder Constructor!

Fiz o download do arquivo MQL5.zip anexado ao artigo - cada arquivo individualmente e todos juntos (ao compilar Engine.mqh ou TestDoEasyPart04.mq5) são compilados sem erros.

O que exatamente você está fazendo para receber um erro de compilação?

 
Artyom Trishkin #:

Fiz o download do arquivo MQL5.zip anexado ao artigo - cada arquivo individualmente e todos juntos (ao compilar Engine.mqh ou TestDoEasyPart04.mq5) são compilados sem erros.

O que exatamente você está fazendo para receber um erro de compilação?

Descobri que havia uma entrada faltando no enum define. De alguma forma, ela estava faltando (embora eu tenha copiado e colado o código do tutorial no editor)
 
theonementor # :
Descobri que havia uma entrada faltando no enum define. De alguma forma, ela estava faltando (embora eu tenha copiado e colado o código do tutorial no editor)

Os códigos no artigo nem sempre correspondem aos códigos nos arquivos anexados. Às vezes, posso deixar passar algo durante a descrição e, às vezes, algo é adicionado depois de escrever o artigo. O artigo não é um guia passo a passo no estilo "ler-copiar-usar", mas apenas uma explicação detalhada na forma de material de treinamento. E pequenos erros e omissões fazem você pensar, e isso é bom)