Как тестируете стратегии для биржи?

Сегодня решил протестировать одну из стратегий на бирже, через единственного брокера имеющего МТ5 - F...am.

Скачал тики для GAZP. Но не понял ситуацию с ними.


Вот распечатка тиков за начало одного из дней:



Вопросы к опытным биржевым трейдерам:

1) С 06:50 до 07:00 идут тики, которые дают гэп размером выстой в несколько дневных баров. Вот 3 дня с этими гэпами в тиках:

Это - сбор стопов, тех кто оставил позиции на ночь? И нужно либо убирать стопы или делать их намного больше.

По спецификации торговая сессия с 00:00, но судя по появления тиков с объемами - начало в 10:00. 

Но с 2025.01.27 сессии начинаются с 07:00.

2025.01.24 10:00:00   New bar/day (PERIOD_D1). PrevHigh=138.0 PrevLow=135.55
2025.01.27 07:00:00   New bar/day (PERIOD_D1). PrevHigh=139.31 PrevLow=137.07

2) Зачем они вообще добавляются в тиковую историю? Только мешают, ведь OnTick(){...} их получит. Надо как-то их отбросить.

3) Для тестирования по реальным тикам надо вырезать тики до 10:00 и до 7:00 с 2025.01.27. Универсальное правило с датами для вырезания этих тиков не стоит делать, так как есть подключения к разным биржам и где-то часы начала торговли другие. 
Пока вижу вариант - отбрасывать тики с начала дня до первого тика с объёмами. Кто то так делал? Будет работать универсально для любых инструментов, бирж и форекса?

Проверил XAUUSD - там объемов вообще нет весь день. Т.е. надо как то по другому фильтровать.

Я не спец (я только учусь ;-), но вероятно это эффект режима премаркет, когда заявки выставлять можно, а сделки запрещены. Спред расширяется. Полагаю, что некоторым стратегиям это может быть важно - например, некоторые торгуют по стакану. Отфильтровать можно по тому, что тики находятся за пределами баров и по флагам тиков. Например, у меня в одном продукте делалась проверка:

        if(t.bid == 0 && t.ask == 0
        && ((t.flags & TICK_FLAG_BID) != 0)
        && ((t.flags & TICK_FLAG_ASK) != 0))

Если эта проверка прошла, я называл такие тики управляющими (т.к. флаги противоречат полям). Если символ был биржевой и last = 0, то пропускаем такой тик. Но это могла быть специфика конкретного брокера.

Aleksei Kuznetsov:


Линии high/low для bid/ask это сделки вне основной сессии. Это не сбор стопов, это исполнение заявок на премаркете.
На премаркете перед открытием, биржа сводит заявки некоторых участников, поэтому происходят скачки лучших bid/ask.
Stanislav Korotky #:

Я не спец (я только учусь ;-), но вероятно это эффект режима премаркет, когда заявки выставлять можно, а сделки запрещены. Спред расширяется. Полагаю, что некоторым стратегиям это может быть важно - например, некоторые торгуют по стакану. Отфильтровать можно по тому, что тики находятся за пределами баров и по флагам тиков. Например, у меня в одном продукте делалась проверка:

Если эта проверка прошла, я называл такие тики управляющими (т.к. флаги противоречат полям). Если символ был биржевой и last = 0, то пропускаем такой тик. Но это могла быть специфика конкретного брокера.

В моей ситуации с флагами не вижу проблем. Все тики, начиная с нижнего и до 7:00 - только ask и bid и флаги к ним правильные

Для автоматизации, пока что вижу вариант с добавлением проверки режима исполнения 

ENUM_SYMBOL_TRADE_EXECUTION

и если биржевое - то пропускать все тики до первого с объемом.

Если у кого-то есть варианты получше - буду рад узнать.

Документация по MQL5: Информация об инструменте / Константы, перечисления и структуры
Документация по MQL5: Информация об инструменте / Константы, перечисления и структуры
  • www.mql5.com
Для получения текущей рыночной информации служат функции SymbolInfoInteger() , SymbolInfoDouble() и SymbolInfoString() . В качестве второго...
Roman #:
Лучший bid/ask это не сделки. Это не сбор стопов, это исполнение заявок на премаркете.
На премаркете перед открытием, биржа сводит заявки, поэтому стакан пустеет.
Неужели там кто-то покупает или продает по цене выше последней на несколько дневных баров? Масштаб видно выше на скриншоте.
Aleksei Kuznetsov #:
Неужели там кто-то покупает или продает по цене выше последней на несколько дневных баров? Масштаб видно выше на скриншоте.
Это не те сделки которые приняты в понимании. Они могут быть по разным причинам. Например адресные заявки.
Надо анализировать вместе с лентой принтов, если цель понять сделка это или нет.
Roman #:
Это не те сделки которые принято в понимании. Они могут быть по разным причинам. Например адресные заявки. 
Что это - более менее понятно. Осталось найти лучший способ пропистить их в OnTick(), а не пытаться торговать, или как я считать первый тик ценой открытия и искать начиная с них High и Low (сейчас они зашкаливают).
Aleksei Kuznetsov #:
Что это - более менее понятно. Осталось найти лучший способ пропистить их в OnTick(), а не пытаться торговать, или как я считать первый тик ценой открытия.
Просто любой тик нельзя считать ценой открытия, из-за премаркета.
Сравнивай время тика на премаркете и начало сессии.
Roman #:
Просто любой тик нельзя считать ценой открытия, из-за премаркета.
Сравнивай время тика на премаркете и начало сессии.
По спецификации начало торговой сессии в 00:00, прикладывал скриншот выше:

К тому же в первом посте описал, что оно менялось: сначала было с 10, а с 2025 стало с 7. 
Так что даже если спецификация показывала бы с 7:00, а не с 00:00, то все равно имели бы ошибку для дат до 2025, там премаркет тики с 9:50 попали бы в торговые. Так что спецификация уже никак не поможет в этом вопросе.
Aleksei Kuznetsov #:

К тому же в первом посте описал, что оно менялось: сначала было с 10, а с 2025 стало с 7. 

режим торгов биржи изменился. Так и было.

Сделал такую проверку в OnTick:

bool isEXECUTION_EXCHANGE;
void OnInit(){
  isEXECUTION_EXCHANGE=SymbolInfoInteger(_Symbol,SYMBOL_TRADE_EXEMODE)==SYMBOL_TRADE_EXECUTION_EXCHANGE;
  Print("OnInit() - start or restart. EXECUTION EXCHANGE: ",isEXECUTION_EXCHANGE);
}
void OnTick(){
  static MqlTick Tick; static bool FirstTradeTick=false,printed_today=false; static datetime endDay=0;
  if (!SymbolInfoTick(_Symbol, Tick)){ return;}
  if(isEXECUTION_EXCHANGE){
    if(Tick.time > endDay){//начало нового дня
      FirstTradeTick=false;
      endDay=(( Tick.time / 86400)+1)*86400-1; //последняя секунда текущего дня
      Print("New day: ",Tick.time);printed_today=false;
    }
    if(!FirstTradeTick && Tick.volume==0){return;}
    FirstTradeTick=true;
    if(!printed_today){Print("First trade tick: ",Tick.time);printed_today=true;}
  }
//...
}

Похоже что работает как и хотел. Вот печать начала дней и начала первого торгового тика с объемом:

2025.01.15 09:50:00   New day: 2025.01.15 09:50:00
2025.01.15 10:00:00   First trade tick: 2025.01.15 10:00:00
2025.01.16 09:50:00   New day: 2025.01.16 09:50:00
2025.01.16 10:00:00   First trade tick: 2025.01.16 10:00:00
2025.01.17 09:50:00   New day: 2025.01.17 09:50:00
2025.01.17 10:00:00   First trade tick: 2025.01.17 10:00:00
2025.01.20 09:50:00   New day: 2025.01.20 09:50:00
2025.01.20 10:00:00   First trade tick: 2025.01.20 10:00:00
2025.01.21 09:50:00   New day: 2025.01.21 09:50:00
2025.01.21 10:00:00   First trade tick: 2025.01.21 10:00:00
2025.01.22 09:50:00   New day: 2025.01.22 09:50:00
2025.01.22 10:00:00   First trade tick: 2025.01.22 10:00:00
2025.01.23 09:50:00   New day: 2025.01.23 09:50:00
2025.01.23 10:00:00   First trade tick: 2025.01.23 10:00:00
2025.01.24 09:50:00   New day: 2025.01.24 09:50:00
2025.01.24 10:00:00   First trade tick: 2025.01.24 10:00:00

2025.01.27 06:50:00   New day: 2025.01.27 06:50:00             - первый день торгов с 07:00
2025.01.27 07:00:00   First trade tick: 2025.01.27 07:00:00

2025.01.28 06:50:00   New day: 2025.01.28 06:50:00
2025.01.28 07:00:00   First trade tick: 2025.01.28 07:00:00
2025.01.29 06:50:00   New day: 2025.01.29 06:50:00
2025.01.29 07:00:00   First trade tick: 2025.01.29 07:00:00
2025.01.30 06:50:00   New day: 2025.01.30 06:50:00
2025.01.30 07:00:00   First trade tick: 2025.01.30 07:00:00
2025.01.31 06:50:00   New day: 2025.01.31 06:50:00
2025.01.31 07:00:00   First trade tick: 2025.01.31 07:00:00
2025.02.03 06:50:00   New day: 2025.02.03 06:50:00
2025.02.03 07:00:00   First trade tick: 2025.02.03 07:00:00
2025.02.04 06:50:00   New day: 2025.02.04 06:50:00
2025.02.04 07:00:00   First trade tick: 2025.02.04 07:00:00
2025.02.05 06:50:00   New day: 2025.02.05 06:50:00
2025.02.05 07:00:00   First trade tick: 2025.02.05 07:00:00
2025.02.06 06:50:00   New day: 2025.02.06 06:50:00
2025.02.06 07:00:00   First trade tick: 2025.02.06 07:00:00
2025.02.07 06:50:00   New day: 2025.02.07 06:50:00
2025.02.07 07:00:00   First trade tick: 2025.02.07 07:00:00
2025.02.10 06:50:00   New day: 2025.02.10 06:50:00
2025.02.10 07:00:00   First trade tick: 2025.02.10 07:00:00
2025.02.11 06:50:00   New day: 2025.02.11 06:50:00
2025.02.11 07:00:00   First trade tick: 2025.02.11 07:00:00
2025.02.12 06:50:00   New day: 2025.02.12 06:50:00
2025.02.12 07:00:00   First trade tick: 2025.02.12 07:00:00
2025.02.13 06:50:00   New day: 2025.02.13 06:50:00
2025.02.13 07:00:00   First trade tick: 2025.02.13 07:00:00
2025.02.14 07:00:00   New day: 2025.02.14 07:00:00
2025.02.14 07:00:00   First trade tick: 2025.02.14 07:00:00
2025.02.17 06:50:00   New day: 2025.02.17 06:50:00
2025.02.17 07:00:00   First trade tick: 2025.02.17 07:00:00
2025.02.18 06:50:00   New day: 2025.02.18 06:50:00
2025.02.18 07:00:00   First trade tick: 2025.02.18 07:00:00
2025.02.19 06:50:00   New day: 2025.02.19 06:50:00
2025.02.19 07:00:00   First trade tick: 2025.02.19 07:00:00
2025.02.20 06:50:00   New day: 2025.02.20 06:50:00
2025.02.20 07:00:00   First trade tick: 2025.02.20 07:00:00
2025.02.21 06:50:00   New day: 2025.02.21 06:50:00
2025.02.21 07:00:00   First trade tick: 2025.02.21 07:00:00
2025.02.24 06:50:00   New day: 2025.02.24 06:50:00
2025.02.24 07:00:00   First trade tick: 2025.02.24 07:00:00
2025.02.25 06:50:00   New day: 2025.02.25 06:50:00
2025.02.25 07:00:00   First trade tick: 2025.02.25 07:00:00
2025.02.26 06:50:00   New day: 2025.02.26 06:50:00
2025.02.26 07:00:00   First trade tick: 2025.02.26 07:00:00
2025.02.27 06:50:00   New day: 2025.02.27 06:50:00
2025.02.27 07:00:00   First trade tick: 2025.02.27 07:00:00
2025.02.28 06:50:00   New day: 2025.02.28 06:50:00
2025.02.28 07:00:00   First trade tick: 2025.02.28 07:00:00


2025.03.01 14:26:37   New day: 2025.03.01 14:26:37           - начали торговать и по субботам
2025.03.01 14:27:00   First trade tick: 2025.03.01 14:27:00
2025.03.02 09:50:00   New day: 2025.03.02 09:50:00           - и по воскресеньям
2025.03.02 09:59:44   First trade tick: 2025.03.02 09:59:44


2025.03.03 06:50:00   New day: 2025.03.03 06:50:00
2025.03.03 07:00:00   First trade tick: 2025.03.03 07:00:00
2025.03.04 06:50:00   New day: 2025.03.04 06:50:00
2025.03.04 07:00:00   First trade tick: 2025.03.04 07:00:00
2025.03.05 06:50:00   New day: 2025.03.05 06:50:00
2025.03.05 07:00:00   First trade tick: 2025.03.05 07:00:00
2025.03.06 06:50:00   New day: 2025.03.06 06:50:00
2025.03.06 07:00:00   First trade tick: 2025.03.06 07:00:00
2025.03.07 06:50:00   New day: 2025.03.07 06:50:00
2025.03.07 07:00:00   First trade tick: 2025.03.07 07:00:00

пропустили сб и вс

2025.03.10 06:50:00   New day: 2025.03.10 06:50:00
2025.03.10 07:00:00   First trade tick: 2025.03.10 07:00:00
2025.03.11 06:50:00   New day: 2025.03.11 06:50:00
2025.03.11 07:00:00   First trade tick: 2025.03.11 07:00:00
2025.03.12 06:50:00   New day: 2025.03.12 06:50:00
2025.03.12 07:00:00   First trade tick: 2025.03.12 07:00:00
2025.03.13 06:50:00   New day: 2025.03.13 06:50:00
2025.03.13 07:00:00   First trade tick: 2025.03.13 07:00:00
2025.03.14 06:50:00   New day: 2025.03.14 06:50:00
2025.03.14 07:00:00   First trade tick: 2025.03.14 07:00:00


2025.03.15 09:50:00   New day: 2025.03.15 09:50:00              - суббота и воскресенье, снова торгуют
2025.03.15 09:59:33   First trade tick: 2025.03.15 09:59:33
2025.03.16 09:50:00   New day: 2025.03.16 09:50:00
2025.03.16 09:59:33   First trade tick: 2025.03.16 09:59:33


2025.03.17 06:50:00   New day: 2025.03.17 06:50:00
2025.03.17 07:00:00   First trade tick: 2025.03.17 07:00:00
2025.03.18 06:50:00   New day: 2025.03.18 06:50:00
2025.03.18 07:00:00   First trade tick: 2025.03.18 07:00:00
2025.03.19 06:50:00   New day: 2025.03.19 06:50:00
2025.03.19 07:00:00   First trade tick: 2025.03.19 07:00:00

В распечатке видно, что торговля иногда начиналась раньше 10:00 на несколько секунд

В тиках видим такое:

Торговые тики с объемами реально начались до 10:00

Для себя оставляю этот вариант пока-что. Но возможно с какими то инструментами/биржами могут быть проблемы.

Если есть другие решения, более надежные - пишите.