Сделки открываются позже, чем в терминале появляются котировки

 

Друзья, добрый день! Пишу в этот раздел по совету одного из форумчан.

Прокурил массу документации и почти отчаялся найти истину. Прошу помощи.

Вопросов несколько. Вот первый из них:

Использую CTrade для торговли в MT5, отправляю ордер на покупку, при этом делаю это заранее, по своему авторскому индикатору. Т.е. ордер выставляется в среднем за 30-50 от цены, по которой я планирую покупку.

Я экспериментировал. Выставлял ордер сразу со стоплоссом и тейк-профитом. Насколько мне удалось понять, ровно в тот момент, когда достигается цена, указанная в тейке, в стакан выставляется заявка на продажу.
Я получил следующее:

2018.10.05 14:31:05   position modified [#10 buy 1.00 RTS-12.18 114690 sl: 114700 tp: 115180]

2018.10.05 14:32:42   take profit triggered #10 buy 1.00 RTS-12.18 114690 sl: 114700 tp: 115180 [#11 sell 1.00 RTS-12.18 at 115180]
2018.10.05 14:32:42   deal #9 sell 1.00 RTS-12.18 at 115190 done (based on order #11)
2018.10.05 14:32:42   deal performed [#9 sell 1.00 RTS-12.18 at 115190]
2018.10.05 14:32:42   order performed sell 1.00 at 115190 [#11 sell 1.00 RTS-12.18 at 115180]

Правильно ли я читаю логи? Сделка была совершена по цене 115180 в тот момент, когда цена достигла 115190?

Я пошел дальше, и не стал выставлять тейк-профит у ордера, а вместо тейка использовал еще один ордер на продажу. Насколько я понимаю, в этом случае цена попала сразу в стакан.
В логах я увидел совсем другой результат:

2018.10.05 14:31:05 sell limit 1.00 RTS-12.18 at 115180 (115050 / 115060 / 115050) 
2018.10.05 14:31:05 Метод Sell() выполнен успешно. Код возврата=10009 (done) 
2018.10.05 14:32:42 order [#11 sell limit 1.00 RTS-12.18 at 115180] triggered 
2018.10.05 14:32:42 deal #9 sell 1.00 RTS-12.18 at 115180 done (based on order #11) 
2018.10.05 14:32:42 deal performed [#9 sell 1.00 RTS-12.18 at 115180] 
2018.10.05 14:32:42 order performed sell 1.00 at 115180 [#11 sell limit 1.00 RTS-12.18 at 115180] 

Вот вроде бы видим цену в 115180 в тот момент когда она была 180. Но! Время совершения сделок одинаковое.

Мой первый вопрос, правильно ли я понимаю процесс попадания цены в стакан в первом и втором случае?

А вот главный вопрос состоит в следующем: Я смотрю котировки, и цена в 115180 была гораздо раньше, чем 14:32:42.
Привожу лог тиков из терминала:

Почему так происходит?

Логи выгружены из тестера. Может это тестер как то себя особенно ведет, а на реальных торгах такого не будет?

Буду благодарен за любую помощь по данным вопросам. Спасибо.

Ордер открываю таким образом:

void BuySLTP(double volume, string symbol,double bidprice,double SL,double TP)
{
  datetime TimeOpen2;
  TimeOpen2 = StringToTime(TimeOpen);  
  double point=SymbolInfoDouble(symbol,SYMBOL_POINT);         // пункт
  double bid=SymbolInfoDouble(symbol,SYMBOL_BID);             // текущая цена для закрытия LONG
  int    digits=(int)SymbolInfoInteger(symbol,SYMBOL_DIGITS); // количество знаков после запятой
  double SL1=NormalizeDouble(SL,digits);                              // нормализуем Stop Loss
  double TP1=NormalizeDouble(TP,digits);                              // нормализуем Take Profit
  double open_price=NormalizeDouble(bidprice,digits);

  if (TimeCurrent() < TimeOpen2)
  {
    if(!trade.BuyLimit(volume,NormPrice(open_price),Symbol(),NormPrice(SL1),NormPrice(TP1),ORDER_TIME_DAY,TimeCurrent()+60*60,""))  
    {
      //--- сообщим о неудаче
         Print("Метод Buy() потерпел неудачу. Код возврата=",trade.ResultRetcode(),
               ". Описание кода: ",trade.ResultRetcodeDescription());
     }
     else
     {
         Print("Метод Buy() выполнен успешно. Код возврата=",trade.ResultRetcode(),
               " (",trade.ResultRetcodeDescription(),")");
     }
    }else Print("Сделка не может быть открыта после: "+TimeOpen);
}


Меняю TakeProfit и StopLoss таким:

void ChangeSL(double stoploss,double takeprofit)
  {
        if(!trade.PositionModify(_Symbol, NormPrice(stoploss),NormPrice(takeprofit)))
        {
           Alert("Ошибка изменения позиции:",GetLastError(),"!!");
           return;
        }
  }

NormPrice это функция, которая приводит мою внутреннюю расчетную цену к шагу цены с округлением. На всякий случай, код такой:

double NormPrice(double Price)
{
int point;
double ostatok,ostatok2,newprice;
point=SymbolInfoDouble(Symbol(),SYMBOL_TRADE_TICK_SIZE);
ostatok=MathMod(Price,point);
if (ostatok>=point/2) 
   {
      ostatok2=point;
   }else ostatok2=0;
newprice=Price-ostatok+ostatok2;
return newprice;
}
 

У Открывашеи есть демосервер, попробуйте торговать на нём.

Добавено

Тестер - плохая идея тестировать робота для ФОРТС

 
luckyit2:

Друзья, добрый день! Пишу в этот раздел по совету одного из форумчан.

Прокурил массу документации и почти отчаялся найти истину. Прошу помощи.

Вопросов несколько. Вот первый из них:

Использую CTrade для торговли в MT5, отправляю ордер на покупку, при этом делаю это заранее, по своему авторскому индикатору. Т.е. ордер выставляется в среднем за 30-50 от цены, по которой я планирую покупку.

Я экспериментировал. Выставлял ордер сразу со стоплоссом и тейк-профитом. Насколько мне удалось понять, ровно в тот момент, когда достигается цена, указанная в тейке, в стакан выставляется заявка на продажу.
Я получил следующее:

2018.10.05 14:31:05   position modified [#10 buy 1.00 RTS-12.18 114690 sl: 114700 tp: 115180]

2018.10.05 14:32:42   take profit triggered #10 buy 1.00 RTS-12.18 114690 sl: 114700 tp: 115180 [#11 sell 1.00 RTS-12.18 at 115180]
2018.10.05 14:32:42   deal #9 sell 1.00 RTS-12.18 at 115190 done (based on order #11)
2018.10.05 14:32:42   deal performed [#9 sell 1.00 RTS-12.18 at 115190]
2018.10.05 14:32:42   order performed sell 1.00 at 115190 [#11 sell 1.00 RTS-12.18 at 115180]

Правильно ли я читаю логи? Сделка была совершена по цене 115180 в тот момент, когда цена достигла 115190?

Я пошел дальше, и не стал выставлять тейк-профит у ордера, а вместо тейка использовал еще один ордер на продажу. Насколько я понимаю, в этом случае цена попала сразу в стакан.
В логах я увидел совсем другой результат:

2018.10.05 14:31:05 sell limit 1.00 RTS-12.18 at 115180 (115050 / 115060 / 115050) 
2018.10.05 14:31:05 Метод Sell() выполнен успешно. Код возврата=10009 (done) 
2018.10.05 14:32:42 order [#11 sell limit 1.00 RTS-12.18 at 115180] triggered 
2018.10.05 14:32:42 deal #9 sell 1.00 RTS-12.18 at 115180 done (based on order #11) 
2018.10.05 14:32:42 deal performed [#9 sell 1.00 RTS-12.18 at 115180] 
2018.10.05 14:32:42 order performed sell 1.00 at 115180 [#11 sell limit 1.00 RTS-12.18 at 115180] 

Вот вроде бы видим цену в 115180 в тот момент когда она была 180. Но! Время совершения сделок одинаковое.

Мой первый вопрос, правильно ли я понимаю процесс попадания цены в стакан в первом и втором случае?

А вот главный вопрос состоит в следующем: Я смотрю котировки, и цена в 115180 была гораздо раньше, чем 14:32:42.
Привожу лог тиков из терминала:

Почему так происходит?

Логи выгружены из тестера. Может это тестер как то себя особенно ведет, а на реальных торгах такого не будет?

Буду благодарен за любую помощь по данным вопросам. Спасибо.

Ордер открываю таким образом:


Меняю TakeProfit и StopLoss таким:

NormPrice это функция, которая приводит мою внутреннюю расчетную цену к шагу цены с округлением. На всякий случай, код такой:

Переведу на человеческий.

2018.10.05 14:32:42   take profit triggered #10 buy 1.00 RTS-12.18 114690 sl: 114700 tp: 115180 [#11 sell 1.00 RTS-12.18 at 115180] - сработал отложенный sell limit ордер (tp именно им и является, sl - соответственно stop ордер), установленный на 115180

2018.10.05 14:32:42   deal #9 sell 1.00 RTS-12.18 at 115190 done (based on order #11) - результатом активации ордера стала сделка по цене, ВНИМАНИЕ, 115190, именно эта цена активировала tp, то есть цена bid была, например 115170, а следующим тиком стала 115190, то есть уровень 115180 просто был перепрыгнут.

Дальше два сообщения об успешном выполнении сделки и ордера.

Так что никакой ошибки нет, все правильно - это рынок.

 
Еще момент. Бары (свечи) на фьючерсах и фондах строятся по цене Last, а активация ордера идет по ценам ask/bid, поэтому зачастую возникает путаница.
 
prostotrader:

У Открывашеи есть демосервер, попробуйте торговать на нём.

Добавено

Тестер - плохая идея тестировать робота для ФОРТС

А что было бы хорошей идеей для ФОРТС? Как правильно?

 
JRandomTrader:

А что было бы хорошей идеей для ФОРТС? Как правильно?

luckyit2:

А вот главный вопрос состоит в следующем: Я смотрю котировки, и цена в 115180 была гораздо раньше, чем 14:32:42.

Привожу лог тиков из терминала:

Почему так происходит?

Логи выгружены из тестера. Может это тестер как то себя особенно ведет, а на реальных торгах такого не будет?

Тестер пишет время брокера и реальные котировки по времени брокера, а логи пишутся по времени терминала (компьютера).

Вы проверяли на сколько разница время брокера и вашего терминала?

Была такая тема здесь.

Короче, время биржи не совпадает с временем брокера (сервера), а время вашего компьютера (терминала) не совпадает ни с временем брокера ни с временем терминала.
 
JRandomTrader:

А что было бы хорошей идеей для ФОРТС? Как правильно?

Есть Демо сервера (Открывашка, БКС и MQ)

Лично я, тестирую на реале, пишу индикатор с эмуляцией сделок.

Добавлено

А потом тестирую на демо

 
prostotrader:

Есть Демо сервера (Открывашка, БКС и MQ)

Лично я, тестирую на реале, пишу индикатор с эмуляцией сделок.

Добавлено

А потом тестирую на демо

У меня сейчас висит 3-4 тысячи советников с разными алгоритмами/параметрами на реале, но с эмуляцией сделок (плюс ещё десяток - реально торгуют).

Это долгое тестирование, и это второй этап.

А вот отобрать алгоритмы, которые в принципе пригодны ко второму этапу, проверить идеи - это как раз прогнать в тестере на всей доступной истории.

 
JRandomTrader:

У меня сейчас висит 3-4 тысячи советников с разными алгоритмами/параметрами на реале, но с эмуляцией сделок (плюс ещё десяток - реально торгуют).

Это долгое тестирование, и это второй этап.

А вот отобрать алгоритмы, которые в принципе пригодны ко второму этапу, проверить идеи - это как раз прогнать в тестере на всей доступной истории.

У Вас совершенно не правильный подход торговли на ФОРТС!

Нельзя применять ФОРЕКС идеи.

На ФОРЕКС всё просто - тренд вверх или в низ.

На ФОРТС ценообразование фьючерсов зависит от нескольких факторов, которые обязательно нужно

учитывать. А именно, процентные ставки Центробанков, выплаты дивидентов, цены на акции и дни экспирации.

Т.к выплата дивидентов и процентные ставки изменяются не предсказуемо, следовательно

тестирование на истории - простая трата времени :)

Добавлено

У меня в двух терминалах - 82 советника, что бы установить их, я трачу 15-20 мин (с настройками).

Не сильно ли приврали на счёт 3-4 тысячи? :)

 
prostotrader:

У Вас совершенно не правильный подход торговли на ФОРТС!

Нельзя применять ФОРЕКС идеи.

На ФОРЕКС всё просто - тренд вверх или в низ.

На ФОРТС ценообразование фьючерсов зависит от нескольких факторов, которые обязательно нужно

учитывать. А именно, процентные ставки Центробанков, выплаты дивидендов, цены на акции и дни экспирации.

Т.к выплата дивидентов и процентные ставки изменяются не предсказуемо, следовательно

тестирование на истории - простая трата времени :)

Размер дивидендов обычно устанавливается собранием акционеров, которое обычно происходит в мае. 

Да, и я не торгую на ФОРТС

 
prostotrader:

У Вас совершенно не правильный подход торговли на ФОРТС!

Нельзя применять ФОРЕКС идеи.

На ФОРЕКС всё просто - тренд вверх или в низ.

На ФОРТС ценообразование фьючерсов зависит от нескольких факторов, которые обязательно нужно

учитывать. А именно, процентные ставки Центробанков, выплаты дивидентов, цены на акции и дни экспирации.

Т.к выплата дивидентов и процентные ставки изменяются не предсказуемо, следовательно

тестирование на истории - простая трата времени :)

Добавлено

У меня в двух терминалах - 82 советника, что бы установить их, я трачу 15-20 мин (с настройками).

Не сильно ли приврали на счёт 3-4 тысячи? :)

Я торгую Ri и Si - тут стратегии трендовые или контртрендовые, а также Сбер и палладий - но тут всё по-другому.

Собственно, окон с запущенными советниками ~30. Но я считаю советником отдельный экземпляр класса, со своими вшитыми параметрами, своим учётом позиции, своим трейлингом, своим файлом состояния и своим логом (а вот индикаторы у них могут быть общие). Таких максимально гонял более 7 тыс. одновременно, в течение целого года.

Только при переходе на новый фьюч приходится повозиться, автопереход в новой, ещё не дописанной, версии планируется.
Причина обращения: