Dựa trên chiến lược chỉ số chuyển động hai chiều


Ngày tạo: 2024-02-18 10:00:22 sửa đổi lần cuối: 2024-02-18 10:00:22
sao chép: 0 Số nhấp chuột: 620
1
tập trung vào
1617
Người theo dõi

Dựa trên chiến lược chỉ số chuyển động hai chiều

Tổng quan

Chiến lược này tạo ra tín hiệu mua bằng cách tính toán chỉ số chuyển động hai chiều DI +, DI - và chỉ số hướng trung bình ADX, kết hợp với chỉ số chuyển động trung bình EMA. Khi DI + trên DI + và ADX cao hơn 20, nó tạo ra tín hiệu mua; khi DI + dưới DI + và ADX cao hơn 25, nó tạo ra tín hiệu bán.

Nguyên tắc chiến lược

  1. Tính toán DI+, DI- và ADX

    • Gọi hàm ta.dmi () để tính DI+, DI- và ADX
    • DI+/DI - Phản ánh định hướng giá
    • ADX phản ánh mức độ thay đổi giá trung bình
  2. Tính toán chỉ số trung bình di chuyển EMA

    • Tính toán EMA bằng cách gọi hàm my_ema () tùy chỉnh
    • EMA có thể hiệu quả làm mịn dữ liệu giá
  3. Tạo tín hiệu giao dịch

    • Tín hiệu mua: DI+ trên DI- và ADX> 20 và giá đóng cửa> EMA
      • Các nhà phân tích cho biết xu hướng tăng giá và sự thay đổi lớn
    • Tín hiệu bán: DI- dưới DI+ và ADX> 25 và giá đóng cửa < EMA
      • Báo cáo về xu hướng giảm giá và sự thay đổi lớn
  4. Giao dịch dừng lỗ

    • Mua dừng lỗ: Đeo DI + trên DI và ADX> 30
      • Giải thích xu hướng giá đảo ngược
    • Bán dừng lỗ: DI+ dưới DI- và ADX> 30
      • Giải thích xu hướng giá đảo ngược

Tóm lại, chiến lược này kết hợp các chỉ số chuyển động với các chỉ số xu hướng, tạo ra tín hiệu giao dịch khi giá có xu hướng mạnh. Đồng thời thiết lập các điều kiện dừng lỗ để hạn chế tổn thất.

Phân tích lợi thế

  1. Sử dụng ID kép để tránh tín hiệu giả
    • Một DI đơn dễ tạo ra tín hiệu sai, kết hợp DI+ và DI- đảm bảo xu hướng
  2. Điều kiện ADX đảm bảo biến động giá lớn hơn
    • Chỉ giao dịch khi giá tăng lên để tránh thị trường bị chấn động
  3. Điều kiện EMA hợp tác với DI
    • EMA có thể xác định hiệu quả xu hướng đường dài giữa giá
  4. Điều kiện dừng lỗ nghiêm ngặt
    • Hạn chế thiệt hại kịp thời để tránh thiệt hại lớn

Phân tích rủi ro

  1. Thường xuyên dừng lỗ
    • Nếu xảy ra một cú sốc mạnh, các lỗ hổng sẽ quá thường xuyên.
  2. Tùy thuộc tham số
    • Các tham số DI và ADX cần được tối ưu hóa để tìm sự kết hợp tốt nhất
  3. Tỷ lệ giao dịch thấp
    • Điều kiện giao dịch nghiêm ngặt sẽ làm giảm tần suất giao dịch

Có thể được tối ưu hóa bằng cách mở rộng mức dừng lỗ, điều chỉnh các tham số, hoặc thêm các điều kiện lọc bổ sung để tăng tần suất giao dịch.

Hướng tối ưu hóa

  1. Tối ưu hóa tham số
    • Tối ưu hóa các tham số DI và ADX để tìm ra sự kết hợp tham số tốt nhất
  2. Thêm bộ lọc
    • Các điều kiện lọc tín hiệu như thêm số lượng giao dịch, lệch ra
  3. Mở rộng Stop Loss
    • Giảm mức độ lỗ hổng và giảm chi phí.

Tóm tắt

Chiến lược này tích hợp các chỉ số động lượng với các chỉ số phân tích xu hướng, tạo ra tín hiệu giao dịch khi giá có xu hướng mạnh. Thiết lập các điều kiện dừng nghiêm ngặt để kiểm soát rủi ro. Có thể tăng hiệu quả chiến lược hơn nữa bằng cách tối ưu hóa tham số, thêm bộ lọc tín hiệu và mở rộng đúng mức độ dừng.

Mã nguồn chiến lược
/*backtest
start: 2024-01-01 00:00:00
end: 2024-01-31 23:59:59
period: 4h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

// This Pine Script™ code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/
// © Tamil_FNO_Trader

//@version=5
strategy("Overlay Signals by TFOT", overlay=true)

// Calculate DMI
len = input.int(14, minval=1, title="DI Length")
lensig = input.int(14, title="ADX Smoothing", minval=1, maxval=50)
[diplus, diminus, adx] = ta.dmi(len, lensig)

// Get EMA
emalen = input.int(26, minval=1, title = "EMA Length")
emasrc = input.source(close, title = "EMA Source")

my_ema(src, length) =>
    alpha = 2 / (length + 1)
    sum = 0.0
    sum := na(sum[1]) ? src : alpha * src + (1 - alpha) * nz(sum[1])
EMA2 = my_ema(emasrc, emalen)

// Variables
var bool buycondition1 = false
var bool sellcondition1 = false

var int firstbuybar = na
var int firstsellbar = na

var int buyexitbar = na
var int sellexitbar = na

var bool buyexit1 = false
var bool sellexit1 = false

// Buy & Sell Conditions
buycondition1 := (ta.crossover(diplus, diminus)) and (adx > 20) and (close > EMA2) and na(firstbuybar)
sellcondition1 := (ta.crossover(diminus, diplus)) and (adx > 25) and (close < EMA2) and na(firstsellbar)

buyexit1 := ta.crossover(diminus, diplus) and (adx > 30) and na(buyexitbar)
sellexit1 := ta.crossover(diplus, diminus) and (adx > 30) and na(sellexitbar)

if buycondition1
    if(na(firstbuybar))
        firstbuybar := bar_index
        buyexitbar := na
        firstsellbar := na
        strategy.entry("Buy", strategy.long)

if sellcondition1
    if(na(firstsellbar))
        firstsellbar := bar_index
        sellexitbar := na
        firstbuybar := na
        strategy.entry("Sell", strategy.short)

if buyexit1 and not na(firstbuybar)
    if(na(buyexitbar))
        buyexitbar := bar_index
        firstbuybar := na
        firstsellbar := na
        strategy.close("Buy")

if sellexit1 and not na(firstsellbar)
    if(na(sellexitbar))
        sellexitbar := bar_index
        firstsellbar := na
        firstbuybar := na
        strategy.close("Sell")

// Plot signals on chart
hl = input.bool(defval = true, title = "Signal Labels")

plotshape(hl and buycondition1 and bar_index == firstbuybar ? true : na, "Buy", style = shape.labelup, location = location.belowbar, color = color.green, text = "Buy", textcolor = color.white, size = size.tiny)
plotshape(hl and sellcondition1 and bar_index == firstsellbar ? true : na, "Sell", style = shape.labeldown, location = location.abovebar, color = color.red, text = "Sell", textcolor = color.white, size = size.tiny)

plotshape(hl and buyexit1 and bar_index == buyexitbar ? true : na, "Buy Exit", style = shape.labelup, location = location.belowbar, color = color.red, text = "Buy X", textcolor = color.white, size = size.tiny)
plotshape(hl and sellexit1 and bar_index == sellexitbar ? true : na, "Sell Exit", style = shape.labeldown, location = location.abovebar, color = color.red, text = "Sell X", textcolor = color.white, size = size.tiny)