Инициализация глобальных переменных программы и другие полезные знания.

 

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

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

Код тестового советника:

//+------------------------------------------------------------------+
//|                                    exTextInitGlobalVariables.mq5 |
//|              Copyright 2015, Artem A. Trishkin, Skype artmedia70 |
//|                       https://login.mql5.com/ru/users/artmedia70 |
//+------------------------------------------------------------------+
#property copyright "Copyright 2015, Artem A. Trishkin, Skype artmedia70"
#property link      "https://login.mql5.com/ru/users/artmedia70"
#property version   "1.00"
//--- input parameters
input int      TestInput=0;            // Внешняя переменная
int testInputGlobal=TestInput;         // Значение внешней переменной, присвоенное на глобальном уровне
int testInputInit;                     // Значение внешней переменной, присвоенное в OnInit()

//--- global variables
int   TestValueGlobalNoInitNo;         // Не инициализирована значением нигде
int   TestValueGlobalYesInitNo=0;      // Инициализирована значением 0 при объявлении, не инициализирована в OnInit()
//---
int   TestValueGlobalNoInitYes;        // Не инициализирована значением при объявлении, инициализирована в OnInit() нулём
int   TestValueGlobalYesInitYes=0;     // Инициализирована нулём и при объявлении, и в OnInit()
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//---
   testInputInit=TestInput;
   TestValueGlobalNoInitYes=0;
   TestValueGlobalYesInitYes=0;
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---
  
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
//---
   testInputInit++;
   testInputGlobal++;
   TestValueGlobalNoInitNo++;
   TestValueGlobalNoInitYes++;
   TestValueGlobalYesInitNo++;
   TestValueGlobalYesInitYes++;
   Comment
         (
         "\n"+"============================================="+
         "\n"+"Значение внешней переменной TestInput(",TestInput,"), присвоенное в OnInit(): ",(string)testInputGlobal+
         "\n"+"Значение внешней переменной TestInput(",TestInput,"), присвоенное на глобальном уровне: ",(string)testInputGlobal+
         //---
         "\n"+"============================================="+
         "\n"+"Не инициализирована значением нигде (неявная инициализация нулём): ",(string)TestValueGlobalNoInitNo+
         "\n"+"Инициализирована значением 0 при объявлении, не инициализирована в OnInit(): "+(string)TestValueGlobalYesInitNo+
         //---
         "\n"+"============================================="+
        "\n"+"Не инициализирована значением при объявлении, инициализирована в OnInit() нулём: "+(string)TestValueGlobalNoInitYes+
         "\n"+"Инициализирована нулём и при объявлении, и в OnInit(): "+(string)TestValueGlobalYesInitYes
         );
  }
//+------------------------------------------------------------------+

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

 
Полезно будет не словами объяснять, а приводить пример: была смена таймфрейма, вот распринтовка из вкладки "Эксперты". Был первый запуск/загрузка терминала/смена символа/смена торгового счёта...
 
Vladimir Karputov:
Полезно будет не словами объяснять, а приводить пример: была смена таймфрейма, вот распринтовка из вкладки "Эксперты". Был первый запуск/загрузка терминала/смена символа/смена торгового счёта...
Тут и так всё предельно понятно и прозрачно. Без прикладывания логов терминала и выкладывания параметров системы.
 
Ссылка на раздел документации: https://www.mql5.com/ru/docs/basis/variables/global
Документация по MQL5: Основы языка / Переменные / Глобальные переменные
Документация по MQL5: Основы языка / Переменные / Глобальные переменные
  • www.mql5.com
Основы языка / Переменные / Глобальные переменные - справочник по языку алгоритмического/автоматического трейдинга для MetaTrader 5
 
Artyom Trishkin:
Тут и так всё предельно понятно и прозрачно. Без прикладывания логов терминала и выкладывания параметров системы.
Вы тему зачем создали? Показать различия поведения переменных. Вот и покажите и осветите всевозможные случаи. Без этого информативность нулевая.
 
Vladimir Karputov:
Вы тему зачем создали? Показать различия поведения переменных. Вот и покажите и осветите всевозможные случаи. Без этого информативность нулевая.

Для вас.

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

Я показал.

 
Artyom Trishkin:

Для вас.

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

А Вы подумали о тех, кто потребляет информацию просто читая, без запуска терминала? Вот видите издать громкий звук оказывается очень просто и круто, но как только приходит понимание, что нужно немного больше - потратить время, привести примеры, сравнить, сделать выводы - вот здесь сразу сдуваемся.
 
Vladimir Karputov:
А Вы подумали о тех, кто потребляет информацию просто читая, без запуска терминала? Вот видите издать громкий звук оказывается очень просто и круто, но как только приходит понимание, что нужно немного больше - потратить время, привести примеры, сравнить, сделать выводы - вот здесь сразу сдуваемся.

Вы решили меня потроллить?

Однако - не очень достойное поведение для модератора.

Не засоряйте пожалуйста лишним спамом мою ветку. Есть что сказать по делу - говорите, нету - пройдите пожалуйста мимо.

 
Vladimir Karputov:
А Вы подумали о тех, кто потребляет информацию просто читая, без запуска терминала? Вот видите издать громкий звук оказывается очень просто и круто, но как только приходит понимание, что нужно немного больше - потратить время, привести примеры, сравнить, сделать выводы - вот здесь сразу сдуваемся.

Владимир, зачем вы сейчас троллите полезную для сообщества тему?

Артём сделал программу тестовую. Каждый её может запустить и проверить во всех режимах, которые вы указали. И для этого совсем не обязательно писать и расписывать те выводы, которые вы ожидаете.

Мало того, если вы видите, что чего-то не хватает для информативности -- так добавьте сами.

Далее, если вы с ним не согласны, так обоснуйте своё несогласие.

Эта тема возникла после вашего неверного вывода здесь:

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

Вопросы от начинающих

Vladimir Karputov, 2016.11.29 07:46

Так делать нельзя:

bool TimeFlag,FLG;
int TimeScale=50,TimeInMemory,TimeNow;

точнее после такого объявления обязательно в OnInit() нужно явно проинициализировать (присвоить значения) этим переменным.

Метод Sell также обложите проверками, вроде

trade.ResultRetcode(),
            " (",trade.ResultRetcodeDescription(),")");

А ещё может быть одна загвоздка - утром, при открытии торгов, торги идут не сразу, не с первой секунды - вот в этот момент возможны ошибки.

 
Artyom Trishkin:
 

Код тестового советника:

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

Господа, прекращайте перебранку.

Давайте разберемся.

Выкопировка принтов с журнала есть?

Замените Comment на Print

 
Andrey F. Zelinsky:

Владимир, зачем вы сейчас троллите полезную для сообщества тему?

Артём сделал программу тестовую. Каждый её может запустить и проверить во всех режимах, которые вы указали. И для этого совсем не обязательно писать и расписывать те выводы, которые вы ожидаете.

Мало того, если вы видите, что чего-то не хватает для информативности -- так добавьте сами.

Далее, если вы с ним не согласны, так обоснуйте своё несогласие.

Эта тема возникла после вашего неверного вывода здесь:

Вы с Артёмом любите выкусывать контент. Сказанное относилось к конкретному коду. И без инициализации код работал (стартовал) в зеркальном отражении.
Причина обращения: