Тенденция в соответствии со стратегией на основе адаптивной скользящей средней

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

img

Обзор

Эта стратегия использует индикатор адаптивной скользящей средней (KAMA) Кауфмана для разработки следующей торговой системы. Он может быстро отслеживать тенденции, когда они образуются, и фильтровать шум во время неуравновешенных рынков. В то же время система также интегрирует Параболический SAR (PSAR) и Средний True Range Trailing Stop в качестве механизмов остановки потерь с сильными возможностями контроля рисков.

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

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

  • Система в основном оценивает направление тренда на основе самой быстрой KAMA (KAMA 1). Она длится, когда KAMA 1 указывает вверх, и становится короткой, когда KAMA 1 указывает вниз. Чтобы отфильтровать ложные перерывы, устанавливается фильтр KAMA. Торговые сигналы генерируются только тогда, когда изменение в KAMA 1 превышает одно стандартное отклонение последних колебаний.

  • Для стоп-лосса система предоставляет три опциональных метода стоп-лосса: KAMA-реверсию, PSAR-реверсию и ATR-трейлинг-стоп.

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

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

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

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

  • Многочисленные параметры и комбинации условий обеспечивают большое пространство для настройки системы. Пользователи могут оптимизировать в соответствии с различными продуктами и частотами.

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

  • Система не учитывает системные риски и не может эффективно контролировать потери в экстремальных рыночных условиях.

  • Система PARAMETERS может потребоваться корректировать в соответствии с различными продуктами и частотами, иначе она будет давать слишком агрессивные или слишком консервативные результаты.

  • Если рассчитывать исключительно на индикатор KAMA для остановки потери, легко попасть в ловушку во время бурных рынков.

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

  • Добавить индикаторы фильтрации тренда, такие как ADX или подразумеваемая волатильность, чтобы избежать генерирования неправильных сигналов во время нестабильных и переходных этапов тренда.

  • Оптимизируйте и проверяйте ПАРАМЕТРЫ для отдельных продуктов и фиксированных частот для улучшения стабильности.

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

  • Попробуйте перенести стратегию на другие продукты, такие как криптовалюты. Это может потребовать корректировки PARAMETERS или добавления других вспомогательных показателей.

Резюме

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


/*backtest
start: 2023-12-01 00:00:00
end: 2023-12-31 23:59:59
period: 1h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

// This source code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/
// © BenHampson
// @version=4
// Credit to:
// - ChuckBanger for much of the KAMA code
// - cheatcountry for the KAMA Filter code
// - millerrh for much of the ATR Stop code
// - racer8 for much of the Position Sizing code

// I have combined aspects of their work and built upon it to form a strategy I like. 
// The KAMA, with its filter, is used for entry.
// An ATR trailing stop loss, PSAR, and the KAMA can all optionally be used as exits, or you can use a combination of the three.

strategy(title="KAMA Strategy - Kaufman's Adaptive Moving Average", shorttitle="KAMA Strategy", overlay=true)

src = input(title="Source", type=input.source, defval=close)

// Exits
KAMA1SL = input(title = 'KAMA 1 Stop Loss', type = input.bool, defval = true)
ATRTSL = input(title = 'ATR Trailing Stop Loss', type = input.bool, defval = false)
PSARSL = input(title = 'PSAR Stop Loss', type = input.bool, defval = false)

// KAMA 1 (Fastest)
length1 = input(title="KAMA 1: Length", type=input.integer, defval=14)
fastLength1 = input(title="KAMA 1: Fast KAMA Length", type=input.integer, defval=2)
slowLength1 = input(title="KAMA 1: Slow KAMA Length", type=input.integer, defval=20)

length2 = input(title="KAMA 2: Length 2", type=input.integer, defval=15)
fastLength2 = input(title="KAMA 2: Fast KAMA Length", type=input.integer, defval=3)
slowLength2 = input(title="KAMA 2: Slow KAMA Length", type=input.integer, defval=22)

length3 = input(title="KAMA 3: Length 3", type=input.integer, defval=16)
fastLength3 = input(title="KAMA 3: Fast KAMA Length", type=input.integer, defval=4)
slowLength3 = input(title="KAMA 3: Slow KAMA Length", type=input.integer, defval=24)

length4 = input(title="KAMA 4: Length", type=input.integer, defval=17)
fastLength4 = input(title="KAMA 4: Fast KAMA Length", type=input.integer, defval=5)
slowLength4 = input(title="KAMA 4: Slow KAMA Length", type=input.integer, defval=26)

// KAMA 5 (Medium)
length5 = input(title="KAMA 5: Length", type=input.integer, defval=18)
fastLength5 = input(title="KAMA 5: Fast KAMA Length", type=input.integer, defval=6)
slowLength5 = input(title="KAMA 5: Slow KAMA Length", type=input.integer, defval=28)

length6 = input(title="KAMA 6: Length", type=input.integer, defval=19)
fastLength6 = input(title="KAMA 6: Fast KAMA Length", type=input.integer, defval=7)
slowLength6 = input(title="KAMA 6: Slow KAMA Length", type=input.integer, defval=30)

length7 = input(title="KAMA 7: Length", type=input.integer, defval=20)
fastLength7 = input(title="KAMA 7: Fast KAMA Length", type=input.integer, defval=8)
slowLength7 = input(title="KAMA 7: Slow KAMA Length", type=input.integer, defval=32)

// KAMA 8 (Slowest)
length8 = input(title="KAMA 8: Length", type=input.integer, defval=21)
fastLength8 = input(title="KAMA 8: Fast KAMA Length", type=input.integer, defval=9)
slowLength8 = input(title="KAMA 8: Slow KAMA Length", type=input.integer, defval=34)

// Kaufman's Adaptive Moving Average
getKAMA(src, length1, fastLength1, slowLength1) =>
    mom = abs(change(src, length1))
    volatility = sum(abs(change(src)), length1)
    
    // Efficiency Ratio
    er = volatility != 0 ? mom / volatility : 0
    
    fastAlpha = 2 / (fastLength1 + 1)
    slowAlpha = 2 / (slowLength1 + 1)
    
    // KAMA Alpha
    sc = pow((er * (fastAlpha - slowAlpha)) + slowAlpha, 2)
    
    kama = 0.0
    kama := sc * src + (1 - sc) * nz(kama[1])
    kama

kama1 = getKAMA(src, length1, fastLength1, slowLength1)
kama2 = getKAMA(src, length2, fastLength2, slowLength2)
kama3 = getKAMA(src, length3, fastLength3, slowLength3)
kama4 = getKAMA(src, length4, fastLength4, slowLength4)
kama5 = getKAMA(src, length5, fastLength5, slowLength5)
kama6 = getKAMA(src, length6, fastLength6, slowLength6)
kama7 = getKAMA(src, length7, fastLength7, slowLength7)
kama8 = getKAMA(src, length8, fastLength8, slowLength8)

//If the kama1 has increased...
kama1delta = kama1[0] - kama1[1]
kama3delta = kama3[0] - kama3[1]
kama8delta = kama8[0] - kama8[1]

// KAMA Plots
plot(kama1, title="KAMA 1", color=#e91e63, display=display.all, linewidth=2)
plot(kama2, title="KAMA 2", color=color.red, display=display.all)
plot(kama3, title="KAMA 3", color=color.red, display=display.all)
plot(kama4, title="KAMA 4", color=color.orange, display=display.all)
plot(kama5, title="KAMA 5", color=color.orange, display=display.all)
plot(kama6, title="KAMA 6", color=color.yellow, display=display.all)
plot(kama7, title="KAMA 7", color=color.yellow, display=display.all)
plot(kama8, title="KAMA 8", color=color.white, display=display.all)



//========================================= KAMA FILTER ===========================================

// Copyright (c) 2019-present, Franklin Moormann (cheatcountry)
// Moving Average Adaptive Filter [CC] script may be freely distributed under the MIT license.

entryFilter = input(title="KAMA Entry Filter", type=input.float, defval=1, minval=0.01)
exitFilter = input(title="KAMA Exit Filter", type=input.float, defval=0.5, minval=0.01)

entryMAAF = entryFilter * stdev(kama1delta, length1)
exitMAAF = exitFilter * stdev(kama1delta, length1)
srcEma = ema(src, length1)



//========================================= TRAILING ATR STOP ====================================

// The following is an adaptation of Trailing ATR Stops by @millerrh
// He based it on scripts by @garethyeo & @SimpleCryptoLife

// Inputs

atrLookback = input(defval=14,title="Trailing ATR Lookback Period",type=input.integer)
multiplier = input(defval=3,title="Trailing ATR Multiplier",type=input.float, step=0.1, minval=0.5, maxval=4)
trailMode = input(title="Trail Mode", defval="Trailing", options=["Running", "Trailing"])
trigInput = input(title="Trigger Trailing Stop On", defval="Wick", options=["Close","Wick"]) 

// Calculate ATR
atrValue = atr(atrLookback)
atrMultiplied = atrValue * multiplier

// Plot the price minus the ATR
atrLow = low - atrMultiplied

// Calculate the low trailing ATRs every time. The trailing stop loss never goes down.
// Set them to something to start with
trailAtrLow = atrLow

// If the ATR Low has gone up AND it has gone above the trail, the low trailing ATR should also go up. If the ATR Low has gone up or down, but not below the trail, the ATR trail stays where it is
trailAtrLow := na(trailAtrLow[1]) ? trailAtrLow : atrLow >= trailAtrLow[1] ? atrLow : trailAtrLow[1]

// Trigger stop based on candle close or low
trigSupport = trigInput == "Close" ? close : trigInput == "Wick" ? low : na

// Determine if price is below support
supportHit = trigSupport <= trailAtrLow

// If price is below support, reset the trailing ATR
trailAtrLow := supportHit ? atrLow : trailAtrLow

// Plot Lines
plotLow = ATRTSL ? trailAtrLow : na
plot(plotLow, title="ATR Low", color=color.white, transp=50, style=plot.style_linebr, linewidth=1, display=display.all)



//====================================== PSAR STOP ==========================================

start = input(0.02, "PSAR Start")
increment = input(0.02, "PSAR Increment")
maximum = input(0.2, "PSAR Max Value")
psar = sar(start, increment, maximum)
psarPlot  = PSARSL ? psar : na
plot(psarPlot, "Parabolic SAR", style=plot.style_cross, color=#3A6CA8, display=display.all)



//========================================= ENTRY & EXITS =====================================================

// Entry
long = kama1delta > 0 and kama1delta > entryMAAF
strategy.entry("Buy", true, when = long) 

// Close
longClose = (PSARSL ? crossunder(close, psar) : na) or (KAMA1SL ? kama1delta < 0 and abs(kama1delta) > exitMAAF : na) or (ATRTSL ? supportHit : na)
strategy.close("Buy", when = longClose, comment = "Sell")

Больше