unexpected end of program как исправить ошибку в коде советника mq4
Решил сделать советника под себя на основе примера из справочника mql4. Но ув. вечно какие-то ошибки выдает, уже неделю с ним парюсь ничего не выходит.
Посмотрите скажите что не так может что-то убрать или изменить нужно помимо скоб.
Это пример как не надо писать был наверное )))
Там куча ошибок, знаки препинания где не надо, скобки фигурные не подсчитаны, имена переменных повторяются, много переменных вообще не объявлено, много чего. Полностью пересмотрите свой код.
ык попробуйте перевести то что написано в ошибках. по моему это самый просто способ узнать причину ошибки
вот это чего в старте делает?
у Вас же эксперт а не индюк.
почему тип не задан?
а где закрывающая скобка?
а это чего еще за новость?
покажите где в примере это написано?
почему запятая стоит в конце а не точка с запятой? зачем два раза одно и то же писать?
ставите запятую пишите так:
Дальше смотреть не стал, устал,
Unexpected end of program and unbalanced parentheses
Scroll down until you see the function definitions start to skip right. This is not correct since function definitions always have to occur outside if blocks. So your missing brace is somewhere up from this point.
This is your code after application of Styler:
Here is a good tip that I use till today to avoid this problem. Always, always, always create parentheses in pairs. If you write one «(» go ahead and write the other one «)», then just backspace and fill in the content. If you are using a bracket I usually create the ending bracket on the line below like this.
then I just place my cursor between the brackets and fill it with data.
Scroll down until you see the function definitions start to skip right. This is not correct since function definitions always have to occur outside if blocks. So your missing brace is somewhere up from this point.
This is your code after application of Styler:
I applied the Styler, Code looking much more properly arranged but the problem persist and where ever I put a parentheses creates more errors rather than the two i currently have. Thanks for your effort Lippmaje.
Нужна помощь
Помогите исправить две ошибки.
//| Test advisor on TMA_Fair.mq4 |
//| Copyright 2017, MetaQuotes Software Corp. |
//| https://www.mql5.com |
//+——————————————————————+
#property copyright «Copyright 2017, MetaQuotes Software Corp.»
#property link «https://www.mql5.com»
#property version «1.00»
#property strict
>
//+——————————————————————+
//| Expert tick function |
//+——————————————————————+
void OnTick()
<
PRICE_HIGH= iCustom(NULL,0,»TMA_Fair»,TimeFrame,HalfLength,Price,ATRMultiplier,ATRPeriod,Interpolate,1,0);
PRICE_LOW = iCustom(NULL,0,»TMA_Fair»,TimeFrame,HalfLength,Price,ATRMultiplier,ATRPeriod,Interpolate,2,0);
if(OrderSelect(ticket,SELECT_BY_TICKET))
if(!OrderModify(ticket,OrderOpenPrice(),SL,TP,0))
Print(» Ошибка модификации ордера на продажу!»);
>
>
У вас не соблюден баланс скобок, из-за этого компилятор думает, что еще что-то должно быть дальше. О чем вам и сообщает.
Помогите исправить две ошибки.
//| Test advisor on TMA_Fair.mq4 |
//| Copyright 2017, MetaQuotes Software Corp. |
//| https://www.mql5.com |
//+——————————————————————+
#property copyright «Copyright 2017, MetaQuotes Software Corp.»
#property link «https://www.mql5.com»
#property version «1.00»
#property strict
>
//+——————————————————————+
//| Expert tick function |
//+——————————————————————+
void OnTick()
<
PRICE_HIGH= iCustom(NULL,0,»TMA_Fair»,TimeFrame,HalfLength,Price,ATRMultiplier,ATRPeriod,Interpolate,1,0);
PRICE_LOW = iCustom(NULL,0,»TMA_Fair»,TimeFrame,HalfLength,Price,ATRMultiplier,ATRPeriod,Interpolate,2,0);
if(OrderSelect(ticket,SELECT_BY_TICKET))
if(!OrderModify(ticket,OrderOpenPrice(),SL,TP,0))
Print(» Ошибка модификации ордера на продажу!»);
>
>
Закрытие фунцкии void OnTick() происходило после оператора условий if(CountBuy(), если я ставлю скобки после фунцкии void OnTick(),
то у меня Выходят ошибки при компилировании :
Я понимаю, что ошибка в операторе условий, но исправить не могу (я только начинаю учить язык MQL4)
Я понимаю, что ошибка в операторе условий, но исправить не могу (я только начинаю учить язык MQL4)
Закрытие фунцкии void OnTick() происходило после оператора условий if(CountBuy(), если я ставлю скобки после фунцкии void OnTick(),
то у меня Выходят ошибки при компилировании :
Я понимаю, что ошибка в операторе условий, но исправить не могу (я только начинаю учить язык MQL4)
Типичные ошибки в программах на MQL4 и методы их устранения
Введение
При использовании новой версии компилятора языка MQL4 некоторые старые программы могут выдавать ошибки.
В старой версии компилятора во избежание критического завершения программ многие ошибки обрабатывались средой исполнения и не приводили к остановке работы. Например, деление на ноль или выход за пределы массива являются критическими ошибками и обычно приводят к аварийному завершению. Проявляются такие ошибки лишь в некоторых состояниях при определенных значениях переменных, однако о таких ситуациях следует знать и корректно их обрабатывать.
Новый компилятор позволяет обнаружить реальные или потенциальные источники ошибок и повысить качество кода.
В этой статье мы рассмотрим возможные ошибки, возникающие при компиляции старых программ, и методы их устранения.
1. Ошибки компиляции
При наличии ошибок в коде программа не может быть скомпилирована.
Для полного контроля всех ошибок рекомендуется использовать строгий режим компиляции, который устанавливается директивой:
Этот режим значительно упрощает поиск ошибок.
1.1. Идентификатор совпадает с зарезервированным словом
Если наименование переменной или функции совпадает с одним из зарезервированных слов:
то компилятор выводит сообщения об ошибках:
Рис.1. Ошибки «unexpected token» и «name expected»
Для исправления данной ошибки нужно исправить имя переменной или функции.
1.2. Специальные символы в наименованиях переменных и функций
Если наименования переменных или функций содержат специальные символы ($, @, точка):
то компилятор выводит сообщения об ошибках:
Рис.2. Ошибки «unknown symbol» и «semicolon expected»
Для исправления данной ошибки нужно скорректировать имена переменных или функций.
1.3. Ошибки использования оператора switch
Старая версия компилятора позволяла использовать любые значения в выражениях и константах оператора switch:
В новом компиляторе выражения и константы оператора switch должны быть целыми числами, поэтому при использовании подобных конструкций возникают ошибки:
Рис.3. Ошибки «illegal switch expression type» и «constant expression is not integral»
В таких случаях можно использовать явные сравнения численных значений, например:
1.4. Возвращаемые значений функций
Все функции, кроме void, должны возвращать значение объявленного типа. Например:
При строгом режиме компиляции (strict) возникает ошибка:
Рис.4. Ошибка «not all control paths return a value»
В режиме компиляции по умолчанию компилятор выводит предупреждение:
Рис.5. Предупреждение «not all control paths return a value»
Если возвращаемое значение функции не соответствует объявлению:
то при строгом режиме компиляции возникает ошибка:
Рис.6. Ошибка «function must return a value»
В режиме компиляции по умолчанию компилятор выводит предупреждение:
Для исправления таких ошибок в код функции нужно добавить оператор возврата return c возвращаемым значением соответствующего типа.
1.5. Массивы в аргументах функций
Массивы в аргументах функций теперь передаются только по ссылке.
Данный код при строгом режиме компиляции (strict) приведет к ошибке:
Рис.8. Ошибка компилятора «arrays passed by reference only»
В режиме компиляции по умолчанию компилятор выводит предупреждение:
Рис.9. Предупреждение компилятора «arrays passed by reference only»
Для исправления таких ошибок нужно явно указать передачу массива по ссылке, добавив префикс & перед именем массива:
Следует отметить, что теперь константные массивы ( Time[], Open[], High[], Low[], Close[], Volume[]) не могут быть переданы по ссылке. Например, вызов:
вне зависимости от режима компиляции приводит к ошибке:
Для устранения подобных ошибок нужно скопировать необходимые данные из константного массива:
2. Ошибки времени выполнения
Ошибки, возникающие в процессе исполнения кода программы принято называть ошибками времени выполнения (runtime errors). Такие ошибки обычно зависят от состояния программы и связаны с некорректными значениями переменных.
Например, если переменная используется в качестве индекса элементов массива, то ее отрицательные значения неизбежно приведут к выходу за пределы массива.
2.1. Выход за пределы массива (Array out of range)
Эта ошибка часто возникает в индикаторах при обращении к индикаторным буферам. Функция IndicatorCounted() возвращает количество баров, неизменившихся после последнего вызова индикатора. Значения индикаторов на уже рассчитанных ранее барах не нуждаются в пересчете, поэтому для ускорения расчетов достаточно обрабатывать только несколько последних баров.
Большинство индикаторов, в которых используется данный способ оптимизации вычислений, имеют вид:
Часто встречается некорректная обработка случая counted_bars==0 (начальную позицию limit нужно уменьшить на значение, равное 1 + максимальный индекс относительно переменной цикла).
Также следует помнить о том, что в момент исполнения функции start() мы можем обращаться к элементам массивов индикаторных буферов от 0 до Bars()-1. Если есть необходимость работы с массивами, которые не являются индикаторными буферами, то их размер следует увеличить при помощи функции ArrayResize() в соответствии с текущим размером индикаторных буферов. Максимальный индекс элемента для адресации также можно получить вызовом ArraySize() с одним из индикаторных буферов в качестве аргумента.
2.2. Деление на ноль (Zero divide)
Ошибка «Zero divide» возникает в случае, если при выполнении операции деления делитель оказывается равен нулю:
При выполнении данного скрипта во вкладке «Эксперты» возникает сообщение об ошибке и завершении работы программы:
Рис.11. Сообщение об ошибке «zero divide»
Обычно такая ошибка возникает в случаях, когда значение делителя определяется значениями каких-либо внешних данных. Например, если анализируются параметры торговли, то величина задействованной маржи оказывается равна 0 если нет открытых ордеров. Другой пример: если анализируемые данные считываются из файла, то в случае его отсутствия нельзя гарантировать корректную работу. По этой причине желательно стараться учитывать подобные случаи и корректно их обрабатывать.
В результате критической ошибки не возникает, но выводится сообщение о некорректном значении параметра и работа завершается:
Рис. 12. Сообщение о некорректном значении делителя
2.3. Использование 0 вместо NULL для текущего символа
В старой версии компилятора допускалось использование 0 (нуля) в качестве аргумента в функциях, требующих указания финансового инструмента.
Например, значение технического индикатора Moving Average для текущего символа можно было запрашивать следующим образом:
В новом компиляторе для указания текущего символа нужно явно указывать NULL:
Кроме того, текущий символ и период графика можно указать при помощи функций Symbol() и Period().
2.4. Строки в формате Unicodе и их использование в DLL
Строки теперь представляют собой последовательность символов Unicode.
Следует учитывать этот факт и использовать соответствующие функции Windows. Например, при использовании функций библиотеки wininet.dll вместо InternetOpenA() и InternetOpenUrlA () следует вызывать InternetOpenW() и InternetOpenUrlW().
В MQL4 изменилась внутренняя структура строк (теперь она занимает 12 байт), поэтому при передаче строк в DLL следует использовать структуру MqlString:
2.5. Совместное использование файлов
В новом MQL4 при открытии файлов необходимо явно указывать флаги FILE_SHARE_WRITE и FILE_SHARE_READ для совместного использования.
В случае их отсутствия файл будет открыт в монопольном режиме, что не позволит больше никому его открывать, пока он не будет закрыт монополистом.
Например, при работе с оффлайновыми графиками требуется явно указывать флаги совместного доступа:
Подробности можно найти в статье в статье «Оффлайновые графики и новый MQL4«.
2.6. Особенность преобразования datetime
Следует иметь ввиду, что преобразование типа datetime в строку теперь зависит от режима компиляции:
Например, попытка работы с файлами, имя которых содержит двоеточие, приведет к ошибке.
3. Предупреждения компилятора
Чистый код не должен содержать предупреждений.
3.1. Пересечения имен глобальных и локальных переменных
Если на глобальном и локальном уровнях присутствуют переменные с одинаковыми именами:
то компилятор выводит предупреждение и укажет номер строки, на которой объявлена глобальная переменная:
Рис.13. Предупреждение «declaration of ‘%’ hides global declaration at line %»
Для исправления таких предупреждений нужно скорректировать имена глобальных переменных.
3.2. Несоответствие типов
В новой версии компилятора в ведена операция приведения типов.
В строгом режиме компиляции при несоответствии типов компилятор выводит предупреждения:
Рис.14. Предупреждения «possible loss of data due to type conversion» и «implicit conversion from ‘number’ to ‘string’
В данном примере компилятор предупреждает о возможной потере точности при присвоении различных типов данных и неявном преобразовании типа int в string.
Для исправления нужно использовать явное приведение типов:
3.3. Неиспользуемые переменные
Наличие переменных, которые не используются в коде программы (лишние сущности) не является хорошим тоном.
Сообщения о таких переменных выводятся вне зависимости от режима компиляции:
Рис.15. Предупреждения «variable ‘%’ not used’
Для исправления нужно убрать неиспользуемые переменные из кода программы.
Выводы
В статье рассмотрены типичные проблемы, с которыми могут столкнуться программисты при компиляции старых программ, содержащих ошибки.
Во всех случаях при отладке программ рекомендуется использовать строгий режим компиляции.
В новом МТ4 Version : 4,00 Build 625 программные коды сохранили свою рабочую среду, но «Компилятор» выдаёт предупреждения о некорректности некоторых строк исходного кода в советниках.
Обращаюсь к знатокам за помощью, как это можно исправить? В чём корень недоразумения? Что нужно добавить в код или изменить?
Теперь рекомендуется возвращаемые значения данных функций проверять.
//действия нашего кода, если функция вернула true
В новом МТ4 Version : 4,00 Build 625 программные коды сохранили свою рабочую среду, но «Компилятор» выдаёт предупреждения о некорректности некоторых строк исходного кода в советниках.
Обращаюсь к знатокам за помощью, как это можно исправить? В чём корень недоразумения? Что нужно добавить в код или изменить?