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


Дата создания: 2024-02-19 15:41:29 Последнее изменение: 2024-02-19 15:41:29
Копировать: 0 Количество просмотров: 654
1
Подписаться
1617
Подписчики

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

Обзор

Multi Timeframe Moving Average Crossover Strategy - это алгоритмическая торговая стратегия, использующая пересекающиеся сигналы между движущимися средними за разные периоды времени для определения направления тренда. Эта стратегия использует комбинацию трендовых, динамических и волатильных показателей, что делает ее более надежной.

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

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

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

Стратегические преимущества

  1. Комплексные показатели повышают точность сигналов

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

  1. Анализ многократных временных рамок и рыночный ритм

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

  1. Отслеживание повреждений ATR, эффективное управление рисками

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

Стратегический риск

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

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

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

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

  1. Сигналы частые, риск ограничен

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

Оптимизация стратегии

  1. Повышение эффективности оптимизации параметров с помощью алгоритмов машинного обучения

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

  1. Повышение функциональных показателей и повышение гибкости стратегии

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

  1. Усиление модулей управления рисками, стратегии контроля риска

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

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

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