Вопросы от начинающих MQL5 MT5 MetaTrader 5 - страница 681

 
post_ek:
Так можно торговать акциями МТ5 в Открытии или нет?
Можно! Только будут либо акции, либо фьючерсы (бесплатно дается только одна платформа МТ5). За вторую - нужно будет ежемесячно платить. Насколько я помню - так. Посмотрите подробности в личном кабинете Открытия.
 
Alexey Kozitsyn:

Владимир, не путайте человека!

Из документации:

https://www.mql5.com/ru/docs/basis/variables/global
Привычка неинициализировать переменные - пагубна, так как такое поведение часто приводит к появлению "черного лебедя". Поэтому нужно брать за правило - создал переменную, сразу инициализируй.
 
Vladimir Karputov:
Привычка неинициализировать переменные - пагубна, так как такое поведение часто приводит к появлению "черного лебедя". Поэтому нужно брать за правило - создал переменную, сразу инициализируй.
Стоп, стоп, стоп. Давайте Вы не будете путать "брать за правило" и "обязательно в OnInit() нужно явно проинициализировать (присвоить значения) этим переменным" - что является откровенной неправдой!
 
Alexey Kozitsyn:
Стоп, стоп, стоп. Давайте Вы не будете путать "брать за правило" и "обязательно в OnInit() нужно явно проинициализировать (присвоить значения) этим переменным" - что является откровенной неправдой!
Вы можете не инициализировать переменные - деньги Ваши.
 
Vladimir Karputov:
Вы можете не инициализировать переменные - деньги Ваши.
Еще раз повторю. Не путайте возможности с обязанностями!
 

отчасти Владимир прав. 

приведу пример,

когда-то, не помню когда, я объявил переменную

bool STOP;

 

и собственно в OnTick ее отрабатывал.

по умолчанию, bool должен быть false 

 я делал так:

void OnTick ()

{

if(!STOP) {Print("STOP");return;}

}

 

Но данный код не срабатывал, потому, что я явно не указал что  bool STOP=false;

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

 
Vladislav Andruschenko:

отчасти Владимир прав. 

Я ни в коем случае не призываю оставлять переменные не инициализированными. Но, когда что-то советуешь новичку не нужно говорить, что твой совет - единственное верное решение, тем более, что это не так.
 
Vladimir Karputov:
Привычка неинициализировать переменные - пагубна, так как такое поведение часто приводит к появлению "черного лебедя". Поэтому нужно брать за правило - создал переменную, сразу инициализируй.

Можно терять значения переменных при переключении таймфрейма при их инициализации в 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
         );
  }
//+------------------------------------------------------------------+
 
Artyom Trishkin:

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

Если не учитывать:

Init

Сразу же после того, как клиентский терминал загрузит программу (эксперт или пользовательский индикатор) и запустит процесс инициализации глобальных переменных, будет послано событие Init, которое обрабатывается функцией OnInit(), если она есть. Это событие также генерируется после смены финансового инструмента и/или периода графика, после перекомпиляции программы в редакторе MetaEditor, после смены входных параметров из окна настройки эксперта или пользовательского индикатора. Советник также инициализируется после смены счета. Для скриптов событие Init не генерируется.

то можно накрутить что угодно. 

 
Vladimir Karputov:

Если не учитывать:

Init

Сразу же после того, как клиентский терминал загрузит программу (эксперт или пользовательский индикатор) и запустит процесс инициализации глобальных переменных, будет послано событие Init, которое обрабатывается функцией OnInit(), если она есть. Это событие также генерируется после смены финансового инструмента и/или периода графика, после перекомпиляции программы в редакторе MetaEditor, после смены входных параметров из окна настройки эксперта или пользовательского индикатора. Советник также инициализируется после смены счета. Для скриптов событие Init не генерируется.

то можно накрутить что угодно. 

Я про Фому, он про Ерёму...

Вот как тут общаться в такой ситуации?

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

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