Pengoptimuman Pelanggaran Momentum

Penulis:ChaoZhang, Tarikh: 2024-01-17 16:44:30
Tag:

img

Ringkasan

Strategi optimum momentum adalah strategi trend yang menghasilkan isyarat dagangan dan menetapkan stop loss / mengambil keuntungan berdasarkan penunjuk momentum. Ia menilai arah trend pasaran dengan mengira persilangan antara harga dan purata bergerak, dan membina mekanisme stop loss dinamik menggunakan ATR dan Saluran LinReg. Sementara itu, strategi ini juga mengenal pasti tahap overbought / oversold menggunakan penunjuk CMO untuk harga kemasukan yang lebih baik.

Logika Strategi

    1. Mengira purata bergerak harga ZLEMA sebagai penunjuk teknikal untuk arah trend
    1. Mengira kerugian berhenti panjang dan kehilangan berhenti pendek berdasarkan ATR
    1. Mengira penunjuk SCO untuk mengenal pasti zon overbought/oversold, digabungkan dengan purata bergerak sebagai isyarat kemasukan
    1. Menghasilkan 3 set isyarat dagangan berdasarkan ATR, purata bergerak dan harga pecah
    • Crossover antara purata bergerak dan paras stop loss
    • Crossover antara tahap harga dan stop loss
    • Crossover antara harga dan purata bergerak
    1. Membolehkan/menonaktifkan gabungan isyarat yang berbeza melalui tetapan parameter
    1. Tetapkan peratusan risiko dan saiz kedudukan untuk pengurusan risiko

Strategi keseluruhan menggabungkan pelbagai penunjuk untuk trend yang stabil dan kehilangan berhenti automatik, memastikan peluang perdagangan yang mencukupi sambil mengawal risiko perdagangan.

Analisis Kelebihan

Gabungan pelbagai penunjuk

Strategi ini menggunakan gabungan penunjuk termasuk purata bergerak, ATR, CMO dan lain-lain. Penunjuk saling melengkapi dan memberikan penilaian yang lebih boleh dipercayai mengenai arah trend dan zon overbought / oversold.

Hentikan Pengangkutan Dinamik

Penghentian kerugian dinamik berasaskan ATR boleh menyesuaikan tahap penghentian kerugian secara fleksibel berdasarkan turun naik pasaran, dengan berkesan mengawal kerugian perdagangan tunggal.

Pengurusan Risiko yang Komprehensif

Strategi ini menyediakan saiz kedudukan dan tetapan peratusan risiko, yang menentukan peratusan maksimum modal yang berisiko untuk mengelakkan turun naik dana yang teruk.

Isyarat Dagangan yang Banyak

Strategi ini menawarkan 3 set isyarat perdagangan. Dengan membolehkan kombinasi isyarat yang berbeza, hasil backtest yang lebih baik dapat diperoleh.

Analisis Risiko

Frekuensi Dagangan Tinggi

Mungkin ada perdagangan yang terlalu kerap apabila semua kombinasi isyarat diaktifkan. Ini boleh dielakkan dengan hanya menggunakan beberapa isyarat.

Sensitif kepada tetapan parameter

Model multiparameter menjadikan pengoptimuman parameter lebih kompleks dan sensitif. Gabungan parameter optimum memerlukan ujian yang luas.

Pengeluaran yang lebih tinggi untuk isyarat pecah

Untuk isyarat pecah harga / stop loss murni, julat stop loss lebih luas, yang boleh membawa kepada kerugian perdagangan tunggal yang lebih besar dan penarikan.

Arahan pengoptimuman

Uji gabungan parameter yang berbeza

Mengoptimumkan parameter seperti jenis / panjang purata bergerak, tempoh ATR, tempoh CMO untuk mencari perlawanan optimum.

Mengoptimumkan Strategi Penggunaan Isyarat

Uji prestasi hanya menggunakan isyarat purata bergerak, isyarat stop loss, atau isyarat gabungan untuk mencari strategi penggunaan yang terbaik.

Prestasi Ujian di Produk Berbeza

Uji semula strategi merentasi indeks, forex, produk komoditi untuk menganalisis adaptiviti merentasi pelbagai jenis pasaran.

Kesimpulan

Strategi ini mengintegrasikan beberapa penunjuk untuk pengenalan trend, pembinaan stop loss, pengesanan overbought / oversold. Dengan menyesuaikan parameter dan kombinasi isyarat, metrik risiko yang memuaskan dapat dicapai. Sistem keseluruhan komprehensif dan boleh dipercayai untuk ujian dan pengoptimuman langsung yang lebih lanjut.


/*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()
  

Lebih lanjut