Chiến lược giao dịch quyết định chỉ số đà là một chiến lược theo xu hướng. Nó xây dựng một chỉ số đà bằng cách sử dụng trung bình động nhân đôi và kết hợp nó với chỉ số tỷ lệ thay đổi giá để tạo ra các tín hiệu giao dịch. Khi chỉ số đà tăng, nó tạo ra các tín hiệu dài. Khi chỉ số đà giảm, nó tạo ra các tín hiệu ngắn. Chiến lược này phù hợp với các nhà giao dịch muốn theo dõi xu hướng trung hạn trên thị trường.
Chiến lược này sử dụng dao động điểm quyết định dựa trên đường trung bình di chuyển nhân tố hai để đo đạc động lực. Đầu tiên nó tính toán tỷ lệ thay đổi giá hàng ngày, sau đó sử dụng đường trung bình di chuyển nhân tố hai 31 ngày và 20 ngày để làm mịn mịn tỷ lệ thay đổi giá riêng biệt. Cuối cùng nó sử dụng đường trung bình di chuyển mịn 9 ngày để phát ra tín hiệu giao dịch. Khi đường nhanh nằm trên đường chậm, nó chỉ ra thị trường tăng. Khi đường nhanh nằm dưới đường chậm, nó chỉ ra thị trường gấu.
Chiến lược này cũng giới thiệu một chỉ số tỷ lệ thay đổi giá để tránh các tín hiệu sai trong các thị trường bên cạnh. Cụ thể, nó tính toán tỷ lệ thay đổi giá phần trăm trong 30 ngày qua và đánh giá liệu thị trường có hoạt động thông qua đường trung bình động của nó hay không.
Chiến lược này kết hợp chỉ số động lực và chỉ số tỷ lệ thay đổi giá, có thể xác định hiệu quả xu hướng trung hạn và tránh giao dịch thường xuyên trên các thị trường biến động. So với các chiến lược theo xu hướng đơn giản như trung bình động, nó có thể làm giảm đáng kể khả năng giao dịch sai. Ngoài ra, rủi ro được kiểm soát bằng cách thiết lập các điểm dừng lỗ để cắt giảm lỗ trong thời gian và kiểm soát hiệu quả mỗi lỗ giao dịch.
Chiến lược này chủ yếu dựa trên giao dịch xu hướng trung dài hạn, không thể nắm bắt được biến động giá ngắn hạn. Khi có một sự biến động thị trường mạnh, điểm dừng lỗ có thể bị phá vỡ, dẫn đến tổn thất lớn hơn. Ngoài ra, cài đặt tham số không phù hợp cũng có thể ảnh hưởng đến chiến lược. Ví dụ, nếu các tham số trung bình chuyển động nhân tố kép được đặt quá ngắn, xác suất giao dịch sai sẽ tăng lên.
Để ngăn ngừa rủi ro, điểm dừng lỗ có thể được điều chỉnh thích hợp để mở rộng phạm vi dừng lỗ. Khi một sự chuyển động thị trường đột ngột xảy ra, chiến lược có thể tạm thời tắt để tránh khả năng dừng lỗ bị phá vỡ. Để điều chỉnh tham số, nên thực hiện kiểm tra ngược chi tiết để chọn các tham số tối ưu.
Chiến lược có thể được tối ưu hóa trong các khía cạnh sau:
Thêm các chỉ số lọc khác như chỉ số biến động để tránh giao dịch trong thời gian biến động thị trường mạnh.
Thêm các mô hình học máy để hỗ trợ đánh giá hướng và sức mạnh xu hướng, có thể cải thiện độ chính xác tín hiệu.
Hãy thử các chỉ số động lực khác nhau như chỉ số sức mạnh tương đối, dao động Stochastic để tối ưu hóa thời gian vào và ra.
Trong giao dịch trực tiếp, điều chỉnh động các tham số kết hợp với các điều kiện thị trường gần đây để theo đuổi sự kết hợp các tham số tối ưu.
Chiến lược giao dịch quyết định chỉ số động lực thường là một chiến lược theo xu hướng trung dài lâu dài ổn định. Nó xác định hiệu quả xu hướng và tránh các giao dịch sai bằng cách kết hợp chỉ số động lực trung bình chuyển động nhân tố kép và chỉ số thay đổi tỷ lệ giá. Trong khi đó, nó kiểm soát rủi ro bằng cách thiết lập các điểm dừng lỗ. Nếu các tham số được điều chỉnh đúng cách và kết quả kiểm tra lại là tốt, nó phù hợp với các nhà đầu tư trung dài hạn theo đuổi lợi nhuận dư thừa. Tất nhiên, các nhà giao dịch vẫn cần phải nhận thức được rủi ro do biến động thị trường mạnh đến chiến lược.
/*backtest start: 2022-12-08 00:00:00 end: 2023-11-10 00:00:00 period: 1d basePeriod: 1h exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}] */ //@version=4 strategy("Decision BF", overlay=false, initial_capital=10000, default_qty_type=strategy.percent_of_equity, default_qty_value=100, commission_type=strategy.commission.percent, commission_value=0.075) /////////////// Time Frame /////////////// testStartYear = input(2017, "Backtest Start Year") testStartMonth = input(1, "Backtest Start Month") testStartDay = input(1, "Backtest Start Day") testPeriodStart = timestamp(testStartYear,testStartMonth,testStartDay, 0, 0) testStopYear = input(2019, "Backtest Stop Year") testStopMonth = input(12, "Backtest Stop Month") testStopDay = input(31, "Backtest Stop Day") testPeriodStop = timestamp(testStopYear,testStopMonth,testStopDay, 0, 0) testPeriod() => true /////////////// Decision /////////////// src = input(ohlc4, title="Source") length1 = input(31, title="First Smoothing") length2 = input(20, title="Second Smoothing") siglength = input(9, title="Signal Smoothing") fr = input(true, title="Fill Region") calc_csf(src, length) => sm = 2.0 / length csf = 0.0 csf := (src - nz(csf[1])) * sm + nz(csf[1]) csf i = (src / nz(src[1], src)) * 100 pmol2 = calc_csf(i - 100, length1) pmol = calc_csf(10 * pmol2, length2) pmols = ema(pmol, siglength) d = pmol - pmols duml = plot(fr ? (d > 0 ? pmol : pmols) : na, style=plot.style_circles, color=color.yellow, linewidth=0, title="DummyL") hc = d > 0 ? d > d[1] ? color.lime : color.green : d < d[1] ? color.red : color.orange ///////////// Rate Of Change ///////////// source = close roclength = input(30, minval=1) pcntChange = input(7, minval=1) roc = 100 * (source - source[roclength]) / source[roclength] emaroc = ema(roc, roclength / 2) isMoving() => emaroc > (pcntChange / 2) or emaroc < (0 - (pcntChange / 2)) /////////////// Strategy /////////////// long = d > 0 and isMoving() short = d < 0 and isMoving() last_long = 0.0 last_short = 0.0 last_long := long ? time : nz(last_long[1]) last_short := short ? time : nz(last_short[1]) long_signal = crossover(last_long, last_short) short_signal = crossover(last_short, last_long) last_open_long_signal = 0.0 last_open_short_signal = 0.0 last_open_long_signal := long_signal ? open : nz(last_open_long_signal[1]) last_open_short_signal := short_signal ? open : nz(last_open_short_signal[1]) last_long_signal = 0.0 last_short_signal = 0.0 last_long_signal := long_signal ? time : nz(last_long_signal[1]) last_short_signal := short_signal ? time : nz(last_short_signal[1]) in_long_signal = last_long_signal > last_short_signal in_short_signal = last_short_signal > last_long_signal last_high = 0.0 last_low = 0.0 last_high := not in_long_signal ? na : in_long_signal and (na(last_high[1]) or high > nz(last_high[1])) ? high : nz(last_high[1]) last_low := not in_short_signal ? na : in_short_signal and (na(last_low[1]) or low < nz(last_low[1])) ? low : nz(last_low[1]) sl_inp = input(2.0, title='Stop Loss %') / 100 tp_inp = input(5000.0, title='Take Profit %') / 100 take_level_l = strategy.position_avg_price * (1 + tp_inp) take_level_s = strategy.position_avg_price * (1 - tp_inp) since_longEntry = barssince(last_open_long_signal != last_open_long_signal[1]) since_shortEntry = barssince(last_open_short_signal != last_open_short_signal[1]) slLong = in_long_signal ? strategy.position_avg_price * (1 - sl_inp) : na slShort = strategy.position_avg_price * (1 + sl_inp) long_sl = in_long_signal ? slLong : na short_sl = in_short_signal ? slShort : na /////////////// Execution /////////////// if testPeriod() strategy.entry("Long", strategy.long, when=long) strategy.entry("Short", strategy.short, when=short) strategy.exit("L Ex", "Long", stop=long_sl, limit=take_level_l, when=since_longEntry > 0) strategy.exit("S Ex", "Short", stop=short_sl, limit=take_level_s, when=since_shortEntry > 0) /////////////// Plotting /////////////// sigl = plot(false ? na : pmols, title="PMO Signal", color=color.gray, linewidth=2, title="Signal") mdl = plot(false ? na : pmol, title="PMO", color=color.black, linewidth=2, title="PMO") fill(duml, sigl, color.green, transp=20, title="PosFill") fill(duml, mdl, color.red, transp=20, title="NegFill") bgcolor(isMoving() ? long ? color.lime : short ? color.red : na : color.white, transp=70) bgcolor(long_signal ? color.lime : short_signal ? color.red : na, transp=50)