Невозможность управления графиками во время тестирования в визуальном режиме

 

Приветствую! Долго копал поиск и документацию, но вместо ответов открыл ещё больше вопросов.

Есть эксперт, который использует индикаторы с разных графиков (инструменты и период графиков могут отличаться). В режиме визуализации во время теста открываются эти графики, как и положено. Только вот основной график получает оформление, заданное шаблоном Tester.tpl, а остальные стандарное убогое чёрно-зелёное (почему не тот же Tester.tpl?). Возникло желание вручную применить к ним свои шаблоны оформления. Оказалось, что это не работает!

Выяснилось, что в режиме визуализации работает ChartID(), ChartFirst(), а вот ChartNext() и ChartOpen() не работает! Думал запретить показ индикаторов через TesterHideIndicators(), а потом самостоятельно открыть нужные графики и разместить на них по имеющимся хендлам индикаторы, но нет такого пути. Также стало ясно, что доступный файл при тестировании файл (всё как положено, через #property tester_file) не принимается функцией ChartApplyTemplate() даже к текущему графику, выкидывая ошибку 5019 (ERR_FILE_NOT_EXIST). Т.е. в режиме визуализации невозможно поменять шаблон никаких графиков, хотя в справке об этом ничего не нашёл. Что посоветуете?

Код для воспроизведения:

#property tester_file           "TesterCustom.tpl"

int OnInit() // start on period = M1
{
        int handle1 = iMA(_Symbol,PERIOD_M1,50,0,0,0);
        int handle2 = iMA(_Symbol,PERIOD_M10,50,0,0,0);

        EventSetTimer(1);

        if(FileIsExist("TesterCustom.tpl"))
                Print("File 'TesterCustom.tpl' is exist!");
        
        return(INIT_SUCCEEDED);
}

void OnTimer()
{
        // chart templates correction
        static bool corrected = false;

        if(!corrected)
        {
                long new_chart = ChartOpen(_Symbol, PERIOD_M10); // fail
                Print("Opened chart id = ", (string)new_chart, " error = ", _LastError);

                long this_chart = ChartID(); // works!
                Print("This chart id = ", (string)this_chart);

                long selected = ChartFirst(); // works!
                int counter = 1;

                while(selected >= 0)
                {
                        if(selected != this_chart)
                        {
                                string template_file = "\\Files\\TesterCustom.tpl";
                                bool success = ChartApplyTemplate(selected, template_file); // fail

                                if(!success) Print("Chart apply template failed, err = ", _LastError);
                                else Print("Chart template file ", template_file, " applies is done!");
                        }
                        
                        selected = ChartNext(selected); // fail
                        if(selected >= 0)
                        {
                                counter++;
                                Print("Selected chart id = ", (string)selected, "; counter = ", counter);
                        }
                        else Print("ChartNext() not works!");
                }
                corrected = true;
                Print("Total charts count = ", counter);
        }
}
Документация по MQL5: Операции с графиками / ChartNext
Документация по MQL5: Операции с графиками / ChartNext
  • www.mql5.com
ChartNext - Операции с графиками - Справочник MQL5 - Справочник по языку алгоритмического/автоматического трейдинга для MetaTrader 5
 
Ilya Filatov:

Приветствую! Долго копал поиск и документацию, но вместо ответов открыл ещё больше вопросов.

Есть эксперт, который использует индикаторы с разных графиков (инструменты и период графиков могут отличаться). В режиме визуализации во время теста открываются эти графики, как и положено. Только вот основной график получает оформление, заданное шаблоном Tester.tpl, а остальные стандарное убогое чёрно-зелёное (почему не тот же Tester.tpl?). Возникло желание вручную применить к ним свои шаблоны оформления. Оказалось, что это не работает!

Выяснилось, что в режиме визуализации работает ChartID(), ChartFirst(), а вот ChartNext() и ChartOpen() не работает! Думал запретить показ индикаторов через TesterHideIndicators(), а потом самостоятельно открыть нужные графики и разместить на них по имеющимся хендлам индикаторы, но нет такого пути. Также стало ясно, что доступный файл при тестировании файл (всё как положено, через #property tester_file) не принимается функцией ChartApplyTemplate() даже к текущему графику, выкидывая ошибку 5019 (ERR_FILE_NOT_EXIST). Т.е. в режиме визуализации невозможно поменять шаблон никаких графиков, хотя в справке об этом ничего не нашёл. Что посоветуете?

Код для воспроизведения:

Попробуйте в OnInit() предварительно обратиться к данным (например, к ценам) других графиков - это откроет в тестере графики тех символов, к которым обратились. А потом уже искать их.
 
Artyom Trishkin #:
Попробуйте в OnInit() предварительно обратиться к данным (например, к ценам) других графиков - это откроет в тестере графики тех символов, к которым обратились. А потом уже искать их.

Да, таким образом можно открыть график (попробовал, спасибо!), но в связи с тем, что ChartNext() не работает, не могу получить идентификатор открытого графика чтобы передать его в ChartApplyTemplate(), который и сам по себе (даже на известном идентификаторе текущего графика) не работает в тестере (не принимая ни каким образом путь к файлу шаблона, хотя в обычный запуск всё работает отлично). Я бы вообще в это не полез, если бы вновь открываемые графики в тестере сами подхватывали шаблон tester.tpl, как это происходит с первым основным графиком. Для меня это выглядит как ошибка, стоит ли уже писать обращение в сервисдек?

Документация по MQL5: Операции с графиками / ChartNext
Документация по MQL5: Операции с графиками / ChartNext
  • www.mql5.com
ChartNext - Операции с графиками - Справочник MQL5 - Справочник по языку алгоритмического/автоматического трейдинга для MetaTrader 5
 
Ilya Filatov #:

Да, таким образом можно открыть график (попробовал, спасибо!), но в связи с тем, что ChartNext() не работает, не могу получить идентификатор открытого графика чтобы передать его в ChartApplyTemplate(), который и сам по себе (даже на известном идентификаторе текущего графика) не работает в тестере (не принимая ни каким образом путь к файлу шаблона, хотя в обычный запуск всё работает отлично). Я бы вообще в это не полез, если бы вновь открываемые графики в тестере сами подхватывали шаблон tester.tpl, как это происходит с первым основным графиком. Для меня это выглядит как ошибка, стоит ли уже писать обращение в сервисдек?

Только вручную после запуска.

Писать никуда нет никакого смысла. Все всё уже знают.

 
Alexey Viktorov #:

Только вручную после запуска.

Ну класс, при этом исчезают все открытые со стороны эксперта индикаторы. Это значит, что на каждый конфиг и на каждый отдельный чарт нужно готовить шаблоны. Какой-то мартышкин труд. А ведь логично было бы, если бы тестер сам все графики открывал по чистому подготовленному шаблону (как самый первый график) и на него уже наносил всё, что задействовано и не скрыто с помощью TesterHideIndicators().

UPD: Попробовал добавить индикатор (через iCustom()) к графику, оформление которого хочу изменить, чтобы со стороны индикатора влезть в свойства графика. Оказалось, что индикатор с любого графика возвращает ChartID() = 12345. Это тот самый идентификатор, который принадлежит первому главному чарту. И все функции типа ChartSetInteger(), которым вместо идентификатора чарта можно передать 0, изменяют свойства не текущего (их) графика, а первого основного с id = 12345. Похоже, ChartID() тоже в тестере вообще не работает, а имеет заглушку, которая всегда со всех чартов выдаёт 12345. И нигде в документации почему-то не сказано про ограничения в работе тестере многих функций. Ну как так?

Разработчики, прошу, сделайте все открываемые при визуальном тестировании графики с основным шаблоном tester.tpl (ну не зря же вы его вообще придумали)!

 
Ilya Filatov #:

Ну класс, при этом исчезают все открытые со стороны эксперта индикаторы. Это значит, что на каждый конфиг и на каждый отдельный чарт нужно готовить шаблоны. Какой-то мартышкин труд. А ведь логично было бы, если бы тестер сам все графики открывал по чистому подготовленному шаблону (как самый первый график) и на него уже наносил всё, что задействовано и не скрыто с помощью TesterHideIndicators().

UPD: Попробовал добавить индикатор (через iCustom()) к графику, оформление которого хочу изменить, чтобы со стороны индикатора влезть в свойства графика. Оказалось, что индикатор с любого графика возвращает ChartID() = 12345. Это тот самый идентификатор, который принадлежит первому главному чарту. И все функции типа ChartSetInteger(), которым вместо идентификатора чарта можно передать 0, изменяют свойства не текущего (их) графика, а первого основного с id = 12345. Похоже, ChartID() тоже в тестере вообще не работает, а имеет заглушку, которая всегда со всех чартов выдаёт 12345. И нигде в документации почему-то не сказано про ограничения в работе тестере многих функций. Ну как так?

Разработчики, прошу, сделайте все открываемые при визуальном тестировании графики с основным шаблоном tester.tpl (ну не зря же вы его вообще придумали)!

Ну так и примените шаблон tester.tpl. Ведь вы подготовили этот шаблон до того как…

А проблема так стара, что и говорить о ней уже не хочется. Я всё это уже прошёл. Толку ровно ноль… Ничего не сделают пока не запустят новый тестер. Да и то не факт, что будет сделано. 

 
Alexey Viktorov #:

Ну так и примените шаблон tester.tpl. Ведь вы подготовили этот шаблон до того как…

А проблема так стара, что и говорить о ней уже не хочется. Я всё это уже прошёл. Толку ровно ноль… Ничего не сделают пока не запустят новый тестер. Да и то не факт, что будет сделано. 

Мало того, что пустой тестерный шаблон затрёт уже размещённые со стороны советника индикаторы, так ещё нужно каждый раз делать это при запуске визуализации, бред же. А каждый запуск может отличаться по набору/настройкам размещённых на чарте индикаторов.

И ещё удивляет, если это такая старая проблема, почему поиск ни по документации (ну ладно, с ней явно проблемы), ни по форуму ничего не дал? И ведь решение со стороны разработчиков примитивнейшее (tester.tpl на все открываемые чарты!), даже плевать на нерабочие функции работы с чартами. Ещё и стандартная тема эта зелёная такое убожество...

 
Ilya Filatov #:

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

Да, это явный баг. Представителям MQ о нем сообщалось. Но у них другие приоритеты в разработке.