Đây là một chiến lược giao dịch định lượng bao gồm nhiều chỉ số kỹ thuật. Nó kết hợp các đường trung bình động, MACD, Bollinger Bands, RSI và các chỉ số khác để thực hiện mô hình giao dịch tự động dựa trên nhiều yếu tố.
Các tín hiệu giao dịch của chiến lược này đến từ các phần sau:
Khi các chỉ số trên đồng thời phát ra tín hiệu mua hoặc bán, chiến lược sẽ đưa ra quyết định dài hoặc ngắn tương ứng.
Cụ thể, khi đường trung bình động nhanh vượt qua đường trung bình chậm, biểu đồ MACD bắt đầu tăng, chỉ số RSI bật lên từ vùng bán quá mức và giá tiếp cận đường sắt dưới Bollinger Bands, nó được coi là tín hiệu đảo ngược xu hướng cho bước vào dài.
Và khi MA nhanh vượt qua dưới MA chậm, biểu đồ MACD bắt đầu giảm, RSI giảm từ khu vực mua quá mức, và giá đạt đến Bollinger Bands trên cùng, nó được coi là một sự đảo ngược trên cùng ngắn hạn cho bước vào ngắn.
Bằng cách kết hợp các tín hiệu từ nhiều chỉ số, các tín hiệu giả có thể được lọc hiệu quả và sự ổn định của chiến lược có thể được cải thiện.
Ưu điểm lớn nhất của chiến lược này là nó áp dụng mô hình đa yếu tố cho giao dịch, làm tăng độ tin cậy của tín hiệu, sự ổn định và lợi nhuận của chiến lược.
Mô hình đa yếu tố có thể xác minh các tín hiệu giao dịch với nhau và giảm nhiễu từ các tín hiệu giả hiệu quả.
Các chỉ số từ các loại khác nhau có thể nắm bắt các đặc điểm toàn diện hơn về sự biến động của thị trường và đưa ra các đánh giá chính xác hơn.
Sự kết hợp của nhiều chỉ số có thể làm mịn các biến động của các chỉ số riêng lẻ và đảm bảo lợi nhuận ổn định hơn.
Các chỉ số và trọng lượng của chúng trong sự kết hợp có thể được điều chỉnh linh hoạt để điều chỉnh chiến lược cho các điều kiện thị trường khác nhau.
Một số rủi ro của chiến lược này nên được quan tâm:
Sự kết hợp phức tạp của nhiều chỉ số đòi hỏi điều chỉnh và thử nghiệm tham số chính xác, nếu không nó có thể tạo ra các tín hiệu không hợp lệ.
Hiệu suất trên một sản phẩm duy nhất có thể không đủ ổn định. Một danh mục đầu tư bao gồm các sản phẩm phù hợp nên được xây dựng để đa dạng hóa rủi ro.
Các cơ chế kích thước vị trí và dừng lỗ nên được kiểm soát chặt chẽ để hạn chế lỗ trong điều kiện thị trường cực đoan.
Một số hướng chiến lược này có thể được tối ưu hóa:
Kiểm tra sự kết hợp của nhiều chỉ số để tìm ra các thông số tối ưu, chẳng hạn như biến động ngụ ý, khối lượng vv.
Sử dụng các phương pháp học máy để tự động tạo ra sự kết hợp tối ưu của các chỉ số và các tập hợp tham số.
Làm nhiều backtests và tối ưu hóa trên khung thời gian dài hơn, điều chỉnh trọng lượng phù hợp cho các giai đoạn thị trường khác nhau.
Kết hợp các công cụ quản lý rủi ro để kiểm soát lỗ trên các giao dịch đơn lẻ và các vị trí tổng thể một cách nghiêm ngặt.
Chiến lược này tận dụng tối đa những lợi thế của các chỉ số kỹ thuật khác nhau và tạo thành một mô hình đa yếu tố, giúp cải thiện độ chính xác của tín hiệu một cách hiệu quả.
/*backtest start: 2023-12-31 00:00:00 end: 2024-01-30 00:00:00 period: 4h basePeriod: 15m exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}] */ //@version=5 strategy("Математическая Торговая Система с Ишимоку, TP/SL, ADX, RSI, OBV", shorttitle="МТС Ишимоку TP/SL ADX RSI OBV", overlay=true) is_short_enable = input(0, title="Короткие сделки") is_long_enable = input(1, title="Длинные сделки") // Входные параметры для скользящих средних fast_length = input(21, title="Быстрый период") slow_length = input(26, title="Медленный период") // Входные параметры для Ишимоку tenkan_length = input(9, title="Тенкан-сен") kijun_length = input(26, title="Киджун-сен") senkou_length = input(52, title="Сенкоу-спан B") // Входные параметры для ADX adx_length = input(14, title="ADX период") adx_level = input(30, title="ADX уровень") // Входные параметры для RSI rsi_length = input(14, title="RSI период") rsi_overbought = input(70, title="RSI перекупленность") rsi_oversold = input(30, title="RSI перепроданность") // Входные параметры для OBV obv_length = input(14, title="OBV период") // Вычисление скользящих средних fast_ma = ta.sma(close, fast_length) slow_ma = ta.sma(close, slow_length) // Вычисление Ишимоку tenkan_sen = ta.sma(high + low, tenkan_length) / 2 kijun_sen = ta.sma(high + low, kijun_length) / 2 senkou_span_a = (tenkan_sen + kijun_sen) / 2 senkou_span_b = ta.sma(close, senkou_length) // Вычисление ADX [diplus, diminus, adx_value] = ta.dmi(14, adx_length) // Вычисление RSI rsi_value = ta.rsi(close, rsi_length) // Вычисление OBV f_obv() => ta.cum(math.sign(ta.change(close)) * volume) f_obv_1() => ta.cum(math.sign(ta.change(close[1])) * volume[1]) f_obv_2() => ta.cum(math.sign(ta.change(close[2])) * volume[2]) f_obv_3() => ta.cum(math.sign(ta.change(close[3])) * volume[3]) obv_value = f_obv() price_is_up = close[1] > close[3] price_crossover_fast_ma = close > fast_ma fast_ma_is_up = ta.sma(close[1], fast_length) > ta.sma(close[3], fast_length) rsi_is_trand_up = ta.rsi(close[1], rsi_length) > ta.rsi(close[3], rsi_length) rsi_is_upper_50 = rsi_value > 50 obv_is_trand_up = f_obv_1() > f_obv_3() and obv_value > ta.sma(obv_value, obv_length) is_up = price_is_up and price_crossover_fast_ma and fast_ma_is_up and rsi_is_trand_up and rsi_is_upper_50 and obv_is_trand_up fast_ma_is_down = close < fast_ma rsi_is_trend_down = ta.rsi(close[1], rsi_length) < ta.rsi(close[2], rsi_length) rsi_is_crossover_sma = rsi_value < ta.sma(rsi_value, rsi_length) obv_is_trend_down = f_obv_1() < f_obv_2() obv_is_crossover_sma = obv_value < ta.sma(obv_value, obv_length) is_down = fast_ma_is_down and rsi_is_trend_down and rsi_is_crossover_sma and obv_is_trend_down and obv_is_crossover_sma //----------// // MOMENTUM // //----------// ema8 = ta.ema(close, 8) ema13 = ta.ema(close, 13) ema21 = ta.ema(close, 21) ema34 = ta.ema(close, 34) ema55 = ta.ema(close, 55) longEmaCondition = ema8 > ema13 and ema13 > ema21 and ema21 > ema34 and ema34 > ema55 exitLongEmaCondition = ema13 < ema55 shortEmaCondition = ema8 < ema13 and ema13 < ema21 and ema21 < ema34 and ema34 < ema55 exitShortEmaCondition = ema13 > ema55 // ---------- // // OSCILLATORS // // ----------- // rsi = ta.rsi(close, 14) longRsiCondition = rsi < 70 and rsi > 40 exitLongRsiCondition = rsi > 70 shortRsiCondition = rsi > 30 and rsi < 60 exitShortRsiCondition = rsi < 30 // Stochastic length = 14, smoothK = 3, smoothD = 3 kFast = ta.stoch(close, high, low, 14) dSlow = ta.sma(kFast, smoothD) longStochasticCondition = kFast < 80 exitLongStochasticCondition = kFast > 95 shortStochasticCondition = kFast > 20 exitShortStochasticCondition = kFast < 5 // Логика входа и выхода longCondition = longEmaCondition and longRsiCondition and longStochasticCondition and strategy.position_size == 0 exitLongCondition = (exitLongEmaCondition or exitLongRsiCondition or exitLongStochasticCondition) and strategy.position_size > 0 shortCondition = shortEmaCondition and shortRsiCondition and shortStochasticCondition and strategy.position_size == 0 exitShortCondition = (exitShortEmaCondition or exitShortRsiCondition or exitShortStochasticCondition) and strategy.position_size < 0 enter_long = (ta.crossover(close, senkou_span_a) or is_up) and longCondition enter_short = (ta.crossunder(close, senkou_span_a) or is_down) and shortCondition exit_long = ((ta.crossunder(fast_ma, slow_ma) or ta.crossunder(close, senkou_span_b) or enter_short) or exitLongCondition) exit_short = ((ta.crossover(fast_ma, slow_ma) or ta.crossover(close, senkou_span_b) or enter_long) or exitShortCondition) // Выполнение сделок if is_long_enable == 1 strategy.entry("Long", strategy.long, when=enter_long) strategy.close("Long", when=exit_long) if is_short_enable == 1 strategy.entry("Short", strategy.short, when=enter_short) strategy.close("Short", when=exit_short)