Pemecahan Momentum Strategi Mengikuti Aliran Dioptimumkan


Tarikh penciptaan: 2024-01-17 16:44:30 Akhirnya diubah suai: 2024-01-17 16:44:30
Salin: 0 Bilangan klik: 622
1
fokus pada
1617
Pengikut

Pemecahan Momentum Strategi Mengikuti Aliran Dioptimumkan

Gambaran keseluruhan

Strategi optimasi pemecahan dinamik adalah strategi pengesanan trend berdasarkan indikator dinamik untuk menghasilkan isyarat perdagangan dan menetapkan stop loss. Strategi ini menilai arah trend pasaran dengan mengira persilangan harga dan garis rata-rata bergerak, menggabungkan ATR dan saluran LinReg untuk membina mekanisme stop loss dinamik. Strategi ini juga menggunakan indikator CMO untuk mengenal pasti keadaan overbought dan oversold, untuk mencapai kemasukan yang lebih baik.

Prinsip Strategi

  • 1. Pengiraan purata bergerak ZLEMA harga sebagai petunjuk teknikal untuk menentukan arah trend
  • 2. Harga Hentian Posisi Panjang dan Hentian Posisi Pendek yang dikira berdasarkan ATR
  • 3. Kaedah pengiraan CMO untuk menentukan selang jual beli yang berlebihan, dengan gabungan purata bergerak sebagai isyarat masuk
  • 4. Membina tiga set isyarat dagangan berdasarkan ATR dan purata bergerak
    • Sinyal silang pergerakan rata-rata dan harga berhenti
    • Sinyal silang harga dan harga berhenti
    • Sinyal silang harga dan purata bergerak
  • 5. Mengendalikan kebolehgunaan pelbagai jenis isyarat melalui tetapan parameter
  • 6. Menetapkan faktor risiko dan kawalan kedudukan untuk pengurusan risiko

Strategi keseluruhan menggunakan gabungan pelbagai petunjuk untuk mencapai trend yang stabil dan menghentikan kerugian secara automatik, memastikan peluang perdagangan yang mencukupi dan mengawal risiko perdagangan.

Analisis kelebihan

Penggunaan pelbagai kombinasi

Strategi ini menggunakan kombinasi pelbagai petunjuk seperti purata bergerak, ATR, CMO, dan lain-lain yang dapat membentuk pelengkap yang berkesan antara indikator, mengenal pasti arah trend dan penghakiman kawasan overbought dan oversold dengan lebih tepat dan lebih dipercayai.

Trailing stop dinamik

Mekanisme Hentian Bergerak berasaskan ATR dapat menyesuaikan kedudukan Hentian secara fleksibel mengikut turun naik pasaran, untuk mengawal kerugian tunggal dengan berkesan.

Pengurusan risiko yang baik

Strategi ini menyediakan kawalan kedudukan dan tetapan faktor risiko, yang membolehkan anda menentukan jumlah kerugian maksimum untuk mengelakkan turun naik yang besar.

Isyarat perdagangan yang kaya

Strategi ini menyediakan tiga set isyarat dagangan secara keseluruhan, yang boleh dipilih dengan mengaktifkan kombinasi jenis isyarat yang berbeza untuk mendapatkan hasil yang lebih baik.

Analisis risiko

Terlalu banyak transaksi

Apabila semua kombinasi isyarat diaktifkan, frekuensi dagangan yang terlalu tinggi mungkin berlaku. Ia boleh dielakkan dengan memilih hanya sebahagian daripada kombinasi isyarat yang digunakan.

Parameter penunjuk sensitif

Penggunaan pelbagai kombinasi penunjuk menjadikan pilihan parameter lebih rumit, lebih sensitif terhadap tetapan parameter, dan memerlukan kombinasi optimum parameter yang diuji dengan teliti.

Rate penarikan balik yang tinggi

Isyarat dagangan yang hanya berdasarkan harga dan harga berhenti yang bersilang, mempunyai jangkauan berhenti yang lebih besar, yang boleh menyebabkan kerugian dan penarikan balik yang lebih besar. Isyarat garis lurus bergerak boleh dipilih untuk digunakan dengan kombinasi.

Arah pengoptimuman

Uji kombinasi parameter yang berbeza

Mengoptimumkan jenis purata bergerak, parameter panjang; mengoptimumkan parameter kitaran ATR; mengoptimumkan parameter CMO. Cari padanan optimum parameter.

Strategi penggunaan isyarat yang optimum

Ujian hanya menggunakan isyarat purata bergerak, isyarat harga berhenti dan isyarat gabungan untuk menganalisis strategi penggunaan terbaik.

Ujian prestasi dalam pelbagai jenis

Melakukan tinjauan semula dalam indeks saham, mata wang asing, dan jenis komoditi untuk menganalisis kesesuaian strategi dengan jenis pasaran.

ringkaskan

Strategi ini menggunakan pelbagai indikator untuk mengenal pasti arah trend, membina mekanisme berhenti kerugian, dan mencari peluang untuk membeli dan menjual. Dengan cara penyesuaian melalui pengoptimuman parameter, pilihan gabungan isyarat dan sebagainya, penyesuaian dapat menghasilkan indikator penarikan balik yang lebih baik. Secara keseluruhannya, sistem strategi ini utuh, kebolehpercayaan yang tinggi, dan layak untuk diuji dan dioptimumkan lebih lanjut di lapangan.

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