Chiến lược mua và bán tăng

Tác giả:ChaoZhang, Ngày: 2023-12-27 14:25:11
Tags:

img

Tổng quan

Chiến lược mua và bán Bullish Engulfing là một chiến lược giao dịch định lượng dựa trên các mô hình nến. Nó nắm bắt các cơ hội để kiếm lợi nhuận từ sự đảo ngược giá bằng cách xác định mô hình nến Bullish Engulfing. Những lợi thế chính của chiến lược này là:

  1. Nó dựa trên các lý thuyết phân tích kỹ thuật trưởng thành để xác định các cơ hội đảo ngược giá có khả năng cao.
  2. Nó có các tín hiệu giao dịch đơn giản và trực quan.
  3. Rủi ro có thể kiểm soát được.

Chiến lược logic

Chiến lược này xác định sự đảo ngược giá dựa trên mô hình nến Bullish Engulfing.

Khi một cổ phiếu trong một xu hướng giảm, nếu một ngọn nến với một cơ thể thực nhỏ được theo sau bởi một ngọn nến có cơ thể thực hoàn toàn nuốt chửng cơ thể thực trước đó, và giá đóng cửa cao hơn giá cao trước đó, điều này tạo thành một mô hình Nuốt chửng tăng, báo hiệu một sự đảo ngược xu hướng sắp xảy ra, nơi giá sẽ bắt đầu tăng.

Chiến lược này sẽ mở một vị trí dài khi một mô hình Bullish Engulfing được xác định, với mục tiêu lợi nhuận là 1% và dừng lỗ là 1%, để khóa lợi nhuận.

Phân tích lợi thế

Những lợi thế của chiến lược này là:

  1. Nó dựa trên các lý thuyết phân tích kỹ thuật trưởng thành.
  2. Các tín hiệu giao dịch đơn giản và trực quan, dễ hiểu và tự động hóa cho giao dịch định lượng.
  3. Giao dịch các sản phẩm thanh khoản cao như tương lai chỉ số cho phép nhập và ra hiệu quả.
  4. Mục tiêu lợi nhuận và lệnh dừng lỗ kiểm soát hiệu quả tỷ lệ rủi ro / lợi nhuận của mỗi giao dịch, đảm bảo lợi nhuận và tránh tổn thất lớn.
  5. Điều chỉnh tham số linh hoạt phù hợp với các sản phẩm và môi trường thị trường khác nhau.

Phân tích rủi ro

Có một số rủi ro cho chiến lược này:

  1. Rủi ro tín hiệu sai tồn tại vì nó dựa trên lý thuyết phân tích kỹ thuật.
  2. Thay đổi chế độ thị trường có thể làm mất hiệu lực các thông số cần điều chỉnh.
  3. Các giá trị dừng lỗ quá chặt chẽ có thể dẫn đến thoát sớm, trong khi các giá trị quá rộng có thể tạo ra tổn thất lớn.

Để giải quyết những rủi ro này, chúng ta có thể:

  1. Tối ưu hóa các thông số và xác minh hiệu suất trong các điều kiện thị trường.
  2. Mở rộng mức dừng lỗ để kiểm soát lỗ giao dịch duy nhất ở mức chấp nhận được.
  3. Giao dịch các sản phẩm thanh khoản cao với độ biến động phù hợp như ETF chỉ số và tương lai.

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

Chiến lược này cũng có thể được tăng cường bằng cách:

  1. Thêm các bộ lọc như trung bình động để tránh giao dịch chống lại xu hướng.
  2. Tăng mục tiêu lợi nhuận để mở rộng tiềm năng lợi nhuận.
  3. Tối ưu hóa các cơ chế dừng lỗ, như dừng lại để giảm xác suất dừng lại.
  4. Sử dụng sự kết hợp của các mô hình nến khác tương tự như Bullish Engulfing để tạo ra một hệ thống giao dịch.

Kết luận

Chiến lược mua và bán Bullish Engulfing là một chiến lược giao dịch định lượng trưởng thành dựa trên phân tích kỹ thuật, với những lợi thế của các tín hiệu giao dịch đơn giản và rõ ràng dễ thực hiện. Với các thông số tối ưu hóa và các biện pháp kiểm soát rủi ro tốt, nó có thể tạo ra lợi nhuận ổn định và được khuyến cáo cao.


/*backtest
start: 2022-12-20 00:00:00
end: 2023-12-26 00:00:00
period: 1d
basePeriod: 1h
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/
// © thequantscience

// ██████╗ ██╗   ██╗██╗     ██╗     ██╗███████╗██╗  ██╗    ███████╗███╗   ██╗ ██████╗ ██╗   ██╗██╗     ███████╗██╗███╗   ██╗ ██████╗ 
// ██╔══██╗██║   ██║██║     ██║     ██║██╔════╝██║  ██║    ██╔════╝████╗  ██║██╔════╝ ██║   ██║██║     ██╔════╝██║████╗  ██║██╔════╝ 
// ██████╔╝██║   ██║██║     ██║     ██║███████╗███████║    █████╗  ██╔██╗ ██║██║  ███╗██║   ██║██║     █████╗  ██║██╔██╗ ██║██║  ███╗
// ██╔══██╗██║   ██║██║     ██║     ██║╚════██║██╔══██║    ██╔══╝  ██║╚██╗██║██║   ██║██║   ██║██║     ██╔══╝  ██║██║╚██╗██║██║   ██║
// ██████╔╝╚██████╔╝███████╗███████╗██║███████║██║  ██║    ███████╗██║ ╚████║╚██████╔╝╚██████╔╝███████╗██║     ██║██║ ╚████║╚██████╔╝
// ╚═════╝  ╚═════╝ ╚══════╝╚══════╝╚═╝╚══════╝╚═╝  ╚═╝    ╚══════╝╚═╝  ╚═══╝ ╚═════╝  ╚═════╝ ╚══════╝╚═╝     ╚═╝╚═╝  ╚═══╝ ╚═════╝ 
                                                                                                                                  
//@version=5
strategy(
     "Buy&Sell Bullish Engulfing - The Quant Science",
     overlay = true,
     default_qty_type = strategy.percent_of_equity, 
     default_qty_value = 100,
     pyramiding = 1,
     currency = currency.EUR,
     initial_capital = 10000,
     commission_type = strategy.commission.percent,
     commission_value = 0.07,
     process_orders_on_close = true, 
     close_entries_rule = "ANY"
     )

startDate  = input.int(title="D: ", defval=1,    minval=1,    maxval=31,   inline = 'Start', group = "START DATE BACKTESTING", tooltip = "D is Day, M is Month, Y is Year.")
startMonth = input.int(title="M: ", defval=1,    minval=1,    maxval=12,   inline = 'Start', group = "START DATE BACKTESTING", tooltip = "D is Day, M is Month, Y is Year.")
startYear  = input.int(title="Y: ", defval=2022, minval=1800, maxval=2100, inline = 'Start', group = "START DATE BACKTESTING", tooltip = "D is Day, M is Month, Y is Year.")

endDate    = input.int(title="D: ", defval=31,   minval=1,    maxval=31,   inline = 'End',   group = "END DATE BACKTESTING", tooltip = "D is Day, M is Month, Y is Year.")
endMonth   = input.int(title="M: ", defval=12,   minval=1,    maxval=12,   inline = 'End',   group = "END DATE BACKTESTING", tooltip = "D is Day, M is Month, Y is Year.")
endYear    = input.int(title="Y: ", defval=2023, minval=1800, maxval=2100, inline = 'End',   group = "END DATE BACKTESTING", tooltip = "D is Day, M is Month, Y is Year.")

inDateRange = (time >= timestamp(syminfo.timezone, startYear, startMonth, startDate, 0, 0)) and (time < timestamp(syminfo.timezone, endYear, endMonth, endDate, 0, 0))

PROFIT   = input.float(defval = 1, minval = 0, title = "Target profit (%): ", step = 0.10, group = "TAKE PROFIT-STOP LOSS")
STOPLOSS = input.float(defval = 1, minval = 0, title = "Stop Loss (%): ",     step = 0.10, group = "TAKE PROFIT-STOP LOSS")

var float equity_trades = 0
strategy.initial_capital = 50000
equity_trades := strategy.initial_capital
var float equity   = 0
var float qty_order   = 0
t_ordersize = "Percentage size of each new order. With 'Reinvestment Profit' activate, the size will be calculate on the equity, with 'Reinvestment Profit' deactivate the size will be calculate on the initial capital."
orders_size = input.float(defval = 2, title = "Orders size (%): ", minval = 0.10, step = 0.10,  maxval = 100, group = "RISK MANAGEMENT", tooltip = t_ordersize)
qty_order := ((equity_trades * orders_size) / 100 ) / close 

C_DownTrend = true
C_UpTrend   = true
var trendRule1 = "SMA50"
var trendRule2 = "SMA50, SMA200"
var trendRule = input.string(trendRule1, "Detect Trend Based On", options=[trendRule1, trendRule2, "No detection"], group = "BULLISH ENGULFING")

if trendRule == trendRule1
	priceAvg = ta.sma(close, 50)
	C_DownTrend := close < priceAvg
	C_UpTrend := close > priceAvg

if trendRule == trendRule2
	sma200 = ta.sma(close, 200)
	sma50  = ta.sma(close, 50)
	C_DownTrend := close < sma50 and sma50 < sma200
	C_UpTrend := close > sma50 and sma50 > sma200
C_Len = 14
C_ShadowPercent = 5.0 
C_ShadowEqualsPercent = 100.0
C_DojiBodyPercent = 5.0
C_Factor = 2.0 

C_BodyHi = math.max(close, open)
C_BodyLo = math.min(close, open)
C_Body = C_BodyHi - C_BodyLo
C_BodyAvg = ta.ema(C_Body, C_Len)
C_SmallBody = C_Body < C_BodyAvg
C_LongBody = C_Body > C_BodyAvg
C_UpShadow = high - C_BodyHi
C_DnShadow = C_BodyLo - low
C_HasUpShadow = C_UpShadow > C_ShadowPercent / 100 * C_Body
C_HasDnShadow = C_DnShadow > C_ShadowPercent / 100 * C_Body
C_WhiteBody = open < close
C_BlackBody = open > close
C_Range = high-low
C_IsInsideBar = C_BodyHi[1] > C_BodyHi and C_BodyLo[1] < C_BodyLo
C_BodyMiddle = C_Body / 2 + C_BodyLo
C_ShadowEquals = C_UpShadow == C_DnShadow or (math.abs(C_UpShadow - C_DnShadow) / C_DnShadow * 100) < C_ShadowEqualsPercent and (math.abs(C_DnShadow - C_UpShadow) / C_UpShadow * 100) < C_ShadowEqualsPercent
C_IsDojiBody = C_Range > 0 and C_Body <= C_Range * C_DojiBodyPercent / 100
C_Doji = C_IsDojiBody and C_ShadowEquals

patternLabelPosLow  = low  - (ta.atr(30) * 0.6)
patternLabelPosHigh = high + (ta.atr(30) * 0.6)

label_color_bullish = input.color(color.rgb(43, 255, 0), title = "Label Color Bullish", group = "BULLISH ENGULFING")
C_EngulfingBullishNumberOfCandles = 2
C_EngulfingBullish = C_DownTrend and C_WhiteBody and C_LongBody and C_BlackBody[1] and C_SmallBody[1] and close >= open[1] and open <= close[1] and ( close > open[1] or open < close[1] )
if C_EngulfingBullish
    var ttBullishEngulfing = "Engulfing\nAt the end of a given downward trend, there will most likely be a reversal pattern. To distinguish the first day, this candlestick pattern uses a small body, followed by a day where the candle body fully overtakes the body from the day before, and closes in the trend’s opposite direction. Although similar to the outside reversal chart pattern, it is not essential for this pattern to completely overtake the range (high to low), rather only the open and the close."
    label.new(bar_index, patternLabelPosLow, text="BE", style=label.style_label_up, color = label_color_bullish, textcolor=color.white, tooltip = ttBullishEngulfing)
bgcolor(ta.highest(C_EngulfingBullish?1:0, C_EngulfingBullishNumberOfCandles)!=0 ? color.new(#21f321, 90) : na, offset=-(C_EngulfingBullishNumberOfCandles-1))

var float c       = 0
var float o       = 0
var float c_exit  = 0
var float c_stopl = 0

if C_EngulfingBullish and strategy.opentrades==0 and inDateRange 
    c := strategy.equity
    o := close
    c_exit  := c + (c * PROFIT / 100)
    c_stopl := c - (c * STOPLOSS / 100)
    strategy.entry(id = "LONG", direction = strategy.long, qty = qty_order, limit = o)

if ta.crossover(strategy.equity, c_exit)
    strategy.exit(id = "CLOSE-LONG", from_entry = "LONG", limit = close)
if ta.crossunder(strategy.equity, c_stopl)
    strategy.exit(id = "CLOSE-LONG", from_entry = "LONG", limit = close)


Thêm nữa