RESOLVIDO: MqlTradeResult retornando preço zero

Para adicionar comentários, por favor Faça o login ou registrar
GMouzella
13
GMouzella  

Bom dia pessoal, estou montando um EA e na hora de pegar o preço da transação o valor do preço e do ticket da transação vem como zero quando coloco pra rodar na conta real. Porém no back teste funciona numa boa.


O código que estou usando é esse ai. Estou operando Winq18 na XP. Alguém saberia me explicar o que pode estar acontecendo? PS: já tentei colocar Sleep porém ainda assim ele não retorna, apesar de no trade_result.comment ele retornar "Request Executed"

bool SendOrder(int flag,bool flag1,string tipo)
  {
   
   trade_request.action    =  TRADE_ACTION_DEAL;
   trade_request.symbol    =  Symbol();
   trade_request.volume    =  signal_volume;
   //trade_request.deviation =  slipagem_max;
   trade_request.magic     =  magic_number;
   trade_request.type_filling = ORDER_FILLING_FOK;
      
   if(flag==0) //- Compra
     {
      trade_request.type      =  ORDER_TYPE_BUY;
      trade_request.price     =  SymbolInfoDouble(Symbol(),SYMBOL_ASK);
     }
   else if(flag==1)
     {
      trade_request.type      =  ORDER_TYPE_SELL;
      trade_request.price     =  SymbolInfoDouble(Symbol(),SYMBOL_ASK);   
     }
   else return false;

//--- ENVIO DA ORDEM
   if(!OrderSend(trade_request,trade_result))
     {
      
      PrintFormat("OrderSend error %d",GetLastError());
      return false;
     }
   else
     {
      
      //-- SAVING INFORMATION INTO GLOBAL VARIABLES
      if(trade_request.magic == magic_number)
      {
         int retry = 10;
         do{   
            if(trade_request.type==ORDER_TYPE_BUY )
            {
               if(flag1==true)
                 {
                     TimeCurrent(info_buy.exec_hour);
                     
                     info_buy.num_sistema = n_sistema;
                     info_buy.volume      = trade_result.volume;
                     info_buy.tipo        = ORDER_TYPE_BUY;
                     info_buy.signal_ref  = signal_ref;
                     info_buy.thresh_buy  = threshold_buy;
                     info_buy.thresh_sell = threshold_sell;
                     info_buy.begin_sig   = begin_signal;
                     info_buy.sig_value   = trade_request.price;
                     info_buy.sl          = signal_sl_Buy;
                     info_buy.tp          = signal_tp_Buy;
                 }
               else
                 {
                     TimeCurrent(info_sell.close_hour);
                     
                     info_sell.close_sig   = last_tick.last;
                     info_sell.mean_close  = trade_result.price;
                     info_sell.tipo_saida  = tipo;
                 }
            }
            else if(trade_request.type==ORDER_TYPE_SELL)
            {
               if(flag1==true)
                 {
                     TimeCurrent(info_sell.exec_hour);
                  
                     info_sell.num_sistema = n_sistema;
                     info_sell.volume      = trade_result.volume;
                     info_sell.tipo        = ORDER_TYPE_SELL;
                     info_sell.signal_ref  = signal_ref;
                     info_sell.thresh_buy  = threshold_buy;
                     info_sell.thresh_sell = threshold_sell;
                     info_sell.begin_sig   = begin_signal;
                     info_sell.sig_value   = trade_request.price;
                     info_sell.sl          = signal_sl_Sell;
                     info_sell.tp          = signal_tp_Sell;
                 }
               else
                 {
                     TimeCurrent(info_buy.close_hour);
                  
                     info_buy.close_sig   = last_tick.last;
                     info_buy.mean_close  = trade_result.price;
                     info_buy.tipo_saida  = tipo;
                 }
              }
               
               if(flag1 == true)
               {
                  PrintFormat("retcode=%u  deal=%I64u",trade_result.retcode,trade_result.deal);
                  //-- INFORMAÇÃO SOBRE A OPERAÇÃO
                  PrintFormat("Sistema %d: Transação #%d %s volume %G em %s executada %s ao preço %G",n_sistema,trade_result.price,
                              EnumToString(trade_request.type),trade_result.volume,trade_request.symbol,TimeToString(TimeCurrent()),trade_result.price);
               }
            
            if(trade_result.price == 0) Sleep(500);
            --retry;
           }while(trade_result.price == 0 && retry != 0);
       }
       return true;
     }
     return false;
  }
GMouzella
13
GMouzella  
RESOLVIDO: O código em si não tem nenhum problema. O problema estava com a conexão entre o EA e o servidor. O servidor da XP demora entre 400 e 600 ms para retornar os valores e o programa passava direto sem pegar o valor. A solução foi fazer um acesso ao histórico de negociações com HistoryDealsTotal() com um Sleep(1000) antes da leitura do histórico, ou uma solução mais elegante foi fazer um do...while() entre o histórico com a condição de saída sendo quando o preço fosse diferente de zero.
Para adicionar comentários, por favor Faça o login ou registrar