StopLimit - page 7

 
Sergey Chalyshev:

Apparemment, personne ne l'utilise,

l'ordre est ouvert à des prix inexistants :

un exemple simple à vérifier :

//+------------------------------------------------------------------+
//|                                               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
      );
  }
//+------------------------------------------------------------------+

Est-ce correct ? Il y a d'abord le prix de la liste d'arrêt, puis le prix d'exercice. Voir ladocumentation:

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=""       // комментарий
   )
 

Modifié un peu le code du topicstarter.

//+------------------------------------------------------------------+
//|                                               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();
        }*/
  }
//+------------------------------------------------------------------+

Voici un exemple sur l'instrument de change EURUSD.

Important : leprix stoplimit est fixé plus mal. Ceci est pour l'exécution de l'échange.

Une limite d'achat stop a été fixée, qui a été activée et ouverte comme un ordre limite.




Vous pouvez voir dans la capture d'écran qu'il y a des prix dans le commentaire. Le premier prix (1,10258) est le cours vendeur lorsque l'ordre a été placé, le deuxième (1,10268) est le prix d'activation de la partie limite de l'ordre et le troisième (1,10263) est le prix d'activation de la partie stop de l'ordre.

 

La logique est la suivante : si le cours vendeur du marché atteint 1.10263, alors la partie stop de l'ordre (le prix d'exercice) est activée. Et la partie limite de l'ordre devrait se déclencher immédiatement, puisque son prix d'exercice est inférieur au prix du marché (1.10268).

Nous regardons les fichiers journaux :

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]

Nous constatons qu'à00:02:15 l'ordre s'est transformé en un ordre à cours limité (la partie stop s'est déclenchée). Et cela s'est immédiatement transformé en une position sur le marché. Et ce qui est intéressant, c'est que les logs ne donnent pas un prix bid-ask comme dans la première ligne (1.10239 / 1.10258). Et c'est gênant. Oui, la position est ouverte à 1.10265. On s'attendait à ce qu'il soit ouvert à 1.10263. Ici, je pense qu'il y a eu un glissement de 2pts.

En regardant la base de la tique. Oui, les tests ont été effectués sur des ticks réels du 2 décembre 2019.

Nous voyons qu'il y a notre tick (1.10265). Je l'ai mis en évidence dans la capture d'écran. Et depuis00:02:15 c'était le troisième tic. Lademande précédente = 1.10271 (de00:02:15.428) était encore plus élevée. Bien que, en même temps que notre tique. C'est-à-dire qu'il est entré à un meilleur prix. Conclusion : Comme prévu, nous avons obtenu un slippage de 2 points pour la partie stop de l'ordre.

 
Denis Kirichenko:

Est-ce que c' est la bonne chose à faire ? Il y a d'abord le prix de la liste d'arrêt, puis le prix d'exercice. Regardez la documentation:

Cela est fait intentionnellement pour que, lorsque la limite d'arrêt atteint la limite, la limite soit déclenchée immédiatement. Lorsqu'il est déclenché, il semble être quelque part, au prix spécifié dans l'ordre et non au prix qui a activé la limite d'arrêt (qui l'était en réalité).

 
Denis Kirichenko:

La logique est la suivante : si le cours vendeur du marché atteint 1.10263, alors la partie stop de l'ordre (le prix d'exercice) est activée. Et la partie limite de l'ordre devrait se déclencher immédiatement, puisque son prix d'exercice est inférieur au prix du marché (1.10268).

Il y a un prix de 123. La limite d'achat (BUY_STOP_LIMIT). Le prix stop est de 133. Le prix limite est de 111.

Si le prix a dépassé le prix stop, le prix limite est activé. Si le prix revient à 111, la position est ouverte.

Si le prix n'a pas dépassé le prix stop et n'est pas revenu au prix limite, la position ne sera pas ouverte.

Ce n'est pas comme ça ?

 
Denis Kirichenko:

Un ordre stop limite peut être vérifié dans le testeur pour le Forex également. Il suffit de définir "Execution" = Exchange.



J'ai vérifié la limite d'achat comme suit : j'ai fixé le prix de l'ordre limite plus bas que le prix d'activation. L'ordre s'est ouvert au prix du marché (prix demandé) lors de l'activation. Il semble donc que la fonctionnalité du testeur fonctionne.

Oui, sur les instruments forex, avec une exécution en bourse, cela fonctionne correctement.

Et maintenant, changez aussi "Méthode de règlement"=FORTS Futures, et voyez comment cela fonctionne sur les instruments négociés en bourse.

BSL_Forex-FORTS

Si vous mettez Méthode de calcul = Forex sur un instrument négocié en bourse, cela fonctionne correctement, mais la marge n'est pas comptée correctement.

 
Sergey Chalyshev:

Utilisez-vousStopLimit dans vos transactions réelles ?

Il est clair queStopLimit ne fonctionne pas correctement dans le testeur.

Est-il judicieux de l'utiliser dans le cadre de transactions réelles ? Quels sont les avantages et les inconvénients ?

L'utilisation de ce type de commandes n'a pas de sens.

Il est beaucoup plus facile de placer un ordre en attente immédiatement, car nous pouvons spécifier n'importe quelle durée de vie de l'ordre.

Si nous sommes à la bourse, mais pas sur le serveur MQ, cet ordre est garanti pour fonctionner au prix spécifié dans celui-ci.

Et le serveur peut avoir des "pépins".