
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.
Chiến lược này chủ yếu dựa trên các chỉ số sau:
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;
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á;
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ả;
Đườ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.
Đây là một chiến lược đột phá điển hình với những lợi thế sau:
Chiến lược này cũng có một số rủi ro:
Các giải pháp đối phó với rủi ro là:
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:
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.
/*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)