Strategi Beli dan Jual Bullish Engulfing


Tarikh penciptaan: 2023-12-27 14:25:11 Akhirnya diubah suai: 2023-12-27 14:25:11
Salin: 0 Bilangan klik: 724
1
fokus pada
1621
Pengikut

Strategi Beli dan Jual Bullish Engulfing

Gambaran keseluruhan

Strategi beli dan jual Bullish Engulfing adalah strategi dagangan kuantitatif berdasarkan bentuk K. Strategi ini menangkap peluang untuk membalikkan harga saham dan menghasilkan keuntungan dengan mengenal pasti bentuk K.

Kelebihan utama strategi ini ialah:

  1. Berdasarkan teori analisis teknikal yang matang, mengenal pasti peluang harga yang berbalik dengan kebarangkalian tinggi
  2. Isyarat perdagangan yang mudah dan intuitif
  3. Risiko yang boleh dikawal

Prinsip Strategi

Strategi ini adalah berdasarkan kepada Bullish Engulfing, yang merangkumi K-Line.

Apabila saham berada dalam trend menurun, jika terdapat satu entiti yang lebih kecil K-garis, entiti yang mengikuti K-garis berikutnya benar-benar menelan entiti K-garis sebelumnya, dan harga penutupan lebih tinggi daripada harga tertinggi K-garis sebelumnya, iaitu membentuk Bullish Engulfing Sunflower, yang menandakan harga akan berbalik dan harga saham akan naik.

Strategi ini akan membuka lebih banyak kedudukan apabila mengenal pasti bentuk Bullish Engulfing, dan menetapkan Exit Stop Loss Stop Stop, dengan sasaran keuntungan 1%, stop loss 1%, dan kunci keuntungan.

Analisis kelebihan strategi

Strategi ini mempunyai kelebihan berikut:

  1. Berdasarkan teori analisis teknikal yang matang, Bullish Engulfing adalah isyarat harga yang berkemungkinan tinggi yang dapat menangkap peluang harga yang berbalik.
  2. Isyarat dagangan mudah difahami, mudah difahami, sesuai untuk perdagangan kuantitatif.
  3. Penggunaan jenis yang mempunyai kecairan tinggi seperti indeks saham dan niaga hadapan dapat mencapai kemasukan dan keluar yang cekap.
  4. Tetapkan Exit Stop Loss Stop Loss, anda boleh mengawal kadar keuntungan dan kerugian perdagangan tunggal dengan baik, memastikan hasil yang menguntungkan, dan mengelakkan kerugian besar.
  5. Parameter strategi boleh disesuaikan secara fleksibel untuk menyesuaikan diri dengan pelbagai jenis dan keadaan pasaran.

Analisis risiko strategi

Strategi ini mempunyai beberapa risiko:

  1. Berdasarkan teori analisis teknikal, terdapat beberapa risiko isyarat salah.
  2. Perubahan keadaan pasaran mungkin menyebabkan parameter tidak berfungsi dan perlu disesuaikan.
  3. Tetapan stop loss yang terlalu kecil boleh menyebabkan stop loss kecil, tetapan yang terlalu besar boleh meningkatkan kerugian.

Mengenai risiko tersebut, langkah-langkah yang boleh kita ambil ialah:

  1. Parameter pengoptimuman untuk mengesahkan keberkesanan dalam pasaran yang berbeza.
  2. Peningkatan markah hentian untuk memastikan hentian tunggal terkawal dalam julat yang boleh diterima.
  3. Jenis dagangan dengan kadar turun naik yang baik dan sederhana, seperti indeks atau indeks saham.

Arah pengoptimuman strategi

Strategi ini juga boleh dioptimumkan dengan:

  1. Menggabungkan penapis indikator trend, misalnya, dengan penilaian rata-rata untuk mengelakkan perdagangan berlawanan arah.
  2. Meningkatkan marjin penghentian dan memperluaskan ruang untuk keuntungan.
  3. Mengoptimumkan mekanisme penutupan kerugian, misalnya meningkatkan penutupan kerugian secara beransur-ansur mengikut pergerakan harga, mengurangkan kebarangkalian penutupan kerugian.
  4. Mengambil kombinasi bentuk K lain yang serupa dengan Bullish Engulfing, membentuk portfolio perdagangan.

ringkaskan

Strategi beli dan jual Bullish Engulfing sebagai strategi perdagangan kuantitatif berasaskan analisis teknikal yang matang, dengan kelebihan seperti isyarat perdagangan ringkas, jelas, dan mudah dilaksanakan. Dengan pengoptimuman parameter dan langkah-langkah kawalan risiko, keuntungan yang stabil boleh dicapai, dan disyorkan.

Kod sumber strategi
/*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)