English 中文 Español Deutsch 日本語 Português
preview
От новичка до эксперта: Совместная отладка на MQL5

От новичка до эксперта: Совместная отладка на MQL5

MetaTrader 5Примеры |
425 8
Clemence Benjamin
Clemence Benjamin

Основное содержание 


Введение:

Как правило, каждый автор стремится решить конкретную проблему от начала до конца статьи. Название сегодняшней статьи - "Отладка", но я призываю вас не относиться к этому легкомысленно, поскольку мы рассмотрим гораздо больше, чем просто основы процесса. Я поделюсь приемами, которые я использовал на протяжении многих лет в многочисленных успешных проектах. Во всех областях программирования отладка - это тема, которую нельзя упускать из виду. Я заметил, что многие авторы сосредоточены на представлении отточенного конечного продукта, не рассказывая о трудностях, с которыми они столкнулись, чтобы код работал корректно.

Будь то в области нейронных сетей, искусственного интеллекта или других смежных программных дисциплин, отладка имеет важное значение. Я считаю, что самый ценный навык, который вы можете развить, - это способность решать проблемы по мере их возникновения, и этот навык становится неотъемлемой частью вас для решения будущих задач аналогичного характера. Таким образом, умение решать проблемы может сформировать мощный набор навыков, постепенно превращая человека в эксперта.

Совместная отладка

Совместная отладка

Берясь за написание этой статьи, я работал над проектом, в котором столкнулся с несколькими ошибками при попытке скомпилировать код. Временами отладчик выдавал мне 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. Тестирование и оптимизация:
  • Тестер стратегий: MQL5 предоставляет тестер стратегий, который позволяет вам проводить бэк-тесты на торговых стратегиях с использованием исторических данных. Помогает моделировать сделки и анализирует их эффективность, что может выявить скрытые неполадки.
  • Оптимизация: Вы можете оптимизировать параметры для повышения эффективности вашего торгового алгоритма, что также может выявить потенциальные неполадки в логике или исполнении.
 5. Обработка ошибок:
  • Обработка кодов ошибок, специфичных для 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 (смотри нижнюю часть окна панели инструментов на  изображении). При двойном щелчке по строке с ошибкой курсор перемещается на соответствующую строку кода с ошибкой и выделяет ее. Я редко замечал ошибки в коде, пока не нажимал кнопку компиляции, после чего отладчик сообщал о любых возникающих проблемах.

Locating errors

Обнаружение ошибок в 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 требуются два параметра:

  1. Имя: Имя удаляемого объекта, указанное в виде строки.
  2. Chart_id: Идентификатор графика, из которого должен быть удален объект. Указывается в виде целого числа. Если этот параметр пропущен, функция по умолчанию принимает значение текущего графика.

Для устранения этой проблемы следует убедиться, что мы передаем оба параметра при вызове ObjectDelete. Поступая таким образом, мы приводим вызов нашей функции в соответствие с ожидаемым синтаксисом и тем самым устраняем ошибку.

    Решение:

    ObjectDelete(0, "PrevCandle_Open");

    Теперь, просматривая основной код, мы замечаем, что существует несколько экземпляров функции ObjectDelete. Используя информацию, собранную в ходе наших исследований, можно внести необходимые коррективы во все из них. Обеспечив предоставление обоих обязательных параметров для каждого экземпляра, мы можем эффективно устранять эти ошибки.

    Посмотрите на изображение ниже: нам удалось сократить общее количество ошибок на 10. Это свидетельствует о значительном прогрессе в отладке нашего скрипта и демонстрирует важность тщательного изучения и исправления на основе надлежащей документации.

    ObjectDelete Function resolved

    Ошибка функции 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 not available in Documentation

    ObjectSetText недоступная в документации


    ObjectSetString

    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 error to go

    Осталось 2 ошибки

    Наконец, устранение оставшихся ошибок:

    ObjectSetInteger(0, labelName, OBJPROP_YDISTANCE, price); // Position label at the price level

    Должна была быть OBJPROP_YDISTANCE, а не OBJPROP_Y.

    Errors cleared and the program compiles now

    Успешная отладка согласно документации

    Так выглядит окончательный исправленный код:

    //+------------------------------------------------------------------+
    //|                                               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, вы можете вставить эти строки в запрос, что позволит ИИ помочь в процессе отладки. Несмотря на то, что этот метод может дать успешные результаты, он также может привести к дальнейшим осложнениям, поэтому важно мыслить критически и идти дальше того, что предлагает искусственный интеллект. Результаты, которые мы достигли ранее, согласуются с тем, что должны давать другие средства отладки, при условии их эффективного использования.

    Copy Errors

    Копирование ошибок в запросы ИИ

    3. Посещение форума:

    Аналогично тому, что мы делали выше, участникам форума нужна информация, позволяющая получить ценную информацию об отладке. Участие в дискуссиях о проблемах кодирования - отличный способ поучиться у других экспертов. Отправляя свою программу, вы приглашаете других поделиться своими мудрыми предложениями и решениями. Такой совместный подход не только помогает вам решать проблемы, но и расширяет знания и навыки каждого участника.

    Программа на MetaTrader 5:

    D1 PriceMarker

    Скрипт D1 PriceMarker 


    Заключение

    Командная работа в области программирования на MQL5 оказалась необходимой практикой для улучшения разработки надежных торговых алгоритмов, что продемонстрировано на протяжении всего нашего путешествия по созданию скрипта D1 PriceMarker. Процесс отладки в значительной степени опирался на отчеты об ошибках и исчерпывающую справочную документацию по MQL5, что позволяло нам систематически выявлять и устранять проблемы, с которыми мы сталкивались в процессе разработки.

    Этот метод облегчал устранение специфических ошибок и способствовал более глубокому пониманию среды программирования. Кроме того, мы кратко коснулись потенциала использования искусственного интеллекта в качестве будущей помощи при отладке, подчеркнув его способность предоставлять информацию и рекомендации, которые могли бы упростить процесс отладки.

    Поддержка сообщества, особенно через форум MQL5, играет неоценимую роль, позволяя нам обращаться за советом и делиться знаниями с другими опытными разработчиками. Применяя эти совместные и ресурсоориентированные подходы, мы можем значительно повысить эффективность наших усилий по отладке, что в конечном итоге приведет к разработке более надежных и инновационных торговых решений в конкурентной среде алгоритмической торговли. Удачной торговли, друзья!

    Перевод с английского произведен MetaQuotes Ltd.
    Оригинальная статья: https://www.mql5.com/en/articles/15325

    Прикрепленные файлы |
    D1_PriceMarker.mq5 (3.31 KB)
    Последние комментарии | Перейти к обсуждению на форуме трейдеров (8)
    Clemence Benjamin
    Clemence Benjamin | 13 окт. 2024 в 04:52
    Alain Verleyen #:

    Хорошая статья для начинающих, но, на мой взгляд, немного многословная. Некоторые замечания:

    • Вы должны четко сказать, что когда у вас есть список ошибок, вам ВСЕГДА нужно начинать проверять первую ошибку в верхней части списка. Это самый эффективный способ работы с ошибками и позволяет не тратить время на вторичные ошибки.
    • Вы должны предоставить "глючную" версию "D1_PriceMarker.mq5", чтобы люди могли попрактиковаться, следуя вашей статье.

    • Это явно логическая ошибка, 'Y_DISTANCE' - это целочисленное значение (позиция пикселя на экране), а вы предоставили двойное значение 'price'.
    • Я почти не видел вас активным на форуме, чтобы вы задавали вопросы или отвечали на них.
    • Я не понимаю. Где здесь "совместная работа"? Я что-то пропустил.

    Спасибо за ваш отзыв, Ален Верлейен! Я искренне ценю вашу проницательность, особенно как модератора, и согласен, что ясность очень важна, особенно для новичков.

    1. Вы абсолютно правы в том, что важно устранить первую ошибку в списке.
    2. Это отличное предложение! Хотя я не включил исходный файл в статью, читатели могут найти и скопировать "глючную" версию " D1_PriceMarker.mq5" по этой ссылке.
    3. Спасибо, что указали на логическую ошибку в отношении Y_DISTANCE.
    4. Что касается аспекта сотрудничества, то я хотел побудить читателей общаться друг с другом в комментариях или на форуме, чтобы поделиться собственным опытом отладки и решениями. Я буду работать над улучшением своей видимости на форуме.

    Я очень ценю вашу конструктивную критику и участие! Подобные дискуссии жизненно важны для нашего коллективного роста и совершенствования.

    Gerard William G J B M Dinh Sy
    Gerard William G J B M Dinh Sy | 13 окт. 2024 в 08:52

    Доброе утро

    О чем трейдеры algo могут не догадываться.

    Это то, что они тратят очень мало времени на кодирование чудо-индикаторов или невероятно прибыльных советников.

    Реальность такова, что в основном они будут тратить время на исправление, улучшение своих кодов и, соответственно, отладку.

    Если у них нет мощных инструментов, они быстро потратят дни, которые уже были бы хороши, на поиск ошибок в коде.

    Bazarbay83 Jumaev
    Bazarbay83 Jumaev | 16 мая 2025 в 10:05
    Привет всем какой инструмент мощный считаете ?
    Vitaly Muzichenko
    Vitaly Muzichenko | 16 мая 2025 в 11:16
    Bazarbay83 Jumaev #:
    Привет всем какой инструмент мощный считаете ?

    Барабанная установка.

    Vinicius Pereira De Oliveira
    Vinicius Pereira De Oliveira | 18 авг. 2025 в 12:15
    Bazarbay83 Jumaev # Привет всем, какой инструмент вы считаете мощным?

    Здравствуйте, добро пожаловать на форум MQL5! Что касается вашего вопроса, то рекомендации рыночных продуктов не допускаются. Вам придется провести собственное исследование. Удачи! 😊

    Нейросети в трейдинге: Обобщение временных рядов без привязки к данным (Базовые модули модели) Нейросети в трейдинге: Обобщение временных рядов без привязки к данным (Базовые модули модели)
    Продолжаем знакомство с фреймворком Mamba4Cast. И сегодня мы погрузимся в практическую реализацию предложенных подходов. Mamba4Cast создавался не для долгого прогрева на каждом новом временном ряде, а для мгновенного включения в работу. Благодаря идее Zero‑Shot Forecasting модель способна сразу выдавать качественные прогнозы на реальных данных без дообучения и тонкой настройки гиперпараметров.
    Добавляем пользовательскую LLM в торгового робота (Часть 5): Разработка и тестирование торговой стратегии с помощью LLM (II) - Настройка LoRA Добавляем пользовательскую LLM в торгового робота (Часть 5): Разработка и тестирование торговой стратегии с помощью LLM (II) - Настройка LoRA
    Языковые модели (LLM) являются важной частью быстро развивающегося искусственного интеллекта, поэтому нам следует подумать о том, как интегрировать мощные LLM в нашу алгоритмическую торговлю. Большинству людей сложно настроить эти модели в соответствии со своими потребностями, развернуть их локально, а затем применить к алгоритмической торговле. В этой серии статей будет рассмотрен пошаговый подход к достижению этой цели.
    Движение цены: Математические модели и технический анализ Движение цены: Математические модели и технический анализ
    Прогнозирование движений валютных пар является важным фактором успеха в трейдинге. Данная статья посвящена исследованию различных моделей движения цены, анализу их преимуществ и недостатков, а также практическому применению в торговых стратегиях. Мы рассмотрим подходы, позволяющие выявлять скрытые закономерности и повышать точность прогнозов.
    Возможности Мастера MQL5, которые вам нужно знать (Часть 42): Осциллятор ADX Возможности Мастера MQL5, которые вам нужно знать (Часть 42): Осциллятор ADX
    ADX — еще один относительно популярный технический индикатор, используемый некоторыми трейдерами для оценки силы преобладающего тренда. Действуя как комбинация двух других индикаторов, он представляет собой осциллятор, паттерны которого мы исследуем в этой статье с помощью Мастера MQL5 и его вспомогательных классов.