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

Drone Arrows with Supply & Demand

indicator_drone_arrows_with_supply_&_demand_for_tradingview.pine
Вы автор или правообладатель?

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

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

О программе

Индикатор «Drone Arrows with Supply & Demand» (Drone S&D) — это инструмент анализа и отображения для TradingView, написанный на Pine Script v6. Он наносит на ценовой график графические маркеры BUY и SELL, формируемые на основе расчёта SuperTrend с настраиваемой чувствительностью и параметрами ATR.

Сигналы дополнительно фильтруются по нескольким критериям: направление тренда (на основе скользящей средней), объём и импульс цены. Между сигналами действует механизм охлаждения, исключающий слишком частые переключения. Встроенный дашборд отображает направление тренда на семи таймфреймах — от M1 до Daily — с использованием EMA 50.

Индикатор позволяет отображать уровни стоп-лосса и до пяти уровней тейк-профита в виде меток и линий на графике с настраиваемым расстоянием и точностью отображения. Также доступны условия для оповещений TradingView по сигналам покупки, продажи и сильным рыночным условиям.

Продукт работает как наложение (overlay) на ценовой график и не является автоматическим советником. Все параметры настраиваются пользователем через панель настроек индикатора.

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

НастройкаОписание
sensitivity Чувствительность — Чувствительность SuperTrend: множитель, умножающий ATR-множитель.
atr_length Длина ATR — Длина периода ATR для расчёта SuperTrend.
atr_multiplier Множитель ATR — Множитель ATR, определяющий чувствительность SuperTrend.
use_trend_filter Использовать фильтр тренда — Включает фильтрацию сигналов по направлению тренда на текущем таймфрейме.
ma_length Длина скользящей средней — Период скользящей средней для фильтрации по тренду.
use_volume_filter Использовать фильтр объёма — Включает фильтрацию сигналов по объёму сделок.
volume_threshold Порог объёма — Пороговое значение объёма относительно его средней для прохождения фильтра.
show_signals Показать сигналы — Включает отображение маркеров BUY и SELL на графике.
levels2 Показать уровни TP/SL — Включает отображение уровней тейк-профита и стоп-лосса на графике.
lvlLines Показать линии — Включает отображение горизонтальных линий уровней TP/SL на графике.
linesStyle Стиль линий — Стиль линий уровней: сплошная, пунктирная или точечная.
lvlDistance Расстояние — Расстояние в барах от текущего бара до размещения меток и линий уровней.
lvlDecimals Десятичные знаки — Количество знаков после запятой при отображении значений уровней.
atrRisk Множитель риска — Множитель ATR для расчёта расстояния стоп-лосса от цены входа.
atrLen Длина ATR — Длина ATR для расчёта уровней риска в системе управления рисками.
percentStop Стоп-лосс % — Процент стоп-лосса от цены входа (0 — отключено).
show_dashboard Показать дашборд — Включает отображение дашборда с данными по трендам на разных таймфреймах.
Получить полный код

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

indicator("Drone Arrows with Supply & Demand", "Drone S&D", overlay = true)

sensitivity = input.float(1.0, "Sensitivity", 0.1, 5.0, 0.1, group="Signal Settings")
atr_length = input.int(10, "ATR Length", 1, 50, group="Signal Settings")
atr_multiplier = input.float(7.0, "ATR Multiplier", 1.0, 20.0, 0.5, group="Signal Settings")

use_trend_filter = input.bool(true, "Use Trend Filter", group="Filters")
ma_length = input.int(20, "Moving Average Length", 5, 100, group="Filters")
use_volume_filter = input.bool(false, "Use Volume Filter", group="Filters")
volume_threshold = input.float(1.1, "Volume Threshold", 1.0, 3.0, 0.1, group="Filters")

show_signals = input.bool(true, "Show Signals", group="Display")

levels2      = input.bool(true, "Show TP/SL Levels" , group = "Risk Management" , inline = "MMDB2")
lvlLines     = input.bool(true, "Show Lines ", inline="levels2", group = "Risk Management")
linesStyle   = input.string("SOLID", "", ["SOLID", "DASHED", "DOTTED"], inline="levels2", group = "Risk Management")
lvlDistance  = input.int(40, "Distance", 1, inline="levels2", group = "Risk Management")
lvlDecimals  = input.int(4, "   Decimals", 1, 8, inline="levels2", group = "Risk Management")
atrRisk      = input.int(3, "Risk Multiplier ", 1, group = "Risk Management" , inline="levels3")
atrLen       = input.int(14, "  ATR Length", 1, group = "Risk Management" , inline="levels3")
percentStop  = input.float(1, "Stop Loss % (0 to Disable)", 0, group="Risk Management")

show_dashboard = input.bool(true, "Show MTF Dashboard", group="Dashboard")

style2 = linesStyle == "SOLID" ? line.style_solid : linesStyle == "DASHED" ? line.style_dashed : line.style_dotted

supertrend(src, factor, atrLen) =>
    atr = ta.atr(atrLen)
    upperBand = src + factor * atr
    lowerBand = src - factor * atr
    prevLowerBand = nz(lowerBand[1])
    prevUpperBand = nz(upperBand[1])
    lowerBand := lowerBand > prevLowerBand or close[1] < prevLowerBand ? lowerBand : prevLowerBand
    upperBand := upperBand < prevUpperBand or close[1] > prevUpperBand ? upperBand : prevUpperBand
    var int direction = na
    var float superTrend = na
    prevSuperTrend = nz(superTrend[1])

    if na(atr[1])
        direction := 1
    else if prevSuperTrend == prevUpperBand
        direction := close > upperBand ? -1 : 1
    else
        direction := close < lowerBand ? 1 : -1

    superTrend := direction == -1 ? lowerBand : upperBand
    [superTrend, direction]

[supertrend_line, direction] = supertrend(close, sensitivity * atr_multiplier, atr_length)

raw_buy = ta.crossover(close, supertrend_line)
raw_sell = ta.crossunder(close, supertrend_line)

ma = ta.sma(close, ma_length)
trend_up = close > ma
trend_down = close < ma
trend_filter_buy = not use_trend_filter or trend_up
trend_filter_sell = not use_trend_filter or trend_down

volume_ma = ta.sma(volume, 20)
volume_ok = not use_volume_filter or volume > (volume_ma * volume_threshold)

momentum_ok = math.abs(close - close[1]) > ta.atr(14) * 0.1

buy_signal = raw_buy and trend_filter_buy and volume_ok and momentum_ok
sell_signal = raw_sell and trend_filter_sell and volume_ok and momentum_ok

var int last_signal_bar = 0
var string last_signal_type = ""

signal_cooldown = 2 // minimum bars between signals
bars_since_last = bar_index - last_signal_bar
cooldown_ok = bars_since_last >= signal_cooldown

final_buy = buy_signal and cooldown_ok and last_signal_type != "BUY"
final_sell = sell_signal and cooldown_ok and last_signal_type != "SELL"

if final_buy
    last_signal_bar := bar_index
    last_signal_type := "BUY"

if final_sell
    last_signal_bar := bar_index
    last_signal_type := "SELL"

getTrend(tf) =>
    ema50 = request.security(syminfo.tickerid, tf, ta.ema(close, 50))
    current_close = request.security(syminfo.tickerid, tf, close)
    current_close > ema50 ? 1 : current_close < ema50 ? -1 : 0

trend_m1 = getTrend("1")
trend_m5 = getTrend("5")
trend_m15 = getTrend("15")
trend_m30 = getTrend("30")
trend_h1 = getTrend("60")
trend_h4 = getTrend("240")
trend_daily = getTrend("1D")

bullish_count = (trend_m1 == 1 ? 1 : 0) + (trend_m5 == 1 ? 1 : 0) + (trend_m15 == 1 ? 1 : 0) + (trend_m30 == 1 ? 1 : 0) + (trend_h1 == 1 ? 1 : 0) + (trend_h4 == 1 ? 1 : 0) + (trend_daily == 1 ? 1 : 0)
bearish_count = (trend_m1 == -1 ? 1 : 0) + (trend_m5 == -1 ? 1 : 0) + (trend_m15 == -1 ? 1 : 0) + (trend_m30 == -1 ? 1 : 0) + (trend_h1 == -1 ? 1 : 0) + (trend_h4 == -1 ? 1 : 0) + (trend_daily == -1 ? 1 : 0)

overall_trend = bullish_count >= 4 ? "STRONG BUY" : bearish_count >= 4 ? "STRONG SELL" : "FLAT MARKET"

countBull = ta.barssince(final_buy)
countBear = ta.barssince(final_sell)
trigger = nz(countBull, bar_index) < nz(countBear, bar_index) ? 1 : 0

atrBand = ta.atr(atrLen) * atrRisk
atrStop = trigger == 1 ? low - atrBand : high + atrBand

srcStop = close

lastTrade(src) => ta.valuewhen(final_buy or final_sell, src, 0)
entry_y = lastTrade(srcStop)
stop_y = lastTrade(atrStop)
tp1_y = (entry_y - lastTrade(atrStop)) * 1 + entry_y
tp2_y = (entry_y - lastTrade(atrStop)) * 2 + entry_y    
tp3_y = (entry_y - lastTrade(atrStop)) * 3 + entry_y
tp4_y = (entry_y - lastTrade(atrStop)) * 4 + entry_y
tp5_y = (entry_y - lastTrade(atrStop)) * 5 + entry_y

decimals = lvlDecimals == 1 ? "#.#" : lvlDecimals == 2 ? "#.##" : lvlDecimals == 3 ? "#.###" : lvlDecimals == 4 ? "#.####" : lvlDecimals == 5 ? "#.#####" : lvlDecimals == 6 ? "#.######" : lvlDecimals == 7 ? "#.#######" : "#.########"

var label entry_lbl = na
var label stop_lbl = na
var label tp1_lbl = na
var label tp2_lbl = na
var label tp3_lbl = na
var label tp4_lbl = na
var label tp5_lbl = na

var line entry_line = na
var line stop_line = na
var line tp1_line = na
var line tp2_line = na
var line tp3_line = na
var line tp4_line = na
var line tp5_line = na

hasSignal = (not na(countBull) and countBull < bar_index) or (not na(countBear) and countBear < bar_index)

if barstate.islast

    label.delete(entry_lbl)
    label.delete(stop_lbl)
    label.delete(tp1_lbl)
    label.delete(tp2_lbl)
    label.delete(tp3_lbl)
    label.delete(tp4_lbl)
    label.delete(tp5_lbl)

    line.delete(entry_line)
    line.delete(stop_line)
    line.delete(tp1_line)
    line.delete(tp2_line)
    line.delete(tp3_line)
    line.delete(tp4_line)
    line.delete(tp5_line)

    if (levels2 and percentStop != 0 and hasSignal)
        entry_lbl := label.new(bar_index + lvlDistance, entry_y, "ENTRY: " + str.tostring(entry_y, decimals), xloc.bar_index, yloc.price, color.rgb(242, 244, 252), label.style_label_left, #000000, size.normal)
        stop_lbl := label.new(bar_index + lvlDistance, stop_y, "STOP LOSS: " + str.tostring(stop_y, decimals),

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

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

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

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

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

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

Стоимость полного кода
1 104,60₽ ≈ $13.50