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

[Удален]  
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(), Вы же мне справку пхаете, которую я знаю.

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

 
Artyom Trishkin:

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

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

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

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

"Бездумно инициализировать глобальные переменные" - это Ваши слова и Ваша выдумка. Если делать бездумно - то только один совет: "Деньги Ваши, творите что хотите".
 
Vladimir Karputov:
"Бездумно инициализировать глобальные переменные" - это Ваши слова и Ваша выдумка. Если делать бездумно - то только один совет: "Деньги Ваши, творите что хотите".

Нет. Это ВАШИ слова. И ваше "научение" вопрошающему:


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

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

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

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

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

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


А потом он, следуя вашим, мягко говоря, бездумным советам, будет думать - от чего это он деньги свои потерял...

Это ВЫ говорите, что после объявления переменной без явной её инициализации, нужно обязательно в OnInit() явно её проинициализировать.

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

ЗЫ. Имейте мужество признавать свои ошибки и недочёты.

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