Динамическая самоадаптивная стратегия отслеживания тренда движущейся средней

Автор:Чао Чжан, Дата: 2024-02-26 16:36:30
Тэги:

img

Обзор

Эта стратегия разработана на основе адаптивной скользящей средней Кауфмана (KAMA) для динамической корректировки торговых позиций и автоматического отслеживания рыночных тенденций.

  1. Динамическое вычисление размера этапа торговли (в пипах) и адаптация к волатильности рынка
  2. Создание сигналов купли и продажи на основе направления KAMA
  3. Установите дистанцию остановки потери после запуска сигнала и соответствующим образом скорректируйте ее по мере движения цены
  4. Факультативное подтверждение строки вблизи фильтра фейковых сигналов

С помощью этих функций стратегия пытается получить дополнительную прибыль от тенденций при одновременном контроле рисков.

Логика стратегии

Стратегия работает на основе индикатора адаптивной скользящей средней Кауфмана. KAMA рассчитывает соотношение динамики цены к волатильности, чтобы динамически корректировать вес и плавность скользящей средней, что позволяет ей быстрее реагировать на изменения цен.

Когда KAMA пересекает линию снижения стоп-лосса, это указывает на изменение тренда и запускает сигнал покупки. Когда KAMA пересекает линию снижения стоп-лосса, это указывает на изменение тренда и запускает сигнал продажи. После входа в позицию стратегия рассчитывает динамическое расстояние стоп-лосса на основе ATR и устанавливает линию снижения стоп-лосса. По мере движения KAMA в благоприятном направлении линия снижения стоп-лосса также соответствующим образом корректируется, переходя на более благоприятную позицию для получения большей прибыли.

Таким образом, стратегия может отслеживать тренд, постепенно перемещать линию стоп-лосса, пока она не будет задействована или обратный сигнал не будет задействован для закрытия позиции.

Преимущества

По сравнению с традиционными стратегиями скользящей средней, эта стратегия имеет следующие преимущества:

  1. KAMA обладает высокой чувствительностью и может быстрее улавливать тенденции цен;
  2. Динамическое расстояние стоп-лосса обеспечивает увеличение прибыли по мере адаптации к тренду;
  3. Факультативная строка закрытия подтверждения фильтрует ложные сигналы и уменьшает ненужные записи.

В целом, стратегия отзывчива, управляема и является типичной системой отслеживания трендов.

Риски

Стратегия также сопряжена с некоторыми рисками:

  1. Риск изменения тренда: KAMA может гибко адаптироваться к колебаниям цен, но может не реагировать достаточно своевременно на внезапные изменения тренда.
  2. Слишком агрессивный стоп-лосс. Если динамический стоп-лосс установлен слишком широко, он может быть слишком агрессивным и не сможет заблокировать прибыль вовремя.
  3. Риск поддельного сигнала. Использование штрих-близкого подтверждения помогает уменьшить поддельные сигналы, но не может полностью их устранить.

Для управления этими рисками можно использовать такие методы, как оптимизация расстояния стоп-лосса и установка максимального процента стоп-лосса.

Руководство по оптимизации

Возможные направления оптимизации стратегии включают:

  1. Оптимизировать параметры KAMA: регулировать длины скользящих средних, тонко настраивать гладкость;
  2. Оптимизация динамических потерь при остановке: проверка оптимальных расстояний и размеров шагов при остановке на основе различных продуктов;
  3. Добавление индикаторов фильтрации: включение других индикаторов тренда для подтверждения торговых сигналов и повышения надежности.

Например, MACD может быть добавлен в качестве дополнительного индикатора подтверждения, требуя, чтобы MACD Dif был положительным и расширялся вместе с золотым крестом KAMA. Это может отфильтровать некоторые фальшивые сигналы и избежать ненужных повторных записей.

Заключение

Используя динамический стоп-лосс для отслеживания трендов и максимизации прибыли от тренда, в сочетании с адаптивностью индикатора 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)


Больше