Разработка инструментария для анализа Price Action (Часть 31): Модуль распознавания свечных паттернов на Python (I) – ручное распознавание
Содержание
Введение
Свечные графики – это базовый инструмент, который финансовые аналитики и трейдеры используют для визуализации и интерпретации движения цены во времени. Возникнув несколько веков назад у японских торговцев рисом, эти графики со временем стали важнейшей частью технического анализа на разных финансовых рынках, включая акции, 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
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-пакета
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
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-сервере
@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: ручное выявление паттернов
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: разбор ответа и действия советника
// 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 для распознавания свечных паттернов и рассмотрим более продвинутые методы и инструменты.
Перевод с английского произведен MetaQuotes Ltd.
Оригинальная статья: https://www.mql5.com/en/articles/18789
Предупреждение: все права на данные материалы принадлежат MetaQuotes Ltd. Полная или частичная перепечатка запрещена.
Данная статья написана пользователем сайта и отражает его личную точку зрения. Компания MetaQuotes Ltd не несет ответственности за достоверность представленной информации, а также за возможные последствия использования описанных решений, стратегий или рекомендаций.
Упрощение работы с базами данных в MQL5 (Часть 1): Введение в базы данных и SQL
Применение L1-фильтрации тренда в MetaTrader 5
Моделирование рынка (Часть 24): Первые шаги на SQL (VII)
Как организовать ИИ-хедж-фонд в MetaTrader 5
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Вы принимаете политику сайта и условия использования