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