Стратегия перекрестного использования скользящей средней за несколько временных рамок

Автор:Чао Чжан, Дата: 2024-02-19 15:41:29
Тэги:

img

Обзор

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

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

Эта стратегия рассчитывает индикатор CCI в течение разных периодов для определения направления тенденции рынка, в сочетании с сигналами MACD для определения золотых крестов и смертных крестов, и, наконец, использует индикатор ATR для установления уровней стоп-лосс/прибыли, чтобы покупать низко и продавать высоко.

В частности, он сначала вычисляет 20-периодный CCI для оценки бычьих или медвежьих тенденций. Затем он проверяет, пересекаются ли линии MACD для идентификации торговых сигналов. Далее ATR используется для генерации остановок для блокировки прибыли. Наконец, все сигналы консолидируются для генерации сигналов входа и выхода.

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

  1. Комбинация нескольких индикаторов улучшает точность сигнала

    Комбинация CCI, MACD и ATR повышает надежность торговых сигналов путем коллективного оценки тенденции, импульса и волатильности.

  2. Анализ с использованием нескольких временных рамок отражает рыночный ритм

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

  3. ATR эффективно управляет риском остановки

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

Риски

  1. Ограниченное пространство оптимизации

    Большинство параметров имеют узкое пространство тонкой настройки, легко достигая узкого горла производительности.

  2. Увеличение нагрузки на вычисления

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

  3. Частые сигналы, ограниченный контроль риска

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

Усовершенствования

  1. Применение машинного обучения для более эффективной настройки параметров

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

  2. Добавление функциональных показателей для повышения адаптивности

    Включение других индикаторов, таких как волатильность, объем, настроения, может сделать стратегию более надежной и гибкой.

  3. Укрепление управления рисками для повышения стабильности

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

Заключение

Стратегия Multi Timeframe Moving Average Crossover использует возможности CCI, MACD и ATR для достижения надежного улавливания тренда и эффективного контроля рисков. Она учитывает тренд, импульс и волатильность для генерации точных сигналов, понимания рыночных ритмов и управления рисками.


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

//@version=5
strategy('smplondonclinic Strategy', shorttitle='SMPLC Strategy', overlay=true, pyramiding = 0, process_orders_on_close = true, default_qty_type = strategy.percent_of_equity, default_qty_value = 100)

direction   = input.string(title='Entry Direction', defval='Long', options=['Long', 'Short', 'Both'],group = "Strategy Entry Direction")

TPPerc = input.float(title='Take Profit (%)', minval=0.0, step=0.1, defval=0.5, group='Strategy TP & SL')
SLPerc = input.float(title='Stop Loss (%)', minval=0.0, step=0.1, defval=0.5, group='Strategy TP & SL')

period = input(20, 'CCI period',group = "TREND MAGIC")
coeff = input(1, 'ATR Multiplier',group = "TREND MAGIC")
AP = input(5, 'ATR Period',group = "TREND MAGIC")
ATR = ta.sma(ta.tr, AP)
srctm = close
upT = low - ATR * coeff
downT = high + ATR * coeff
MagicTrend = 0.0
MagicTrend := ta.cci(srctm, period) >= 0 ? upT < nz(MagicTrend[1]) ? nz(MagicTrend[1]) : upT : downT > nz(MagicTrend[1]) ? nz(MagicTrend[1]) : downT
color1 = ta.cci(srctm, period) >= 0 ? #0022FC : #FC0400
plot(MagicTrend, color=color1, linewidth=3)
tmb = ta.cci(srctm, period) >= 0 and close>MagicTrend
tms = ta.cci(srctm, period) <= 0 and close<MagicTrend

//MACD

res           = input.timeframe("",  "Indicator TimeFrame", group = "MACD")
fast_length   = input.int(title="Fast Length", defval=12, group = "MACD")
slow_length   = input.int(title="Slow Length", defval=26, group = "MACD")
src           = input.source(title="Source", defval=close, group = "MACD")
signal_length = input.int(title="Signal Smoothing", minval = 1, maxval = 999, defval = 9, group = "MACD")
sma_source    = input.string(title="Oscillator MA Type", defval="EMA", options=["SMA", "EMA"], group = "MACD")
sma_signal    = input.string(title="Signal Line MA Type", defval="EMA", options=["SMA", "EMA"], group = "MACD")

fast_ma = request.security(syminfo.tickerid, res, sma_source == "SMA" ? ta.sma(src, fast_length) : ta.ema(src, fast_length))
slow_ma = request.security(syminfo.tickerid, res, sma_source == "SMA" ? ta.sma(src, slow_length) : ta.ema(src, slow_length))
macd = fast_ma - slow_ma
signal = request.security(syminfo.tickerid, res, sma_signal == "SMA" ? ta.sma(macd, signal_length) : ta.ema(macd, signal_length))
hist = macd - signal

trend_up   = macd > signal
trend_dn   = macd < signal
cross_UP   = signal[1] >= macd[1] and signal < macd
cross_DN   = signal[1] <= macd[1] and signal > macd
cross_UP_A = (signal[1] >= macd[1] and signal < macd) and macd > 0
cross_DN_B = (signal[1] <= macd[1] and signal > macd) and macd < 0


//UT Bot

srcut = close
showut = input.bool(false, 'Show UT Bot Labels', group = "UT BOT")
keyvalue = input.float(2, title='Key Vaule. \'This changes the sensitivity\'', step=.5, group = "UT BOT")
atrperiod = input(7, title='ATR Period', group = "UT BOT")
xATR = ta.atr(atrperiod)
nLoss = keyvalue * xATR

xATRTrailingStop = 0.0
iff_1 = srcut > nz(xATRTrailingStop[1], 0) ? srcut - nLoss : srcut + nLoss
iff_2 = srcut < nz(xATRTrailingStop[1], 0) and srcut[1] < nz(xATRTrailingStop[1], 0) ? math.min(nz(xATRTrailingStop[1]), srcut + nLoss) : iff_1
xATRTrailingStop := srcut > nz(xATRTrailingStop[1], 0) and srcut[1] > nz(xATRTrailingStop[1], 0) ? math.max(nz(xATRTrailingStop[1]), srcut - nLoss) : iff_2

pos = 0
iff_3 = srcut[1] > nz(xATRTrailingStop[1], 0) and srcut < nz(xATRTrailingStop[1], 0) ? -1 : nz(pos[1], 0)
pos := srcut[1] < nz(xATRTrailingStop[1], 0) and srcut > nz(xATRTrailingStop[1], 0) ? 1 : iff_3

xcolor = pos == -1 ? color.red : pos == 1 ? color.green : color.blue

//plot(xATR, color=xcolor, title='Trailing Stop')
buy = ta.crossover(srcut, xATRTrailingStop)
sell = ta.crossunder(srcut, xATRTrailingStop)
barcolor = srcut > xATRTrailingStop

plotshape(showut ? buy:na, title='Buy', text='Buy', style=shape.labelup, location=location.belowbar, color=color.new(color.green, 0), textcolor=color.new(color.white, 0), size=size.tiny)
plotshape(showut ? sell:na, title='Sell', text='Sell', style=shape.labeldown, color=color.new(color.red, 0), textcolor=color.new(color.white, 0), size=size.tiny)

//barcolor(barcolor ? color.green : color.red)

goLong = buy and tmb and cross_UP
goShort = sell and tms and cross_DN

plotshape(goLong, location=location.bottom, style=shape.triangleup, color=color.lime, size=size.small)
plotshape(goShort, location=location.top, style=shape.triangledown, color=color.red, size=size.small)

percentAsPoints(pcnt) =>
    strategy.position_size != 0 ? math.round(pcnt / 100.0 * strategy.position_avg_price / syminfo.mintick) : float(na)

percentAsPrice(pcnt) =>
    strategy.position_size != 0 ? (pcnt / 100.0 + 1.0) * strategy.position_avg_price : float(na)

current_position_size = math.abs(strategy.position_size)
initial_position_size = math.abs(ta.valuewhen(strategy.position_size[1] == 0.0, strategy.position_size, 0))

TP = strategy.position_avg_price + percentAsPoints(TPPerc) * syminfo.mintick * strategy.position_size / math.abs(strategy.position_size)
SL = strategy.position_avg_price - percentAsPoints(SLPerc) * syminfo.mintick * strategy.position_size / math.abs(strategy.position_size)

var long = false
var short = false

if direction == 'Long' 
    long := goLong
    short := false

if direction == 'Short'
    short := goShort
    long := false

if direction == 'Both' 
    long := goLong
    short := goShort

if long and strategy.opentrades == 0
    strategy.entry(id='Long', direction=strategy.long)

if short and strategy.opentrades == 0
    strategy.entry(id='Short', direction=strategy.short)

if strategy.position_size > 0

    strategy.exit('TPSL', from_entry='Long', qty=initial_position_size, limit=TP, stop=SL)

if strategy.position_size < 0

    strategy.exit('TPSL2', from_entry='Short', qty=initial_position_size, limit=TP, stop=SL)



Больше