Strategi Mengikuti Tren yang Dioptimalkan untuk Momentum Breakout


Tanggal Pembuatan: 2024-01-17 16:44:30 Akhirnya memodifikasi: 2024-01-17 16:44:30
menyalin: 0 Jumlah klik: 622
1
fokus pada
1617
Pengikut

Strategi Mengikuti Tren yang Dioptimalkan untuk Momentum Breakout

Ringkasan

Strategi optimasi terobosan dinamis adalah strategi pelacakan tren berdasarkan indikator dinamis untuk menghasilkan sinyal perdagangan dan pengaturan stop loss. Strategi ini menilai arah tren pasar dengan menghitung persimpangan harga dan garis rata-rata bergerak, menggabungkan ATR dan saluran LinReg untuk membangun mekanisme stop loss dinamis. Strategi ini juga menggunakan indikator CMO untuk mengidentifikasi overbought dan oversold, untuk mencapai entry yang lebih baik.

Prinsip Strategi

  • 1. Perhitungan harga ZLEMA Moving Average sebagai indikator teknis untuk menentukan arah tren
  • 2. Stop loss jangka panjang dan stop loss jangka pendek berdasarkan ATR
  • 3. Perhitungan metrik CMO untuk membedakan antara overbought dan oversold, bekerja sama dengan moving average sebagai sinyal masuk
  • 4. Membangun tiga set sinyal perdagangan berdasarkan ATR dan Moving Average Breakthrough
    • Sinyal silang antara moving average dan stop loss
    • Sinyal silang antara harga dan stop loss
    • Sinyal silang antara harga dan rata-rata bergerak
  • 5. Mengontrol aktivasi berbagai jenis sinyal melalui pengaturan parameter
  • 6. Menetapkan faktor risiko dan kontrol posisi untuk manajemen risiko

Seluruh strategi melalui aplikasi kombinasi dari berbagai indikator untuk mencapai trend tracking yang stabil dan stop loss otomatis, yang menjamin peluang perdagangan yang cukup dan mengendalikan risiko perdagangan.

Analisis Keunggulan

Penggunaan berbagai kombinasi indikator

Strategi ini menggunakan kombinasi dari berbagai indikator seperti moving averages, ATR, CMO, dan lain-lain, yang dapat saling melengkapi satu sama lain secara efektif, dan dapat mengidentifikasi arah tren dan daerah overbought dan oversold dengan lebih akurat.

Trailing Stop Dinamis

Mekanisme stop loss dinamis berbasis ATR dapat menyesuaikan posisi stop loss secara fleksibel sesuai dengan volatilitas pasar, sehingga dapat mengontrol kerugian tunggal secara efektif.

Manajemen Risiko yang Baik

Strategi ini menawarkan kontrol posisi dan pengaturan faktor risiko, yang dapat didefinisikan sebelumnya untuk mengurangi jumlah kerugian maksimum dan menghindari fluktuasi besar dana.

Sinyal perdagangan yang kaya

Strategi ini menyediakan tiga set sinyal perdagangan secara keseluruhan, yang dapat dipilih untuk mendapatkan hasil yang lebih baik dengan mengaktifkan kombinasi dari berbagai jenis sinyal.

Analisis risiko

Terlalu banyak transaksi

Untuk menghindari frekuensi perdagangan yang terlalu tinggi, Anda dapat memilih untuk menggunakan hanya sebagian dari kombinasi sinyal.

Parameter indikator sensitif

Penggunaan berbagai kombinasi indikator membuat pilihan parameter lebih rumit, lebih sensitif terhadap pengaturan parameter, dan kombinasi optimal parameter yang perlu diuji dengan cermat.

Tingkat penarikan sinyal yang tinggi

Sinyal perdagangan yang hanya didasarkan pada persilangan harga dan harga stop loss, memiliki jangkauan stop loss yang lebih besar dan dapat menyebabkan kerugian dan penarikan tunggal yang lebih besar. Sinyal rata-rata bergerak dapat dipilih untuk digunakan dengan kombinasi.

Arah optimasi

Uji kombinasi parameter yang berbeda

Mengoptimalkan jenis dan panjang parameter moving average; mengoptimalkan parameter siklus ATR; mengoptimalkan parameter CMO. Menemukan kecocokan optimal dari parameter tersebut.

Strategi penggunaan sinyal yang optimal

Uji hanya menggunakan sinyal moving average, sinyal stop loss, dan sinyal kombinasi untuk menganalisis strategi penggunaan optimal.

Tes kinerja pada varietas yang berbeda

Melakukan retrospeksi pada indeks saham, mata uang asing, dan varietas komoditas untuk menganalisis adaptasi strategi terhadap jenis pasar.

Meringkaskan

Strategi ini mengintegrasikan berbagai indikator untuk mengidentifikasi arah tren, membangun mekanisme stop loss, dan menemukan peluang overbought dan oversold. Dengan cara mengoptimalkan parameter, memilih kombinasi sinyal, dan lain-lain, Anda dapat mendapatkan indikator penarikan yang lebih baik. Secara keseluruhan, sistem strategi ini utuh dan dapat diandalkan, layak untuk diuji lebih lanjut di pasar nyata.

Kode 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()