StopLimit - página 7

 
Sergey Chalyshev:

Aparentemente nadie lo usa,

el pedido se abre a precios inexistentes:

un ejemplo sencillo para comprobarlo:

//+------------------------------------------------------------------+
//|                                               StopLimit_Test.mq5 |
//+------------------------------------------------------------------+
#include <Trade\Trade.mqh>
CTrade trade;

input int Deviation = 100;
//+------------------------------------------------------------------+
void OnTick()
  {
   MqlTick tick;
   SymbolInfoTick(_Symbol,tick);
   trade.SetTypeFilling(ORDER_FILLING_RETURN);
   double ticksise=SymbolInfoDouble(_Symbol,SYMBOL_TRADE_TICK_SIZE);

   if(OrdersTotal()==0)
      trade.OrderOpen(
         _Symbol,                      // символ
         ORDER_TYPE_BUY_STOP_LIMIT,    // тип ордера
         1.0,                          // объем ордера
         tick.ask+Deviation*ticksise,  // цена исполнения
         tick.ask+10*ticksise,         // цена стоплимита
         0,                            // цена stop loss
         0                             // цена take profit
      );
  }
//+------------------------------------------------------------------+

¿Es esto correcto? Primero viene el precio límite de parada, y luego el precio de ejercicio. Véase ladocumentación:

bool  OrderOpen(
   const string          symbol,          // символ
   ENUM_ORDER_TYPE       order_type,      // тип ордера
   double                volume,          // объем ордера
   double                limit_price,     // цена стоплимита
   double                price,           // цена исполнения
   double                sl,              // цена stop loss
   double                tp,              // цена take profit
   ENUM_ORDER_TYPE_TIME  type_time,       // тип по истечению
   datetime              expiration,      // истечение
   const string          comment=""       // комментарий
   )
 

Modificado el código del topicstarter un poco.

//+------------------------------------------------------------------+
//|                                               StopLimit_Test.mq5 |
//+------------------------------------------------------------------+
#include <Trade\Trade.mqh>
CTrade trade;

input int Deviation = 5;
//+------------------------------------------------------------------+
void OnTick()
  {
   MqlTick tick;
   SymbolInfoTick(_Symbol,tick);
   trade.SetTypeFilling(ORDER_FILLING_RETURN);
   double ticksise=SymbolInfoDouble(_Symbol,SYMBOL_TRADE_TICK_SIZE);
   if(OrdersTotal()==0)
     {
      ENUM_ORDER_TYPE ord_type=ORDER_TYPE_BUY_STOP_LIMIT;
      double ord_vol=0.1;
      double ask_pr=NormalizeDouble(tick.ask,_Digits);
      double ord_pr=NormalizeDouble(tick.ask+Deviation*ticksise,_Digits);
      double limit_pr=NormalizeDouble(tick.ask+10*ticksise,_Digits);
      string ord_comment=StringFormat("%0."+IntegerToString(_Digits)+"f;%0."+
                                      IntegerToString(_Digits)+"f;%0."+
                                      IntegerToString(_Digits)+"f",ask_pr,limit_pr,ord_pr);
      trade.OrderOpen(
         _Symbol,                     // символ
         ord_type,                    // тип ордера
         ord_vol,                     // объем ордера
         limit_pr,                    // цена стоплимита
         ord_pr,                      // цена исполнения
         0.,                          // цена stop loss
         0.,                          // цена take profit
         0,                           // тип по истечению
         0,                           // истечение
         ord_comment                  // комментарий
      );
     }
  }
//+------------------------------------------------------------------+
//| TradeTransaction function                                        |
//+------------------------------------------------------------------+
void OnTradeTransaction(const MqlTradeTransaction& trans,
                        const MqlTradeRequest& request,
                        const MqlTradeResult& result)
  {
   PrintFormat(" %s",EnumToString(trans.type));
//---
   /*if(trans.type==TRADE_TRANSACTION_DEAL_ADD)
     {
      DebugBreak();
     }
   else
      if(trans.type==TRADE_TRANSACTION_ORDER_UPDATE)
        {
         ENUM_ORDER_TYPE curr_ord_type=trans.order_type;
         if(curr_ord_type!=ORDER_TYPE_BUY_STOP_LIMIT)
            DebugBreak();
        }*/
  }
//+------------------------------------------------------------------+

Este es un ejemplo en el instrumento de divisas EURUSD.

Importante:El precio del stoplimit se fija peor. Esto es para la ejecución del intercambio.

Se estableció un límite de compra que se activó y se abrió como una orden limitada.




Puedes ver en la captura de pantalla que hay precios en el comentario. El primer precio (1,10258) es el precio de venta cuando se colocó la orden, el segundo (1,10268) es el precio de activación de la parte de límite de la orden y el tercero (1,10263) es el precio de activación de la parte de stop de la orden.

 

La lógica es la siguiente: si el precio de venta del mercado alcanza 1,10263, entonces se activa la parte de la orden de stop (el precio de ejercicio). Y la parte limitada de la orden debería activarse inmediatamente, ya que su precio de ejercicio es peor que el precio de mercado (1,10268).

Miramos los archivos de registro:

2019.12.12 21:08:10.306 2019.12.02 00:00:11   buy stop limit 0.10 EURUSD at 1.10263 (1.10268) (1.10239 / 1.10258)
2019.12.12 21:08:10.310 2019.12.02 00:00:11   CTrade::OrderSend: buy stop limit 0.10 EURUSD at 1.10263 (1.10268) [done]
2019.12.12 21:08:10.310 2019.12.02 00:00:11    TRADE_TRANSACTION_ORDER_ADD
2019.12.12 21:08:10.310 2019.12.02 00:00:11    TRADE_TRANSACTION_REQUEST
2019.12.12 21:08:10.312 2019.12.02 00:02:15   order [#2  buy stop limit 0.10 EURUSD at 1.10263 (1.10268)] triggered
2019.12.12 21:08:10.312 2019.12.02 00:02:15    TRADE_TRANSACTION_ORDER_UPDATE
2019.12.12 21:09:18.333 2019.12.02 00:02:15   order [#2  buy limit 0.10 EURUSD at 1.10268] triggered
2019.12.12 21:09:18.333 2019.12.02 00:02:15   deal #2  buy 0.10 EURUSD at 1.10265 done (based on order #2)
2019.12.12 21:09:18.333 2019.12.02 00:02:15   deal performed [#2  buy 0.10 EURUSD at 1.10265]
2019.12.12 21:09:18.333 2019.12.02 00:02:15   order performed buy 0.10 at 1.10265 [#2  buy limit 0.10 EURUSD at 1.10268]

Vemos que alas 00:02:15 la orden se ha convertido en una orden limitada (la parte del stop se ha activado). Y se convirtió inmediatamente en una posición de mercado. Y lo interesante es que los registros no dan los precios de compra y venta como en la primera línea (1,10239 / 1,10258). Y eso es un inconveniente. Sí, la posición está abierta a 1,10265. Seesperaba que se abriera a 1,10263. Aquí creo que hubo un deslizamiento de 2 puntos.

Mirando la base de las garrapatas. Sí, las pruebas fueron con garrapatas reales del 2 de diciembre de 2019.

Vemos que está nuestro tick (1,10265). Resaltado en la captura de pantalla. Y desdelas 00:02: 15este era el tercer tick. El pedido anterior = 1,10271 (desde las00:02:15,428) era aún mayor. Aunque, al mismo tiempo que nuestra garrapata. Es decir, entró a un mejor precio. Conclusión: Como era de esperar, obtuvimos un deslizamiento de 2 puntos para la parte de la orden de stop.

 
Denis Kirichenko:

¿Es esto lo correcto? Primero viene el precio de la lista de precios máximos y luego el precio de ejercicio. Mira la documentación:

Esto se hace intencionadamente para que cuando el stoplimit llegue al límite, el límite se active inmediatamente. Cuando se activa, parece que está en algún lugar, en el precio que se especifica en la orden y no en el precio que activó el stoplimit (que realmente lo era).

 
Denis Kirichenko:

La lógica es la siguiente: si el precio de venta del mercado alcanza 1,10263, se activa la parte de la orden que se llama stop (el precio de ejercicio). Y la parte limitada de la orden debería activarse inmediatamente, ya que su precio de ejercicio es peor que el precio de mercado (1,10268).

Hay un precio de 123. El BUY_STOP_LIMIT. El precio de parada es 133. El precio límite es 111.

Si el precio ha superado el precio de parada, se activa el precio límite. Si el precio vuelve a 111, se abre la posición.

Si el precio no ha superado el precio de parada y ha vuelto al precio límite, la posición no se abrirá.

¿No es así?

 
Denis Kirichenko:

También se puede comprobar una orden de límite de parada en el probador para Forex. Es suficiente con establecer "Ejecución" = Intercambio.



He comprobado el límite de compra de la siguiente manera: he puesto el precio de la orden limitada peor que el precio de activación. La orden se abrió a precio de mercado (precio de venta) al activarse. Por lo tanto, parece que la funcionalidad en el Probador funciona.

Sí, en los instrumentos de divisas, con la ejecución de la bolsa, funciona correctamente.

Y ahora cambie también el "Método de liquidación"=Futuros de la bolsa, y vea cómo funciona en los instrumentos negociados en la bolsa.

BSL_Forex-FORTS

Si se pone Método de cálculo = Forex en el instrumento negociado en bolsa, funciona correctamente, pero el margen no se cuenta correctamente.

 
Sergey Chalyshev:

¿UtilizaStopLimit en el comercio real?

Está claro queStopLimit no funciona adecuadamente en el probador.

¿Tiene sentido utilizarlo en el comercio real? ¿Cuáles son las ventajas y los inconvenientes?

No tiene sentido utilizar este tipo de órdenes.

Es mucho más fácil colocar una orden pendiente de inmediato, porque podemos especificar cualquier término de la vida de la orden.

Si estamos en la bolsa, pero no en el servidor MQ, se garantiza que esta orden funcione al precio especificado en ella.

Y el servidor puede "fallar".