
Strategi ini adalah sistem perdagangan kuantitatif yang didasarkan pada analisis multi-frame time frame, terutama menggunakan indikator MACD, indikator RSI, rata-rata VWAP, dan filter tingkat fluktuasi ATR untuk melakukan perdagangan pada 30 menit dan 1 jam. Strategi ini mendukung perdagangan dalam posisi overbought dan underbought, dikonfirmasi oleh sinyal crossover indikator teknis dari berbagai frame waktu, dan digabungkan dengan filter kondisi fluktuasi untuk meningkatkan kualitas perdagangan.
Prinsip inti dari strategi ini adalah memfilter sinyal berkualitas rendah melalui konfirmasi multi-syarat, yang terdiri dari beberapa komponen utama:
Multi-frame MACD sinyal silang:
RSI terlalu banyak membeli terlalu banyak menjual:
Konfirmasi posisi harga VWAP ganda:
Filter tingkat fluktuasi:
Mekanisme Keluar Berlapis:
Melalui penyaringan dan konfirmasi kondisi multi-tingkat ini, strategi ini bertujuan untuk menangkap fluktuasi jangka pendek dan menengah yang memiliki arah yang jelas, sambil menyaring sinyal berkualitas rendah, meningkatkan tingkat kemenangan dan rasio keuntungan.
Konfirmasi multi-frame waktuDengan menggabungkan sinyal pada frame waktu 30 menit dan 1 jam, strategi dapat lebih baik mengidentifikasi tren yang benar dan mengurangi dampak dari sinyal palsu. Khususnya, fitur pengesahan tren MACD 1 jam membantu untuk menghindari perdagangan melawan tren besar.
Adaptifitas fluktuasiFilter tingkat fluktuasi ATR memastikan bahwa strategi hanya masuk saat pasar cukup dinamis dan menghindari perdagangan di zona fluktuasi rendah, yang secara efektif mengurangi risiko pergerakan zona mati.
Mekanisme Keluar yang FleksibelStrategi ini tidak hanya mencakup stop loss tetap, tetapi juga mekanisme keluar dinamis berdasarkan indikator yang berbalik, yang memungkinkan untuk keluar tepat waktu dan melindungi keuntungan ketika harga belum mencapai stop loss tetapi pasar telah mulai berbalik.
Konfirmasi posisi harga ganda: Meminta harga berada pada dua frame waktu bersamaan di atas VWAP (do more) atau di bawah (do less), yang lebih mengkonfirmasi pergerakan dan arah harga, mengurangi false breakout.
Manajemen risiko built-inStrategi ini memiliki mekanisme stop loss dan manajemen posisi (default account equity of 5% per trade) yang membantu mengendalikan risiko per trade dan melindungi modal.
Tantangan Rasio Kemenangan RendahSeperti yang disebutkan dalam catatan kode, strategi ini mungkin menghadapi masalah dengan persentase kemenangan yang rendah. Hal ini disebabkan oleh pemfilteran kondisi ganda yang meningkatkan kualitas sinyal, tetapi juga mengurangi frekuensi transaksi secara signifikan, sehingga jumlah sampel yang lebih kecil dan signifikansi statistik yang terbatas.
Parameter SensitivitasStrategi menggunakan beberapa parameter yang dapat disesuaikan, termasuk panjang MACD, nilai RSI, parameter filter ATR, dan lain-lain. Perubahan kecil pada parameter ini dapat berdampak signifikan pada kinerja strategi, dengan risiko overoptimisasi.
Batas dari Stop Loss Persentase Tetap: Menggunakan stop loss yang sama (stop 1.5%) dan stop loss (stop 0.5%) untuk semua kondisi pasar, mungkin tidak dapat disesuaikan dengan kondisi tingkat fluktuasi yang berbeda. Dalam pasar yang berfluktuasi tinggi, stop loss mungkin terlalu ketat; dalam pasar yang berfluktuasi rendah, stop loss mungkin terlalu jauh.
Keterlambatan multi-timeframe: Menggunakan sinyal dalam kerangka waktu yang lebih lama (misalnya 1 jam) sebagai konfirmasi dapat menimbulkan keterlambatan, yang menyebabkan kehilangan kesempatan masuk atau penundaan keluar.
Kurangnya kemampuan beradaptasi dengan kondisi pasarStrategi tidak menyertakan mekanisme untuk membedakan antara kondisi pasar yang berbeda (trend/shake), dan mungkin tidak akan bekerja dengan baik dalam kondisi pasar tertentu.
Solusi:
Optimasi Stop Loss Dinamis: Mengubah stop loss persentase tetap menjadi nilai dinamis berdasarkan ATR, misalnya menggunakan 1.5×ATR sebagai stop loss, 3×ATR sebagai stop loss. Hal ini dapat membuat strategi lebih beradaptasi dengan berbagai lingkungan pasar yang berfluktuasi, memberikan stop loss yang lebih longgar pada periode fluktuasi tinggi, dan memperketat target stop loss pada periode fluktuasi rendah.
Klasifikasi lingkungan pasar: Memperkenalkan mekanisme identifikasi lingkungan pasar, membedakan pasar tren dan pasar goyangan. Anda dapat menggunakan ADX, bandwidth Brin, atau hubungan harga dengan rata-rata bergerak jangka panjang untuk mengidentifikasi kondisi pasar, dan menyesuaikan parameter strategi atau bahkan sepenuhnya beralih logika perdagangan sesuai.
Pengoptimalan waktu masukStrategi saat ini: Masuk ke K-line saat ini yang terjadi pada MACD crossover, mungkin menghadapi titik slippage atau penundaan eksekusi. Pertimbangkan untuk masuk saat K-line berikutnya dibuka setelah konfirmasi crossover, atau atur harga batas untuk masuk di zona harga tertentu untuk mendapatkan harga eksekusi yang lebih baik.
Filter waktuMenambahkan filter waktu perdagangan untuk menghindari periode perdagangan yang tidak efisien. Misalnya, Anda dapat menghindari perdagangan pada periode yang mungkin memiliki likuiditas rendah atau tidak teratur, seperti akhir waktu di Asia atau waktu persimpangan Eropa-Amerika.
Parameter indikator beradaptasi: Merancang parameter MACD, RSI, dan ATR sebagai nilai yang disesuaikan sendiri, berdasarkan volatilitas pasar terbaru atau penyesuaian otomatis berkala. Misalnya, parameter MACD yang lebih pendek dapat digunakan di pasar yang berfluktuasi tinggi dan parameter yang lebih panjang digunakan di pasar yang berfluktuasi rendah.
Tingkat intensitas sinyalUntuk sinyal masuk, ada sistem penilaian intensitas, berdasarkan pada beberapa faktor (seperti ukuran MACD, deviasi RSI, jarak VWAP, dll), sinyal diberi nilai, hanya melakukan perdagangan yang intensitasnya melebihi batas tertentu, atau menyesuaikan ukuran posisi sesuai dengan dinamika intensitas sinyal.
Pembelajaran MesinIntroduksi model pembelajaran mesin untuk memprediksi sinyal mana yang lebih mungkin menghasilkan perdagangan yang menguntungkan, identifikasi kombinasi pola yang paling berharga berdasarkan model pelatihan data historis. Ini dapat meningkatkan kemampuan adaptasi dan tingkat kemenangan strategi.
Perbaikan-perbaikan ini bertujuan untuk meningkatkan stabilitas, adaptasi, dan kinerja jangka panjang dari strategi, dengan mempertahankan logika inti yang sama. Dengan perbaikan-perbaikan ini, strategi dapat lebih baik menanggapi perubahan lingkungan dan kondisi pasar yang berbeda.
Multi-Frames MACD-RSI strategi perdagangan yang dirancang untuk mengidentifikasi peluang perdagangan berkualitas tinggi dengan menggabungkan beberapa indikator teknis dan sinyal dari beberapa frame waktu. Keunggulan utama dari strategi ini adalah mekanisme pengakuan sinyal bertingkat dan fitur manajemen risiko built-in yang memungkinkan untuk mengendalikan risiko sambil menangkap fluktuasi harga.
Meskipun ada tantangan dengan tingkat kemenangan yang rendah, strategi mempertahankan ekspektasi positif dengan meningkatkan pendapatan dari perdagangan laba rata-rata. Dengan menerapkan langkah-langkah optimasi yang disarankan, terutama stop loss yang dinamis, klasifikasi lingkungan pasar, dan gradasi intensitas sinyal, kinerja strategi diharapkan dapat ditingkatkan lebih lanjut.
Strategi ini cocok untuk pedagang jangka pendek dan menengah, terutama mereka yang mencari metode perdagangan sistematis berdasarkan analisis teknis, dan yang mementingkan manajemen risiko. Mekanisme konfirmasi multi-syarat dari strategi ini, meskipun mengurangi frekuensi perdagangan, meningkatkan kualitas setiap transaksi, yang sesuai dengan filosofi perdagangan “kurang lebih banyak” yang menekankan kualitas daripada kuantitas.
Dalam penerapan praktis, disarankan bahwa pedagang menguji strategi di lingkungan simulasi, khususnya untuk menguji efek dari berbagai langkah-langkah optimasi, dan kemudian menerapkannya dengan hati-hati pada perdagangan di tempat nyata. Pada saat yang sama, terus memantau perubahan kondisi pasar dan menyesuaikan parameter strategi pada waktunya akan membantu mempertahankan kinerja yang stabil dalam jangka panjang.
/*backtest
start: 2025-01-01 00:00:00
end: 2025-06-08 00:00:00
period: 1h
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"ETH_USDT"}]
*/
// This Pine Script® code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/
// © GentlemanOfTrading
//@version=6
strategy(title = "ETH Day Trader", overlay = true, margin_long = 100, margin_short = 100, default_qty_type = strategy.percent_of_equity, default_qty_value = 5)
// ==== 1) USER INPUTS ====
// MACD/RSI lengths
fastLen = input.int(12, title="MACD Fast EMA Length", minval=1)
slowLen = input.int(26, title="MACD Slow EMA Length", minval=1)
signalLen = input.int(9, title="MACD Signal EMA Length", minval=1)
rsiLen = input.int(14, title="RSI Length", minval=1)
// RSI thresholds
rsiThreshLong30 = input.int(55, title="RSI30m > (Long)", minval=1, maxval=100)
rsiThreshShort30= input.int(45, title="RSI30m < (Short)", minval=1, maxval=100)
rsiThresh1h = input.int(50, title="RSI1h Threshold", minval=1, maxval=100)
// ATR filter (30m)
atrLen = input.int(14, title="ATR Length (30m)", minval=1)
atrMaLen = input.int(20, title="ATR MA Length (30m)", minval=1)
// Take Profit / Stop Loss (percent)
tpPerc = input.float(1.5, title="Take Profit (%)", minval=0.1) / 100
slPerc = input.float(0.5, title="Stop Loss (%)", minval=0.1) / 100
// Toggle whether to use 1h trend confirmation
use1hTrend = input.bool(true, title="Use 1h MACD Trend Confirmation?")
// ==== 2) FETCH INDICATORS ON 30m ====
// We assume this script is applied on a chart ≤ 30m (e.g. 15m or 5m),
// but if you apply it on a 30m chart it still works: security() with "30" just returns the same bar.
[macd30m, macdSig30m, _] = ta.macd(close, fastLen, slowLen, signalLen)
rsi30m = ta.rsi(close, rsiLen)
atr30m = ta.atr(atrLen)
// ==== 3) FETCH INDICATORS ON 1h & VWAPs via request.security() ====
// --- 1h MACD & RSI ---
[macd1h, macdSig1h, _] = request.security(syminfo.tickerid, "60", ta.macd(close, fastLen, slowLen, signalLen), lookahead=barmerge.lookahead_off)
rsi1h = request.security(syminfo.tickerid, "60", ta.rsi(close, rsiLen), lookahead=barmerge.lookahead_off)
// --- 30m VWAP & 1h VWAP (session VWAP) ---
vwap30m = request.security(syminfo.tickerid, "30", ta.vwap(close), lookahead=barmerge.lookahead_off)
vwap1h = request.security(syminfo.tickerid, "60", ta.vwap(close), lookahead=barmerge.lookahead_off)
// ==== 4) BUILD VOLATILITY FILTER (30m ATR vs ATR MA) ====
atr30m_ma = ta.sma(atr30m, atrMaLen)
volatilityOK = atr30m >= atr30m_ma
// ==== 5) MULTI-TIMEFRAME CROSS CONDITIONS ====
// 30m MACD cross signals
longCross30m = ta.crossover(macd30m, macdSig30m)
shortCross30m = ta.crossunder(macd30m, macdSig30m)
// 1h MACD trend confirmation
macdTrendUp1h = macd1h > macdSig1h
macdTrendDown1h = macd1h < macdSig1h
// ==== 6) ENTRY & EXIT CONDITIONS ====
// LONG ENTRY:
// • 30m MACD crossover
// • 30m RSI > rsiThreshLong30
// • (optionally) 1h MACD line > 1h MACD signal
// • Price > 30m VWAP AND Price > 1h VWAP
// • 30m ATR ≥ 30m ATR MA (volatility filter)
longEntryCond =
longCross30m
and (rsi30m > rsiThreshLong30)
and (close > vwap30m)
and (close > vwap1h)
and volatilityOK
and (use1hTrend ? macdTrendUp1h : true)
// LONG EXIT:
// • fixed TP/SL
// OR • 30m MACD crossunder
// OR • 1h MACD falls below signal (trend flipped)
var float entryPriceLong = na
longExitCond = false
if (strategy.position_size > 0)
// Price-based TP / SL checks
entryPriceLong := nz(entryPriceLong[1], strategy.position_avg_price)
longTPprice = entryPriceLong * (1 + tpPerc)
longSLprice = entryPriceLong * (1 - slPerc)
// check TP/SL first
longExitTP = high >= longTPprice
longExitSL = low <= longSLprice
// fallback: MACD crossunder on 30m OR 1h trend flips
macdTrendFlip1h = macdTrendUp1h and (macd1h < macdSig1h)
macdCross30m = shortCross30m
longExitCond := longExitTP or longExitSL or macdCross30m or macdTrendFlip1h
else
entryPriceLong := na // reset when no position
// SHORT ENTRY:
// • 30m MACD crossunder
// • 30m RSI < rsiThreshShort30
// • (optionally) 1h MACD line < 1h MACD signal
// • Price < 30m VWAP AND Price < 1h VWAP
// • 30m ATR ≥ 30m ATR MA (volatility filter)
shortEntryCond =
shortCross30m
and (rsi30m < rsiThreshShort30)
and (close < vwap30m)
and (close < vwap1h)
and volatilityOK
and (use1hTrend ? macdTrendDown1h : true)
// SHORT EXIT:
// • fixed TP/SL
// OR • 30m MACD crossover
// OR • 1h MACD flips up
var float entryPriceShort = na
shortExitCond = false
if (strategy.position_size < 0)
entryPriceShort := nz(entryPriceShort[1], strategy.position_avg_price)
shortTPprice = entryPriceShort * (1 - tpPerc)
shortSLprice = entryPriceShort * (1 + slPerc)
// check TP/SL first
shortExitTP = low <= shortTPprice
shortExitSL = high >= shortSLprice
macdTrendFlipUp1h = macdTrendDown1h and (macd1h > macdSig1h)
macdCrossUp30m = longCross30m
shortExitCond := shortExitTP or shortExitSL or macdCrossUp30m or macdTrendFlipUp1h
else
entryPriceShort := na // reset when no position
// ==== 7) EXECUTE STRATEGY ORDERS WITH LABELS & ALERTS ====
// — Long Entry —
if (longEntryCond and strategy.position_size == 0)
strategy.entry("Long", strategy.long)
label.new(bar_index, low, text="Buy (LT)", style=label.style_label_up, color=color.new(color.green, 0), textcolor=color.white, yloc=yloc.belowbar)
alert("Buy (LT)", alert.freq_once_per_bar_close)
// — Long Exit —
if (strategy.position_size > 0 and longExitCond)
strategy.close("Long")
label.new(bar_index, high, text="Sell (LT)", style=label.style_label_down, color=color.new(color.red, 0), textcolor=color.white, yloc=yloc.abovebar)
alert("Sell (LT)", alert.freq_once_per_bar_close)
// — Short Entry —
if (shortEntryCond and strategy.position_size == 0)
strategy.entry("Short", strategy.short)
label.new(bar_index, high, text="Sell (ST)", style=label.style_label_down, color=color.new(color.red, 0), textcolor=color.white, yloc=yloc.abovebar)
alert("Sell (ST)", alert.freq_once_per_bar_close)
// — Short Exit —
if (strategy.position_size < 0 and shortExitCond)
strategy.close("Short")
label.new(bar_index, low, text="Buy (ST)", style=label.style_label_up, color=color.new(color.green, 0), textcolor=color.white, yloc=yloc.belowbar)
alert("Buy (ST)", alert.freq_once_per_bar_close)
// ==== 8) OPTIONAL PLOTTING (for debugging) ====
// We’ve removed any `transp`/`opacity` arguments. Instead, we use `color.new(baseColor, α)`
// for transparency, where α = 0 is fully opaque and α = 255 is fully transparent.
// 30m VWAP
plot(vwap30m, title = "VWAP 30m", color = color.new(color.teal, 80)) // ~31% transparentlinewidth= 1
// 1h VWAP
plot(vwap1h, title = "VWAP 1h", color = color.new(color.fuchsia, 80), linewidth= 1) // ~31% transparent
// 30m ATR vs ATR_MA
plot(atr30m, title = "ATR 30m", color = color.new(color.orange, 80))
plot(atr30m_ma, title = "ATR30m MA", color = color.new(color.yellow, 80))
// 30m MACD Histogram (bars)
plot(macd30m - macdSig30m, title = "MACD Histogram (30m)", style = plot.style_columns, color = (macd30m - macdSig30m >= 0 ? color.new(color.green, 80) : color.new(color.red, 80)))
// 1h MACD Histogram (area)
h1 = request.security(syminfo.tickerid, "60", macd1h - macdSig1h, lookahead=barmerge.lookahead_off)
plot(1, title = "MACD Hist (1h)", style = plot.style_area, color = (h1 >= 0 ? color.new(color.green, 80) : color.new(color.red, 80)))