Ошибки, баги, вопросы - страница 435

 
voix_kas:

Вобще, забавно выходит.
По наитию, считал, что функция OnDenit - является своего рода деструктором, а OnInit - конструктором эксперта.

По факту же выходит, что OnInit - событие многократное (в пределах жизни эксперта). Непонятно тогда, зачем явно генерировать событие OnDenit, если известно, что советник не завершает свою работу (например, в случае с изменением периода графика)?

При смене символов работает горячая перезагрузка экспертов ради их быстрого старта и сохранения информационной базы предыдущей жизни.

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

И еще вопрос.
Причина деинициализации REASON_CHARTCHANGE - Символ или период графика был изменен.
Объясните, пожалуйста, каким образом можно изменить символ графика, не удалив эксперта на нем?

В режиме горячего рестарта.
 

Yedelkin, Interesting, Renat
Благодарю за разъяснения.

Думаю, имеет смысл также явно прописать в документации перечень "горячих" и "холодных" рестартов советника.

В отсутствии переинициализации при каждом OnInit, для мультивалютника придется использовать "костыль" в виде глобального флага. :(
Чуть позже выложу код. 

 
Interesting:

Эксперт в любом случае при нормальной инициализации не удалится, просто ему при определенных настройках терминала разрешат торговать (но для этого эксперт должен понимать что символ то поменяли...).

Вот кстати, напомнили. Давно уже хочу обратиться к разработчикам на тему упомянутых настроек.

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

Я бы не хотел, чтоб мои советники прекращали торговать при смене таймфрейма - это совершенно ни к чему - всё равно они обрабатывают каждый тик и никаких проблем с этим нету.

А вот смена символа принципиально важна. Эту блокировку я бы хотел оставить... но сейчас эти две регулировки почему-то синхронизированы и регулируются совместно.

Я решаю эту проблему программно (храню первоначальный символ в статик-переменной и контролирую изменения в ините). Но лучше бы это можно было блокировать на уровне терминала.

Ещё лучше было бы регулировать галками саму возможность переключить таймфрейм или символ при работающем эксперте. Зачем прекращать торговлю по глупости-забывчивости?

Т.е. гораздо лучше блокировать переключение тайфрейма и/или символа (отдельно!), если в настройках указано, что это запрещено, когда на графике висит эксперт.

// С выдачей соответствующего сообщения при попытке.

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

 

MetaDriver:

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

Я бы не хотел, чтоб мои советники прекращали торговать при смене таймфрейма - это совершенно ни к чему - всё равно они обрабатывают каждый тик и никаких проблем с этим нету.


Идею поддержу, следует сделать две галки и разделение в кодах причин деинициализации (так будет удобно).

А вот с блокированием возможности смены ТФ, не знаю как (на счет символа), так это на мой взгляд перебор.

Документация по MQL5: Стандартные константы, перечисления и структуры / Именованные константы / Причины деинициализации
Документация по MQL5: Стандартные константы, перечисления и структуры / Именованные константы / Причины деинициализации
  • www.mql5.com
Стандартные константы, перечисления и структуры / Именованные константы / Причины деинициализации - Документация по MQL5
 
MetaDriver:

Вот кстати, напомнили. Давно уже хочу обратиться к разработчикам на тему упомянутых настроек.

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

Да, похоже, что зря объединили условие смены символа и таймфрейма.

Я тоже за то, чтобы их разделить на 2 условия. Тикет в сервисдеск уже поставил.

 

Собственно, прилагаю код определения рабочих инструментов для мультивалютника. Критика приветствуется. :)

input uint   inTimeToRescan = 3600; // Интервал времени для принудительного пересканирования рабочих инструментов, в секундах
input string inWorkSymbols  = "USDCHF; GBPUSD; EURUSD; USDJPY; USDCAD; AUDUSD; EURGBP; EURAUD; EURCHF; EURJPY; GBPJPY; GBPCHF"; // Рабочие инструменты


bool Initialize;


int OnInit() {
  //...
  Initialize = true;
  //...
}


void OnTick() {
  static ulong  LastScan = 0;
  if ((ulong)TimeCurrent() - LastScan >= inTimeToRescan) Initialize = true;

  static string Symbol[];
//  static int    Forecast[];
//  static int    Volatile[];

  if (Initialize) {
    Comment("Опрос рабочих инструментов...");
    int SymbolCount_1 = 0;
    for (int i = 0; i < SymbolsTotal(false); i++)
      if (StringFind(inWorkSymbols, SymbolName(i, false)) != -1)
        SymbolCount_1++;

    if (!SymbolCount_1) return;
    if (ArrayResize(Symbol, SymbolCount_1) != SymbolCount_1) return;

    int SymbolCount_2 = 0;
    for (int i = 0; i < SymbolsTotal(false); i++)
      if (StringFind(inWorkSymbols, SymbolName(i, false)) != -1)
        Symbol[SymbolCount_2++] = SymbolName(i, false);

    if (SymbolCount_1 != SymbolCount_2) return;

    //if (ArrayResize(Forecast, SymbolCount_1) != SymbolCount_1) return;
    //if (ArrayResize(Volatile, SymbolCount_1) != SymbolCount_1) return;

    Initialize = false;
  }
  //...
}

Советник каждый тик пытается получить перечень рабочих инструментов.
Обновление актуализания перечня рабочих инструментов наступает при двух условиях: 1) срабатывания OnInit, 2) по прошествию времени, заложенного во входной параметр советника.
Как мы видим, для обнуружения очередной инициализации применен "костыль" в виде глобальной переменной (bool Initialize). Если бы была переинициализация статики, этого бы не потребовалось.

Глобальные переменные считаю злом, как и в свое время оператор безусловного перехода "goto".

 
voix_kas:

В отсутствии переинициализации при каждом OnInit, для мультивалютника придется использовать "костыль" в виде глобального флага. :(

Лучше изначально писать код аккуратно, не оставляя костылей в виде промежуточных статических переменных.

Как решение прячьте такие данные внутрь класса. Умер класс - умерло и окружение.

А на глобальном уровне оставляйте минимум статических переменных.

Документация по MQL5: Основы языка / Переменные / Статические переменные
Документация по MQL5: Основы языка / Переменные / Статические переменные
  • www.mql5.com
Основы языка / Переменные / Статические переменные - Документация по MQL5
 
voix_kas:

Собственно, прилагаю код определения рабочих инструментов для мультивалютника. Критика приветствуется. :)

Как совет - вынесите Symbol на глобальный уровень и зануляйте ее в OnInit. Если массив пустой, значит пора инициализироваться.

И никаких дополнительных флагов.

 
Renat:

Как совет - вынесите Symbol на глобальный уровень и зануляйте ее в OnInit. Если массив пустой, значит пора инициализироваться.

И никаких дополнительных флагов.

Наверное, я параноик. Не люблю публичные (глобальные) переменные. Считаю это муветоном.
Можно ли каким образом внутри OnTick определять срабатывание OnInit?
Например, внутри OnTick объявлять статик переменную, которая хранит количество инициализаций советника (если на такое или аналогичное свойство присутствует в MQL5)?

 
voix_kas:

Глобальные переменные считаю злом, как и в свое время оператор безусловного перехода "goto".

Наверное, я параноик. Не люблю публичные (глобальные) переменные. Считаю это муветоном.

1. С чего это? От вредных симптомов нужно изваляться, причем решительно.

2. Не следует называть переменные, массивы и прочие вещи созвучно или также ключевым словам языка (но уж очень в глаза бросается массив "Symbol", фиг потом в коде разберешь массив это или что иное).

Renat:

Как решение прячьте такие данные внутрь класса. Умер класс - умерло и окружение.

А на глобальном уровне оставляйте минимум статических переменных.

Хорошее предложение. Пора переходить уже на ООП... :)
Причина обращения: