
Chiến lược này là một hệ thống xác nhận giao dịch đa cấp dựa trên chỉ số William Alligator và chỉ số tương đối mạnh RSI, được thiết kế cho chu kỳ 15 phút. Chiến lược này tạo ra tín hiệu giao dịch bằng cách đánh giá mối quan hệ vị trí của giá với ba dòng cá sấu và các giá trị của chỉ số RSI.
Nguyên tắc cốt lõi của chiến lược này dựa trên việc sử dụng tổng hợp các chỉ số William Herschel và RSI. Chỉ số William Herschel bao gồm ba đường trung bình: đường kim loại ((xanh, 13 chu kỳ SMA, 8 chu kỳ chậm), đường răng ((đỏ, 8 chu kỳ SMA, 5 chu kỳ chậm) và đường môi ((xanh, 5 chu kỳ SMA, 3 chu kỳ chậm).
Khi đường môi nằm trên đường răng và đường răng nằm trên đường nón, thị trường đang trong xu hướng tăng; ngược lại, khi đường môi nằm dưới đường răng và đường răng nằm dưới đường nón, thị trường đang trong xu hướng giảm. Đồng thời, chiến lược này cũng được xác nhận với chỉ số RSI, RSI lớn hơn 55 giờ hỗ trợ mua nhiều và nhỏ hơn 45 giờ hỗ trợ mua ít, cung cấp tín hiệu xác nhận bổ sung cho quyết định giao dịch.
Trong quá trình thực hiện chiến lược, hệ thống sẽ giám sát nhiều điều kiện dừng: Đối với các vị trí nhiều đầu, dừng sẽ được kích hoạt khi RSI giảm xuống 50 và giá đóng cửa giảm xuống đường răng hoặc đường môi giảm xuống đường răng; Đối với các vị trí đầu trống, dừng sẽ được kích hoạt khi RSI phá vỡ 50 và giá đóng cửa phá vỡ đường răng hoặc đường môi phá vỡ đường răng.
Cơ chế xác nhận đa dạngChiến lược này yêu cầu bốn điều kiện được đáp ứng cùng một lúc để có thể tham gia, hiệu quả làm giảm tín hiệu giả và cải thiện chất lượng giao dịch. Dòng ba đường của chỉ số William H. Fisher xác nhận hướng xu hướng, trong khi giá trị của RSI xác nhận động lực.
Quy tắc nhập cảnh và xuất cảnh rõ ràngChiến lược cung cấp các tín hiệu nhập cảnh và xuất cảnh rõ ràng, giảm sự phán đoán chủ quan, làm cho quá trình giao dịch được quy định và kỷ luật hơn.
Kiểm soát rủi ro hoàn hảoChiến lược đặt ra nhiều điều kiện dừng, bao gồm các tín hiệu đảo ngược dựa trên RSI, sự thay đổi trong mối quan hệ giữa giá và đường răng và sự thay đổi trong mối quan hệ giữa vị trí của đường môi và đường răng, cơ chế kiểm soát rủi ro nhiều tầng này giúp dừng lỗ kịp thời, kiểm soát rủi ro tối đa của giao dịch đơn lẻ.
Hình ảnh phản hồiChiến lược: Đánh dấu các tín hiệu mua, bán, dừng và kết thúc lợi nhuận trên biểu đồ và hiển thị các điều kiện được đáp ứng bằng cách hiển thị các biểu đồ trong thời gian thực, làm tăng đáng kể mức độ hiển thị của quá trình giao dịch.
Khả năng thích nghi cao: Mặc dù các tham số chiến lược được cài đặt mặc định, nhưng tất cả các tham số quan trọng có thể được điều chỉnh bằng cách nhập, cho phép các nhà giao dịch tối ưu hóa cho phù hợp với môi trường thị trường khác nhau hoặc sở thích cá nhân.
Thị trường giao dịch thường xuyên bị chấn động: Trong khi thị trường biến động nhỏ, giá có thể xuyên qua đường cá mập thường xuyên, RSI cũng có thể dao động gần các mức quan trọng, dẫn đến quá nhiều tín hiệu giao dịch và đi vào và ra thường xuyên, làm tăng chi phí giao dịch. Giải pháp là tăng điều kiện xác nhận hoặc kéo dài thời gian quan sát.
Rủi ro trượt nhanhTrong trường hợp có tin tức quan trọng đột ngột của thị trường dẫn đến biến động giá nhanh chóng và mạnh, giá giao dịch thực tế có thể có khoảng cách lớn với giá khi kích hoạt tín hiệu, tăng nguy cơ trượt.
Mục tiêu lợi nhuận bảo thủChiến lược sẽ đặt mục tiêu lợi nhuận là 2 đơn vị biến động nhỏ nhất, điều này có thể quá bảo thủ và không thể nắm bắt đầy đủ các hoạt động theo xu hướng trong thị trường biến động lớn. Bạn có thể xem xét điều chỉnh mục tiêu lợi nhuận theo động lực của biến động thị trường hoặc áp dụng chiến lược thanh toán hàng loạt.
Chỉ số chậm phát triểnCác chỉ số William Herschel và RSI đều có độ trễ, có thể không thể bắt được các ngã tư khi thị trường chuyển đổi nhanh chóng.
Độ nhạy tham sốHiệu suất chiến lược nhạy cảm với các thiết lập tham số, đặc biệt là thiết lập ngưỡng của RSI. Các kết hợp tham số khác nhau có thể hoạt động khác nhau trong các môi trường thị trường khác nhau và cần tìm ra các kết hợp tham số tối ưu thông qua phản hồi.
Động lực RSI: Chiến lược hiện tại sử dụng các ngưỡng RSI cố định ((55 và 45), có thể xem xét điều chỉnh các ngưỡng này theo động lực của tỷ lệ biến động của thị trường. Sử dụng các ngưỡng thoải mái hơn trong thị trường biến động cao, sử dụng các ngưỡng nghiêm ngặt hơn trong thị trường biến động thấp để thích ứng với môi trường thị trường khác nhau.
Thêm bộ lọc giao dịchGhi chú: Tiếp tục xác nhận khối lượng giao dịch, lọc tỷ lệ biến động hoặc chỉ số cường độ xu hướng, lọc các tín hiệu yếu trong thị trường chấn động, chỉ tham gia khi xu hướng rõ ràng, tăng tỷ lệ thắng.
Tối ưu hóa chiến lược chống ngứaChiến lược dừng 2 tick cố định hiện tại là quá đơn giản, bạn có thể xem xét thực hiện chiến lược dừng động, chẳng hạn như theo dõi dừng hoặc dừng dựa trên ATR để có được nhiều lợi nhuận hơn trong một xu hướng mạnh.
Bộ lọc thời gianTăng chức năng lọc thời gian, tránh thời gian thiếu thanh khoản hoặc biến động bất thường, chẳng hạn như 15 phút trước và sau khi mở cửa hoặc thời gian công bố dữ liệu quan trọng, để giảm rủi ro không cần thiết.
Tối ưu hóa quản lý tài chínhChiến lược hiện tại sử dụng tỷ lệ tiền cố định ((100%) để giao dịch, bạn có thể cân nhắc kích thước vị trí điều chỉnh động dựa trên biến động của thị trường hoặc sự thay đổi giá trị tài khoản ròng, để quản lý tiền một cách khoa học hơn.
Chiến lược giao dịch xác nhận nhiều cấp kết hợp với RSI của William Herschel là một hệ thống giao dịch có cấu trúc và logic rõ ràng, tạo ra một khung quyết định giao dịch nhiều cấp bằng cách tích hợp khả năng xác định xu hướng của chỉ số William Herschel và chức năng xác nhận động lực của RSI. Ưu điểm chính của chiến lược này là cơ chế xác nhận nhiều cấp và kiểm soát rủi ro tốt, nhưng cũng đối mặt với các thách thức như quá nhiều tín hiệu thị trường xung đột, rủi ro điểm trượt và mục tiêu lợi nhuận bảo thủ.
Chiến lược này có khả năng nâng cao hơn nữa sự ổn định và khả năng sinh lợi của nó bằng cách điều chỉnh động RSI, thêm bộ lọc giao dịch, tối ưu hóa chiến lược dừng, thêm bộ lọc thời gian và cải thiện quản lý tiền. Nhìn chung, đây là một chiến lược giao dịch định lượng có giá trị thực tế, phù hợp cho các nhà giao dịch có hiểu biết về các chỉ số kỹ thuật và muốn có thu nhập ổn định trong thị trường tương lai.
/*backtest
start: 2024-08-19 00:00:00
end: 2025-08-18 00:00:00
period: 1d
basePeriod: 1d
exchanges: [{"eid":"Futures_OKX","currency":"ETH_USDT","balance":5000}]
*/
//@version=5
strategy("Natural Gas Alligator RSI Strategy", overlay=true, default_qty_type=strategy.percent_of_equity, default_qty_value=100)
// =====================================
// INPUTS
// =====================================
// Williams Alligator Settings (default)
jaw_length = input.int(13, title="Jaw Length", minval=1)
jaw_offset = input.int(8, title="Jaw Offset", minval=0)
teeth_length = input.int(8, title="Teeth Length", minval=1)
teeth_offset = input.int(5, title="Teeth Offset", minval=0)
lips_length = input.int(5, title="Lips Length", minval=1)
lips_offset = input.int(3, title="Lips Offset", minval=0)
// RSI Settings (default)
rsi_length = input.int(14, title="RSI Length", minval=1)
// Natural Gas tick size (typically 0.001)
tick_size = input.float(0.001, title="Tick Size", minval=0.0001, step=0.0001)
// =====================================
// INDICATORS
// =====================================
// Williams Alligator
jaw = ta.sma(hl2, jaw_length)[jaw_offset]
teeth = ta.sma(hl2, teeth_length)[teeth_offset]
lips = ta.sma(hl2, lips_length)[lips_offset]
// RSI
rsi = ta.rsi(close, rsi_length)
// =====================================
// PLOT INDICATORS
// =====================================
plot(jaw, "Alligator Jaw", color=color.blue, linewidth=2)
plot(teeth, "Alligator Teeth", color=color.red, linewidth=2)
plot(lips, "Alligator Lips", color=color.green, linewidth=2)
// RSI (plotted in separate pane)
hline(50, "RSI Mid Line", color=color.gray, linestyle=hline.style_dashed)
hline(55, "RSI Buy Level", color=color.green, linestyle=hline.style_dotted)
hline(45, "RSI Sell Level", color=color.red, linestyle=hline.style_dotted)
plot(rsi, "RSI", color=color.purple)
// =====================================
// STRATEGY CONDITIONS
// =====================================
// Buy Conditions
buy_condition_1 = close > lips
buy_condition_2 = lips > teeth
buy_condition_3 = teeth > jaw
buy_condition_4 = rsi > 55
buy_signal = buy_condition_1 and buy_condition_2 and buy_condition_3 and buy_condition_4
// Sell Conditions
sell_condition_1 = close < lips
sell_condition_2 = lips < teeth
sell_condition_3 = teeth < jaw
sell_condition_4 = rsi < 45
sell_signal = sell_condition_1 and sell_condition_2 and sell_condition_3 and sell_condition_4
// Stop Loss Conditions for Long Position
long_stop_condition_1 = rsi < 50
long_stop_condition_2 = ta.crossunder(close, teeth)
long_stop_condition_3 = lips < teeth
long_stop_loss = long_stop_condition_1 or long_stop_condition_2 or long_stop_condition_3
// Stop Loss Conditions for Short Position
short_stop_condition_1 = rsi > 50
short_stop_condition_2 = ta.crossover(close, teeth)
short_stop_condition_3 = lips > teeth
short_stop_loss = short_stop_condition_1 or short_stop_condition_2 or short_stop_condition_3
// =====================================
// STRATEGY EXECUTION
// =====================================
// Variables to track entry prices
var float long_entry_price = na
var float short_entry_price = na
// Long Entry
if buy_signal and strategy.position_size == 0
strategy.entry("Long", strategy.long)
long_entry_price := close
alert("Buy Signal Generated", alert.freq_once_per_bar)
// Short Entry
if sell_signal and strategy.position_size == 0
strategy.entry("Short", strategy.short)
short_entry_price := close
alert("Sell Signal Generated", alert.freq_once_per_bar)
// Long Exit Conditions
if strategy.position_size > 0
// Take Profit: 2 ticks above entry
long_take_profit = long_entry_price + (2 * tick_size)
if close >= long_take_profit
strategy.close("Long", comment="Take Profit")
alert("Take Profit - Long Position Closed", alert.freq_once_per_bar)
long_entry_price := na
// Stop Loss
if long_stop_loss
strategy.close("Long", comment="Stop Loss")
alert("Stop Loss - Long Position Closed", alert.freq_once_per_bar)
long_entry_price := na
// Short Exit Conditions
if strategy.position_size < 0
// Take Profit: 2 ticks below entry
short_take_profit = short_entry_price - (2 * tick_size)
if close <= short_take_profit
strategy.close("Short", comment="Take Profit")
alert("Take Profit - Short Position Closed", alert.freq_once_per_bar)
short_entry_price := na
// Stop Loss
if short_stop_loss
strategy.close("Short", comment="Stop Loss")
alert("Stop Loss - Short Position Closed", alert.freq_once_per_bar)
short_entry_price := na
// =====================================
// CHART LABELS AND ALERTS
// =====================================
// Buy Signal Label
if buy_signal and strategy.position_size == 0
label.new(bar_index, low - (high - low) * 0.1, "BUY\nSIGNAL",
color=color.green, style=label.style_label_up,
textcolor=color.white, size=size.small)
// Sell Signal Label
if sell_signal and strategy.position_size == 0
label.new(bar_index, high + (high - low) * 0.1, "SELL\nSIGNAL",
color=color.red, style=label.style_label_down,
textcolor=color.white, size=size.small)
// Stop Loss Labels
if strategy.position_size > 0 and long_stop_loss
label.new(bar_index, high + (high - low) * 0.1, "STOP\nLOSS",
color=color.orange, style=label.style_label_down,
textcolor=color.white, size=size.small)
if strategy.position_size < 0 and short_stop_loss
label.new(bar_index, low - (high - low) * 0.1, "STOP\nLOSS",
color=color.orange, style=label.style_label_up,
textcolor=color.white, size=size.small)
// Take Profit Labels
if strategy.position_size > 0 and not na(long_entry_price) and close >= (long_entry_price + (2 * tick_size))
label.new(bar_index, high + (high - low) * 0.1, "TAKE\nPROFIT",
color=color.blue, style=label.style_label_down,
textcolor=color.white, size=size.small)
if strategy.position_size < 0 and not na(short_entry_price) and close <= (short_entry_price - (2 * tick_size))
label.new(bar_index, low - (high - low) * 0.1, "TAKE\nPROFIT",
color=color.blue, style=label.style_label_up,
textcolor=color.white, size=size.small)
// =====================================
// TABLE FOR CURRENT CONDITIONS
// =====================================
var table info_table = table.new(position.top_right, 2, 8, bgcolor=color.white, border_width=1)
if barstate.islast
table.cell(info_table, 0, 0, "Condition", bgcolor=color.gray, text_color=color.white)
table.cell(info_table, 1, 0, "Status", bgcolor=color.gray, text_color=color.white)
table.cell(info_table, 0, 1, "Close > Lips", bgcolor=color.white)
table.cell(info_table, 1, 1, buy_condition_1 ? "✓" : "✗", text_color=buy_condition_1 ? color.green : color.red)
table.cell(info_table, 0, 2, "Lips > Teeth", bgcolor=color.white)
table.cell(info_table, 1, 2, buy_condition_2 ? "✓" : "✗", text_color=buy_condition_2 ? color.green : color.red)
table.cell(info_table, 0, 3, "Teeth > Jaw", bgcolor=color.white)
table.cell(info_table, 1, 3, buy_condition_3 ? "✓" : "✗", text_color=buy_condition_3 ? color.green : color.red)
table.cell(info_table, 0, 4, "RSI > 55", bgcolor=color.white)
table.cell(info_table, 1, 4, buy_condition_4 ? "✓" : "✗", text_color=buy_condition_4 ? color.green : color.red)
table.cell(info_table, 0, 5, "RSI < 45", bgcolor=color.white)
table.cell(info_table, 1, 5, sell_condition_4 ? "✓" : "✗", text_color=sell_condition_4 ? color.red : color.green)
table.cell(info_table, 0, 6, "Current RSI", bgcolor=color.white)
table.cell(info_table, 1, 6, str.tostring(math.round(rsi, 2)), text_color=color.black)
table.cell(info_table, 0, 7, "Position", bgcolor=color.white)
position_text = strategy.position_size > 0 ? "LONG" : strategy.position_size < 0 ? "SHORT" : "NONE"
position_color = strategy.position_size > 0 ? color.green : strategy.position_size < 0 ? color.red : color.gray
table.cell(info_table, 1, 7, position_text, text_color=position_color)