English Deutsch 日本語
preview
От новичка до эксперта: Программирование японских свечей

От новичка до эксперта: Программирование японских свечей

MetaTrader 5Примеры |
62 1
Clemence Benjamin
Clemence Benjamin

Разделы



Введение

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

Например, паттерн бычьего поглощения состоит из медвежьей свечи, за которой следует бычья. Бычья свеча открывается ниже закрытия медвежьей свечи и закрывается выше ее открытия, полностью закрывая тело медвежьей свечи во временном ряду. Задача заключается в том, чтобы точно определить положение точки открытия бычьей свечи по отношению к точке закрытия медвежьей свечи. Человеческий глаз склонен к ошибочным суждениям, особенно при визуальном анализе графиков.

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

Цель данной статьи

В настоящем обсуждении я намерен изучить программирование свечных паттернов, фундаментальную математику, лежащую в их основе на MQL5, и, в конечном счете, разработать библиотеку свечных паттернов на основе существующих.

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

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

Важно признать, что кодирование и изобретение новых паттернов может быть утомительным процессом, но награда за это значительна — создание автоматизирующего распознавание паттернов алгоритма, избавит вас от повторяющегося ручного анализа на всю жизнь.

Что будет дальше?

Следующий раздел содержит мои исследования и ключевые концепции, которые я собрал, чтобы придать структуру настоящему обсуждению. Читайте внимательно, и я уверен, что вы обнаружете большую ценность в этом чтении. 



Понимание данных о свечах и связанных с ними основных операций программирования

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

Для новичка важно начать с простых концепций и постепенно развивать свои навыки программирования. Начните с того, что научитесь определять бычьи и медвежьи свечи с помощью базовых реляционных операторов. Как только вы освоитесь с этими сравнениями, переходите к одиночным свечным паттернам, интегрируя арифметические операции для измерения размеров тела и длины тени свечи. После освоения анализа по одной свече переходите к многосвечным паттернам, где вы научитесь использовать индексацию для сравнения данных по нескольким свечам. Тестирование вашей работы с помощью таких функций, как Print(), помогает убедиться, что ваша логика работает должным образом.

В кратком обзоре можно сказать, что японские свечи - это визуальный инструмент, используемый в торговле, чтобы показать, как движутся цены в течение определенного периода, например часа или дня. Каждая японская свеча определяется четырьмя ключевыми ценами: ценой открытия (цена в начале периода), максимумом (максимальная цена за период), минимумом (минимальная цена) и ценой закрытия (цена в конце периода). “Тело” японской свечи представляет собой диапазон между открытием и закрытием, в то время как “фитили” или тени простираются от тела до максимумов и минимумов цен. Такая структура позволяет вам быстро оценить настроения на рынке. Например, если цена закрытия выше цены открытия, свеча считается бычьей, что указывает на восходящий импульс. И наоборот, если цена закрытия ниже цены открытия, она является медвежьей, что указывает на нисходящий тренд.

Хочу познакомить вас с несколькими ключевыми терминами, которые, на мой взгляд, необходимы, когда вы начинаете работать с данными временных рядов. Эти понятия являются фундаментальными для понимания и реализации распознавания свечных паттернов на MQL5. Я объяснил их своими словами, основываясь на своих исследованиях, чтобы дать ясное и практичное толкование:

    1. Реляционные операторы

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

    • < (less than)
    • > (greater than)
    • == (equal to)
    • != (not equal to)
    • <= (less than or equal to)
    • >= (greater than or equal to)

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

    2. Индекс свечи

    В данных временных рядов на каждую японскую свечу (или бар) ссылается индекс Самый последний столбец имеет индекс 0, в то время как для ссылок на более старые столбцы используются возрастающие значения индекса (например, 1, 2, 3 и т.д.). Понимание этого помогает правильно анализировать исторические данные о ценах.

    3. Таймсерии

    Таймсерии - это особый тип массива, используемый для хранения исторических данных о ценах или индикаторах, где индексирование производится в обратном порядке. В таймсерии доступ к последним данным (например, к текущему или самому последнему столбцу) осуществляется по индексу 0, когда более старые данные следуют с более высокими индексными номерами.

    4. Средний истинный диапазон (ATR)

    ATR - это индикатор волатильности, который определяет динамические пороговые значения для свечных паттернов, обеспечивая адаптивность к рыночным условиям. Например, для паттерна Hammer требуется небольшое тело (менее 30% от ATR) и нижняя тень, по крайней мере, в два раза превышающая размер тела. Это позволяет гибко определять различные активы и таймфреймы.

    Задача состоит в том, чтобы определить, что означает “маленький”, “длинный” или “большой”. Фиксированное значение (например, 10 пипсов для небольшого тела) не будет работать стабильно на различных активах или рыночных условиях. Движение на 10 пипсов может быть значительным для такой пары с низкой волатильностью, как EUR/USD, на 5-минутном графике, но незначительным для такой волатильной пары, как GBP/JPY, на дневном графике. Именно в этом преимущество ATR — он обеспечивает динамичный порог с поправкой на волатильность, адаптированный к активу и таймфрейму.

    При использовании ATR условия для определения свечных паттернов становятся адаптивными:

    • На рынках с высокой волатильностью (высокий ATR) “небольшое тело” может быть больше в абсолютном выражении, но все еще невелико по сравнению с недавними колебаниями цен.
    • На рынках с низкой волатильностью (низкий ATR) даже незначительное абсолютное изменение может считаться значительным.

    5. MathAbs

    MathAbs - это встроенная функция на MQL5, вычисляющая абсолютное значение числа. Абсолютное значение - это просто расстояние числа от нуля, которое всегда приводит к неотрицательному (положительному или нулевому) значению.

    Как это работает в данном контексте: 

    • Если дать ему отрицательное число, оно преобразуется в положительное. Например, MathAbs(-5) возвращает значение 5.
    • Если число уже положительное или равно нулю, оно остается неизменным. Например, MathAbs(5) возвращает значение 5, а MathAbs(0) возвращает значение 0.

    В свечном паттерне MathAbs используется для измерения размера тела свечи, которое представляет собой разницу между ценой закрытия (Close[1]) и ценой открытия (Open[1]), т.е. Close[1] - Open[1].

    Почему стоит использовать MathAbs?

    1. Потому что размер тела должен быть положительным значением, независимо от того, является ли свеча бычьей (закрытие > открытие) или медвежьей (закрытие < открытие). Например:

    • Бычья свеча: Закрытие[1] = 10, открытие[1] = 8 → 10 - 8 = 2.
    • Медвежья свеча: Закрытие[1] = 8, открытие[1] = 10 → 8 - 10 = -2, но MathAbs(8 - 10) = 2.

    2. Это гарантирует, что размер тела всегда будет положительным для последовательного сравнения в правилах паттерна.

    Сравнение цен с реляционными операторами на MQL5

    На MQL5 реляционные операторы являются важными инструментами, позволяющими сравнивать значения, такие как цены открытия и закрытия свечи. Операторы, о которых мы упоминали выше <, >, ==, !=, <=, и >=, возвращают значение true (1) или false (0) и помогают определить, является ли свеча бычьей или медвежьей.

    Например,

    • бычья свеча определяется, когда выполняется условие close[0] > open[0], где [0] относится к индексу последней свечи.

    С другой стороны,

    • медвежья свеча обозначается символом close[0] < open[0]. 

    Это базовое сравнение является краеугольным камнем распознавания свечных паттернов. Рассматривайте эти сравнения как простые вопросы о цене: “Свеча закрылась выше, чем открывалась?” Если да, перед вами бычий сигнал.

    Свечные паттерны

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

    Одиночные свечные паттерны

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

    Свеча Доджи

    Название свечи Логическое описание Справочное изображение
    Доджи Свечной паттерн Доджи определяется, когда цены открытия и закрытия очень близки или равны, что указывает на нерешительность рынка. Это означает open[1] ≈ close[1], в то время как максимум и минимум могут значительно отличаться. Доджи может принимать различные формы, такие как длинноногая свеча Доджи, Доджи стрекоза или Доджи надгробие, в зависимости от расположения теней.


    // Check for Doji pattern
    
    if( MathAbs(Open[1] - Close[1]) < Point * 2 ) 
    // Open and close are almost equal
    {
        Print("Doji pattern detected");
    }
    доджи

    Многосвечные паттерны

    Многосвечные паттерны требуют от нас анализа взаимосвязей между последовательными свечами. На MQL5 мы используем индексацию для ссылки на прошлые свечи: close[1] представляет цену закрытия предыдущей свечи, в то время как close[2] представляет цену закрытия свечи перед ней. Популярным многосвечным паттерном является Бычье поглощение, когда за маленькой медвежьей свечой следует большая бычья свеча, которая полностью "поглощает" предыдущую.

    Чтобы закодировать этот паттерн, вы должны убедиться, что предыдущая свеча медвежья (используя close[1] < open[1]), а затем проверить, что текущая свеча является бычьей (используя close[0] > open[0]), а также подтвердить, что тело текущей свечи выходит за пределы границы предыдущей свечи. Условия в вашем коде гарантируют, что паттерн соответствует ожидаемой последовательности и соотношениям размеров, что имеет решающее значение для точного определения паттерна Бычье поглощение.

    Свечной паттерн Логическое описание Справочное изображение
    Бычье поглощение Паттерн бычьего поглощения определяется, когда свеча с индексом 2 является медвежьей (ее закрытие ниже, чем открытие, т.е. Close[2] < Open[2]), а свеча с индексом 1 - бычьей (ее закрытие выше, чем открытие, т.е. Close[1] > Open[1]). Кроме того, свеча с индексом 1 должна поглотить тело свечи с индексом 2, открывшись ниже уровня закрытия (Open[1] < Close[2]) и закрывшись выше её открытия (Close[1] > Open[2])


    // Check for bullish engulfing pattern
    if( Close[2] < Open[2] && // Candle at index 2 is bearish
        Close[1] > Open[1] && // Candle at index 1 is bullish
        Open[1] < Close[2] && // Candle at index 1 opens below candle at index 2 close
        Close[1] > Open[2] )  // Candle at index 1 closes above candle at index 2 open
    {
        Print("Bullish engulfing pattern detected");
    }

    Бычье поглощение


    Создание коллекции известных свечных паттернов и библиотеки функций свечных паттернов многократного использования

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

    Коллекция одиночных свечных паттернов

    Свечной паттерн Логическое описание Справочное изображение
    Молот Паттерн "молот" определяется, когда свеча с индексом 1 имеет небольшое тело (абсолютная разница между ее закрытием и открытием меньше, чем в 0,3 раза превышает ATR, т.е. MathAbs(Close[1] - Open[1]) < 0,3 * ATR), длинная нижняя тень (расстояние от нижнего из значений open или close до минимума, как минимум в два раза больше размера тела, т.е. MathMin(Open[1], Close[1]) - Low[1] >= 2 * MathAbs(Close[1] - Open[1])), а маленькая или вообще отсутствующая верхняя тень (расстояние от верхнего из значений open или close до максимума меньше или равно половине размера тела, т.е. High[1] - MathMax(Open[1], Close[1]) <= 0.5 * MathAbs(Close[1] - Open[1]))


    // Check for Hammer pattern
    if( MathAbs(Close[1] - Open[1]) < 0.3 * ATR[1] &&     // Small body
    // Long lower wick
        (MathMin(Open[1], Close[1]) - Low[1]) >= 2 * MathAbs(Close[1] - Open[1]) && 
    // Small or no upper wick
        (High[1] - MathMax(Open[1], Close[1]) <= 0.5 * MathAbs(Close[1] - Open[1])) 
    {
        Print("Hammer pattern detected");
    }

    молот
    Падающая звезда Паттерн «падающая звезда" определяется, когда свеча с индексом 1 имеет небольшое тело (абсолютная разница между ее закрытием и открытием меньше, чем в 0,3 раза превышает ATR, т.е. MathAbs(Close[1] - Open[1]) < 0,3 * ATR), длинная верхняя тень (расстояние от верхнего из значений open или close до максимума, как минимум в два раза больше размера тела, т.е. High[1] - MathMax(Open[1], Close[1]) >= 2 * MathAbs(Close[1] - Open[1])), а маленькая или вообще отсутствующая нижняя тень (расстояние от нижнего из значений open или close до минимума меньше или равно половине размера тела, т.е. MathMin(Open[1], Close[1]) - Low[1] <= 0.5 * MathAbs(Close[1] - Open[1]))


    // Check for Shooting Star pattern
    if( MathAbs(Close[1] - Open[1]) < 0.3 * ATR[1] &&     // Small body
     // Long upper wick
        (High[1] - MathMax(Open[1], Close[1]) >= 2 * MathAbs(Close[1] - Open[1]) &&    
    // Small or no lower wick
        (MathMin(Open[1], Close[1]) - Low[1]) <= 0.5 * MathAbs(Close[1] - Open[1]) ) 
    {    
        Print("Shooting Star pattern detected");
    }

    падающая звезда
    Стандартная Доджи Паттерн «стандартная доджи» определяется, когда свеча с индексом 1 имеет минимальное тело, что означает, что значения открытия и закрытия почти равны (абсолютная разница между ее закрытием и открытием менее, чем в 0,1 раза больше ATR, т.е. MathAbs(Close[1] - Open[1]) < 0,1 * ATR)


    // Check for Standard Doji pattern
    if( MathAbs(Close[1] - Open[1]) < 0.1 * ATR[1] )     // Open and close are nearly equal
    {
        Print("Standard Doji pattern detected");
    }

    Доджи стрекоза Паттерн «доджи стрекоза» определяется, когда свеча с индексом 1 имеет небольшое тело (абсолютная разница между ее закрытием и открытием меньше, чем в 0,1 раза превышает ATR, т.е. MathAbs(Close[1] - Open[1]) < 0,1 * ATR), длинная нижняя тень (расстояние от нижнего из значений open или close до минимума, превышает в 0,5 раз ATR, т.е. MathMin(Open[1], Close[1]) - Low[1] > 0.5 * ATR), а маленькая или вообще отсутствующая верхняя тень (расстояние от верхнего из значений open или close до максимума менее, чем в 0,1 раза превышает ATR, т.е. High[1] - MathMax(Open[1], Close[1]) < 0.1 * ATR)


    // Check for Dragonfly Doji pattern
    if( MathAbs(Close[1] - Open[1]) < 0.1 * ATR[1] &&     // Small body
        (MathMin(Open[1], Close[1]) - Low[1]) > 0.5 * ATR[1] &&     // Long lower wick
        (High[1] - MathMax(Open[1], Close[1]) < 0.1 * ATR[1] )     // Little to no upper wick
    {
        Print("Dragonfly Doji pattern detected");
    }

    Доджи надгробие Паттерн «доджи надгробие» определяется, когда свеча с индексом 1 имеет небольшое тело (абсолютная разница между ее закрытием и открытием менее, чем в 0,1 раза превышает ATR, т.е. MathAbs(Close[1] - Open[1]) < 0,1 * ATR), длинная верхняя тень (расстояние от верхнего из значений open или close до максимума, превышает в 0,5 раз ATR, т.е. High[1] - MathMax(Open[1], Close[1]) > 0.5 * ATR), а маленькая или вообще отсутствующая нижняя тень (расстояние от нижнего из значений open или close до минимума менее, чем в 0,1 раза превышает ATR, т.е. MathMin(Open[1], Close[1]) - Low[1] < 0.1 * ATR)


    // Check for Gravestone Doji pattern
    if( MathAbs(Close[1] - Open[1]) < 0.1 * ATR[1] &&     // Small body
        (High[1] - MathMax(Open[1], Close[1]) > 0.5 * ATR[1] &&     // Long upper wick
        (MathMin(Open[1], Close[1]) - Low[1]) < 0.1 * ATR[1] )     // Little to no lower wick
    {
        Print("Gravestone Doji pattern detected");
    }

    Надгробие
    Бычий Марибозу Паттерн «бычий марибозу» определяется, когда свеча с индексом 1 является сильно бычьей (ее закрытие выше, чем открытие, т.е. Close[1] > Open[1]) почти без теней, что означает, что открытие очень близко к минимуму (Open[1] - Low[1] < 0.1 * ATR), а закрытие очень близко к максимуму (High[1] - Close[1] < 0.1 * ATR)


    // Check for Bullish Marubozu pattern
    if( Close[1] > Open[1] &&     // Bullish candle
        (High[1] - Close[1]) < 0.1 * ATR[1] &&     // Close is very close to high
        (Open[1] - Low[1]) < 0.1 * ATR[1] )     // Open is very close to low
    {
        Print("Bullish Marubozu pattern detected");
    }

    Бычий Марибозу
    Медвежий марибозу Паттерн «медвежий марибозу» определяется, когда свеча с индексом 1 является сильно медвежьей (ее закрытие ниже, чем открытие, т.е. Close[1] < Open[1]) почти без теней, что означает, что открытие очень близко к максимуму (High[1] - Open[1] < 0.1 * ATR), а закрытие очень близко к минимуму (Close[1] - Low[1] < 0.1 * ATR)


    // Check for Bearish Marubozu pattern
    if( Close[1] < Open[1] &&     // Bearish candle
        (High[1] - Open[1]) < 0.1 * ATR[1] &&     // Open is very close to high
        (Close[1] - Low[1]) < 0.1 * ATR[1] )     // Close is very close to low
    {
        Print("Bearish Marubozu pattern detected");
    }

    Медвежий марибозу
    Волчок Паттерн «волчок» определяется, когда свеча с индексом 1 имеет небольшое тело (абсолютная разница между ее закрытием и открытием менее, чем в 0,3 раза превышает ATR, т.е. MathAbs(Close[1] - Open[1]) < 0,3 * ATR), а длинная верхняя и нижняя тени (расстояние от верхнего из значений open или close до максимума, превышает в 0,5 раз ATR, т.е. High[1] - MathMax(Open[1], Close[1]) > 0.5 * ATR), а расстояние от нижнего из значений open или close до минимума более, чем в 0,5 раза превышает ATR, т.е. MathMin(Open[1], Close[1]) - Low[1] > 0.5 * ATR)


    // Check for Spinning Top pattern
    if( MathAbs(Close[1] - Open[1]) < 0.3 * ATR[1] &&     // Small body
        (High[1] - MathMax(Open[1], Close[1]) > 0.5 * ATR[1] &&     // Long upper wick
        (MathMin(Open[1], Close[1]) - Low[1]) > 0.5 * ATR[1] )     // Long lower wick
    {
        Print("Spinning Top pattern detected");
    }

    Волчок

    Коллекция многосвечных паттернов

    Свечной паттерн Логическое описание Справочное изображение
    Утренняя звезда Паттерн "утренняя звезда" определяется, когда свеча с индексом 3 является медвежьей (ее закрытие ниже, чем открытие, т.е. Close[3] < Open[3]), свеча с индексом 2 имеет небольшое тело (абсолютная разница между ее закрытием и открытием меньше, чем в 0,3 раза превышает ATR, т.е. MathAbs(Close[2] - Open[2]) < 0,3 * ATR), а свеча с индексом 1 является бычьей (ее закрытие выше, чем открытие, т.е. Close[1] > Open[1]). Кроме того, закрытие свечи 1 должно быть выше середины свечи 3 (Close[1] > (Open[3] + Close[3]) / 2)


    // Check for Morning Star pattern
    if( Close[3] < Open[3] &&     // Candle at index 3 is bearish
        MathAbs(Close[2] - Open[2]) < 0.3 * ATR[1] && // Candle at index 2 has a small body
        Close[1] > Open[1] &&     // Candle at index 1 is bullish
        Close[1] > (Open[3] + Close[3]) / 2 ) // Candle at index 1 closes above midpoint of candle 3
    {
        Print("Morning Star pattern detected");
    }

    Утренняя звезда
    Вечерняя звезда Паттерн «вечерняя звезда" определяется, когда свеча с индексом 3 является бычьей (ее закрытие выше, чем открытие, т.е. Close[3] > Open[3]), свеча с индексом 2 имеет небольшое тело (абсолютная разница между ее закрытием и открытием меньше, чем в 0,3 раза превышает ATR, т.е. MathAbs(Close[2] - Open[2]) < 0,3 * ATR), а свеча с индексом 1 является медвежьей (ее закрытие ниже, чем открытие, т.е. Close[1] < Open[1]). Кроме того, закрытие свечи 1 должно быть ниже середины свечи 3 (Close[1] < (Open[3] + Close[3]) / 2)


    // Check for Evening Star pattern
    if( Close[3] > Open[3] &&     // Candle at index 3 is bullish
        MathAbs(Close[2] - Open[2]) < 0.3 * ATR[1] && // Candle at index 2 has a small body
        Close[1] < Open[1] &&     // Candle at index 1 is bearish
        Close[1] < (Open[3] + Close[3]) / 2 ) // Candle at index 1 closes below midpoint of candle 3
    {
        Print("Evening Star pattern detected");
    }

    Три белых солдата Паттерн "три белых солдата" идентифицируется при появлении трех последовательных бычьих свечей: свеча с индексом 3 (Close[3] > Open[3]), свеча с индексом 2 (Close[2] > Open[2]) и свеча с индексом 1 (Close[1] > Open[1]). Тело каждой свечи должно быть больше, чем ATR (например, Close[3] - Open[3] > ATR), иметь небольшие верхние тени (например, High[3] - Close[3] < 0,3 * ATR), и каждая свеча должна открываться в пределах тела предыдущей свечи (например, Open[2] > Open[3] && Open[2] < Close[3])


    // Check for Three White Soldiers pattern
    // Candle 3 is bullish with large body and small upper wick
    if( Close[3] > Open[3] && (Close[3] - Open[3]) > ATR[1] && (High[3] - Close[3]) < 0.3 * ATR[1] &&  
     // Candle 2 is bullish with large body and small upper wick  
        Close[2] > Open[2] && (Close[2] - Open[2]) > ATR[1] && (High[2] - Close[2]) < 0.3 * ATR[1] &&    
     // Candle 1 is bullish with large body and small upper wick
        Close[1] > Open[1] && (Close[1] - Open[1]) > ATR[1] && (High[1] - Close[1]) < 0.3 * ATR[1] && 
    // Candle 2 opens within candle 3's body and closes higher   
        Open[2] > Open[3] && Open[2] < Close[3] && Close[2] > Close[3] &&  
    // Candle 1 opens within candle 2's body and closes higher   
        Open[1] > Open[2] && Open[1] < Close[2] && Close[1] > Close[2] )     
    {
        Print("Three White Soldiers pattern detected");
    }

    Три черные вороны Паттерн "три черных вороны" идентифицируется при появлении трех последовательных медвежьих свечей: свеча с индексом 3 (Close[3] < Open[3]), свеча с индексом 2 (Close[2] < Open[2]) и свеча с индексом 1 (Close[1] < Open[1]). Тело каждой свечи должно быть больше, чем ATR (например, Close[3] - Open[3] > ATR), иметь небольшие нижние тени (например, High[3] - Close[3] < 0,3 * ATR), и каждая открывается в пределах тела предыдущей свечи (например, Open[2] < Open[3] && Open[2] > Close[3])


    // Check for Three Black Crows pattern
     // Candle 3 is bearish with large body and small lower wick
    if( Close[3] < Open[3] && (Open[3] - Close[3]) > ATR[1] && (Open[3] - Low[3]) < 0.3 * ATR[1] &&   
     // Candle 2 is bearish with large body and small lower wick
        Close[2] < Open[2] && (Open[2] - Close[2]) > ATR[1] && (Open[2] - Low[2]) < 0.3 * ATR[1] &&  
       // Candle 1 is bearish with large body and small lower wick
        Close[1] < Open[1] && (Open[1] - Close[1]) > ATR[1] && (Open[1] - Low[1]) < 0.3 * ATR[1] && 
    // Candle 2 opens within candle 3's body and closes lower  
        Open[2] < Open[3] && Open[2] > Close[3] && Close[2] < Close[3] && 
    // Candle 1 opens within candle 2's body and closes lower    
        Open[1] < Open[2] && Open[1] > Close[2] && Close[1] < Close[2] )     
    {
        Print("Three Black Crows pattern detected");
    }

    Бычья харами Паттерн «бычья харами» определяется, когда свеча с индексом 2 является медвежьей (ее закрытие ниже, чем открытие, т.е. Close[2] < Open[2]), с телом больше, чем ATR (Open[2] - Close[2] > ATR), и свеча с индексом 1 является бычьей (ее закрытие выше, чем ее открытие, т.е. Close[1] > Open[1]), а ее тело полностью находится в теле свечи 2 (Open[1] > Close[2] && Close[1] < Open[2])


    // Check for Bullish Harami pattern
    // Candle 2 is bearish with large body
    if( Close[2] < Open[2] && (Open[2] - Close[2]) > ATR[1] && 
    // Candle 1 is bullish and within candle 2's body    
        Close[1] > Open[1] && Open[1] > Close[2] && Close[1] < Open[2] )     
    {
        Print("Bullish Harami pattern detected");
    }

    Медвежья харами Паттерн «медвежья харами» определяется, когда свеча с индексом 2 является бычьей (ее закрытие выше, чем открытие, т.е. Close[2] > Open[2]), с телом больше, чем ATR (Close[2] - Open[2] > ATR), и свеча с индексом 1 является медвежьей (ее закрытие ниже, чем ее открытие, т.е. Close[1] < Open[1]), а ее тело полностью находится в теле свечи 2 (Open[1] < Close[2] && Close[1] > Open[2])


    // Check for Bearish Harami pattern
    // Candle 2 is bullish with large body
    if( Close[2] > Open[2] && (Close[2] - Open[2]) > ATR[1] &&  
    // Candle 1 is bearish and within candle 2's body   
        Close[1] < Open[1] && Open[1] < Close[2] && Close[1] > Open[2] )     
    {
        Print("Bearish Harami pattern detected");
    }

    Бычье поглощение Паттерн бычьего поглощения определяется, когда свеча с индексом 2 является медвежьей (ее закрытие ниже, чем открытие, т.е. Close[2] < Open[2]), а свеча с индексом 1 - бычьей (ее закрытие выше, чем открытие, т.е. Close[1] > Open[1]). Кроме того, свеча с индексом 1 должна поглотить тело свечи с индексом 2, открывшись ниже уровня закрытия (Open[1] < Close[2]) и закрывшись выше её открытия (Close[1] > Open[2])


    // Check for Bullish Engulfing pattern
    if( Close[2] < Open[2] &&     // Candle at index 2 is bearish
        Close[1] > Open[1] &&     // Candle at index 1 is bullish
        Open[1] < Close[2] &&     // Candle at index 1 opens below candle at index 2's close
        Close[1] > Open[2] )     // Candle at index 1 closes above candle at index 2's open
    {
        Print("Bullish Engulfing pattern detected");
    }

    Медвежье поглощение Паттерн «медвежье поглощение» определяется, когда свеча с индексом 2 является бычьей (ее закрытие выше, чем открытие, т.е. Close[2] > Open[2]), а свеча с индексом 1 - медвежьей (ее закрытие ниже, чем открытие, т.е. Close[1] < Open[1]). Кроме того, свеча с индексом 1 должна полностью поглотить тело свечи с индексом 2, открывшись выше уровня закрытия (Open[1] > Close[2]) и закрывшись ниже её открытия (Close[1] < Open[2])


    // Check for Bearish Engulfing pattern
    if( Close[2] > Open[2] && // Candle at index 2 is bullish
        Close[1] < Open[1] &&   // Candle at index 1 is bearish
        Open[1] > Close[2] &&  // Candle at index 1 opens above candle at index 2's close
        Close[1] < Open[2] )   // Candle at index 1 closes below candle at index 2's open
    {
        Print("Bearish Engulfing pattern detected");
    }

    Три изнутри вверх Паттерн "три изнутри вверх" идентифицируется, когда свеча с индексом 3 является медвежьей (ее закрытие ниже, чем открытие, т.е. Close[3] < Open[3]) с большим телом (Open[3] - Close[3] > ATR), свеча с индексом 2 является бычьей (Close[2] > Open[2]) и содержится в свече 3 (Open[2] > Close[3] && Close[2] < Open[3]), а свеча 1 является бычьей (Close[1] > Open[1]), закрывающейся выше максимума свечи 2 (Close[1] > High[2])


    // Check for Three Inside Up pattern
     // Candle 3 is bearish with large body
    if( Close[3] < Open[3] && (Open[3] - Close[3]) > ATR[1] && 
     // Candle 2 is bullish and within candle 3's body   
        Close[2] > Open[2] && Open[2] > Close[3] && Close[2] < Open[3] &&
    // Candle 1 is bullish and closes above candle 2's high    
        Close[1] > Open[1] && Close[1] > High[2] )     
    {
        Print("Three Inside Up pattern detected");
    }

    Три изнутри вниз Паттерн "три изнутри вниз" идентифицируется, когда свеча с индексом 3 является бычьей (ее закрытие выше, чем открытие, т.е. Close[3] > Open[3]) с большим телом (Close[3] - Open[3] > ATR), свеча с индексом 2 является медвежьей (Close[2] < Open[2]) и содержится в свече 3 (Open[2] < Close[3] && Close[2] > Open[3]), а свеча 1 является медвежьей (Close[1] < Open[1]), закрывающейся ниже минимума свечи 2 (Close[1] < Low[2])


    // Check for Three Inside Down pattern
    // Candle 3 is bullish with large body
    if( Close[3] > Open[3] && (Close[3] - Open[3]) > ATR[1] && 
    // Candle 2 is bearish and within candle 3's body    
        Close[2] < Open[2] && Open[2] < Close[3] && Close[2] > Open[3] &&
    // Candle 1 is bearish and closes below candle 2's low    
        Close[1] < Open[1] && Close[1] < Low[2] ) 
    {     
        Print("Three Inside Down pattern detected");
    }

    Дно пинцета Паттерн «дно пинцета" определяется, когда свеча с индексом 2 является медвежьей (ее закрытие ниже, чем открытие, т.е. Close[2] < Open[2]), свеча с индексом 1 является бычьей (ее закрытие выше, чем открытие, т.е. Close[1] > Open[1]), а минимумы обеих свечей почти равны (абсолютная разница между Low[2] и Low[1] составляет менее 0,1 значения ATR, т.е. MathAbs(Low[2] - Low[1]) < 0.1 * ATR)


    // Check for Tweezer Bottom pattern
    if( Close[2] < Open[2] &&     // Candle at index 2 is bearish
        Close[1] > Open[1] &&     // Candle at index 1 is bullish
    // Lows of both candles are nearly equal
        MathAbs(Low[2] - Low[1]) < 0.1 * ATR[1] )
    {
        Print("Tweezer Bottom pattern detected");
    }


    Верх пинцета (Tweezer Top) Паттерн «верх пинцета" определяется, когда свеча с индексом 2 является бычьей (ее закрытие выше, чем открытие, т.е. Close[2] > Open[2]), свеча с индексом 1 является медвежьей (ее закрытие ниже, чем открытие, т.е. Close[1] < Open[1]), а максимумы обеих свечей почти равны (абсолютная разница между High[2] и High[1] составляет менее 0,1 значения ATR, т.е. MathAbs(High[2] - High[1]) < 0.1 * ATR)


    // Check for Tweezer Top pattern
    if( Close[2] > Open[2] &&     // Candle at index 2 is bullish
        Close[1] < Open[1] &&     // Candle at index 1 is bearish
    // Highs of both candles are nearly equal
        MathAbs(High[2] - High[1]) < 0.1 * ATR[1] )
    {
        Print("Tweezer Top pattern detected");
    }

    Бычий кикер Паттерн «бычий кикер" определяется, когда свеча с индексом 2 является медвежьей (ее закрытие ниже, чем открытие, т.е. Close[2] < Open[2]), а свеча с индексом 1 - бычьей (ее закрытие выше, чем открытие, т.е. Close[1] > Open[1]), а её открытие выше открытия свечи 2 (Open[1] > Open[2])


    .
    // Check for Bullish Kicker pattern
    if( Close[2] < Open[2] && // Candle at index 2 is bearish
    // Candle at index 1 is bullish
        Close[1] > Open[1] && 
    // Candle at index 1 opens above candle at index 2's open
        Open[1] > Open[2] ) 
    {
        Print("Bullish Kicker pattern detected");
    }

    Медвежий кикер Паттерн «медвежий кикер" определяется, когда свеча с индексом 2 является бычьей (ее закрытие выше, чем открытие, т.е. Close[2] > Open[2]), а свеча с индексом 1 - медвежьей (ее закрытие ниже, чем открытие, т.е. Close[1] < Open[1]), а её открытие ниже открытия свечи 2 (Open[1] < Open[2])


    // Check for Bearish Kicker pattern
    // Candle at index 2 is bullish
    if( Close[2] > Open[2] &&  
    // Candle at index 1 is bearish
        Close[1] < Open[1] &&  
    // Candle at index 1 opens below candle at index 2's open
        Open[1] < Open[2]  
    {
        Print("Bearish Kicker pattern detected");
    }

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

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

    Создание файла заголовка свечного паттерна многократного использования

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

    Правильный термин для этого типа файлов - заголовочный файл, и я рад назвать его infinity_candlestick_pattern.mqh, что отражает его расширяемость, поскольку со временем может быть добавлено больше паттернов. Я структурировал его в виде шаблона, который позже продемонстрирую в индикаторе, чтобы показать его практическое использование.

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

    Файл содержит две основные функции, IsHammer и IsShootingStar, которые анализируют массивы ценовых данных вместе с соответствующим средним истинным диапазоном (ATR), чтобы определить, соответствует ли конкретная свеча условиям для этих паттернов. Каждая функция проверяет действительность предоставленного индекса, вычисляет размер тела свечи, а затем оценивает длину теней относительно как размера тела, так и значений ATR. Этот тщательный подход позволяет количественно оценить визуальные торговые паттерны с использованием точных математических критериев, обеспечивая надежное распознавание паттернов, которое адаптируется к волатильности рынка. Кроме того, использование параметра patternATR (передаваемого по ссылке) помогает предотвратить потенциальные конфликты и предупреждения при последующем использовании значения ATR в примере индикатора, обеспечивая согласованность передаваемого значения.

    Для интегрирования этих функций в другие проекты можно просто включить этот заголовочный файл в свой исходный код, используя директиву #include. После включения они могут вызвать функцию IsHammer или IsShootingStar, передав соответствующие массивы и интересующий их индекс. 

    //+------------------------------------------------------------------+
    //|                     infinity_candlestick_pattern.mqh (Template)  |
    //|                                   Copyright 2025, Metaquotes Ltd |
    //|                                            https://www.mql5.com/ |
    //+------------------------------------------------------------------+
    #property copyright "Copyright 2025, Metaquotes Ltd"
    #property link      "https://www.mql5.com/"
    #ifndef INFINITY_CANDLESTICK_PATTERNS_MQH
    #define INFINITY_CANDLESTICK_PATTERNS_MQH
    
    //+------------------------------------------------------------------+
    //| Single-Candlestick Pattern Functions                             |
    //+------------------------------------------------------------------+
    
    // Hammer Pattern
    bool IsHammer(double &open[], double &high[], double &low[], double &close[], double &patternATR[], int index)
    {
       if (index < 0) return false; // Ensure the index is valid
       
       // Calculate the body size (absolute difference between close and open)
       double body = MathAbs(close[index] - open[index]);
       
       // Check if the body is small relative to ATR (less than 30% of ATR)
       if (body >= 0.3 * patternATR[index]) return false;
       
       // Calculate wick lengths
       double upperWick = high[index] - MathMax(open[index], close[index]);
       double lowerWick = MathMin(open[index], close[index]) - low[index];
       
       // Hammer conditions: long lower wick (2x body), small upper wick (≤0.5x body)
       if (lowerWick >= 2 * body && upperWick <= 0.5 * body)
          return true;
       
       return false;
    }
    
    // Shooting Star Pattern
    bool IsShootingStar(double &open[], double &high[], double &low[], double &close[], double &patternATR[], int index)
    {
       if (index < 0) return false; // Ensure the index is valid
       
       // Calculate the body size (absolute difference between close and open)
       double body = MathAbs(close[index] - open[index]);
       
       // Check if the body is small relative to ATR (less than 30% of ATR)
       if (body >= 0.3 * patternATR[index]) return false;
       
       // Calculate wick lengths
       double upperWick = high[index] - MathMax(open[index], close[index]);
       double lowerWick = MathMin(open[index], close[index]) - low[index];
       
       // Shooting Star conditions: long upper wick (2x body), small lower wick (≤0.5x body)
       if (upperWick >= 2 * body && lowerWick <= 0.5 * body)
          return true;
       
       return false;
    }
    
    //+------------------------------------------------------------------+
    //| How to Expand the Library                                        |
    //+------------------------------------------------------------------+
    // To add more patterns:
    // 1. Create a new function, e.g., IsDoji, IsEngulfing, etc.
    // 2. Use the same inputs: open[], high[], low[], close[], patternATR[], index
    // 3. Define the pattern’s conditions (e.g., for Doji, check if open ≈ close)
    // 4. Return true if the pattern matches, false otherwise
    // 5. For multi-candle patterns, adjust the index check (e.g., index < 1 for 2 candles)
    // 6. Use patternATR to adapt to volatility (optional)
    // 7. Add comments to explain your logic
    
    #endif
    //+------------------------------------------------------------------+

    Теперь перейдем к разработке индикатора, демонстрирующего, как применять только что созданный нами заголовочный файл. Я решил назвать его индикатором Hammer&ShootingStar, поскольку он будет использовать нашу библиотеку для обнаружения и визуализации этих двух свечных паттернов на графике. Это послужит практическим примером того, как наши многократно используемые функции можно реализовать в реальных торговых сценариях. Включив библиотеку в начало индикатора, мы получаем мгновенный доступ к функциям распознавания свечных паттернов, таким как IsHammer и IsShootingStar в этом контексте. Такая модульная конструкция позволяет индикатору сосредоточиться на сборе и обработке рыночных данных, одновременно передавая логику оценки паттернов библиотеке, обеспечивая согласованность и упрощая обслуживание.

    На этапе инициализации (OnInit) индикатор настраивает свои буферы и свойства графика, включая определение двух графиков со стрелками, которые визуально представляют обнаруженные паттерны. Он также создает хэндл ATR, используемый для получения данных о волатильности рынка, необходимых библиотечным функциям. На этапе расчета (OnCalculate) индикатор извлекает ценовые данные и значения ATR, а затем выполняет перебор по ценовому ряду. На каждом шаге он вызывает библиотечные функции, чтобы проверить, соответствует ли конкретная свеча критериям молота (сигнал на покупку) или падающей звезды (сигнал на продажу). В зависимости от результата, соответствующий буфер заполняется либо уровнем цены, на котором должна быть нарисована стрелка.

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

    //+------------------------------------------------------------------+
    //|                                          Hammer&ShootingStar.mq5 |
    //|                                   Copyright 2025, Metaquotes Ltd |
    //|                                            https://www.mql5.com/ |
    //+------------------------------------------------------------------+
    #property copyright "Copyright 2025, Metaquotes Ltd"
    #property link      "https://www.mql5.com/"
    #property version   "1.00"
    #property indicator_chart_window
    
    //--- Include the library
    #include <infinity_candlestick pattern.mqh>
    
    //--- Indicator settings
    #property indicator_chart_window
    #property indicator_buffers 2
    #property indicator_plots 2
    
    #property indicator_type1 DRAW_ARROW
    #property indicator_color1 0x0000FF
    #property indicator_label1 "Sell "
    
    #property indicator_type2 DRAW_ARROW
    #property indicator_color2 0xFF0000
    #property indicator_label2 "Buy "
    
    //--- Indicator buffers and variables
    double Buffer1[];
    double Buffer2[];
    double Open[];
    double High[];
    double Low[];
    double Close[];
    double atr[];
    int atrHandle;
    
    //+------------------------------------------------------------------+
    //| Custom indicator initialization function                         |
    //+------------------------------------------------------------------+
    int OnInit()
    {
       SetIndexBuffer(0, Buffer1);
       PlotIndexSetDouble(0, PLOT_EMPTY_VALUE, EMPTY_VALUE);
       PlotIndexSetInteger(0, PLOT_ARROW, 242);
       SetIndexBuffer(1, Buffer2);
       PlotIndexSetDouble(1, PLOT_EMPTY_VALUE, EMPTY_VALUE);
       PlotIndexSetInteger(1, PLOT_ARROW, 241);
    
       // Create ATR handle
       atrHandle = iATR(_Symbol, _Period, 14);
       if (atrHandle == INVALID_HANDLE)
       {
          Print("Failed to create ATR handle");
          return(INIT_FAILED);
       }
       return(INIT_SUCCEEDED);
    }
    
    //+------------------------------------------------------------------+
    //| Custom indicator iteration function                              |
    //+------------------------------------------------------------------+
    int OnCalculate(const int rates_total,
                    const int prev_calculated,
                    const datetime& time[],
                    const double& open[],
                    const double& high[],
                    const double& low[],
                    const double& close[],
                    const long& tick_volume[],
                    const long& volume[],
                    const int& spread[])
    {
       // Copy price data and ATR
       if (CopyOpen(Symbol(), PERIOD_CURRENT, 0, rates_total, Open) <= 0) return(rates_total);
       ArraySetAsSeries(Open, true);
       if (CopyHigh(Symbol(), PERIOD_CURRENT, 0, rates_total, High) <= 0) return(rates_total);
       ArraySetAsSeries(High, true);
       if (CopyLow(Symbol(), PERIOD_CURRENT, 0, rates_total, Low) <= 0) return(rates_total);
       ArraySetAsSeries(Low, true);
       if (CopyClose(Symbol(), PERIOD_CURRENT, 0, rates_total, Close) <= 0) return(rates_total);
       ArraySetAsSeries(Close, true);
       if (CopyBuffer(atrHandle, 0, 0, rates_total, atr) <= 0) return(rates_total);
       ArraySetAsSeries(atr, true);
    
       ArraySetAsSeries(Buffer1, true);
       ArraySetAsSeries(Buffer2, true);
    
       // Main loop
       for (int i = rates_total-2; i >= 0; i--)
       {
          // Sell Supply (Shooting Star)
          if (IsShootingStar(Open, High, Low, Close, atr, i))
             Buffer1[i] = High[i]; // Arrow at high
          else
             Buffer1[i] = EMPTY_VALUE;
    
          // Buy Supply (Hammer)
          if (IsHammer(Open, High, Low, Close, atr, i))
             Buffer2[i] = Low[i]; // Arrow at low
          else
             Buffer2[i] = EMPTY_VALUE;
       }
       return(rates_total);
    }



    Тестирование

    После успешного интегрирования я смог запустить индикатор Hammer&ShootingStar на графике MetaTrader 5 и получил отличные результаты. Индикатор эффективно выявлял и подсвечивал свечные паттерны, демонстрируя точность и практичность нашей библиотеки в реальных рыночных условиях.

     Volatility 75 (1s) Index.0,5 : Hammer&ShootingStar testing.

     Волатильность 75 (1s) Индекс.0,5 : Тестирование Hammer&ShootingStar



    Заключение

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

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

    Я бы хотел, чтобы в разделе комментариев вы поделились своими результатами, полученными из прикрепленного кода. Если позволит время, я вернусь к этой теме, чтобы развить то, чего мы достигли на данный момент, а также изучить дальнейшие достижения.
    Название файла Описание
    infinity_candlestick_pattern.mqh Заголовочный файл, содержащий набор логических функций для наиболее популярных свечных паттернов, готовых к вызову в других проектах.
    Hammer&ShootingStar.mq5,   Пример индикатора, объединяющего библиотеку infinity_candlestick_pattern.mqh.

    Назад к введению

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

    Прикрепленные файлы |
    Последние комментарии | Перейти к обсуждению на форуме трейдеров (1)
    Huynh Cong Chinh
    Huynh Cong Chinh | 27 апр. 2025 в 02:30
    Cảm ơn bạn đã giải thích chi tiết này! Tôi rất muốn tìm hiểu cách lập trình các mẫu nến thành một chỉ báo tùy chỉnh trong MQL5. Tôi đồng ý rằng việc tự động phát hiện mẫu có thể tiết kiệm rất nhiều thời gian và cải thiện độ chính xác. Tôi tò mò - khi tạo thư viện mẫu nến có thể tái sử dụng, bạn sẽ đề xuất tập trung vào khái niệm hoặc kỹ thuật toán học nào trước?
    Торговый инструментарий MQL5 (Часть 5): Расширение EX5-библиотеки для управления историей с помощью функций позиции Торговый инструментарий MQL5 (Часть 5): Расширение EX5-библиотеки для управления историей с помощью функций позиции
    В этой статье мы узнаем, как создавать экспортируемые EX5-функции для эффективного запроса и сохранения исторических данных о позициях. В этом пошаговом руководстве мы расширим EX5-библиотеку для управления историей (History Management), разработав модули, которые извлекают ключевые свойства последней закрытой позиции. К ним относятся чистая прибыль, продолжительность сделки, стоп-лосс и тейк-профит в пипсах, значения прибыли и другие важные данные.
    Нейросети в трейдинге: Модель адаптивной графовой диффузии (SAGDFN) Нейросети в трейдинге: Модель адаптивной графовой диффузии (SAGDFN)
    В статье мы раскрываем архитектуру SAGDFN — современного фреймворка, способного преобразовать подход к обработке пространственно-временных данных. Он сохраняет ключевую информацию даже в сложных графах и при этом снижает вычислительные издержки.
    Особенности написания экспертов Особенности написания экспертов
    Написание и тестирование экспертов в торговой системе MetaTrader 4.
    Таблицы в парадигме MVC на MQL5: Интегрируем компонент Model в компонент View Таблицы в парадигме MVC на MQL5: Интегрируем компонент Model в компонент View
    В статье создадим первую версию элемента управления TableControl (TableView). Это будет простая статичная таблица, создаваемая на основе входных данных, определяемых двумя массивами — массивом данных и массивом заголовков столбцов.