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

 
// Запускаю эксперт 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);
    }
}


 

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

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

 
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;
    }
}
 
В эту памятку

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

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

fxsaber, 2017.11.30 09:48

Памятка

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

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

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

 

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

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

extern int param = 0;
 
Malik Arykov:

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

Только в MT4.

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