StopLimit - страница 7

 
Sergey Chalyshev:

Видимо никто не использует,

ордер открывается по несуществующим ценам:

простенький пример для проверки:

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

А разве это правильно? Сначала идёт цена стоплимита, а потом цена исполнения. Смотрим в Документацию:

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

Немного модифицировал код топикстартера.

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

Привожу пример на форексном инструменте EURUSD.

Важно: цена стоплимита задана хуже. Это для биржевого исполнения.

Был выставлен buy stop limit, который активировался и был открыт как лимитный ордер.




На скриншоте видно, что в комментарии указаны цены. Первая цена (1,10258) - это ask при выставлении ордера, вторая (1,10268) - это цена активации лимитной части ордера, а третья  (1,10263) - цена активации стоповой части ордера.

 

Логика такая: если рыночная цена ask достигнет 1,10263, то активируется стоповая часть ордера (цена исполнения). И по идее должна сразу сработать лимитная часть ордера, т.к. её цена исполнения хуже рыночной (1,10268).

Смотрим логи:

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]

Видим, что в 00:02:15 ордер превратился в лимитный (сработала стоповая часть). И сразу же он превратился в рыночную позицию. И что интересно, что логи не дают цены бид-аск, как в первой строчке (1,10239 / 1,10258). И это неудобно. Да, позиция открыта по цене 1,10265. Ожидалось, что будет открыта по 1,10263. Тут, думаю, что было проскальзывание размером в 2 пп. 

Смотрим тиковую базу. Да, тестирование было на реальных тиках со 2 декабря 2019 г.

Видим, что есть наш тик (1,10265). Выделил его на скриншоте. Причём с 00:02:15 это был третий тик. Предыдущий ask = 1.10271 (от 00:02:15.428) был даже выше. Хотя и одновременно с нашим тиком. Т.е. зашли по лучшей цене. Вывод: как и предполагал, получили проскальзывание размером в 2 пп для стоповой части ордера.    

 
Denis Kirichenko:

А разве это правильно? Сначала идёт цена стоплимита, а потом цена исполнения. Смотрим в Документацию:

Это специально сделано, чтобы при переходе стоплимита в лимит, лимит сразу срабатывал. При срабатывания он оказывается где-то там далеко, на цене, указанной в заявке, а не на той, которая активировала стоплимит (которая реально была).

 
Denis Kirichenko:

Логика такая: если рыночная цена ask достигнет 1,10263, то активируется стоповая часть ордера (цена исполнения). И по идее должна сразу сработать лимитная часть ордера, т.к. её цена исполнения хуже рыночной (1,10268).

Есть цена 123. BUY_STOP_LIMIT. Стоповая цена 133. Лимитная цена 111.

Если цена прошла стоповую отметку, активируется лимитная. Если цена вернётся к 111 будет открыта позиция.

Если цена не дошла до стоповой и вернулась к лимитной - позиция открыта не будет.

Разве не так?

 
Denis Kirichenko:

Стоп-лимитный ордер можно проверить в Тестере и для Форекса. Достаточно задать "Исполнение"= Биржевое.



Проверил buy stop limit так: выставил цену лимитного ордера хуже цены активации. Ордер при активации открылся по рынку (цена аск). Так что, кажется, функционал в Тестере работает.

Да, на форексных инструментах, при биржевом исполнении, правильно работает.

А теперь еще поменяйте "Способ расчетов"=FORTS Futures, и увидите как срабатывает на биржевых инструментах.

BSL_Forex-FORTS

Если на биржевом инструменте поставить Способ расчетов = Forex, то срабатывает правильно но маржа считается не правильно.

 
Sergey Chalyshev:

Используете StopLimit в реальной торговле?

Понятно что в тестере StopLimit работает неадекватно.

В реальной торговле есть ли смысл использовать? Какие преимущества и недостатки?

Не вижу смысла использовать этот тип ордеров.

Гораздо проще сразу выставить отложенный ордер, ведь можно указать любой срок жизни ордера.

Находясь на бирже, а не на сервере MQ, этот ордер гарантированно сработает по указанной в нем цене.

А сервак может и "глюкнуть"

Причина обращения: