Trend Mengikuti Strategi Berdasarkan Indikator Sokongan/Rintangan dan Momentum di Pelbagai Jangka Masa

Penulis:ChaoZhang, Tarikh: 2024-03-08 17:41:26
Tag:

img

Ringkasan Strategi

Strategi ini menggabungkan pelbagai penunjuk teknikal termasuk tahap sokongan / rintangan, Supertrend, dan purata bergerak merentasi pelbagai kerangka masa untuk menentukan arah trend secara komprehensif dan melaksanakan sistem perdagangan yang mengikuti trend. Idea utama strategi ini adalah: pertama, gunakan titik pivot untuk menentukan tahap sokongan / rintangan semasa; kemudian, gunakan penunjuk Supertrend untuk mengenal pasti arah trend semasa; dan akhirnya, gunakan purata bergerak untuk menapis perbezaan. Pada masa yang sama, strategi ini juga menyokong langkah kawalan risiko seperti menetapkan tingkap masa dan mengehadkan kedudukan dagangan maksimum.

Prinsip Strategi

  1. Pertama, hitung titik pusingan berdasarkan harga tertinggi dan terendah dalam tempoh masa lalu tertentu untuk mendapatkan tahap sokongan / rintangan semasa.
  2. Gunakan penunjuk Supertrend untuk menentukan trend. Supertrend adalah penunjuk trend yang dikira dari tahap sokongan / rintangan dinamik.
  3. Gunakan ATR untuk stop loss. Strategi ini menggabungkan ATR sebagai tahap stop loss di atas Supertrend asal.
  4. Gunakan purata bergerak sebagai penapis trend. Hanya pergi lama apabila trend naik dan harga di atas purata bergerak, dan hanya pergi pendek apabila trend turun dan harga di bawah purata bergerak.
  5. Tetapkan tetingkap masa dagangan. Hanya buka kedudukan dalam selang masa tertentu untuk mengelakkan dagangan pada titik masa penting.
  6. Menguruskan kedudukan panjang dan pendek secara berasingan. Isyarat panjang dan pendek mencetuskan logik pembukaan dan penutupan masing-masing secara bebas.

Ringkasnya, strategi ini memasuki kedudukan apabila sokongan / rintangan titik pusingan, arah Supertrend, dan arah purata bergerak semuanya bersetuju, dan menutup kedudukan apabila mana-mana syarat ini menjadi tidak sah.

Analisis Kelebihan

  1. Kelebihan perdagangan berdasarkan tahap sokongan / rintangan adalah bahawa ia mematuhi undang-undang penawaran dan permintaan di pasaran, dan titik pivot dapat mencerminkan keseimbangan pasaran secara dinamik.
  2. Supertrend dapat menangkap trend dengan berkesan dan menghentikan kerugian dengan tepat pada masanya.
  3. Penapisan purata bergerak mengelakkan perdagangan kontra-trend. Memasuki pasaran apabila trend dan purata bergerak bersinkron akan menghasilkan kadar kemenangan yang lebih tinggi.
  4. Jendela masa dagangan yang boleh disesuaikan mengelakkan dagangan pada titik masa penting hingga tahap tertentu, seperti sebelum pasaran dibuka dan ditutup.
  5. Isyarat panjang dan pendek beroperasi secara bebas, membolehkan memegang kedudukan panjang dan pendek secara serentak, dengan itu memanfaatkan peluang pasaran dengan lebih sepenuhnya.

Analisis Risiko

  1. Risiko perdagangan yang kerap: Strategi ini boleh membuka dan menutup kedudukan yang kerap di pasaran yang berayun, mengakibatkan kos urus niaga yang berlebihan.
  2. Walaupun strategi ini menggunakan penapisan purata bergerak, jika purata bergerak itu sendiri bertentangan dengan trend utama, perdagangan kontra-trend masih boleh berlaku.
  3. Masalah pengoptimuman parameter. Strategi ini mengandungi banyak parameter, seperti tempoh dan pengganda Supertrend, dan tempoh purata bergerak.
  4. Dalam keadaan pasaran yang melampau, seperti kenaikan dan kejatuhan tajam, krisis kecairan, dan lain-lain, strategi ini mungkin tidak dapat menghentikan kerugian dengan tepat pada masanya.

Arahan pengoptimuman

  1. Memperkenalkan lebih banyak purata bergerak jangka sederhana dan panjang untuk meningkatkan kebolehpercayaan penilaian trend dan mengurangkan perdagangan yang kerap.
  2. Pertimbangkan untuk memperkenalkan penunjuk turun naik, seperti Bollinger Bands, untuk mengurangkan dagangan di pasaran dengan turun naik yang tinggi.
  3. Mengoptimumkan pelbagai parameter untuk mencari kombinasi parameter terbaik dan meningkatkan kestabilan strategi.
  4. Tetapkan stop loss yang keras di bawah keadaan pasaran yang melampau untuk mengawal risiko. Di samping itu, pertimbangkan untuk menambah penilaian turun naik pasaran yang tidak normal, seperti jurang harga dan lonjakan dalam jumlah dagangan, dan mengurangkan atau menghentikan dagangan semasa kelainan.

Ringkasan

Strategi ini mengintegrasikan pelbagai kaedah analisis teknikal seperti sokongan / rintangan, penjejakan trend, dan penapisan momentum untuk memperoleh keuntungan secara berkesan dari pasaran yang sedang berkembang sambil mengawal risiko penarikan. Kelebihannya terletak pada isyarat yang jelas dan ringkas, logik yang jelas, dan kesesuaian untuk aplikasi jangka menengah hingga panjang. Walau bagaimanapun, strategi ini juga mempunyai masalah seperti perdagangan yang kerap, kesukaran dalam pengoptimuman parameter, dan kawalan risiko yang tidak mencukupi dalam keadaan pasaran yang melampau. Pada masa akan datang, ia boleh dipertingkatkan lagi dengan memperkenalkan lebih banyak penunjuk teknikal, mengoptimumkan parameter kuantitatif, menetapkan kerugian berhenti keras, dan menilai keadaan pasaran yang tidak normal. Secara umum, strategi ini adalah strategi trend yang agak matang yang, dengan pengoptimuman dan penambahbaikan yang sesuai, boleh menjadi sistem perdagangan yang kukuh.


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

//@rpcoelho
// Based on © Julien_Eche "Pivot Point Supertrend" with optional EMAs ploted
//@version=4

strategy("PPS w/ EMAs", overlay=true)

prd = input(defval = 1, title="Pivot Point Period", minval = 1, maxval = 50)
Factor=input(defval = 4, title = "ATR Factor", minval = 1, step = 0.1)
Pd=input(defval = 72, title = "ATR Period", minval=1)
showpivot = input(defval = false, title="Show Pivot Points")
showlabel = input(defval = true, title="Show Buy/Sell Labels")
showcl = input(defval = false, title="Show PP Center Line")
showsr = input(defval = false, title="Show Support/Resistance")

/////////////////////////////////////////////////////////////////////////
// Switch Board
////////////////////////////////////////////////////////////////////////
// Define the switch board title as a label (since grouping is not available)
//switchboard_group = "████ Switch Board (Turn On/Off Overlay Indicators) ████"
//label.new(bar_index, high, switchboard_group, color=color.red)
// Create input controls for EMA and VWAP switches
switch_ema = input(true, title="EMA")

/////////////////////////////////////////////////////////////////////////
// EMA Selection
////////////////////////////////////////////////////////////////////////

ma_function(source, length, type) =>
    float ma = na
    if type == 'RMA'
        ma := rma(source, length)
    else if type == 'SMA'
        ma := sma(source, length)
    else if type == 'EMA'
        ma := ema(source, length)
    else if type == 'WMA'
        ma := wma(source, length)
    else if type == 'HMA'
        ma := length < 2 ? hma(source, 2) : hma(source, length)
    else
        ma := vwma(source, length)
    ma

// Moving Averages Line Title
//ma_group = "██████████ MAs Line ██████████"

// Inputs for MA 1
len1bool = input(false, title="Show MA 1")
len1 = input(13, title="Length MA 1")
ma_1_type = input("EMA", title="Type MA 1", options=["RMA", "SMA", "EMA", "WMA", "HMA", "VWMA"])
src_ma1 = input(title="MA1 Source", type=input.source, defval=close)
ma_1_colour = input(color.rgb(235, 159, 238), title="Color MA 1")

// Inputs for MA 2
len2bool = input(false, title="Show MA 2")
len2 = input(17, title="Length MA 2")
ma_2_type = input("EMA", title="Type MA 2", options=["RMA", "SMA", "EMA", "WMA", "HMA", "VWMA"])
src_ma2 = input(title="MA2 Source", type=input.source, defval=close)
ma_2_colour = input(color.rgb(230, 241, 65), title="Color MA 2")

// Inputs for MA 3
len3bool = input(true, title="Show MA 3")
len3 = input(34, title="Length MA 3")
ma_3_type = input("EMA", title="Type MA 3", options=["RMA", "SMA", "EMA", "WMA", "HMA", "VWMA"])
src_ma3 = input(title="MA3 Source", type=input.source, defval=close)
ma_3_colour = input(#c7f887, title="Color MA 3")

// Inputs for MA 4
len4bool = input(false, title="Show MA 4")
len4 = input(72, title="Length MA 4")
ma_4_type = input("EMA", title="Type MA 4", options=["RMA", "SMA", "EMA", "WMA", "HMA", "VWMA"])
src_ma4 = input(title="MA4 Source", type=input.source, defval=close)
ma_4_colour = input(#2f6999, title="Color MA 4")

// Inputs for MA 5
len5bool = input(true, title="Show MA 5")
len5 = input(144, title="Length MA 5")
ma_5_type = input("EMA", title="Type MA 5", options=["RMA", "SMA", "EMA", "WMA", "HMA", "VWMA"])
src_ma5 = input(title="MA5 Source", type=input.source, defval=close)
ma_5_colour = input(color.rgb(13, 156, 37), title="Color MA 5")

// Inputs for MA 6
len6bool = input(true, title="Show MA 6")
len6 = input(610, title="Length MA 6")
ma_6_type = input("EMA", title="Type MA 6", options=["RMA", "SMA", "EMA", "WMA", "HMA", "VWMA"])
src_ma6 = input(title="MA6 Source", type=input.source, defval=close)
ma_6_colour = input(color.rgb(173, 161, 152), title="Color MA 6")

// Inputs for MA 7
len7bool = input(true, title="Show MA 7")
len7 = input(8, title="Length MA 7")
ma_7_type = input("EMA", title="Type MA 7", options=["RMA", "SMA", "EMA", "WMA", "HMA", "VWMA"])
src_ma7 = input(title="MA7 Source", type=input.source, defval=close)
ma_7_colour = input(color.rgb(68, 39, 231), title="Color MA 7")

// Inputs for MA 8
len8bool = input(true, title="Show MA 8")
len8 = input(21, title="Length MA 8")
ma_8_type = input("EMA", title="Type MA 8", options=["RMA", "SMA", "EMA", "WMA", "HMA", "VWMA"])
src_ma8 = input(title="MA8 Source", type=input.source, defval=close)
ma_8_colour = input(color.white, title="Color MA 8")

ema1 = security(syminfo.tickerid, timeframe.period, ma_function(src_ma1, len1, ma_1_type))
ema2 = security(syminfo.tickerid, timeframe.period, ma_function(src_ma2, len2, ma_2_type))
ema3 = security(syminfo.tickerid, timeframe.period, ma_function(src_ma3, len3, ma_3_type))
ema4 = security(syminfo.tickerid, timeframe.period, ma_function(src_ma4, len4, ma_4_type))
ema5 = security(syminfo.tickerid, timeframe.period, ma_function(src_ma5, len5, ma_5_type))
ema6 = security(syminfo.tickerid, timeframe.period, ma_function(src_ma6, len6, ma_6_type))
ema7 = security(syminfo.tickerid, timeframe.period, ma_function(src_ma7, len7, ma_7_type))
ema8 = security(syminfo.tickerid, timeframe.period, ma_function(src_ma8, len8, ma_8_type))

plot(len1bool and switch_ema ? ema1:na, color=ma_1_colour, linewidth=1, title='MA 1')
plot(len2bool and switch_ema? ema2:na, color=ma_2_colour, linewidth=1, title='MA 2')
plot(len3bool and switch_ema? ema3:na, color=ma_3_colour, linewidth=1, title='MA 3')
plot(len4bool and switch_ema? ema4:na, color=ma_4_colour, linewidth=1, title='MA 4')
plot(len5bool and switch_ema? ema5:na, color=ma_5_colour, linewidth=1, title='MA 5')
plot(len6bool and switch_ema? ema6:na, color=ma_6_colour, linewidth=2, title='MA 6')
plot(len7bool and switch_ema? ema7:na, color=ma_7_colour, linewidth=1, title='MA 7')
plot(len8bool and switch_ema? ema8:na, color=ma_8_colour, linewidth=1, title='MA 8')









// get Pivot High/Low
float ph = pivothigh(prd, prd)
float pl = pivotlow(prd, prd)

// drawl Pivot Points if "showpivot" is enabled
plotshape(ph and showpivot, text="H",  style=shape.labeldown, color=na, textcolor=color.red, location=location.abovebar, transp=0, offset = -prd)
plotshape(pl and showpivot, text="L",  style=shape.labeldown, color=na, textcolor=color.lime, location=location.belowbar, transp=0, offset = -prd)

// calculate the Center line using pivot points
var float center = na
float lastpp = ph ? ph : pl ? pl : na
if lastpp
    if na(center)
        center := lastpp
    else
        //weighted calculation
        center := (center * 2 + lastpp) / 3

// upper/lower bands calculation
Up = center - (Factor * atr(Pd))
Dn = center + (Factor * atr(Pd))

// get the trend
float TUp = na
float TDown = na
Trend = 0
TUp := close[1] > TUp[1] ? max(Up, TUp[1]) : Up
TDown := close[1] < TDown[1] ? min(Dn, TDown[1]) : Dn
Trend := close > TDown[1] ? 1: close < TUp[1]? -1: nz(Trend[1], 1)
Trailingsl = Trend == 1 ? TUp : TDown

// plot the trend
linecolor = Trend == 1 and nz(Trend[1]) == 1 ? color.lime : Trend == -1 and nz(Trend[1]) == -1 ? color.red : na
plot(Trailingsl, color = linecolor ,  linewidth = 2, title = "PP SuperTrend")
 
plot(showcl ? center : na, color = showcl ? center < hl2 ? color.blue : color.red : na)

// check and plot the signals
bsignal = Trend == 1 and Trend[1] == -1
ssignal = Trend == -1 and Trend[1] == 1
plotshape(bsignal and showlabel ? Trailingsl : na, title="Buy", text="Buy", location = location.absolute, style = shape.labelup, size = size.tiny, color = color.lime, textcolor = color.black, transp = 0)
plotshape(ssignal and showlabel ? Trailingsl : na, title="Sell", text="Sell", location = location.absolute, style = shape.labeldown, size = size.tiny, color = color.red, textcolor = color.white, transp = 0)

//get S/R levels using Pivot Points
float resistance = na
float support = na
support := pl ? pl : support[1]
resistance := ph ? ph : resistance[1]

// if enabled then show S/R levels
plot(showsr and support ? support : na, color = showsr and support ? color.lime : na, style = plot.style_circles, offset = -prd)
plot(showsr and resistance ? resistance : na, color = showsr and resistance ? color.red : na, style = plot.style_circles, offset = -prd)

// Trend Filter from SuperTrend Long Strategy
Periods = input(title="ATR Period", type=input.integer, defval=3)
src = input(hlc3, title="Source")
Multiplier = input(title="ATR Multiplier", type=input.float, step=0.1, defval=4.0)
changeATR = input(title="Change ATR Calculation Method ?", type=input.bool, defval=true)

// Combine the SuperTrend calculations
atr2 = sma(tr, Periods)
atr = changeATR ? atr(Periods) : atr2

up = src - (Multiplier * atr)
up1 = nz(up[1], up)
up := close[1] > up1 ? max(up, up1) : up

dn = src + (Multiplier * atr)
dn1 = nz(dn[1], dn)
dn := close[1] < dn1 ? min(dn, dn1) : dn

trend = 1
trend := nz(trend[1], trend)
trend := trend == -1 and close > dn1 ? 1 : trend == 1 and close < up1 ? -1 : trend

// Moving Average as Trend Filter
periodes_ma = input(title="Moving Average Period", type=input.integer, defval=20)
src_ma = input(title="Moving Average Source", type=input.source, defval=close)
ma = sma(src_ma, periodes_ma)

// Strategy Entry Conditions
FromMonth = input(defval = 1, title = "From Month", minval = 1, maxval = 12)
FromDay   = input(defval = 1, title = "From Day", minval = 1, maxval = 31)
FromYear  = input(defval = 2017, title = "From Year", minval = 999)
ToMonth   = input(defval = 1, title = "To Month", minval = 1, maxval = 12)
ToDay     = input(defval = 1, title = "To Day", minval = 1, maxval = 31)
ToYear    = input(defval = 9999, title = "To Year", minval = 999)

start     = timestamp(FromYear, FromMonth, FromDay, 00, 00)  
finish    = timestamp(ToYear, ToMonth, ToDay, 23, 59)       

window()  => true

// Combined entry conditions
longCondition = (trend == 1 and trend[1] == -1 and close > ma) or (bsignal and window())
shortCondition = (trend == -1 and trend[1] == 1 and close < ma) or (ssignal and window())

if (longCondition)
    strategy.entry("BUY", strategy.long)

if (shortCondition)
    strategy.close("BUY")
    strategy.entry("SELL", strategy.short)

buy1 = barssince((trend == 1 and trend[1] == -1 and close > ma) or (bsignal and window()))
sell1 = barssince((trend == -1 and trend[1] == 1 and close < ma) or (ssignal and window()))
color1 = buy1[1] < sell1[1] ? color.green : buy1[1] > sell1[1] ? color.red : na
barcolor(color1)


Lebih lanjut