
Strategi ini adalah sistem perdagangan pelacakan tren dan reversal yang didasarkan pada garis rata-rata komposit. Ini mengidentifikasi peluang perdagangan dengan menggabungkan rata-rata bergerak dari berbagai periode, yang dikombinasikan dengan reaksi harga terhadap garis rata-rata. Inti dari strategi ini adalah untuk menilai waktu perdagangan dengan mengamati hubungan antara harga dan garis rata-rata dan bagaimana harga bereaksi ketika mereka kembali ke penurunan harga tertentu.
Strategi ini menggunakan kombinasi dari beberapa jenis rata-rata bergerak (EMA, TEMA, DEMA, WMA, SMA) untuk membangun rata-rata kompleks melalui dua periode yang berbeda (default 20 dan 30). Strategi ini akan menunggu harga kembali ke sekitar rata-rata setelah tren ditetapkan. Strategi ini akan melakukan perdagangan jika ada sinyal reversal.
Ini adalah strategi yang menggabungkan konsep trend tracking dan reversal trading untuk menangkap peluang perdagangan dengan mekanisme reaksi rata-rata dan harga komposit. Keunggulan inti dari strategi ini adalah fleksibilitas dan kemampuan untuk menyaring sinyal palsu, tetapi juga perlu memperhatikan masalah pengoptimalan parameter dalam berbagai lingkungan pasar. Dengan kontrol risiko yang masuk akal dan perbaikan pengoptimalan berkelanjutan, strategi ini diharapkan untuk menghasilkan keuntungan yang stabil dalam perdagangan aktual.
/*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")