
Chiến lược này sử dụng phân phối Gaussian để tính toán Z dựa trên chỉ số di chuyển trung bình 10 chu kỳ của hàm Heckel, sau đó thiết lập ngưỡng cho chỉ số di chuyển trung bình 20 chu kỳ của hàm Z, để xác định vị trí đặt và vị trí trượt dựa trên đường cong.
Tính trung bình di chuyển của chỉ số 10 chu kỳ của giá bán tháo Heckley.
Dựa trên dữ liệu trung bình di chuyển ở trên, tính toán giá trị Z trong 25 chu kỳ. Giá trị Z phản ánh số độ lệch tiêu chuẩn của dữ liệu so với giá trị trung bình, có thể xác định dữ liệu là bình thường hoặc bất thường.
Đường trung bình di chuyển 20 chu kỳ của giá trị Z được tính lại để có được đường cong emaScore. Đường cong này phản ánh xu hướng dài hạn của giá trị Z.
Cài đặt giới hạn trên và dưới dựa trên phân bố dữ liệu của emaScore. Ghi nhận rằng đường cong có thể có một số biến động, ở đây chúng ta chọn 90% và 10% dữ liệu phân bố làm giới hạn.
Làm nhiều hơn khi emscore vượt qua đường trung bình hoặc xuống ngưỡng; khi emscore vượt qua ngưỡng, xuống hoặc cao nhất trong 100 chu kỳ, làm trống.
Ứng dụng hệ thống phân phối Gaussian để đánh giá tính bình thường thông qua giá trị Z, có thể lọc các đột phá giả.
Phóng xạ kép, vận hành đường cong exeScore để xác định xu hướng dài hạn
Thiết lập ngưỡng hợp lý để giảm khả năng giao dịch sai.
Kết hợp các điểm cao nhất và thấp nhất của 100 chu kỳ, bạn có thể nắm bắt cơ hội quay trở lại.
Các giá trị Z được sử dụng kết hợp với đường trung bình di chuyển, nhạy cảm với tham số và cần được tối ưu hóa.
Thresholds được thiết lập có liên quan đến sự hợp lý hay không lớn, quá rộng hoặc quá hẹp sẽ bị triệt tiêu.
Các điểm cao nhất hoặc thấp nhất của một trăm chu kỳ dễ tạo ra tín hiệu sai, điều kiện kích hoạt có thể được nới lỏng thích hợp.
Các nhà nghiên cứu cho rằng, việc sử dụng Helix là một phần của chiến lược này, và cần phải đánh giá liệu nó có phù hợp hay không.
Kiểm tra trung bình di chuyển của các chu kỳ khác nhau, tham số giá trị Z.
Sử dụng phương pháp phân tích tiến bộ để tự động tối ưu hóa tham số.
Thử các phương pháp khác để thiết lập ngưỡng, chẳng hạn như số nhân của chênh lệch chuẩn.
Cải thiện logic phán đoán điểm cao nhất và thấp nhất, ngăn chặn tín hiệu sai.
Thử các loại khác hoặc thay thế cho các loại khác với giá cả điển hình.
Chiến lược này dựa trên tư tưởng của phân phối Gaussian, thiết lập moving average và động threshold thông qua chỉ số kép, đánh giá hiệu quả các trường hợp bất thường giá và tạo ra tín hiệu giao dịch. Ưu điểm chính là có thể lọc các đột phá giả, nắm bắt sự đảo ngược. Tuy nhiên, cài đặt tham số và sử dụng kết hợp có ảnh hưởng lớn đến kết quả, vẫn cần tiếp tục thử nghiệm và tối ưu hóa, tìm kiếm các tham số và kết hợp tốt nhất.
/*backtest
start: 2023-12-26 00:00:00
end: 2024-01-02 00:00:00
period: 5m
basePeriod: 1m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/
// This source code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/
// © jensenvilhelm
// Here is an attempt to create a robust strategy for BTCUSD on a 5 minute chart
// I can't seem to get this code to work the way i want.... if you want to give it a try, please let me know -
// how it goes in comment section.
//@version=5
// Define the strategy settings
strategy("The Z-score", shorttitle="TZS", overlay=true)
// User can set the start date for the strategy
startDate = timestamp("2023 06 01")
// Heikin-Ashi Open, Close, High and Low calculation
haClose = ohlc4
var float haOpen = na
haOpen := na(haOpen[1]) ? (open + close) / 2 : (haOpen[1] + haClose[1]) / 2
haHigh = math.max(nz(haOpen, high), nz(haClose, high), high)
haLow = math.min(nz(haOpen, low), nz(haClose, low), low)
// Function to calculate the Z-Score
z_score(_series, _length) =>
_mean = ta.sma(_series, _length)
_stddev = ta.stdev(_series, _length)
(_series - _mean) / _stddev
// Compute the score and its EMA
score = z_score(ta.ema(haClose, 10), 25)
emaScore = ta.ema(score, 20)
// Calculate lower and upper thresholds using percentiles of EMA
lowerBlue = ta.percentile_linear_interpolation(emaScore, 50, 10)
upperBlue = ta.percentile_linear_interpolation(emaScore, 50, 90)
// Calculate the middle line as 50th percentile
middleLine = ta.percentile_linear_interpolation(emaScore, 50, 50)
// Plot the EMA of the score and the thresholds
plot(emaScore,"The White Line", color=color.white, linewidth=2)
plot(lowerBlue,"Lower Blue Line", linewidth=2)
plot(upperBlue, "Upper Blue Line", linewidth=2)
plot(middleLine, "Middle Yellow Line", linewidth=2, color=color.yellow)
plot(score,"The Z-Score Mixed With EMA 10", color=color.green)
// Calculate highest and lowest EMA score over 100 bars period
highest = ta.highest(emaScore, 100)
lowest = ta.lowest(emaScore, 100)
// Plot highest and lowest EMA score lines
plot(highest, "Highest of emaScore", color=color.red, linewidth=2)
plot(lowest, "Lowest of emaScore", color=color.red, linewidth=2)
// Define entry and exit conditions for long and short positions
longCon = ta.crossover(score, lowerBlue) or ta.crossover(emaScore, middleLine)
addOn = ta.crossover(score, highest)
shortCon = ta.crossunder(emaScore, upperBlue) or ta.crossunder(emaScore, lowerBlue) or ta.crossunder(emaScore, highest)
// Execute trading logic based on conditions and after the start date
if (time >= startDate)
if longCon
strategy.entry("Long", strategy.long)
if shortCon
strategy.close("Long")
if addOn
strategy.entry("LongNR2", strategy.long)
if shortCon
strategy.close("LongNR2")
if shortCon
strategy.entry("Short", strategy.short)
if longCon
strategy.close("Short")