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

TT SCALPER V3

tt scalper_6257861182422522623.pine

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

indicatorgoldy.pineTradingView · 2 общих теговgeniusv101-ecn.mq4MQL4 / MetaTrader 4 · 2 общих теговmarket crusher ea guidlines.txtMQL · 2 общих теговaggressivegridmartingaleea_5400032011547083593.mq5MQL5 / MetaTrader 5 · 2 общих теговblessing_3_v3_9_6.mq4MQL4 / MetaTrader 4 · 2 общих теговblessing_3_v3.9.6.15.mq4MQL4 / MetaTrader 4 · 2 общих тегов
Вы автор или правообладатель?

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

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

О программе

TT SCALPER V3 — это индикатор для TradingView, построенный на основе Supertrend с множественными множителями ATR. Он использует кластеризацию методом k-means для анализа производительности различных параметров Supertrend и выбора оптимального множителя для сигнальной линии. Индикатор отображает линию Supertrend, скользящую среднюю MA150 и графические маркеры на графике цены.

Внутри индикатора реализована система имитации торгов с использованием мартингейла: отслеживаются входы, стоп-лоссы, тейк-профиты, расчёт размера позиции и управление последовательностями сделок. Параметры риска, комиссий и начального капитала настраиваются пользователем. Все расчёты ведутся на стороне графика без использования стратегического тестера Pine Script.

Визуальная часть включает рисование свечей по тренду, маркеры входов, уровни входа/стоп-лосса/тейк-профита с зонами заливки, а также настраиваемую информационную панель (дэшборд), отображающую состояние позиции, статистику последовательностей, размер просадки и текущий капитал.

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

НастройкаОписание
perfAlpha Память производительности — Параметр сглаживания для расчёта индекса производительности Supertrend. Используется в экспоненциальном скользящем среднем для оценки качества текущего множителя.
initialCapital Начальный капитал ($) — Начальный капитал в долларах, используется как база для расчёта процентного изменения капитала и процентной прибыли/убытка. Отображается в дэшборде как Starting Capital.
baseRiskPercent Базовый риск на сделку (%) — Процент базового риска на одну сделку, используется для расчёта начального размера позиции. Отображается в дэшборде как Base Risk.
riskRewardRatio Соотношение риск/прибыль — Соотношение риска и прибыли (risk/reward), определяет расстояние тейк-профита относительно стоп-лосса. Отображается в дэшборде в разделе настроек риска.
maxMartingale Максимальный уровень мартингейла — Максимальный уровень мартингейла. При достижении этого уровня последовательность сделок закрывается как убыточная. Отображается в дэшборде как Max Martingale.
commissionRate Комиссия (%) — Процент комиссии с каждой сделки, учитывается при расчёте чистой прибыли и убытка. Отображается в дэшборде как Base Risk с указанием процента.
showGradient Цветовая заливка свечей — Включает или отключает цветовую заливку свечей: зелёный для бычьего тренда, красный для медвежьего.
showSignals Показать сигналы — Включает или отключает отображение графических маркеров и подписей при входе в позицию (стрелки и метки уровня мартингейла).
showSLTP Показать уровни SL/TP — Включает или отключает отображение уровней входа, стоп-лосса и тейк-профита текущей позиции с зонами заливки.
showDash Показать панель — Включает или отключает отображение информационной панели (дэшборда) на графике.
dashLoc Расположение панели — Расположение информационной панели на графике: верхний правый, нижний правый или нижний левый угол.
textSize Размер текста — Размер текста в информационной панели: Tiny (маленький), Small (малый) или Normal (нормальный).
useMA150 Использовать фильтр MA150 — Включает или отключает фильтр скользящей средней MA150 для сигналов входа. При включении длинная позиция открывается только при цене выше MA150, короткая — при цене ниже.
maTypeOpt Тип MA (150) — Тип скользящей средней MA150: SMA (простая), EMA (экспоненциальная) или WMA (взвешенная).
maPeriod150 Период MA — Период скользящей средней MA150, используемой в качестве фильтра для сигналов. Доступны типы SMA, EMA и WMA.
Получить полный код

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

indicator("TT SCALPER V3", "TT SCALPER V3", overlay = true, max_labels_count = 500)

length = 10

minMult = 1
maxMult = 5
step    = .5

if minMult > maxMult
    runtime.error('Minimum factor is greater than maximum factor in the range')

perfAlpha = input.float(100, 'Performance Memory', minval = 2)
fromCluster = 'Best'

maxIter = 1000
maxData = 10000

initialCapital = input.float(100.0, 'Initial Capital ($)', minval = 0.01, group = 'Martingale')
baseRiskPercent = input.float(2.0, 'Base Risk Per Trade (%)', minval = 0.1, maxval = 10, group = 'Martingale')
riskRewardRatio = input.float(1, 'Risk/Reward Ratio', minval = 0.1, group = 'Martingale')
maxMartingale = input.int(10, 'Max Martingale Level', minval = 1, maxval = 20, group = 'Martingale')
commissionRate = input.float(0.006, 'Commission Rate (%)', minval = 0, maxval = 5, step = 0.001, group = 'Martingale')
martingaleType = 'Classic Double'

bearCss = color.red
bullCss = color.teal

amaBearCss = color.new(color.red, 50)
amaBullCss = color.new(color.teal, 50)

showGradient = input(true, 'Candle Coloring', group = 'Style')
showSignals = input(true, 'Show Signals', group = 'Style')
showSLTP = input(true, 'Show SL/TP Levels', group = 'Style')

showDash  = input(true, 'Show Dashboard', group = 'Dashboard')
dashLoc  = input.string('Top Right', 'Location', options = ['Top Right', 'Bottom Right', 'Bottom Left'], group = 'Dashboard')
textSize = input.string('Small', 'Size'        , options = ['Tiny', 'Small', 'Normal'], group = 'Dashboard')

useMA150 = input.bool(true, 'Use MA150 Filter', group = 'Filters')
maTypeOpt = input.string('SMA', 'MA Type (150)', options = ['SMA', 'EMA', 'WMA'], group = 'Filters')
maPeriod150 = input.int(150, 'MA Period', minval = 1, group = 'Filters')

type supertrend
    float upper = hl2
    float lower = hl2
    float output
    float perf = 0
    float factor
    int trend = 0

type vector
    array<float> out

type tradeData
    float entryPrice = 0
    float stopLoss = 0
    float takeProfit = 0
    float positionSize = 0
    int direction = 0
    int martingaleLevel = 1
    bool isActive = false
    bool waitingForTrendChange = true
    float fixedStopDistance = 0
    float fixedRiskReward = 0
    float sequenceLoss = 0  // Track total loss in current sequence

type sequenceData
    int sequenceNumber = 0
    float sequenceProfit = 0
    int tradesInSequence = 0
    bool isWinningSequence = false

var holder = array.new<supertrend>(0)
var factors = array.new<float>(0)

if barstate.isfirst
    for i = 0 to int((maxMult - minMult) / step)
        factors.push(minMult + i * step)
        holder.push(supertrend.new())

atr = ta.atr(length)

k = 0
for factor in factors
    get_spt = holder.get(k)

    up = hl2 + atr * factor
    dn = hl2 - atr * factor

    get_spt.trend := close > get_spt.upper ? 1 : close < get_spt.lower ? 0 : get_spt.trend
    get_spt.upper := close[1] < get_spt.upper ? math.min(up, get_spt.upper) : up
    get_spt.lower := close[1] > get_spt.lower ? math.max(dn, get_spt.lower) : dn

    diff = nz(math.sign(close[1] - get_spt.output))
    get_spt.perf += 2/(perfAlpha+1) * (nz(close - close[1]) * diff - get_spt.perf)
    get_spt.output := get_spt.trend == 1 ? get_spt.lower : get_spt.upper
    get_spt.factor := factor
    k += 1

factor_array = array.new<float>(0)
data = array.new<float>(0)

if last_bar_index - bar_index <= maxData
    for element in holder
        data.push(element.perf)
        factor_array.push(element.factor)

centroids = array.new<float>(0)
centroids.push(data.percentile_linear_interpolation(25))
centroids.push(data.percentile_linear_interpolation(50))
centroids.push(data.percentile_linear_interpolation(75))

var array<vector> factors_clusters = na
var array<vector> perfclusters = na

if last_bar_index - bar_index <= maxData
    for _ = 0 to maxIter
        factors_clusters := array.from(vector.new(array.new<float>(0)), vector.new(array.new<float>(0)), vector.new(array.new<float>(0)))
        perfclusters := array.from(vector.new(array.new<float>(0)), vector.new(array.new<float>(0)), vector.new(array.new<float>(0)))

        i = 0
        for value in data
            dist = array.new<float>(0)
            for centroid in centroids
                dist.push(math.abs(value - centroid))

            idx = dist.indexof(dist.min())
            perfclusters.get(idx).out.push(value)
            factors_clusters.get(idx).out.push(factor_array.get(i))
            i += 1

        new_centroids = array.new<float>(0)
        for cluster_ in perfclusters
            new_centroids.push(cluster_.out.avg())

        if new_centroids.get(0) == centroids.get(0) and new_centroids.get(1) == centroids.get(1) and new_centroids.get(2) == centroids.get(2)
            break

        centroids := new_centroids

var float target_factor = na
var float perf_idx = na
var float perf_ama = na

var from = switch fromCluster
    'Best' => 2
    'Average' => 1
    'Worst' => 0

den = ta.ema(math.abs(close - close[1]), int(perfAlpha))

if not na(perfclusters)

    target_factor := nz(factors_clusters.get(from).out.avg(), target_factor)

    perf_idx := math.max(nz(perfclusters.get(from).out.avg()), 0) / den

var upper = hl2
var lower = hl2
var os = 0

up = hl2 + atr * target_factor
dn = hl2 - atr * target_factor
upper := close[1] < upper ? math.min(up, upper) : up
lower := close[1] > lower ? math.max(dn, lower) : dn
os := close > upper ? 1 : close < lower ? 0 : os
ts = os ? lower : upper

if na(ts[1]) and not na(ts)
    perf_ama := ts
else
    perf_ama += perf_idx * (ts - perf_ama)

ma150 = maTypeOpt == 'EMA' ? ta.ema(close, maPeriod150) : maTypeOpt == 'WMA' ? ta.wma(close, maPeriod150) : ta.sma(close, maPeriod150)
plot(useMA150 ? ma150 : na, title = 'MA150', linewidth = 2)

var tradeData currentTrade = tradeData.new()
var sequenceData currentSequence = sequenceData.new()
var float totalEquity = initialCapital
var int totalTrades = 0
var int totalSequences = 0
var int winningSequences = 0
var int losingSequences = 0
var float totalSequenceProfit = 0
var float maxDrawdown = 0
var float peakEquity = initialCapital
var int consecutiveLosses = 0
var int maxConsecutiveLosses = 0
var int firstTradeTime = na
var int maxMartingaleReached = 1
var float baseRiskAmount = 0

if barstate.isfirst
    baseRiskAmount := initialCapital * (baseRiskPercent / 100)

trendChanged = os != os[1] and not na(os[1])

var bool longSignal = false
var bool shortSignal = false
var bool justEntered = false
var bool slHitThisBar = false

var line entryLine = na
var line slLine = na  
var line tpLine = na

if currentTrade.isActive

    tpHit = (currentTrade.direction == 1 and high >= currentTrade.takeProfit) or (currentTrade.direction == 0 and low <= currentTrade.takeProfit)

    slHit = (currentTrade.direction == 1 and low <= currentTrade.stopLoss) or (currentTrade.direction == 0 and high >= currentTrade.stopLoss)

    if tpHit

        dollarProfit = currentTrade.positionSize * (math.abs(currentTrade.takeProfit - currentTrade.entryPrice) / currentTrade.entryPrice)

        totalCommission = currentTrade.positionSize * (commissionRate / 100) * 2
        netProfit = dollarProfit - totalCommission

        profitPercent = (netProfit / totalEquity) * 100

        currentSequence.sequenceProfit := netProfit - currentTrade.sequenceLoss
        currentSequence.isWinningSequence := true
        currentSequence.tradesInSequence += 1
        profitPercent := (netProfit / currentTrade.positionSize) * 100

        label.new(bar_index, currentTrade.takeProfit,  
                 '✅\nSEQ' + str.tostring(currentSequence.tradesInSequence) + '\n+' + str.tostring(profitPercent, '#.#') + '%',
                 color=color.new(color.green, 10), 
                 style=label.style_arrowup, 
                 textcolor=color.white, 
                 size=size.large)

        totalEquity += netProfit
        peakEquity := math.max(peakEquity, totalEquity)
        totalSequenceProfit += currentSequence.sequenceProfit

        totalSequences += 1
        winningSequences += 1
        totalTrades += 1
        consecutiveLosses := 0

        currentTrade.martingaleLevel := 1
        currentTrade.sequenceLoss := 0
        currentTrade.fixedStopDistance := 0
        currentTrade.fixedRiskReward := 0
        currentTrade.isActive := false
        currentTrade.waitingForTrendChange := true
        currentSequence := sequenceData.new()

    else if slHit

        dollarLoss = currentTrade.positionSize * (math.abs(currentTrade.stopLoss - currentTrade.entryPrice) / currentTrade.entryPrice)

        totalCommission = currentTrade.positionSize * (commissionRate / 100) * 2
        netLoss = dollarLoss + totalCommission

        currentTrade.sequenceLoss += netLoss
        currentSequence.tradesInSequence += 1

        lossPercent = (netLoss / currentTrade.positionSize) * 100

        label.new(bar_index, currentTrade.stopLoss, 

                 '❌\nSEQ' + str.tostring(currentSequence.tradesInSequence) + '\n-' + str.tostring(lossPercent, '#.#') + '%',
                 color=color.new(color.red, 10), 
                 style=label.style_arrowdown, 
                 textcolor=color.white, 
                 size=size.large)

        totalEquity -= netLoss
        consecutiveLosses += 1
        maxConsecutiveLosses := math.max(maxConsecutiveLosses, consecutiveLosses)
        totalTrades += 1

        drawdown = (peakEquity - totalEquity) / peakEquity * 100
        maxDrawdown := math.max(maxDrawdown, drawdown)

        maxMartingaleReached := math.max(maxMartingaleReached, currentTrade.martingaleLevel)

        if currentTrade.martingaleLevel < maxMartingale
            currentTrade.martingaleLevel += 1
        else

            currentSequence.sequenceProfit := -currentTrade.sequenceLoss
            currentSequence.isWinningSequence := false
            totalSequences += 1
            losingSequences += 1
            totalSequenceProfit += currentSequence.sequenceProfit

            currentTrade.martingaleLevel := 1
            currentTrade.sequenceLoss := 0
            currentTrade.waitingForTrendChange := true
            currentSequence := sequenceData.new()

        currentTrade.isActive := false
        currentTrade.waitingForTrendChange := currentTrade.martingaleLevel == 1 ? true : false

if not currentTrade.isActive and not na(target_factor) and not na(ts)

    if not currentTrade.waitingForTrendChange

        longSignal := os == 1 and (not useMA150 or close > ma150)
        shortSignal := os == 0 and (not useMA150 or

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

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

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

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

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

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

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