Стратегия следования за трендом на основе MOST и KAMA


Дата создания: 2024-02-29 11:04:38 Последнее изменение: 2024-02-29 11:04:38
Копировать: 3 Количество просмотров: 697
1
Подписаться
1617
Подписчики

Стратегия следования за трендом на основе MOST и KAMA

Обзор

Стратегия использует множество движущихся средних, таких как SMA, EMA, KAMA, для определения направления ценового тренда и разработки стратегии для отслеживания тренда, основанной на установке стоп-линий на основе ценового прорыва. Когда цена растет, trails the upper band в качестве стопа; когда цена падает, trails the lower limit в качестве стопа. Преимущество стратегии заключается в том, что множество комбинаций движущихся средних, которые могут сгладить ценовые данные, идентифицируют тенденции; динамическая стоп-дизайн позволяет избежать слишком чувствительных стоп-линий.

Стратегический принцип

Стратегия использует KAMA в качестве базового показателя для определения направления тенденции, поскольку KAMA более чувствителен к изменениям цены, что позволяет ранне идентифицировать перевороты. В то же время, стратегия включает в себя комбинацию из нескольких других движущихся средних, таких как SMA, EMA и т. Д., которые позволяют фильтровать цены и идентифицировать направление основной тенденции.

Стоп-линия стратегии настраивается на основе самой цены и движущейся средней. В частности, стоп-линия, следующая вверх, накладывает на движущуюся среднюю еще одну пропорцию в качестве буфера; стоп-линия, следующая вниз, снимает пропорцию с движущейся средней в качестве буфера. Это позволяет немедленно остановить потерю, когда цена переворачивается.

Условия для входа заключаются в том, чтобы делать больше, когда цена сверху вниз прорывает верхнюю линию остановки убытков; сделать пустое, когда цена сверху вниз прорывает нижнюю линию остановки убытков.

Анализ преимуществ

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

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

Анализ рисков

Основной риск этой стратегии заключается в том, что установка стоп-линий может быть слишком мягкой и не позволит вовремя остановить убытки. Это связано с тем, что коэффициент отступления стоп-линий установлен фиксированно, и если ситуация резко изменится, невозможность вовремя обновить стоп-линии может привести к большим убыткам.

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

Направление оптимизации

Эта стратегия может быть оптимизирована в следующих аспектах:

  1. тестирование пропорций стоп-линий при различных параметрах, чтобы найти наиболее оптимальную комбинацию параметров;

  2. Попытка настроить стоп-линию на динамическое изменение и корректировать ее в зависимости от степени волатильности рынка;

  3. Добавление других показателей, введение большего количества переменных на Stop Loss Basis, повышение адаптивности стратегии;

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

Подвести итог

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

Исходный код стратегии
/*backtest
start: 2023-02-22 00:00:00
end: 2024-02-28 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=5
strategy('Atlantean Trend Signal BUY SELL Strategy', overlay=true)

ma_length = input.int(title='Moving Average Length', minval=1, defval=3)
percent = input.float(3.3, 'STOP LOSS Percent', step=0.1, minval=0)
src = input(title='Source', defval=close)
mav = input.string(title="Moving Average Type", defval="KAMA", options=["SMA", "EMA", "WMA", "DEMA", "TMA", "VAR", "WWMA", "ZLEMA", "TSF", "HULL", "TILL", "KAMA"])
T3a1 = 0.7
_type = false //input(false, title='Activate Moving Average Screening Mode')
_type1 = false //input(false, title='Activate Moving Average Color Change Screening Mode')
activateScreener = input.bool(false, title="Activate Screener?")
showsignallabels = input(title='Show Signal Labels?', defval=true)

Var_Func(src, ma_length) =>
    valpha = 2 / (ma_length + 1)
    vud1 = src > src[1] ? src - src[1] : 0
    vdd1 = src < src[1] ? src[1] - src : 0
    vUD = math.sum(vud1, 9)
    vDD = math.sum(vdd1, 9)
    vCMO = nz((vUD - vDD) / (vUD + vDD))
    VAR = 0.0
    VAR := nz(valpha * math.abs(vCMO) * src) + (1 - valpha * math.abs(vCMO)) * nz(VAR[1])
    VAR

VAR = Var_Func(src, ma_length)
DEMA = 2 * ta.ema(src, ma_length) - ta.ema(ta.ema(src, ma_length), ma_length)

Wwma_Func(src, ma_length) =>
    wwalpha = 1 / ma_length
    WWMA = 0.0
    WWMA := wwalpha * src + (1 - wwalpha) * nz(WWMA[1])
    WWMA

WWMA = Wwma_Func(src, ma_length)

// KAMA Calculation
Kama_Func(src, ma_length) =>
    xvnoise = math.abs(src - src[1])
    nfastend = 0.666
    nslowend = 0.0645
    nsignal = math.abs(src - src[ma_length])
    nnoise = math.sum(xvnoise, ma_length)
    nefratio = nnoise != 0 ? nsignal / nnoise : 0
    nsmooth = math.pow(nefratio * (nfastend - nslowend) + nslowend, 2)
    nAMA = 0.0
    nAMA := nz(nAMA[1]) + nsmooth * (src - nz(nAMA[1]))
    nAMA

Zlema_Func(src, ma_length) =>
    zxLag = ma_length / 2 == math.round(ma_length / 2) ? ma_length / 2 : (ma_length - 1) / 2
    zxEMAData = src + src - src[zxLag]
    ZLEMA = ta.ema(zxEMAData, ma_length)
    ZLEMA

ZLEMA = Zlema_Func(src, ma_length)

Tsf_Func(src, ma_length) =>
    lrc = ta.linreg(src, ma_length, 0)
    lrc1 = ta.linreg(src, ma_length, 1)
    lrs = lrc - lrc1
    TSF = ta.linreg(src, ma_length, 0) + lrs
    TSF

TSF = Tsf_Func(src, ma_length)

HMA = ta.wma(2 * ta.wma(src, ma_length / 2) - ta.wma(src, ma_length), math.round(math.sqrt(ma_length)))

T3e1 = ta.ema(src, ma_length)
T3e2 = ta.ema(T3e1, ma_length)
T3e3 = ta.ema(T3e2, ma_length)
T3e4 = ta.ema(T3e3, ma_length)
T3e5 = ta.ema(T3e4, ma_length)
T3e6 = ta.ema(T3e5, ma_length)
T3c1 = -T3a1 * T3a1 * T3a1
T3c2 = 3 * T3a1 * T3a1 + 3 * T3a1 * T3a1 * T3a1
T3c3 = -6 * T3a1 * T3a1 - 3 * T3a1 - 3 * T3a1 * T3a1 * T3a1
T3c4 = 1 + 3 * T3a1 + T3a1 * T3a1 * T3a1 + 3 * T3a1 * T3a1
T3 = T3c1 * T3e6 + T3c2 * T3e5 + T3c3 * T3e4 + T3c4 * T3e3

getMA(src, ma_length) =>
    ma = 0.0
    ma := switch mav
        'SMA' => ta.sma(src, ma_length)
        'EMA' => ta.ema(src, ma_length)
        'WMA' => ta.wma(src, ma_length)
        'DEMA' => DEMA
        'TMA' => ta.sma(ta.sma(src, math.ceil(ma_length / 2)), math.floor(ma_length / 2) + 1)
        'VAR' => VAR
        'WWMA' => WWMA
        'ZLEMA' => ZLEMA
        'TSF' => TSF
        'HULL' => HMA
        'TILL' => T3
        'KAMA' => Kama_Func(src, ma_length)
    ma
ALL = getMA(src, ma_length)
exMov = ALL
fark = exMov * percent * 0.01
longStop = exMov - fark
longStopPrev = nz(longStop[1], longStop)
longStop := exMov > longStopPrev ? math.max(longStop, longStopPrev) : longStop
shortStop = exMov + fark
shortStopPrev = nz(shortStop[1], shortStop)
shortStop := exMov < shortStopPrev ? math.min(shortStop, shortStopPrev) : shortStop
dir = 1
dir := nz(dir[1], dir)
dir := dir == -1 and exMov > shortStopPrev ? 1 : dir == 1 and exMov < longStopPrev ? -1 : dir
MOST = dir == 1 ? longStop : shortStop
cro = _type and _type1 ? ta.crossover(exMov, exMov[1]) : _type ? ta.crossover(close, exMov) : ta.crossover(exMov, MOST)
cru = _type and _type1 ? ta.crossunder(exMov, exMov[1]) : _type ? ta.crossunder(close, exMov) : ta.crossunder(exMov, MOST)
direction = 0
direction := cro ? 1 : cru ? -1 : direction[1]
col1 = exMov > exMov[1]
col3 = exMov < exMov[1]
colorM = col1 and _type and _type1 ? color.rgb(14, 241, 52) : col3 and _type and _type1 ? color.red : color.new(#00bcd4, 0)
if (cro)
    strategy.entry('LONG', strategy.long)
if (cru)
    strategy.close('LONG')

plot(_type ? na : MOST, color=color.new(color.maroon, 0), linewidth=3, title='MOST')
plot(exMov, color=colorM, linewidth=2, title='exMov')
plotshape(cro and showsignallabels, title='BUY', text='BUY', location=location.belowbar, style=shape.labelup, size=size.tiny, color=color.new(#00bcd4, 0), textcolor=color.new(color.white, 0))
plotshape(cru and showsignallabels, title='SELL', text='SELL', location=location.abovebar, style=shape.labeldown, size=size.tiny, color=color.new(#e91e63, 0), textcolor=color.new(color.white, 0))