int init() { int Reason = UninitializeReason(); switch (Reason) // В зависимости от кода деинициализации { case 0: // Скрипт самостоятельно завершил свою работу case 1: // Программа удалена с графика case 2: // Программа перекомпилирована break; case 6: // Активирован другой счет Alert("Reason = ",Reason); Acc_New = true; // Активирован другой счет break; case 3: // Символ или период графика был изменен New_TimeFrame = true; // Юзер переключил ТФ break; case 5: // Входные параметры были изменены польз. Extern_New = true; // Настройки обновлены пользователем break; } }
В моём коде такая конструкция успешно работает. 6 - это то, о чём Вы спрашиваете. Это же работает и в deinit().
Необходимо обратить внимание на очерёдность поступления информации. С момента переключения счёта сначала обновляются переменные окружения, а (как бы) потом происходит собственно соединение со счётом. В индикаторе и обычном эксперте, возможно, это и не видно. Я использую зацикленный эксперт, здесь эта проблема добавляет хлопот.
В описании языка говорится, что этот код выводится, когда активирован другой счет.
Если в одном терминале заведены несколько счетов от разных ДЦ,
то при переключении между этими счетами должен выводиться этот код или нет?
Переключаю счета. Код не выводится. Что понимается под словосочетанием Активирован другой счет?
Так В каких случаях код причины деинициализации = 6 (=REASON_ACCOUNT)?
Метатрейдер билд 215.
В индикаторе при смене счета деинициализация и новая инициализация не происходят. Вот пример обработки события "смена счета" в индикаторе - Specification
Я смотрю на вкладке Эксперты. Там эти коды выводятся:
2008.04.15 15:10:36 ATL_v10 EURUSD,M15: uninit reason 2 - произошла перекомпиляция.
2008.04.15 15:24:15 ATL_v10 EURUSD,M15: uninit reason 3 - сменился таймфрейм.
А вот код 6 ни разу не видел, чтобы выводился.
Также и в модуле
init()
{
Reason=UninitializeReason();
switch(Reason)
{
case 3: {chartchange=2; break;}
case 6: {chartchange=1; break;}
}
...
}
эта конструкция не работает. При смене таймфрейма работает. При смене счета не работает.
Я смотрю на вкладке Эксперты. Там эти коды выводятся:
2008.04.15 15:10:36 ATL_v10 EURUSD,M15: uninit reason 2 - произошла перекомпиляция.
2008.04.15 15:24:15 ATL_v10 EURUSD,M15: uninit reason 3 - сменился таймфрейм.
А вот код 6 ни разу не видел, чтобы выводился.
Также и в модуле
init()
{
Reason=UninitializeReason();
switch(Reason)
{
case 3: {chartchange=2; break;}
case 6: {chartchange=1; break;}
}
...
}
эта конструкция не работает. При смене таймфрейма работает. При смене счета не работает.
Кстати, я вспомнил. Была и у меня такая проблема. Не могу сказать как сейчас, а в предыдущих билдах не всегда исполнялся деинит. Причём, наблюдалась какая-то (до конца не выявленная) закономерность: при первом переключении всё работало как должно, а при последующих - деинит не исполнялся. Была также какая-то зависимость от ДЦ. На одних ДЦ работало, на других нет.
Попробуйте исполнить Ваш код сразу после включения терминала на счетах надёжных ДЦ.
Эта ошибка теряющаяся. Нужно немного поэкспериментировать.
Rosh, с твоим примером понятно. Попробую так сделать. О результатах напишу.
Rosh, с твоим примером понятно. Попробую так сделать. О результатах напишу.
Я так понял, что функция RefreshAccountInfo() в программе Specification.mq4 подменяет работу функции UninitializeReason() в случае, когда происходит смена счета.
То есть это говорит о том, что в функции UninitializeReason() значение 6 не работает или работает неправильно.
С помощью функций, подобных RefreshAccountInfo(), латаются ошибки языка mql4.
Это не радует.
Просто не происходит деинициализация индикатора.
В таком случае из описания:
Пример: // пример int deinit() { switch(UninitializeReason()) { case REASON_CHARTCLOSE: case REASON_REMOVE: CleanUp(); break; // очистка и освобождение ресурсов. case REASON_RECOMPILE: case REASON_CHARTCHANGE: case REASON_PARAMETERS: case REASON_ACCOUNT: StoreData(); break; // подготовка к рестарту. } //... } |
необходмо убрать соответствующую строчку. И описание должно быть таким:
Пример: // пример int deinit() { switch(UninitializeReason()) { case REASON_CHARTCLOSE: case REASON_REMOVE: CleanUp(); break; // очистка и освобождение ресурсов. case REASON_RECOMPILE: case REASON_CHARTCHANGE: case REASON_PARAMETERS: } //... } |
Коды причины деинициализации, возвращаемые функцией UninitializeReason(). Mогут иметь любые из следующих значений:
|
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Вы принимаете политику сайта и условия использования
В описании языка говорится, что этот код выводится, когда активирован другой счет.
Если в одном терминале заведены несколько счетов от разных ДЦ,
то при переключении между этими счетами должен выводиться этот код или нет?
Переключаю счета. Код не выводится. Что понимается под словосочетанием Активирован другой счет?
Так В каких случаях код причины деинициализации = 6 (=REASON_ACCOUNT)?
Метатрейдер билд 215.