Продолжаю изучать язык программирования MQL5. Немного доработал код, опубликованный ранее, и вот, что получилось:
inputstring Symbol_Main="EURUSD"; //Валютная пара, на которую ставим советникinputENUM_TIMEFRAMES Time_Frame=PERIOD_H1; //Таймфрейм, на который ставим советник//+------------------------------------------------------------------+//| Expert initialization function |//+------------------------------------------------------------------+intOnInit()
{
/* Определим график валютной пары и таймфрейм, на который будем устанавливать советник. *//* Если текущий график валютной пары и текущий таймфрейм совпадают со входными параметрами */if(_Symbol==Symbol_Main && _Period==Time_Frame)
{
/* выводим окно сообщений на торговом терминале и продолжаем работу советника */MessageBox("Работа советника разрешена! Продолжим!");
return(INIT_SUCCEEDED); //возвращаем для функции OnInit значение означающее "удачная инициализация"
}
/* Если текущий график валютной пары и текущий таймфрейм не совпадают со входными параметрами */if(_Symbol!=Symbol_Main && _Period!=Time_Frame)
{
/* выводим окно сообщений на торговом терминале и закрываем советник */MessageBox("Не совпадают валютная пара и таймфрейм! Выходим!");
return(INIT_FAILED); //возвращаем для функции OnInit значение означающее "неудачная инициализация"
}
/* Если текущий график валютной пары не совпадает со входным параметром */if(_Symbol!=Symbol_Main)
{
/* выводим окно сообщений на торговом терминале и закрываем советник */MessageBox("Не совпадает валютная пара! Выходим!");
return(INIT_FAILED); //возвращаем для функции OnInit значение означающее "неудачная инициализация"
}
/* Если текущий таймфрейм не совпадает со входным параметром */if(_Period!=Time_Frame)
{
/* выводим окно сообщений на торговом терминале и закрываем советник */MessageBox("Не совпадет таймфрейм! Выходим!");
return(INIT_FAILED); //возвращаем для функции OnInit значение означающее "неудачная инициализация"
}
return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
Появилось немного свободного времени и решил продолжить самообучение. Только вот вдруг неожиданно столкнулся с проблемой. Раньше, когда в своем советнике Trailing_Stop_(v.2).mq5 делал вот такой запрос на торговый сервер:
/* Создадим запрос на сервер и получим ответ с результатом */MqlTradeRequest request= {0};
MqlTradeResult result= {0};
никаких проблем при компиляции кода не было. Теперь компилятор выдает вот такую ошибку:
Появилось немного свободного времени и решил продолжить самообучение. Только вот вдруг неожиданно столкнулся с проблемой. Раньше, когда в своем советнике Trailing_Stop_(v.2).mq5 делал вот такой запрос на торговый сервер:
никаких проблем при компиляции кода не было. Теперь компилятор выдает вот такую ошибку:
Мы расширяем инициализирующие последовательности "{ ... }", в ближайшем билде будет разрешено использовать любое выражение, а не только константное.
Вместо с этим изменением, появится и граничение на использование констант для перечислений (как для обычного выражения): если константа не входит в перечисление, то будет выдана соответствующая ошибка.
Анализ существующих кодов показал, что часто неправильно используется последовательность из одного нуля - "{0}"
Например так:
MqlTradeRequest request={0};
Такая запись означает, выставить значение ноль для первого поля структуры и обнулить остальные поля.
Для приведённой выше строки кода, по новым правилам, будет выдана ошибка, т.к. первое поле имеет тип ENUM_TRADE_REQUEST_ACTIONS, перечисление, в котором отсутствует значение "0"
cannot convert 0 to enum 'ENUM_TRADE_REQUEST_ACTIONS'
Продолжаю самообучение языку программирования MQL5. Решил написать функцию для получения сигнала от индикатора ZigZag. Стал его досконально изучать и сразу появились вопросы. Во входных параметрах индикатора есть:
Продолжаю самообучение языку программирования MQL5. Решил написать функцию для получения сигнала от индикатора ZigZag. Стал его досконально изучать и сразу появились вопросы. Во входных параметрах индикатора есть:
Так как не силён в английском языке, поэтому приходится пользоваться Гугл переводчиком. Что даёт перевод в чистом виде:
Вопросы:
Если глубина, то глубина чего?
Если отклонение, то отклонение от чего, от какого параметра или величины?
Если шаг назад, то почему шаг назад? Разве он движется не вперёд?
Уважаемые специалисты, помогите разобраться!
С уважением, Владимир.
Элементарно - поиск в помощь, " Разве он движется не вперёд " - тут вся история движется назад!!! :-)
Depth это минимальное кол-во баров, на котором не будет второго максимума (минимума) меньше (больше) на Deviation пипсов, чем предыдущего, то есть расходиться ZigZag может всегда, а сходится (либо сдвинуться целиком) больше, чем на Deviation, ZigZag может только после Depth баров. Backstep это минимальное количество баров между максимумами (минимумами).
Depth это минимальное кол-во баров, на котором не будет второго максимума (минимума) меньше (больше) на Deviation пипсов, чем предыдущего, то есть расходиться ZigZag может всегда, а сходится (либо сдвинуться целиком) больше, чем на Deviation, ZigZag может только после Depth баров. Backstep это минимальное количество баров между максимумами (минимумами).
При тестировании одного советника столкнулся с проблемой. У него есть такой код функции инициализации советника:
//+------------------------------------------------------------------+//| Expert initialization function |//+------------------------------------------------------------------+intOnInit()
{
//--- достаточно ли количество баров для работыif(Bars(_Symbol,_Period)<60) // общее количество баров на графике меньше 60?
{
Alert("На графике меньше 60 баров, советник не будет работать!!");
return(-1);
}
//--- получить хэндл индикатора Bollinger Bands и DEMA
BolBandsHandle=iBands(NULL,PERIOD_M30,bands_period,bands_shift,deviation,PRICE_CLOSE);
demaHandle=iDEMA(NULL,PERIOD_D1,dema_period,0,PRICE_CLOSE);
//--- Нужно проверить, не были ли возвращены значения Invalid Handleif((BolBandsHandle<0) || (demaHandle<0))
{
Alert("Ошибка при создании индикаторов - номер ошибки: ",GetLastError(),"!!");
return(-1);
}
return(0);
}
2021.10.3113:19:25.752 Core 2 genetic pass (0, 288) tested with error "OnInit returned non-zero code -1"in0:00:00.0002021.10.3113:19:26.835 Core 2 genetic pass (0, 298) tested with error "OnInit returned non-zero code -1"in0:00:00.0002021.10.3113:19:26.921 Core 1 genetic pass (0, 42) tested with error "OnInit returned non-zero code -1"in0:00:00.0002021.10.3113:19:27.847 Core 2 genetic pass (0, 318) tested with error "OnInit returned non-zero code -1"in0:00:00.0002021.10.3113:19:27.848 Core 2 genetic pass (0, 326) tested with error "OnInit returned non-zero code -1"in0:00:00.0002021.10.3113:19:29.907 Core 2 genetic pass (0, 359) tested with error "OnInit returned non-zero code -1"in0:00:00.0002021.10.3113:19:29.907 Core 2 genetic pass (0, 371) tested with error "OnInit returned non-zero code -1"in0:00:00.0002021.10.3113:19:30.009 Core 1 genetic pass (0, 102) tested with error "OnInit returned non-zero code -1"in0:00:00.0002021.10.3113:19:30.009 Core 1 genetic pass (0, 105) tested with error "OnInit returned non-zero code -1"in0:00:00.0002021.10.3113:19:31.044 Core 1 genetic pass (0, 122) tested with error "OnInit returned non-zero code -1"in0:00:00.000
и т.д.
Выяснил, что проблема кроется в проверке хэндлов индикаторов Bollinger Bands и DEMA. В связи с этим появился вопрос - на что могут влиять эти ошибки и, что нужно изменить в коде, чтобы их устранить?
Есть ошибки, значит код не будет работать, как задумал автор. Надо разбираться. Код у Вас, Вам и карты в руки.
Из того кусочка, что Вы показали, вижу, что либо свечей меньше 60, либо хендл одного из индикаторов INVALID, значит параметры засылаете в него некорректные. Либо ошибки в другой части кода, которую я не вижу.
Для авторизации и пользования сайтом MQL5.com необходимо разрешить использование файлов Сookie.
Пожалуйста, включите в вашем браузере данную настройку, иначе вы не сможете авторизоваться.
Вы вошли в аккаунт. Двухфакторная аутентификация отключена. Настройте её заново и отсканируйте новый QR-код или продолжите с отключённой двухфакторной аутентификацией.
Всем удачной торговли и хорошего настроения!
Продолжаю изучать язык программирования MQL5. Немного доработал код, опубликованный ранее, и вот, что получилось:
Возможно, что кому-нибудь понадобится.
С уважением, Владимир.
Всем доброго дня и хорошего настроения!
Появилось немного свободного времени и решил продолжить самообучение. Только вот вдруг неожиданно столкнулся с проблемой. Раньше, когда в своем советнике Trailing_Stop_(v.2).mq5 делал вот такой запрос на торговый сервер:
никаких проблем при компиляции кода не было. Теперь компилятор выдает вот такую ошибку:
cannot convert 0 to enum 'ENUM_TRADE_REQUEST_ACTIONS' Trailing_Stop_(v.2).mq5 411 30
Если после request в фигурных скобках убираю ноль,
то тогда компилятор ошибку не выдает. Помогите, пожалуйста, разобраться с чем это может быть связано?
С уважением, Владимир.
Всем доброго дня и хорошего настроения!
Появилось немного свободного времени и решил продолжить самообучение. Только вот вдруг неожиданно столкнулся с проблемой. Раньше, когда в своем советнике Trailing_Stop_(v.2).mq5 делал вот такой запрос на торговый сервер:
никаких проблем при компиляции кода не было. Теперь компилятор выдает вот такую ошибку:
cannot convert 0 to enum 'ENUM_TRADE_REQUEST_ACTIONS' Trailing_Stop_(v.2).mq5 411 30
Если после request в фигурных скобках убираю ноль,
то тогда компилятор ошибку не выдает. Помогите, пожалуйста, разобраться с чем это может быть связано?
С уважением, Владимир.
Да, теперь ноль не пишите для обнуления.
Форум по трейдингу, автоматическим торговым системам и тестированию торговых стратегий
Особенности языка mql5, тонкости и приёмы работы
Ilyas, 2021.05.28 18:18
Мы расширяем инициализирующие последовательности "{ ... }", в ближайшем билде будет разрешено использовать любое выражение, а не только константное.
Вместо с этим изменением, появится и граничение на использование констант для перечислений (как для обычного выражения): если константа не входит в перечисление, то будет выдана соответствующая ошибка.
Анализ существующих кодов показал, что часто неправильно используется последовательность из одного нуля - "{0}"
Например так:
Такая запись означает, выставить значение ноль для первого поля структуры и обнулить остальные поля.
Для приведённой выше строки кода, по новым правилам, будет выдана ошибка, т.к. первое поле имеет тип ENUM_TRADE_REQUEST_ACTIONS, перечисление, в котором отсутствует значение "0"
Правильно будет так:
MqlTradeRequest request={};Да, теперь ноль не пишите для обнуления.
Спасибо, Владимир!
Век живи - век учись! Ещё бы разработчики в Справочнике MQL5 это везде поправили, то было бы здорово!
С уважением, Владимир.
Всем доброго утра!
Продолжаю самообучение языку программирования MQL5. Решил написать функцию для получения сигнала от индикатора ZigZag. Стал его досконально изучать и сразу появились вопросы. Во входных параметрах индикатора есть:
Так как не силён в английском языке, поэтому приходится пользоваться Гугл переводчиком. Что даёт перевод в чистом виде:
Depth - глубинаDeviation - отклонениеBackstep - шаг назадВопросы:
Уважаемые специалисты, помогите разобраться!
С уважением, Владимир.
Всем доброго утра!
Продолжаю самообучение языку программирования MQL5. Решил написать функцию для получения сигнала от индикатора ZigZag. Стал его досконально изучать и сразу появились вопросы. Во входных параметрах индикатора есть:
Так как не силён в английском языке, поэтому приходится пользоваться Гугл переводчиком. Что даёт перевод в чистом виде:
Вопросы:
Уважаемые специалисты, помогите разобраться!
С уважением, Владимир.
Элементарно - поиск в помощь, " Разве он движется не вперёд " - тут вся история движется назад!!! :-)
https://www.mql5.com/ru/code/7796
Depth это минимальное кол-во баров, на котором не будет второго максимума (минимума) меньше (больше) на Deviation пипсов, чем предыдущего, то есть расходиться ZigZag может всегда, а сходится (либо сдвинуться целиком) больше, чем на Deviation, ZigZag может только после Depth баров. Backstep это минимальное количество баров между максимумами (минимумами).
В строке поиска вбейте: например, зиг заг параметры, https://www.mql5.com/ru/search#!keyword=%D0%B7%D0%B8%D0%B3%20%D0%B7%D0%B0%D0%B3%20%D0%BF%D0%B0%D1%80%D0%B0%D0%BC%D0%B5%D1%82%D1%80%D1%8B&page=2</b></p>
ПС элементарные вещи...
Элементарно - поиск в помощь, " Разве он движется не вперёд " - тут вся история движется назад!!! :-)
https://www.mql5.com/ru/code/7796
Depth это минимальное кол-во баров, на котором не будет второго максимума (минимума) меньше (больше) на Deviation пипсов, чем предыдущего, то есть расходиться ZigZag может всегда, а сходится (либо сдвинуться целиком) больше, чем на Deviation, ZigZag может только после Depth баров. Backstep это минимальное количество баров между максимумами (минимумами).
В строке поиска вбейте: например, зиг заг параметры, https://www.mql5.com/ru/search#!keyword=%D0%B7%D0%B8%D0%B3%20%D0%B7%D0%B0%D0%B3%20%D0%BF%D0%B0%D1%80%D0%B0%D0%BC%D0%B5%D1%82%D1%80%D1%8B&page=2</b></p>
ПС элементарные вещи...
Огромное спасибо, Роман! Вы дали самое сжатое, но, в тоже время, понятное разъяснение.
С уважением, Владимир.
Огромное спасибо, Роман! Вы дали самое сжатое, но, в тоже время, понятное разъяснение.
С уважением, Владимир.
Всем доброго дня!
При тестировании одного советника столкнулся с проблемой. У него есть такой код функции инициализации советника:
В ходе тестирования советника в журнале появляются сообщения:
Выяснил, что проблема кроется в проверке хэндлов индикаторов Bollinger Bands и DEMA. В связи с этим появился вопрос - на что могут влиять эти ошибки и, что нужно изменить в коде, чтобы их устранить?
С уважением, Владимир.
Есть ошибки, значит код не будет работать, как задумал автор. Надо разбираться. Код у Вас, Вам и карты в руки.
Из того кусочка, что Вы показали, вижу, что либо свечей меньше 60, либо хендл одного из индикаторов INVALID, значит параметры засылаете в него некорректные. Либо ошибки в другой части кода, которую я не вижу.
С уважением, Владимир.
Ой, Алексей;)