
Hệ thống giao dịch tự thích ứng với xu hướng đa chiều là một chiến lược giao dịch định lượng dựa trên lý thuyết kim loại, cốt lõi của nó là chỉ số CETP-Plus, được đo lường theo mô hình đồ thị kim loại Shannon. Hệ thống này kết hợp các nguyên tắc trọng số gần đây của chỉ số trung bình di chuyển (EMA), độ lệch động tương đối mạnh của chỉ số RSI (RSI), độ lệch động của phạm vi trung bình thực tế (ATR) và độ mạnh của xu hướng của chỉ số hướng trung bình (ADX) vào một điểm đánh giá duy nhất. Phương pháp độc đáo này tránh sự phức tạp của việc chồng lên nhiều chỉ số, đồng thời nâng cao độ chính xác của việc phát hiện xu hướng sớm và sự cân bằng của giao dịch đa chiều.
Nguyên tắc cốt lõi của chiến lược này là áp dụng hàm Shannon cho phân tích mô hình đồ thị thị trường tài chính. Các hàm Shannon có nguồn gốc từ lý thuyết thông tin, được sử dụng để định lượng độ không chắc chắn hoặc “mức độ hỗn độn” của biến ngẫu nhiên. Trong chiến lược này, các hàm Shannon được tính toán và áp dụng theo cách sau:
Điểm CETP cuối cùng là sản phẩm tổng hợp của các yếu tố này, giá trị tích cực có xu hướng đi lên và giá trị tiêu cực có xu hướng đi xuống. Logic giao dịch đơn giản và trực tiếp: làm nhiều hơn khi điểm CETP vượt quá ngưỡng giá tích cực được đặt và làm trống khi thấp hơn ngưỡng giá tiêu cực. Để tránh giao dịch nhỏ, chiến lược đã thêm bộ lọc chuyển động giá tối thiểu để đảm bảo biểu đồ lọc hiện tại có đủ phạm vi để kích hoạt giao dịch. Quản lý rủi ro được thực hiện thông qua tỷ lệ phần trăm, ATR, nhân số và theo dõi dừng lỗ.
Tín hiệu tích hợpChỉ số CETP-Plus kết hợp các lợi thế của nhiều chỉ số truyền thống (EMA, RSI, ATR, ADX) để cung cấp một tín hiệu giao dịch đơn giản và rõ ràng, tránh rủi ro xung đột chỉ số và phù hợp quá mức.
Khả năng thích nghiChiến lược có thể tự động điều chỉnh theo điều kiện thị trường, thích ứng với môi trường biến động khác nhau và cường độ xu hướng, có thể hoạt động tốt trong nhiều tình trạng thị trường mà không cần can thiệp bằng tay.
Phương pháp xử lý đa không đối xứngChiến lược cho phép các cơ hội đầu nhiều và cơ hội đầu trống có trọng lượng tương đương, cho phép chúng hoạt động hiệu quả trong cả thị trường bò và thị trường gấu, không bị ảnh hưởng bởi sự thiên vị theo hướng.
Xác định xu hướng ban đầuCác công cụ này có thể được sử dụng trong các lĩnh vực khác nhau, bao gồm các lĩnh vực kinh doanh, công nghệ, công nghệ truyền thống, và các lĩnh vực khác.
Giảm tiếng ồnThông qua phân tích pha trục và kỹ thuật phân loại biểu đồ thẳng, chiến lược có thể phân biệt tín hiệu thực và tiếng ồn thị trường, làm giảm sự xuất hiện của tín hiệu giả.
Tùy chỉnhMột số lượng lớn các tham số có thể được tối ưu hóa cho các loại giao dịch và khung thời gian khác nhau, cho phép chiến lược có tính linh hoạt và thích ứng cao.
Quản lý rủi ro toàn diện: Khả năng kiểm soát rủi ro đa cấp được tích hợp, bao gồm dừng phần trăm, dừng động và theo dõi dừng dựa trên ATR, và bộ lọc giao dịch tối thiểu, kiểm soát hiệu quả việc rút tiền.
Độ nhạy tham sốChiến lược bao gồm nhiều tham số có thể điều chỉnh, tối ưu hóa quá mức có thể dẫn đến hiệu suất kém trong giao dịch trên đĩa. Các môi trường thị trường khác nhau có thể yêu cầu cài đặt tham số khác nhau, làm cho việc bảo trì hệ thống trở nên phức tạp.
Rủi ro giao dịch tần số caoChiến lược này có thể tạo ra một lượng lớn tín hiệu giao dịch, đặc biệt là trong các thị trường có tính biến động cao, dẫn đến giao dịch quá mức, chi phí hoa hồng tăng và điểm trượt lớn hơn.
Tính toán phức tạp: Hình 3D phân chia hộp và đệm tính toán có thể đòi hỏi nguồn lực tính toán cao hơn khi thực hiện trong thời gian thực, có thể dẫn đến độ trễ thực hiện, đặc biệt là trên khung thời gian ngắn hơn.
Thuật toán giả định rủi roChiến lược này dựa trên giả định rằng kim loại này có thể nắm bắt được mô hình thị trường một cách hiệu quả, nhưng cấu trúc thị trường có thể thay đổi theo thời gian, làm cho giả định này trở nên vô hiệu.
Sự phụ thuộc biến độngChiến lược sử dụng bộ lọc biến động và bộ lọc chuyển động giá tối thiểu, có thể bỏ lỡ cơ hội giao dịch trong môi trường biến động thấp và có thể quá nhạy cảm trong môi trường biến động cao.
Rủi ro của lịch sử phù hợpMặc dù chiến lược này kết hợp các lợi thế của nhiều chỉ số, vẫn có nguy cơ quá phù hợp với dữ liệu lịch sử, và điều kiện thị trường thay đổi trong tương lai có thể dẫn đến giảm hiệu suất.
Các giải pháp bao gồm: Tái tối ưu hóa các tham số thường xuyên, sử dụng thử nghiệm bước để xác minh tính ổn định của tham số, thực hiện các điều kiện lọc nghiêm ngặt hơn để giảm tần suất giao dịch, tăng các điều kiện xác nhận để cải thiện chất lượng tín hiệu và điều chỉnh các tham số rủi ro về hiệu suất của hệ thống giám sát thời gian thực.
Cơ chế tham số thích ứngTạo điều chỉnh động của các tham số, tự động tối ưu hóa cửa sổ, giá trị và trọng lượng CETP theo biến động thị trường, khối lượng giao dịch và cường độ xu hướng. Điều này có thể giúp hệ thống thích ứng tốt hơn với điều kiện thị trường thay đổi và giảm nhu cầu can thiệp bằng tay.
Tích hợp phân tích nhiều khung thời gian: Kết hợp các tín hiệu CETP từ các khung thời gian khác nhau để tạo ra hệ thống xác nhận cấp bậc. Ví dụ, chỉ thực hiện giao dịch khi tín hiệu khung thời gian cao hơn phù hợp với tín hiệu khung thời gian giao dịch, tăng tỷ lệ thắng.
Tăng cường học máyGhi chú: giới thiệu thuật toán học máy để tối ưu hóa lựa chọn tham số và lọc tín hiệu. Xác định các tham số hoạt động tốt nhất bằng cách giám sát học tập hoặc sử dụng thuật toán tập hợp để xác định các trạng thái thị trường khác nhau và điều chỉnh chiến lược cho phù hợp.
Bộ lọc thanh khoản và khối lượng giao dịchThêm bộ lọc dựa trên khối lượng giao dịch và độ sâu của thị trường, đảm bảo giao dịch chỉ khi có đủ thanh khoản, giảm điểm trượt và rủi ro thực hiện.
Phân tích liên quan đa tài sảnTích hợp thông tin về các thị trường liên quan (ví dụ như chỉ số, cổ phiếu hoặc hàng hóa liên quan) để tăng cường độ tin cậy giao dịch khi có nhiều tín hiệu liên quan.
Mô hình dự đoán biến độngPhát triển các thành phần dự báo biến động, điều chỉnh các tham số giảm giá và rủi ro trước để chuẩn bị cho môi trường biến động sắp tới.
Khung phản hồi và tối ưu hóa tự độngThiết lập hệ thống tự động, thường xuyên đánh giá lại chiến lược với dữ liệu mới và điều chỉnh các tham số theo hành vi thị trường mới nhất để đảm bảo chiến lược vẫn thích ứng.
Các hướng tối ưu hóa trên nhằm nâng cao tính ổn định, khả năng thích ứng và lợi nhuận của chiến lược, đồng thời giảm nhu cầu can thiệp của con người và rủi ro quá phù hợp. Bằng cách thực hiện từng bước các tối ưu hóa này, có thể xây dựng một hệ thống giao dịch thông minh và tự động hơn.
Hệ thống giao dịch tự thích ứng với xu hướng động lượng phân tử đa chiều đại diện cho một phương pháp giao dịch định lượng sáng tạo bằng cách áp dụng các khái niệm phân tử trong lý thuyết thông tin vào thị trường tài chính, nắm bắt tính có trật tự và khả năng dự đoán trong mô hình giá. Ưu điểm cốt lõi của chiến lược này là nó tích hợp các nguyên tắc toán học của nhiều chỉ số kỹ thuật truyền thống, tạo ra một tín hiệu giao dịch đơn giản và rõ ràng, tránh xung đột chỉ số và nhiễu tín hiệu.
Mặc dù chiến lược có khả năng thích ứng và quản lý rủi ro mạnh mẽ, nhưng cũng phải đối mặt với những thách thức như tính nhạy cảm của tham số, tính toán phức tạp và thay đổi cấu trúc thị trường. Bằng cách thực hiện các hướng tối ưu hóa được đề xuất, chẳng hạn như cơ chế tham số thích ứng, phân tích nhiều khung thời gian và tăng cường học máy, bạn có thể nâng cao hơn nữa sự ổn định và hiệu suất lâu dài của chiến lược.
Nhìn chung, đây là một hệ thống giao dịch định lượng có nền tảng lý thuyết vững chắc, được thiết kế tinh tế, phù hợp với các nhà giao dịch có nền tảng lập trình và thống kê để sử dụng trong các thị trường biến động cao. Với sự tối ưu hóa tham số thận trọng và giám sát hệ thống liên tục, chiến lược này có tiềm năng tạo ra lợi nhuận điều chỉnh rủi ro ổn định trong nhiều môi trường thị trường.
/*backtest
start: 2024-08-11 00:00:00
end: 2025-08-09 08:00:00
period: 1d
basePeriod: 1d
exchanges: [{"eid":"Futures_Binance","currency":"ETH_USDT"}]
*/
// @version=6
strategy("Canuck Trading Traders Strategy [Candle Entropy Edition]", overlay=true, default_qty_value = 10)
// Note: Set Properties "Order size" to "100% of equity" for equity-based sizing or fixed contracts (e.g., 100).
// === CETP-Plus Settings ===
cetp_window = input.int(5, "CETP Window", minval=1, maxval=20, group="CETP-Plus Settings")
cetp_bins = input.int(3, "CETP Bins per Dimension", minval=1, maxval=10, group="CETP-Plus Settings")
long_threshold = input.float(0.1, "Long Threshold", minval=0.01, maxval=5.0, step=0.01, group="CETP-Plus Settings")
short_threshold = input.float(-0.1, "Short Threshold", minval=-0.8, maxval=-0.01, step=0.01, group="CETP-Plus Settings")
cetp_k = input.float(0.8, "CETP Momentum Weight", minval=0.1, maxval=5.0, step=0.1, group="CETP-Plus Settings")
mom_scale = input.float(6.0, "Momentum Scale", minval=1.0, maxval=20.0, step=1.0, group="CETP-Plus Settings")
body_weight = input.float(1.0, "Body Ratio Weight", minval=0.0, maxval=2.0, step=0.1, group="CETP-Plus Settings")
upper_weight = input.float(0.8, "Upper Wick Ratio Weight", minval=0.0, maxval=2.0, step=0.1, group="CETP-Plus Settings")
lower_weight = input.float(1.0, "Lower Wick Ratio Weight", minval=0.0, maxval=2.0, step=0.1, group="CETP-Plus Settings")
decay_factor = 0.8 // Hardcoded decay for exponential weighting (recent candles weighted more)
// === Trade Settings ===
min_score_strength = input.float(0.03, "Min CETP Score Strength", minval=0.0, maxval=5, step=0.01, group="Trade Settings")
stop_loss_pct = input.float(0.5, "Stop Loss (%)", minval=0.1, maxval=5.0, step=0.1, group="Trade Settings")
atr_mult = input.float(3.0, "ATR Multiplier", minval=0.5, maxval=10.0, step=0.1, group="Trade Settings")
trail_mult = input.float(5.0, "Trailing ATR Mult", minval=0.5, maxval=10.0, step=0.1, group="Trade Settings")
trail_offset_pct = input.float(1.0, "Trail Start Offset (%)", minval=0.5, maxval=10.0, step=0.1, group="Trade Settings")
min_price_move_mult = input.float(2.0, "Min Price Move ATR Mult (to avoid tiny trades)", minval=0.5, maxval=10.0, step=0.1, group="Trade Settings") // Filter tiny moves
// Indicators (ATR for stops/trails only)
atr = nz(ta.atr(14), 0.0)
// Volatility Filter (CV < 15% to avoid chop)
vol_threshold = ta.stdev(close, 20) / ta.sma(close, 20) * 100
trade_allowed = vol_threshold < 15.0
// Minimum Price Move Filter (candle range > ATR multiple, floored by min tick)
min_price_move = math.max(atr * min_price_move_mult, syminfo.mintick * 10) // Avoid sub-penny moves; 10x tick for robustness
price_move_condition = (high - low) > min_price_move // Fixed: Use high - low instead of ta.range()
// CETP-Plus Calculation (Blended EMA, RSI, ATR, ADX theses)
epsilon = 1e-5
body_ratio = (close - open) / (high - low + epsilon) * body_weight
upper_wick_ratio = (high - math.max(open, close)) / (high - low + epsilon) * upper_weight
lower_wick_ratio = (math.min(open, close) - low) / (high - low + epsilon) * lower_weight
// EMA-like weighting: Exponentially weight recent candles with fixed-size rolling arrays
var float[] body_arr = array.new_float(cetp_window, 0.0)
var float[] upper_arr = array.new_float(cetp_window, 0.0)
var float[] lower_arr = array.new_float(cetp_window, 0.0)
// Shift and decay older values, add new at the end
for i = 0 to cetp_window - 2
array.set(body_arr, i, array.get(body_arr, i + 1) * decay_factor)
array.set(upper_arr, i, array.get(upper_arr, i + 1) * decay_factor)
array.set(lower_arr, i, array.get(lower_arr, i + 1) * decay_factor)
array.set(body_arr, cetp_window - 1, body_ratio)
array.set(upper_arr, cetp_window - 1, upper_wick_ratio)
array.set(lower_arr, cetp_window - 1, lower_wick_ratio)
// Volatility scaling (ATR thesis)
bin_size = 2.0 / cetp_bins * (1 + atr / ta.sma(atr, 14))
hist_size = cetp_bins * cetp_bins * cetp_bins
var int[] hist = array.new_int(hist_size, 0)
array.fill(hist, 0)
for i = 0 to cetp_window - 1
body_val = array.get(body_arr, i)
upper_val = array.get(upper_arr, i)
lower_val = array.get(lower_arr, i)
body_bin = math.max(0, math.min(cetp_bins - 1, math.floor((body_val + 1) / bin_size)))
upper_bin = math.max(0, math.min(cetp_bins - 1, math.floor((upper_val + 1) / bin_size)))
lower_bin = math.max(0, math.min(cetp_bins - 1, math.floor((lower_val + 1) / bin_size)))
bin_idx = body_bin * (cetp_bins * cetp_bins) + upper_bin * cetp_bins + lower_bin
array.set(hist, bin_idx, array.get(hist, bin_idx) + 1)
entropy = 0.0
for i = 0 to hist_size - 1
count = array.get(hist, i)
p = count / cetp_window
if p > 0
entropy := entropy - p * math.log(p)
max_entropy = math.log(hist_size)
norm_entropy = max_entropy > 0 ? entropy / max_entropy : 0.0
// RSI-like momentum bias
avg_gain = ta.rma(math.max(close - close[1], 0), cetp_window)
avg_loss = ta.rma(math.max(close[1] - close, 0), cetp_window)
rsi_bias = avg_loss > 0 ? avg_gain / avg_loss : 1.0
momentum = ta.mom(close, cetp_window) / (close[cetp_window] != 0 ? close[cetp_window] : 1e-5)
momentum_adj = momentum * (1 + rsi_bias)
// ADX-like trend strength (automated and symmetric for bull/bear)
di_plus = ta.rma(math.max(high - high[1], 0), cetp_window) / atr
di_minus = ta.rma(math.max(low[1] - low, 0), cetp_window) / atr
trend_strength = di_plus > di_minus ? 1.2 : (di_minus > di_plus ? 1.2 : 1.0)
// CETP-Plus Score (optimized: no abs on momentum_adj to preserve sign for better short detection)
avg_body = nz(array.avg(body_arr), 0.0)
raw_score = avg_body * (1 - norm_entropy) * (cetp_k + momentum_adj * mom_scale)
cetp_score = nz(raw_score * trend_strength, 0.0)
// Position State
var float entry_price = na
var int bars_held = 0
if barstate.isconfirmed
bars_held := strategy.position_size != 0 ? bars_held + 1 : 0
// Trade Logic: Rely solely on current CETP score for entries/exits/reversals, with min price move filter
if bar_index >= cetp_window and math.abs(cetp_score) > min_score_strength and trade_allowed and price_move_condition
if cetp_score > long_threshold
if strategy.position_size < 0
strategy.close("Short", comment="Reverse to Long")
if strategy.position_size <= 0
strategy.entry("Long", strategy.long)
entry_price := close
sl = entry_price * (1 - stop_loss_pct / 100) - atr * atr_mult
strategy.exit("Long Exit", "Long", stop=sl, trail_points=atr * trail_mult * syminfo.pointvalue, trail_offset=entry_price * (trail_offset_pct / 100))
bars_held := 1
else if cetp_score < short_threshold
if strategy.position_size > 0
strategy.close("Long", comment="Reverse to Short")
if strategy.position_size >= 0
strategy.entry("Short", strategy.short)
entry_price := close
sl = entry_price * (1 + stop_loss_pct / 100) + atr * atr_mult
strategy.exit("Short Exit", "Short", stop=sl, trail_points=atr * trail_mult * syminfo.pointvalue, trail_offset=entry_price * (trail_offset_pct / 100))
bars_held := 1