
От новичка до эксперта: Совместная отладка на MQL5
Основное содержание
Введение:
Как правило, каждый автор стремится решить конкретную проблему от начала до конца статьи. Название сегодняшней статьи - "Отладка", но я призываю вас не относиться к этому легкомысленно, поскольку мы рассмотрим гораздо больше, чем просто основы процесса. Я поделюсь приемами, которые я использовал на протяжении многих лет в многочисленных успешных проектах. Во всех областях программирования отладка - это тема, которую нельзя упускать из виду. Я заметил, что многие авторы сосредоточены на представлении отточенного конечного продукта, не рассказывая о трудностях, с которыми они столкнулись, чтобы код работал корректно.
Будь то в области нейронных сетей, искусственного интеллекта или других смежных программных дисциплин, отладка имеет важное значение. Я считаю, что самый ценный навык, который вы можете развить, - это способность решать проблемы по мере их возникновения, и этот навык становится неотъемлемой частью вас для решения будущих задач аналогичного характера. Таким образом, умение решать проблемы может сформировать мощный набор навыков, постепенно превращая человека в эксперта.
Совместная отладка
Берясь за написание этой статьи, я работал над проектом, в котором столкнулся с несколькими ошибками при попытке скомпилировать код. Временами отладчик выдавал мне 50 строк ошибок, требующих устранения. Методом проб и ошибок я разработал процедуру устранения ошибок, позволяющую устранять неполадки всего за несколько минут, если не секунд, и обеспечивать бесперебойную работу программы.
Моя цель - познакомить вас с технологиями, которые могут ускорить процесс отладки. По моему опыту, один из самых ценных уроков, который я извлек, заключается в том, что освоение MQL5 может быть быстрым и эффективным, если вы активно участвуете в отладке проектов. У меня сохранилась содержащая ошибки программа, с которой мы вместе разберемся и доработаем её.
Одна из самых серьезных проблем заключается в том, что многие люди с трудом выносят длинные книги по MQL5, доступные бесплатно, но это не делает их менее ценными. Эти книги содержат необходимые знания, начиная от базовых и заканчивая продвинутыми концепциями программирования на MQL5. Для достижения наилучших результатов разумно участвовать в активных проектах, одновременно обращаясь к этим книгам по конкретным темам, связанным с вашей текущей работой. По мере завершения этих проектов вы, естественно, будете усваивать огромный объем знаний.
Как правило, наши отчеты об ошибках разбиты на четыре столбца, как описано в таблице ниже.
Столбец (Название) | Обозначения |
---|---|
Описание | В данном столбце содержится краткое объяснение ошибки или предупреждения, обнаруженных в коде. В нем может быть описан характер проблемы, например, синтаксические ошибки, необъявленные переменные, несоответствие типов или другие ошибки в кодировании. Понимание описания помогает программисту быстро определить проблему. |
Файл | Здесь указано имя файла, в котором произошла ошибка (например, D1 PriceMarker.mq5). В случае с несколькими файлами в проекте знание того, какой файл содержит проблему, имеет решающее значение для эффективной отладки и исправления. |
Строка | Указывает точный номер строки в указанном файле, в которой обнаружена ошибка. Такое точное определение позволяет программисту быстро перейти к конкретной части кода, требующей внимания, сокращая время, необходимое для обнаружения проблемы. |
Столбец | Указывает на конкретный номер столбца в строке, в которой была обнаружена ошибка. Хотя на него ссылаются реже, чем на предыдущие столбцы, он может быть особенно полезен для выявления ошибок, возникающих в сложных текстах или когда строка содержит много элементов (например, множество вызовов функций или параметров). |
Обычно они расположены слева направо, как показано ниже. Мы также включили полный отчет об ошибке, который содержит 20 ошибок и 4 предупреждения (см. нижнюю часть фрагмента), для программы, которую мы будем отлаживать в этом обсуждении, прямо под макетом таблицы. Вам будет легко определить характеристики отчета. Если вы дочитаете до конца, мы обсудим, как устранить ошибки, представленные во фрагменте кода ниже.
Описание | Файл | Строка | Столбец |
'D1 PriceMarker.mq5' 1 'ObjectDelete' - wrong parameters count D1 PriceMarker.mq5 70 5 built-in: bool ObjectDelete(long,const string) D1 PriceMarker.mq5 70 5 'ObjectDelete' - wrong parameters count D1 PriceMarker.mq5 71 5 built-in: bool ObjectDelete(long,const string) D1 PriceMarker.mq5 71 5 'ObjectDelete' - wrong parameters count D1 PriceMarker.mq5 72 5 built-in: bool ObjectDelete(long,const string) D1 PriceMarker.mq5 72 5 'ObjectDelete' - wrong parameters count D1 PriceMarker.mq5 73 5 built-in: bool ObjectDelete(long,const string) D1 PriceMarker.mq5 73 5 'ObjectDelete' - wrong parameters count D1 PriceMarker.mq5 74 5 built-in: bool ObjectDelete(long,const string) D1 PriceMarker.mq5 74 5 'ObjectDelete' - wrong parameters count D1 PriceMarker.mq5 75 5 built-in: bool ObjectDelete(long,const string) D1 PriceMarker.mq5 75 5 'ObjectDelete' - wrong parameters count D1 PriceMarker.mq5 76 5 built-in: bool ObjectDelete(long,const string) D1 PriceMarker.mq5 76 5 'ObjectDelete' - wrong parameters count D1 PriceMarker.mq5 77 5 built-in: bool ObjectDelete(long,const string) D1 PriceMarker.mq5 77 5 'ObjectCreate' - wrong parameters count D1 PriceMarker.mq5 15 9 built-in: bool ObjectCreate(long,const string,ENUM_OBJECT,int,datetime,double,...) D1 PriceMarker.mq5 15 9 'ObjectCreate' - wrong parameters count D1 PriceMarker.mq5 27 9 built-in: bool ObjectCreate(long,const string,ENUM_OBJECT,int,datetime,double,...) D1 PriceMarker.mq5 27 9 'ObjectSetText' - undeclared identifier D1 PriceMarker.mq5 37 5 ',' - unexpected token D1 PriceMarker.mq5 37 28 'labelName' - some operator expected D1 PriceMarker.mq5 37 19 '+' - illegal operation use D1 PriceMarker.mq5 37 36 ',' - unexpected token D1 PriceMarker.mq5 37 69 result of expression not used D1 PriceMarker.mq5 37 43 ',' - unexpected token D1 PriceMarker.mq5 37 73 expression has no effect D1 PriceMarker.mq5 37 71 ',' - unexpected token D1 PriceMarker.mq5 37 82 expression has no effect D1 PriceMarker.mq5 37 76 ')' - unexpected token D1 PriceMarker.mq5 37 87 expression has no effect D1 PriceMarker.mq5 37 84 'OBJPROP_Y' - undeclared identifier D1 PriceMarker.mq5 41 36 'ObjectSetInteger' - no one of the overloads can be applied to the function call D1 PriceMarker.mq5 41 5 could be one of 2 function(s) D1 PriceMarker.mq5 41 5 built-in: bool ObjectSetInteger(long,const string,ENUM_OBJECT_PROPERTY_INTEGER,long) D1 PriceMarker.mq5 41 5 built-in: bool ObjectSetInteger(long,const string,ENUM_OBJECT_PROPERTY_INTEGER,int,long) D1 PriceMarker.mq5 41 5 20 errors, 4 warnings 21 5
Вот несколько общих терминов, которые следует понимать при обсуждении этой темы:
- Синтаксис: относится к конкретному набору правил, которые определяют, как должны быть написаны программы (такие как торговые алгоритмы, индикаторы и скрипты), чтобы платформа MetaTrader 5 могла их правильно понимать и выполнять.
- Ошибка: относится к ошибке или неполадке в коде, которая не позволяет ему корректно выполняться. Ошибки можно разделить на несколько типов: Синтаксические ошибки, ошибки времени выполнения, логические ошибки, ошибки несоответствия типов и ошибки компиляции.
Что такое отладка?
Я уверен, что большинство из вас знакомы с этим насыщенным термином, но новичкам важно подробно разобраться в этом понятии. Теперь я опишу ошибку, чтобы вы могли лучше понять процесс отладки.
- Неполадка:
Ошибка или дефект в компьютерной программе или системе, из-за которых она ведет себя неожиданно или некорректно.
- Отладка:
Это процесс выявления, локализации и исправления ошибок или неполадок в компьютерной программе или системе, целью которого является обеспечить, чтобы программа работала должным образом и выдавала корректные выходные данные в различных условиях.
Отладка в контексте программирования на MQL5
Вот некоторые аспекты отладки, непосредственно связанные с MQL5:
1. Распространенные типы неполадок в MQL5:
- Синтаксические ошибки: Ошибки в структуре кода на MQL5, препятствующие компиляции скрипта.
В этом примере показана простая синтаксическая ошибка, при которой отсутствует закрывающая скобка для функции Print(). В результате скрипт не удастся скомпилировать, что указывает на необходимость тщательной проверки структуры кода.
void OnStart() { Print("Hello, World!" // Missing closing parenthesis }
- Логические ошибки: Проблемы, при которых код компилируется и запускается, но выдает неверные торговые сигналы или ведет себя неожиданно.
Вот логическая ошибка, при которой условия неправильно запускают ордер на покупку. Программист намеревался использовать более сложную логику, зависящую от рыночных условий, но текущая реализация приводит к ненужным сделкам.
void OnTick() { double currentPrice = SymbolInfoDouble(_Symbol, SYMBOL_BID); double targetPrice = currentPrice + 100; // Intended to use a different logic // Mistakenly placing a buy when conditions aren't right if (currentPrice < targetPrice) // Logic Error { OrderSend(_Symbol, OP_BUY, 0.1, currentPrice, 3, 0, 0, "Buy order", 0, 0, clrGreen); } }
- Ошибки выполнения: Ошибки, возникающие во время исполнения, такие как попытка доступа к недоступному массиву или ненеадлежащая обработка торговых ордеров.
В этом примере предпринята попытка получить доступ к шестому элементу массива, который имеет только пять допустимых индексов. Это приведет к ошибке во время выполнения, которая иллюстрирует важность проверки предельных значений при работе с массивами.
void OnStart() { double prices[5]; // Attempt to access out-of-range index (e.g., index 5) double value = prices[5]; // Runtime error: Array out of range }
2. Инструменты отладки на MQL5:
- MetaEditor: Это интегрированная среда разработки (IDE) для MQL5. Обеспечивает подсветку синтаксиса, завершение кода и индикацию ошибок, что помогает быстро выявлять синтаксические ошибки.
Приведенный ниже код позволяет установить точку останова для вычисления переменной результат. При отладке в MetaEditor можно проверить переменные на этом этапе, чтобы убедиться, что они установлены должным образом, что облегчает построчное выполнение для осуществления анализа хода выполнения программы.
void OnStart() { double startValue = 10.0; // Set a breakpoint here to inspect value double result = startValue * 2; Print("Result: ", result); // Check the value of result }
- Команда вывода: Использование функции Print() для вывода значений переменных и логов потока выполнения в журнал эксперта. Это простой способ отслеживать проблемы.
В этом примере фрагмента кода мы используем функцию Print() для регистрации текущих цен спроса и предложения. Такой подход полезен для отслеживания значений переменных во время выполнения и может помочь диагностировать логические ошибки путем сравнения ожидаемых и фактических значений.
void OnTick() { double bidPrice = SymbolInfoDouble(_Symbol, SYMBOL_BID); double askPrice = SymbolInfoDouble(_Symbol, SYMBOL_ASK); // Logging prices for debugging Print("Bid: ", bidPrice, ", Ask: ", askPrice); }
- Комментирование кода: Временное отключение разделов кода, чтобы изолировать проблемную область.
В этом примере строка кода закомментирована, чтобы сфокусироваться на альтернативной логике. Этот метод полезен для изолирования неполадок и тестирования различных разделов кода без полного удаления.
void OnTick() { // double result = SomeFunction(); // Temporarily disabling this line // Run alternate logic while debugging Print("Running alternative logic."); }3. Использование отладчика в MetaEditor:
MetaEditor включает в себя встроенный отладчик, который позволяет:4. Тестирование и оптимизация:
- Для точек останова: Установка точек останова в вашем коде позволяет приостанавливать выполнение в определенных строках и проверять значения переменных.
- Пошаговое выполнение: Вы можете поэтапно просматривать код, строка за строкой, чтобы наблюдать, как изменяются переменные и как за этим следует логический поток.
- Наблюдение за представлением: Отслеживание значений определенных переменных на протяжении всего выполнения кода.
5. Обработка ошибок:
- Тестер стратегий: MQL5 предоставляет тестер стратегий, который позволяет вам проводить бэк-тесты на торговых стратегиях с использованием исторических данных. Помогает моделировать сделки и анализирует их эффективность, что может выявить скрытые неполадки.
- Оптимизация: Вы можете оптимизировать параметры для повышения эффективности вашего торгового алгоритма, что также может выявить потенциальные неполадки в логике или исполнении.
- Обработка кодов ошибок, специфичных для MQL5, таких как проверка возвращаемых значений функций, связанных с торговыми операциями. Общие функции включают в себя функции выполнения ордеров (OrderSend, OrderClose и т.д.), где правильная обработка ошибок может предотвратить сбои или нежелательные результаты.
Рекомендации по отладке на MQL5:
1. Модульность кода: Напишем модульный код, разбив его на функции. Это упрощает тестирование и отладку отдельных компонентов. 2. Документирование кода: Прокомментируйте свой код, чтобы объяснить, что делает каждая часть, что может помочь при повторном просмотре кода через некоторое время. 3. Регулярное тестирование: Часто тестируйте код во время разработки, вместо того чтобы ждать, пока все будет завершено. Это помогает выявлять неполадки на ранней стадии.Реализация отладки в MQL5
Не так давно мы с другом создали черновой вариант скрипта для рисования помеченных ценовых линий для предыдущей дневной свечи (D1), отмечая критические ценовые уровни, такие как максимум, минимум, открытие и закрытие. Это версия, которую я отложил для данной статьи.
Как правило, при написании статьи в качестве эксперта MetaEditor предоставляет шаблоны и рекомендации по параметрам, чтобы помочь разработчикам и снизить вероятность ошибок, при условии, что данные введены в соответствии с корректным синтаксисом языка. Однако бывают случаи, когда вы можете получить код с форума, который изобилует ошибками. Ниже приведен фрагмент кода из нашей программы со скриптом, содержащим ошибки:
//+------------------------------------------------------------------+ //| D1 PriceMarker.mq5 | //| Copyright 2024, Clemence Benjamin | //| https://www.mql5.com/en/users/billionaire2024/seller | //+------------------------------------------------------------------+ #property copyright "Copyright 2024, Clemence Benjamin" #property link "https://www.mql5.com/en/users/billionaire2024/seller" #property version "1.00" #property strict // Function to create a price line with a label void CreatePriceLine(string name, double price, color clr, string label) { // Create a horizontal line if(!ObjectCreate(name, OBJ_HLINE, 0, 0, price)) { Print("Failed to create line: ", GetLastError()); return; } // Set line properties ObjectSetInteger(0, name, OBJPROP_COLOR, clr); ObjectSetInteger(0, name, OBJPROP_WIDTH, 2); // Create a label for the price string labelName = name + "_label"; if(!ObjectCreate(labelName, OBJ_LABEL, 0, 0, 0)) { Print("Failed to create label: ", GetLastError()); return; } // Set label properties ObjectSetInteger(0, labelName, OBJPROP_XSIZE, 70); ObjectSetInteger(0, labelName, OBJPROP_FONTSIZE, 10); ObjectSetInteger(0, labelName, OBJPROP_COLOR, clr); ObjectSetText(labelName, label + ": " + DoubleToString(price, 2), 10, "Arial", clr); // Position the label double yPos = price; // Positioning along the price axis ObjectSetInteger(0, labelName, OBJPROP_Y, yPos); ObjectSetInteger(0, labelName, OBJPROP_XDISTANCE, 5); } //+------------------------------------------------------------------+ //| Custom indicator initialization function | //+------------------------------------------------------------------+ void OnInit() { // Get the previous D1 candle's open, high, low, and close prices datetime prevCandleTime = iTime(NULL, PERIOD_D1, 1); double openPrice = iOpen(NULL, PERIOD_D1, 1); double highPrice = iHigh(NULL, PERIOD_D1, 1); double lowPrice = iLow(NULL, PERIOD_D1, 1); double closePrice = iClose(NULL, PERIOD_D1, 1); // Draw labeled price lines for open, high, low, and close prices CreatePriceLine("PrevCandle_Open", openPrice, clrBlue, "Open"); CreatePriceLine("PrevCandle_High", highPrice, clrRed, "High"); CreatePriceLine("PrevCandle_Low", lowPrice, clrGreen, "Low"); CreatePriceLine("PrevCandle_Close", closePrice, clrOrange, "Close"); } //+------------------------------------------------------------------+ //| Custom indicator deinitialization function | //+------------------------------------------------------------------+ void OnDeinit(const int reason) { // Remove the drawn price lines and labels upon indicator deinitialization ObjectDelete("PrevCandle_Open"); ObjectDelete("PrevCandle_High"); ObjectDelete("PrevCandle_Low"); ObjectDelete("PrevCandle_Close"); ObjectDelete("PrevCandle_Open_label"); ObjectDelete("PrevCandle_High_label"); ObjectDelete("PrevCandle_Low_label"); ObjectDelete("PrevCandle_Close_label"); } //+------------------------------------------------------------------+
(i) Обнаружение неполадки
Я обнаружил, что встроенный в MetaEditor отладчик довольно удобен в использовании, когда я пытаюсь скомпилировать неисправную программу. Большинство неполадок обнаруживается при нажатии кнопки «Компилирование или Профилирование в режиме реального времени» (Compile or Real-time Profiling) в MetaEditor. Однако существуют некоторые ошибки выполнения, которые не препятствуют компиляции программы; их можно выявить только на платформе или в тестере при попытке запустить программу.
Разработчик может либо написать всю программу с нуля, а затем отладить ее, либо просто отладить уже существующую программу. На изображении ниже для получения сводки ошибок мы используем преимущества встроенного компилятора и отладчика в MetaEditor (смотри нижнюю часть окна панели инструментов на изображении). При двойном щелчке по строке с ошибкой курсор перемещается на соответствующую строку кода с ошибкой и выделяет ее. Я редко замечал ошибки в коде, пока не нажимал кнопку компиляции, после чего отладчик сообщал о любых возникающих проблемах.
Обнаружение ошибок в MetaEditor
Иногда программа успешно компилируется, но может не привести к желаемому результату. В таких случаях целесообразно выявить потенциальные ошибки, проверив логи эксперта и распечатки журналов, доступные в окне панели инструментов на платформе MetaTrader 5. Эти логи могут дать ценную информацию о том, что может пойти не так во время выполнения, помогая вам эффективно устранять неполадки.
(ii) 3 Техника отладки
Зачастую ошибки могут возникать из-за опечаток или неправильного использования терминов, и отладчик обычно предоставляет объяснения и частичные советы по решению. Если вы в состоянии понять эти сообщения, обычно несложно вернуться к коду и внести необходимые исправления. Однако существуют и более сложные ситуации, которые бывает трудно диагностировать и которые могут потребовать более глубоких знаний из справочников или опыта сообщества.
По моему опыту, я обычно использую несколько стратегий при устранении сложных проблем. Я разделяю эти шаги на три основных подхода, хотя этот список не является исчерпывающим; он предназначен специально для целей данного обсуждения. Подробно объясню каждый шаг данной процедуры.
1. Пересмотр документации:
Это значительно облегчает отладку программ на MQL5, обеспечивая ясность синтаксиса, использования функций и сообщений об ошибках. В ней содержатся подробные объяснения и примеры, которые помогают выявить некорректные реализации и улучшить понимание встроенных функций. Кроме того, документация часто содержит информацию о распространенных ошибках, рекомендациях и альтернативных решениях, что позволяет разработчикам эффективно устранять неполадки и оптимизировать свой код для получения лучшего результата. Касательно данного проекта, посмотрите на изображение ниже, чтобы увидеть, как мы легко получаем доступ к документации.
Пересмотр документации
Отчет об ошибке:
'ObjectDelete' - wrong parameters count D1 PriceMarker.mq5 70 5
Рекомендация по решению:
built-in: bool ObjectDelete(long,const string) D1 PriceMarker.mq5 70 5
Текущая ситуация:
ObjectDelete("PrevCandle_Open");
Из рекомендации по решению очевидно, что функция ObjectDelete ожидает два параметра, но в настоящее время мы предоставляем только один. Такое несоответствие указывает на то, в чем заключается проблема, и мы можем решить ее соответствующим образом. Согласно документации, для функции ObjectDelete в MQL5 требуются два параметра:
- Имя: Имя удаляемого объекта, указанное в виде строки.
- Chart_id: Идентификатор графика, из которого должен быть удален объект. Указывается в виде целого числа. Если этот параметр пропущен, функция по умолчанию принимает значение текущего графика.
Для устранения этой проблемы следует убедиться, что мы передаем оба параметра при вызове ObjectDelete. Поступая таким образом, мы приводим вызов нашей функции в соответствие с ожидаемым синтаксисом и тем самым устраняем ошибку.
Решение:
ObjectDelete(0, "PrevCandle_Open");
Теперь, просматривая основной код, мы замечаем, что существует несколько экземпляров функции ObjectDelete. Используя информацию, собранную в ходе наших исследований, можно внести необходимые коррективы во все из них. Обеспечив предоставление обоих обязательных параметров для каждого экземпляра, мы можем эффективно устранять эти ошибки.
Посмотрите на изображение ниже: нам удалось сократить общее количество ошибок на 10. Это свидетельствует о значительном прогрессе в отладке нашего скрипта и демонстрирует важность тщательного изучения и исправления на основе надлежащей документации.
Ошибка функции ObjectDelete устранена
Готово! При встрече с ошибкой рекомендуется нажимать кнопку Компиляции (Compile) после каждой попытки решения. Это позволяет вам проверить, присутствует ли ошибка по-прежнему, а также помогает выявить все оставшиеся проблемы.
Перейдем к следующей ошибке.
Отчет об ошибке:
'ObjectSetText' - undeclared identifier D1 PriceMarker.mq5 29 5 'ObjectSetText' - undeclared identifier D1 PriceMarker.mq5 29 5 ',' - unexpected token D1 PriceMarker.mq5 29 28 'labelName' - some operator expected D1 PriceMarker.mq5 29 19 '+' - illegal operation use D1 PriceMarker.mq5 29 36 ',' - unexpected token D1 PriceMarker.mq5 29 69 result of expression not used D1 PriceMarker.mq5 29 43 ',' - unexpected token D1 PriceMarker.mq5 29 73 expression has no effect D1 PriceMarker.mq5 29 71 ',' - unexpected token D1 PriceMarker.mq5 29 82 expression has no effect D1 PriceMarker.mq5 29 76 ')' - unexpected token D1 PriceMarker.mq5 29 87 expression has no effect D1 PriceMarker.mq5 29 84
На этот раз я собрал несколько отчетов, потому что, если проверить, ошибки возникают в одной и той же строке. Это часто указывает на общую проблему, которую необходимо решить в этой конкретной части кода. Давайте внимательнее рассмотрим обсуждаемую строку, чтобы выявить основную проблему и определить необходимые исправления.
Рекомендации по решению:
В этом случае мы сталкиваемся со следующими ошибками: undeclared identifier, expected operator, expression has no effect и unexpected token).
Текущая ситуация:
ObjectSetText(labelName, label + ": " + DoubleToString(price, 2), 10, "Arial", clr);
Я проверил документацию и не смог найти какую-либо ссылку на ObjectSetText. Однако, когда я начал вводить ObjectSet..., появилось несколько предложений, из которых ObjectSetString был лучшим вариантом. Эта функция оказалась корректной и сработала так, как ожидалось.
Вы можете ознакомиться с нашими усилиями, отраженными ниже.
ObjectSetText недоступная в документации
ObjectSetString
Параметры функции ObjectSetString согласно документации:
bool ObjectSetString( long chart_id, // chart identifier string name, // object name ENUM_OBJECT_PROPERTY_STRING prop_id, // property int prop_modifier, // modifier string prop_value // value );
Решение:
Внеся необходимые коррективы, аналогичные тем, что мы сделали при первой ошибке, мы смогли устранить почти все проблемы. Теперь осталось исправить всего несколько строк. Сосредоточимся на этих последних корректировках, чтобы полностью устранить оставшиеся ошибки.
ObjectSetString(0, labelName, OBJPROP_TEXT, label + ": " + DoubleToString(price, 2));
Ещё несколько неполадок:
Осталось 2 ошибки
Наконец, устранение оставшихся ошибок:
ObjectSetInteger(0, labelName, OBJPROP_YDISTANCE, price); // Position label at the price level
Должна была быть OBJPROP_YDISTANCE, а не OBJPROP_Y.
Успешная отладка согласно документации
Так выглядит окончательный исправленный код:
//+------------------------------------------------------------------+ //| D1 PriceMarker.mq5 | //| Copyright 2024, Clemence Benjamin | //| https://www.mql5.com/en/users/billionaire2024/seller | //+------------------------------------------------------------------+ #property copyright "Copyright 2024, Clemence Benjamin" #property link "https://www.mql5.com/en/users/billionaire2024/seller" #property version "1.00" #property strict // Function to create a price line with a label void CreatePriceLine(string name, double price, color clr, string label) { // Create a horizontal line if(!ObjectCreate(0, name, OBJ_HLINE, 0, 0, price)) { Print("Failed to create line: ", GetLastError()); return; } // Set line properties ObjectSetInteger(0, name, OBJPROP_COLOR, clr); ObjectSetInteger(0, name, OBJPROP_WIDTH, 2); // Create a label for the price string labelName = name + "_label"; if(!ObjectCreate(0, labelName, OBJ_LABEL, 0, 0, 0)) { Print("Failed to create label: ", GetLastError()); return; } // Set label properties ObjectSetInteger(0, labelName, OBJPROP_XSIZE, 70); ObjectSetInteger(0, labelName, OBJPROP_FONTSIZE, 10); ObjectSetInteger(0, labelName, OBJPROP_COLOR, clr); ObjectSetInteger(0, labelName, OBJPROP_YDISTANCE, price); // Position label at the price level ObjectSetInteger(0, labelName, OBJPROP_XDISTANCE, 5); // Set the text of the label ObjectSetString(0, labelName, OBJPROP_TEXT, label + ": " + DoubleToString(price, 2)); } //+------------------------------------------------------------------+ //| Custom indicator initialization function | //+------------------------------------------------------------------+ void OnInit() { // Get the previous D1 candle's open, high, low, and close prices datetime prevCandleTime = iTime(NULL, PERIOD_D1, 1); double openPrice = iOpen(NULL, PERIOD_D1, 1); double highPrice = iHigh(NULL, PERIOD_D1, 1); double lowPrice = iLow(NULL, PERIOD_D1, 1); double closePrice = iClose(NULL, PERIOD_D1, 1); // Draw labeled price lines for open, high, low, and close prices CreatePriceLine("PrevCandle_Open", openPrice, clrBlue, "Open"); CreatePriceLine("PrevCandle_High", highPrice, clrRed, "High"); CreatePriceLine("PrevCandle_Low", lowPrice, clrGreen, "Low"); CreatePriceLine("PrevCandle_Close", closePrice, clrOrange, "Close"); } //+------------------------------------------------------------------+ //| Custom indicator deinitialization function | //+------------------------------------------------------------------+ void OnDeinit(const int reason) { // Remove the drawn price lines and labels upon indicator deinitialization ObjectDelete(0, "PrevCandle_Open"); ObjectDelete(0, "PrevCandle_High"); ObjectDelete(0, "PrevCandle_Low"); ObjectDelete(0, "PrevCandle_Close"); ObjectDelete(0, "PrevCandle_Open_label"); ObjectDelete(0, "PrevCandle_High_label"); ObjectDelete(0, "PrevCandle_Low_label"); ObjectDelete(0, "PrevCandle_Close_label"); } //+------------------------------------------------------------------+
D1 PriceMarker - это программа-скрипт на MQL5, которую мы разработали для улучшения технического анализа на торговом графике путем проведения горизонтальных линий по ценам максимума, минимума, открытия и закрытия предыдущей дневной свечи (D1). После инициализации скрипт извлекает эти четыре ценовые точки и использует вспомогательную функцию для создания соответствующих ценовых линий разных цветов (синий - для открытия, красный - для максимума, зеленый - для минимума и оранжевый - для закрытия), каждая из которых сопровождается текстовой меткой, указывающей значение цены. Когда скрипт удаляется с графика, он автоматически очищает его, удаляя все нарисованные линии и метки, обеспечивая трейдеру чистое рабочее пространство.
2. Отладка с помощью ИИ:
Я понимаю, что всем не терпится узнать, как мы используем доступные модели искусственного интеллекта, поэтому я кратко затрону эту тему, чтобы отложить ее для более подробного обсуждения позже. Нам повезло, что большинство из этих моделей могут понимать синтаксис быстрее и точнее, чем мы. Однако важно отметить, что иногда они могут привести к неожиданным результатам и могут потребовать более тщательного контроля со стороны человека для руководства дальнейшими шагами. Тем не менее, при разумном использовании они являются отличными инструментами, и я решил многие проблемы с кодированием, тщательно обдумав их предложения.
По сути, при создании запроса искусственного интеллекта вам следует начать с предоставления программы, которую вы хотите отладить. Затем, используя возможность копирования строк с ошибками из отчета MetaEditor, вы можете вставить эти строки в запрос, что позволит ИИ помочь в процессе отладки. Несмотря на то, что этот метод может дать успешные результаты, он также может привести к дальнейшим осложнениям, поэтому важно мыслить критически и идти дальше того, что предлагает искусственный интеллект. Результаты, которые мы достигли ранее, согласуются с тем, что должны давать другие средства отладки, при условии их эффективного использования.
Копирование ошибок в запросы ИИ
3. Посещение форума:
Аналогично тому, что мы делали выше, участникам форума нужна информация, позволяющая получить ценную информацию об отладке. Участие в дискуссиях о проблемах кодирования - отличный способ поучиться у других экспертов. Отправляя свою программу, вы приглашаете других поделиться своими мудрыми предложениями и решениями. Такой совместный подход не только помогает вам решать проблемы, но и расширяет знания и навыки каждого участника.
Программа на MetaTrader 5:
Скрипт D1 PriceMarker
Заключение
Командная работа в области программирования на MQL5 оказалась необходимой практикой для улучшения разработки надежных торговых алгоритмов, что продемонстрировано на протяжении всего нашего путешествия по созданию скрипта D1 PriceMarker. Процесс отладки в значительной степени опирался на отчеты об ошибках и исчерпывающую справочную документацию по MQL5, что позволяло нам систематически выявлять и устранять проблемы, с которыми мы сталкивались в процессе разработки.
Этот метод облегчал устранение специфических ошибок и способствовал более глубокому пониманию среды программирования. Кроме того, мы кратко коснулись потенциала использования искусственного интеллекта в качестве будущей помощи при отладке, подчеркнув его способность предоставлять информацию и рекомендации, которые могли бы упростить процесс отладки.
Поддержка сообщества, особенно через форум MQL5, играет неоценимую роль, позволяя нам обращаться за советом и делиться знаниями с другими опытными разработчиками. Применяя эти совместные и ресурсоориентированные подходы, мы можем значительно повысить эффективность наших усилий по отладке, что в конечном итоге приведет к разработке более надежных и инновационных торговых решений в конкурентной среде алгоритмической торговли. Удачной торговли, друзья!
Перевод с английского произведен MetaQuotes Ltd.
Оригинальная статья: https://www.mql5.com/en/articles/15325
Предупреждение: все права на данные материалы принадлежат MetaQuotes Ltd. Полная или частичная перепечатка запрещена.
Данная статья написана пользователем сайта и отражает его личную точку зрения. Компания MetaQuotes Ltd не несет ответственности за достоверность представленной информации, а также за возможные последствия использования описанных решений, стратегий или рекомендаций.





- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Вы принимаете политику сайта и условия использования
Хорошая статья для начинающих, но, на мой взгляд, немного многословная. Некоторые замечания:
Спасибо за ваш отзыв, Ален Верлейен! Я искренне ценю вашу проницательность, особенно как модератора, и согласен, что ясность очень важна, особенно для новичков.
Что касается аспекта сотрудничества, то я хотел побудить читателей общаться друг с другом в комментариях или на форуме, чтобы поделиться собственным опытом отладки и решениями. Я буду работать над улучшением своей видимости на форуме.
Я очень ценю вашу конструктивную критику и участие! Подобные дискуссии жизненно важны для нашего коллективного роста и совершенствования.
Доброе утро
О чем трейдеры algo могут не догадываться.
Это то, что они тратят очень мало времени на кодирование чудо-индикаторов или невероятно прибыльных советников.
Реальность такова, что в основном они будут тратить время на исправление, улучшение своих кодов и, соответственно, отладку.
Если у них нет мощных инструментов, они быстро потратят дни, которые уже были бы хороши, на поиск ошибок в коде.
Привет всем какой инструмент мощный считаете ?
Барабанная установка.
Здравствуйте, добро пожаловать на форум MQL5! Что касается вашего вопроса, то рекомендации рыночных продуктов не допускаются. Вам придется провести собственное исследование. Удачи! 😊