
Đây là một chiến lược phá vỡ dựa trên theo dõi xu hướng. Nó mua cổ phiếu có giá trị mạnh khi có phá vỡ và bán cổ phiếu có giá trị yếu khi có phá vỡ, để thực hiện theo dõi xu hướng.
Chiến lược này chủ yếu dựa trên hai chỉ số đánh giá tín hiệu nhập và thoát, một là giá cao nhất trong một chu kỳ nhất định của hàm highest () và một là giá thấp nhất trong một chu kỳ nhất định của hàm lowest ()
Khi giá đóng cửa cao hơn giá cao nhất trong một khoảng thời gian nhất định trong quá khứ, nó được coi là một sự phá vỡ của xu hướng tăng, do đó, phát đi nhiều tín hiệu. Khi giá đóng cửa thấp hơn giá thấp nhất trong một khoảng thời gian nhất định trong quá khứ, do đó, nó được coi là một sự phá vỡ của xu hướng giảm, do đó, phát đi tín hiệu.
Chiến lược này đặt cả dừng di động và dừng cố định. Đặt dừng di động dựa trên chỉ số ATR, bằng cách tính giá trị ATR trong một chu kỳ nhất định và nhân với một số nhân (chỉ số trailingAtrMultiplier) làm điểm dừng di động.
Sau khi thực hiện thêm đường K gốc, lệnh dừng cố định có hiệu lực; sau đó chuyển sang lệnh dừng di động. Sự kết hợp này có thể khóa một phần lợi nhuận trong khi theo dõi xu hướng.
Chiến lược này cũng đặt ra các quy tắc tính toán vị trí. Xác định vị trí dựa trên tỷ lệ phần trăm tổn thất tối đa có thể chịu được, quyền lợi tài khoản, v.v.
Nhìn chung, đây là một chiến lược theo dõi xu hướng điển hình, nó đi vào khi đánh giá được sự phá vỡ xảy ra, khóa lợi nhuận bằng cách dừng lỗ và theo dõi xu hướng, và ra ngoài khi xu hướng đảo ngược.
Đây là một chiến lược đột phá với những ưu điểm chính như:
Xác định xu hướng chính xác. Xác định xu hướng bằng giá cao nhất và giá thấp nhất để xác định xu hướng có đảo ngược hay không, độ chính xác cao, không dễ phát ra tín hiệu sai.
Vị trí và dừng lỗ khoa học hợp lý. Thiết lập tỷ lệ lỗ tối đa, liên kết quyền lợi tài khoản, v.v. làm cho vị trí hợp lý, tránh giao dịch quá mức hoặc không có hiệu lực. Phương pháp dừng lỗ kết hợp khóa lợi nhuận và theo dõi xu hướng hoạt động.
Dễ sử dụng, dễ hiểu. Chỉ cần các chỉ số cơ bản nhất, logic chiến lược đơn giản, rõ ràng và dễ nắm bắt.
Khả năng mở rộng tốt. Các tham số chỉ số, quy tắc vị trí, v.v. đều cung cấp hộp đầu vào, người dùng có thể điều chỉnh theo nhu cầu.
Nhìn chung, đây là một chiến lược đột phá thực tế rất mạnh. Trong phán đoán an toàn đáng tin cậy, trong khi chiến lược thiết kế xem xét kiểm soát và theo dõi rủi ro.
Những rủi ro chính của chiến lược này là:
Rủi ro đảo ngược xu hướng. Chiến lược phá vỡ rất phụ thuộc vào phán đoán xu hướng, và nếu phán đoán sai, có thể phải đối mặt với tổn thất lớn.
Các tham số rủi ro không phù hợp. Các tham số chu kỳ giá thấp nhất giá cao nhất được chọn không đúng có thể bỏ lỡ xu hướng, các tham số vị trí được thiết lập không đúng có thể gây thiệt hại quá lớn.
Giảm lỗ quá cấp tiến. Nếu di chuyển giảm lỗ quá nhỏ, có thể bị tiếng ồn thị trường đẩy ra ngoài sân.
Các giải pháp chính là:
Thêm bộ lọc xu hướng. Ví dụ: kết hợp các đánh giá của các chỉ số khác để tránh phá vỡ sai lầm.
Lựa chọn tham số tối ưu. Kiểm tra tham số để chọn giá trị tối ưu, đảm bảo tính ổn định của nó.
Khoảng cách dừng có thể được nới lỏng một cách thích hợp.
Chiến lược này có thể được tối ưu hóa theo các hướng sau:
Thêm nhiều chỉ số để đánh giá xu hướng. Ngoài giá tối đa, giá thấp nhất, có thể thêm các phán đoán như moving average để đánh giá xu hướng chính xác hơn.
Cài đặt tham số tối ưu hóa. Kiểm tra tham số chu kỳ giá tối đa, tham số số nhân giảm giá, v.v. để chọn các tham số kết hợp tối ưu nhất.
Theo thuật toán điều chỉnh vị trí thị trường. Để vị trí được gắn liền với biến động thị trường, chẳng hạn như giảm vị trí khi VIX tăng lên.
Mở rộng khả năng chỉ số lọc. Chỉ vào trong đột phá mở rộng khả năng, tránh đột phá giả.
Cân nhắc về độ chênh lệch cơ sở và sự liên quan của các loại giao dịch ưu tiên. Chọn các loại sản phẩm có độ chênh lệch cơ sở thấp và có liên quan thấp để giảm rủi ro.
Tối ưu hóa và điều chỉnh cơ chế dừng lỗ. Có thể thử nghiệm kết hợp tỷ lệ của dừng di động và dừng cố định, giảm nguy cơ dừng lỗ quá mạnh.
Chiến lược này là một chiến lược đột phá theo dõi xu hướng, hoạt động tốt trong việc đánh giá độ chính xác, kiểm soát vị trí và rủi ro, và dễ dàng hoạt động. Nó bắt được xu hướng sớm, cân bằng giữa khóa lợi nhuận và theo dõi xu hướng bằng cách dừng lỗ di động.
Tất nhiên, như là một chiến lược đột phá, nó phụ thuộc rất nhiều vào phán đoán xu hướng và dễ bị nhiễu bởi tiếng ồn. Ngoài ra, cài đặt tham số không đúng cũng có thể ảnh hưởng đến hiệu suất của chiến lược. Điều này cần được giải quyết bằng cách tối ưu hóa hơn nữa.
Nói chung, đây là một chiến lược rất thực tế, cấu trúc cơ bản của nó đã chứa các yếu tố quan trọng nhất cần thiết cho một chiến lược định lượng. Nếu có thể tối ưu hóa và cải thiện liên tục, nó hoàn toàn có thể trở thành một chiến lược lập trình có lợi nhuận ổn định.
/*backtest
start: 2023-12-01 00:00:00
end: 2023-12-31 23:59:59
period: 1h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/
//@version=4
strategy(shorttitle="Trend Surfers - Breakout", title="Trend Surfers - Premium Breakout",
overlay=true)
// Risk for position and pyramid
maxriskval = input(2, "Max % risk", type = input.float,
tooltip="Risk % over total equity / Position", group = "Risk Management")
pairnumber = input(title = "How many pairs",type = input.integer, defval= 1,
tooltip="How many pairs are you trading with the strategy?", group = "Risk Management")
// Emtry Exit
highPeriod = input(title="Highest High Period", type=input.integer, defval=168
, tooltip="Highest High of X bars - This will trigger a Long Entry when close is above. (Thin Green Line)"
, group = "Entry Condition")
lowPeriod = input(title="Lowest Low Period", type=input.integer, defval=168,
tooltip="Lowest low of X bars - This will trigger a Short Entry when close is under. (Thin Red Line)"
, group = "Entry Condition")
// Stoploss
trailingAtrPeriod = input(title="Trailing ATR Pediod", type=input.integer, defval=10,
tooltip="Average True Range for the Trailing Stop. (Thick Green Line) "
, group = "Exit Condition")
trailingAtrMultiplier = input(title="Trailing ATR Multiplier", type=input.float, defval=8
, group = "Exit Condition")
fixAtrPeriod = input(title="Fix ATR Pediod", type=input.integer, defval=10,
tooltip="Average True Range for the Fix Stoloss. (Thick Yellow Line)"
, group = "Exit Condition")
fixAtrMultiplier = input(title="Fix ATR Multiplier", type=input.float, defval=2
, group = "Exit Condition")
// Pair info
pair = syminfo.basecurrency + syminfo.currency
// High Low Variable
highestHigh = highest(high, highPeriod)[1]
lowestLow = lowest(low, lowPeriod)[1]
trailingAtr = atr(trailingAtrPeriod) * trailingAtrMultiplier
// Trade Condition
longCondition = crossover(close, highestHigh)
shortCondition = crossunder(close, lowestLow)
// Risk Variable
fixAtr = atr(fixAtrPeriod) * fixAtrMultiplier
stopvaluelong = close[1] - fixAtr[1]
stopvalueshort = close[1] + fixAtr[1]
// Position size Long
maxpossize = strategy.equity / close
positionsizelong = ( ( ( (maxriskval/100) * strategy.equity) / (close - stopvaluelong)))
stopperclong = ((close - stopvaluelong) / close) * 100
leveragelong = max(1, ceil(positionsizelong / maxpossize)) * 2
posperclong = (((positionsizelong * close) / strategy.equity) *100 / leveragelong) / pairnumber
realposlong = (((posperclong / 100) * strategy.equity) * leveragelong) / close
// Position size Short
positionsizeshort = ( ( ( (maxriskval/100) * strategy.equity) / (stopvalueshort - close)))
stoppercshort = ((close - stopvalueshort) / close) * 100
leverageshort = max(1, ceil(positionsizeshort / maxpossize)) * 2
pospercshort = (((positionsizeshort * close) / strategy.equity) *100 / leverageshort) / pairnumber
realposshort = (((pospercshort / 100) * strategy.equity) * leverageshort) / close
// Alert Message
entry_long_message = '\nGo Long for ' + pair + 'NOW!' +
'\nPosition Size % =' + tostring(posperclong) +
'\nLeverage' + tostring(leveragelong) +
'\nStoploss Price =' + tostring(stopvaluelong) +
'\nClose any Short position that are open for ' + pair + '!' +
'\n\nVisit TrendSurfersSignals.com' +
'\nFor automated premium signals (FREE)'
entry_short_message ='\nGo Short for ' + pair + 'NOW!' +
'\nPosition Size % =' + tostring(pospercshort) +
'\nLeverage' + tostring(leverageshort) +
'\nStoploss Price =' + tostring(stopvalueshort) +
'\nClose any Long position that are open for ' + pair + '!' +
'\n\nVisit TrendSurfersSignals.com' +
'\nFor automated premium signals (FREE)'
exit_short_message = '\nExit Short for ' + pair + 'NOW!' +
'\n\nVisit TrendSurfersSignals.com' +
'\nFor automated premium signals (FREE)'
exit_long_message = '\nExit Long for ' + pair + 'NOW!' +
'\n\nVisit TrendSurfersSignals.com' +
'\nFor automated premium signals (FREE)'
// Order
if longCondition
strategy.entry("Long", strategy.long, stop=highestHigh, comment="Long", qty=realposlong
, alert_message = entry_long_message)
if shortCondition
strategy.entry("Short", strategy.short, stop=lowestLow, comment="Short", qty=realposshort
, alert_message = entry_short_message)
// Stoploss Trailing
longTrailing = close - trailingAtr
shortTrailing = close + trailingAtr
var longTrailingStop = 0.0
var shortTrailingStop = 999999.9
trailingStopLine = 0.0
trailingStopLine := na
fixedStopLine = 0.0
fixedStopLine := na
var inTrade = 0
if longCondition or shortCondition
if 0 == inTrade
if longCondition
inTrade := 1
else
inTrade := -1
if 1 == inTrade and (shortCondition or low <= max(fixedStopLine[1], longTrailingStop))
inTrade := 0
if -1 == inTrade and (longCondition or high >= min(fixedStopLine[1], shortTrailingStop))
inTrade := 0
longTrailingStop := if (1 == inTrade)
stopValue = longTrailing
max(stopValue, longTrailingStop[1])
else
0
shortTrailingStop := if (-1 == inTrade)
stopValue = shortTrailing
min(stopValue, shortTrailingStop[1])
else
999999
// Fix Stoploss
firstPrice = 0.0
firstFixAtr = 0.0
firstPrice := na
firstFixAtr := na
if 0 != inTrade
firstPrice := valuewhen(inTrade != inTrade[1] and 0 != inTrade, close, 0)
firstFixAtr := valuewhen(inTrade != inTrade[1] and 0 != inTrade, fixAtr, 0)
if 1 == inTrade
fixedStopLine := firstPrice - firstFixAtr
trailingStopLine := longTrailingStop
else
fixedStopLine := firstPrice + firstFixAtr
trailingStopLine := shortTrailingStop
if (strategy.position_size > 0)
strategy.exit(id="L Stop", stop=max(fixedStopLine, longTrailingStop)
, alert_message = exit_long_message)
if (strategy.position_size < 0)
strategy.exit(id="S Stop", stop=min(fixedStopLine, shortTrailingStop)
, alert_message = exit_long_message)
// Plot
plot(highestHigh, color=color.green, linewidth=1, transp=0, title='Highest High')
plot(lowestLow, color=color.red, linewidth=1, transp=0, title='Lowest Low')
plot(trailingStopLine, color=color.lime, linewidth=2, transp=0, offset=1, title='Trailing Stop')
plot(fixedStopLine, color=color.orange, linewidth=2, transp=0, offset=1, title='Fixed Stop')