Chiến lược giao dịch đột phá phạm vi biến động lịch sử


Ngày tạo: 2023-09-21 20:38:29 sửa đổi lần cuối: 2023-09-21 20:38:29
sao chép: 1 Số nhấp chuột: 677
1
tập trung vào
1617
Người theo dõi

Tổng quan

Chiến lược này dựa trên các khu vực biến động lịch sử của giá để xác định tín hiệu giao dịch. Nó tính toán chênh lệch giữa giá cao nhất và giá thấp nhất trong một chu kỳ nhất định và tạo khu vực biến động bằng đường trung bình di chuyển.

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

Chỉ số cốt lõi của chiến lược này là tỷ lệ biến động lịch sử của giá.

  1. Tính chênh lệch giữa giá cao nhất và giá thấp nhất trong quá khứ của N gốc Bar, được ghi là HL

  2. Tính trung bình của giá cao nhất và giá thấp nhất trong quá khứ N gốc Bar (avg ((H, L))

  3. Tỷ lệ dao động = HL / avg (H, L)

Trong đó, N là tham số “Volatility Length”.

Sau đó, tính toán theo đường ray:

Đường lên = hiện tại gần + hiện tại gần * tỷ lệ biến động

Đường đi xuống = hiện tại gần - hiện tại gần * tỷ lệ biến động

Các đường ray trên và dưới được xử lý bằng phẳng thông qua đường thẳng WMA, tham số là “Average Length”.

Khi giá phá vỡ đường mòn, hãy làm nhiều hơn; khi giá phá vỡ đường mòn, hãy làm trống.

Tín hiệu của nhà kho được đưa ra dựa trên tham số “Exit Type”:

  1. Khi Exit Type là Volatility MA, giá sẽ quay trở lại mức phẳng trung bình của WMA;

  2. Khi Exit Type là Range Crossover, giá sẽ quay trở lại và giảm xuống.

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

  • Sử dụng biến động giá để nắm bắt xu hướng
  • Phương pháp xử lý đồng nhất WMA giúp cho khoảng cách ổn định và đáng tin cậy hơn
  • Sự đột phá trong thị trường sẽ giúp bạn nắm bắt được các điểm thay đổi của xu hướng
  • Quay trở lại đường bằng hoặc lên xuống đường có thể dừng lại kịp thời
  • Các tham số có thể được tối ưu hóa và điều chỉnh cho các thị trường khác nhau

Rủi ro chiến lược

  • Bị phá vỡ khu vực có nguy cơ tăng trở lại
  • Có thể mất nhiều tiền nếu xu hướng thay đổi
  • WMA trung bình đôi khi không đủ nhạy cảm để nhận ra xu hướng biến đổi
  • Không dễ để tối ưu hóa cho các tham số, đòi hỏi rất nhiều thử và sai
  • Rủi ro rút tiền cao hơn, cần quản lý tài chính cẩn thận

Các biện pháp sau có thể làm giảm nguy cơ:

  • Tối ưu hóa tham số để làm cho khoảng cách ổn định và đáng tin cậy hơn
  • Tham gia các chỉ số khác để tránh đà tăng trở lại
  • Giảm SIZE giao dịch, tập trung vào quản lý vốn
  • Cân nhắc gia nhập cơ chế tái nhập học

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

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

  1. Tối ưu hóa tham số

Kiểm tra các tham số khác nhau của Length để tìm ra sự kết hợp tốt nhất.

  1. Kết hợp các chỉ số khác

Ví dụ, khi giá phá vỡ đường ray, nếu MACD cũng đồng thời Gold Forks, chỉ cần nhập vào làm nhiều hơn.

  1. Tối ưu hóa phương thức dừng lỗ

Có thể được tối ưu hóa cho tracking stop loss với tính linh hoạt, thay vì chỉ đơn giản là break-through stop loss

  1. Thêm cơ chế tái nhập học

Sau khi dừng lỗ, nếu xu hướng tiếp tục, bạn có thể đặt điều kiện nhập lại và theo dõi lại xu hướng.

  1. Tối ưu hóa quản lý vị trí

Các vị trí giao dịch có thể được điều chỉnh động theo biến động của thị trường.

Tóm tắt

Chiến lược này nói chung là phù hợp với hành vi theo xu hướng, định hướng và cường độ của xu hướng thông qua đường ray và đường ray xuống của tỷ lệ biến động, và kết hợp với đường trung bình WMA để tạo ra một khu vực giao dịch đáng tin cậy hơn, do đó tạo ra điểm mua và bán đột phá. Tuy nhiên, cũng có một số vấn đề, chẳng hạn như định xu hướng bị tụt hậu, có thể cải thiện phương pháp dừng lỗ, v.v..

Mã nguồn chiến lược
/*backtest
start: 2023-09-13 00:00:00
end: 2023-09-20 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/
// © wbburgin

//@version=5
strategy("Volatility Range Breakout Strategy [wbburgin]", shorttitle = "VRB Strategy [wbburgin]", overlay=true,
 pyramiding=20,max_bars_back=2000,initial_capital=10000)

wma(float priceType,int length,float weight) =>
    norm = 0.0
    sum = 0.0
    for i = 0 to length - 1
        norm := norm + weight
        sum := sum + priceType[i] * weight
    sum / norm

// This definition of volatility uses the high-low range divided by the average of that range.
volatility(source,length) =>
    h = ta.highest(source,length)
    l = ta.lowest(source,length)
    vx = 2 * (h - l) / (h + l)
    vx

vm1 = input.int(100,"Average Length")
volLen = input.int(100,"Volatility Length")
vsrc = input.source(close,"Volatility Source")
cross_type = input.source(close,"Exit Source")
exit_type = input.string("Volatility MA",options=["Volatility MA","Range Crossover"],title="Exit Type")

volatility = volatility(vsrc,volLen)

highband1 = close + (close * volatility)
lowband1 = close - (close * volatility)
hb1 = wma(highband1,vm1,volatility)
lb1 = wma(lowband1,vm1,volatility)
hlavg = math.avg(hb1,lb1)

upcross = ta.crossover(high,hb1)    //Crossing over the high band of historical volatility signifies a bullish breakout
dncross = ta.crossunder(low,lb1)    //Crossing under the low band of historical volatility signifies a bearish breakout

vlong = upcross
vshort = dncross
vlong_exit = switch
    exit_type == "Volatility MA" => ta.crossunder(cross_type,hlavg)
    exit_type == "Range Crossover" => ta.crossunder(cross_type,hb1)
vshort_exit = switch
    exit_type == "Volatility MA" => ta.crossover(cross_type,hlavg)
    exit_type == "Range Crossover" => ta.crossover(cross_type,lb1)

if vlong
    strategy.entry("Long",strategy.long)
if vlong_exit
    strategy.close("Long")
if vshort
    strategy.entry("Short",strategy.short)
if vshort_exit
    strategy.close("Short")

plot(hlavg,color=color.white,title="Weighted Volatility Moving Average")
t = plot(hb1,color=color.new(color.red,50),title="Volatility Reversal Band - Top")
b = plot(lb1,color=color.new(color.green,50),title="Volatility Reversal Band - Bottom")

alertcondition(vlong,"Volatility Long Entry Signal")
alertcondition(vlong_exit,"Volatility Long Exit Signal")
alertcondition(vshort,"Volatility Short Entry Signal")
alertcondition(vshort_exit,"Volatility Short Exit Signal")

fill(t,b,color=color.new(color.aqua,90))