Strategi Dagangan Dua Arah Pergerakan Purata Multiplikatif

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

img

Ringkasan

Strategi ini mengira garis purata bergerak perkalian dan menggabungkan penyeberangan harga dan penunjuk PMax untuk menentukan arah trend. Ia menggunakan perdagangan dua arah untuk lama apabila trend naik dan pendek apabila trend turun, menilai risiko kedudukan dalam masa nyata untuk keluar dengan keuntungan.

Prinsip Strategi

Indikator utama strategi ini adalah garis purata bergerak perkalian. Parameter penunjuk termasuk: tempoh ATR, pengganda ATR, jenis purata bergerak dan panjang. Nilai ATR mewakili turun naik sepanjang tempoh. Garis purata bergerak perkalian sama dengan harga purata ditambah / dikurangkan hasil perkalian ATR dan ATR sepanjang tempoh. Apabila harga di atas garis terdapat isyarat panjang. Apabila harga di bawah garis terdapat isyarat pendek.

Indikator PMax mewakili harga stop loss atau mengambil keuntungan. Ia dikira dari nilai ATR dan arah trend. Dalam trend menaik, PMax sama dengan purata bergerak dikurangkan ATR pengganda kali ATR, bertindak sebagai garis stop loss. Dalam downtrend, PMax sama dengan purata bergerak ditambah ATR pengganda kali ATR, bertindak sebagai garis mengambil keuntungan.

Apabila harga melintasi penunjuk PMax ke atas terdapat isyarat panjang. Apabila harga melintasi penunjuk PMax ke bawah terdapat isyarat pendek. Strategi memasuki dan keluar berdasarkan isyarat, pergi lama dalam trend menaik dan pendek dalam trend menurun, dengan kehilangan berhenti dinamik dan mengambil keuntungan.

Analisis Kelebihan

Kelebihan strategi ini:

  1. Mengambil perdagangan dua arah menjadikannya sangat merangkumi semua keadaan pasaran.

  2. Menggunakan purata bergerak berganda menghasilkan isyarat perdagangan yang stabil dan boleh dipercayai.

  3. Dengan PMax untuk stop loss / mengambil keuntungan, ia berkesan mengawal risiko.

  4. Siklus yang boleh diselaraskan dan parameter pengganda menjadikannya sangat mudah disesuaikan.

Analisis Risiko

Terdapat juga beberapa risiko:

  1. Tetapan parameter yang tidak betul boleh menyebabkan kehilangan whipsaw.

  2. Berhati-hati dengan had leverage semasa membeli pendek.

  3. Kejadian Black Swan sukar dielakkan.

Penyelesaian:

  1. Mengoptimumkan parameter untuk mengurangkan whipsaws.

  2. Kawal leverage dengan bijak dan diversifikasi.

  3. Tingkatkan pengganda ATR untuk meluaskan jarak berhenti.

Arahan pengoptimuman

Strategi ini boleh dinaik taraf dengan cara seperti:

  1. Uji kestabilan di pasaran dan kitaran yang berbeza.

  2. Gunakan pembelajaran mesin untuk mengoptimumkan parameter secara automatik.

  3. Menghakimi rejim pasaran dengan teknik pembelajaran mendalam.

  4. Mengintegrasikan lebih banyak sumber data untuk memperkasakan keputusan.

Ringkasan

Performa keseluruhan strategi ini adalah stabil dengan inklusif yang kuat. Dengan mengamalkan perdagangan dua arah dan stop loss / mengambil keuntungan dinamik, ia berkesan mengawal risiko. Melalui penyesuaian parameter dan pengulangan model, kecocokan dan keberkesanan strategi dapat ditingkatkan lagi. Secara umum ini adalah strategi yang bernilai 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 lanjut