
Chiến lược này là một hệ thống giao dịch theo dõi xu hướng và đảo ngược dựa trên đường trung bình tổng hợp. Nó xác định cơ hội giao dịch bằng cách kết hợp các đường trung bình di chuyển trong các chu kỳ khác nhau, kết hợp với phản ứng của giá đối với đường trung bình.
Chiến lược sử dụng sự kết hợp của nhiều loại đường trung bình di chuyển (EMA, TEMA, DEMA, WMA, SMA) để xây dựng đường trung bình phức tạp thông qua hai chu kỳ khác nhau (tạm dịch: 20 và 30 mặc định). Khi giá trên đường trung bình được coi là xu hướng tăng và dưới đường trung bình là xu hướng giảm.
Đây là một chiến lược kết hợp theo dõi xu hướng và triết lý giao dịch đảo ngược, để nắm bắt cơ hội giao dịch bằng cách kết hợp đường trung bình và cơ chế phản ứng giá. Ưu điểm cốt lõi của chiến lược là tính linh hoạt và khả năng lọc các tín hiệu giả, nhưng cũng cần chú ý đến vấn đề tối ưu hóa tham số trong các môi trường thị trường khác nhau. Với kiểm soát rủi ro hợp lý và cải tiến tối ưu hóa liên tục, chiến lược này có khả năng tạo ra lợi nhuận ổn định trong giao dịch thực tế.
/*backtest
start: 2024-10-01 00:00:00
end: 2025-02-18 08:00:00
period: 1d
basePeriod: 1d
exchanges: [{"eid":"Binance","currency":"BTC_USDT"}]
*/
//@version=5
strategy("Ultrajante MA Reaction Strategy", overlay=true, initial_capital=10000,
default_qty_type=strategy.percent_of_equity, default_qty_value=10)
// ===== Custom Functions for DEMA and TEMA =====
dema(src, length) =>
ema1 = ta.ema(src, length)
ema2 = ta.ema(ema1, length)
2 * ema1 - ema2
tema(src, length) =>
ema1 = ta.ema(src, length)
ema2 = ta.ema(ema1, length)
ema3 = ta.ema(ema2, length)
3 * ema1 - 3 * ema2 + ema3
// ===== Configuration Parameters =====
// MA Type Selection
maType = input.string(title="MA Type", defval="EMA", options=["SMA", "EMA", "WMA", "DEMA", "TEMA"])
// Parameters for composite periods
periodA = input.int(title="Period A", defval=20, minval=1)
periodB = input.int(title="Period B", defval=30, minval=1)
compMethod = input.string(title="Composite Method", defval="Average", options=["Average", "Weighted"])
// Reaction percentage (e.g., 0.5 means 0.5%)
reactionPerc = input.float(title="Reaction %", defval=0.5, step=0.1)
// ===== Composite Period Calculation =====
compPeriod = compMethod == "Average" ? math.round((periodA + periodB) / 2) : math.round((periodA * 0.6 + periodB * 0.4))
// ===== Moving Average Calculation based on selected type =====
ma = switch maType
"SMA" => ta.sma(close, compPeriod)
"EMA" => ta.ema(close, compPeriod)
"WMA" => ta.wma(close, compPeriod)
"DEMA" => dema(close, compPeriod)
"TEMA" => tema(close, compPeriod)
=> ta.ema(close, compPeriod) // Default value
plot(ma, color=color.blue, title="MA")
// ===== Trend Definition =====
trendUp = close > ma
trendDown = close < ma
// ===== Reaction Threshold Calculation =====
// In uptrend: expect the price to retrace to or below a value close to the MA
upThreshold = ma * (1 - reactionPerc / 100)
// In downtrend: expect the price to retrace to or above a value close to the MA
downThreshold = ma * (1 + reactionPerc / 100)
// ===== Quick Reaction Detection =====
// For uptrend: reaction is detected if the low is less than or equal to the threshold and the close recovers and stays above the MA
upReaction = trendUp and (low <= upThreshold) and (close > ma)
// For downtrend: reaction is detected if the high is greater than or equal to the threshold and the close stays below the MA
downReaction = trendDown and (high >= downThreshold) and (close < ma)
// ===== Trade Execution =====
if upReaction
// Close short position if exists and open long position
strategy.close("Short", comment="Close Short due to Bullish Reaction")
strategy.entry("Long", strategy.long, comment="Long Entry due to Bullish Reaction in Uptrend")
if downReaction
// Close long position if exists and open short position
strategy.close("Long", comment="Close Long due to Bearish Reaction")
strategy.entry("Short", strategy.short, comment="Short Entry due to Bearish Reaction in Downtrend")
// ===== Visualization of Reactions on the Chart =====
plotshape(upReaction, title="Bullish Reaction", style=shape.arrowup, location=location.belowbar, color=color.green, size=size.small, text="Long")
plotshape(downReaction, title="Bearish Reaction", style=shape.arrowdown, location=location.abovebar, color=color.red, size=size.small, text="Short")