Оптимизированная стратегия следования за трендом Momentum Breakout


Дата создания: 2024-01-17 16:44:30 Последнее изменение: 2024-01-17 16:44:30
Копировать: 0 Количество просмотров: 622
1
Подписаться
1617
Подписчики

Оптимизированная стратегия следования за трендом Momentum Breakout

Обзор

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

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

  • 1. ZLEMA Moving Average для расчета цены как технический показатель для определения направления тенденции
  • 2. Стоп-стоп для длинных и коротких позиций, рассчитанные по ATR
  • 3. Вычислить перепродажи по CMO-индикатору в сочетании с подвижным средним, чтобы определить перепродажи
  • 4. Строительство трёх групп торговых сигналов на основе прорывов ATR и скользящей средней
    • Перекрестные сигналы движущейся средней и стоп-цены
    • Кроссовые сигналы цены и стоп-цены
    • Пересекающиеся сигналы цен и скользящих средних
  • 5. Контроль за включением различных типов сигналов с помощью параметров
  • 6. Настройка коэффициентов риска и контроля позиций для управления риском

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

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

Использование различных комбинаций показателей

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

Динамическая остановка

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

Правильное управление рисками

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

Богатые торговые сигналы

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

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

Слишком высокая частота торгов

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

Параметры индикатора чувствительны

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

Сигналы о прорыве отменены

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

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

Тестирование различных комбинаций

Оптимизация параметров типа и длины скользящих средних; оптимизация параметров ATR-циклов; оптимизация параметров CMO. Найти оптимальное совпадение параметров.

Стратегии оптимизации использования сигналов

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

Тестирование на различные сорта

Проведение ретроспективных исследований по индексам акций, валютам и товарным сортам, а также анализ стратегии, соответствующей типу рынка.

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

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

Исходный код стратегии
/*backtest
start: 2024-01-09 00:00:00
end: 2024-01-16 00:00:00
period: 5m
basePeriod: 1m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=4
// This source code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/
// © KivancOzbilgic
//developer: @KivancOzbilgic
//author: @KivancOzbilgic

strategy(title="Profit Maximizer PMax", overlay=true,
     pyramiding=0, initial_capital=1000,
     commission_type=strategy.commission.cash_per_order,
     commission_value=0.025, slippage=2)


src = input(hl2, title="Source")
Periods = input(title="ATR Length", type=input.integer, defval=10)
Multiplier = input(title="ATR Multiplier", type=input.float, step=0.1, defval=3.0)
mav = input(title="Moving Average Type", defval="ZLEMA", options=["SMA", "EMA", "WMA", "TMA", "VAR", "WWMA", "ZLEMA", "TSF"])
length =input(10, "Moving Average Length", minval=1)
changeATR= input(title="Change ATR Calculation Method ?", type=input.bool, defval=true)
showsupport = input(title="Show Moving Average?", type=input.bool, defval=true)
showsignalsk = input(title="Show Crossing Signals?", type=input.bool, defval=true)
showsignalsc = input(title="Show Price/Pmax Crossing Signals?", type=input.bool, defval=false)
highlighting = input(title="Highlighter On/Off ?", type=input.bool, defval=true)

usePosSize = input(title="Use Position Sizing?", type=input.bool, defval=true)
riskPerc   = input(title="Risk %", type=input.float, defval=0.5, step=0.25)

// Make input options that configure backtest date range
startDate = input(title="Start Date", type=input.integer,
     defval=1, minval=1, maxval=31)
startMonth = input(title="Start Month", type=input.integer,
     defval=1, minval=1, maxval=12)
startYear = input(title="Start Year", type=input.integer,
     defval=2019, minval=1800, maxval=2100)

endDate = input(title="End Date", type=input.integer,
     defval=1, minval=1, maxval=31)
endMonth = input(title="End Month", type=input.integer,
     defval=12, minval=1, maxval=12)
endYear = input(title="End Year", type=input.integer,
     defval=2021, minval=1800, maxval=2100)
     
// Look if the close time of the current bar
// falls inside the date range
inDateRange = true

atr2 = sma(tr, Periods)
atr= changeATR ? atr(Periods) : atr2
valpha=2/(length+1)
vud1=src>src[1] ? src-src[1] : 0
vdd1=src<src[1] ? src[1]-src : 0
vUD=sum(vud1,9)
vDD=sum(vdd1,9)
vCMO=nz((vUD-vDD)/(vUD+vDD))
VAR=0.0
VAR:=nz(valpha*abs(vCMO)*src)+(1-valpha*abs(vCMO))*nz(VAR[1])
wwalpha = 1/ length
WWMA = 0.0
WWMA := wwalpha*src + (1-wwalpha)*nz(WWMA[1])
zxLag = length/2==round(length/2) ? length/2 : (length - 1) / 2
zxEMAData = (src + (src - src[zxLag]))
ZLEMA = ema(zxEMAData, length)
lrc = linreg(src, length, 0)
lrc1 = linreg(src,length,1)
lrs = (lrc-lrc1)
TSF = linreg(src, length, 0)+lrs
getMA(src, length) =>
    ma = 0.0
    if mav == "SMA"
        ma := sma(src, length)
        ma

    if mav == "EMA"
        ma := ema(src, length)
        ma

    if mav == "WMA"
        ma := wma(src, length)
        ma

    if mav == "TMA"
        ma := sma(sma(src, ceil(length / 2)), floor(length / 2) + 1)
        ma

    if mav == "VAR"
        ma := VAR
        ma

    if mav == "WWMA"
        ma := WWMA
        ma

    if mav == "ZLEMA"
        ma := ZLEMA
        ma

    if mav == "TSF"
        ma := TSF
        ma
    ma
    
MAvg=getMA(src, length)
longStop = MAvg - Multiplier*atr
longStopPrev = nz(longStop[1], longStop)
longStop := MAvg > longStopPrev ? max(longStop, longStopPrev) : longStop
shortStop = MAvg + Multiplier*atr
shortStopPrev = nz(shortStop[1], shortStop)
shortStop := MAvg < shortStopPrev ? min(shortStop, shortStopPrev) : shortStop
dir = 1
dir := nz(dir[1], dir)
dir := dir == -1 and MAvg > shortStopPrev ? 1 : dir == 1 and MAvg < longStopPrev ? -1 : dir
PMax = dir==1 ? longStop: shortStop
plot(showsupport ? MAvg : na, color=#0585E1, linewidth=2, title="Moving Avg Line")
pALL=plot(PMax, color=color.red, linewidth=2, title="PMax", transp=0)

alertcondition(cross(MAvg, PMax), title="Cross Alert", message="PMax - Moving Avg Crossing!")
alertcondition(crossover(MAvg, PMax), title="Crossover Alarm", message="Moving Avg BUY SIGNAL!")
alertcondition(crossunder(MAvg, PMax), title="Crossunder Alarm", message="Moving Avg SELL SIGNAL!")
alertcondition(cross(src, PMax), title="Price Cross Alert", message="PMax - Price Crossing!")
alertcondition(crossover(src, PMax), title="Price Crossover Alarm", message="PRICE OVER PMax - BUY SIGNAL!")
alertcondition(crossunder(src, PMax), title="Price Crossunder Alarm", message="PRICE UNDER PMax - SELL SIGNAL!")


// Calculate position size
riskEquity  = (riskPerc / 100) * strategy.equity
atrCurrency = (atr(20) * syminfo.pointvalue)
posSize     = usePosSize ? floor(riskEquity / atrCurrency) : 1

//Long
buySignalk = crossover(MAvg, PMax)
plotshape(buySignalk and showsignalsk ? PMax*0.995 : na, title="Buy", text="BuyL", location=location.absolute, style=shape.labelup, size=size.tiny, color=color.green, textcolor=color.white, transp=0)


if(buySignalk and showsignalsk and inDateRange)
    strategy.entry(id="buySignalk", long=true, qty=posSize)
    
sellSignallk = crossunder(MAvg, PMax)
plotshape(sellSignallk and showsignalsk ? PMax*1.005 : na, title="Sell", text="SellL", location=location.absolute, style=shape.labeldown, size=size.tiny, color=color.red, textcolor=color.white, transp=0)

if(sellSignallk and showsignalsk and inDateRange)
    strategy.order(id="sellSignallk", long=false, qty=strategy.position_size)
    
//Short
buySignalc = crossover(src, PMax)
plotshape(buySignalc and showsignalsc ? PMax*0.995 : na, title="Buy", text="BuyS", location=location.absolute, style=shape.labelup, size=size.tiny, color=#0F18BF, textcolor=color.white, transp=0)

if(buySignalc and showsignalsc and inDateRange)
    strategy.entry(id="BuyS", long=false, qty=posSize)

sellSignallc = crossunder(src, PMax)
plotshape(sellSignallc and showsignalsc ? PMax*1.005 : na, title="Sell", text="SellS", location=location.absolute, style=shape.labeldown, size=size.tiny, color=#0F18BF, textcolor=color.white, transp=0)

if(sellSignallc and showsignalsc and inDateRange)
    strategy.order(id="SellS", long=true, qty=abs(strategy.position_size))

mPlot = plot(ohlc4, title="", style=plot.style_circles, linewidth=0,display=display.none)

longFillColor = highlighting ? (MAvg>PMax ? color.green : na) : na
shortFillColor = highlighting ? (MAvg<PMax ? color.red : na) : na

fill(mPlot, pALL, title="UpTrend Highligter", color=longFillColor)
fill(mPlot, pALL, title="DownTrend Highligter", color=shortFillColor)

// Exit open market position when date range ends
if (not inDateRange)
    strategy.close_all()