Chiến lược này dựa trên chỉ số kênh hàng hóa (CCI), nhằm mục đích mua dài trong điều kiện bán quá mức và mua ngắn trong điều kiện mua quá mức. Nó cũng tùy chọn sử dụng bộ lọc Moving Average (EMA) để chỉ giao dịch theo hướng xu hướng. Chiến lược cũng cung cấp mức dừng lỗ dựa trên tỷ lệ phần trăm cố định hoặc Average True Range (ATR) và lấy lợi nhuận.
Sử dụng chỉ số CCI để xác định xu hướng thị trường
CCI đo đạc động lượng bằng cách so sánh giá hiện tại với giá trung bình trong một khoảng thời gian.
CCI trên 150 là quá mua, dưới -100 là quá bán
Tùy chọn sử dụng bộ lọc EMA
Chỉ mua dài khi giá trên EMA, và ngắn khi dưới EMA
Sử dụng EMA để xác định hướng xu hướng, tránh giao dịch ngược xu hướng
Cung cấp hai loại dừng lỗ và lấy lợi nhuận
Số lượng cổ phiếu được tính theo các loại cổ phiếu khác nhau.
Stop loss và take profit dựa trên ATR: Sử dụng nhân ATR cho stop loss, tính toán take profit dựa trên tỷ lệ phần thưởng rủi ro
Điều kiện nhập cảnh
Đi dài khi CCI vượt trên -100
Đi ngắn khi CCI vượt dưới 150
Nếu EMA được kích hoạt, chỉ nhập khi giá nằm ở bên phải của EMA
Điều kiện xuất cảnh
Khóa vị trí khi dừng lỗ hoặc lấy lợi nhuận
Định vị đóng cửa khi CCI quay trở lại khu vực mua/bán quá mức
Chuyện âm mưu
Sử dụng CCI mua quá mức/bán quá mức để vào, một cách sử dụng cổ điển của CCI
EMA tùy chọn đảm bảo giao dịch theo xu hướng, tránh đảo ngược
Cung cấp hai loại dừng lỗ / lấy lợi nhuận để linh hoạt
Đóng trên tín hiệu CCI một lần nữa khóa lợi nhuận đảo ngược
Biểu đồ làm nổi bật các tín hiệu CCI rõ ràng
Logic đơn giản và rõ ràng, dễ hiểu và tối ưu hóa
CCI có hiệu quả chậm, có thể bỏ lỡ sự đảo ngược hoặc đưa ra tín hiệu sai
Các thông số EMA sai có thể bỏ lỡ xu hướng hoặc làm cho chiến lược không hiệu quả
Phân phần cố định dừng lỗ/lấy lợi nhuận ít thích nghi hơn với những thay đổi trên thị trường
ATR dừng lỗ / lấy lợi nhuận nhạy cảm với thời gian ATR, nên tối ưu hóa
Rủi ro rút vốn lớn hơn, nên điều chỉnh kích thước vị trí
Hiệu suất khác nhau trong các điều kiện thị trường, đánh giá lại các thông số
Đánh giá thời gian CCI để tìm kết hợp các tham số tối ưu
Kiểm tra các giai đoạn EMA khác nhau để ước tính xu hướng tốt nhất
Điều chỉnh stop loss/take profit cho tỷ lệ rủi ro/lợi nhuận tối ưu
Thêm các bộ lọc khác như âm lượng để tránh thêm tín hiệu sai
Kết hợp với đường xu hướng / mô hình biểu đồ để xác nhận mô hình
Thêm các quy tắc định kích thước vị trí như kích thước cố định để kiểm soát rút tiền
Kiểm tra ngược trên các điều kiện thị trường khác nhau, điều chỉnh năng động
Chiến lược sử dụng các nguyên tắc mua quá mức / bán quá mức CCI cổ điển để vào. Bộ lọc EMA kiểm soát giao dịch xu hướng. Hai loại dừng lỗ / lấy lợi nhuận được cung cấp cho sự linh hoạt. Chế hoạch hóa làm nổi bật các tín hiệu rõ ràng. Logic đơn giản và rõ ràng, dễ hiểu và tối ưu hóa. Có thể cải thiện thêm thông qua điều chỉnh tham số, thêm bộ lọc, kiểm soát rủi ro vv.
/*backtest start: 2023-09-24 00:00:00 end: 2023-10-24 00:00:00 period: 1h basePeriod: 15m 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/ // © alifer123 //@version=5 // strategy("CCI+EMA Strategy with Percentage or ATR TP/SL [Alifer]", shorttitle = "CCI_EMA_%/ATR_TP/SL", overlay=false, // initial_capital=10000, default_qty_type=strategy.percent_of_equity, default_qty_value=10, commission_type=strategy.commission.percent, commission_value=0.045) length = input(14, "CCI Length") overbought = input.int(150, step = 10, title = "Overbought") oversold = input.int(-140, step = 10, title = "Oversold") src = hlc3 ma = ta.sma(src, length) cci = (src - ma) / (0.015 * ta.dev(src, length)) // EMA useEMA = input(true, "Use EMA", tooltip = "Only enters long when price is above the EMA, only enters short when price is below the EMA") emaLength = input(55, "EMA Length") var float ema = na if useEMA ema := ta.ema(src, emaLength) // Take Profit and Stop Loss Method tpSlMethod_percentage = input(true, "Percentage TP/SL", group="TP/SL Method") tpSlMethod_atr = input(false, "ATR TP/SL", group="TP/SL Method") // Percentage-based Take Profit and Stop Loss tp_percentage = input.float(10.0, title="Take Profit (%)", step=0.1, group="TP/SL Method") sl_percentage = input.float(10.0, title="Stop Loss (%)", step=0.1, group="TP/SL Method") // ATR-based Take Profit and Stop Loss atrLength = input(20, title="ATR Length", group="TP/SL Method") atrMultiplier = input(4, title="ATR SL Multiplier", group="TP/SL Method") riskRewardRatio = input(2, title="Risk Reward Ratio", group="TP/SL Method") // Calculate TP/SL levels based on the selected method, or leave them undefined if neither method is selected longTP = tpSlMethod_percentage ? strategy.position_avg_price * (1 + tp_percentage / 100) : na longSL = tpSlMethod_percentage ? strategy.position_avg_price * (1 - sl_percentage / 100) : na shortTP = tpSlMethod_percentage ? strategy.position_avg_price * (1 - tp_percentage / 100) : na shortSL = tpSlMethod_percentage ? strategy.position_avg_price * (1 + sl_percentage / 100) : na if tpSlMethod_atr longSL := strategy.position_avg_price - ta.atr(atrLength) * atrMultiplier longTP := ((strategy.position_avg_price - longSL) * riskRewardRatio) + strategy.position_avg_price shortSL := strategy.position_avg_price + ta.atr(atrLength) * atrMultiplier shortTP := ((strategy.position_avg_price - shortSL) * riskRewardRatio) - strategy.position_avg_price // Enter long position when CCI crosses below oversold level and price is above EMA longCondition = ta.crossover(cci, oversold) and (not useEMA or close > ema) if longCondition strategy.entry("Buy", strategy.long) // Enter short position when CCI crosses above overbought level and price is below EMA shortCondition = ta.crossunder(cci, overbought) and (not useEMA or close < ema) if shortCondition strategy.entry("Sell", strategy.short) // Close long positions with Take Profit or Stop Loss if strategy.position_size > 0 strategy.exit("Long Exit", "Buy", limit=longTP, stop=longSL) // Close short positions with Take Profit or Stop Loss if strategy.position_size < 0 strategy.exit("Short Exit", "Sell", limit=shortTP, stop=shortSL) // Close positions when CCI crosses back above oversold level in long positions or below overbought level in short positions if ta.crossover(cci, overbought) strategy.close("Buy") if ta.crossunder(cci, oversold) strategy.close("Sell") // Plotting color_c = cci > overbought ? color.red : (cci < oversold ? color.green : color.white) plot(cci, "CCI", color=color_c) hline(0, "Middle Band", color=color.new(#787B86, 50)) obband = hline(overbought, "OB Band", color=color.new(#78867a, 50)) osband = hline(oversold, "OS Band", color=color.new(#867878, 50)) fill(obband, osband, color=color.new(#787B86, 90))