Chiến lược này sử dụng các chỉ số động lực bao gồm Chỉ số hướng trung bình (ADX), Chỉ số chuyển động theo hướng (DMI) và Chỉ số kênh hàng hóa (CCI) để xác định hướng xu hướng và theo dõi xu hướng.
Tính toán các chỉ số ADX, DMI và CCI.
Xác định hướng xu hướng.
Đi vào vị trí.
Vị trí xuất cảnh với stop loss.
ADX lọc giao dịch trong thời gian xu hướng yếu.
DMI làm giảm các lỗi trong xác định xu hướng.
Việc tham gia quá mức CCI cải thiện thời gian và giảm rủi ro.
Kết hợp các chỉ số động lượng cải thiện độ chính xác.
Đặt giới hạn dừng lỗ cho mỗi giao dịch.
Lấy giày giày khi ADX giảm, nâng ngưỡng ADX để đảm bảo xu hướng đủ mạnh.
DMI tụt lại phía sau xu hướng ở giai đoạn đầu.
Tần số giao dịch CCI cao, mở rộng phạm vi CCI để lọc tiếng ồn.
Xem xét chiến lược trung lập thị trường khi dài và ngắn, để bảo hiểm rủi ro vị trí tổng thể.
Tối ưu hóa các thông số ADX để cân bằng lọc tiếng ồn và xu hướng bắt.
Tối ưu hóa các thông số DMI để cân bằng độ trễ và độ nhạy.
Tối ưu hóa các thông số CCI để cân bằng tần suất giao dịch và bắt kịp các sự đảo ngược.
Kiểm tra thêm hoặc sửa đổi các chỉ số để kết hợp tốt hơn. ví dụ: MACD, KDJ.
Thử nghiệm trên các sản phẩm khác nhau để tìm phù hợp nhất.
Tối ưu hóa kích thước vị trí để kiểm soát rủi ro trong khi duy trì theo dõi xu hướng.
Chiến lược hợp lý sử dụng ADX cho xu hướng, DMI cho hướng và CCI cho sự đảo ngược. Nhưng các tham số cần tối ưu hóa và kích thước vị trí để kiểm soát rủi ro. Được điều chỉnh và áp dụng đúng cách cho các sản phẩm xu hướng, nó có thể mang lại lợi nhuận ổn định. Các nhà giao dịch nên điều chỉnh năng động cho thị trường thay đổi.
/*backtest start: 2023-10-02 00:00:00 end: 2023-11-01 00:00:00 period: 4h basePeriod: 15m exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}] */ //@version=4 strategy("ADX Strategy", currency = "USD", initial_capital = 1000, overlay=true) adxlen = input(9, title="ADX Smoothing") dilen = input(14, title="DI Length") ADX_Entry = input(25, title="ADX Entry") dirmov(len) => up = change(high) down = -change(low) truerange = rma(tr, len) plus = fixnan(100 * rma(up > down and up > 0 ? up : 0, len) / truerange) minus = fixnan(100 * rma(down > up and down > 0 ? down : 0, len) / truerange) [plus, minus] adx(dilen, adxlen) => [plus, minus] = dirmov(dilen) sum = plus + minus adx = 100 * rma(abs(plus - minus) / (sum == 0 ? 1 : sum), adxlen) [adx, plus, minus] [sig, up, down] = adx(dilen, adxlen) cci_length = input(20, minval=1, title="CCI Length") cci_ma = sma(close, cci_length) cci = (close - cci_ma) / (0.015 * dev(close, cci_length)) stop_loss = syminfo.mintick * 100 open_longs = strategy.position_size > 0 open_shorts = strategy.position_size < 0 possible_bull = false possible_bull := not open_longs ? (possible_bull[1] and not crossunder(up,down) ? true : false) : false possible_bear = false possible_bear := not open_shorts ? (possible_bear[1] and not crossunder(down,up) ? true : false) : false bool bull_entry = crossover(up,down) if(bull_entry and up < ADX_Entry and cci < 0) possible_bull := true bull_entry := false if(possible_bull and up > ADX_Entry and cci > -100) bull_entry := true bool bear_entry = crossover(down,up) if(bear_entry and down < ADX_Entry and cci > 0) possible_bear := true bear_entry := false if(possible_bear and down >= ADX_Entry and cci < 100) bear_entry := true strategy.entry("Short", strategy.short, qty = 1,comment="Short", stop=high[1] - stop_loss, when = bear_entry) strategy.entry("Long", strategy.long, qty = 1, comment="Long", stop=low[1] - stop_loss, when = bull_entry ) strategy.close_all(when = (open_shorts and (crossover(up,down) or crossover(sig,down))) or (open_longs and ( crossover(down,up) or crossover(sig, up))))