Problema de entrada de órdenes múltiples para la cuenta real con un corredor específico - página 3

 
figurelli:
HolaFinanceEngineer, tal vez sería mejor empezar a comprobar su código original problema de órdenes múltiples, ya que si hacemos esto probablemente vamos a abordar otros puntos críticos aquí y no perder el enfoque, ¿qué piensa usted acerca de?

Hola figurelli

Este es mi nuevo código. Lo cambié desde que planteé el problema de las órdenes múltiples en este hilo.

Hasta ahora este código está trabajando bien con varios corredores. BlindMist puede probar este código para ver si puede evitar el problema de órdenes múltiples con ese corredor.

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:

Hola figurelli

Este es mi nuevo código. Lo cambié desde que planteé el problema de las órdenes múltiples en este hilo.

Hasta ahora este código está trabajando bien con varios corredores. BlindMist puede probar este código para ver si puede evitar el problema de las órdenes múltiples con ese corredor.

Por favor, utilice el botón SRC cuando publique el código.

El código que ha publicado no puede evitar (todas) las órdenes dobles, y por el contrario puede provocar órdenes dobles en algunos casos.

 
angevoyageur:

Por favor, utilice el botón SRC cuando publique el código.

El código que ha publicado no puede evitar (todos) los pedidos dobles, y por el contrario puede provocar pedidos dobles en algunos casos.

¿Cuál sería la mejor manera si hay una solución por ahí, excepto el establecimiento de 10 horas de sueño dentro del bucle?
 
FinanceEngineer:

Hola figurelli

Este es mi nuevo código. Lo cambié desde que planteé el problema de las órdenes múltiples en este hilo.

Hasta ahora este código está trabajando bien con varios corredores. BlindMist puede probar este código para ver si puede evitar el problema de órdenes múltiples con ese corredor.

HolaFinanceEngineer, nota que en tu código original tienes Print("OrderSend Code: "...) en if { } y else { }.

Pero else { } tiene un break, y tu código de depuración muestra retcode = 10008 (TRADE_RETCODE_PLACED) x 10.

Así que, por inferencia, usted estaba imprimiendo la condición if { } debug y su break nunca fue utilizado.

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;
      }

Ahora has cambiado tu código, y parece más claro, pero observa que ya no compruebas el valor de retorno de OrderSend(), sólo el result.retcode. Podrías corregir esto usando la variable checkOrderSend (*** mira aquí), sobre la que pregunté 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.");
        }

Así que, en mi opinión, lo primero que hay que hacer es corregir esta prueba y comprobar de nuevo utilizando el mismo corredor problemático que informó. Si el problema no vuelve a ocurrir, enhorabuena, realmente has resuelto el bug, es decir, esto no indica que tu código sea a prueba de futuro o el más seguro, sino que hemos encontrado el bug.

En realidad, puedes olvidarte o evitar cambiar tu código de nuevo, ya que el error no se produce, sin embargo, en este caso, debes tener en cuenta que ya no estás probando el valor de retorno de OrderSend().

Espero que esta información pueda ayudarte.

 
figurelli:

HolaFinanceEngineer, observa que en tu código original tienes Print("OrderSend Code: "...) en if { } y else { }.

Pero else { } tiene un break, y tu código de depuración muestra retcode = 10008 (TRADE_RETCODE_PLACED) x 10.

Así que, por inferencia, usted estaba imprimiendo la condición if { } debug y su break nunca fue utilizado.

Ahora has cambiado tu código, y parece más claro, pero observa que ya no compruebas el valor de retorno de OrderSend(), sólo el result.retcode. Podrías corregir esto usando la variable checkOrderSend (*** mira aquí), sobre la que pregunté antes:

Así que, en mi opinión, lo primero que hay que hacer es corregir esta prueba y comprobar de nuevo utilizando el mismo corredor problemático que informó. Si el problema no vuelve a ocurrir, enhorabuena, realmente has resuelto el bug, es decir, esto no indica que tu código sea a prueba de futuro o el más seguro, sino que hemos encontrado el bug.

En realidad, puedes olvidarte o evitar cambiar tu código de nuevo, ya que el fallo no se produce, sin embargo, en este caso, debes tener en cuenta que ya no estás probando el valor de retorno de OrderSend().

Espero que esta información pueda ayudarte.

¿Qué pasa con el código devuelto 10010?

La orden de doble entrada puede ocurrir en cualquier broker, la probabilidad de que ocurra con Alpari es simplemente mayor ya que se reciben muchos más ticks.

 
angevoyageur:

¿Qué pasa con el código devuelto 10010?

La orden de doble entrada puede ocurrir en cualquier broker, la probabilidad de conseguirlo con Alpari es simplemente mayor ya que se reciben muchos más ticks.

Si me pregunta a mí, como ya he dicho antes, no considero este código lo suficientemente seguro y a prueba de futuro y esto es sólo un ejemplo sobre la falta de código de retorno, así que por favor lea de nuevo.

Sin embargo, si usted está pidiendo al autor del código, ¿qué hay de preguntar directamente a él?

 
figurelli:

HolaFinanceEngineer, observa que en tu código original tienes Print("OrderSend Code: "...) en if { } y else { }.

Pero else { } tiene una ruptura, y su código de depuración muestra retcode = 10008 (TRADE_RETCODE_PLACED) x 10.

Así que, por inferencia, usted estaba imprimiendo la condición if { } debug y su break nunca fue utilizado.

Ahora has cambiado tu código, y parece más claro, pero observa que ya no compruebas el valor de retorno de OrderSend(), sólo el result.retcode. Podrías corregir esto usando la variable checkOrderSend (*** mira aquí), sobre la que pregunté antes:

Así que, en mi opinión, lo primero que hay que hacer es corregir esta prueba y comprobar de nuevo utilizando el mismo corredor problemático que informó. Si el problema no vuelve a ocurrir, enhorabuena, realmente has resuelto el bug, es decir, esto no indica que tu código sea a prueba de futuro o el más seguro, sino que hemos encontrado el bug.

En realidad, puedes olvidarte o evitar cambiar tu código de nuevo, ya que el error no se produce, sin embargo, en este caso, debes tener cuidado de que ya no estás probando el valor de retorno de OrderSend().

Espero que esta información pueda ayudarte.

Hola

Sé que suena extraño. Cuando comprobaba el valor devuelto de OrderSend(request,result) en el código anterior, tenía el problema de los pedidos múltiples. Ahora en mi nuevo código, no compruebo el valor devuelto de OrderSend(request,result) ( pero aún así asigné el valor devuelto a alguna variable para evitar el error en la nueva compilación del terminal.

Con el nuevo código, no tengo el problema de los pedidos múltiples. Utilicé el Alpari UK que tiene la reputación de enviar muchos ticks. Mi código puede no ser perfecto, pero pensar de esta manera. Hay un buen número de códigos devueltos que necesitan ser revisados en Meta Trader 5.

El primero de ellos, el valor devuelto de OrderCheck, el segundo de ellos es el valor devuelto de OrderSend y el tercero de ellos es el valor devuelto asignado en result.retcode. Creo que cualesquiera que sean los dos primeros valores devueltos, lo que realmente debería importarnos más es el último más la cantidad de volumen realmente ejecutado.

Así que basándome en este hecho, he simplificado mi código yendo directamente a comprobar result.retcode. Por favor, corregidme si me equivoco. Creo que la ejecución de órdenes en MT5 es ciertamente mucho más sofisticada que en MT4 y muchos de nosotros estamos confundidos.

Si no podemos construir un caso claro usando solo la lógica entonces podemos construir un caso claro usando experimentos. Así que recomiendo a BlindMist o a cualquier otra persona que pruebe este código con su broker para ver si saltarse la función OrderSend puede ser realmente útil.

Saludos cordiales.

 
figurelli:
Si me preguntas a mí, como ya he dicho antes, no considero este código lo suficientemente seguro y a prueba de futuro, y esto es sólo un ejemplo de la falta de código de retorno, así que por favor lee de nuevo.

Sin embargo, si le preguntas al autor del código, ¿qué tal si le preguntas directamente a él?

He preguntado a todos los que participan en este tema. Me he perdido tu mensaje sobre el código 10010, ¿dónde está?

 
angevoyageur:

He preguntado a todos los que participan en este tema. Me he perdido tu mensaje sobre el código 10010, ¿dónde está?

Hola Alain,

No me queda claro lo que necesitas saber, ya que sólo estamos hablando del nuevo código de FinanceEngineer, y un consejo sobre la prueba del código de retorno de OrderSend() que fue cambiado del código original.

Ten en cuenta que tanto su código original como el nuevo no tienen el código 10010 de prueba, así que si es relevante para ti ¿por qué no lo preguntaste desde el primer post de él?

De todos modos, ¿puede explicar por qué necesitaría el código 10010 de prueba para una política de llenado FOK?

Ya que no es la primera vez que veo que usted y otros moderadores hablan de ello, ¿conoce algunos casos en los que es realmente necesario este código de prueba para las órdenes FOK (Fill Or Kill), que podría compartir con nosotros?

Gracias de antemano.

 
FinanceEngineer:

Hola

Sé que suena extraño. Cuando comprobaba el valor devuelto de OrderSend(request,result) en el código anterior, tenía el problema de los pedidos múltiples. Ahora en mi nuevo código, no compruebo el valor devuelto de OrderSend(request,result) ( pero todavía asigné el valor devuelto a alguna variable para evitar el error en la nueva construcción del terminal.

Con el nuevo código, no tengo el problema de los pedidos múltiples. Utilicé el Alpari UK que tiene la reputación de enviar muchos ticks. Mi código puede no ser perfecto, pero pensar de esta manera. Hay un buen número de códigos devueltos que necesitan ser revisados en Meta Trader 5.

El primero de ellos, el valor devuelto de OrderCheck, el segundo de ellos es el valor devuelto de OrderSend y el tercero de ellos es el valor devuelto asignado en result.retcode. Creo que cualesquiera que sean los dos primeros valores devueltos, lo que realmente debería importarnos más es el último más la cantidad de volumen realmente ejecutado.

Así que basándome en este hecho, he simplificado mi código yendo directamente a comprobar result.retcode. Por favor, corregidme si me equivoco. Creo que la ejecución de órdenes en MT5 es ciertamente mucho más sofisticada que en MT4 y muchos de nosotros estamos confundidos.

Si no podemos construir un caso claro usando solo la lógica entonces podemos construir un caso claro usando experimentos. Así que recomiendo a BlindMist o a cualquier otra persona que pruebe este código con su broker para ver si saltarse la función OrderSend puede ser realmente útil.

Saludos cordiales.

  • Omitir el código de retorno de OrderSend() es irrelevante para el problema de las órdenes dobles. Es una simple coincidencia.
  • OrderCheck() también es irrelevante, ya que es sólo la prevención de algunos errores antes de enviar una orden.
  • Si OrderSend() devolvió false, usted sabe que hubo un problema, por lo que puede comprobar cuál y procesarlo de acuerdo a sus necesidades.
  • Si OrderSend() devolvió true, aquí comienzan las dificultades...vea el siguiente mensaje.