Cómo trabajar correctamente en MT5 con OrderSend - página 2

 
fxsaber:
Esto ya es un argumento terminológico. La mala situación se ha descrito en detalle más arriba. Las bibliotecas estándar ni siquiera lo tienen en cuenta.

No.

Pero sigue insistiendo. No lo explicaré más.

 
Renat Fatkhullin:

No.

Pero sigue insistiendo. No lo explicaré más.

La gente escribe sobre ello en el foro. Y más de una vez. La reacción es sólo eso.

 
fxsaber:

La gente escribe sobre ello en el foro. Y más de una vez. La reacción es así.

La gente no quiere pensar por sí misma, sino que quiere que otros lo hagan por ella... Por desgracia, este es el caso.
 
prostotrader:

¿Quieres que te ayude a sortear estos contratiempos (desde la experiencia personal de operar con robots MT5 en una cuenta real)?

Añadido

Absolutamente gratis :)

Añade también los tuyos a la hucha.

Foro sobre comercio, sistemas de comercio automatizados y pruebas de estrategias

Esperando la respuesta del servidor después de enviar OrderSend()

Denis Sartakov, 2016.10.08 15:43

La función es sincrónica, sólo que el historial no se actualiza sincrónicamente con la finalización de esta función,

Lo hago así, creo que es más fácil que trastear con OnTrade(), y otras cosas:

bool ClosePosition()
{
   if (!PositionSelect(_Symbol))
   {
      return(false);
   }

   bool   b_Result;
   
   b_Result = m_trade.PositionClose(_Symbol,mi_Deviation);
   
   if(!b_Result)
   {
      Print("The PositionClose() method has failed. Return code=",m_trade.ResultRetcode(),
            ". Code description: ",m_trade.ResultRetcodeDescription());
      return(false);
   }
   
   if(b_Result)
   {
      if (m_trade.ResultRetcode() == TRADE_RETCODE_DONE)
      {
         while(PositionSelect(_Symbol))
         {
         }
         
         Print("The PositionClose() has been successfully executed. Return code=",m_trade.ResultRetcode(),
               " (",m_trade.ResultRetcodeDescription(),")");
         return(true);
      }
      if (m_trade.ResultRetcode() != TRADE_RETCODE_DONE)
      {
         Print("The PositionClose() failed. Return code=",m_trade.ResultRetcode(),
               " (",m_trade.ResultRetcodeDescription(),")");
         return(false);
      }
   }
   return(false);
}      
//+------------------------------------------------------------------+

 
prostotrader:
La gente no quiere pensar por sí misma, sino que quiere que otros lo hagan por ella... desgraciadamente este es el caso.

La gente no sólo piensa, sino que también comparte sus soluciones. Por desgracia, los desarrolladores no dicen nada al respecto.

Ni un solo ejemplo en la Documentación sobre este tema. Y esto es con la función principal.

 
fxsaber:

La gente no sólo piensa, sino que también comparte sus soluciones. Por desgracia, los desarrolladores no dicen nada al respecto.

Ni un solo ejemplo en la Documentación sobre este tema. Y eso es con la función principal.

El ejemplo que has puesto arriba es, con perdón, un completo disparate.

¡Ese no es el lugar para empezar!

 
prostotrader:

El ejemplo que has puesto arriba es, con perdón, un completo disparate.

¡Ese no es el lugar para empezar!

Mi variante

Foro sobre comercio, sistemas de comercio automatizados y pruebas de estrategias

Bichos, errores, preguntas

fxsaber, 2016.10.09 09:39

Si se envía un OrderSend, hay que RECORDAR (aquí es donde está la potencial vulnerabilidad) que se hace. A continuación, no tenga en cuenta el historial actual (entorno de negociación) hasta que llegue el mensaje OnTrade correspondiente. Una vez que llegue, RECUERDE OLVIDARSE.

Cuando no hay REMEMBER, se puede confiar en el historial como en MT4.


 
//+------------------------------------------------------------------+
//|                                                    OrderSend.mq5 |
//|                        Copyright 2016, MetaQuotes Software Corp. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2016, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"
//
bool is_busy;
ulong order_ticket;
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//---
   is_busy=false; 
   order_ticket=0;
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---
   
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
//---
   if(!is_busy && (order_ticket==0)) //Только при выполнении данного условия мы продолжаем работать(кроме отложенного ордера)
   {
     MqlTradeRequest request={0};
     MqlTradeResult  result={0};
     
     if(PositionSelect(Symbol()))
     {
       if(OrderSend(request, result)
       {
         if(result.retcode==TRADE_RETCODE_PLACED) //для биржи TRADE_RETCODE_PLACED
         {
           if(result.order>0)
           {
             is_busy=true;
             order_ticket=result.order;
             Print("Order plased, ticket = ",result.order);
           }
           else
           {
             Print("Internal error!");
           }  
         }
         else
         {
           //смотрим причину result.retcode
         }
       }
       else
       {
         Print("Order NOT send!");
       }
     }
     else
     {
     }
   }   
  }
//+------------------------------------------------------------------+
//| TradeTransaction function                                        |
//+------------------------------------------------------------------+
void OnTradeTransaction(const MqlTradeTransaction& trans,
                        const MqlTradeRequest& request,
                        const MqlTradeResult& result)
  {
//--- В зависимости от того, квкой тип ордера мы устанавливали, смотрим, что с ордером произошло
// и только после полного понимания снимаем флаг is_busy=false; order_ticket=0;
// вот и все премудрости OrderSend
   
  }
//+------------------------------------------------------------------+

Aprovecha.

 
prostotrader:

Úsalo.

Entonces, ¿en qué se diferencia de lo que escribí arriba? Un buen hombre incluso me envió una biblia seria sobre el tema.

La gente está encontrando soluciones. Se trataba del hecho de que los propios desarrolladores ni siquiera lo tienen en el SB.

 
fxsaber:

¿En qué se diferencia esto de lo que escribí anteriormente? Incluso un buen hombre me dejó caer una biblia seria sobre el tema.

La gente está encontrando soluciones. Se trataba del hecho de que los propios desarrolladores ni siquiera lo tienen en el SB.

Si no te gusta, no lo uses.
Razón de la queja: