
Стратегия основана на Kaufman Adaptive Moving Average (KAMA) и позволяет динамически корректировать торговые позиции, автоматически отслеживая тенденции рынка. Основные функции стратегии включают в себя:
Используя эти функции, стратегия пытается получить дополнительную прибыль от тренда, контролируя при этом риски.
Эта стратегия основана на работе с Кауфманом по адаптированию к скользящим средним показателям. KAMA динамически корректирует вес и плавность средних, рассчитывая соотношение движения цены и волатильности, чтобы быстрее реагировать на изменения цен.
Когда KAMA пересекает понижающуюся стоп-линию, это означает обратный тренд, который вызывает сигнал покупки; когда KAMA пересекает понижающуюся стоп-линию, это означает обратный тренд, который вызывает сигнал продажи. После вхождения в позицию стратегия рассчитывает динамическое стоп-расстояние в соответствии с ATR и устанавливает стоп-линию. Когда KAMA движется в выгодном направлении, стоп-линия также подстраивается, перемещая стоп-линию в более выгодное положение, чтобы закрепить больше прибыли.
Таким образом, стратегия может следить за движением тренда, постепенно перемещая стоп-линию, пока не будет вызвана стоп-линия или вызван обратный сигнал, а позиция будет закрыта.
По сравнению с традиционной стратегией скользящих средних, эта стратегия имеет следующие преимущества:
В целом, стратегия быстро реагирует, контролируется и является типичной стратегией отслеживания тенденций.
Однако эта стратегия также несет в себе некоторые риски:
Эти риски можно контролировать путем оптимизации стоп-дистанции, установки максимального стоп-процента и т. Д. Можно также использовать другие показатели в качестве подтверждения, чтобы избежать ошибочных сделок.
Оптимизируемые направления стратегии включают:
Например, можно тестировать добавление MACD в качестве вспомогательного подтверждающего показателя, в то время как KAMA Gold Fork также требует, чтобы MACDDif также был положительным и расширенным. Это может отфильтровать некоторые ложные сигналы и избежать ненужного повторного открытия позиции.
Эта стратегия работает в целом без проблем, используя динамические стоп-лосс для отслеживания трендов, максимально закрепляя трендовые прибыли. Самостоятельная адаптивность показателя KAMA также позволяет стратегии идти в ногу с быстрыми изменениями рынка. С некоторой оптимизацией стратегия может стать эффективной программой отслеживания трендов, подходящей для средних и длинных линий.
/*backtest
start: 2024-01-26 00:00:00
end: 2024-02-25 00:00:00
period: 1h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/
//@version=5
strategy("THMA - Bharath Vc Improved", overlay=true, process_orders_on_close=true)
// Function to calculate pips with higher precision
getPips(price) =>
difc = syminfo.mintick
hlpips = price / difc
math.round(hlpips / syminfo.mintick) * syminfo.mintick
// Inputs
buyMess = input.string("Buy Message","Buy Alert Message")
sellMess = input.string("Sell Message","Sell Alert Message")
buyExitMessage = input.string("Buy Exit","Buy Exit Alert Message" )
sellExitMessage = input.string("Sell Exit","Sell Exit Alert Message" )
tmf = input.timeframe("", "Timeframe")
length = input(title='Length', defval=14)
fastLength = input(title='Fast EMA Length', defval=2)
slowLength = input(title='Slow EMA Length', defval=30)
src = input(title='Source', defval=close)
highlight = input(title='Highlight ?', defval=true)
awaitBarConfirmation = input(title='Await Bar Confirmation ?', defval=true)
// Function to calculate the TMA
gettma() =>
mom = math.abs(ta.change(src, length))
volatility = math.sum(math.abs(ta.change(src)), length)
er = volatility != 0 ? mom / volatility : 0
fastAlpha = 2 / (fastLength + 1)
slowAlpha = 2 / (slowLength + 1)
alpha = math.pow(er * (fastAlpha - slowAlpha) + slowAlpha, 2)
kama = 0.0
kama := alpha * src + (1 - alpha) * nz(kama[1], src)
await = awaitBarConfirmation ? barstate.isconfirmed : true
maColor = highlight ? kama > kama[1] and await ? color.green : color.red : color.new(color.purple, 0)
thma = kama
hma_dif = (thma - thma[2])/2
colour = hma_dif > 0 ? color.green : color.red
isGreen = hma_dif > 0
[thma, isGreen, colour]
// Dynamic pip size based on ATR to adapt better to smaller timeframes
pips = ta.atr(14) * 0.1
// Main execution logic
var float psl = na
var int lastSignal = 0
var float lastPsl = na
[thma, isGreen, colour] = request.security(syminfo.tickerid, tmf, gettma(), gaps=barmerge.gaps_off, lookahead=barmerge.lookahead_off)
plot(thma, title='KAMA', linewidth=2, color=colour)
if ta.crossover(thma, psl) and strategy.position_size < 0
strategy.exit("Sell Exit", stop=thma, alert_message=sellExitMessage)
if ta.crossunder(thma, psl) and strategy.position_size > 0
strategy.exit("Buy Exit", stop=thma, alert_message=buyExitMessage)
if isGreen and strategy.position_size <= 0
if na(psl)
psl := close + getPips(pips)
strategy.entry("Buy", strategy.long, alert_message=buyMess)
lastSignal := 1
if not isGreen and strategy.position_size >= 0
if na(psl)
psl := close - getPips(pips)
strategy.entry("Sell", strategy.short, alert_message=sellMess)
lastSignal := -1
if (thma >= lastPsl or na(lastPsl)) and thma > psl
psl := psl + getPips(pips)
lastPsl := psl
if (thma <= lastPsl or na(lastPsl)) and thma < psl
psl := psl - getPips(pips)
lastPsl := psl
plot(psl, title="Position Stop Level", style=plot.style_stepline, color=color.blue)
plot(lastPsl, title="Last Position Stop Level", style=plot.style_cross, color=color.red)