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

SadashiTrading Gap Analyzer

stock market gap analyzer signals.pine
Вы автор или правообладатель?

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

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

О программе

SadashiTrading Gap Analyzer — это индикатор для TradingView, предназначенный для анализа ценовых разрывов (гэпов) на графике. Индикатор вычисляет процентное соотношение между ценой открытия и предыдущей ценой закрытия, определяя наличие и направление гэпа.

Индикатор применяет настраиваемые фильтры для подтверждения сигналов: фильтр относительного объёма (RVOL), сравнивающий текущий объём со скользящим средним исторического объёма, и фильтр тренда на основе простой скользящей средней (SMA). Каждый гэп классифицируется как бычий или медвежий, а также как движение в направлении тренда или против него.

На графике индикатор отображает графические отметки для четырёх категорий сигналов, линию SMA-фильтра и маркеры точек оценки. Настраиваемый период оценки позволяет отслеживать результат гэпа в текущий день или в последующие дни.

В таблице на графике отображаются статистические данные по каждой категории: количество случаев, процент выигрышных сделок, среднее возвращение и коэффициент прибыли. Таблица поддерживает выбор положения на графике.

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

НастройкаОписание
minGapPct Минимальный размер гэпа в процентах, при котором сигнал считается действительным.
evalDays Количество дней после гэпа для оценки результата. При значении 0 оценка производится по закрытию текущего дня.
useSmaFilter Включает или отключает фильтр тренда на основе SMA для классификации гэпов.
smaPeriod Период простой скользящей средней (SMA), используемой для определения тренда.
useRvolFilter Включает или отключает фильтр относительного объёма (RVOL) для подтверждения сигналов гэпа.
minRvol Минимальный порог относительного объёма (RVOL), при котором фильтр объёма пропускает сигнал.
rvolPeriod Период скользящей средней для расчёта относительного объёма (RVOL).
tablePosInput Положение таблицы со статистикой на графике.
Получить полный код

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

indicator("SadashiTrading Gap Analyzer", overlay=true)

minGapPct   = input.float(1.0, title="Min. Gap Size (%)", step=0.1, group="Gap Strategy")
evalDays    = input.int(0, title="Evaluation Days After Gap (0 = Same Day Close)", minval=0, maxval=10, group="Gap Strategy")

useSmaFilter = input.bool(true, title="Use Trend Filter (SMA)", group="Trend Context")
smaPeriod    = input.int(200, title="SMA Period", minval=10, group="Trend Context")

useRvolFilter = input.bool(true, title="Use RVOL Filter (Historical Daily Vol)", group="Volume Context", tooltip="NOTE: Uses total daily volume. Designed for historical daily analysis.")
minRvol       = input.float(1.5, title="Min. RVOL Threshold (e.g. 1.5x)", step=0.1, group="Volume Context")
rvolPeriod    = input.int(20, title="RVOL SMA Period", minval=5, group="Volume Context")

tablePosInput = input.string("Top Right", title="Table Position", 
  options=["Top Right", "Top Left", "Bottom Right", "Bottom Left", "Middle Right", "Middle Left"], 
  group="Display Settings")

getPosition(string pos) =>
    switch pos
        "Top Right"     => position.top_right
        "Top Left"      => position.top_left
        "Bottom Right"  => position.bottom_right
        "Bottom Left"   => position.bottom_left
        "Middle Right"  => position.middle_right
        "Middle Left"   => position.middle_left
        => position.top_right

formatNumber(float num, int decimals) =>
    string rawStr = str.tostring(num, decimals == 0 ? "#" : "#." + str.repeat("#", decimals))
    string[] parts = str.split(rawStr, ".")
    string integerPart = array.get(parts, 0)
    string decimalPart = array.size(parts) > 1 ? array.get(parts, 1) : ""

    string formattedInt = ""
    bool isNegative = str.startswith(integerPart, "-")
    string cleanInt = isNegative ? str.substring(integerPart, 1) : integerPart
    int cleanLen = str.length(cleanInt)

    for i = 0 to cleanLen - 1
        if i > 0 and (cleanLen - i) % 3 == 0
            formattedInt += ","
        formattedInt += str.substring(cleanInt, i, i + 1)

    string result = (isNegative ? "-" : "") + formattedInt
    if decimals > 0 and str.length(decimalPart) > 0
        while str.length(decimalPart) < decimals
            decimalPart += "0"
        result += "." + decimalPart
    result

trendSma = ta.sma(close, smaPeriod)
plot(trendSma, title="SMA Trend Filter", color=color.blue, linewidth=2)

avgVolume = ta.sma(volume[1], rvolPeriod)
rvol      = volume / avgVolume
hasVol    = not useRvolFilter or (rvol >= minRvol)

float prevClose = close[1]
float gapPct    = ((open - prevClose) / prevClose) * 100.0

bool rawBullGap = (gapPct >= minGapPct) and hasVol
bool rawBearGap = (gapPct <= -minGapPct) and hasVol

bool isBullWithTrend    = rawBullGap and (not useSmaFilter or open > trendSma[1])
bool isBullAgainstTrend = rawBullGap and (useSmaFilter and open <= trendSma[1])

bool isBearWithTrend    = rawBearGap and (not useSmaFilter or open < trendSma[1])
bool isBearAgainstTrend = rawBearGap and (useSmaFilter and open >= trendSma[1])

bool anyGapSignal = isBullWithTrend or isBullAgainstTrend or isBearWithTrend or isBearAgainstTrend

var int totalBullWith = 0, var int winBullWith = 0, var float sumPnlBullWith = 0.0
var float grossProfitBullWith = 0.0, var float grossLossBullWith = 0.0

var int totalBullAgainst = 0, var int winBullAgainst = 0, var float sumPnlBullAgainst = 0.0
var float grossProfitBullAgainst = 0.0, var float grossLossBullAgainst = 0.0

var int totalBearWith = 0, var int winBearWith = 0, var float sumPnlBearWith = 0.0
var float grossProfitBearWith = 0.0, var float grossLossBearWith = 0.0

var int totalBearAgainst = 0, var int winBearAgainst = 0, var float sumPnlBearAgainst = 0.0
var float grossProfitBearAgainst = 0.0, var float grossLossBearAgainst = 0.0

bool isExitBar = (evalDays == 0 and anyGapSignal) or (evalDays > 0 and anyGapSignal[evalDays])

if evalDays == 0
    if isBullWithTrend
        float pnl = ((close - open) / open) * 100.0
        totalBullWith += 1, sumPnlBullWith += pnl
        if pnl > 0
            winBullWith += 1
            grossProfitBullWith += pnl
        else
            grossLossBullWith += math.abs(pnl)

    if isBullAgainstTrend
        float pnl = ((close - open) / open) * 100.0
        totalBullAgainst += 1, sumPnlBullAgainst += pnl
        if pnl > 0
            winBullAgainst += 1
            grossProfitBullAgainst += pnl
        else
            grossLossBullAgainst += math.abs(pnl)

    if isBearWithTrend
        float pnl = ((open - close) / open) * 100.0
        totalBearWith += 1, sumPnlBearWith += pnl
        if pnl > 0
            winBearWith += 1
            grossProfitBearWith += pnl
        else
            grossLossBearWith += math.abs(pnl)

    if isBearAgainstTrend
        float pnl = ((open - close) / open) * 100.0
        totalBearAgainst += 1, sumPnlBearAgainst += pnl
        if pnl > 0
            winBearAgainst += 1
            grossProfitBearAgainst += pnl
        else
            grossLossBearAgainst += math.abs(pnl)

if evalDays > 0
    if isBullWithTrend[evalDays]
        float pnl = ((close - open[evalDays]) / open[evalDays]) * 100.0
        totalBullWith += 1, sumPnlBullWith += pnl
        if pnl > 0
            winBullWith += 1
            grossProfitBullWith += pnl
        else
            grossLossBullWith += math.abs(pnl)

    if isBullAgainstTrend[evalDays]
        float pnl = ((close - open[evalDays]) / open[evalDays]) * 100.0
        totalBullAgainst += 1, sumPnlBullAgainst += pnl
        if pnl > 0
            winBullAgainst += 1
            grossProfitBullAgainst += pnl
        else
 

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

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

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

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

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

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

Стоимость полного кода
901,50₽ ≈ $11.02