Как перехватить измененный параметр эксперта в OnDeinit ?

Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий
Malik Arykov
65
Malik Arykov  
// Запускаю эксперт Test01 (этот текст)
// Жму F7. Изменяю параметр
// Хочу получить измененный параметр в OnDeinit
// Однако параметр не изменился. Что я не понимаю?

input int param = 0; // Параметр эксперта

int OnInit()  {
    Print(__FUNCTION__);
    return(INIT_SUCCEEDED);
}

void OnDeinit(const int reason) { // юзер изменил параметры
    Print(__FUNCTION__, " reason=", reason);
    if (reason == REASON_PARAMETERS) {
        Print("Параметр=", param);
    }
}


Igor Zakharov
6656
Igor Zakharov  

Новое значение param будет известно после OnDeinit(), т.е. когда эксперт перезапустится - эксперт увидит его в OnInit следующего запуска). Текущий OnDeinit работает со старыми параметрами.

Сохраняйте старые значения (в файле, в глобальных переменных...) и сравнивайте с текущими в OnInit

Malik Arykov
65
Malik Arykov  
Igor Zakharov:

Сохраняйте старые значения (в файле, в глобальных переменных...) и сравнивайте с текущими в OnInit

Значение reason в OnDeint указывает, что юзер изменил параметры
По логике здесь можно увидеть изменения, однако фигвам (только после перезапуска)
В общем опять решение через костыль ;-) Глоб.переменные не нужны

input int param = 0; // Параметр эксперта
bool isParamChanged; // Признак изменения параметров юзером

int OnInit()  {
    Print(__FUNCTION__);
    if (isParamChanged) {
        Print("Новое значение=", param);
        isParamChanged = false;
    }
    return(INIT_SUCCEEDED);
}

void OnDeinit(const int reason) {
    Print(__FUNCTION__, " reason=", reason);
    if (reason == REASON_PARAMETERS) { // юзер изменил параметры
        Print("Старое значение=", param);
        isParamChanged = true;
    }
}
fxsaber
17576
fxsaber  
В эту памятку

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

Особенности языка mql5, тонкости и приёмы работы

fxsaber, 2017.11.30 09:48

Памятка

Действие/тип программыСмена ТФ или символаСмена счета
ИндикаторЗапуск OnDeinit и OnInit, объект глобального класса меняется (полная перезагрузка).Ничего не происходит, кроме обнуления prev_calculated.
СоветникЗапуск OnDeinit и OnInit, объект глобального класса не меняется.Запуск OnDeinit и OnInit, объект глобального класса меняется (полная перезагрузка).

следовало бы добавить и смену входных параметров.

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

Malik Arykov
65
Malik Arykov  

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

Можно, если объявить параметр как extern вместо input

extern int param = 0;
fxsaber
17576
fxsaber  
Malik Arykov:

Можно, если объявить параметр как extern вместо input

Только в MT4.

Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий