Đây là một chiến lược theo xu hướng dựa trên nhiều chỉ số trung bình chuyển động nhân tố (EMA) và chỉ số kênh hàng hóa (CCI). Chiến lược sử dụng EMA vượt qua từ nhiều khoảng thời gian để xác định những thay đổi xu hướng tiềm năng, kết hợp với chỉ số CCI để xác nhận điều kiện thị trường mua quá mức hoặc bán quá mức, do đó cải thiện độ chính xác của thời gian nhập cảnh. Chiến lược cũng bao gồm các cơ chế lấy lợi nhuận và dừng lỗ năng động dựa trên thời gian và giá để quản lý rủi ro và khóa lợi nhuận.
Chiến lược chủ yếu dựa trên các yếu tố chính sau:
Multiple EMA Crossovers: Sử dụng EMA 8, 12, 24 và 72 giai đoạn. Khi EMA ngắn hơn (8, 12, 24) đồng thời vượt trên EMA 72 giai đoạn, nó được coi là tín hiệu dài tiềm năng; ngược lại là đúng đối với các tín hiệu ngắn.
Đảm bảo chỉ số CCI: Sử dụng chỉ số CCI 20 giai đoạn, xác nhận các điều kiện mua quá mức khi CCI trên 150 và các điều kiện bán quá mức khi dưới -150.
Điều kiện nhập cảnh:
Động thái lấy lợi nhuận và dừng lỗ:
Quản lý vị trí: Chiến lược sử dụng giao dịch vị trí đầy đủ, sử dụng 100% số tiền tài khoản để giao dịch.
Cơ chế xác nhận nhiều lần: Sự kết hợp của nhiều đường chéo EMA và chỉ số CCI làm giảm hiệu quả tác động của tín hiệu sai, cải thiện độ chính xác nhập.
Cơ chế gia nhập linh hoạt: Chiến lược xem xét cả các giao dịch chéo một lần và giao dịch chéo trong một cửa sổ thời gian, thích nghi với môi trường thị trường khác nhau.
Quản lý rủi ro năng động: Tỷ lệ lợi nhuận và dừng lỗ khác nhau được thiết lập dựa trên các chế độ đầu vào khác nhau, cân bằng lợi nhuận và rủi ro tốt hơn.
Khả năng theo dõi xu hướng: Sử dụng nhiều đường chéo EMA để nắm bắt hiệu quả những thay đổi xu hướng trung và dài hạn.
lọc thị trường hỗn loạn: Phán quyết mua quá mức và bán quá mức của chỉ số CCI giúp tránh giao dịch thường xuyên trên các thị trường hỗn loạn.
Sự chậm trễ: Cả EMA và CCI đều là các chỉ số chậm trễ, có thể không phản ứng đủ nhanh trong các thị trường biến động.
Giao dịch thường xuyên: Trong các thị trường hỗn loạn, nó có thể tạo ra nhiều tín hiệu phá vỡ sai, dẫn đến giao dịch thường xuyên và tăng chi phí giao dịch.
Rủi ro vị trí đầy đủ: Sử dụng giao dịch vị trí 100% có thể mang lại rủi ro rút vốn đáng kể.
Stop-Loss tỷ lệ phần trăm cố định: Trong các thị trường biến động cao, stop-loss tỷ lệ phần trăm cố định có thể thoát khỏi xu hướng thuận lợi quá sớm.
Tùy thuộc vào dữ liệu lịch sử: Hiệu suất chiến lược có thể bị ảnh hưởng bởi dữ liệu lịch sử và có thể cần tối ưu hóa lại tham số khi điều kiện thị trường trong tương lai thay đổi.
Giới thiệu các chỉ số biến động: Xem xét thêm chỉ số ATR (Mức trung bình thực sự) để điều chỉnh mức lợi nhuận và dừng lỗ dựa trên biến động thị trường, thích nghi với môi trường thị trường khác nhau.
Tối ưu hóa quản lý vị trí: Đưa ra các cơ chế quản lý vị trí năng động để điều chỉnh kích thước vị trí dựa trên sức mạnh xu hướng và dung nạp rủi ro tài khoản.
Thêm các điều kiện lọc: Xem xét thêm các chỉ số như khối lượng và sức mạnh xu hướng để lọc thêm các tín hiệu giao dịch và cải thiện tỷ lệ thắng.
Tối ưu hóa tham số: Sử dụng các thuật toán di truyền hoặc phương pháp tìm kiếm lưới để tối ưu hóa các tham số như thời gian EMA và ngưỡng CCI để cải thiện khả năng thích nghi chiến lược trong các môi trường thị trường khác nhau.
Thêm nhận dạng chế độ thị trường: Phát triển một mô-đun nhận dạng trạng thái thị trường ( xu hướng, hỗn loạn, biến động cao) để điều chỉnh các tham số chiến lược hoặc tạm dừng giao dịch dựa trên các trạng thái thị trường khác nhau.
Chiến lược Multi-EMA và CCI Crossover Trend Following là một hệ thống giao dịch định lượng kết hợp phân tích kỹ thuật với quản lý rủi ro năng động. Thông qua sự kết hợp của nhiều EMA crossover và chỉ số CCI, chiến lược này có thể nắm bắt hiệu quả xu hướng thị trường trong khi quản lý rủi ro thông qua các cơ chế gia nhập linh hoạt và cài đặt dừng lỗ và lợi nhuận năng động. Mặc dù chiến lược có một số rủi ro vốn có, chẳng hạn như chậm trễ và tiềm năng rút vốn cao từ giao dịch vị trí đầy đủ, nhưng nó có thể cải thiện đáng kể sự ổn định và khả năng thích nghi thông qua việc tối ưu hóa và cải thiện hơn nữa, chẳng hạn như giới thiệu điều chỉnh biến động, quản lý vị trí năng động và công nhận thị trường. Nhìn chung, đây là một khuôn khổ chiến lược có nền tảng vững chắc và tiềm năng tạo ra lợi nhuận ổn định trong các môi trường thị trường khác nhau.
/*backtest start: 2019-12-23 08:00:00 end: 2024-09-24 08:00:00 period: 1d basePeriod: 1d exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}] */ //@version=5 strategy("EMA & CCI Strategy", overlay=true, default_qty_type=strategy.percent_of_equity, default_qty_value=100) // Параметры EMA ema8_length = 8 ema12_length = 12 ema24_length = 24 ema72_length = 72 // Расчет EMA ema8 = ta.ema(close, ema8_length) ema12 = ta.ema(close, ema12_length) ema24 = ta.ema(close, ema24_length) ema72 = ta.ema(close, ema72_length) // Параметры CCI cci_length = 20 cci_overbought = 150 cci_oversold = -150 // Параметры тейк-профита и стоп-лосса takeProfitPercent = input.float(1.5, title="Take Profit (%)", step=0.1) stopLossPercent = input.float(0.5, title="Stop Loss (%)", step=0.1) takeProfitPercentTime = input.float(0.5, title="Take Profit (%) for Time-based", step=0.1) stopLossPercentTime = input.float(0.2, title="Stop Loss (%) for Time-based", step=0.1) max_wait_bars = input.float(2, title="Max wait candles", step=1) // Расчет CCI cci = ta.cci(close, cci_length) // Состояние открытой позиции sz = strategy.position_size // Флаги для отслеживания пересечений EMA вверх var int ema8_cross_index_up = na var int ema12_cross_index_up = na var int ema24_cross_index_up = na // Флаги для отслеживания пересечений EMA вниз var int ema8_cross_index_down = na var int ema12_cross_index_down = na var int ema24_cross_index_down = na // Проверка пересечения EMA с 72 вверх и обновление индекса пересечения if (ta.crossover(ema8, ema72)) ema8_cross_index_up := bar_index if (ta.crossover(ema12, ema72)) ema12_cross_index_up := bar_index if (ta.crossover(ema24, ema72)) ema24_cross_index_up := bar_index // Проверка пересечений EMA вниз и обновление индекса пересечения if (ta.crossunder(ema8, ema72)) ema8_cross_index_down := bar_index if (ta.crossunder(ema12, ema72)) ema12_cross_index_down := bar_index if (ta.crossunder(ema24, ema72)) ema24_cross_index_down := bar_index // Условия пересечения за одну свечу (лонг и шорт) cross_condition_one_candle_long = (na(ema8_cross_index_up) == false and (bar_index - ema8_cross_index_up) == 0) and (na(ema12_cross_index_up) == false and (bar_index - ema12_cross_index_up) == 0) and (na(ema24_cross_index_up) == false and (bar_index - ema24_cross_index_up) == 0) cross_condition_one_candle_short = (na(ema8_cross_index_down) == false and (bar_index - ema8_cross_index_down) == 0) and (na(ema12_cross_index_down) == false and (bar_index - ema12_cross_index_down) == 0) and (na(ema24_cross_index_down) == false and (bar_index - ema24_cross_index_down) == 0) // Условия пересечения в течение указанного времени (лонг и шорт) cross_condition_within_time_long = (not na(ema8_cross_index_up) and (bar_index - ema8_cross_index_up) <= max_wait_bars) and (not na(ema12_cross_index_up) and (bar_index - ema12_cross_index_up) <= max_wait_bars) and (not na(ema24_cross_index_up) and (bar_index - ema24_cross_index_up) <= max_wait_bars) cross_condition_within_time_short = (not na(ema8_cross_index_down) and (bar_index - ema8_cross_index_down) <= max_wait_bars) and (not na(ema12_cross_index_down) and (bar_index - ema12_cross_index_down) <= max_wait_bars) and (not na(ema24_cross_index_down) and (bar_index - ema24_cross_index_down) <= max_wait_bars) // Условие для открытия лонга long_condition_one = cross_condition_one_candle_long and cci > cci_overbought and close > ema72 long_condition_time = cross_condition_within_time_long and cci > cci_overbought and close > ema72 // Условие для открытия шорта short_condition_one = cross_condition_one_candle_short and cci < cci_oversold and close < ema72 short_condition_time = cross_condition_within_time_short and cci < cci_oversold and close < ema72 // Вход в лонг if (long_condition_one and sz == 0) strategy.entry(id='Long_one', direction=strategy.long) if (long_condition_time and sz == 0) strategy.entry(id='Long_time', direction=strategy.long) // Вход в шорт if (short_condition_one and sz == 0) strategy.entry(id='Short_one', direction=strategy.short) if (short_condition_time and sz == 0) strategy.entry(id='Short_time', direction=strategy.short) // Вычисление цен тейк-профита и стоп-лосса для лонга if (sz > 0 and strategy.opentrades.entry_id(0) == 'Long_one') entryPriceLong = strategy.opentrades.entry_price(0) takeProfitPriceLong = entryPriceLong * (1 + takeProfitPercent / 100) stopLossPriceLong = entryPriceLong * (1 - stopLossPercent / 100) strategy.exit("Close long one", "Long_one", limit=takeProfitPriceLong, stop=stopLossPriceLong) ema8_cross_index_up := na ema12_cross_index_up := na ema24_cross_index_up := na if (sz > 0 and strategy.opentrades.entry_id(0) == 'Long_time') entryPriceLongTime = strategy.opentrades.entry_price(0) takeProfitPriceLongTime = entryPriceLongTime * (1 + takeProfitPercentTime / 100) stopLossPriceLongTime = entryPriceLongTime * (1 - stopLossPercentTime / 100) strategy.exit("Close long time", "Long_time", limit=takeProfitPriceLongTime, stop=stopLossPriceLongTime) ema8_cross_index_up := na ema12_cross_index_up := na ema24_cross_index_up := na // Вычисление цен тейк-профита и стоп-лосса для шорта if (sz < 0 and strategy.opentrades.entry_id(0) == 'Short_one') entryPriceShort = strategy.opentrades.entry_price(0) takeProfitPriceShort = entryPriceShort * (1 - takeProfitPercent / 100) stopLossPriceShort = entryPriceShort * (1 + stopLossPercent / 100) strategy.exit("Close short one", "Short_one", limit=takeProfitPriceShort, stop=stopLossPriceShort) ema8_cross_index_down := na ema12_cross_index_down := na ema24_cross_index_down := na if (sz < 0 and strategy.opentrades.entry_id(0) == 'Short_time') entryPriceShortTime = strategy.opentrades.entry_price(0) takeProfitPriceShortTime = entryPriceShortTime * (1 - takeProfitPercentTime / 100) stopLossPriceShortTime = entryPriceShortTime * (1 + stopLossPercentTime / 100) strategy.exit("Close short time", "Short_time", limit=takeProfitPriceShortTime, stop=stopLossPriceShortTime) ema8_cross_index_down := na ema12_cross_index_down := na ema24_cross_index_down := na // Отображение EMA на графике plot(ema8, title="EMA 8", color=color.blue, linewidth=2) plot(ema12, title="EMA 12", color=color.orange, linewidth=2) plot(ema24, title="EMA 24", color=color.green, linewidth=2) plot(ema72, title="EMA 72", color=color.red, linewidth=2) // Вывод CCI в подвале //plot(cci, title="CCI", color=color.purple) //hline(100, "CCI 150", color=color.green) //hline(-100, "CCI -150", color=color.red) //hline(0, "CCI 0", color=color.gray) // Отладочная информация //plotshape(series=long_condition_one, location=location.belowbar, color=color.lime, style=shape.labelup, title="Long Condition") //plotshape(series=cross_condition_one_candle_long, location=location.belowbar, color=color.blue, style=shape.triangleup, title="Cross Condition Long") //plotshape(series=long_condition_time, location=location.belowbar, color=#e6d700, style=shape.labelup, title="Long Condition Time") //plotshape(series=cross_condition_within_time_long, location=location.belowbar, color=#a21dbd, style=shape.triangleup, title="Cross Condition Time Long") //plotshape(series=short_condition_one, location=location.abovebar, color=color.red, style=shape.labeldown, title="Short Condition") //plotshape(series=cross_condition_one_candle_short, location=location.abovebar, color=color.blue, style=shape.triangledown, title="Cross Condition Short") //plotshape(series=short_condition_time, location=location.abovebar, color=#e6d700, style=shape.labeldown, title="Short Condition Time") //plotshape(series=cross_condition_within_time_short, location=location.abovebar, color=#a21dbd, style=shape.triangledown, title="Cross Condition Time Short")