Chiến lược phá vỡ đường trung bình động là một chiến lược giao dịch chứng khoán sử dụng tín hiệu chéo đường trung bình kết hợp với các chỉ số động. Chiến lược này sử dụng các chỉ số kỹ thuật đa dạng như chỉ số di chuyển trung bình (EMA), trung bình di chuyển đơn giản (SMA), chỉ số phân tán trung bình di chuyển (MACD) và chỉ số tương đối mạnh mẽ sau khi sửa đổi (StockRSI) để tạo ra tín hiệu mua khi xác nhận xu hướng dài hạn tăng lên.
Chiến lược này bao gồm:
EMA/SMA đường trung bình chéo: Thiết lập đường EMA nhanh 9 chu kỳ và đường SMA chậm 21 chu kỳ, tạo ra tín hiệu mua khi đường nhanh vượt qua đường chậm.
Chỉ số MACD: Chỉ số MACD bao gồm đường MACD, đường tín hiệu và cột MACD. Khi cột là tích cực và đồng bộ với tín hiệu mua được tạo ra bởi EMA / SMA, như là xác nhận bổ sung.
Chỉ số StockRSI: StockRSI để cải tiến chỉ số RSI. Đường chỉ số tạo ra tín hiệu mua khi đường OVERBOUGHT cao hơn đường ((80)) hoặc thấp hơn đường OVERSOLD ((20).
Vành đai BrinBlink: đường trung tâm của Blink là SMA 20 ngày, băng thông là sự khác biệt giữa hai tiêu chuẩn trên và dưới. Yêu cầu giá nằm trong vùng Blink để tạo ra tín hiệu giao dịch.
Hết lỗ và dừng vị trí: Giá dừng và giá dừng dựa trên ATR trong 14 ngày qua.
Chiến lược này yêu cầu ít nhất 2 trong số các chỉ số trên phải đồng thời phát ra tín hiệu mua, và giá cổ phiếu nằm trong vùng Brin và xu hướng tăng dài hạn, để tạo ra tín hiệu mua cuối cùng. Khi chỉ số MACD đảo ngược xuống, StockRSI tạo ra tín hiệu bán sau khi đi vào vùng quá mua.
Chiến lược này kết hợp các ưu điểm của đường chéo, chỉ số động lượng và chỉ số tỷ lệ dao động, với các ưu điểm chính sau:
Kết quả rất tốt.: Nhiều chỉ số và đều là chỉ số trưởng thành, kết quả chiến lược tốt hơn so với chỉ số lớn và chỉ số đơn.
Các tham số đã được tối ưu hóaCác tham số chính như chu kỳ EMA, đường băng thông Brin đã được tối ưu hóa, giúp tăng sự ổn định của hệ thống.
Tự động dừng / dừngBrin và ATR có thể điều chỉnh điểm dừng trong thời gian thực, giúp kiểm soát rủi ro.
Không khó thực hiện: Mã đơn giản, chỉ số dễ dàng truy cập, hoạt động thực tế không khó khăn.
Mặc dù chiến lược này có hiệu quả, nhưng vẫn có những rủi ro chính như sau:
Chỉ số sai.: Khi thị trường có biến động bất thường hoặc chỉ số thất bại, tín hiệu sai có thể xuất hiện.
Các tham số không hợp lệ: Thiết lập tham số không chính xác có thể dẫn đến giao dịch quá thường xuyên hoặc không phản ứng nhạy cảm. Cần điều chỉnh theo các giống khác nhau và môi trường thị trường.
Hạn chế quá nhỏ hoặc quá lớnLưu ý: Giảm lỗ quá nhỏ có thể dễ bị mắc kẹt, quá lớn là mất mát quá lớn.
Các biện pháp sau đây có thể được áp dụng để đối phó với các rủi ro trên:
Can thiệp và sửa đổi nhân tạo: Trong trường hợp bất thường, có thể xác nhận tín hiệu bằng tay, sửa đổi tham số hoặc tạm dừng chính sách.
Cài đặt tham số tối ưu hóa: Sử dụng các phương pháp khoa học khách quan hơn như thuật toán di truyền để tối ưu hóa các tham số.
Cắt lỗ liên quan đến biến động: Có thể tự động điều chỉnh mức dừng lỗ theo tỷ lệ biến động, chẳng hạn như 1 đến 3 lần ATR.
Chiến lược này có thể được tối ưu hóa thêm bằng cách:
Tăng sự ổn định của hệ thống ngăn chặn thiệt hại: Có thể tham gia theo dõi dừng hoặc chỉ số trung bình di chuyển để dừng.
Trình lọc khối lượng giao dịchTrong khi đó, các doanh nghiệp có thể có thể có thể có thể có thể có thể có thể có thể có thể có thể có thể có.
Động thái điều chỉnh tham số: có thể tự động tối ưu hóa chu kỳ đường trung bình, chiều rộng đường dẫn, v.v.
Giới thiệu thuật toán học máy: Sử dụng các thuật toán như RNN, LSTM để thực hiện các tham số.
Động lực phá vỡ lợi thế của các chỉ số kỹ thuật sử dụng tổng hợp chiến lược đường thẳng, trong trường hợp hợp hợp tác dài và ngắn, thu được lợi nhuận tốt. Chiến lược này được kiểm soát lỗ hổng, thực hiện không khó khăn lắm. Bước tiếp theo sẽ tiếp tục hoàn thiện cơ chế dừng lỗ và sử dụng phương pháp thông minh hơn để tối ưu hóa tham số và lọc tín hiệu, nhằm đạt được lợi nhuận vượt quá ổn định hơn.
/*backtest
start: 2022-11-20 00:00:00
end: 2023-11-26 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/
//@version=5
strategy("Improved Custom Strategy", shorttitle="ICS", overlay=true)
// Volatility
volatility = ta.atr(14)
// EMA/MA Crossover
fast_length = 9
slow_length = 21
fast_ma = ta.ema(close, fast_length)
slow_ma = ta.sma(close, slow_length)
crossover_signal = ta.crossover(fast_ma, slow_ma)
// MACD
[macdLine, signalLine, macdHistogram] = ta.macd(close, 12, 26, 9)
macd_signal = crossover_signal and (macdHistogram > 0)
// Bollinger Bands
source = close
basis = ta.sma(source, 20)
upper = basis + 2 * ta.stdev(source, 20)
lower = basis - 2 * ta.stdev(source, 20)
// Fractal-based Support and Resistance levels
isFractalHigh = high[2] < high[1] and high[1] > high[0]
isFractalLow = low[2] > low[1] and low[1] < low[0]
resistance = ta.valuewhen(isFractalHigh, high[1], 0)
support = ta.valuewhen(isFractalLow, low[1], 0)
// StockRSI
length = 14
K = 100 * (close - ta.lowest(close, length)) / (ta.highest(close, length) - ta.lowest(close, length))
D = ta.sma(K, 3)
overbought = 80
oversold = 20
stockrsi_signal = ((K < D) and (K < oversold)) or ((K > D) and (K > overbought))
// Buy and sell conditions
mandatory_buy_conditions = (crossover_signal ? 1 : 0) + (macd_signal ? 1 : 0) + (stockrsi_signal ? 1 : 0)
// Long-term Trend Check
long_term_ma = ta.sma(close, 200)
long_term_bullish = close > long_term_ma
long_term_bearish = close < long_term_ma
// Plot the long-term MA for visual clarity
plot(long_term_ma, color=color.gray, title="200-Day MA", linewidth=1)
// Simplified Buy and Sell conditions
buy_condition = long_term_bullish and (mandatory_buy_conditions >= 2) and (close > lower) and (close < upper)
sell_condition = (macdHistogram < 0) and (K > D) and (K > overbought)
// Potential SL and TP based on volatility
potential_SL = close - volatility
potential_TP = close + 2 * volatility
plot(potential_SL, title="SL Level", color=color.red, linewidth=1, style=plot.style_linebr)
plot(potential_TP, title="TP Level", color=color.green, linewidth=1, style=plot.style_linebr)
// ... (rest of your code above)
// State variable to track if we're in a position, a counter for trades, and a delayed counter for plotting
var bool inPosition = false
var tradeCounter = 0
var tradeCounterDelayed = 0 // Declaration of the variable
// Buy logic: Check if tradeCounter is 0 and the buy condition is met
if tradeCounter == 0 and buy_condition
strategy.entry("BUY", strategy.long, stop=potential_SL, limit=potential_TP)
inPosition := true
tradeCounter := tradeCounter + 1
// Sell logic: Check if tradeCounter is 1, the sell condition is met, and we are in a position
if tradeCounter == 1 and inPosition and sell_condition
strategy.close("BUY")
inPosition := false
tradeCounter := tradeCounter - 1
// Update the delayed trade counter:
tradeCounterDelayed := tradeCounter
// Plotting
bgcolor(buy_condition ? color.new(color.green, 90) : sell_condition ? color.new(color.red, 90) : na)
plotshape(series=buy_condition and tradeCounterDelayed == 0, style=shape.labelup, location=location.belowbar, color=color.green, text="BUY", size=size.small)
plotshape(series=sell_condition and tradeCounterDelayed == 1, style=shape.labeldown, location=location.abovebar, color=color.red, text="SELL", size=size.small)
// ... (rest of your code if any)