Я исчерпал все свои возможности найти причину этой проблемы.
Пользовательский символ в терминале строится так как надо, всё красиво, а когда прогоняю на нём советник в тестере, появляются лишние бары.
Это - не лишние бары, а недостающие.
Вы не синхронизировали котировки при создании синтетика.
В чём может быть причина? Куда смотреть?
Помочь разобраться возможно только таким методом.
Форум по трейдингу, автоматическим торговым системам и тестированию торговых стратегий
Тестер стратегий MetaTrader 5: ошибки, баги, предложения по улучшению работы
fxsaber, 2022.11.20 23:44
Необычный баг Тестера (b3510), воспроизвести который пытался (много часов попыток) разными способами, но получилось только этим.
1. Создать папку и скопировать в нее exe-файлы своего терминала.
2. Распаковать файлы из прикрепленного архива в эту папку.
3. Запустить terminal64.exe.
4. Открыть Тестер и выбрать предложенный профайл.
5. Запустить Тестер и посмотреть результат в его журнале.
Это - не лишние бары, а недостающие.
Вы не синхронизировали котировки при создании синтетика.
Если можно, то немного поподробнее, кого с чем нужно синхронизировать?
Я просто создаю символ из тиков функциями CustomTicksReplace(), CustomTicksAdd(),
если я пытаюсь создать символ и добавляю к тикам ещё и бары, функциями CustomRatesReplace(), CustomRatesUpdate(),
то получаю графики со сдвоенными барами у которых одинаковое время.
Да к тому же, если бы был какой то рассинхрон, то это проявлялось бы и в терминале, а в терминале всё красиво.
Ошибка проявляется только в тестере.
Помочь разобраться возможно только таким методом.
Это позволит другим полностью воспроизвести любую проблему с кастомным символом.Я не уверен, что это баг программы, а не мой косяк.
Похоже ошибка, что вы указали в этом посте и моя однотипные.
Вы задавали этот вопрос в середине ноября прошлого года, что нибудь изменилось с того времени? У вас она всё ещё воспроизводится?
Что примечательно. Если В символах экспортировать историю тиков в файл, а затем а затем там же в этот же символ импортировать её, то в тестере эти лишние бары больше не появляются.
Даже если пересоздать этот символ по новой, с удалением всего, что удаляется, то символ создаётся нормальным.
Это получается, чтоб не было лишних баров в тестере, можно попробовать сделать так:
программкой сначала создать символ, потом скачать тики с этого символа и сохранить в файл, затем создать символ из тиков, которые в файле.
Угу. Решение через *опу, но надо вечерком попробовать его реализовать.
Что примечательно. Если В символах экспортировать историю тиков в файл, а затем а затем там же в этот же символ импортировать её, то в тестере эти лишние бары больше не появляются.
Угу. Решение через *опу, но надо вечерком попробовать его реализовать.
Да, похоже так и есть. Сильно не проверял, но пару раз проверил, запись тиков созданного символа в файл, потом чтение из файла и перезапись символа, устраняют лишние бары в тестере.
//+------------------------------------------------------------------+ 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); } //+------------------------------------------------------------------+
Да, похоже так и есть. Сильно не проверял, но пару раз проверил, запись тиков созданного символа в файл, потом чтение из файла и перезапись символа, устраняют лишние бары в тестере.
Файл не при делах. Возможно, повторная запись тиков в символ что-то меняет.
Никогда не сталкивался с подобной проблемой. Возможно, потому что генерирую бары самостоятельно.
fxsaber #:
Файл не при делах. Возможно, повторная запись тиков в символ что-то меняет.
Возможно, потому что генерирую бары самостоятельно.
Возможно файл не при делах, сейчас вообще эта проблема не воспроизводится, хоть как записывай, в тестере всё красиво.
Буду вылавливать, когда появляется эта трабла и методом научного тыка определять, чем лечить.
Сделать пользовательский символ из бары не проблема, а как в них тики засунуть?
Если сделать графики из баров без тиков, то как тестировать? По OHLC? Мне это не походит.
Или я чего то не понмаю.
Я попробовал записывать и бары и тики, в итоге получил график со сдвоенными барами у которых одинаковое время
Две рядом стоящие свечи имеют одинаковое время. Для меня это было неожиданностью.
Сначала прописываете тики - MT5 сгенерирует еще и бары. Затем записываете самостоятельно сгенерированные бары, удаляя MT5-мусор.
Не понял. Пожалуйста чуть чуть поподробнее.
Выше мой код, там видно, что я создал символ CustomSymbolCreate(), закинул в него свои тики CustomTicksReplace(), далее МТ5 сгенерировал бары.
А дальше, что я должен сделать?
CopyRates() созданного символа и потом CustomRatesReplace() обновить его же, а что считаем мусором?
ЗЫ. Посмотрел на всякий случай, вашу Symbol - библиотека для MetaTrader 5, ни фига не понял)))
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Вы принимаете политику сайта и условия использования
Я исчерпал все свои возможности найти причину этой проблемы.
Пользовательский символ в терминале строится так как надо, всё красиво, а когда прогоняю на нём советник в тестере, появляются лишние бары.
В настройках тестера выбрано "каждый тик на основе реальных тиков".
Выглядит это так.
При этом если распечатать тики CopyTicks() и бары CopyRates() в терминале то всё нормально
А в если это же в тестере, то лишний бар с какой то левой ценой аск и бид
Котировки биржевые, скачиваются с флагом COPY_TICKS_TRADE, из них создаётся пользовательский символ.
Перед созданием символа удаляю всё, всё что могу сначала график, потом символ из обзора рынка, затем CustomRatesDelete(), CustomTicksDelete(),
потом ещё CustomSymbolDelete() и вишенка на торте, удаляю всё, что удаляется, с именем этого символа из папок "\\bases\\Custom\\ticks\\" + c_Name + "\\", "\\bases\\Custom\\history\\" + c_Name + "\\"
Не помогает :(
В чём может быть причина? Куда смотреть?