Volatiliti Saluran Harga Strategi Dagangan Purata Bergerak

Penulis:ChaoZhang, Tarikh: 2023-12-12 11:44:15
Tag:

img

Ringkasan

Strategi ini berdasarkan kepada penunjuk Super Trend dan penunjuk saluran harga, digabungkan dengan isyarat purata bergerak untuk perdagangan.

Logika Strategi

  1. Mengira penunjuk Super Trend. Rel atas dan bawah adalah harga semasa ditambah / tolak N kali penunjuk ATR masing-masing. Apabila harga lebih tinggi daripada rel atas, ia bullish. Apabila harga lebih rendah daripada rel bawah, ia bearish.

  2. Mengira penunjuk saluran harga. Garis saluran harga adalah M kali deviasi standard N-hari harga. Harga yang lebih tinggi / lebih rendah daripada garis saluran dianggap keadaan abnormal.

  3. Mengira purata bergerak. Ambil garis purata harga terbuka, harga tutup dan Super Trend masing-masing.

  4. Menghasilkan isyarat perdagangan:

    • Isyarat Beli: Harga tutup melintasi di atas garis Super Trend dan lebih tinggi daripada purata pergerakan harga terbuka.

    • Isyarat jual: Harga tutup melintasi di bawah garis Super Trend dan lebih rendah daripada purata pergerakan harga terbuka.

  5. Tetapkan stop loss dan ambil saluran harga keuntungan.

Analisis Kelebihan

  1. Menggabungkan beberapa penunjuk mengelakkan isyarat palsu.

  2. Menggunakan saluran harga untuk menilai keadaan harga yang tidak normal boleh menapis beberapa titik masuk yang tidak diingini.

  3. Purata bergerak digabungkan dengan menilai arah trend mengelakkan perdagangan terhadap trend.

  4. Menetapkan stop loss dan mengambil jangkaan keuntungan mengawal risiko.

Analisis Risiko

  1. Tetapan parameter terlalu subjektif dan memerlukan pengoptimuman.

  2. Julat stop loss dan mengambil keuntungan boleh ditetapkan terlalu luas atau terlalu sempit.

  3. Parameter saluran harga mungkin tidak sesuai untuk semua produk, ujian berasingan diperlukan.

  4. Kerugian yang ketara boleh berlaku semasa perubahan trend yang drastik.

Arahan pengoptimuman

  1. Uji dan optimumkan parameter untuk mencari kombinasi yang optimum.

  2. Uji purata bergerak dengan tempoh yang berbeza untuk memilih parameter optimum.

  3. Ujian semula pada pelbagai produk dan pilih parameter mengikut prestasi masing-masing.

  4. Mengoptimumkan strategi stop loss untuk mengelakkan kerugian tunggal yang terlalu besar.

Kesimpulan

Strategi ini menggabungkan beberapa penunjuk untuk menilai kelainan harga dan arah trend, yang secara teori boleh menapis beberapa isyarat palsu. Walau bagaimanapun, tetapan parameter masih agak subjektif dengan ruang untuk pengoptimuman. Di samping itu, kos dagangan seperti komisen dan slippage harus dipertimbangkan dalam perdagangan sebenar. Secara keseluruhan, strategi ini lebih sesuai sebagai strategi trend berikut, tetapi parameter perlu dioptimumkan dan diselaraskan untuk produk yang berbeza.


/*backtest
start: 2023-12-10 00:00:00
end: 2023-12-11 00:00:00
period: 1m
basePeriod: 1m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=4
strategy(title="Vol ST VM", overlay=true)

source = close
hilow = ((high - low)*100)
openclose = ((close - open)*100)
vol = (volume / hilow)
spreadvol = (openclose * vol)
VPT = spreadvol + cum(spreadvol)
window_len = 28

v_len = 14
price_spread = stdev(high-low, window_len)

v =  spreadvol + cum(spreadvol)
smooth = sma(v, v_len)
v_spread = stdev(v - smooth, window_len)
shadow = (v - smooth) / v_spread * price_spread

out = shadow > 0 ? high + shadow : low + shadow
//
src = out
src1=open
src2=low
src3=high
tf =input(720)
len = timeframe.isintraday and timeframe.multiplier >= 1 ? 
   tf / timeframe.multiplier * 7 : 
   timeframe.isintraday and timeframe.multiplier < 60 ? 
   60 / timeframe.multiplier * 24 * 7 : 7

c = ema(src, len)
plot(c,color=color.red)
o = ema(src1,len)
plot(o,color=color.blue)
//h = ema(src3,len)
//l=ema(src2,len)
//
col=c > o? color.lime : color.orange
vis = true
vl = c
ll = o
m1 = plot(vl, color=col, linewidth=1, transp=60)
m2 = plot(vis ? ll : na,  color=col, linewidth=2, transp=80)

fill(m1, m2,  color=col, transp=70)
//

vpt=ema(out,len)

// INPUTS //
st_mult   = input(1,   title = 'SuperTrend Multiplier', minval = 0, maxval = 100, step = 0.01)
st_period = input(10, title = 'SuperTrend Period',     minval = 1)

// CALCULATIONS //
up_lev = vpt - (st_mult * atr(st_period))
dn_lev = vpt + (st_mult * atr(st_period))

up_trend   = 0.0
up_trend   := close[1] > up_trend[1]   ? max(up_lev, up_trend[1])   : up_lev

down_trend = 0.0
down_trend := close[1] < down_trend[1] ? min(dn_lev, down_trend[1]) : dn_lev

// Calculate trend var
trend = 0
trend := close > down_trend[1] ? 1: close < up_trend[1] ? -1 : nz(trend[1], 1)

// Calculate SuperTrend Line
st_line = trend ==1 ? up_trend : down_trend

// Plotting
plot(st_line[1], color = trend == 1 ? color.green : color.red , style = plot.style_cross, linewidth = 2, title = "SuperTrend")
buy=crossover( close, st_line) and close>o
sell=crossunder(close, st_line) and close<o
//plotshape(crossover( close, st_line), location = location.belowbar, color = color.green,size=size.tiny)
//plotshape(crossunder(close, st_line), location = location.abovebar, color = color.red,size=size.tiny)
plotshape(buy, title="buy", color=color.green, style=shape.arrowup, location=location.belowbar, size=size.normal, textcolor=color.white, transp=0)  //plot for buy icon
plotshape(sell, title="sell", color=color.red, style=shape.arrowdown, location=location.abovebar, size=size.normal, textcolor=color.white, transp=0)  //plot for sell icon


//
multiplier = input(title="TP", type=input.float, defval=2, minval=1)
src5 = close
len5 = input(title="TP length", defval=150, minval=1)
offset = 0

calcSlope(src5, len5) =>
    sumX = 0.0
    sumY = 0.0
    sumXSqr = 0.0
    sumXY = 0.0
    for i = 1 to len5
        val = src5[len5-i]
        per = i + 1.0
        sumX := sumX + per
        sumY := sumY + val
        sumXSqr := sumXSqr + per * per
        sumXY := sumXY + val * per
        
        
    slope = (len5 * sumXY - sumX * sumY) / (len5 * sumXSqr - sumX * sumX)
    average = sumY / len5
    intercept = average - slope * sumX / len5 + slope
    [slope, average, intercept]

var float tmp = na
[s, a, i] = calcSlope(src5, len5)

vwap1=(i + s * (len5 - offset))
sdev = stdev(close, len5)
dev = multiplier * sdev
top=vwap1+dev
bott=vwap1-dev

//
z1 = vwap1 + dev
x1 = vwap1 - dev

low1 = crossover(close, x1)  
high1 = crossunder(close, z1) 

plotshape(low1, title="low", text="TP", color=color.red, style=shape.labelup, location=location.belowbar, size=size.small, textcolor=color.white, transp=0)  //plot for buy icon
plotshape(high1, title="high", text="TP", color=color.green, style=shape.labeldown, location=location.abovebar, size=size.small, textcolor=color.white, transp=0)  //plot for sell icon



strategy.entry(id="Enter Long MA", long=true, comment="Buy", when=high1)
strategy.entry(id="Short Entry MA", long=false, comment="Sell", when=low1)

/////// Alerts /////
alertcondition(buy,title="buy")
alertcondition(sell,title="sell")
alertcondition(low1,title="sell tp")
alertcondition(high1,title="buy tp")

Lebih lanjut