StopLimit - Seite 7

 
Sergey Chalyshev:

Offenbar benutzt sie niemand,

der Auftrag wird zu nicht existierenden Preisen eröffnet:

ein einfaches Beispiel zur Überprüfung:

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

Ist dies richtig? Zuerst kommt der Stopplistenpreis und dann der Ausübungspreis. SieheDokumentation:

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

Ich habe den Code des Themenstarters ein wenig geändert.

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

Hier ein Beispiel für das Deviseninstrument EURUSD.

Wichtig:Der Stop-Limit-Preis ist schlechter eingestellt. Dies ist für die Ausführung des Austauschs.

Es wurde ein Kauf-Stopp-Limit festgelegt, das aktiviert und als Limit-Order eröffnet wurde.




Auf dem Screenshot sehen Sie, dass in dem Kommentar Preise angegeben sind. Der erste Kurs (1,10258) ist der Briefkurs, zu dem der Auftrag erteilt wurde, der zweite (1,10268) ist der Aktivierungskurs für den Limit-Teil des Auftrags und der dritte (1,10263) ist der Aktivierungskurs für den Stop-Teil des Auftrags.

 

Die Logik ist wie folgt: Wenn der Briefkurs 1,10263 erreicht, wird der Stop-Teil der Order (der Basispreis) aktiviert. Und der Limit-Teil des Auftrags sollte sofort ausgelöst werden, da sein Ausübungspreis schlechter ist als der Marktpreis (1,10268).

Wir sehen uns die Protokolldateien an:

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]

Wir sehen, dass um00:02:15 der Auftrag in einen Limit-Auftrag umgewandelt wurde (der Stop-Teil wurde ausgelöst). Und es wurde sofort zu einer Marktposition. Interessant ist, dass in den Protokollen keine Geld-Brief-Kurse wie in der ersten Zeile angegeben sind (1,10239 / 1,10258). Und das ist unangenehm. Ja, die Position ist bei 1,10265 eröffnet. Es wurde erwartet, dass er bei 1,10263 eröffnet wird. Ich glaube, hier gab es einen Ausrutscher von 2 Punkten.

Blick auf die Zeckenbasis. Ja, der Test wurde mit echten Zecken vom 2. Dezember 2019 durchgeführt.

Wir sehen, dass es unseren Tick gibt (1,10265). Im Bildschirmfoto hervorgehoben. Und seit00:02:15 war dies der dritte Tick. Die vorherige Nachfrage = 1,10271 (ab00:02:15.428) war sogar noch höher. Obwohl, zur gleichen Zeit wie unsere Zecke. D.h. zu einem besseren Preis eingegeben. Fazit: Wie erwartet, haben wir einen Slippage von 2 Punkten für den Stop-Teil der Order erhalten.

 
Denis Kirichenko:

Ist dies die richtige Entscheidung? Zuerst kommt der Stopplistenpreis und dann der Ausübungspreis. Sehen Sie sich die Dokumentation an:

Dies geschieht absichtlich, damit das Limit sofort ausgelöst wird, wenn das Stoplimit erreicht ist. Wenn es ausgelöst wird, scheint es irgendwo da draußen zu sein, zu dem Preis, der in der Bestellung angegeben ist, und nicht zu dem Preis, der das Stop-Limit aktiviert hat (was tatsächlich der Fall war).

 
Denis Kirichenko:

Die Logik ist wie folgt: Wenn der Briefkurs 1,10263 erreicht, wird der Stop-Teil der Order (der Basispreis) aktiviert. Und der Limit-Teil des Auftrags sollte sofort ausgelöst werden, da sein Ausübungspreis schlechter ist als der Marktpreis (1,10268).

Es gibt einen Preis von 123. Das BUY_STOP_LIMIT. Der Stoppkurs liegt bei 133. Der Grenzpreis beträgt 111.

Wenn der Kurs den Stoppkurs überschritten hat, wird der Limitkurs aktiviert. Wenn der Kurs wieder auf 111 steigt, wird die Position eröffnet.

Wenn der Kurs den Stoppkurs nicht überschritten hat und zum Limitkurs zurückgekehrt ist, wird die Position nicht eröffnet.

Ist es nicht so?

 
Denis Kirichenko:

Eine Stop-Limit-Order kann im Tester auch für Forex überprüft werden. Es genügt, wenn Sie "Ausführung" = Austausch einstellen.



Ich habe das Kauf-Stopp-Limit wie folgt überprüft: Ich habe den Preis der Limit-Order schlechter als den Aktivierungspreis eingestellt. Der Auftrag wurde bei der Aktivierung zum Marktpreis (Briefkurs) eröffnet. Es scheint also, dass die Funktionalität des Testers funktioniert.

Ja, bei Forex-Instrumenten, die an der Börse gehandelt werden, funktioniert das korrekt.

Ändern Sie nun auch "Settlement Method"=FORTS Futures, um zu sehen, wie es bei börsengehandelten Instrumenten funktioniert.

BSL_Forex-FORTS

Wenn Sie bei börsengehandelten Instrumenten die Berechnungsmethode = Forex angeben, funktioniert es korrekt, aber die Marge wird nicht richtig berechnet.

 
Sergey Chalyshev:

Verwenden SieStopLimit im realen Handel?

Es ist klar, dassStopLimit im Testgerätnicht ausreichend funktioniert.

Ist es sinnvoll, sie im realen Handel einzusetzen? Was sind die Vor- und Nachteile?

Die Verwendung dieser Art von Aufträgen ist nicht sinnvoll.

Es ist viel einfacher, einen schwebenden Auftrag sofort zu platzieren, da wir jede beliebige Laufzeit des Auftrags angeben können.

Wenn wir uns an der Börse und nicht auf dem MQ-Server befinden, wird dieser Auftrag garantiert zu dem darin angegebenen Preis ausgeführt.

Und der Server kann "stören".

Grund der Beschwerde: