Ehlers Fisher Stochastic Relative Vigor Index Chiến lược

Tác giả:ChaoZhang, Ngày: 2023-12-22 12:04:23
Tags:

img

Tổng quan

Chiến lược này dựa trên chỉ số chỉ số sức mạnh tương đối của Ehlers Fisher được đề xuất bởi John Ehlers trong cuốn sách của ông Phân tích Cybernetic cho cổ phiếu và tương lai. Chiến lược sử dụng chỉ số Ehlers Fisher để đánh giá sức mạnh tương đối của cổ phiếu và kết hợp nó với các quy tắc giao dịch tùy chỉnh cho các mục nhập và xuất phát.

Chiến lược logic

Chiến lược đầu tiên tính giá đóng cửa - giá mở cửa, đó là cơ thể của nến. Sau đó nó tính giá cao - giá thấp, đó là cái bóng của nến. Bằng cách tính tổng và trung bình của hai phần này, nó có được động lực của cổ phiếu. Sau đó bằng cách chia động lực với sự biến động của cổ phiếu, nó có được Chỉ số sức mạnh tương đối (RVI).

Tiếp theo, công thức Ehlers Fisher được áp dụng trên RVI để có được giá trị tín hiệu. Nó đi dài khi tín hiệu vượt qua kích hoạt, và đi ngắn khi tín hiệu vượt qua dưới kích hoạt. Ngoài ra, stop loss cố định và trailing stop loss được thực hiện để kiểm soát rủi ro.

Phân tích lợi thế

Chỉ số này tích hợp các đặc điểm động lực và chỉ số chứng khoán, có thể xác định hiệu quả sức mạnh tương đối trên thị trường.

So với việc sử dụng chỉ số động lực hoặc chỉ số ngẫu nhiên duy nhất, chiến lược này kết hợp các chỉ số và mô hình một cách hữu cơ, có thể cải thiện chất lượng tín hiệu. Các quy tắc dừng lỗ nghiêm ngặt cũng cho phép chiến lược kiểm soát rủi ro trong khi đảm bảo lợi nhuận.

Phân tích rủi ro

Chiến lược này chủ yếu dựa trên chỉ số Ehlers Fisher. Khi có những thay đổi mạnh mẽ trên thị trường, các thông số của chỉ số cần được tối ưu hóa để thích nghi với môi trường mới. Nếu các thông số được đặt không đúng cách, nó có thể tạo ra các tín hiệu không chính xác hoặc tín hiệu tụt lại.

Ngoài ra, có một số mức độ rủi ro phù hợp đường cong vốn có trong chính chiến lược. Nếu môi trường thị trường trong backtesting và giao dịch trực tiếp thay đổi đáng kể, hiệu suất của chiến lược có thể lệch phần lớn. Trong trường hợp này, các thông số chiến lược cần phải được điều chỉnh và các quy tắc giao dịch đòi hỏi tối ưu hóa để phù hợp với điều kiện thị trường mới.

Hướng dẫn tối ưu hóa

Chiến lược này có thể được tối ưu hóa thêm trong các khía cạnh sau:

  1. Tối ưu hóa các thông số của chỉ số Ehlers Fisher để có độ nhạy cao hơn hoặc lọc tiếng ồn.

  2. Mô hình hóa chỉ số bằng các thuật toán học máy như LSTM để tạo ra các tín hiệu giao dịch đáng tin cậy hơn.

  3. Kết hợp các chỉ số biến động thị trường như ATR để điều chỉnh năng động khoảng cách dừng lỗ.

  4. Thêm hỗ trợ cho các mô hình đa yếu tố, kết hợp các chỉ số kỹ thuật và cơ bản khác để cải thiện chất lượng tín hiệu.

  5. Tối ưu hóa các vị trí mở / đóng logic với tiêu chí nhập / ra năng động.

Kết luận

Chiến lược này sử dụng chỉ số Ehlers Fisher Stochastic RVI để xác định xu hướng và sức mạnh của thị trường, và thiết lập các cơ chế dừng lỗ hợp lý để kiểm soát rủi ro. So với các chỉ số duy nhất, chiến lược này kết hợp nhiều chỉ số và mô hình một cách hữu cơ, có thể lọc ra tiếng ồn và cung cấp tín hiệu chất lượng cao.


/*backtest
start: 2022-12-15 00:00:00
end: 2023-12-21 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=3
strategy("Ehlers Fisher Stochastic Relative Vigor Index Strategy", overlay = false, default_qty_type = strategy.percent_of_equity, default_qty_value = 100.0, pyramiding = 1, commission_type = strategy.commission.percent, commission_value = 0.1)
p = input(10, title = "Length")
FisherStoch(src, len) =>
    val1 = stoch(src, src, src, len) / 100
    val2 = (4 * val1 + 3 * val1[1] + 2 * val1[2] + val1[3]) / 10
    FisherStoch = 0.5 * log((1 + 1.98 * (val2 - 0.5)) / (1 - 1.98 * (val2 - 0.5))) / 2.64

CO = close - open
HL = high - low

value1 = (CO + 2 * CO[1] + 2 * CO[2] + CO[3]) / 6
value2 = (HL + 2 * HL[1] + 2 * HL[2] + HL[3]) / 6

num = sum(value1, p)
denom = sum(value2, p)

RVI = denom != 0 ? num / denom : 0

signal = FisherStoch(RVI, p)
trigger = signal[1]
oppositeTrade = input(true)
barsSinceEntry = 0
barsSinceEntry := nz(barsSinceEntry[1]) + 1
if strategy.position_size == 0
    barsSinceEntry := 0
if ((crossover(signal, trigger) and not oppositeTrade) or (oppositeTrade and crossunder(signal, trigger))) and abs(signal) > 2 / 2.64
    strategy.entry("Long", strategy.long)
    barsSinceEntry := 0
if ((crossunder(signal, trigger) and not oppositeTrade) or (oppositeTrade and crossover(signal, trigger))) and abs(signal) > 2 / 2.64
    strategy.entry("Short", strategy.short)
    barsSinceEntry := 0
if strategy.openprofit < 0 and barsSinceEntry > 8
    strategy.close_all()
    barsSinceEntry := 0
    
hline(0, title="ZeroLine", color=gray) 
signalPlot = plot(signal, title = "Signal", color = blue)
triggerPlot = plot(trigger, title = "Trigger", color = green)
fill(signalPlot, triggerPlot, color = signal < trigger ? red : lime, transp = 50)

Thêm nữa