← К каталогу
Исходный код · ID 4188

Advanced Harmonic + RSI Scanner v6

indicator_advanced_harmonic_&_rsi_reversal_scanner_dual_wave_for.pine

Похожие материалы по тегам

ares_indicator.pineTradingView · 1 общих теговgold_trend_revers.mq5MQL5 / MetaTrader 5 · 1 общих тегов!!!-mt4 x-xardg-rsi.mq5MQL5 / MetaTrader 5 · 1 общих тегов! cycle-identifier.mq5MQL5 / MetaTrader 5 · 1 общих тегов!!! rsi ma simple+arrows 1.2 (mtf).mq5MQL5 / MetaTrader 5 · 1 общих теговprecisionflowea.mq5MQL5 / MetaTrader 5 · 1 общих тегов
Вы автор или правообладатель?

Сообщите нам, если считаете, что материал размещён без разрешения.

Краткий обзор

О программе

Инструмент для TradingView, написанный на Pine Script v6, который автоматически выявляет гармонические ценовые структуры на графике с помощью алгоритма ZigZag и подтверждает их сигналами RSI. Индикатор накладывает разметку на график, отмечая ключевые точки паттернов (X, A, B, C, D), строит линии целей и уровни риска, а также отображает стрелки входа. Поддерживается отображение нескольких типов гармонических паттернов и настройка чувствительности обнаружения.

Настройки программы

НастройкаОписание
prd_maj Длина основной волны — Длина волны для основного детектора пивотов ZigZag (целое число, минимум 5).
prd_min Длина дополнительной волны — Длина волны для дополнительного детектора пивотов ZigZag (целое число, минимум 2).
err Допуск Фибоначчи (%) — Допустимое отклонение от канонических соотношений при распознавании паттернов (числовое значение).
rsi_len Длина RSI — Период расчёта индикатора RSI (целое число).
rsi_ob Уровень перекупленности RSI — Порог RSI, при превышении которого формируется сигнал для медвежьего паттерна (целое число).
rsi_os Уровень перепроданности RSI — Порог RSI, при снижении ниже которого формируется сигнал для бычьего паттерна (целое число).
show_hist Сохранять исторические паттерны — Если включено, завершённые паттерны остаются на графике и не удаляются при появлении новых.
proj_bars Длина целевых линий (баров) — Количество баров вперёд от точки D для построения линий целей и стоп-лосса (целое число, минимум 5).
Получить полный код

Поиск по коду файла

indicator("Advanced Harmonic + RSI Scanner v6", overlay=true, max_lines_count=500, max_labels_count=500)

grp_zz   = "ZigZag (Wave) Settings"
prd_maj  = input.int(21, "Major Wave Length", group=grp_zz, minval=5)
prd_min  = input.int(8,  "Minor Wave Length", group=grp_zz, minval=2)
err      = input.float(8.0, "Fibonacci Tolerance (%)", group=grp_zz, minval=1.0) / 100

grp_rsi  = "RSI & Entry Settings"
rsi_len  = input.int(14, "RSI Length", group=grp_rsi)
rsi_ob   = input.int(70, "RSI Overbought", group=grp_rsi)
rsi_os   = input.int(30, "RSI Oversold", group=grp_rsi)

grp_ui   = "UI & History Settings"
show_hist = input.bool(true, "Keep Historical Patterns", group=grp_ui, tooltip="Stamps completed patterns on the chart so they don't disappear.")
proj_bars = input.int(20, "Target Line Length (Bars)", group=grp_ui, minval=5)

type Point
    int x     
    float p   
    int d     

type ZigZagTracker
    Point[] conf_pts
    int last_dir
    float live_p

var zz_maj = ZigZagTracker.new(array.new<Point>(), 0, 0.0)
var zz_min = ZigZagTracker.new(array.new<Point>(), 0, 0.0)

update_zz(ZigZagTracker zz, float ph, float pl, int b_index, float live_h, float live_l, int curr_index) =>
    if not na(ph)
        if zz.last_dir == 1
            if ph > zz.live_p
                zz.live_p := ph
                if zz.conf_pts.size() > 0
                    Point pt = zz.conf_pts.get(0)
                    pt.p := ph
                    pt.x := b_index
        else
            zz.conf_pts.unshift(Point.new(b_index, ph, 1))
            zz.last_dir := 1
            zz.live_p := ph
            if zz.conf_pts.size() > 5
                zz.conf_pts.pop()

    if not na(pl)
        if zz.last_dir == -1
            if pl < zz.live_p
                zz.live_p := pl
                if zz.conf_pts.size() > 0
                    Point pt2 = zz.conf_pts.get(0)
                    pt2.p := pl
                    pt2.x := b_index
        else
            zz.conf_pts.unshift(Point.new(b_index, pl, -1))
            zz.last_dir := -1
            zz.live_p := pl
            if zz.conf_pts.size() > 5
                zz.conf_pts.pop()

    if zz.conf_pts.size() > 0
        Point pD = zz.conf_pts.get(0)
        if zz.last_dir == 1
            if live_h > pD.p
                pD.p := live_h
                pD.x := curr_index
        else if zz.last_dir == -1
            if live_l < pD.p
                pD.p := live_l
                pD.x := curr_index
    true

ph_maj = ta.pivothigh(high, prd_maj, 1), pl_maj = ta.pivotlow(low, prd_maj, 1)
ph_min = ta.pivothigh(high, prd_min, 1), pl_min = ta.pivotlow(low, prd_min, 1)

update_zz(zz_maj, ph_maj, pl_maj, bar_index[1], high, low, bar_index)
update_zz(zz_min, ph_min, pl_min, bar_index[1], high, low, bar_index)

in_range(val, target, tolerance) =>
    math.abs(val - target) <= tolerance

get_pattern(has_x, ab_xa, bc_ab, xd_xa, cd_ab, tol) =>
    pat = "Invalid"
    if has_x
        if in_range(ab_xa, 0.618, tol) and (in_range(bc_ab, 0.382, tol) or in_range(bc_ab, 0.886, tol)) and in_range(xd_xa, 0.786, tol)
            pat := "GARTLEY"
        else if (in_range(ab_xa, 0.382, tol) or in_range(ab_xa, 0.500, tol)) and in_range(xd_xa, 0.886, tol)
            pat := "BAT"
        else if in_range(ab_xa, 0.786, tol) and (in_range(xd_xa, 1.272, tol) or in_range(xd_xa, 1.618, tol))
            pat := "BUTTERFLY"
        else if (in_range(ab_xa, 0.382, tol) or in_range(ab_xa, 0.618, tol)) and in_range(xd_xa, 1.618, tol)
            pat := "CRAB"

    if pat == "Invalid" and in_range(cd_ab, 1.0, tol) and bc_ab >= (0.382 - tol) and bc_ab <= (0.886 + tol)
        pat := "AB=CD"
    pat

evaluate_tracker(ZigZagTracker zz, float tol) =>
    pat = "Invalid"
    is_bull = false
    has_x = false
    if zz.conf_pts.size() >= 4
        Point pD = zz.conf_pts.get(0), Point pC = zz.conf_pts.get(1)
        Point pB = zz.conf_pts.get(2), Point pA = zz.conf_pts.get(3)
        has_x := zz.conf_pts.size() == 5
        Point pX = has_x ? zz.conf_pts.get(4) : Point.new(0, 0.0, 0)

        float ab = math.abs(pB.p - pA.p), float bc = math.abs(pC.p - pB.p), float cd = math.abs(pD.p - pC.p)
        float xa = has_x ? math.abs(pA.p - pX.p) : 0, float xd = has_x ? math.abs(pD.p - pX.p) : 0

        float ab_xa = xa > 0 ? ab / xa : 0
        float bc_ab = ab > 0 ? bc / ab : 0
        float xd_xa = xa > 0 ? xd / xa : 0
        float cd_ab = ab > 0 ? cd / ab : 0

        is_bull := pD.d == -1
        pat := get_pattern(has_x, ab_xa, bc_ab, xd_xa, cd_ab, tol)
    [pat, is_bull, has_x]

[maj_pat, maj_bull, maj_has_x] = evaluate_tracker(zz_maj, err)
[min_pat, min_bull, min_has_x] = evaluate_tracker(zz_min, err)

use_maj = (maj_pat != "Invalid") or (min_pat == "Invalid")
active_zz    = use_maj ? zz_maj    : zz_min
active_pat   = use_maj ? maj_pat   : min_pat
active_bull  = use_maj ? maj_bull  : min_bull
active_has_x = 

Показано первые 50% кода (символов: 7410)

Открыть по тарифу

Купите тариф с пакетом открытий или войдите, если тариф уже есть. Открытый файл останется в вашем кабинете навсегда.

Разовая покупка файла

На этой странице откроется полный исходный код файла вместо ознакомительного фрагмента.

Чтобы оформить заказ, введите email и перейдите к оплате.

Стоимость полного кода
741₽ ≈ $9.06