Сделка по фьючерсу открывается по цене Last, а не по Bid или Ask. Это нормально? - страница 2

 

Roman и  Alexey Viktorov, спасибо за помощь.

После открытия сделки решил просто проверять совпадают ли реальные и расчётные дистанции TP и SL. И если не совпали, совершаю попытку переустановки в функции OnTrade(). В результате дистанции между реальной ценой открытия и ценами TP и SL становятся корректными. Удивляет только то, что на этом инструменте подобные проскальзывания являются нормой. Код срабатывает почти при каждом открытии сделки. 

//+------------------------------------------------------------------+
//|                          OnTrade()                               |
//+------------------------------------------------------------------+
void OnTrade()
  {
   if(HistoryDealSelect(last_trade_ticket))
     {
      // сделка выделилась успешно
      ulong pos_id = HistoryDealGetInteger(last_trade_ticket, DEAL_POSITION_ID);
      // идентификатор позиции сохранён
      if(HistorySelectByPosition(pos_id) && HistoryDealsTotal() == 1)
        {
         // история позиции сформирована
         // позиция состоит из одной сделки
         if(PositionSelectByTicket(pos_id))
           {
            // позиция выделена
            string symbol = PositionGetString(POSITION_SYMBOL);
            double pos_op = PositionGetDouble(POSITION_PRICE_OPEN);
            double pos_tp = NormalizeDouble(PositionGetDouble(POSITION_TP), _Digits);
            double pos_sl = NormalizeDouble(PositionGetDouble(POSITION_SL), _Digits);
            long pos_type = PositionGetInteger(POSITION_TYPE);
            long pos_mag = PositionGetInteger(POSITION_MAGIC);
            // параметры позиции получены
            int tp = int(GlobalVariableGet(global_tp));
            int sl = int(GlobalVariableGet(global_sl));
            double calc_tp_price = 0;
            double calc_sl_price = 0;
            if(pos_type == POSITION_TYPE_BUY)
              {
               // покупка
               // расчёт корректных тп и сл
               if(tp > 0)
                  calc_tp_price = NormalizeDouble(pos_op + tp * _Point, _Digits);
               if(sl > 0)
                  calc_sl_price = NormalizeDouble(pos_op - sl * _Point, _Digits);
              }
            if(pos_type == POSITION_TYPE_SELL)
              {
               // продажа
               // расчёт корректных тп и сл
               if(tp > 0)
                  calc_tp_price = NormalizeDouble(pos_op - tp * _Point, _Digits);
               if(sl > 0)
                  calc_sl_price = NormalizeDouble(pos_op + sl * _Point, _Digits);
              }
            if(pos_tp != calc_tp_price || pos_sl != calc_sl_price)
              {
               // обнаружен факт проскальзывания
               // исправить тейк и стоп
               MqlTradeRequest request;
               MqlTradeResult result;
               ZeroMemory(request);
               ZeroMemory(result);
               request.action = TRADE_ACTION_SLTP;
               request.position = pos_id;
               request.symbol = symbol;
               request.magic = pos_mag;
               request.tp = calc_tp_price;
               request.sl = calc_sl_price;
               if(!OrderSend(request, result) || result.retcode != TRADE_RETCODE_DONE)
                  Print("Ticket:", pos_id, " Error: ", ResultRetcode(result));
              }
           }
        }
     }
   last_trade_ticket = 0;
  }
//+------------------------------------------------------------------+
 
Дельная тема. Спасибо и не удаляйте. Когда я пробовал арбитраж, много вопросов появилось, ответы на которые здесь есть
 
Oleg Remizov:

Roman и  Alexey Viktorov, спасибо за помощь.

После открытия сделки решил просто проверять совпадают ли реальные и расчётные дистанции TP и SL. И если не совпали, совершаю попытку переустановки в функции OnTrade(). В результате дистанции между реальной ценой открытия и ценами TP и SL становятся корректными. Удивляет только то, что на этом инструменте подобные проскальзывания являются нормой. Код срабатывает почти при каждом открытии сделки. 

Попробуйте совершать сделку не по рынку, а лимитной заявкой, но цену в заявке укажите лучшую цену Ask при покупке или лучший Bid при продаже. Заявка должна сразу исполнится по заявленной цене, если конечно за это время Ask или Bid не поменяются. 

 
Vitalii Ananev:

Попробуйте совершать сделку не по рынку, а лимитной заявкой, но цену в заявке укажите лучшую цену Ask при покупке или лучший Bid при продаже. Заявка должна сразу исполнится по заявленной цене, если конечно за это время Ask или Bid не поменяются. 

Лимитники исполняются хорошо. Даже иногда по лучшей цене, чем в заявке. 

 
Oleg Remizov:

.... Даже иногда по лучшей цене, чем в заявке. 

Значит поменялись цены. 

Скажу вам один лайфхак :) Лимитником можно открывать позицию как будто открываешь рыночной заявкой, но при этом регулируешь размер проскальзывания. Форексники привыкли, что лимитные заявки на покупку надо ставить ниже цены Бид. А лимитные на продажу выше цены Аск. На бирже можно поставить лимитную заявку на покупку по цене Аск и выше. При этом она будет сразу исполнена по ближайшей лучшей цене. Например цена Аск в стакане - 5,8,10,20,35. Отправка лимитника на покупку по цене 10 инициирует сделку по цене 5. Если пока ваша заявка идет до биржи цена поменялась и лучшей ценой станет цена 20 то ваша заявка не будет исполнена, но появится в стакане по цене 10. Таким образом мы ограничили размер возможного проскальзывания. 

 
Vitalii Ananev:

Значит поменялись цены. 

Скажу вам один лайфхак :) Лимитником можно открывать позицию как будто открываешь рыночной заявкой, но при этом регулируешь размер проскальзывания. Форексники привыкли, что лимитные заявки на покупку надо ставить ниже цены Бид. А лимитные на продажу выше цены Аск. На бирже можно поставить лимитную заявку на покупку по цене Аск и выше. При этом она будет сразу исполнена по ближайшей лучшей цене. Например цена Аск в стакане - 5,8,10,20,35. Отправка лимитника на покупку по цене 10 инициирует сделку по цене 5. Если пока ваша заявка идет до биржи цена поменялась и лучшей ценой станет цена 20 то ваша заявка не будет исполнена, но появится в стакане по цене 10. Таким образом мы ограничили размер возможного проскальзывания. 

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

А вот лайфак для тех кто работает в Quik. 
В Quik можно открывать разнонаправленные позиции по одному инструменту, в течение дня.
Вот это вот лайфхакище ))
 
Roman:

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

А вот лайфак для тех кто работает в Quik. 
В Quik можно открывать разнонаправленные позиции по одному инструменту, в течение дня.
Вот это вот лайфхакище ))

Так это я так в шутку про лайфхак написал там в конце смайлик стоит. 

А вот про разнонаправленные позиции в квик не знал. Разве биржа позволяет это делать?

 
Vitalii Ananev:

Так это я так в шутку про лайфхак написал там в конце смайлик стоит. 

А вот про разнонаправленные позиции в квик не знал. Разве биржа позволяет это делать?

Не знаю кто позволяет это делать )) Биржа, или сервера квик.
Разнонаправленные позиции можно держать до основного клиринга, на клиринге они закроются, в равном объеме.
То есть если 2 лонг, 1 шорт, то после клиринга останется 1 лонг.
По сути внутри дня, можно вариационно зафиксировать убыток, но не реализовывать его, и если ожидаешь отскок, то сократить убыток. 
А если вообще разворот будет, то и в плюс можно вывести сделку. В общем в умелых руках, инструмент годный.  

 
Roman:

Не знаю кто позволяет это делать )) Биржа, или сервера квик.
Разнонаправленные позиции можно держать до основного клиринга, на клиринге они закроются, в равном объеме.
То есть если 2 лонг, 1 шорт, то после клиринга останется 1 лонг.
По сути внутри дня, можно вариационно зафиксировать убыток, но не реализовывать его, и если ожидаешь отскок, то сократить убыток. 
А если вообще разворот будет, то и в плюс можно вывести сделку. В общем в умелых руках, инструмент годный.  

Понятно. Я внутри дня не торгую, только лонг и на долго.

 
Oleg Remizov:

Спецификация торгового инструмента:

На какой площадке это торгуется?

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