Advanced Harmonic + RSI Scanner v6
Похожие материалы по тегам
Сообщите нам, если считаете, что материал размещён без разрешения.
Сообщить о материале
Обращение по товару «indicator_advanced_harmonic_&_rsi_reversal_scanner_dual_wave_for.pine» отправится на рассмотрение. Укажите контакт для ответа и опишите причину.
О программе
Инструмент для 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? После подтверждения оплаты файл сохранится в кабинете на этот email. Если аккаунта ещё нет, мы создадим его и пришлём ссылку для задания пароля. Если аккаунт уже есть, покупка добавится в него. Укажите адрес, к которому у вас есть доступ.
Чтобы оформить заказ, введите email и перейдите к оплате.