Dựa trên chiến lược theo dõi xung lượng bùng nổ


Ngày tạo: 2024-03-01 11:08:43 sửa đổi lần cuối: 2024-03-01 11:08:43
sao chép: 0 Số nhấp chuột: 826
1
tập trung vào
1617
Người theo dõi

Dựa trên chiến lược theo dõi xung lượng bùng nổ

Tổng quan

Chiến lược theo dõi động lực bùng nổ bằng cách tính tỷ lệ biến đổi của giá để xác định giá phá vỡ, kết hợp các tín hiệu lọc khối lượng giao dịch, để đạt được điểm phá vỡ có xác suất cao để bắt được xu hướng. Khi kích hoạt tín hiệu mua, chiến lược này sử dụng phương pháp theo dõi giá dừng để khóa lợi nhuận và tránh rút lại quá nhiều.

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

Chiến lược này chủ yếu dựa trên các chỉ số sau:

  1. Tỷ lệ phần trăm thay đổi giá (isFourPercentBull) - tính toán tỷ lệ phần trăm thay đổi giá đóng cửa so với giá đóng cửa ngày trước để xác định giá có thực sự phá vỡ hay không;

  2. Tỷ lệ giá đóng cửa so với giá cao nhất (HighCloseRatio) - tính tỷ lệ giá đóng cửa so với giá cao nhất để đánh giá cường độ phá vỡ giá;

  3. Khối lượng giao dịch (volume) - yêu cầu khối lượng giao dịch lớn hơn ngày trước để đảm bảo đột phá hiệu quả;

  4. Đường trung bình di chuyển đơn giản 200 ngày ((SMA) - yêu cầu giá đóng cửa và giá mở cửa đều cao hơn đường 200 ngày, để đánh giá xu hướng.

Khi nhiều điều kiện trên được đáp ứng cùng một lúc, một tín hiệu mua được phát ra. Sau đó, chiến lược này sử dụng phương thức dừng theo dõi giá để chủ động dừng lỗ và khóa lợi nhuận. Cụ thể, công thức tính toán của việc theo dõi đường dừng lỗ là:

trailPrice = close * (100 - trailPercent) / 100

Trong đó, trailPercent là phần trăm theo dõi dừng có thể cấu hình. Điều này cho thấy, khi giá tăng lên, đường dừng cũng sẽ tăng lên, do đó khóa lợi nhuận.

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

Đây là một chiến lược đột phá điển hình với những lợi thế sau:

  1. Bộ lọc đa điều kiện, đảm bảo tính hiệu quả của đột phá và tránh đột phá giả;
  2. Sử dụng lệnh dừng theo dõi giá, có thể chủ động dừng lỗ và khóa lợi nhuận, tránh rút lui tối đa;
  3. Lập luận chiến lược đơn giản, rõ ràng, dễ hiểu và tối ưu hóa.

Rủi ro chiến lược

Chiến lược này cũng có một số rủi ro:

  1. Có khả năng phá vỡ vẫn còn tồn tại và không thể hoàn toàn tránh được thiệt hại;
  2. Việc theo dõi quá mạnh có thể gây ra sự cố thường xuyên;
  3. Thiết lập tham số không đúng có thể dẫn đến tần số giao dịch quá cao hoặc mất tín hiệu.

Các giải pháp đối phó với rủi ro là:

  1. Tối ưu hóa các tham số, giảm mức dừng lỗ và đảm bảo có đủ không gian;
  2. Thả lỏng các điều kiện phá vỡ phù hợp để đảm bảo không bỏ lỡ các xu hướng rõ ràng;
  3. Thử nghiệm các giống khác nhau để đánh giá sự ổn định của chiến lược.

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

Với tỷ lệ dừng lỗ cao, chiến lược này có thể được tối ưu hóa hơn nữa theo các hướng sau:

  1. Hãy thử các phương pháp khác để theo dõi lỗ hổng, chẳng hạn như theo dõi trung bình, ATR và theo dõi tỷ lệ biến động.
  2. Thêm các thuật toán học máy để đánh giá các tham số đột phá có hiệu quả tốt hơn dựa trên đào tạo dữ liệu lịch sử;
  3. Tăng các điều kiện phán đoán phụ dựa trên khối lượng giao dịch đột phá để đảm bảo hiệu quả đột phá;
  4. Đánh giá sự khác biệt trong thiết lập các tham số của các giống khác nhau để tìm ra giống phù hợp nhất.

Tóm tắt

Chiến lược theo dõi động lực bùng nổ nói chung là một chiến lược theo dõi xu hướng rất thực tế. Nó giải quyết vấn đề không thể dừng và dừng hiệu quả trong chiến lược đột phá, đồng thời có thể kiểm soát rủi ro tốt trong khi nắm bắt xu hướng.

Mã nguồn chiến lược
/*backtest
start: 2023-03-01 00:00:00
end: 2023-12-10 05:20:00
period: 1d
basePeriod: 1h
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/
// © doks23

//@version=5
strategy(title = "SD:Momentum Burst", overlay=true, initial_capital=1000,commission_value = 0,slippage = 0,process_orders_on_close=true)

//Check Vol
checkVol = input.bool(defval=false,title="IncludeAvgVolume?")
volSMAlength = input(50, title="VolumeLength")
volumeSma = ta.sma(volume, volSMAlength)
highvolume = volume >= volumeSma
volumeCond=checkVol?highvolume:true

// Profit and Loss
trailPercent    = input.float(title="Trail%", defval=3, step=0.1)

//longCondition
PercentThreshold=input.float(3.8,'BreakoutPercent', step=0.1)
MaxThreshold=input.float(10,'Max Breakout', step=0.1)
HighCloseRatio=input.float(70,'Close to High Ratio', step=1)
float candleCloseBull = ((close[0] - open[0]) / (high[0] - open[0]) * 100)
float isFourPercentBull = (((close[0] - close[1]) / close[1]) * 100)
LongCond=volume > volume[1] and isFourPercentBull > PercentThreshold and candleCloseBull > HighCloseRatio and isFourPercentBull<MaxThreshold
barcolor(color=(LongCond?color.yellow: na),title='BObar')
longCondition= LongCond and volumeCond and close>ta.sma(close,200) and open>ta.sma(close,200)

//Input Strategy
DateCheck=  input.bool(title = 'Custom Date Range?', defval=true,group = 'Strategy')
FromDate=   input(defval = timestamp("1 Jan 2019 00:00"),group = 'Strategy')
ToDate      =input(defval = timestamp("31 Dec 2023 00:00"),group = 'Strategy')
PostionSize =input.string('Contract','Select Position Size',options = ['Percent of Equity','Contract'],group = 'Strategy')
ContractQty =input.int(1,'No of Contract',group = 'Strategy')

//Backtesting Date Range
TimeWindow=true
// Number of Contract
var int trade_qty=na
if(PostionSize=='Contract')
    trade_qty:=ContractQty
else
    trade_qty:= (strategy.equity>strategy.initial_capital)?math.floor(strategy.equity/strategy.initial_capital):ContractQty


//Position Buy
BuyTriggerPrice = ta.valuewhen(longCondition,high,0)
//Trailing price
var float trailPrice    = na
float percentMulti = (100 - trailPercent) / 100
longCondition2=longCondition and TimeWindow
if longCondition2
    strategy.entry("Long", strategy.long,qty=trade_qty,stop = BuyTriggerPrice)
    trailPrice := close*percentMulti
if strategy.position_size>0
    trailPrice := math.max(close*percentMulti,trailPrice[1])
    if low <= trailPrice
        strategy.exit('Exit','Long',stop = trailPrice)
        if strategy.position_size==0     
            trailPrice:=na
// Plot Strategy
var float trail_long_SL=na
if strategy.position_size>0
    trail_long_SL:=trailPrice
else
    trail_long_SL:=na
//Strategy Plot
PlotMA=input.bool(title="Plot MA?", defval=false)
plot(PlotMA?ta.sma(close,10):na,color = color.red,title = '10MA')
plot(PlotMA?ta.sma(close,21):na,color = color.white,title = '21MA')
plot(PlotMA?ta.sma(close,200):na,color = color.orange,title = '200MA')
// plot(trail_long_SL,color = color.gray,style = plot.style_steplinebr,linewidth = 1)