Трендовая стратегия на основе MOST и KAMA

Автор:Чао Чжан, Дата: 2024-02-29 11:04:38
Тэги:

img

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

Принцип стратегии

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

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

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

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

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

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

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

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

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

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

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

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

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

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

  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))


Больше