В каких случаях код причины деинициализации = 6 (=REASON_ACCOUNT)?

 

В описании языка говорится, что этот код выводится, когда активирован другой счет.

Если в одном терминале заведены несколько счетов от разных ДЦ,

то при переключении между этими счетами должен выводиться этот код или нет?

Переключаю счета. Код не выводится. Что понимается под словосочетанием Активирован другой счет?


Так В каких случаях код причины деинициализации = 6 (=REASON_ACCOUNT)?

Метатрейдер билд 215.

 
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().

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

 
nen:

В описании языка говорится, что этот код выводится, когда активирован другой счет.

Если в одном терминале заведены несколько счетов от разных ДЦ,

то при переключении между этими счетами должен выводиться этот код или нет?

Переключаю счета. Код не выводится. Что понимается под словосочетанием Активирован другой счет?


Так В каких случаях код причины деинициализации = 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;}
}

...

}


эта конструкция не работает. При смене таймфрейма работает. При смене счета не работает.

 
nen:

Я смотрю на вкладке Эксперты. Там эти коды выводятся:

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, с твоим примером понятно. Попробую так сделать. О результатах напишу.

 
SK. писал (а):
Причём, наблюдалась какая-то (до конца не выявленная) закономерность: при первом переключении всё работало как должно, а при последующих - деинит не исполнялся. Была также какая-то зависимость от ДЦ. На одних ДЦ работало, на других нет. Попробуйте исполнить Ваш код сразу после включения терминала на счетах надёжных ДЦ. Эта ошибка теряющаяся. Нужно немного поэкспериментировать.
Выделенного жирным шрифтом происходить не должно. Это говорит о каких-то недоработках. Чьих недоработках? Не понятно. Работа функции UninitializeReason() должна быть одинаковой для всех кодов деинициализации. Если для каких-то кодов эта функция как-то по-другому работает, то это должно быть отражено в описании. Иначе мы имеем дело с "самоделкой", программой, сделанной на коленке в свободное от основной работы время.
 
nen:

Rosh, с твоим примером понятно. Попробую так сделать. О результатах напишу.

Я так понял, что функция RefreshAccountInfo() в программе Specification.mq4 подменяет работу функции UninitializeReason() в случае, когда происходит смена счета.

То есть это говорит о том, что в функции UninitializeReason() значение 6 не работает или работает неправильно.

С помощью функций, подобных RefreshAccountInfo(), латаются ошибки языка mql4.

Это не радует.

 
Просто не происходит деинициализация индикатора.
 
Rosh:
Просто не происходит деинициализация индикатора.

В таком случае из описания:

int UninitializeReason( )
Возвращает код причины завершения экспертов, пользовательских индикаторов и скриптов. Возвращаемые значения могут быть одним из кодов деинициализации. Эту функцию можно также вызывать в функции init() для анализа причин деинициализации предыдущего запуска.
Пример:
  // пример
  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 UninitializeReason( )
Возвращает код причины завершения экспертов, пользовательских индикаторов и скриптов. Возвращаемые значения могут быть одним из кодов деинициализации. Эту функцию можно также вызывать в функции init() для анализа причин деинициализации предыдущего запуска.
Пример:
  // пример
  int deinit()
    {
     switch(UninitializeReason())
       {
        case REASON_CHARTCLOSE:
        case REASON_REMOVE:      CleanUp(); break;    // очистка и освобождение ресурсов.
        case REASON_RECOMPILE:
        case REASON_CHARTCHANGE:
        case REASON_PARAMETERS:
       }
     //...
    }

Коды причины деинициализации, возвращаемые функцией UninitializeReason(). Mогут иметь любые из следующих значений:

Константа Значение Описание
0 Скрипт самостоятельно завершил свою работу
REASON_REMOVE 1 Программа удалена с графика
REASON_RECOMPILE 2 Программа перекомпилирована
REASON_CHARTCHANGE 3 Символ или период графика был изменен
REASON_CHARTCLOSE 4 График закрыт
REASON_PARAMETERS 5 Входные параметры были изменены пользователем

 
И не вводить людей в заблуждение.