Тестируем 'CopyTicks' - страница 20

 

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

Прошу добавить функцию, которая возвращает индекс в базе по времени. Тогда эту задачу будет возможность решить оптимальней

fxsaber:
Каков оптимальный (быстродействие) алгоритм получения тиков с from_time до to_time?
 

По уважительной причине была удалена тема "Что такое "тик"?". Несколько своих ответов из нее приведу из сохранившейся истории

В парадигме MT тик - это то, что пришло от биржи. Единица стрима(-ов). Поэтому два подряд идущих тика могут полностью совпадать (MqlTick), но при этом не обозначать одно и то же событие. Помимо MqlTick-данных есть еще номер тика, который не показывается в MT. И есть MT-нюанс с тиками, когда сама история тиков переписывается задним числом из-за нескольких источников получения тиков.

два подряд идущих тика (вызывающие события Tick/Calculate) могут совпадать полностью по структуре MqlTick (все цены и объемы и время и флаги равны), но на самом деле быть разными. Bid/Ask всегда кратны TickSize. Last (не на бирже) может быть не кратна TickSize. TickSize может быть в разы больше Point (посмотрите RTS, например). Поэтому говорить про Point не совсем корректно в данном случае.

Возможно пригодится. SymbolInfoTick - не синхронизированная функция. Это значит, что в разных местах OnTick она может возвращать разные тики. Более того, даже если в самом начале OnTick вызвать SymbolInfoTick, то полученный тик не будет являться инициатором Tick-события, на который OnTick сработал. Поля его MqlTick-структуры не будут равны тому тику, что пришел от биржи, т.к. эти поля синтезированы самим терминалом и равны Marketwatch-значениям. 

 
Почему на форекс в тестере INFO-тики не совпадают с ALL-тиками?
 
В тестере запускаем советник
void OnTick()
{
  static bool FirstRun = true;
  
  if (FirstRun)
  {
    MqlTick Ticks[1];
    
    if (SymbolInfoTick(_Symbol, Ticks[0]))  
      Print(CopyTicks(_Symbol, Ticks, COPY_TICKS_ALL, Ticks[0].time_msc + 1)); // Сколько тиков со временем больше последнего
    FirstRun = false;
  }
}

Результат

2016.10.15 13:23:57.689 2016.10.12 00:00:16   1

Должна возвращать ноль, а возвращает единицу. При этом Ticks[] не меняется. Баг!
 

 
fxsaber:
В тестере запускаем советник
void OnTick()
{
  static bool FirstRun = true;
  
  if (FirstRun)
  {
    MqlTick Ticks[1];
    
    if (SymbolInfoTick(_Symbol, Ticks[0]))  
      Print(CopyTicks(_Symbol, Ticks, COPY_TICKS_ALL, Ticks[0].time_msc + 1)); // Сколько тиков со временем больше последнего
    FirstRun = false;
  }
}

Результат

2016.10.15 13:23:57.689 2016.10.12 00:00:16   1

Должна возвращать ноль, а возвращает единицу. При этом Ticks[] не меняется. Баг!
 

А не может это быть из-за выходных?

Из хелпа. CopyTicks Функция получает в массив ticks_array тики, накопленные терминалом за текущую рабочую сессию.

 
Alexey Volchanskiy:

А не может это быть из-за выходных?

Из хелпа. CopyTicks Функция получает в массив ticks_array тики, накопленные терминалом за текущую рабочую сессию.

В тестере же баг.
 

Проблема с производительностью CopyTicks.

Робо

Network 'xxx': authorized on RoboForexEU-MetaTrader 5 through Europe #1 (ping: 56.66 ms)

БКС

Network 'xxx': authorized on BCS-MetaTrader5 through Access Server #2 (ping: 45.53 ms)



Это данные тикового индикатора. В обоих случаях закачано 2-3 тысячи тиков. Но в робо это происходит быстрее более, чем на порядок.

Днем на форекс видел совпадение скоростей - тогда рынок был подвижней. Похоже, копитикс тормозит активный маркетвотч.

Единственный чарт и единственный индикатор в обоих случаях. И копитикс уже точно имел в базе/кэше закачанные котиры.

 

1) были ли стаканы на обоих?

2) было ли разделение trade/info тиков в их исходных потоках? Сложные потоки требуют пересчета, а простой выдачи

3) какой реально был запрос?

4) сколькими запросами были подтверждены полученные результаты? Соблюдены и как именно правила тестов: учет холодного старта, отброс выбросов, повторяемость результатов на серии, код для воспроизведения.

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

 
Renat Fatkhullin:

1) были ли стаканы на обоих?

2) было ли разделение trade/info тиков в их исходных потоках? Сложные потоки требуют пересчета, а простой выдачи

3) какой реально был запрос?

4) сколькими запросами были подтверждены полученные результаты? Соблюдены и как именно правила тестов: учет холодного старта, отброс выбросов, повторяемость результатов на серии, код для воспроизведения.

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

На точный код ссылку дал.

  1. Не было стаканов.
  2. Только INFO-тики.
  3. COPY_TICKS_INFO с from > 0.
  4. Индикатор по ссылке посмотрите в работе. Повторяемость полная. Холодный старт исключен. Выбросы - аналогично.
 

Проверим.

Но по отсутствию стакана в одном из серверов большие сомнения. Не важно, что стакан не визуализирован. Если он есть у символа, то его данные всегда присутствуют и при запросах тиков действует более сложных алгоритм выдачи.

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