Оптимизация импульса

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

img

Обзор

Стратегия оптимизации прорыва момента - это стратегия, следующая за трендом, которая генерирует торговые сигналы и устанавливает стоп-лосс/прибыль на основе индикаторов импульса. Она оценивает направление тренда рынка, рассчитывая перекрестки между ценой и скользящей средней, и создает динамический механизм стоп-лосса с использованием ATR и LinReg Channel. Между тем, стратегия также определяет уровни перекупки/перепродажи с использованием индикатора CMO для лучших входных цен.

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

    1. Вычислить скользящую среднюю цену ZLEMA как технический показатель направления тренда
    1. Расчет длинной и короткой стоп-потери на основе ATR
    1. Расчет показателя ОРС для выявления зон перекупки/перепродажи в сочетании с скользящей средней как сигналов входа
    1. Сгенерировать 3 набора торговых сигналов на основе ATR, скользящей средней и ценовых прорывов
    • Пересечения между уровнями скользящей средней и уровнями остановки потерь
    • Пересечения между уровнем цены и уровнем стоп-лосса
    • Кроссоверы между ценой и скользящей средней
    1. Включить/отключить различные комбинации сигналов с помощью параметров
    1. Установление процента риска и размещения позиций для управления рисками

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

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

Комбинация нескольких показателей

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

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

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

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

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

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

Стратегия предлагает 3 набора торговых сигналов.

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

Высокая частота торговли

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

Чувствительный к параметрам

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

Более высокая вытяжка для сигналов прорыва

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

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

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

Оптимизируйте такие параметры, как скользящий средний тип / длина, период 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()
  

Больше