Откуда берутся лишние бары в тестере стратегий?

 

Я исчерпал все свои возможности найти причину этой проблемы.

Пользовательский символ в терминале строится так как надо, всё красиво, а когда прогоняю на нём советник в тестере, появляются лишние бары.

В настройках тестера выбрано "каждый тик на основе реальных тиков". 

Выглядит это так.


При этом если распечатать тики CopyTicks() и бары CopyRates() в терминале то всё нормально

//------------------- Терминал -----------------------//
[time] [open] [high]  [low] [close] [tick_volume] [spread] [real_volume]
1995.02.03 09:26:00  69524  69524  69524   69524             1        1             1
1995.02.03 09:28:00  69524  69524  69522   69522             2        1             6
1995.02.03 09:29:00  69522  69522  69522   69522             1        3             1

[time]  [bid]  [ask] [last] [volume]   [time_msc] [flags] [volume_real]
1995.02.03 09:25:55  69522  69524  69524        1 791803555858      56             1
1995.02.03 09:26:59  69524  69525  69524        1 791803619506      56             1
1995.02.03 09:28:01  69524  69525  69524        1 791803681140      88             1
1995.02.03 09:28:01  69522  69524  69522        5 791803681481      88             5
1995.02.03 09:29:02  69521  69524  69522        1 791803742168      88             1

А в если это же в тестере, то лишний бар с какой то левой ценой аск и бид

//------------------- Тестер -----------------------//
[time] [open] [high]  [low] [close] [tick_volume] [spread] [real_volume]
1995.02.03 09:26:00  69524  69524  69524   69524             1        2             1
1995.02.03 09:27:00  70987  70988  70987   70988             3        1             5
1995.02.03 09:28:00  69524  69524  69522   69522             2        1             6
1995.02.03 09:29:00  69522  69522  69522   69522             1        1             1

[time]  [bid]  [ask] [last] [volume]   [time_msc] [flags] [volume_real]
1995.02.03 09:25:55      0      0  69524        1 791803555858      56             1
1995.02.03 09:26:59      0      0  69524        1 791803619506      56             1
1995.02.03 09:27:00  70987  70988  69524        1 791803620000       6             1
1995.02.03 09:27:30  70987  70988  69524        1 791803650000       6             1
1995.02.03 09:27:59  70988  70989  69524        1 791803679000       6             1
1995.02.03 09:28:01  70988  70989  69524        1 791803681140      88             1
1995.02.03 09:28:01  70988  70989  69522        5 791803681481      88             5
1995.02.03 09:29:02  70988  70989  69522        1 791803742168      88             1


Котировки биржевые, скачиваются с флагом COPY_TICKS_TRADE, из них создаётся пользовательский символ.

Перед созданием символа удаляю всё, всё что могу сначала график, потом символ из обзора рынка, затем CustomRatesDelete(), CustomTicksDelete(),

потом ещё CustomSymbolDelete() и вишенка на торте, удаляю всё, что удаляется, с именем этого символа из папок    "\\bases\\Custom\\ticks\\" + c_Name + "\\",   "\\bases\\Custom\\history\\" + c_Name + "\\"

Не помогает :(

В чём может быть причина? Куда смотреть?


 
Aleksandr Slavskii:

Я исчерпал все свои возможности найти причину этой проблемы.

Пользовательский символ в терминале строится так как надо, всё красиво, а когда прогоняю на нём советник в тестере, появляются лишние бары.



Это - не лишние бары, а недостающие. 

Вы не синхронизировали котировки при создании синтетика. 

 
Aleksandr Slavskii:

В чём может быть причина? Куда смотреть?

Помочь разобраться возможно только таким методом.

Форум по трейдингу, автоматическим торговым системам и тестированию торговых стратегий

Тестер стратегий MetaTrader 5: ошибки, баги, предложения по улучшению работы

fxsaber, 2022.11.20 23:44

Необычный баг Тестера (b3510), воспроизвести который пытался (много часов попыток) разными способами, но получилось только этим.

1. Создать папку и скопировать в нее exe-файлы своего терминала.

2. Распаковать файлы из прикрепленного архива в эту папку.

3. Запустить terminal64.exe.

4. Открыть Тестер и выбрать предложенный профайл.

5. Запустить Тестер и посмотреть результат в его журнале.

Это позволит другим полностью воспроизвести любую проблему с кастомным символом.
 
Алексей Тарабанов #:

Это - не лишние бары, а недостающие. 

Вы не синхронизировали котировки при создании синтетика. 

Если можно, то немного поподробнее, кого с чем нужно синхронизировать?

Я просто создаю символ из тиков функциями CustomTicksReplace(), CustomTicksAdd(),

если я пытаюсь создать символ и добавляю к тикам ещё и бары, функциями CustomRatesReplace(), CustomRatesUpdate(),

то получаю графики со сдвоенными барами у которых одинаковое время.


Да к тому же, если бы был какой то рассинхрон, то это проявлялось бы и в терминале, а в терминале всё красиво.

Ошибка проявляется только в тестере.

 
fxsaber #:

Помочь разобраться возможно только таким методом.

Это позволит другим полностью воспроизвести любую проблему с кастомным символом.

Я не уверен, что это баг программы, а не мой косяк.


Похоже ошибка, что вы указали в этом посте и моя однотипные.

Вы задавали этот вопрос в середине ноября прошлого года, что нибудь изменилось с того времени? У вас она всё ещё воспроизводится? 

 

Что примечательно. Если В символах экспортировать историю тиков в файл, а затем а затем там же в этот же символ импортировать её, то в тестере эти лишние бары больше не появляются.

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

Это получается, чтоб не было лишних баров в тестере, можно попробовать сделать так:

программкой сначала создать символ, потом скачать тики с этого символа и сохранить в файл, затем создать символ из тиков, которые в файле.


Угу. Решение через *опу, но надо вечерком попробовать  его  реализовать.

 
Aleksandr Slavskii #:

Что примечательно. Если В символах экспортировать историю тиков в файл, а затем а затем там же в этот же символ импортировать её, то в тестере эти лишние бары больше не появляются.

Угу. Решение через *опу, но надо вечерком попробовать  его  реализовать.

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


//+------------------------------------------------------------------+
void CustomSymbol()
  {
   if(c_Ticks()) // здесь получаем тики
     {
      int count = -1;
      if(!SymbolInfoInteger(c_Name, SYMBOL_CUSTOM)) // если пользовательского символа нет
        {
         if(CustomSymbolCreate(c_Name, "Sec", _Symbol)) // создаём символ
           {
            SymbolSelect(c_Name, true); // выбрали в символ в маркет вач

            ResetLastError();
            count = CustomTicksReplace(c_Name, ticks[0].time_msc, ticks[result - 1].time_msc, ticks);
            if(count < result)
               PrintFormat("CustomTicksReplace Записано тиков %d, скачано %d, Error %d", count, result, GetLastError());
            Sleep(100);

            WriteRead(); // записали в файл и считали из этого же файла

            count = CustomTicksReplace(c_Name, ticks[0].time_msc, ticks[result - 1].time_msc, ticks);
            if(count < result)
               PrintFormat("CustomTicksReplace Записано тиков %d, скачано %d, Error %d", count, result, GetLastError());
            Sleep(100);

            ChartOpen(c_Name, PERIOD_M1);
           }
        }
      else
        {
         ResetLastError();
         count =  CustomTicksAdd(c_Name, ticks);
         if(count < result)
            PrintFormat("CustomTicksAdd Записано тиков %d, скачано %d, Error %d", count, result, GetLastError());
        }
     }

   if(stop != 0 && TimeCurrent() >= stop) // если создавали символ для тестера и не нужно, чтоб символ обновлялся каждый тик, удалим советник
      ExpertRemove();
  }

//+------------------------------------------------------------------+
void WriteRead()
  {
   string name = MQLInfoString(MQL_PROGRAM_NAME) + "\\ticks.bin";
   int file_handle = FileOpen(name, FILE_WRITE | FILE_READ | FILE_BIN);
   FileWriteArray(file_handle, ticks);
   FileClose(file_handle);

   file_handle = FileOpen(name, FILE_WRITE | FILE_READ | FILE_BIN);
   FileReadArray(file_handle, ticks);
   FileClose(file_handle);
   FileDelete(name);
  }
//+------------------------------------------------------------------+
 
Aleksandr Slavskii #:

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

Файл не при делах. Возможно, повторная запись тиков в символ что-то меняет.

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

 

fxsaber #:

Файл не при делах. Возможно, повторная запись тиков в символ что-то меняет.

Возможно, потому что генерирую бары самостоятельно.

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

Буду вылавливать, когда появляется эта трабла и методом научного тыка определять, чем лечить.


Сделать пользовательский символ из бары не проблема, а как в них тики засунуть?

Если сделать графики из баров без тиков, то как тестировать? По OHLC? Мне это не походит.

Или я чего то не понмаю.

Я попробовал записывать и бары и тики, в итоге получил график со сдвоенными барами у которых одинаковое время



Две рядом стоящие свечи имеют одинаковое время. Для меня это было неожиданностью.

 
Aleksandr Slavskii #:

Я попробовал записывать и бары и тики, в итоге получил график со сдвоенными барами у которых одинаковое время

Сначала прописываете тики - MT5 сгенерирует еще и бары. Затем записываете самостоятельно сгенерированные бары, удаляя MT5-мусор.
 
fxsaber #:
Сначала прописываете тики - MT5 сгенерирует еще и бары. Затем записываете самостоятельно сгенерированные бары, удаляя MT5-мусор.

Не понял. Пожалуйста чуть чуть поподробнее.

Выше мой код, там видно, что я создал символ CustomSymbolCreate(), закинул в него свои тики CustomTicksReplace(), далее МТ5 сгенерировал бары. 

А дальше, что я должен сделать?

CopyRates() созданного символа и потом CustomRatesReplace()  обновить его же, а что считаем мусором?


ЗЫ. Посмотрел на всякий случай, вашу  Symbol - библиотека для MetaTrader 5,  ни фига не понял)))