Problema de entrada de pedidos múltiplos para conta ativa com um corretor específico - página 3

 
figurelli:
OláFinanceEngineer, talvez seja melhor começar a verificar seu problema de pedidos múltiplos de código original, pois se fizermos isso provavelmente abordaremos outros pontos críticos aqui e não perderemos o foco, sobre o que você pensa?

Olá figurelli

Este é o meu novo código. Eu mudei desde que coloquei a questão de pedidos múltiplos neste tópico.

Até agora, este código está funcionando bem com vários corretores. Ainda não foi encontrado nenhum problema de pedidos múltiplos após a mudança. O BlindMist pode tentar este código para ver se consegue evitar o problema de pedidos múltiplos com aquele corretor.

for(int i=0;i<10;i++)
   {

      
 
      if(volume<=0.0) break;
      

      if(Type==POSITION_TYPE_SELL)
      {
         request.type=ORDER_TYPE_SELL;
         request.price=SymbolInfoDouble(mSymbol,SYMBOL_BID);
         
         if(TP!=0) takeprofit = request.price-TP*mPoint;
         if(SL!=0) stoploss = request.price+SL*mPoint;
      }
      
      
      if(Type==POSITION_TYPE_BUY)
      {
         request.type=ORDER_TYPE_BUY;
         request.price=SymbolInfoDouble(mSymbol,SYMBOL_ASK);

         if(TP!=0) takeprofit = request.price+TP*mPoint;
         if(SL!=0) stoploss = request.price-SL*mPoint;
      }
      
      
      
      
      request.action          = TRADE_ACTION_DEAL;
      request.symbol        = mSymbol;
      request.volume        = MathMin(volume,SymbolInfoDouble(mSymbol,SYMBOL_VOLUME_MAX));
      request.sl                = stoploss;
      request.tp               = takeprofit;
      request.deviation     = SymbolInfoInteger(mSymbol,SYMBOL_SPREAD);
      request.type_filling   = ORDER_FILLING_FOK;
      request.comment     = strComment;
      request.magic         = EAMagic;
      
      
      
      if(!OrderCheck(request,check))
      {
         if(check.margin_level<100) volume-=SymbolInfoDouble(mSymbol,SYMBOL_VOLUME_STEP);
         Print("OrderCheck Code: ",check.retcode);
         continue;
      }
      

      
      bool checkOrderSend = OrderSend(request, result);
      
      if(result.retcode==10009 || result.retcode==10008)
      { 
          Print("OrderSend was successful. Code: ",result.retcode);
          volume-=result.volume; //If order was successful then reduce volume to 0.0, then the loop will be terminated.

          
          break;
      }
      else
      {
          Print(ResultRetcodeDescription(result.retcode));
      }
      

      Sleep(1000);
      
   }
   

 

 
 
FinanceEngineer:

Olá figurelli

Este é o meu novo código. Eu mudei desde que coloquei a questão de pedidos múltiplos neste tópico.

Até agora, este código está funcionando bem com vários corretores. Ainda não foi encontrado nenhum problema de pedidos múltiplos após a mudança. O BlindMist pode tentar este código para ver se consegue evitar o problema de pedidos múltiplos com aquele corretor.

Por favor, use o botão SRC ao postar o código.

O código que você postou não pode evitar (todas) as ordens duplas e, ao contrário, pode provocar ordens duplas em algum caso.

 
angevoyageur:

Favor usar o botão SRC ao postar o código.

O código que você postou não pode evitar (todos) pedidos duplos e, ao contrário, pode provocar pedidos duplos em algum caso.

O que seria melhor se houvesse uma solução lá fora, a não ser estabelecer 10 horas de sono dentro do loop?
 
FinanceEngineer:

Olá figurelli

Este é o meu novo código. Eu mudei desde que coloquei a questão de pedidos múltiplos neste tópico.

Até agora, este código está funcionando bem com vários corretores. Ainda não foi encontrado nenhum problema de pedidos múltiplos após a mudança. O BlindMist pode tentar este código para ver se consegue evitar o problema de pedidos múltiplos com aquele corretor.

OláFinanceEngineer, observe que em seu código original você tem Print("OrderSend Code: "...) at if { } and else { }.

Mas caso contrário { } tem um intervalo, e seu código de debug mostra retcode = 10008 (TRADE_RETCODE_PLACED) x 10.

Então, por inferência, você estava imprimindo a condição de { } debug e sua pausa nunca foi usada.

if(!OrderSend(request,result) || result.deal==0 )
      {
         Print("OrderSend Code: ",result.retcode);
         if(result.retcode==TRADE_RETCODE_TRADE_DISABLED) break;
         if(result.retcode==TRADE_RETCODE_MARKET_CLOSED) break;
         if(result.retcode==TRADE_RETCODE_NO_MONEY) break;
         if(result.retcode==TRADE_RETCODE_TOO_MANY_REQUESTS) Sleep(5000);
         if(result.retcode==TRADE_RETCODE_FROZEN) break;
         if(result.retcode==TRADE_RETCODE_CONNECTION) Sleep(15000);
         if(result.retcode==TRADE_RETCODE_LIMIT_VOLUME) break;
         
      }
      else if(result.retcode==10009 || result.retcode==10008)
      { 
          Print("OrderSend Code: ",result.retcode);
          volume-=result.volume; //If order was successful then reduce volume to 0.0, then the loop will be terminated.
          
          if(Type == POSITION_TYPE_BUY) {mBuyPositionCnt = mBuyPositionCnt + 1.0; cntLotCalculation = cntLotCalculation + 1;}
          if(Type == POSITION_TYPE_SELL) {mSellPositionCnt = mSellPositionCnt + 1.0; cntLotCalculation = cntLotCalculation + 1;}
          break;
      }

Agora você mudou seu código, e parece mais claro, mas note que você não testa mais o valor de retorno de OrderSend(), apenas o resultado.retcode. Você poderia corrigir isto usando a variável checkOrderSend (*** veja aqui), sobre a qual eu perguntei antes:

      bool checkOrderSend=OrderSend(request,result);

      if(checkOrderSend) // (*** look here)
        {
         if(result.retcode==10009 || result.retcode==10008)
           {
            Print("OrderSend was successful. Code: ",result.retcode);
            volume-=result.volume; //If order was successful then reduce volume to 0.0, then the loop will be terminated.
            break;
           }
         else
           {
            Print(ResultRetcodeDescription(result.retcode));
           }
        }
      else 
        {
         Print("OrderSend execution error.");
        }

Portanto, na minha opinião, a primeira coisa a fazer é corrigir este teste e verificar novamente usando o mesmo corretor problemático que você relatou. Se o problema não acontecer novamente, parabéns, você realmente resolveu o bug, ou seja, isto não indica que seu código é à prova de futuro ou o mais seguro, mas que encontramos o bug.

Na verdade, você pode esquecer ou evitar mudar seu código novamente, já que o bug não está acontecendo, entretanto, neste caso, você deve ter cuidado para não testar mais o valor de retorno da OrderSend().

Espero que esta informação possa ajudá-lo.

 
figurelli:

OláFinanceEngineer, observe que em seu código original você tem Print("OrderSend Code: "...) at if { } and else { }.

Mas caso contrário { } tem um intervalo, e seu código de debug mostra retcode = 10008 (TRADE_RETCODE_PLACED) x 10.

Então, por inferência, você estava imprimindo a condição de { } debug e sua pausa nunca foi usada.

Agora você mudou seu código, e parece mais claro, mas note que você não testa mais o valor de retorno de OrderSend(), apenas o resultado.retcode. Você poderia corrigir isto usando a variável checkOrderSend (*** veja aqui), sobre a qual eu perguntei antes:

Portanto, na minha opinião, a primeira coisa a fazer é corrigir este teste e verificar novamente usando o mesmo corretor problemático que você relatou. Se o problema não acontecer novamente, parabéns, você realmente resolveu o bug, ou seja, isto não indica que seu código é à prova de futuro ou o mais seguro, mas que encontramos o bug.

Na verdade, você pode esquecer ou evitar mudar seu código novamente, já que o bug não está acontecendo, porém, neste caso, você deve ter cuidado para não testar mais o valor de retorno do OrderSend().

Espero que esta informação possa ajudá-lo.

E sobre o código de retorno 10010 ?

A ordem de entrada dupla pode ocorrer em qualquer corretor, a probabilidade de obtê-la com a Alpari é simplesmente maior, pois você recebe muito mais carrapatos.

 
angevoyageur:

E o código de retorno 10010 ?

A ordem de entrada dupla pode ocorrer em qualquer corretor, a probabilidade de obtê-la com Alpari é simplesmente maior, pois você recebe muito mais carrapatos.

Se você está me perguntando, como eu disse antes, não considero este código prova de futuro e suficientemente seguro e este é apenas um exemplo sobre a falta de código de retorno, então, por favor, leia novamente.

Entretanto, se você estiver perguntando ao autor do código, que tal perguntar diretamente a ele?

 
figurelli:

OláFinanceEngineer, observe que em seu código original você tem Print("OrderSend Code: "...) at if { } and else { }.

Mas, além disso, { } tem uma pausa, e seu código de depuração mostra retcode = 10008 (TRADE_RETCODE_PLACED) x 10.

Então, por inferência, você estava imprimindo a condição de { } debug e sua pausa nunca foi usada.

Agora você mudou seu código, e parece mais claro, mas note que você não testa mais o valor de retorno de OrderSend(), apenas o resultado.retcode. Você poderia corrigir isto usando a variável checkOrderSend (*** veja aqui), sobre a qual eu perguntei antes:

Portanto, na minha opinião, a primeira coisa a fazer é corrigir este teste e verificar novamente usando o mesmo corretor problemático que você relatou. Se o problema não acontecer novamente, parabéns, você realmente resolveu o bug, ou seja, isto não indica que seu código é à prova de futuro ou o mais seguro, mas que encontramos o bug.

Na verdade, você pode esquecer ou evitar mudar seu código novamente, já que o bug não está acontecendo, entretanto, neste caso, você deve ter cuidado para não testar mais o valor de retorno do OrderSend().

Espero que esta informação possa lhe ajudar.

Olá

Eu sei que soa estranho. Quando verifiquei o valor retornado de OrderSend(pedido,resultado) no código anterior, tive um problema de pedidos múltiplos. Agora em meu novo código, eu não verifico o valor retornado de OrderSend(request,result) ( mas ainda atribuí o valor retornado a alguma variável para evitar erro na nova construção do terminal.

Com o novo código, eu não recebo problemas de pedidos múltiplos. Usei o Alpari UK que tem a reputação de enviar muitos carrapatos. Meu código pode não ser perfeito, mas pense desta forma. Há um grande número de códigos devolvidos que precisam ser verificados no Meta Trader 5.

Primeiro deles, o valor retornado da OrderCheck, segundo deles é o valor retornado da OrderSend e terceiro deles é o valor retornado atribuído no resultado.retcode. Acho que quaisquer que sejam os dois primeiros valores retornados, o que realmente devemos nos importar é o último mais a quantidade de volume realmente executada.

Assim, com base neste fato, simplifiquei meu código apenas indo direto para verificar o resultado.retcode. Por favor, me corrija se eu estiver errado. Acho que a execução da ordem no MT5 é certamente muito mais sofisticada que no MT4 e muitos de nós estamos confusos.

Se não podemos construir um caso claro usando somente a lógica, então podemos construir um caso claro usando experimentos. Portanto, recomendo que a BlindMist ou qualquer outra pessoa tente este código com seu corretor para ver se pular para verificar a função OrderSend pode ser realmente útil.

Cordiais cumprimentos.

 
figurelli:
Se você está me perguntando, como eu disse antes, eu não considero este código prova de futuro e seguro o suficiente e este é apenas um exemplo sobre a falta de código de retorno, então, por favor, leia novamente.

Entretanto, se você está perguntando ao autor do código, que tal perguntar diretamente a ele?

Pedi a todos os participantes deste tópico. Perdi sua mensagem sobre o código 10010, onde ele está ?

 
angevoyageur:

Pedi a todos os participantes deste tópico. Perdi sua mensagem sobre o código 10010, onde ele está ?

Oi Alain,

Não está claro para mim o que você precisa saber, já que estamos apenas falando do novo código da FinanceEngineer, e um conselho para testar o código de retorno da OrderSend() que foi alterado em relação ao código original.

Note que ou seu código original e seu novo não têm o código 10010 teste, então se é relevante para você, por que você não perguntou desde o primeiro post dele?

De qualquer forma, você pode explicar por que você precisaria do teste do código 10010 para uma política de enchimento FOK?

Como esta não é a primeira vez que eu vejo você e outros Moderadores falando, você conhece alguns casos em que é realmente necessário este teste de código para pedidos FOK (Fill Or Kill), que você poderia compartilhar conosco?

Agradecemos antecipadamente.

 
FinanceEngineer:

Olá

Eu sei que soa estranho. Quando verifiquei o valor retornado de OrderSend(pedido,resultado) no código anterior, tive um problema de pedidos múltiplos. Agora em meu novo código, eu não verifico o valor retornado de OrderSend(request,result) ( mas ainda atribuí o valor retornado a alguma variável para evitar erro na nova construção do terminal.

Com o novo código, eu não recebo problemas de pedidos múltiplos. Eu usei a Alpari UK que tem a reputação de enviar muitos tiquetaques. Meu código pode não ser perfeito, mas pense desta forma. Há um grande número de códigos devolvidos que precisam ser verificados no Meta Trader 5.

Primeiro deles, o valor retornado da OrderCheck, segundo deles é o valor retornado da OrderSend e terceiro deles é o valor retornado atribuído no resultado.retcode. Acho que quaisquer que sejam os dois primeiros valores retornados, o que realmente devemos nos importar é o último mais a quantidade de volume realmente executada.

Assim, com base neste fato, simplifiquei meu código apenas indo direto para verificar o resultado.retcode. Por favor, me corrija se eu estiver errado. Acho que a execução da ordem no MT5 é certamente muito mais sofisticada que no MT4 e muitos de nós estamos confusos.

Se não podemos construir um caso claro usando somente a lógica, então podemos construir um caso claro usando experimentos. Portanto, recomendo que a BlindMist ou qualquer outra pessoa tente este código com seu corretor para ver se pular para verificar a função OrderSend pode ser realmente útil.

Cordiais cumprimentos.

  • Ignorar o código de retorno OrderSend() é irrelevante sobre o problema de pedidos duplos. Uma simples coincidência.
  • OrderCheck() também é irrelevante, pois é apenas para evitar alguns erros ANTES de enviar um pedido.
  • Se OrderSend() devolvido falso, você sabe que houve um problema, então você pode verificar qual deles e processá-lo de acordo com suas necessidades.
  • Se OrderSend() retornou verdadeiro, aqui começam as dificuldades...veja a próxima mensagem.
Razão: