English 中文 Deutsch 日本語
preview
Разработка инструментария для анализа Price Action (Часть 31): Модуль распознавания свечных паттернов на Python (I) – ручное распознавание

Разработка инструментария для анализа Price Action (Часть 31): Модуль распознавания свечных паттернов на Python (I) – ручное распознавание

MetaTrader 5Интеграция |
353 0
Christian Benjamin
Christian Benjamin

Содержание



Введение

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

Паттерны

Свеча дает важную информацию о рыночных настроениях, показывая ключевые данные – цены открытия, закрытия, максимума и минимума в пределах заданного таймфрейма. Уникальная структура каждой свечи дает представление о психологии рынка и может служить потенциальным торговым сигналом. 

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

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

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


Анализ свечных паттернов

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

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

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

Бычьи и медвежьи свечи

  • Бычьи свечи:

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

  • Медвежьи свечи:

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

  • Цветовые обозначения

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

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

Молот

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

# inside detect_patterns(df: pd.DataFrame)
for i, _ in enumerate(df.index):
    o,h,l,c = df.iloc[i][["OPEN","HIGH","LOW","CLOSE"]]
    body = abs(c - o)
    lower = min(o,c) - l
    upper = h - max(o,c)
    
    if lower >= 2*body and upper <= body:
        pats[i] = "hammer"
        continue

  • Размер тела свечи задается как (abs(close - open)).
  • Нижняя тень должна быть как минимум в 2 раза длиннее тела.
  • Верхняя тень должна быть небольшой, не больше тела.
  • Если это условие выполнено, паттерн помечается как "hammer" в массиве pats[].

Падающая звезда

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

# inside detect_patterns(df: pd.DataFrame)
for i, _ in enumerate(df.index):
    o,h,l,c = df.iloc[i][["OPEN","HIGH","LOW","CLOSE"]]
    body = abs(c - o)
    lower = min(o,c) - l
    upper = h - max(o,c)
    
    if upper >= 2*body and lower <= body:
        pats[i] = "shootingstar"
        continue

  • Тело – это разница между open и close.
  • Верхняя тень должна быть как минимум в 2 раза длиннее тела. Нижняя тень должна быть небольшой, меньше или равной телу.
  • Когда эти условия выполнены, паттерн помечается как "shootingstar".

Поглощение (бычье и медвежье)

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

# Bullish Engulfing: small red followed by large green that engulfs it
if i >= 1:
    prev_o, prev_c = df.iloc[i-1][["OPEN", "CLOSE"]]
    curr_o, curr_c = o, c
    if (prev_c < prev_o and curr_c > curr_o and  # red candle then green
        curr_o < prev_c and curr_c > prev_o):    # body engulfs previous
        pats[i] = "bullishengulfing"
        continue

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

# Bearish Engulfing: small green followed by large red that engulfs it
if i >= 1:
    prev_o, prev_c = df.iloc[i-1][["OPEN", "CLOSE"]]
    curr_o, curr_c = o, c
    if (prev_c > prev_o and curr_c < curr_o and  # green candle then red
        curr_o > prev_c and curr_c < prev_o):    # body engulfs previous
        pats[i] = "bearishengulfing"
        continue

Доджи

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

# Doji: very small or no real body
if abs(c - o) <= (h - l) * 0.1:
    pats[i] = "doji"
    continue

  • abs(c - o): размер тела свечи, то есть разница между close и open.
  • (h - l): общий диапазон свечи, то есть максимум минус минимум. Если тело меньше или равно 10% диапазона свечи, такую свечу относят к доджи.

Харами (бычий и медвежий)

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

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

if i >= 1:
    prev_o, prev_c = df.iloc[i-1][["OPEN", "CLOSE"]]
    curr_o, curr_c = o, c

    # Previous candle: large body (engulfing candle)
    prev_body = abs(prev_c - prev_o)
    curr_body = abs(curr_c - curr_o)

    if prev_body > 0 and curr_body > 0:
        # Bullish Harami
        if prev_o > prev_c and curr_o < curr_c:  # bearish → bullish
            if curr_o > prev_c and curr_c < prev_o:
                pats[i] = "bullishharami"
                continue

        # Bearish Harami
        if prev_o < prev_c and curr_o > curr_c:  # bullish → bearish
            if curr_o < prev_c and curr_c > prev_o:
                pats[i] = "bearishharami"
                continue

Утренняя звезда

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

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

if i >= 2:
    o1, c1 = df.iloc[i-2][["OPEN", "CLOSE"]]  # First candle
    o2, c2 = df.iloc[i-1][["OPEN", "CLOSE"]]  # Second (small) candle
    o3, c3 = df.iloc[i][["OPEN", "CLOSE"]]    # Third candle

    # Candle directions
    is_bearish1 = c1 < o1
    is_small2 = abs(c2 - o2) < abs(c1 - o1) * 0.5
    is_bullish3 = c3 > o3

    # Morning Star Logic
    if is_bearish1 and is_small2 and c3 > ((o1 + c1) / 2) and c3 > o3:
        if min(o2, c2) < c1 and max(o2, c2) > c1:  # small gap
            pats[i] = "morningstar"
            continue

  • Свеча 1: длинная медвежья свеча (тело направлено вниз).
  • Свеча 2: свеча с небольшим телом (может быть бычьей или медвежьей).
  • Свеча 3: сильная бычья свеча, которая закрывается выше средней точки свечи 1.

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

Вечерняя звезда

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

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

if i >= 2:
    o1, c1 = df.iloc[i-2][["OPEN", "CLOSE"]]  # First candle
    o2, c2 = df.iloc[i-1][["OPEN", "CLOSE"]]  # Second (small) candle
    o3, c3 = df.iloc[i][["OPEN", "CLOSE"]]    # Third candle

    is_bullish1 = c1 > o1
    is_small2 = abs(c2 - o2) < abs(c1 - o1) * 0.5
    is_bearish3 = c3 < o3

    if is_bullish1 and is_small2 and c3 < ((o1 + c1) / 2) and c3 < o3:
        if max(o2, c2) > c1 and min(o2, c2) < c1:  # small gap possible
            pats[i] = "eveningstar"
            continue

  • Свеча 1: длинное бычье тело.
  • Свеча 2: небольшое тело (нерешительность).
  • Свеча 3: сильная медвежья свеча, закрывающаяся значительно ниже средней точки свечи 1.

Этот паттерн из трех свечей указывает на возможный разворот тренда с бычьего на медвежий.


Взаимодействие MQL5 и Python

В нашей архитектуре основная логика распознавания свечных паттернов вынесена в Python-микросервис, тогда как советник MQL5 отвечает за сбор данных, разметку графика и оповещения. Каждый раз, когда закрывается новый бар, советник берет OHLC-данные по последним 31 бару, передает их в виде JSON локальному Flask-серверу, а затем наносит на график паттерны, которые вернул сервер, – все это почти в реальном времени. Вот как это работает шаг за шагом.
  • Советник MQL5: сбор данных в MQL5
На каждом новом баре в OnTick советник записывает в массивы временные метки, а также цены открытия, максимума, минимума и закрытия за последние 31 бар.
void OnTick()
{
   static datetime lastBar = 0;
   datetime bar = iTime(_Symbol, InpTF, 0);
   if(bar == lastBar) return;
   lastBar = bar;

   double o[ BARS ], h[ BARS ], l[ BARS ], c[ BARS ];
   long   t[ BARS ];
   for(int i=0; i<BARS; i++)
   {
      o[i] = iOpen(_Symbol, InpTF, i+1);
      h[i] = iHigh(_Symbol, InpTF, i+1);
      l[i] = iLow (_Symbol, InpTF, i+1);
      c[i] = iClose(_Symbol, InpTF, i+1);
      t[i] = (long)iTime(_Symbol, InpTF, i+1);
   }
   // …then build JSON…
}
  • Советник MQL5: формирование JSON-пакета
С помощью StringFormat советник объединяет символ, таймфрейм, временные метки и массивы OHLC в единую строку JSON, готовую к передаче.
string json = StringFormat(
  "{\"symbol\":\"%s\",\"timeframe\":%d,"
  "\"time\":[%s],\"open\":[%s],\"high\":[%s],"
  "\"low\":[%s],\"close\":[%s]}",
  _Symbol, InpTF,
  CSVInt(t), CSV(o), CSV(h), CSV(l), CSV(c)
);
  • Советник MQL5: отправка через HTTP POST
Советник отправляет WebRequest("POST", …) на http://127.0.0.1:5000/patterns. Если запрос завершается ошибкой, советник записывает ее в лог; в противном случае он получает JSON-ответ от Python-сервера.
char body[];    StringToCharArray(json, body);
char reply[];   string hdr="Content-Type: application/json\r\n", respHdr;
int code = WebRequest("POST", InpURL, hdr, InpTimeout, body, reply, respHdr);
if(code == -1)
  Print("[CSLAB] WebRequest failed: ", GetLastError());
else
  string resp = CharArrayToString(reply, 0, -1, CP_UTF8);
  • Python: обработка на Flask-сервере
Python-сервис удаляет лишние символы в конце строки, декодирует очищенный JSON в словарь и заново собирает pandas DataFrame с индексом по переданным временным меткам.
@app.route("/patterns", methods=["POST"])
def patterns():
    raw = request.get_data(as_text=True)
    idx = raw.rfind("}")
    clean = raw[:idx+1] if idx != -1 else raw
    payload = json.loads(clean)   # may raise JSONDecodeError
    # …build DataFrame…

  • Python: построение DataFrame

Функция build_dataframe преобразует необработанные JSON-массивы временных меток, цен открытия, максимумов, минимумов и закрытий в DataFrame с временным индексом, с которым нашему детектору паттернов удобно работать:

def build_dataframe(payload):
    times = [ datetime.fromtimestamp(int(t), timezone.utc)
              for t in payload["time"] ]
    df = pd.DataFrame({
      "OPEN":  payload["open"],
      "HIGH":  payload["high"],
      "LOW":   payload["low"],
      "CLOSE": payload["close"]
    }, index=times)
    df.index.name = "datetime"
    return df

  • Python: ручное выявление паттернов

Наша процедура detect_patterns(df) проверяет каждую строку на наличие сигналов доджи, "молот", "падающая звезда", поглощения, "харами", "утренняя звезда" и "вечерняя звезда" – без использования сторонних библиотек технического анализа.
def detect_patterns(df):
    pats = ["None"]*len(df)
    for i in range(len(df)):
        o,h,l,c = df.iloc[i][["OPEN","HIGH","LOW","CLOSE"]]
        body = abs(c-o); rng = max(h-l,1e-6)
        lower = min(o,c)-l; upper = h-max(o,c)
        # doji
        if body/rng <= 0.1:
            pats[i] = "doji"; continue
        # hammer
        if lower>=2*body and upper<=body:
            pats[i] = "hammer"; continue
        # shooting star
        if upper>=2*body and lower<=body:
            pats[i] = "shootingstar"; continue
        # bullish engulfing
        if i>0:
            po,pc = df.iloc[i-1][["OPEN","CLOSE"]]
            if pc<po and c>o and o<=pc and c>=po:
                pats[i] = "bullishengulfing"; continue
        # bearish engulfing
        if i>0:
            po,pc = df.iloc[i-1][["OPEN","CLOSE"]]
            if pc>po and c<o and o>=pc and c<=po:
                pats[i] = "bearishengulfing"; continue
        # harami
        if i>0:
            po,pc = df.iloc[i-1][["OPEN","CLOSE"]]
            if pc<po and o<c and o>pc and c<po:
                pats[i] = "bullishharami"; continue
            if pc>po and o>c and o<pc and c>po:
                pats[i] = "bearishharami"; continue
        # morning star
        if i>1:
            o1,c1 = df.iloc[i-2][["OPEN","CLOSE"]]
            o2,c2 = df.iloc[i-1][["OPEN","CLOSE"]]
            if c1<o1 and abs(c2-o2)<(df.iloc[i-1]["HIGH"]-df.iloc[i-1]["LOW"])*0.3 \
               and c>o2 and c>(o1+c1)/2:
                pats[i] = "morningstar"; continue
        # evening star
        if i>1:
            o1,c1 = df.iloc[i-2][["OPEN","CLOSE"]]
            o2,c2 = df.iloc[i-1][["OPEN","CLOSE"]]
            if c1>o1 and abs(c2-o2)<(df.iloc[i-1]["HIGH"]-df.iloc[i-1]["LOW"])*0.3 \
               and c<o2 and c<(o1+c1)/2:
                pats[i] = "eveningstar"; continue
    return pats
  • Python: формирование ответа

Сервер подсчитывает все паттерны, кроме "None", и возвращает компактную структуру JSON:

pats = detect_patterns(df)
counts = Counter(pats)
log_lines = [f"{k}={v}" for k,v in counts.items() if k!="None"]
resp = {"patterns": pats, "log": log_lines, "ms": round((datetime.now(timezone.utc)-start).total_seconds()*1000,2)}
return make_response(json.dumps(resp), 200, {"Content-Type":"application/json"})
  • Советник MQL5: разбор ответа и действия советника
Вернувшись в MQL5, мы извлекаем массив "patterns", убеждаемся, что он содержит 31 элемент, и записываем в лог все сообщения из поля "log". Затем для каждого реального паттерна мы рисуем текстовую метку над соответствующим баром и вызываем Alert().
// extract patterns array
string patTxt; ExtractArray(resp, "patterns", patTxt);
string patt[]; ParseArray(patTxt, patt);
// draw+alert
for(int i=0;i<BARS;i++)
   if(patt[i]!="None")
   {
      datetime tm=iTime(_Symbol,InpTF,i+1);
      ObjectCreate(0,"CS_"+i,OBJ_TEXT,0,tm,iHigh(_Symbol,InpTF,i+1));
      ObjectSetString(0,"CS_"+i,OBJPROP_TEXT,patt[i]);
      Alert(_Symbol, " ", patt[i], " at ", TimeToString(tm,TIME_DATE|TIME_MINUTES));
   }


Тестирование и результаты

В этом разделе мы сосредоточимся на тестировании системы и анализе результатов. Прежде чем продолжить, давайте сначала разберем, как установить Python и настроить сервер, чтобы все работало без сбоев.

Скачайте Python

Первым шагом скачайте и установите Python с официального сайта. Нажмите большую желтую кнопку с надписью "Download Python 3.x.x".

Запустите установщик

Дважды кликните по загруженному файлу. Перед тем как нажать "Install Now", установите флажок "Add Python to PATH". Это позволит запускать Python из любого каталога через командную строку. Нажмите "Install Now", а после завершения установки – "Close".

Проверьте установку

Нажмите Win + R, введите cmd и нажмите Enter. В открывшемся черном окне введите:

python --version

Вы должны увидеть что-то вроде "Python 3.10.4". Если да, значит Python успешно установлен.

После успешной установки Python следующим шагом будет создание нашего Python-скрипта.

Откройте Notepad++

Запустите Notepad++ или любой другой текстовый редактор без форматирования.

Создайте новый файл

Выберите File – New, затем Language – P – Python, чтобы включить подсветку синтаксиса (необязательно).

Вставьте код сервера

Скопируйте все содержимое pattern_server.py, то есть Flask-приложение с detect_patterns(df) и остальным кодом, и вставьте его в это новое окно.

Сохраните файл

  • Перейдите в File – Save As...
  • Перейдите в папку, которую легко запомнить, например "C:\PatternServer".
  • В поле "File name" введите pattern_server.py (расширение .py здесь обязательно).
  • Нажмите "Save".

Установите необходимые библиотеки

Откройте командную строку

Для начала одновременно нажмите клавишу Windows + R, чтобы открыть диалоговое окно "Run". Введите cmd в поле ввода, затем нажмите Enter или кнопку "OK", чтобы открыть окно командной строки. Здесь вы будете выполнять команды для перемещения по файловой системе и запуска скриптов.

Смените каталог

Затем нужно перейти в папку, где находится ваш Python-скрипт. В командной строке используйте команду cd (change directory), а затем укажите путь к папке со скриптом. Например:

cd path\to\your\script\folder
Замените path\to\your\script\folder на фактический путь в вашей системе. Этот шаг гарантирует, что текущая сессия терминала указывает на правильную папку со скриптом и вы сможете без проблем его запустить.

Установите Flask и pandas

pip install flask pandas

Эта команда установит Flask (наш небольшой веб-сервер) и pandas (для обработки данных). Вы увидите примерно следующее:

* Serving Flask app "pattern_server"
* Running on http://127.0.0.1:5000/ (Press CTRL+C to quit)

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

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

Логи на вкладке "Эксперты" в MetaTrader 5

2025.07.09 22:25:42.248 Candlestick Label (EURUSD,M15)  [CSLAB] EA started – allow http://127.0.0.1:5000/patterns in Tools→Options→Expert Advisors→WebRequest
2025.07.09 22:25:42.790 Candlestick Label (EURUSD,M15)  [CSLAB] JSON-OUT: {"symbol":"EURUSD",
"timeframe":0,"time":[1752064200,1752065100,1752066000,1752066900,1752067800,1752068700,1752069600,
1752070500,1752071400,1752072300,1752073200,1752074100,1752075000,1752075900,1752076800,1752077700,
1752078600,1752079500,1752080400,1752081300,1752082200,1752083100,1752084000,1752084900,1752085800,
1752086700,1752087600,1752088500,1752089400,1752090300,1752091200],"open":[1.17051,1.17045,1.17153,
1.17167,1.17143,1.17096,1.17034,1.17152,1.17193,1.17194,1.17148,1.17095,1.1706

2025.07.09 22:25:42.790 Candlestick Label (EURUSD,M15)  [CSLAB] POST http://127.0.0.1:5000/patterns
2025.07.09 22:25:42.938 Candlestick Label (EURUSD,M15)  [CSLAB] HTTP 200 RESP: {"patterns": ["doji",
 "bullishengulfing", "None", "None", "eveningstar", "None", "bullishengulfing", "None", "doji", 
"bearishengulfing", "None", "None", "None", "None", "None", "bearishengulfing", "None", "None", 
"bullishengulfing", "doji", "bearishengulfing", "None", "None", "None", "None", "None", "None",
 "None", "hammer", "eveningstar", "None"], "log": ["doji=3", "bullishengulfing=3", "eveningstar=2",
 "bearishengulfing=3", "hammer=1", "total patterns=12"], "ms": 128.25}
2025.07.09 22:25:42.938 Candlestick Label (EURUSD,M15)  [CSLAB] SERVER: doji=3
2025.07.09 22:25:42.938 Candlestick Label (EURUSD,M15)  [CSLAB] SERVER: bullishengulfing=3
2025.07.09 22:25:42.938 Candlestick Label (EURUSD,M15)  [CSLAB] SERVER: eveningstar=2
2025.07.09 22:25:42.938 Candlestick Label (EURUSD,M15)  [CSLAB] SERVER: bearishengulfing=3
2025.07.09 22:25:42.938 Candlestick Label (EURUSD,M15)  [CSLAB] SERVER: hammer=1
2025.07.09 22:25:42.938 Candlestick Label (EURUSD,M15)  [CSLAB] SERVER: total patterns=12

Логи Python в CMD

2025-07-09 22:25:42,806 [INFO] RAW BODY: {"symbol":"EURUSD","timeframe":0,"time":[1752064200,1752065100,1752066000,1752066900,1752067800,
1752068700,1752069600,1752070500,1752071400,1752072300,1752073200,1752074100,1752075000,1752075900,1752076800,1752077700,1752078600,
1752079500,1752080400,1752081300,1752082200,1752083100,1752084000,1752084900,1752085800,1752086700,1752087600,1752088500,1752089400,
1752090300,1752091200],"open":[1.17051,1.17045,1.17153,1.17167,1.17143,1.17096,1.17034,1.17152,1.17193,1.17194,1.17148,1.17095,1.17066,
1.17085,1.17060,1.17072,1.17015,1.17066,1.17050,1.17087,1.17088,1.17059,1.17086,1.17174,1.17160,1.17105,1.17134,1.17166,1.17216,1.17226,
1.17189],"high":[1.17091,1.17170,1.17206,1.17225,1.17186,1.17098,1.17160,1.17246,1.17223,1.17194,1.17163,1.17112,1.17098,1.17103,1.17091,
1.17088,1.17071,1.17073,1.17109,1.17104,1.17092,1.17102,1.17179,1.17176,1.17164,1.17147,1.17170,1.17222,1.17232,1.17232,1.17199],
"low":[1.17008,1.17036,1.17120,1.17109,1.17088,1.17005,1.17028,1.17152,1.17152,1.17131,1.17095,1.17050,1.17055,1.17050,1.17059,1.17009,1.17013,
1.17039,1.17039,1.17077,1.17043,1.17056,1.17051,1.17141,1.17091,1.17101,1.17130,1.17163,1.17188,1.17180,1.17163],"close":[1.17045,
1.17153,1.17170,1.17143,1.17096,1.17034,1.17152,1.17193,1.17194,1.17149,1.17096,1.17066,1.17086,1.17061,1.17072,1.17015,1.17067,
1.17050,1.17087,1.17088,1.17058,1.17087,1.17175,1.17160,1.17104,1.17133,1.17165,1.17216,1.17227,1.17189,1.17177]}
2025-07-09 22:25:42,934 [INFO] SEND: {'patterns': ['doji', 'bullishengulfing', 'None', 'None', 'eveningstar', 'None', 'bullishengulfing',
 'None', 'doji', 'bearishengulfing','None', 'None', 'None', 'None', 'None', 'bearishengulfing', 'None', 'None', 'bullishengulfing', 'doji',
 'bearishengulfing', 'None', 'None', 'None', 'None', 'None', 'None', 'None','hammer', 'eveningstar', 'None'], 'log': ['doji=3', 
'bullishengulfing=3', 'eveningstar=2', 'bearishengulfing=3', 'hammer=1', 'total patterns=12'], 'ms': 128.25}
2025-07-09 22:25:42,936 [INFO] 127.0.0.1 - - [09/Jul/2025 22:25:42] "POST /patterns HTTP/1.1" 200 -

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


Заключение

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

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





   
Chart Projector
Analytical Comment
Analytics Master
Analytics Forecaster 
Volatility Navigator
Mean Reversion Signal Reaper
Signal Pulse 
Metrics Board 
External Flow
VWAP
Heikin Ashi   FibVWAP  
RSI DIVERGENCE
Parabolic Stop and Reverse (PSAR) 
Скрипт Quarters Drawer
Intrusion Detector
TrendLoom Tool  Quarters Board 
ZigZag Analyzer  Correlation Pathfinder  Market Structure Flip Detector Tool
Correlation Dashboard   Currency Strength Meter 
PAQ Analysis Tool 
Dual EMA Fractal Breaker
Pin bar, Engulfing and RSI divergence
Liquidity Sweep Opening Range Breakout Tool Boom and Crash Interceptor CCI Zer-Line EA
Candlestick Recognition          

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

Прикрепленные файлы |
patterns.py (5.24 KB)
Упрощение работы с базами данных в MQL5 (Часть 1): Введение в базы данных и SQL Упрощение работы с базами данных в MQL5 (Часть 1): Введение в базы данных и SQL
Мы рассмотрим, как работать с базами данных в MQL5, используя встроенные функции языка. Мы рассмотрим все аспекты, от создания, вставки, обновления и удаления таблиц до импорта и экспорта данных, и все это с примерами кода. Данный материал служит прочной основой для понимания внутренних механизмов доступа к данным, подготавливая почву для обсуждения ORM (Object-Relational Mapping, объектно-реляционное отображение), где мы создадим его на языке MQL5.
Применение L1-фильтрации тренда в MetaTrader 5 Применение L1-фильтрации тренда в MetaTrader 5
В статье рассматривается практическое применение L1-фильтрации тренда в MetaTrader 5, включая математические основы метода и его использование в языке MQL5. L1-фильтр позволяет выделять кусочно-линейные тренды, сохраняя ключевую структуру рынка и эффективно подавляя ценовой шум. Исследуются свойства масштабирования параметров, особенности оценки тренда и способы интеграции метода в алгоритмические торговые стратегии. Экспериментальные результаты показывают, как L1-фильтрация тренда улучшает стабильность сигналов, тайминг сделок и общую устойчивость торговых систем.
Моделирование рынка (Часть 24): Первые шаги на SQL (VII) Моделирование рынка (Часть 24): Первые шаги на SQL (VII)
В предыдущей статье мы завершили необходимое введение в тему SQL. И то, что мы хотели показать и объяснить о SQL, на мой взгляд, мы разъяснили должным образом. Так было сделано для того, чтобы каждый, кто придет посмотреть на строящуюся систему репликации/моделирования, мог хотя бы получить представление о том, что там может происходить. Дело в том, что нет смысла программировать вещи, с которыми SQL справляется идеально.
Как организовать ИИ-хедж-фонд в MetaTrader 5 Как организовать ИИ-хедж-фонд в MetaTrader 5
В статье разобрана архитектура совета из 15 ИИ-агентов: десять аналитиков и четыре риск-офицера голосуют в трёх параллельных фазах, итог фиксирует Председатель. Для восьми валютных пар используются изолированные контексты с отдельными репутациями. Динамический порог голосов зависит от дневных целей PnL. Expert Advisor работает только по сигналу SL и TP, что позволяет оценить качество решений без дополнительной механики.