Strategi Penembusan SuperTrend Jangka Masa

Penulis:ChaoZhang, Tarikh: 2023-11-24 10:27:52
Tag:

img

Ringkasan

Strategi ini menggabungkan penunjuk SuperTrend merentasi pelbagai bingkai masa dan Bollinger Bands untuk mengenal pasti arah trend dan tahap sokongan / rintangan utama, dan memasuki perdagangan pada pecah semasa turun naik.

Logika Strategi

Fungsi Skrip Pine tersuaipine_supertrend()dilaksanakan untuk mengira SuperTrend merentasi jangka masa yang berbeza (contohnya 1 minit dan 5 minit) dan menentukan arah trend jangka masa yang lebih besar.

Bollinger Bands Band atas/bawah bertindak sebagai saluran. Breakout menandakan arah trend. Tutup di atas band atas menandakan pecah menaik. Tutup di bawah band bawah menandakan kerosakan menurun.

Isyarat kemasukan:

Panjang: Tutup > Garis Atas DAN Tutup > SuperTrend (ganda TF) Pendek: Tutup < Band Lower AND Tutup < SuperTrend (multiple TF)

Keluar:

Keluar panjang: Tutup < 5m SuperTrend Keluar Pendek: Tutup > 5m SuperTrend

Jadi ia bertujuan untuk menangkap penyebaran rangsangan antara SuperTrend dan BB dalam momentum yang tidak menentu.

Analisis Kelebihan

  • Menggunakan SuperTrend merentasi bingkai masa untuk menentukan arah trend keyakinan tinggi
  • BB Band bertindak sebagai tahap sokongan / rintangan utama untuk mengelakkan pecah palsu
  • SuperTrend bertindak sebagai stop loss dinamik untuk mengawal risiko

Analisis Risiko

  • SuperTrend boleh tertinggal titik perubahan dan pembalikan trend
  • Parameter BB yang kurang optimum boleh menyebabkan terlalu banyak atau sedikit perdagangan
  • Jurang malam yang tajam atau peristiwa berita boleh memukul stop loss

Pengurangan Risiko:

  • Tambah lebih banyak penunjuk untuk mengesahkan isyarat dan mengelakkan pecah palsu
  • Mengoptimumkan parameter BB untuk keseimbangan terbaik
  • Memperluas penyangga stop loss untuk menampung jurang

Peluang Peningkatan

  • Uji penunjuk trend lain seperti KDJ MACD untuk pengesahan isyarat tambahan
  • Tambah model ML untuk kebarangkalian pecah
  • Penyesuaian parameter untuk set parameter optimum

Kesimpulan

Strategi ini menggabungkan kekuatan SuperTrend dan Bollinger Bands menggunakan analisis jangka masa silang dan penembusan saluran untuk perdagangan kebarangkalian tinggi. Ia berkesan mengawal risiko dan dapat menjana keuntungan yang baik dalam instrumen yang tidak menentu. Pengoptimuman dan kombinasi penunjuk lanjut boleh meningkatkan prestasi.


/*backtest
start: 2023-10-24 00:00:00
end: 2023-11-23 00:00:00
period: 1h
basePeriod: 15m
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/
// © ambreshc95

//@version=5
strategy("Comodity_SPL_Strategy_01", overlay=false)

// function of st
// [supertrend, direction] = ta.supertrend(3, 10)
// plot(direction < 0 ? supertrend : na, "Up direction", color = color.green, style=plot.style_linebr)
// plot(direction > 0 ? supertrend : na, "Down direction", color = color.red, style=plot.style_linebr)

// VWAP
// src_vwap = input(title = "Source", defval = hlc3, group="VWAP Settings")
// [_Vwap,stdv,_] = ta.vwap(src_vwap,false,1)
// plot(_Vwap, title="VWAP", color = color.rgb(0, 0, 0))



// The same on Pine Script®
pine_supertrend(factor, atrPeriod,len_ma) =>
    
    h= ta.sma(high,len_ma)
    l= ta.sma(low,len_ma)
    hlc_3 = (h+l)/2
    src = hlc_3
    atr = ta.atr(atrPeriod)
    upperBand = src + factor * atr
    lowerBand = src - factor * atr
    prevLowerBand = nz(lowerBand[1])
    prevUpperBand = nz(upperBand[1])

    lowerBand := lowerBand > prevLowerBand or close[1] < prevLowerBand ? lowerBand : prevLowerBand
    upperBand := upperBand < prevUpperBand or close[1] > prevUpperBand ? upperBand : prevUpperBand
    int direction = na
    float superTrend = na
    prevSuperTrend = superTrend[1]
    if na(atr[1])
        direction := 1
    else if prevSuperTrend == prevUpperBand
        direction := close > upperBand ? -1 : 1
    else
        direction := close < lowerBand ? 1 : -1
    superTrend := direction == -1 ? lowerBand : upperBand
    [superTrend, direction]
len_ma_given = input(75, title="MA_SMA_ST")
[Pine_Supertrend, pineDirection] = pine_supertrend(3, 10,len_ma_given)
// plot(pineDirection < 0 ? Pine_Supertrend : na, "Up direction", color = color.green, style=plot.style_linebr)
// plot(pineDirection > 0 ? Pine_Supertrend : na, "Down direction", color = color.red, style=plot.style_linebr)
// 
// Define Supertrend parameters
atrLength = input(10, title="ATR Length")
factor = input(3.0, title="Factor")

// // Calculate Supertrend
[supertrend, direction] = ta.supertrend(factor, atrLength)

st_color = supertrend > close ? color.red : color.green
// // Plot Supertrend
// plot(supertrend, "Supertrend", st_color)
// 

// BB Ploting
length = input.int(75, minval=1)
maType = input.string("SMA", "Basis MA Type", options = ["SMA", "EMA", "SMMA (RMA)", "WMA", "VWMA"])
src = input(close, title="Source")
mult = input.float(2.5, minval=0.001, maxval=50, title="StdDev")

ma(source, length, _type) =>
    switch _type
        "SMA" => ta.sma(source, length)
        "EMA" => ta.ema(source, length)
        "SMMA (RMA)" => ta.rma(source, length)
        "WMA" => ta.wma(source, length)
        "VWMA" => ta.vwma(source, length)

basis = ma(src, length, maType)
dev = mult * ta.stdev(src, length)
upper = basis + dev
lower = basis - dev
offset = input.int(0, "Offset", minval = -500, maxval = 500)
plot(basis, "Basis", color=#FF6D00, offset = offset)
p1 = plot(upper, "Upper", color=#2962FF, offset = offset)
p2 = plot(lower, "Lower", color=#2962FF, offset = offset)
fill(p1, p2, title = "Background", color=color.rgb(33, 150, 243, 95))





// h= ta.sma(high,60)
// l= ta.sma(low,60)
// c= sma(close,60)
// hlc_3 = (h+l)/2
// supertrend60 = request.security(syminfo.tickerid,  supertrend)

// // Define timeframes for signals
tf1 = input(title="Timeframe 1", defval="1")
tf2 = input(title="Timeframe 2",defval="5")
// tf3 = input(title="Timeframe 3",defval="30")


// // // Calculate Supertrend on multiple timeframes
supertrend_60 = request.security(syminfo.tickerid, tf1, Pine_Supertrend)
supertrend_5m = request.security(syminfo.tickerid, tf2, supertrend)
// supertrend3 = request.security(syminfo.tickerid, tf3, supertrend)

// // Plot Supertrend_60
st_color_60 = supertrend_60 > close ? color.rgb(210, 202, 202, 69) : color.rgb(203, 211, 203, 52)
plot(supertrend_60, "Supertrend_60", st_color_60)

// // Plot Supertrend_5m
st_color_5m = supertrend_5m > close ? color.red : color.green
plot(supertrend_5m, "Supertrend_5m", st_color_5m)



ma21 = ta.sma(close,21)
// rsi = ta.rsi(close,14)
// rsima = ta.sma(rsi,14)

// Define the Indian Standard Time (IST) offset from GMT
ist_offset = 5.5 // IST is GMT+5:30

// Define the start and end times of the trading session in IST
// start_time = timestamp("GMT", year, month, dayofmonth, 10, 0) + ist_offset * 60 * 60
// end_time = timestamp("GMT", year, month, dayofmonth, 14, 0) + ist_offset * 60 * 60
// Check if the current time is within the trading session
// in_trading_session = timenow >= start_time and timenow <= end_time

in_trading_session = not na(time(timeframe.period, "0945-1430"))
// bgcolor(inSession ? color.silver : na)
out_trading_session = not na(time(timeframe.period, "1515-1530"))
// // // Define buy and sell signals
buySignal = close>upper and close > supertrend_5m and close > supertrend_60 and close > ma21  and in_trading_session //close > supertrend and
sellSignal = close<lower and close < supertrend_5m and close < supertrend_60 and close < ma21  and in_trading_session //close < supertrend and

var bool long_position = false
var bool long_exit = false
var float long_entry_price = 0
var float short_entry_price = 0

if buySignal and not long_position
    // label.new(bar_index, na, yloc = yloc.belowbar, style = label.style_label_up, color = color.green, size = size.small)
    long_position := true
    strategy.entry("Buy",strategy.long)

long_exit := (close < supertrend_5m)
if long_position and long_exit
    // label.new(bar_index, na, yloc = yloc.belowbar, style = label.style_xcross, color = color.green, size = size.tiny)
    long_position := false
    strategy.exit("Exit","Buy",stop = close)

var bool short_position = false
var bool short_exit = false
if sellSignal and not short_position
    // label.new(bar_index, na, yloc = yloc.abovebar, style = label.style_label_down, color = color.red, size = size.small)
    short_position := true
    strategy.entry("Sell",strategy.short)

short_exit := (close > supertrend_5m)
if short_position and short_exit
    // label.new(bar_index, na, yloc = yloc.belowbar, style = label.style_xcross, color = color.red, size = size.tiny)
    short_position := false
    strategy.exit("Exit","Sell", stop = close)

if out_trading_session
    long_position := false
    strategy.exit("Exit","Buy",stop = close)
    short_position := false
    strategy.exit("Exit","Sell", stop = close)

// if long_position
//     long_entry_price := close[1] + 50//bar_index

// if short_position
//     short_entry_price := close[1] - 50//bar_index

// if (long_position and high[1] > long_entry_price)
//     label.new(bar_index, na, yloc = yloc.abovebar, style = label.style_triangledown, color = color.yellow, size = size.tiny)

// if (short_position and low[1] < short_entry_price)
//     label.new(bar_index, na, yloc = yloc.belowbar, style = label.style_triangleup, color = color.yellow, size = size.tiny)




Lebih lanjut