¿Cómo puedo abrir una orden de mercado correctamente? - página 5

 
Gennady Mazur:

Hace poco planteé un tema sobre la reapertura de pedidos. Pensé que había resuelto el problema, ya que todo funcionó sin problemas durante una semana. Pero hoy me he encontrado con un problema similar sólo al abrir.
Se abrieron muchas órdenes en Finam, y 9 en Otkritie... aunque sólo debería haberse abierto una orden en todos los casos.

Este es un fragmento de código del EA

    if(OpenOrders<1)
    {
        Coment="Open Sell "+string(OpenOrders+1);
        ret=OpenSellPosition(_Symbol,volume,Coment,Sleeppage,Filling);
    }
    
    
  if(ret)
  {
    OpenOrders++;
    PriceLastOpen=price;
  }

bool OpenSellPosition(string symbol, double volume, string comment="", ulong deviation=10, ENUM_ORDER_TYPE_FILLING filling=ORDER_FILLING_FOK)
{
  MqlTradeRequest Request;
  MqlTradeResult Results;
  ZeroMemory(Request);
  ZeroMemory(Results);
  Request.price=SymbolInfoDouble(_Symbol,SYMBOL_BID);
  Request.action=TRADE_ACTION_DEAL;
  Request.type=ORDER_TYPE_SELL;
  Request.symbol=symbol;
  Request.volume=volume;      
  Request.deviation=deviation;
  Request.comment=comment;  
  Request.type_filling=filling;
  bool res=false;
  res=OrderSend(Request,Results);
  if(res)
  {
    if(Results.deal>0) return(true);
    else return(false);
  }
  return(false);
}

es decir, podemos ver en el código que si la operación tiene éxito, aumenta la variableOpenOrders, que inicialmente es igual a 0

Si es superior a 0, no debe haber más apertura de la orden, sino que toda la pila de órdenes se abre con el comentario Orden1.

Compruebo si hay una respuesta positiva en la función de apertura de la orden y si se ha recibido el ticket de la orden, pero por alguna razón esta función devuelve false, aunque la orden esté realmente establecida.

Explique qué es lo que falla, cómo resolver este problema.

Además, puede comprobar la apertura de una posición intentando seleccionarla. Y es mejor intentarlo varias veces.

         int n = 0;
          do
           {
            n++;
           }
          while(!PositionSelectByTicket(tradeResult.deal) && n < 5);
Hay tanto un retraso como una confirmación de que la posición ya está en marcha.

También me he dado cuenta de que no hay ninguna comprobación OrderCheck(Request, checkResult), lo cual es malo.
 

Ah, y también en orden de mercado - precio = 0

Request.price=SymbolInfoDouble(_Symbol,SYMBOL_BID); olvídalo

bool SendOrderSyncMode()
  {
   MqlTradeRequest request={0};
   MqlTradeResult  result={0};
   order_ticket=0;
   request.action = TRADE_ACTION_DEAL;
   request.magic  = 9876543211;
   request.symbol = Symbol();
   request.volume = 1;
   request.price  = 0;
   request.type=ORDER_TYPE_BUY;
   request.comment="Sync mode";
   request.type_filling=ORDER_FILLING_FOK;
   request.type_time=ORDER_TIME_DAY;
   if(OrderSend(request,result))
     {
      if((result.retcode==TRADE_RETCODE_DONE) || (result.retcode==TRADE_RETCODE_PLACED))
        {
         if(result.order>0)
           {
            order_ticket=result.order;
            Print(__FUNCTION__," Order sent in sync mode");
            return(true);
           }
         else
           {
            Print(__FUNCTION__," Error order sent in sync mode! Retcode = ",result.retcode);
           }
        }
      else
        {
         Print(__FUNCTION__," Error order sent in sync mode! Retcode = ",result.retcode);
        }
     }
   else
     {
      Print(__FUNCTION__," Order not sent in sync mode.");
     }
   return(false);
  }
void OnTradeTransaction(const MqlTradeTransaction &trans,
                        const MqlTradeRequest &request,
                        const MqlTradeResult &result)
  {
   switch(trans.type)
     {
      case TRADE_TRANSACTION_HISTORY_ADD:
        if((order_ticket > 0) && (trans.order == order_ticket))
      {
        //Вот здесь и смотрим что произошло
      }
      break;
     }
  }
 
Alexey Viktorov:
Además, es posible comprobar la apertura de la posición intentando seleccionarla. Y es mejor intentarlo varias veces

         int n = 0;
          do
           {
            n++;
           }
          while(!PositionSelectByTicket(tradeResult.deal) && n < 5);
Hay tanto retraso como confirmación de que la posición ya se ha abierto.

También me he dado cuenta de que no hay ninguna comprobación OrderCheck(Request, checkResult), lo cual es malo.

¿Y si el puesto ya existía?

¿O si ya hay una posición pero la orden no se llena completamente?

 
Alexey Viktorov:
Además, se puede comprobar la apertura de la posición intentando seleccionarla. Y varios intentos son mejores.

         int n = 0;
          do
           {
            n++;
           }
          while(!PositionSelectByTicket(tradeResult.deal) && n < 5);
Hay tanto retraso como confirmación de que la posición ya está en marcha.

También me he dado cuenta de que no hay ninguna comprobación OrderCheck(Request, checkResult) y esto es malo.

Bueno, tal vez inserteOrderCheck(Request, checkResult)
Gracias

Pero no me gusta especialmente ese bucle

 
prostotrader:

Ah, y también en orden de mercado - precio = 0

Request.price=SymbolInfoDouble(_Symbol,SYMBOL_BID); olvídalo

bool SendOrderSyncMode()
  {
   MqlTradeRequest request={0};
   MqlTradeResult  result={0};
   order_ticket=0;
   request.action = TRADE_ACTION_DEAL;
   request.magic  = 9876543211;
   request.symbol = Symbol();
   request.volume = 1;
   request.price  = 0;
   request.type=ORDER_TYPE_BUY;
   request.comment="Sync mode";
   request.type_filling=ORDER_FILLING_FOK;
   request.type_time=ORDER_TIME_DAY;
   if(OrderSend(request,result))
     {
      if((result.retcode==TRADE_RETCODE_DONE) || (result.retcode==TRADE_RETCODE_PLACED))
        {
         if(result.order>0)
           {
            order_ticket=result.order;
            Print(__FUNCTION__," Order sent in sync mode");
            return(true);
           }
         else
           {
            Print(__FUNCTION__," Error order sent in sync mode! Retcode = ",result.retcode);
           }
        }
      else
        {
         Print(__FUNCTION__," Error order sent in sync mode! Retcode = ",result.retcode);
        }
     }
   else
     {
      Print(__FUNCTION__," Order not sent in sync mode.");
     }
   return(false);
  }
void OnTradeTransaction(const MqlTradeTransaction &trans,
                        const MqlTradeRequest &request,
                        const MqlTradeResult &result)
  {
   switch(trans.type)
     {
      case TRADE_TRANSACTION_HISTORY_ADD:
        if((order_ticket > 0) && (trans.order == order_ticket))
      {
        //Вот здесь и смотрим что произошло
      }
      break;
     }
  }
Muchas gracias por una descripción tan detallada... y por la explicación ....
Y sobre el precio.... sí, más acostumbrado a MT4, y allí siempre hay que poner el precio...
 
Sergey Chalyshev:

Repita

Además, debe comprobar el estado del pedido y si ya ha aparecido en el historial o no.

La bolsa no funciona con posiciones, sólo con órdenes.

¿De verdad?
 
Gennady Mazur:
Tendrías razón si pusiera órdenes pendientes, pero yo trabajo por mercado, y aquí la entrada se obtiene conResults.deal
Aun así, primero se envía la orden y luego se ejecuta.
 
Sergey Chalyshev:

No entiendo qué significa tu sonrisa.

No esperaba oírte decir eso. ¿Qué pausas, o estás bromeando?

Pausa después de OrderSend() para que la información del mercado y el historial puedan ser actualizados.
 
Sergey Chalyshev:

Mala herencia de forex.

...

Deberías tener cuidado con la forma en que lo expresas. De lo contrario, también podríamos hablar de la mutación genética de los adeptos a la FOORTS.
 
Sergey Chalyshev:

¿Y si el puesto ya existía?

¿O es que ya hay una posición pero el pedido no está completo?

Sí. Y yo me dedico a mi cobertura. Reconozco que no he acertado. O totalmente equivocado. :-)