Chiến lược SuperTrend Engulfing

Tác giả:ChaoZhang, Ngày: 2023-12-08 15:40:26
Tags:

img

Tổng quan

Chiến lược SuperTrend Engulfing là một chiến lược theo xu hướng kết hợp Average True Range (ATR), chỉ số SuperTrend và các mô hình engulfing để xác định hướng xu hướng và tìm cơ hội nhập cảnh tỷ lệ rủi ro-lợi nhuận tốt khi các mô hình engulfing xác nhận xu hướng.

Chiến lược logic

Chiến lược đầu tiên sử dụng chỉ số ATR và SuperTrend để xác định hướng xu hướng thị trường hiện tại. Cụ thể, xu hướng giảm được xác định khi giá dưới dải trên và xu hướng tăng khi giá trên dải dưới.

Đồng thời, chiến lược cũng đánh giá liệu đường K có hình thành một mô hình ngập. Theo logic mã, trong một xu hướng tăng, nếu giá đóng cửa của thanh trước cao hơn giá mở cửa của thanh hiện tại, trong khi giá đóng cửa của thanh hiện tại thấp hơn giá mở cửa, một sự ngập tăng sẽ được kích hoạt. Trong một xu hướng giảm, nếu giá đóng cửa của thanh trước thấp hơn giá mở cửa của thanh hiện tại, trong khi giá đóng cửa của thanh hiện tại cao hơn giá mở cửa, một sự ngập giảm sẽ được kích hoạt.

Khi mô hình ngập phù hợp với hướng xu hướng, một tín hiệu giao dịch sẽ được tạo ra. Ngoài ra, chiến lược cũng sẽ tính toán mức dừng lỗ và lấy mức lợi nhuận dựa trên mô hình ngập. Sau khi vào thị trường, nếu giá chạm vào mức dừng lỗ hoặc lấy lợi nhuận, vị trí hiện tại sẽ được thoát ra.

Phân tích lợi thế

Chiến lược kết hợp các lợi thế của việc theo dõi xu hướng và nhận dạng mẫu để xác định các tín hiệu đảo ngược trong các thị trường xu hướng, do đó bắt được các động thái lớn hơn tại các điểm chuyển hướng.

Phân tích rủi ro

Rủi ro lớn nhất của chiến lược này là các mô hình ngập có thể là những đứt gãy giả, do đó tạo ra các tín hiệu sai. Ngoài ra, cài đặt dừng lỗ và lấy lợi nhuận cũng có thể quá tùy tiện, không đạt được lợi nhuận và lỗ cân bằng.

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

Xem xét tối ưu hóa các thông số ATR trong thời gian thực để nắm bắt tốt hơn những thay đổi trong biến động thị trường. Ngoài ra, nghiên cứu các chỉ số khác để xác định xu hướng có thể cải thiện thêm sự ổn định của chiến lược. Từ góc độ dừng lỗ và lấy lợi nhuận, việc theo dõi năng động cũng là một hướng tối ưu hóa khả thi.

Tóm lại

Chiến lược SuperTrend Engulfing tích hợp các lợi thế của việc theo dõi xu hướng và nhận dạng mẫu, sử dụng các mẫu ngập như các tín hiệu đảo ngược. Nó có thể thu được lợi nhuận cao hơn tại các điểm chuyển hướng của thị trường. Nhưng chiến lược cũng có một số rủi ro của các tín hiệu giả. Cần thử nghiệm và tối ưu hóa thêm để kiểm soát rủi ro.


/*backtest
start: 2023-11-07 00:00:00
end: 2023-12-07 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/
// © Armanhammer

//@version=5
strategy("Engulfing with Trend", overlay=true)

Periods = input.int(title="ATR Period", defval=10)
src = input(hl2, title="Source")
Multiplier = input.float(title="ATR Multiplier", step=0.1, defval=3.0)
changeATR= input.bool(title="Change ATR Calculation Method ?", defval=true)
showsignals = input.bool(title="Show Buy/Sell Signals ?", defval=true)
highlighting = input.bool(title="Highlighter On/Off ?", defval=true)

atr2 = ta.sma(src, Periods)
atr= changeATR ? ta.atr(Periods) : atr2

up=src-(Multiplier*atr)
up1 = nz(up[1],up)
up := close[1] > up1 ? math.max(up,up1) : up
dn=src+(Multiplier*atr)
dn1 = nz(dn[1], dn)
dn := close[1] < dn1 ? math.min(dn, dn1) : dn

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

upPlot = plot(trend == 1 ? up : na, title="Up Trend", style=plot.style_linebr, linewidth=2, color=color.green)
buySignal = trend == 1 and trend[1] == -1
plotshape(buySignal and showsignals ? up : na, title="Buy", style=shape.labelup, location=location.absolute, color=color.new(color.green, 0), text="Buy")
//plotshape(buySignal ? up : na, title="UpTrend Begins", location=location.absolute, style=shape.circle, size=size.tiny, color=color.green, transp=0)
//plotshape(buySignal and showsignals ? up : na, title="Buy", text="Buy", location=location.absolute, style=shape.labelup, size=size.tiny, color=color.green, textcolor=color.white, transp=0)
dnPlot = plot(trend == 1 ? na : dn, title="Down Trend", style=plot.style_linebr, linewidth=2, color=color.red)
sellSignal = trend == -1 and trend[1] == 1
plotshape(sellSignal and showsignals ? dn : na, title="Sell", style=shape.labeldown, location=location.absolute, color=color.new(color.red, 0), text="Sell")
//plotshape(sellSignal ? dn : na, title="DownTrend Begins", location=location.absolute, style=shape.circle, size=size.tiny, color=color.red, transp=0)
//plotshape(sellSignal and showsignals ? dn : na, title="Sell", text="Sell", location=location.absolute, style=shape.labeldown, size=size.tiny, color=color.red, textcolor=color.white, transp=0)
mPlot = plot(ohlc4, title="", style=plot.style_circles, linewidth=0)
longFillColor = highlighting and trend == 1 ? color.new(color.green, 0) : na
shortFillColor = highlighting and trend == -1 ? color.new(color.red, 0) : na
fill(upPlot, dnPlot, color=longFillColor)
fill(dnPlot, upPlot, color=shortFillColor)
alertcondition(buySignal, title="SuperTrend Buy", message="SuperTrend Buy!")
alertcondition(sellSignal, title="SuperTrend Sell", message="SuperTrend Sell!")
changeCond = trend != trend[1]
alertcondition(changeCond, title="SuperTrend Direction Change", message="SuperTrend has changed direction!")

// Define Downtrend and Uptrend conditions
downtrend = trend == -1
uptrend = trend == 1


// Engulfing
boringThreshold = input.float(25, title="Boring Candle Threshold (%)", minval=1, maxval=100)
engulfingThreshold = input.float(50, title="Engulfing Candle Threshold (%)", minval=1, maxval=100)
stopLevel = input.int(200, title="Stop Level (Pips)", minval=1)

// Boring Candle (Inside Bar) and Engulfing Candlestick Conditions
isBoringCandle = math.abs(open[1] - close[1]) * 100 / math.abs(high[1] - low[1]) <= boringThreshold
isEngulfingCandle = math.abs(open - close) * 100 / math.abs(high - low) <= engulfingThreshold

// Bullish and Bearish Engulfing Conditions
bullEngulfing = uptrend and close[1] < open[1] and close > open[1] and not isBoringCandle and not isEngulfingCandle
bearEngulfing = downtrend and close[1] > open[1] and close < open[1] and not isBoringCandle and not isEngulfingCandle

// Stop Loss, Take Profit, and Entry Price Calculation
bullStop = close + (stopLevel * syminfo.mintick)
bearStop = close - (stopLevel * syminfo.mintick)
bullSL = low 
bearSL = high
bullTP = bullStop + (bullStop - low)
bearTP = bearStop - (high - bearStop)

// Entry Conditions
enterLong = bullEngulfing and uptrend
enterShort = bearEngulfing and downtrend

// Exit Conditions
exitLong = ta.crossover(close, bullTP) or ta.crossover(close, bullSL)
exitShort = ta.crossover(close, bearTP) or ta.crossover(close, bearSL)

// Check if exit conditions are met by the next candle
exitLongNextCandle = exitLong and (ta.crossover(close[1], bullTP[1]) or ta.crossover(close[1], bullSL[1]))
exitShortNextCandle = exitShort and (ta.crossover(close[1], bearTP[1]) or ta.crossover(close[1], bearSL[1]))

// Strategy Execution
if enterLong
    strategy.entry("Buy", strategy.long)

if enterShort
    strategy.entry("Sell", strategy.short)

// Exit Conditions for Long (Buy) Positions
if bullEngulfing and not na(bullTP) and not na(bullSL)
    strategy.exit("Exit Long", from_entry="Buy", stop=bullSL, limit=bullTP)

// Exit Conditions for Short (Sell) Positions
if bearEngulfing and not na(bearTP) and not na(bearSL)
    strategy.exit("Exit Short", from_entry="Sell", stop=bearSL, limit=bearTP)


// Plot Shapes and Labels
plotshape(series=bullEngulfing, style=shape.triangleup, location=location.abovebar, color=color.green)
plotshape(series=bearEngulfing, style=shape.triangledown, location=location.abovebar, color=color.red)

// Determine OP, SL, and TP
plot(series=bullEngulfing ? bullStop : na, title="Bullish Engulfing stop", color=color.red, linewidth=3, style=plot.style_linebr)
plot(series=bearEngulfing ? bearStop : na, title="Bearish Engulfing stop", color=color.red, linewidth=3, style=plot.style_linebr)
plot(series=bullEngulfing ? bullSL : na, title="Bullish Engulfing SL", color=color.red, linewidth=3, style=plot.style_linebr)
plot(series=bearEngulfing ? bearSL : na, title="Bearish Engulfing SL", color=color.red, linewidth=3, style=plot.style_linebr)
plot(series=bullEngulfing ? bullTP : na, title="Bullish Engulfing TP", color=color.green, linewidth=3, style=plot.style_linebr)
plot(series=bearEngulfing ? bearTP : na, title="Bearish Engulfing TP", color=color.green, linewidth=3, style=plot.style_linebr)

// Create labels if the condition for bullEngulfing or bearEngulfing is met
//if bullEngulfing
   // label.new(x=bar_index, y=bullSL, text="SL: " + str.tostring(bullSL), color=color.red, textcolor=color.white, style=label.style_labelup, size=size.tiny)

//if bearEngulfing
   // label.new(x=bar_index, y=bearSL, text="SL: " + str.tostring(bearSL), color=color.red, textcolor=color.white, style=label.style_labeldown, size=size.tiny)

//if bullEngulfing
  //  label.new(x=bar_index, y=bullTP, text="TP: " + str.tostring(bullTP), color=color.green, textcolor=color.white, style=label.style_labeldown, size=size.tiny)

//if bearEngulfing
  //  label.new(x=bar_index, y=bearTP, text="TP: " + str.tostring(bearTP), color=color.green, textcolor=color.white, style=label.style_labelup, size=size.tiny)


Thêm nữa