Вопросы от начинающих MQL5 MT5 MetaTrader 5 - страница 681
Вы упускаете торговые возможности:
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Регистрация
Вход
Вы принимаете политику сайта и условия использования
Если у вас нет учетной записи, зарегистрируйтесь
Привычка неинициализировать переменные - пагубна, так как такое поведение часто приводит к появлению "черного лебедя". Поэтому нужно брать за правило - создал переменную, сразу инициализируй.
Стоп, стоп, стоп. Давайте Вы не будете путать "брать за правило" и "обязательно в OnInit() нужно явно проинициализировать (присвоить значения) этим переменным" - что является откровенной неправдой!
Вы можете не инициализировать переменные - деньги Ваши.
отчасти Владимир прав.
приведу пример,
когда-то, не помню когда, я объявил переменную
bool STOP;
и собственно в OnTick ее отрабатывал.
по умолчанию, bool должен быть false
я делал так:
{
if(!STOP) {Print("STOP");return;}
}
Но данный код не срабатывал, потому, что я явно не указал что bool STOP=false;
Эта ситуация у меня возникла единожды, на каком -то билде, потом я ее не воспроизводил (был какой-то глюк с билдом, или чего еще, - непонятно). но попался на такой ошибке.
отчасти Владимир прав.
Привычка неинициализировать переменные - пагубна, так как такое поведение часто приводит к появлению "черного лебедя". Поэтому нужно брать за правило - создал переменную, сразу инициализируй.
Можно терять значения переменных при переключении таймфрейма при их инициализации в 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() - отсюда возможные косяки в логике работы программы.
Если не учитывать:
Init
Сразу же после того, как клиентский терминал загрузит программу (эксперт или пользовательский индикатор) и запустит процесс инициализации глобальных переменных, будет послано событие Init, которое обрабатывается функцией OnInit(), если она есть. Это событие также генерируется после смены финансового инструмента и/или периода графика, после перекомпиляции программы в редакторе MetaEditor, после смены входных параметров из окна настройки эксперта или пользовательского индикатора. Советник также инициализируется после смены счета. Для скриптов событие Init не генерируется.
то можно накрутить что угодно.
Если не учитывать:
Init
Сразу же после того, как клиентский терминал загрузит программу (эксперт или пользовательский индикатор) и запустит процесс инициализации глобальных переменных, будет послано событие Init, которое обрабатывается функцией OnInit(), если она есть. Это событие также генерируется после смены финансового инструмента и/или периода графика, после перекомпиляции программы в редакторе MetaEditor, после смены входных параметров из окна настройки эксперта или пользовательского индикатора. Советник также инициализируется после смены счета. Для скриптов событие Init не генерируется.
то можно накрутить что угодно.
Я про Фому, он про Ерёму...
Вот как тут общаться в такой ситуации?
Я говорю о пагубной привычке бездумно инициализировать глобальные переменные в OnInit(), Вы же мне справку пхаете, которую я знаю.
При этом вы в безапелляционной форме навязываете свою пагубную привычку всем новичкам. Поколение ЕГЭ плодите? Клоны не думающих, но слепо движущихся за своим сенсеем?
Я про Фому, он про Ерёму...
Вот как тут общаться в такой ситуации?
Я говорю о пагубной привычке бездумно инициализировать глобальные переменные в OnInit(), Вы же мне справку пхаете, которую я знаю.
При этом вы в безапелляционной форме навязываете свою пагубную привычку всем новичкам. Поколение ЕГЭ плодите? Клоны не думающих, но слепо движущихся за своим сенсеем?
"Бездумно инициализировать глобальные переменные" - это Ваши слова и Ваша выдумка. Если делать бездумно - то только один совет: "Деньги Ваши, творите что хотите".
Нет. Это ВАШИ слова. И ваше "научение" вопрошающему:
Так делать нельзя:
int TimeScale=50,TimeInMemory,TimeNow;
точнее после такого объявления обязательно в OnInit() нужно явно проинициализировать (присвоить значения) этим переменным.
Метод Sell также обложите проверками, вроде
" (",trade.ResultRetcodeDescription(),")");
А ещё может быть одна загвоздка - утром, при открытии торгов, торги идут не сразу, не с первой секунды - вот в этот момент возможны ошибки.
А потом он, следуя вашим, мягко говоря, бездумным советам, будет думать - от чего это он деньги свои потерял...
Это ВЫ говорите, что после объявления переменной без явной её инициализации, нужно обязательно в OnInit() явно её проинициализировать.
Результат такого бездумного действа вы могли видеть при запуске приложенного мною тестового советника - потеря значения переменной при смене таймфрейма.
ЗЫ. Имейте мужество признавать свои ошибки и недочёты.
ЗЗЫ. Так что мои слова о бездумности предлагаемой вами слепой обязательной инициализации в OnInit() - соответствуют моему утверждению, что вы предлагаете бездумно тупо инициализировать глобальные переменные в OnInit()