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? После подтверждения оплаты файл сохранится в кабинете на этот email. Если аккаунта ещё нет, мы создадим его и пришлём ссылку для задания пароля. Если аккаунт уже есть, покупка добавится в него. Укажите адрес, к которому у вас есть доступ.
Чтобы оформить заказ, введите email и перейдите к оплате.