Chiến lược bắt ngược


Ngày tạo: 2023-11-24 16:43:25 sửa đổi lần cuối: 2023-11-24 16:43:25
sao chép: 0 Số nhấp chuột: 676
1
tập trung vào
1617
Người theo dõi

Chiến lược bắt ngược

Tổng quan

Chiến lược bắt ngược là một chiến lược giao dịch ngược sử dụng đường Brin của chỉ số biến động và kết hợp với RSI của chỉ số động lực. Nó đặt kênh Brin và đường mua quá bán của RSI làm tín hiệu để tìm kiếm cơ hội đảo ngược khi xu hướng thay đổi.

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

Chiến lược này sử dụng đường Brin như một chỉ số kỹ thuật chính, được hỗ trợ bởi các chỉ số động lực như RSI để xác minh tín hiệu giao dịch.

  1. Xác định xu hướng của chu kỳ lớn, xác định xem là bullish hay bearish. Sử dụng 50 ngày EMA và 21 ngày EMA để đánh giá.
  2. Trong xu hướng giảm, khi giá tăng vượt qua đường đi của Bollinger, và chỉ số RSI vừa bật lên từ vùng bán tháo, hình dạng Gold Fork xuất hiện, cho thấy vùng bán tháo đã được thiết lập, được coi là tín hiệu mua.
  3. Trong xu hướng tăng, khi giá giảm vượt qua đường đua của Bollinger, và chỉ số RSI vừa quay trở lại từ vùng quá mua, hình dạng ngã chết xuất hiện, cho thấy vùng quá mua đã bắt đầu quay trở lại, được coi là tín hiệu bán.
  4. Các tín hiệu mua và bán trên phải được đáp ứng đồng thời để tránh các tín hiệu giả.

Phân tích lợi thế

Chiến lược này có những ưu điểm sau:

  1. Kết hợp với chỉ số dao động và chỉ số động lượng, tín hiệu là đáng tin cậy hơn.
  2. Giao dịch đảo ngược có rủi ro thấp, phù hợp cho hoạt động ngắn hạn.
  3. Quy tắc lập trình rõ ràng, dễ dàng thực hiện giao dịch tự động.
  4. Giao dịch theo xu hướng để tránh bừa bãi trong thị trường biến động.

Phân tích rủi ro

Chiến lược này cũng có những rủi ro sau:

  1. Đường dẫn Brin có nguy cơ phá vỡ tín hiệu giả, cần lọc các chỉ số RSI.
  2. Những người dân ở đây thường có xu hướng bị ảnh hưởng bởi các tác động của các tác động của các tác nhân khác.
  3. Không biết chính xác thời điểm quay trở lại, có thể có nguy cơ nhập cảnh sớm hoặc bỏ lỡ vị trí tốt nhất.

Đối với các rủi ro trên, bạn có thể thiết lập vị trí dừng lỗ để kiểm soát lỗ hổng rủi ro, đồng thời tối ưu hóa các tham số, điều chỉnh chu kỳ đường braid hoặc tham số RSI.

Hướng tối ưu hóa

Chiến lược này có thể được tối ưu hóa theo các hướng sau:

  1. Tối ưu hóa các tham số của vùng Brin, điều chỉnh độ dài chu kỳ và kích thước chênh lệch tiêu chuẩn, tìm kiếm sự kết hợp tham số tối ưu.
  2. Tối ưu hóa chu kỳ trung bình di chuyển, xác định độ dài chu kỳ tốt nhất để đánh giá xu hướng.
  3. Điều chỉnh các tham số RSI để tìm ra phạm vi vùng bán tháo tốt nhất.
  4. Thêm kết hợp các chỉ số khác, như KDJ, MACD, v.v., làm phong phú lý do nhập cảnh hệ thống.
  5. Thêm các thuật toán học máy, sử dụng công nghệ AI để tự động tìm các tham số tốt nhất.

Tóm tắt

Chiến lược nắm bắt đảo ngược là một chiến lược giao dịch ngắn hạn có hiệu quả hơn. Nó kết hợp với phán đoán xu hướng và tín hiệu đảo ngược, có thể lọc các tín hiệu giả của thị trường biến động, có thể tránh được rủi ro trong thị trường xu hướng và xu hướng, có thể kiểm soát rủi ro. Bằng cách liên tục tối ưu hóa các tham số và mô hình, có thể có hiệu quả chiến lược tốt hơn.

Mã nguồn chiến lược
/*backtest
start: 2023-10-24 00:00:00
end: 2023-11-23 00:00:00
period: 1h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

// This is an Open source work. Please do acknowledge in case you want to reuse whole or part of this code.
// Please see the documentation to know the details about this.

//@version=5
strategy('Strategy:Reversal-Catcher', shorttitle="Reversal-Catcher", overlay=true , currency=currency.NONE, initial_capital=100000)

// Inputs
src = input(close, title="Source (close, high, low, open etc.")

BBlength = input.int(defval=20, minval=1,title="Bollinger Period Length, default 20")
BBmult = input.float(defval=1.5, minval=1.0, maxval=4, step=0.1, title="Bollinger Bands Standard Deviation, default is 1.5")

fastMovingAvg = input.int(defval=21, minval=5,title="Fast Exponential Moving Average, default 21", group = "Trends")
slowMovingAvg = input.int(defval=50, minval=8,title="Slow Exponential Moving Average, default 50", group = "Trends")

rsiLenght = input.int(defval=14, title="RSI Lenght, default 14", group = "Momentum")
overbought = input.int(defval=70, title="Overbought limit (RSI), default 70", group = "Momentum")
oversold = input.int(defval=30, title="Oversold limit (RSI), default 30", group = "Momentum")

hide = input.bool(defval=true, title="Hide all plots and legends from the chart (default: true)")


// Trade related
tradeType = input.string(defval='Both', group="Trade settings", title="Trade Type", options=['Both', 'TrendFollowing', 'Reversal'], tooltip="Consider all types of trades? Or only Trend Following or only Reversal? (default: Both).")
endOfDay = input.int(defval=1500, title="Close all trades, default is 3:00 PM, 1500 hours (integer)", group="Trade settings")
mktAlwaysOn = input.bool(defval=false, title="Markets that never closed (Crypto, Forex, Commodity)", tooltip="Some markers never closes. For those cases, make this checked. (Default: off)", group="Trade settings")


// Utils
annotatePlots(txt, val, hide) => 
    if (not hide)
        var l1 = label.new(bar_index, val, txt, style=label.style_label_left, size = size.tiny, textcolor = color.white, tooltip = txt)
        label.set_xy(l1, bar_index, val)

/////////////////////////////// Indicators /////////////////////
vwap = ta.vwap(src)
plot(hide ? na : vwap, color=color.purple, title="VWAP", style = plot.style_line)
annotatePlots('VWAP', vwap, hide)

// Bollinger Band of present time frame
[BBbasis, BBupper, BBlower] = ta.bb(src, BBlength, BBmult)
p1 = plot(hide ? na : BBupper, color=color.blue,title="Bollinger Bands Upper Line")
p2 = plot(hide ? na : BBlower, color=color.blue,title="Bollinger Bands Lower Line")
p3 = plot(hide ? na : BBbasis, color=color.maroon,title="Bollinger Bands Width", style=plot.style_circles, linewidth = 1)
annotatePlots('BB-Upper', BBupper, hide)
annotatePlots('BB-Lower', BBlower, hide)
annotatePlots('BB-Base(20-SMA)', BBbasis, hide)

// RSI
rsi = ta.rsi(src, rsiLenght)

// Trend following
ema50 = ta.ema(src, slowMovingAvg)
ema21 = ta.ema(src, fastMovingAvg)
annotatePlots('21-EMA', ema21, hide)
annotatePlots('50-EMA', ema50, hide)


// Trend conditions
upTrend = ema21 > ema50 
downTrend = ema21 < ema50


// Condition to check Special Entry: HH_LL
// Long side:
hhLLong = barstate.isconfirmed and (low > low[1]) and (high > high[1]) and (close > high[1])
hhLLShort = barstate.isconfirmed and (low < low[1]) and (high < high[1]) and (close < low[1])

longCond =  barstate.isconfirmed and (high[1] < BBlower[1]) and (close > BBlower) and (close < BBupper) and hhLLong and ta.crossover(rsi, oversold) and downTrend
shortCond = barstate.isconfirmed and (low[1] > BBupper[1]) and (close < BBupper) and (close > BBlower) and hhLLShort and ta.crossunder(rsi, overbought) and upTrend

// Trade execute
h = hour(time('1'), syminfo.timezone)
m = minute(time('1'), syminfo.timezone)
hourVal = h * 100 + m
totalTrades = strategy.opentrades + strategy.closedtrades
if (mktAlwaysOn or (hourVal < endOfDay))
    // Entry
    var float sl = na
    var float target = na
    if (longCond)
        strategy.entry("enter long", strategy.long, 1, limit=na, stop=na, comment="Long[E]")
        sl := low[1]
        target := high >= BBbasis ? BBupper : BBbasis
        alert('Buy:' + syminfo.ticker + ' ,SL:' + str.tostring(math.floor(sl)) + ', Target:' + str.tostring(target), alert.freq_once_per_bar)
    if (shortCond)
        strategy.entry("enter short", strategy.short, 1, limit=na, stop=na, comment="Short[E]")
        sl := high[1]
        target := low <= BBbasis ? BBlower : BBbasis
        alert('Sell:' + syminfo.ticker + ' ,SL:' + str.tostring(math.floor(sl)) + ', Target:' + str.tostring(target), alert.freq_once_per_bar)

    // Exit: target or SL
    if ((close >= target) or (close <= sl))
        strategy.close("enter long", comment=close < sl ? "Long[SL]" : "Long[T]")
    if ((close <= target) or (close >= sl))
        strategy.close("enter short", comment=close > sl ? "Short[SL]" : "Short[T]")
else if (not mktAlwaysOn)
    // Close all open position at the end if Day
    strategy.close_all(comment = "EoD[Exit]", alert_message = "EoD Exit", immediately = true)