Strategi perdagangan dua arah dengan rata-rata bergerak perkalian

Penulis:ChaoZhang, Tanggal: 2024-01-15 14:50:32
Tag:

img

Gambaran umum

Strategi ini menghitung garis rata-rata bergerak perkalian dan menggabungkan penyeberangan harga dan indikator PMax untuk menentukan arah tren. Ini mengadopsi perdagangan dua arah untuk panjang ketika tren naik dan pendek ketika tren turun, mengevaluasi risiko posisi secara real time untuk keluar dengan keuntungan.

Prinsip Strategi

Indikator inti dari strategi ini adalah garis rata-rata bergerak perkalian. Parameter indikator termasuk: periode ATR, pengganda ATR, jenis dan panjang rata-rata bergerak. Nilai ATR mewakili volatilitas selama periode.

Indikator PMax mewakili harga stop loss atau take profit. Ini dihitung dari nilai ATR dan arah tren. Dalam tren naik, PMax sama dengan moving average dikurangi ATR multiplier kali ATR, bertindak sebagai garis stop loss. Dalam downtrend, PMax sama dengan moving average ditambah ATR multiplier kali ATR, bertindak sebagai garis take profit.

Ketika harga melintasi indikator PMax ke atas ada sinyal panjang. Ketika harga melintasi indikator PMax ke bawah ada sinyal pendek. Strategi masuk dan keluar berdasarkan sinyal, panjang dalam tren naik dan pendek dalam tren turun, dengan stop loss dan take profit yang dinamis.

Analisis Keuntungan

Keuntungan dari strategi ini:

  1. Mengadopsi perdagangan dua arah membuatnya sangat inklusif dari semua kondisi pasar.

  2. Menggunakan rata-rata bergerak perkalian menghasilkan sinyal perdagangan yang stabil dan dapat diandalkan.

  3. Dengan PMax untuk stop loss/take profit, secara efektif mengendalikan risiko.

  4. Siklus yang dapat disesuaikan dan parameter pengganda membuatnya sangat mudah beradaptasi.

Analisis Risiko

Ada juga beberapa risiko:

  1. Pengaturan parameter yang tidak benar dapat menyebabkan kehilangan whipsaw.

  2. Perhatikan batas leverage saat shorting.

  3. Kejadian angsa hitam sulit dihindari.

Solusi:

  1. Optimalkan parameter untuk mengurangi whipsaws.

  2. Kontrol leverage hati-hati dan diversifikasi.

  3. Tingkatkan pengganda ATR untuk memperluas jangkauan berhenti.

Arahan Optimasi

Strategi dapat ditingkatkan dengan cara seperti:

  1. Uji stabilitas di pasar dan siklus yang berbeda.

  2. Terapkan pembelajaran mesin untuk mengoptimalkan parameter otomatis.

  3. Menghakimi sistem pasar dengan teknik pembelajaran mendalam.

  4. Mengintegrasikan lebih banyak sumber data untuk memberdayakan keputusan.

Ringkasan

Performa keseluruhan strategi ini stabil dengan inklusifitas yang kuat. Dengan mengadopsi perdagangan dua arah dan stop loss / take profit dinamis, secara efektif mengendalikan risiko. Melalui penyesuaian parameter dan iterasi model, kecocokan dan efektivitas strategi dapat ditingkatkan lebih lanjut. Secara umum ini adalah strategi yang layak perhatian dan aplikasi jangka panjang.


/*backtest
start: 2023-01-08 00:00:00
end: 2024-01-14 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

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

strategy("Profit Maximizer Strategy Long-Short", shorttitle="PMax-Strategy", overlay=true, default_qty_type=strategy.cash, default_qty_value=10000, initial_capital=10000, currency=currency.USD, commission_value=0, commission_type=strategy.commission.percent)

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="EMA", options=["SMA", "EMA", "WMA", "TMA", "VAR", "WWMA", "ZLEMA", "TSF"])
length =input(10, "Moving Average Length", minval=1)
condition = input(title="Signal Type", defval="Only Crossing Signals", options=["Only Crossing Signals", "Only Price/Pmax Crossing Signals"])
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)
long_short = input(defval = false, title = "Long-Short", type=input.bool)
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!")
buySignalk = crossover(MAvg, PMax)
//plotshape(buySignalk and showsignalsk ? PMax*0.995 : na, title="Buy", text="Buy", location=location.absolute, style=shape.labelup, size=size.tiny, color=color.green, textcolor=color.white, transp=0)
sellSignallk = crossunder(MAvg, PMax)
//plotshape(sellSignallk and showsignalsk ? PMax*1.005 : na, title="Sell", text="Sell", location=location.absolute, style=shape.labeldown, size=size.tiny, color=color.red, textcolor=color.white, transp=0)
buySignalc = crossover(src, PMax)
//plotshape(buySignalc and showsignalsc ? PMax*0.995 : na, title="Buy", text="Buy", location=location.absolute, style=shape.labelup, size=size.tiny, color=#0F18BF, textcolor=color.white, transp=0)
sellSignallc = crossunder(src, PMax)
//plotshape(sellSignallc and showsignalsc ? PMax*1.005 : na, title="Sell", text="Sell", location=location.absolute, style=shape.labeldown, size=size.tiny, color=#0F18BF, textcolor=color.white, transp=0)
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)

if(condition=="Only Crossing Signals")
    strategy.entry("BUY", strategy.long, when = buySignalk)
else
    strategy.entry("BUY", strategy.long, when = buySignalc)

if(long_short)
    if(condition=="Only Crossing Signals")
        strategy.entry("SELL", strategy.short, when = sellSignallk)
    else
        strategy.entry("SELL", strategy.short, when = sellSignallc)
else
    if(condition=="Only Crossing Signals")
        strategy.close("BUY", when = sellSignallk)
    else
        strategy.close("BUY", when = sellSignallc)
    

    
    
    
  

Lebih banyak