Chiến lược phân tích xu hướng thống kê đa băng tần

BB SMA EMA SD PL QB
Ngày tạo: 2025-02-20 16:45:59 sửa đổi lần cuối: 2025-02-20 16:45:59
sao chép: 1 Số nhấp chuột: 348
2
tập trung vào
319
Người theo dõi

Chiến lược phân tích xu hướng thống kê đa băng tần Chiến lược phân tích xu hướng thống kê đa băng tần

Tổng quan

Đây là một chiến lược giao dịch dựa trên phân tích nhiều dải thống kê và xu hướng. Chiến lược này kết hợp với việc sử dụng dải Brin, dải phân số và quy luật dẫn để xác định các vùng hỗ trợ / kháng cự quan trọng và sử dụng chênh lệch tiêu chuẩn dưới của dải phân số trên để làm tín hiệu kích hoạt để xác định thời gian vào và ra.

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

Nguyên tắc cốt lõi của chiến lược là nắm bắt xu hướng thị trường thông qua sự giao thoa của nhiều dải thống kê. Nó bao gồm một số thành phần quan trọng như sau:

  1. Hệ thống Brin Belt - được sử dụng để xác định phạm vi biến động của giá, chuyển sang cảnh báo màu vàng khi giá vượt qua đường ray.
  2. Hệ thống số phân số - tính toán số phân số trên và dưới của giá, được sử dụng để đánh giá xác suất giá cực.
  3. Hệ thống băng tần - tính toán mức độ nổi bật dựa trên lợi nhuận lịch sử, được sử dụng để đo lường quá mua quá bán.
  4. Hệ thống kích hoạt - Đường chênh lệch tiêu chuẩn dưới các phân số trên làm tín hiệu kích hoạt chính, giá duy trì trên đường này được coi là tín hiệu báo giá.
  5. Hệ thống xác nhận - lọc tín hiệu giả bằng cách đặt số dòng xác nhận K liên tục.

Lợi thế chiến lược

  1. Tín hiệu ổn định - Việc sử dụng chồng lên nhau nhiều dải thống kê có thể làm giảm hiệu quả tín hiệu giả.
  2. Khả năng thích ứng tốt - Chiến lược có thể thích ứng với các chu kỳ thời gian và điều kiện thị trường khác nhau.
  3. Kiểm soát rủi ro hoàn hảo - phân chia các khu vực rủi ro thông qua nhiều thống kê, đồng thời có cơ chế dừng lỗ.
  4. Tính linh hoạt về tham số - cung cấp nhiều tùy chọn tham số có thể được tối ưu hóa theo các đặc điểm thị trường khác nhau.
  5. Hiển thị rõ ràng - Đường màu của các loại chỉ số được phân biệt rõ ràng, tín hiệu giao dịch trực quan.

Rủi ro chiến lược

  1. Rủi ro bị tụt hậu - Các chỉ số thống kê có thể bị tụt hậu, có thể bỏ lỡ điểm nhập cảnh tốt nhất.
  2. Thị trường sốc không thuận lợi - có thể tạo ra quá nhiều tín hiệu giao dịch trong thị trường sốc ngang.
  3. Tính nhạy cảm của tham số - Sự khác biệt lớn trong hiệu quả của các kết hợp tham số khác nhau, cần phải được tối ưu hóa nhiều lần.
  4. Năng lượng tính toán lớn - Tính toán thực tế của nhiều chỉ số thống kê đòi hỏi nguồn lực tính toán lớn.
  5. Tùy thuộc vào môi trường thị trường - Luật thống kê có thể không hiệu quả trong môi trường thị trường cực đoan.

Hướng tối ưu hóa chiến lược

  1. Tham gia các tham số động - Điều chỉnh các tham số tự động theo biến động của thị trường.
  2. Tăng khả năng đánh giá môi trường thị trường - Thêm các chỉ số cường độ xu hướng để lọc các tín hiệu thị trường xung đột.
  3. Tối ưu hóa hiệu quả tính toán - đơn giản hóa một phần của quá trình tính toán, giảm lượng tài nguyên.
  4. Kiểm soát rủi ro tốt hơn - thêm các điều kiện dừng lỗ và chiến lược quản lý vị trí.
  5. Tăng khả năng thích ứng - Phát triển hệ thống tối ưu hóa tham số thích ứng.

Tóm tắt

Đây là một chiến lược theo dõi xu hướng tổng hợp kết hợp nhiều phương pháp thống kê. Với sự phối hợp của các dải Brin, dải số phân và dải rốt, có thể nắm bắt được xu hướng thị trường tốt hơn, đồng thời có khả năng kiểm soát rủi ro tốt. Mặc dù có một số sự chậm trễ và khó khăn trong việc tối ưu hóa các tham số, chiến lược này có giá trị thực tế tốt và triển vọng phát triển thông qua cải tiến và tối ưu hóa liên tục.

Mã nguồn chiến lược
/*backtest
start: 2024-02-21 00:00:00
end: 2025-02-18 08:00:00
period: 1h
basePeriod: 1h
exchanges: [{"eid":"Binance","currency":"BNB_USDT"}]
*/

//@version=6
strategy("Multi-Band Comparison Strategy with Separate Entry/Exit Confirmation", overlay=true, 
         default_qty_type=strategy.percent_of_equity, default_qty_value=10, 
         initial_capital=5000, currency=currency.USD)

// === Inputs ===

// Basic Parameters
length         = input.int(20, "Length (SMA)", minval=1)
boll_mult      = input.float(1.0, "Bollinger Band Multiplier", minval=0.1, step=0.1)
upper_quantile = input.float(0.95, "Upper Quantile (0.0-1.0)", minval=0.0, maxval=1.0)
lower_quantile = input.float(0.05, "Lower Quantile (0.0-1.0)", minval=0.0, maxval=1.0)

// Separate confirmation inputs
entry_confirmBars = input.int(1, "Entry Confirmation Bars", minval=1, tooltip="Number of consecutive bars the entry condition must hold")
exit_confirmBars  = input.int(1, "Exit Confirmation Bars",  minval=1, tooltip="Number of consecutive bars the exit condition must hold")

// Toggle Visibility for Bands
show_lower_boll  = input.bool(false, "Show Lower Bollinger Band", tooltip="Enable or disable the lower Bollinger Band")
show_upper_boll  = input.bool(true,  "Show Upper Bollinger Band", tooltip="Enable or disable the upper Bollinger Band")
show_lower_quant = input.bool(true, "Show Lower Quantile Band", tooltip="Enable or disable the lower Quantile Band")
show_upper_quant = input.bool(true,  "Show Upper Quantile Band", tooltip="Enable or disable the upper Quantile Band")
show_upper_power = input.bool(true,  "Show Upper Power-Law Band", tooltip="Enable or disable the upper Power-Law Band")
show_lower_power = input.bool(false, "Show Lower Power-Law Band", tooltip="Enable or disable the lower Power-Law Band")
show_quant_std   = input.bool(true,  "Show Standard Deviation around Quantile Bands", tooltip="Enable or disable standard deviation lines around Quantile Bands")

// Individual Toggles for Std Dev Lines
show_upper_quant_std_up   = input.bool(true,  "Show Upper Quantile + Std Dev", tooltip="Enable or disable the Upper Quantile + Std Dev line")
show_upper_quant_std_down = input.bool(true,  "Show Upper Quantile - Std Dev", tooltip="Enable or disable the Upper Quantile - Std Dev line")
show_lower_quant_std_up   = input.bool(false, "Show Lower Quantile + Std Dev", tooltip="Enable or disable the Lower Quantile + Std Dev line")
show_lower_quant_std_down = input.bool(true,  "Show Lower Quantile - Std Dev", tooltip="Enable or disable the Lower Quantile - Std Dev line")

// Moving Average Toggles
show_ema = input.bool(false, "Show EMA", tooltip="Enable or disable the Exponential Moving Average")
show_sma = input.bool(false, "Show SMA", tooltip="Enable or disable the Simple Moving Average")

// EMA Parameters
ema_length = input.int(50, minval=1, title="EMA Length")
ema_source = input.source(close, title="EMA Source")

// === Data Handling ===

// Create persistent arrays to store data
var float[] data_array   = array.new_float()
var float[] return_array = array.new_float()

// Update the data array with the latest close prices
if array.size(data_array) < length
    array.push(data_array, close)
else
    array.shift(data_array)
    array.push(data_array, close)

// Update the return array with the latest returns
returns = close / close[1] - 1
if array.size(return_array) < length
    array.push(return_array, returns)
else
    array.shift(return_array)
    array.push(return_array, returns)

// === Helper Function ===

// Function to calculate a custom percentile
f_percentile(arr, quantile) =>
    arr_sorted = array.copy(arr)
    array.sort(arr_sorted, order.ascending)
    index = math.round((array.size(arr_sorted) - 1) * quantile)
    array.get(arr_sorted, index)

// === Calculations ===

// Bollinger Bands Calculation
sma        = ta.sma(close, length)
stdev      = ta.stdev(close, length)
boll_upper = sma + boll_mult * stdev
boll_lower = sma - boll_mult * stdev

// Power-Law Bands Calculation
var float power_upper = na
var float power_lower = na
if array.size(return_array) == length
    power_upper := f_percentile(return_array, upper_quantile)
    power_lower := f_percentile(return_array, lower_quantile)
var float power_upper_band = na
var float power_lower_band = na
if not na(power_upper) and not na(power_lower)
    power_upper_band := close * (1 + power_upper)
    power_lower_band := close * (1 + power_lower)

// Quantile Bands Calculation
var float quant_upper = na
var float quant_lower = na
if array.size(data_array) == length
    quant_upper := f_percentile(data_array, upper_quantile)
    quant_lower := f_percentile(data_array, lower_quantile)

// Standard Deviation around Quantile Bands
quant_upper_std_up   = quant_upper + stdev
quant_upper_std_down = quant_upper - stdev
quant_lower_std_up   = quant_lower + stdev
quant_lower_std_down = quant_lower - stdev

// === Color Calculations ===

// For the upper Bollinger band, color it yellow when price is above it, black otherwise.
upper_boll_color = close > boll_upper ? color.yellow : color.black

// The entry/exit trigger is based on the lower std dev band of the upper quantile band.
// It "turns green" (i.e. favorable for entry) when the price is above this level,
// and "turns red" (i.e. unfavorable, triggering an exit) when price is below it.
triggerCondition = close > quant_upper_std_down

// For plotting purposes, define the color of the lower std dev band of the upper quantile band:
triggerColor = triggerCondition ? color.green : color.red

// (Other color definitions remain for the additional bands.)
upper_power_color = (not na(power_upper_band) and not na(quant_upper_std_up) and power_upper_band > quant_upper_std_up) ? color.new(#FF00FF, 0) : color.black
upper_quant_color = (not na(quant_upper) and not na(power_upper_band) and power_upper_band > quant_upper) ? color.new(#FFAE00, 0) : color.rgb(50, 50, 50)
upper_quant_std_down_color = (not na(quant_upper_std_down) and close > quant_upper_std_down) ? color.green : color.red
lower_quant_std_down_color = (not na(quant_lower_std_down) and close > quant_lower_std_down) ? color.rgb(24, 113, 0, 44) : color.red
lower_quant_color = (ta.cross(close, quant_lower) or close == quant_lower) ? color.red : color.rgb(0, 238, 255)

// For demonstration, a variable to toggle a color on the Bollinger crossover.
var color upper_quant_std_up_color = color.black
if ta.crossover(close, boll_upper)
    upper_quant_std_up_color := color.yellow
if ta.crossunder(close, boll_upper)
    upper_quant_std_up_color := color.black

// === Confirmation Bars Logic with Separate Counters Based on Trigger Condition ===

// Use the trigger condition (based on the lower std dev band of the upper quantile band)
// for entry/exit confirmation.
var int entryCounter = 0
var int exitCounter  = 0

// When triggerCondition is true (price above quant_upper_std_down) the "green" state holds.
entryCounter := triggerCondition ? entryCounter + 1 : 0
// When triggerCondition is false (price below quant_upper_std_down) the "red" state holds.
exitCounter  := not triggerCondition ? exitCounter + 1 : 0

// === Strategy Orders ===

// Enter long when triggerCondition has been true for at least entry_confirmBars bars and no position is active.
if (entryCounter >= entry_confirmBars) and (strategy.position_size <= 0)
    strategy.entry("Long", strategy.long)

// Exit long when triggerCondition has been false for at least exit_confirmBars bars and a long position is active.
if (exitCounter >= exit_confirmBars) and (strategy.position_size > 0)
    strategy.close("Long")

// === Plotting ===

// Plot Bollinger Bands
plot(show_upper_boll ? boll_upper : na, color=upper_boll_color, title="Bollinger Upper", linewidth=2)
plot(show_lower_boll ? boll_lower : na, color=color.red, title="Bollinger Lower", linewidth=1)

// Plot Power-Law Bands
plot(show_upper_power ? power_upper_band : na, color=upper_power_color, title="Power-Law Upper", linewidth=1)
plot(show_lower_power ? power_lower_band : na, color=color.rgb(255, 59, 248), title="Power-Law Lower", linewidth=1)

// Plot Quantile Bands
plot(show_upper_quant ? quant_upper : na, color=upper_quant_color, title="Quantile Upper", linewidth=1)
plot(show_lower_quant ? quant_lower : na, color=lower_quant_color, title="Quantile Lower", linewidth=1)

// Plot Standard Deviation around Quantile Bands
plot(show_quant_std and show_upper_quant and show_upper_quant_std_up ? quant_upper_std_up : na, color=upper_quant_std_up_color, title="Quantile Upper + Std Dev", linewidth=2)
plot(show_quant_std and show_upper_quant and show_upper_quant_std_down ? quant_upper_std_down : na, color=upper_quant_std_down_color, title="Quantile Upper - Std Dev", linewidth=2)
plot(show_quant_std and show_lower_quant and show_lower_quant_std_up ? quant_lower_std_up : na, color=color.green, title="Quantile Lower + Std Dev", linewidth=1)
plot(show_quant_std and show_lower_quant and show_lower_quant_std_down ? quant_lower_std_down : na, color=lower_quant_std_down_color, title="Quantile Lower - Std Dev", linewidth=1)

// Also plot the trigger line (lower std dev band of upper quantile band) with its own color
plot(show_quant_std ? quant_upper_std_down : na, color=triggerColor, title="Trigger (Lower Std Dev of Upper Quantile)", linewidth=2)

// Plot SMA for reference
plot(show_sma ? sma : na, color=color.rgb(0, 24, 132), title="SMA", linewidth=3)

// Plot EMA for reference
ema_value = ta.ema(ema_source, ema_length)
plot(show_ema ? ema_value : na, color=color.rgb(147, 0, 0), title="EMA", linewidth=2)