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

 
fxsaber:
Столкнулся с багом, когда CopyTicksRange возвращает все запрошенные тики верно, но при этом LastError == ERR_HISTORY_TIMEOUT(4403). 


Это не баг, это фича. Тоже самое выдаёт CopyTicks, иногда. Пока не придумал, как эту "фичу" использовать

в описании функции CopyTicksRange :

ERR_HISTORY_TIMEOUT – время ожидание синхронизации тиков вышло, функция отдала всё что было.

Хотелось бы, конечно, чтобы разработчики пояснили, что означает эта ошибка, при условии что тик по функции CopyTicks получен. Как эту ошибку обрабатывать. пс: вызываю в индикаторе

 

Прошу сообщить, какие данные нужно предоставить, чтобы скорее решить эту проблему?

void OnStart()
{
  MqlTick Ticks[];

  Print(CopyTicksRange(_Symbol, Ticks, COPY_TICKS_INFO, (ulong)D'2020.04.09 10:40:29' * 1000, (ulong)D'2020.04.11' * 1000)); // 8192
  Print(_LastError); // 4407

  ResetLastError();

  MqlTick Ticks2[];

  Print(CopyTicksRange(_Symbol, Ticks2, COPY_TICKS_INFO, (ulong)D'2020.04.09 10:40:30' * 1000)); // 131066
  Print(_LastError); // 0
}


Тики не копирует, выдавая ошибку.

Константа

Значение

Описание

ERR_HISTORY_SMALL_BUFFER

4407

Принимающий массив слишком мал чтобы вместить все запрошенные данные


Невозможно нормально работать с такими сюрпризами!


Через GUI (CTRL+U) тики берутся без проблем.

Строка для поиска: Oshibka 007.
 
fxsaber:

Прошу сообщить, какие данные нужно предоставить, чтобы скорее решить эту проблему?

Тики не копирует, выдавая ошибку.

Константа

Значение

Описание

ERR_HISTORY_SMALL_BUFFER

4407

Принимающий массив слишком мал чтобы вместить все запрошенные данные

Проверили локально у себя по разному - пока не воспроизводится. Нужны подробности:

1. Какая версия терминала?

2. С каким сервером вы работаете?

3. На каком символе вызывается скрипт?

4. Если вызывать не с COPY_TICKS_INFO, а COPY_TICKS_ALL то ошибка ERR_HISTORY_SMALL_BUFFER также взводится?

Спасибо!

 
Anton:

Проверили локально у себя по разному - пока не воспроизводится. Нужны подробности:

1. Какая версия терминала?

2. С каким сервером вы работаете?

3. На каком символе вызывается скрипт?

4. Если вызывать не с COPY_TICKS_INFO, а COPY_TICKS_ALL то ошибка ERR_HISTORY_SMALL_BUFFER также взводится?

Спасибо!

  1. 2380.
  2. Сервер любой - см. п.3.
  3. Кастомный символ.
  4. Флаг не меняет поведение.

ЗЫ В прицепе кастомный. Создать символ из json, импортировать тики, запустить скрипт на чарте этого символа. Просьба написать, воспроизвели или нет.

Файлы:
EURUSD.zip  896 kb
 
fxsaber:

 Просьба написать, воспроизвели или нет.

Да, на 2380 воспроизвелось.

Спасибо большое! Разбираемся.

 
fxsaber:

  1. 2380.
  2. Сервер любой - см. п.3.
  3. Кастомный символ.
  4. Флаг не меняет поведение.

ЗЫ В прицепе кастомный. Создать символ из json, импортировать тики, запустить скрипт на чарте этого символа. Просьба написать, воспроизвели или нет.


Еще раз спасибо.

Да, в 2380 случайно занесли проблему и потом быстро её исправили. Но в билд 2380 это успело попасть.

К сожалению с того момента новых билдов где все исправлено на MetaQuotes-Demo пока не было.

Вы можете либо откатится на любой предыдущий билд либо дождаться очередного билда на MetaQuotes-Demo.
 
Anton:
Вы можете либо откатится на любой предыдущий билд либо дождаться очередного билда на MetaQuotes-Demo.

Спасибо, для реала пока предыдущий билд. В 2380 много сделали...

 

MT5 последняя релизная сборка 2361. В аттаче кастомный символ. Создать символ из json, импортировать тики, запустить тест советника на чарте этого символа.

Советник

void OnTick()
{
  MqlTick Tick={0};
  if(SymbolInfoTick(_Symbol,Tick))
  {
    MqlTick OldTicks[];
    Print(CopyTicks(_Symbol,OldTicks,COPY_TICKS_ALL));
    Print(GetLastError());
    Print(CopyTicks(_Symbol,OldTicks,COPY_TICKS_ALL,(ulong)D'2020.04.06 00:00:00' * 1000));
    Print(GetLastError());
  }
  ExpertRemove();
}

Параметры теста

[Tester]
Expert=test.ex5
Symbol=AUDNZD.RannForex
Period=M1
Optimization=0
Model=4
FromDate=2020.04.08
ToDate=2020.04.09
ForwardMode=0
Deposit=10000000
Currency=USD
ProfitInPips=1
Leverage=100
ExecutionMode=0
OptimizationCriterion=6
Visual=0

1. Счёт неттинг.

    1.1. При указанных датах вывод похож на правду: 2000   0   2000   0.

    1.2. При смене дат на 07.04.2020-08.04.2020 вывод становится странным: -1   4004   1   0.

            Во-первых, почему появляется ошибка в первом случае? Во-вторых, почему второй случай берёт только 1 тик? Дата запроса тиков не менялась.

2. Счёт хедж.

    2.1. При указанных датах вывод становится странным: 2000   0   1   0.

            Почему второй случай берёт только 1 тик? Дата запроса тиков не менялась.

    2.2. При смене дат на 07.04.2020-08.04.2020 вывод остановится странным, но таким же: 2000   0   1   0.


Отсюда вопросы: почему CopyTicks с фиксированными параметрами зависит не только от дат тестирования, но и от типа счёта? Или я что-то не понимаю и делаю не так?

Это сильно затрудняет работу, просьба по возможности поправить. Удалось воспроизвести? Что-то ещё нужно от меня для повторения? Спасибо.

Файлы:
AUDNZD.zip  2448 kb
 
traveller00:

Отсюда вопросы: почему CopyTicks с фиксированными параметрами зависит не только от дат тестирования, но и от типа счёта? Или я что-то не понимаю и делаю не так?

Зависимость от типа счета - примерно можно представить причины. Не скажу, что это правильно. Биржевые символы с last-историей - там нужно хорошо один раз подумать разработчикам, что с ними делать на хедже и т.д.

Сам CopyTicks не использую в Тестере. Первые сутки не принципиальны. Если очень нужны четкие торговые сигналы, то не торгуйте первые сутки.

 
traveller00:

MT5 последняя релизная сборка 2361. В аттаче кастомный символ. Создать символ из json, импортировать тики, запустить тест советника на чарте этого символа.

Советник

Параметры теста

1. Счёт неттинг.

    1.1. При указанных датах вывод похож на правду: 2000   0   2000   0.

    1.2. При смене дат на 07.04.2020-08.04.2020 вывод становится странным: -1   4004   1   0.

            Во-первых, почему появляется ошибка в первом случае? Во-вторых, почему второй случай берёт только 1 тик? Дата запроса тиков не менялась.

2. Счёт хедж.

    2.1. При указанных датах вывод становится странным: 2000   0   1   0.

            Почему второй случай берёт только 1 тик? Дата запроса тиков не менялась.

    2.2. При смене дат на 07.04.2020-08.04.2020 вывод остановится странным, но таким же: 2000   0   1   0.


Отсюда вопросы: почему CopyTicks с фиксированными параметрами зависит не только от дат тестирования, но и от типа счёта? Или я что-то не понимаю и делаю не так?

Это сильно затрудняет работу, просьба по возможности поправить. Удалось воспроизвести? Что-то ещё нужно от меня для повторения? Спасибо.

Самый первый запуск. Смотрим логи тестера

2020.04.21 10:53:10.573 Core 01 AUDNZD.RannForex: symbol to be synchronized
2020.04.21 10:53:10.573 Core 01 AUDNZD.RannForex: symbol synchronized, 3720 bytes of symbol info received
2020.04.21 10:53:10.573 Core 01 AUDNZD.RannForex: load 23 Kb of history data to synchronize in 0:00:00.009
2020.04.21 10:53:10.573 Core 01 AUDNZD.RannForex: history synchronized from 2020.04.06 to 2020.04.08
2020.04.21 10:53:10.573 Core 01 AUDNZD.RannForex: ticks synchronization started
2020.04.21 10:53:10.573 Core 01 AUDNZD.RannForex: load 567 Kb of tick data to synchronize in 0:00:00.031
2020.04.21 10:53:10.573 Core 01 AUDNZD.RannForex: history ticks synchronized from 2020.04.08 to 2020.04.08
2020.04.21 10:53:10.573 Core 01 AUDNZD.RannForex,M1: history cache allocated for 3897 bars and contains 2868 bars from 2020.04.06 00:05 to 2020.04.07 23:59
2020.04.21 10:53:10.573 Core 01 AUDNZD.RannForex,M1: history begins from 2020.04.06 00:05
2020.04.21 10:53:10.573 Core 01 AUDNZD.RannForex,M1 (MetaQuotes-Demo): generating based on real ticks
2020.04.21 10:53:10.573 Core 01 AUDNZD.RannForex,M1: testing of Experts\test.ex5 from 2020.04.08 00:00 to 2020.04.09 00:00 started
2020.04.21 10:53:10.573 Core 01 AUDNZD.RannForex : real ticks begin from 2020.04.08 00:00:00
2020.04.21 10:53:10.573 Core 01 2020.04.08 00:01:11   -1
2020.04.21 10:53:10.573 Core 01 2020.04.08 00:01:11   4004
2020.04.21 10:53:10.573 Core 01 2020.04.08 00:01:11   1
2020.04.21 10:53:10.573 Core 01 2020.04.08 00:01:11   0
2020.04.21 10:53:10.573 Core 01 2020.04.08 00:01:11   ExpertRemove() function called
2020.04.21 10:53:10.573 Core 01 removed itself within OnTick

Тестер синхронизировал тики всего за один день, за 8 апреля. То есть, до 8 апреля тиков нет.

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

Следующий запрос совершенно справдливо вам выдал 1 тик. Потому что с 2020.04.06 00:00:00 по текущий тестерный момент, когда пришёл первый тик, существует только один этот самый тик.

Немножко скорректируем советника

void OnTick()
  {
   MqlTick Tick= {0};
   if(SymbolInfoTick(_Symbol,Tick))
     {
      MqlTick OldTicks[];
      Print(CopyTicks(_Symbol,OldTicks,COPY_TICKS_ALL));
      if(GetLastError()!=0)
         return;
      Print(GetLastError());
      Print(CopyTicks(_Symbol,OldTicks,COPY_TICKS_ALL,(ulong)D'2020.04.06 00:00:00' * 1000));
      Print(GetLastError());
     }
   ExpertRemove();
  }

и видим, что со второго тика, тики стали забираться. В обоих случаях - 2 тика

2020.04.21 11:14:13.256 Core 01 AUDNZD.RannForex : real ticks begin from 2020.04.08 00:00:00
2020.04.21 11:14:13.256 Core 01 2020.04.08 00:01:11   -1
2020.04.21 11:14:13.256 Core 01 2020.04.08 00:01:19   2
2020.04.21 11:14:13.256 Core 01 2020.04.08 00:01:19   0
2020.04.21 11:14:13.256 Core 01 2020.04.08 00:01:19   2
2020.04.21 11:14:13.256 Core 01 2020.04.08 00:01:19   0
2020.04.21 11:14:13.256 Core 01 2020.04.08 00:01:19   ExpertRemove() function called

То есть, предположение про ошибку запроса на границе существования тиков оказалось верным.

Поменяем дату начала на 7 апреля

2020.04.21 11:18:17.775 Core 01 AUDNZD.RannForex: history ticks synchronized from 2020.04.07 to 2020.04.08
2020.04.21 11:18:17.775 Core 01 AUDNZD.RannForex,M1: history cache allocated for 3486 bars and contains 1429 bars from 2020.04.06 00:05 to 2020.04.06 23:59
2020.04.21 11:18:17.775 Core 01 AUDNZD.RannForex,M1: history begins from 2020.04.06 00:05
2020.04.21 11:18:17.775 Core 01 AUDNZD.RannForex,M1 (MetaQuotes-Demo): generating based on real ticks
2020.04.21 11:18:17.775 Core 01 AUDNZD.RannForex,M1: testing of Experts\test.ex5 from 2020.04.07 00:00 to 2020.04.09 00:00 started
2020.04.21 11:18:17.775 Core 01 AUDNZD.RannForex : real ticks begin from 2020.04.07 00:00:00
2020.04.21 11:18:17.775 Core 01 2020.04.07 00:01:28   -1
2020.04.21 11:18:17.775 Core 01 2020.04.07 00:01:28   4004
2020.04.21 11:18:17.775 Core 01 2020.04.07 00:01:28   1
2020.04.21 11:18:17.775 Core 01 2020.04.07 00:01:28   0
2020.04.21 11:18:17.775 Core 01 2020.04.07 00:01:28   ExpertRemove() function called
2020.04.21 11:18:17.775 Core 01 removed itself within OnTick

Всё то же самое. за исключением того, что тики у нас синхронизированы уже за 2 дня - в тестерной базе лежат тики за 7 и 8 апреля.

Обратно ставим начальную дату на 8 апреля. И видим ожидаемый вывод

2020.04.21 11:20:51.257 Core 01 AUDNZD.RannForex: load 47 bytes of history data to synchronize in 0:00:00.000
2020.04.21 11:20:51.257 Core 01 AUDNZD.RannForex: history synchronized from 2020.04.06 to 2020.04.08
2020.04.21 11:20:51.257 Core 01 AUDNZD.RannForex: ticks synchronization started
2020.04.21 11:20:51.257 Core 01 AUDNZD.RannForex: load 54 bytes of tick data to synchronize in 0:00:00.000
2020.04.21 11:20:51.257 Core 01 AUDNZD.RannForex: history ticks synchronized from 2020.04.07 to 2020.04.08
2020.04.21 11:20:51.257 Core 01 AUDNZD.RannForex,M1: history cache allocated for 3897 bars and contains 2868 bars from 2020.04.06 00:05 to 2020.04.07 23:59
2020.04.21 11:20:51.257 Core 01 AUDNZD.RannForex,M1: history begins from 2020.04.06 00:05
2020.04.21 11:20:51.257 Core 01 AUDNZD.RannForex,M1 (MetaQuotes-Demo): generating based on real ticks
2020.04.21 11:20:51.257 Core 01 AUDNZD.RannForex,M1: testing of Experts\test.ex5 from 2020.04.08 00:00 to 2020.04.09 00:00 started
2020.04.21 11:20:51.257 Core 01 AUDNZD.RannForex : real ticks begin from 2020.04.07 00:00:00
2020.04.21 11:20:51.257 Core 01 2020.04.08 00:01:11   2000
2020.04.21 11:20:51.257 Core 01 2020.04.08 00:01:11   0
2020.04.21 11:20:51.257 Core 01 2020.04.08 00:01:11   2000
2020.04.21 11:20:51.257 Core 01 2020.04.08 00:01:11   0
2020.04.21 11:20:51.257 Core 01 2020.04.08 00:01:11   ExpertRemove() function called
2020.04.21 11:20:51.257 Core 01 removed itself within OnTick

Потому что тиков у тестера стало больше, чем в самый первый запуск. И хеджинг с неттингом тут ни при чём

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