StopLimit - pagina 7

 
Sergey Chalyshev:

A quanto pare nessuno lo usa,

l'ordine viene aperto a prezzi inesistenti:

un semplice esempio da verificare:

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

È corretto? Prima viene il prezzo limite di stop e poi il prezzo di esercizio. Vedere ladocumentazione:

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

Ho modificato un po' il codice del 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();
        }*/
  }
//+------------------------------------------------------------------+

Ecco un esempio sullo strumento forex EURUSD.

Importante:il prezzo stoplimit è impostato peggio. Questo è per l'esecuzione dello scambio.

È stato impostato un limite di acquisto che è stato attivato e aperto come ordine limite.




Potete vedere nello screenshot che ci sono dei prezzi nel commento. Il primo prezzo (1,10258) è il prezzo richiesto quando l'ordine è stato piazzato, il secondo (1,10268) è il prezzo di attivazione della parte limite dell'ordine e il terzo (1,10263) è il prezzo di attivazione della parte stop dell'ordine.

 

La logica è la seguente: se il prezzo di domanda del mercato raggiunge 1,10263, allora la parte di stop dell'ordine (il prezzo di esercizio) viene attivata. E la parte limite dell'ordine dovrebbe scattare immediatamente, poiché il suo prezzo d'esercizio è peggiore del prezzo di mercato (1,10268).

Guardiamo i file di log:

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]

Vediamo che alle00:02:15 l'ordine si è trasformato in un ordine limite (la parte stop è scattata). E si è subito trasformato in una posizione di mercato. E la cosa interessante è che i log non danno un prezzo bid-ask come nella prima riga (1,10239 / 1,10258). E questo è scomodo. Sì, la posizione è aperta a 1,10265. Ci si aspettava che fosse aperto a 1,10263. Qui penso che ci sia stato uno slittamento di 2pts.

Guardando la base delle zecche. Sì, i test erano su zecche reali del 2 dicembre 2019.

Vediamo che c'è il nostro tick (1,10265). Evidenziato nello screenshot. E da00:02:15 questa era la terza spunta. Larichiesta precedente = 1,10271 (dalle00:02:15.428) era ancora più alta. Anche se, allo stesso tempo della nostra zecca. Cioè, è entrato ad un prezzo migliore. Conclusione: come previsto, abbiamo ottenuto uno slittamento di 2 punti per la parte stop dell'ordine.

 
Denis Kirichenko:

È la cosa giusta da fare? Prima viene il prezzo della stoplist e poi lo strike price. Guarda la documentazione:

Questo è fatto intenzionalmente in modo che quando lo stoplimit va al limite, il limite scatta immediatamente. Quando viene attivato, sembra essere da qualche parte là fuori, al prezzo che è specificato nell'ordine e non al prezzo che ha attivato lo stoplimit (che in realtà era).

 
Denis Kirichenko:

La logica è la seguente: se il prezzo di domanda del mercato raggiunge 1,10263, la parte di stop dell'ordine (il prezzo di esercizio) viene attivata. E la parte limite dell'ordine dovrebbe scattare immediatamente, poiché il suo prezzo d'esercizio è peggiore del prezzo di mercato (1,10268).

C'è un prezzo di 123. Il BUY_STOP_LIMIT. Il prezzo di stop è 133. Il prezzo limite è 111.

Se il prezzo ha superato il prezzo di stop, il prezzo limite viene attivato. Se il prezzo torna a 111, la posizione viene aperta.

Se il prezzo non ha superato il prezzo di stop ed è tornato al prezzo limite, la posizione non sarà aperta.

Non è così?

 
Denis Kirichenko:

Un ordine stop limit può essere controllato nel tester anche per il Forex. È sufficiente impostare "Esecuzione" = Scambio.



Ho controllato il limite di acquisto come segue: ho impostato il prezzo dell'ordine limite peggiore del prezzo di attivazione. L'ordine si è aperto al prezzo di mercato (ask price) al momento dell'attivazione. Quindi, sembra che la funzionalità del Tester funzioni.

Sì, su strumenti forex, con esecuzione in borsa, funziona correttamente.

E ora cambia anche "Settlement Method"=FORTS Futures, e vedi come funziona su strumenti negoziati in borsa.

BSL_Forex-FORTS

Se mettete Metodo di calcolo = Forex su uno strumento negoziato in borsa, funziona correttamente, ma il margine non viene contato correttamente.

 
Sergey Chalyshev:

Stai usandoStopLimit nel trading reale?

È chiaro cheStopLimit non funziona adeguatamente nel tester.

Ha senso usarlo nel trading reale? Quali sono i vantaggi e gli svantaggi?

Questo tipo di ordini non ha senso da usare.

È molto più facile piazzare un ordine pendente subito, perché possiamo specificare qualsiasi termine della durata dell'ordine.

Se siamo sulla borsa, piuttosto che sul server MQ, questo ordine è garantito per funzionare al prezzo specificato in esso.

E il server può "glitchare".