Xu hướng theo chiến lược dựa trên các chỉ số hỗ trợ / kháng cự và động lực trên nhiều khung thời gian

Tác giả:ChaoZhang, Ngày: 2024-03-08 17:41:26
Tags:

img

Tổng quan chiến lược

Chiến lược này kết hợp nhiều chỉ số kỹ thuật bao gồm mức hỗ trợ / kháng cự, siêu xu hướng và trung bình động trên nhiều khung thời gian để xác định toàn diện hướng xu hướng và thực hiện một hệ thống giao dịch theo xu hướng. Ý tưởng chính của chiến lược này là: đầu tiên, sử dụng các điểm pivot để xác định mức hỗ trợ / kháng cự hiện tại; sau đó, sử dụng chỉ số siêu xu hướng để xác định hướng xu hướng hiện tại; và cuối cùng, sử dụng trung bình động để lọc sự khác biệt. Đồng thời, chiến lược cũng hỗ trợ các biện pháp kiểm soát rủi ro như thiết lập cửa sổ thời gian và giới hạn các vị trí giao dịch tối đa.

Nguyên tắc chiến lược

  1. Đầu tiên, tính các điểm pivot dựa trên giá cao nhất và thấp nhất trong một khoảng thời gian nhất định để có được mức hỗ trợ / kháng cự hiện tại.
  2. Sử dụng chỉ số Supertrend để xác định xu hướng.
  3. Sử dụng ATR để dừng lỗ. Chiến lược này kết hợp ATR như một mức dừng lỗ trên đỉnh của Supertrend ban đầu.
  4. Sử dụng đường trung bình động như một bộ lọc xu hướng. Chỉ mua dài khi xu hướng tăng và giá trên đường trung bình động, và chỉ mua ngắn khi xu hướng giảm và giá dưới đường trung bình động.
  5. Thiết lập cửa sổ thời gian giao dịch. Chỉ mở các vị trí trong một khoảng thời gian cụ thể để tránh giao dịch tại các thời điểm quan trọng.
  6. Quản lý các vị trí dài và ngắn riêng biệt.

Tóm lại, chiến lược này đi vào một vị trí khi điểm hỗ trợ / kháng cự, hướng siêu xu hướng và hướng trung bình động đều đồng ý, và đóng vị trí khi bất kỳ điều kiện nào trong số này trở nên không hợp lệ.

Phân tích lợi thế

  1. Ưu điểm của giao dịch dựa trên mức hỗ trợ / kháng cự là nó phù hợp với luật cung và cầu trên thị trường, và các điểm pivot có thể phản ánh năng động sự cân bằng thị trường.
  2. Supertrend có thể nắm bắt hiệu quả xu hướng và dừng lỗ một cách kịp thời.
  3. Việc lọc trung bình động tránh giao dịch ngược xu hướng. Nhập thị trường khi xu hướng và trung bình động đồng bộ sẽ dẫn đến tỷ lệ thắng cao hơn.
  4. Cửa sổ thời gian giao dịch có thể tùy chỉnh tránh giao dịch tại các thời điểm quan trọng ở một mức độ nhất định, chẳng hạn như trước khi thị trường mở và đóng.
  5. Các tín hiệu dài và ngắn hoạt động độc lập, cho phép giữ đồng thời các vị trí dài và ngắn, do đó tận dụng đầy đủ hơn các cơ hội thị trường.

Phân tích rủi ro

  1. Nguy cơ giao dịch thường xuyên: Chiến lược này có thể thường xuyên mở và đóng các vị trí trong một thị trường dao động, dẫn đến chi phí giao dịch quá cao.
  2. Mặc dù chiến lược này áp dụng lọc trung bình động, nếu trung bình động tự nó đi ngược lại xu hướng chính, giao dịch ngược xu hướng vẫn có thể xảy ra.
  3. Vấn đề tối ưu hóa tham số. Chiến lược chứa nhiều tham số, chẳng hạn như thời gian và nhân của Supertrend, và thời gian của đường trung bình động. Các tham số khác nhau sẽ mang lại kết quả khác nhau, và chọn kết hợp tham số tối ưu là một thách thức.
  4. Có thể thất bại trong điều kiện thị trường cực đoan. Trong điều kiện thị trường cực đoan, chẳng hạn như tăng và giảm mạnh, khủng hoảng thanh khoản, vv, chiến lược này có thể không thể ngăn chặn lỗ kịp thời.

Hướng dẫn tối ưu hóa

  1. Đưa ra nhiều trung bình động trung bình và dài hạn hơn để cải thiện độ tin cậy của phán đoán xu hướng và giảm giao dịch thường xuyên.
  2. Xem xét việc giới thiệu các chỉ số biến động, chẳng hạn như Bollinger Bands, để giảm giao dịch trên các thị trường biến động cao.
  3. Tối ưu hóa các tham số khác nhau để tìm kết hợp tham số tốt nhất và cải thiện tính ổn định của chiến lược.
  4. Thiết lập một lỗ dừng cứng trong điều kiện thị trường cực đoan để kiểm soát rủi ro. Ngoài ra, hãy xem xét thêm phán đoán về biến động thị trường bất thường, chẳng hạn như khoảng cách giá và tăng khối lượng giao dịch, và giảm hoặc ngừng giao dịch trong thời gian bất thường.

Tóm lại

Chiến lược này tích hợp các phương pháp phân tích kỹ thuật khác nhau như hỗ trợ / kháng cự, theo dõi xu hướng và lọc đà để có lợi hiệu quả từ thị trường xu hướng trong khi kiểm soát rủi ro rút vốn. Ưu điểm của nó nằm trong các tín hiệu rõ ràng và ngắn gọn, logic rõ ràng và phù hợp với ứng dụng trung hạn đến dài hạn. Tuy nhiên, chiến lược này cũng có những vấn đề như giao dịch thường xuyên, khó khăn trong tối ưu hóa tham số và kiểm soát rủi ro không đủ trong điều kiện thị trường cực đoan. Trong tương lai, nó có thể được cải thiện hơn nữa bằng cách giới thiệu các chỉ số kỹ thuật hơn, tối ưu hóa các tham số lượng, thiết lập lỗ dừng cứng và đánh giá điều kiện thị trường bất thường. Nói chung, chiến lược này là một chiến lược theo xu hướng tương đối trưởng thành mà, với tối ưu hóa và cải tiến thích hợp, có thể trở thành một hệ thống giao dịch mạnh mẽ. Các ý tưởng giao dịch có thể được sử dụng để tham khảo, nhưng chúng vẫn cần được sử dụng một cách thận trọng với kinh nghiệm thực tế và lý thuyết thị trường lý tưởng và các đặc điểm toán học lý tưởng


/*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)


Thêm nữa