Этот пост продолжение ветки
zakaz.opentraders.ru/133614.html
К сожалению автор удалил мой коммент с замечаниями по коду, точнее по логике реализации в коде и написал, чтоб я создал новую тему.
Вот что исправлено в коде советника.
123_Pattern_EA_3.0.mq5 (22 Kb)
Главный баг: H&S — мёртвый код
В CheckHeadAndShouldersSell() логика такая:
head ищется как первый (ближайший к текущему бару) свинг-хай — сканирование идёт от InpRightBars вглубь истории, до первого true. Если найден, скажем, на баре 8 — значит бары от InpRightBars до 7 уже проверены IsSwingHigh и дали false (иначе цикл остановился бы раньше).
rightShoulder затем ищется в диапазоне [InpRightBars, head — InpRightBars — 1] (при InpRightBars=3 и head=8 это бары 3-4) — а это подмножество того же диапазона, который в пункте 1 уже полностью проверен тем же IsSwingHigh с теми же параметрами и дал одни false.
Данные между циклами не меняются — значит rightShoulder гарантированно останется -1 всегда, при любой истории и любом инструменте. Функция каждый раз упирается в if(rightShoulder == -1) return; ещё до расчёта neckline и до trade.Sell(). Абсолютно то же самое в CheckInverseHeadAndShouldersBuy().
То есть при InpUseHeadShoulders = true (значение по умолчанию) половина заявленной стратегии никогда не даст ни одной сделки. В тестере это будет выглядеть как «паттерн просто редко встречается», а не как баг — потому его и не заметили, судя по версии 2.50.
Фильтр касания флета — тоже по факту не фильтрует
В IsFlatBreakout() считаются topTouches/bottomTouches, но нигде не используются кроме отладочного принта. Реальная проверка (touchedTop/touchedBottom) ищет касание в том же диапазоне, по которому считался сам flatHigh/flatLow как максимум/минимум — а бар, задавший этот максимум, всегда тривиально «касается» сам себя (flatHigh >= flatHigh — tolerance истинно почти всегда). InpRequireTouch физически не может отсеять ни один пробой. Похоже, задумывалось требовать несколько касаний — для этого и считаются неиспользуемые topTouches/bottomTouches — но в финальное условие это не попало.
lastTradedIndex не защищает от повторного входа
Дедупликация хранит смещение (shift) бара, а не его время. Смещение одного и того же бара меняется на каждом новом баре. К моменту, когда проверка вообще может сработать повторно (после закрытия позиции по SL/TP, на следующем новом баре), число уже другое — и p3 == lastTradedIndex будет false, даже если это тот же самый свинг. Советник может открыть новую сделку по уже отработанному сетапу. Нужно сравнивать iTime(_Symbol, _Period, p3), а не сырой индекс.
Мельче:
PositionsTotal() > 0 (строка 56) проверяет весь счёт, а не позиции по символу/магику. Если открыта любая другая позиция — хоть ручная, хоть от другого советника — этот EA не будет торговать вообще, хотя магик-номер как раз для разграничения и задавался.
trade.SetTypeFilling(ORDER_FILLING_FOK) зашит намертво — на брокерах/символах без поддержки FOK ордера будут просто отклоняться.
Лот фиксированный (InpBaseLot), не зависит от дистанции стоп-лосса, а SL считается от структуры рынка — значит реальный риск в деньгах гуляет от сделки к сделке.
В H&S-функциях нет else с логированием ошибки trade.Sell/Buy, в отличие от функций 1-2-3 — если брокер отклонит ордер, в логе не останется следа.
Сама механика свинг-детекции (IsSwingHigh/IsSwingLow) и паттерна 1-2-3 написана верно, тут вопросов нет.
Кому интересно -качайте.
Комментарии (9)
25 igrun Сообщений: 1910 - igrun
25 igrun Сообщений: 1910 - igrun
5 Kadosh123456789 Автор Сообщений: 23 - Kadosh
25 igrun Сообщений: 1910 - igrun
5 Kadosh123456789 Автор Сообщений: 23 - Kadosh
23 poker Сообщений: 877
25 igrun Сообщений: 1910 - igrun
Это дефолтные настройки из моего поста голд Н1 с начала года. Завтра будет времы -накидаю скрипт на пайтоне и прогоню на котировках дюкасопи на нода 3-4 (не помню сколько у меня закачано)) Редактирован: 14 июля 2026, 20:50
5 Kadosh123456789 Автор Сообщений: 23 - Kadosh
25 igrun Сообщений: 1910 - igrun
Зарегистрируйтесь или авторизуйтесь, чтобы оставить комментарий