
Chiến lược này được xây dựng dựa trên chỉ số tương đối năng động ngẫu nhiên của Ells-Fisher, được đưa ra bởi John Ells trong bảng phân tích kiểm soát của ông về cổ phiếu và tương lai. Chiến lược này sử dụng chỉ số Ells-Fisher để đánh giá sức mạnh tương đối của cổ phiếu và kết hợp với các quy tắc giao dịch tùy chỉnh để mua và bán.
Chiến lược này đầu tiên tính toán giá đóng cửa - giá mở cửa, tức là phần thực của cổ phiếu. Sau đó tính toán giá cao - giá thấp, tức là phần đường bóng của cổ phiếu.
Tiếp theo, áp dụng công thức tính toán của chỉ số Ells-Fisher cho RVI, để có được giá trị tín hiệu. Khi giá trị tín hiệu vượt qua giá trị kích hoạt, hãy làm nhiều hơn, khi đi xuống, hãy làm trống. Ngoài ra, cũng có thiết lập dừng cố định và dừng theo dõi để kiểm soát rủi ro.
Chiến lược tổng hợp này sử dụng các đặc điểm động lực của cổ phiếu và các chỉ số ngẫu nhiên, có thể đánh giá hiệu quả về sức mạnh tương đối của thị trường. Thiết kế của chỉ số Erles-Fisher có thể làm giảm tác động của tiếng ồn và tạo ra tín hiệu giao dịch đáng tin cậy hơn. Chỉ số động lực phản ánh xu hướng và biến động của cổ phiếu, là chỉ số động lực.
So với chỉ số động hoặc chỉ số ngẫu nhiên, chiến lược này kết hợp hữu cơ các chỉ số và mô hình để cải thiện chất lượng tín hiệu. Quy tắc dừng lỗ nghiêm ngặt cũng giúp chiến lược này kiểm soát rủi ro trong khi đảm bảo khả năng sinh lợi.
Chiến lược này chủ yếu dựa trên chỉ số Ells-Fisher, khi thị trường đột ngột thay đổi đáng kể, các tham số chỉ số cần được tối ưu hóa để thích ứng với môi trường mới. Nếu tham số chỉ số được thiết lập không đúng cách, sẽ tạo ra tín hiệu sai hoặc tín hiệu chậm trễ.
Ngoài ra, chính chiến lược cũng có một mức độ rủi ro phù hợp với đường cong. Nếu môi trường thị trường trong thử nghiệm và thực tế thay đổi nhiều, hiệu suất của chiến lược có thể bị lệch lớn. Tại thời điểm này, cần điều chỉnh các tham số chiến lược hoặc tối ưu hóa các quy tắc giao dịch để thích ứng với tình trạng thị trường mới.
Chiến lược này có thể được tối ưu hóa hơn nữa ở những khía cạnh sau:
Các tham số của chỉ số Ells-Fisher được tối ưu hóa để làm cho nó nhạy cảm hơn hoặc lọc tiếng ồn.
Sử dụng các thuật toán học máy để mô hình các chỉ số như LSTM để tạo ra tín hiệu giao dịch đáng tin cậy hơn.
Kết hợp với các chỉ số biến động thị trường như ATR để điều chỉnh động khoảng cách dừng lỗ.
Thêm hỗ trợ cho mô hình đa yếu tố, kết hợp các chỉ số kỹ thuật khác và các chỉ số cơ bản để nâng cao chất lượng tín hiệu.
Tối ưu hóa logic mở lỗ, thiết lập các điều kiện ra sân động. Tiến hành công nghệ dừng lỗ và dừng dừng tự động.
Chiến lược này sử dụng các chỉ số tương đối năng động của chỉ số Ells-Fisher để đánh giá xu hướng và điểm yếu của thị trường, thiết lập các cơ chế kiểm soát rủi ro dừng hợp lý. So với chỉ số đơn lẻ, chiến lược này thực hiện kết hợp hữu cơ của nhiều chỉ số và mô hình, có thể lọc tiếng ồn để cung cấp tín hiệu chất lượng cao. Có thể cải thiện hiệu suất của chiến lược thông qua các phương tiện như tối ưu hóa tham số, kết hợp mô hình và điều chỉnh thích nghi.
/*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)