Strategi Perdagangan Bitcoin dengan Filter Momentum Multi Osilator Mean Reversion

RSI WT STOCH RSI MEAN REVERSION OSCILLATOR SCALPING FIBONACCI momentum
Tanggal Pembuatan: 2025-08-15 12:00:17 Akhirnya memodifikasi: 2025-08-15 12:00:17
menyalin: 0 Jumlah klik: 286
2
fokus pada
319
Pengikut

Strategi Perdagangan Bitcoin dengan Filter Momentum Multi Osilator Mean Reversion Strategi Perdagangan Bitcoin dengan Filter Momentum Multi Osilator Mean Reversion

Ringkasan

Strategi ini adalah strategi kuantitatif yang dirancang khusus untuk perdagangan garis pendek bitcoin. Strategi ini menggabungkan saluran RSI, indikator WaveTrend, dan indikator RSI acak untuk membentuk sistem pemfilteran berlapis. Inti dari strategi ini adalah memanfaatkan karakteristik harga yang terobosan pada saluran RSI, sementara menggunakan WaveTrend dan RSI acak sebagai filter konfirmasi untuk memastikan perdagangan dengan tingkat kemenangan tinggi di zona overbought dan oversold.

Prinsip Strategi

Strategi ini didasarkan pada kerja sama tiga indikator teknis utama:

  1. RSI Channel (RSI Bands)Strategi ini menggunakan indikator RSI Channel yang telah dimodifikasi, berdasarkan level RSI overbought (70), dan oversold (30), untuk menghitung harga di atas, bawah, dan di tengah-tengah. Ini menghasilkan sinyal plus ketika harga menembus bawah, dan sinyal minus ketika harga menembus atas.

  2. Indikator WaveTrend: Menggunakan indikator WT1 dari LazyBear, dengan panjang saluran default 11, panjang rata-rata 12, level overbought +60, level oversold -60 ↓ Indikator ini adalah osilator dinamis yang digunakan untuk mengkonfirmasi apakah pasar berada dalam keadaan overbought atau oversold ↓

  3. RSI acak (RSI stokastik): Hanya menggunakan K-line, dengan K-length 5, RSI-length 14, dan random-length 10. Indikator ini lebih lanjut mengkonfirmasi keadaan pasar overbought dan oversold, meningkatkan keandalan sinyal.

Logika generasi sinyal dari strategi ini adalah sebagai berikut:

  • Buat sinyal lebih: harga turun dari RSI downtrend AND WT indikator di bawah tingkat oversold ((-60) AND K-nilai RSI acak di bawah tingkat oversold ((0 + toleransi)
  • Sinyal kosong: Harga menembus RSI naik AND WT indikator lebih tinggi dari level overbought ((+60) AND K-nilai RSI acak lebih tinggi dari level overbought ((100 - toleransi)

Ada dua pilihan mode pemicu perdagangan: “Cross (close) ” menggunakan harga penutupan melintasi saluran RSI, “Touch (wick) ” memungkinkan garis bayangan menyentuh sinyal pemicu saluran RSI. Selain itu, strategi ini juga mencakup mekanisme mundur mundur, yaitu ketika sinyal sebaliknya muncul, posisi bisa dihapus dan mundur untuk membuka posisi, cocok untuk lingkungan pasar yang lebih volatil.

Keunggulan Strategis

Dari analisis kode strategi ini, dapat disimpulkan keuntungan yang signifikan sebagai berikut:

  1. Sistem Filtrasi BerbagaiDengan menggabungkan tiga indikator teknis yang berbeda (saluran RSI, WaveTrend, dan RSI acak), membentuk sistem penyaringan multi-lapisan yang kuat, yang secara signifikan mengurangi risiko false breakout dan meningkatkan kualitas dan keandalan sinyal perdagangan.

  2. Mekanisme transaksi yang fleksibelStrategi menawarkan berbagai pilihan yang dapat disesuaikan, termasuk apakah menggunakan reverse exit, apakah mengaktifkan stop/stop loss, dan pilihan modus pemicu, yang memungkinkan pedagang untuk beradaptasi dengan kondisi pasar dan preferensi risiko pribadi.

  3. Manajemen risiko yang efektifPerbedaan antara sistem perdagangan Forex dan sistem perdagangan Forex lainnya adalah bahwa sistem perdagangan Forex memiliki sistem stop loss yang terintegrasi, yang memungkinkan pengendalian risiko dan pengembalian yang tepat untuk setiap transaksi, yang melindungi keamanan dana.

  4. Sistem peringatan otomatis: Terintegrasi dengan fitur Telegram Alert, yang memungkinkan pemberitahuan sinyal transaksi secara real-time, sehingga trader dapat melacak dan melakukan transaksi secara real-time.

  5. Mekanisme Informasi Anti Sampah: Strategi ini menerapkan mekanisme untuk mencegah pengulangan alarm, memastikan bahwa hanya satu sinyal yang dikirim dalam K-line yang sama, dan menghindari informasi yang berlebihan.

  6. Adaptasi perdagangan frekuensi tinggiStrategi ini didasarkan pada kerangka waktu 1 menit, cocok untuk lingkungan perdagangan frekuensi tinggi, dan mampu menangkap fluktuasi harga jangka pendek untuk masuk dan keluar pasar dengan cepat.

Risiko Strategis

Meskipun strategi ini dirancang dengan baik, masih ada beberapa risiko potensial:

  1. Risiko perdagangan frekuensi tinggiHal ini dapat menyebabkan overtrading dan meningkatkan biaya transaksi. Solusi: Pertimbangkan untuk menambahkan filter waktu tambahan atau hanya berdagang pada waktu pasar tertentu.

  2. Risiko Penembusan PalsuMeskipun ada beberapa filter, dalam pasar yang sangat berfluktuasi, mungkin ada hal-hal yang dapat menyebabkan kerugian perdagangan. Solusi: menyesuaikan parameter indikator, menambahkan kondisi konfirmasi, atau menilai tren dengan periode waktu yang lebih lama.

  3. Parameter SensitivitasPerforma strategi sangat bergantung pada pengaturan parameter, dan mungkin memerlukan parameter yang berbeda dalam lingkungan pasar yang berbeda. Solusi: Melakukan retrospeksi sejarah yang memadai, menemukan kombinasi parameter yang optimal, dan mengoptimalkan kembali parameter secara berkala.

  4. Adaptasi terhadap tren pasarSolusi: Tambahkan filter tren dan membatasi perdagangan kontra-tren selama tren kuat.

  5. Risiko sistemikBergantung pada sistem pemberitahuan Telegram, jika sistem pemberitahuan mengalami kerusakan, Anda mungkin akan kehilangan peluang transaksi. Solusi: Mengimplementasikan saluran pemberitahuan cadangan atau mekanisme peringatan lokal.

Arah optimasi strategi

Berdasarkan analisis kode, strategi ini dapat dioptimalkan dari beberapa arah:

  1. Menambahkan penilaian status pasar: Memperkenalkan mekanisme adaptasi, menyesuaikan parameter strategi secara dinamis sesuai dengan volatilitas pasar dan intensitas tren. Hal ini memungkinkan strategi untuk tetap berkinerja baik di berbagai lingkungan pasar. Implementasi spesifik dapat menilai kondisi pasar dengan menghitung ATR (rata-rata real amplitude) atau indikator volatilitas.

  2. Analisis multi-frame waktu: Mengintegrasikan informasi tren pasar dari kerangka waktu yang lebih tinggi, hanya berdagang di arah tren utama, atau menggunakan pengaturan parameter yang berbeda dalam kondisi tren yang berbeda. Misalnya, Anda dapat menambahkan garis harian atau 4 jam untuk menilai tren, hanya melakukan lebih banyak dalam tren naik, hanya melakukan nol dalam tren turun.

  3. Optimalkan waktu masuk: Peningkatan akurasi entry dengan meningkatkan konfirmasi volume transaksi atau identifikasi pola perilaku harga. Anda dapat mempertimbangkan untuk menunggu titik entry yang lebih menguntungkan setelah sinyal dihasilkan, daripada masuk langsung.

  4. Peningkatan mekanisme stop loss: Membuat stop loss yang dinamis, seperti tracking stop loss atau stop loss yang berbasis pada volatilitas, untuk menyesuaikan dengan kondisi pasar yang berbeda. Misalnya, Anda dapat mengatur jarak stop loss berdasarkan ATR, atau menggunakan mobile stop loss protection profit.

  5. Menambahkan elemen pembelajaran mesin: Menggunakan algoritma pembelajaran mesin untuk secara otomatis mengidentifikasi kombinasi parameter terbaik atau memprediksi efektivitas sinyal. Dengan model pelatihan data historis, setiap sinyal perdagangan diberikan bobot probabilitas.

  6. Manajemen risikoUntuk mencapai skala posisi dinamis berdasarkan nilai bersih akun, mengurangi volume transaksi setelah kerugian berturut-turut, meningkatkan volume transaksi setelah keuntungan berturut-turut, dan mencapai manajemen dana yang lebih ilmiah.

Meringkaskan

“Multiple Oscillator Dynamic Filtered Average Return Bitcoin Trading Strategy” adalah sistem perdagangan short-line yang dirancang dengan baik, yang secara efektif mengidentifikasi pasar overbought dan oversold melalui saluran RSI, WaveTrend, dan sinergi RSI acak, dan menangkap peluang perdagangan yang kembali ke nilai rata-rata. Strategi ini memiliki beberapa filter, mekanisme perdagangan yang fleksibel, manajemen risiko yang efisien, dan peringatan otomatis, yang cocok untuk pedagang short-line di pasar bitcoin.

Namun, strategi ini juga menghadapi tantangan seperti risiko perdagangan frekuensi tinggi, risiko terobosan palsu, dan adaptasi pasar. Dengan menambahkan penilaian status pasar, analisis multi-frame waktu, optimalisasi waktu masuk, perbaikan mekanisme stop loss, dan pengelolaan posisi dinamis, strategi ini dapat meningkatkan stabilitas dan profitabilitas strategi.

Bagi pedagang kuantitatif yang ingin melakukan perdagangan singkat di pasar bitcoin, strategi ini memberikan kerangka dasar yang solid yang dapat disesuaikan dan dioptimalkan secara individual sesuai dengan gaya perdagangan individu dan persepsi pasar untuk mencapai tujuan keuntungan yang stabil.

Kode Sumber Strategi
/*backtest
start: 2024-08-15 00:00:00
end: 2025-08-13 08:00:00
period: 1d
basePeriod: 1d
exchanges: [{"eid":"Futures_Binance","currency":"BNB_USDT"}]
*/

//@version=5
strategy("RS BTC 1", overlay=true, max_labels_count=500, initial_capital=100, commission_type=strategy.commission.percent, commission_value=0.003, default_qty_type=strategy.percent_of_equity, default_qty_value=100, calc_on_every_tick=true, process_orders_on_close=false, pyramiding=0)

// ==== Inputs
// RSI Bands
rsiLen   = input.int(14, "RSI Length")
obLevel  = input.int(70, "RSI Overbought")
osLevel  = input.int(30, "RSI Oversold")

// WT (LazyBear)
wtLen1   = input.int(11, "WT Channel Length")
wtLen2   = input.int(12, "WT Avg Length")
wtOB     = input.float( 60.0, "WT Overbought (+)")
wtOS     = input.float(-60.0, "WT Oversold (-)")

// Stoch RSI (sadece K filtresi)
kLen     = input.int(5,  "StochRSI K")
rsiLenSR = input.int(14, "StochRSI RSI Length")
stLen    = input.int(10, "Stoch Length")
rsiSrc   = input.source(close, "RSI Source")
stochOB  = input.float(100.0, "StochRSI OB (K ≥)", step=0.1)
stochOS  = input.float(0.0,   "StochRSI OS (K ≤)", step=0.1)
eps      = input.float(0.5,   "Tolerance around 0/100", step=0.1)

// Tetik modu
triggerMode = input.string("Cross(close)", "Trigger mode", options=["Cross(close)","Touch(wick)"])
showMid     = input.bool(true,  "Show RSI mid band")

// Çıkış seçenekleri
useReverseExit = input.bool(true,  "Exit & reverse on opposite band cross (swing)")
useTP          = input.bool(true,  "Enable Take Profit %")
useSL          = input.bool(true,  "Enable Stop Loss %")
tpPerc         = input.float(1.00, "TP %", step=0.01, minval=0.01)
slPerc         = input.float(1.00, "SL %", step=0.01, minval=0.01)

// ==== RSI Bands (LazyBear) – Mantık aynı, sadece ince çizgi
src = close
ep  = 2 * rsiLen - 1
auc = ta.ema(math.max(src - src[1], 0), ep)
adc = ta.ema(math.max(src[1] - src, 0), ep)
x1  = (rsiLen - 1) * (adc * obLevel / (100 - obLevel) - auc)
x2  = (rsiLen - 1) * (adc * osLevel / (100 - osLevel) - auc)
ub  = x1 >= 0 ? src + x1 : src + x1 * (100 - obLevel) / obLevel
lb  = x2 >= 0 ? src + x2 : src + x2 * (100 - osLevel) / osLevel
mid = (ub + lb) / 2.0

plot(ub,  "RSI Upper", color=color.yellow, linewidth=1)
plot(lb,  "RSI Lower", color=color.aqua,   linewidth=1)
plot(showMid ? mid : na, "RSI Mid", color=color.gray, linewidth=1)

// ==== WaveTrend (LazyBear WT1)
ap  = hlc3
esa = ta.ema(ap, wtLen1)
d   = ta.ema(math.abs(ap - esa), wtLen1)
ci  = (ap - esa) / (0.015 * d)
wt1 = ta.ema(ci, wtLen2)

// ==== Stoch RSI K (0..100)
rsiVal   = ta.rsi(rsiSrc, rsiLenSR)
stochRaw = ta.stoch(rsiVal, rsiVal, rsiVal, stLen)
stochK   = ta.sma(stochRaw, kLen)

// ==== Sinyaller
longCrossRaw  = triggerMode == "Cross(close)" ? ta.crossunder(close, lb) : ta.crossunder(low,  lb)
shortCrossRaw = triggerMode == "Cross(close)" ? ta.crossover( close, ub) : ta.crossover( high, ub)

stochLongOK  = stochK <= (stochOS + eps)
stochShortOK = stochK >= (stochOB - eps)
wtLongOK     = wt1 < wtOS
wtShortOK    = wt1 > wtOB

longSig_raw  = longCrossRaw  and wtLongOK  and stochLongOK
shortSig_raw = shortCrossRaw and wtShortOK and stochShortOK

longSig  = useReverseExit ? longSig_raw  : (longSig_raw  and strategy.position_size == 0)
shortSig = useReverseExit ? shortSig_raw : (shortSig_raw and strategy.position_size == 0)

// ==== İşlemler
if longSig
    if useReverseExit and strategy.position_size < 0
        strategy.close("S")
    if strategy.position_size <= 0
        strategy.entry("L", strategy.long)

if shortSig
    if useReverseExit and strategy.position_size > 0
        strategy.close("L")
    if strategy.position_size >= 0
        strategy.entry("S", strategy.short)

// ==== TP / SL
if strategy.position_size > 0 and (useTP or useSL)
    longEntryPrice = strategy.position_avg_price
    longTP  = useTP ? longEntryPrice * (1 + tpPerc/100.0) : na
    longSL  = useSL ? longEntryPrice * (1 - slPerc/100.0) : na
    strategy.exit(id="L-EXIT", from_entry="L", limit=longTP, stop=longSL)

if strategy.position_size < 0 and (useTP or useSL)
    shortEntryPrice = strategy.position_avg_price
    shortTP = useTP ? shortEntryPrice * (1 - tpPerc/100.0) : na
    shortSL = useSL ? shortEntryPrice * (1 + slPerc/100.0) : na
    strategy.exit(id="S-EXIT", from_entry="S", limit=shortTP, stop=shortSL)


// ==== ENTRY alert (tek bar / tek kez) ====
// TV Alert -> Condition: Any alert() function call
// Webhook  -> https://api.telegram.org/bot<YOUR_TOKEN>/sendMessage
// Message  -> BOŞ (alert() JSON yolluyor)

chatId   = input.string("-1002849453919", "Telegram chat_id (channel)")
lotTxt   = input.string("0.20", "Lot (text)")
tpPips   = input.int(10000,  "TP (pip)")   // SL yok

makeJson(_txt) => '{"chat_id":"' + chatId + '","text":"' + _txt + '"}'

// MT5 sembolü sabit
longTxt  = 'BUY BTCUSD# '  + lotTxt + ' TP=' + str.tostring(tpPips) + 'pip'
shortTxt = 'SELL BTCUSD# ' + lotTxt + ' TP=' + str.tostring(tpPips) + 'pip'

// Giriş oldu mu? (bar içinde)
enteredLong  = strategy.position_size >  0 and strategy.position_size[1] <= 0
enteredShort = strategy.position_size <  0 and strategy.position_size[1] >= 0

// --- anti-spam: aynı barda yalnızca 1 kere gönder ---
var int  lastEntryBar = na
var int  lastDir      = 0   // +1: long, -1: short

if enteredLong and (lastEntryBar != bar_index or lastDir != 1)
    alert(makeJson(longTxt), alert.freq_once_per_bar)   // tek gönderim
    lastEntryBar := bar_index
    lastDir      := 1

if enteredShort and (lastEntryBar != bar_index or lastDir != -1)
    alert(makeJson(shortTxt), alert.freq_once_per_bar)
    lastEntryBar := bar_index
    lastDir      := -1