Strategi kombinasi multi-faktor dengan rata-rata bergerak adaptif adalah strategi gabungan yang menggabungkan penggunaan garis HA, rata-rata bergerak, crossover stokastik dan batang intraday.
Logika inti dari strategi ini adalah untuk menggabungkan beberapa indikator teknis untuk mencetak sinyal beli dan jual, dan menghasilkan sinyal perdagangan dengan kekuatan yang bervariasi berdasarkan hasil pencocokan.
Secara khusus, empat indikator teknis utama yang digunakan dalam strategi meliputi:
Bar intraday. Strategi ini menggunakan warna bar intraday untuk menentukan tren harga. Dua bar HA hijau berturut-turut memberikan sinyal beli, sementara dua bar HA berongga merah berturut-turut memberikan sinyal jual.
Rata-rata bergerak. Strategi ini menggunakan rata-rata bergerak cepat, lambat dan filter dengan pengaturan parameter yang berbeda secara bersamaan. Ketika garis cepat melintasi di atas garis lambat, dan garis lambat melintasi di atas garis filter, itu memberikan sinyal beli. Dan sebaliknya. Rata-rata bergerak baik dalam menentukan tren jangka menengah hingga panjang.
Indikator Stochastic. Indikator ini menentukan waktu persilangan bullish dan bearish. Ketika garis %K menembus garis %D dari bawah, itu memberikan sinyal beli. Dan ketika %K menembus %D dari atas, itu memberikan sinyal jual.
Mekanisme pencocokan skor. Menurut pencocokan faktor-faktor di atas, strategi mengadopsi mekanisme pencocokan. Semakin banyak faktor pencocokan, semakin kuat sinyal perdagangan yang sesuai.
Melalui penilaian yang komprehensif dari beberapa faktor, strategi dapat menangkap peluang perdagangan yang lebih halus dalam jangka menengah dan pendek, sehingga mencapai hasil yang berlebihan selama pasar bull.
Keuntungan terbesar dari strategi multi-faktor ini adalah meningkatkan keandalan sinyal perdagangan. Satu indikator teknis cenderung menghasilkan sinyal palsu. Dengan menggabungkan beberapa indikator, strategi ini dapat secara efektif mengurangi gangguan dari sinyal palsu.
Selain itu, dibandingkan dengan hanya mengikuti satu indikator, kombinasi multi-faktor dapat meningkatkan tingkat kemenangan perdagangan.
Risiko utama dari strategi ini adalah bahwa kombinasi multi-faktor itu sendiri meningkatkan kompleksitas strategi.
Bahkan dengan stop loss yang ada, kerugian yang signifikan masih bisa terjadi.
Selain itu, indikator teknis seperti garis Stochastic dan HA dapat dipengaruhi oleh peristiwa angsa hitam, yang cenderung menghasilkan sinyal palsu dan menyebabkan kerugian yang tidak perlu.
Strategi dapat dioptimalkan dalam aspek berikut:
Optimalkan pengaturan parameter dari setiap indikator untuk menemukan kombinasi yang optimal.
Tambahkan pelatihan model dan modul parameter adaptif untuk optimasi parameter real-time.
Tambahkan strategi stop loss untuk mengurangi penarikan maksimum.
Tambahkan modul kontrol posisi untuk menyesuaikan posisi secara dinamis berdasarkan kondisi pasar.
Menggabungkan algoritma pembelajaran mesin untuk membangun model jaringan saraf untuk sistem skor multi-faktor.
Strategi kombinasi multi-faktor dengan rata-rata bergerak adaptif menggabungkan kekuatan dari beberapa indikator teknis. Ini dapat secara efektif meningkatkan kualitas sinyal dan mencapai hasil yang berlebihan selama pasar bull. Tetapi pada saat yang sama, itu juga meningkatkan kompleksitas strategi, yang membutuhkan pengujian dan optimasi lebih lanjut.
/*backtest start: 2022-12-08 00:00:00 end: 2023-12-14 00:00:00 period: 1d basePeriod: 1h exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}] */ // This source code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/ // © cyrule //@version=4 strategy("2nd Grade Strategy", overlay=true, shorttitle="2GTS", max_lines_count = 500, max_labels_count = 500, calc_on_every_tick = true, calc_on_order_fills = true, pyramiding = 1, default_qty_type = strategy.percent_of_equity, default_qty_value = 10) source = input(close, title = "Source") // ********************** // * Heikin-Ahshi * // * kudos to garethyeo * // ********************** showHA = input(true, title = "Show Heikin Ashi?", group = "Heikin Ashi") ha_open = security(heikinashi(syminfo.tickerid), timeframe.period, open) ha_high = security(heikinashi(syminfo.tickerid), timeframe.period, high) ha_low = security(heikinashi(syminfo.tickerid), timeframe.period, low) ha_close = security(heikinashi(syminfo.tickerid), timeframe.period, close) bgcolor(iff(showHA and ha_open < ha_close , color.new(#53b987, transp = 92.5), na), title = 'Green HA') bgcolor(iff(showHA and ha_open >= ha_close, color.new(#eb4d5c, transp = 92.5), na), title = 'Red HA' ) // ****************** // * Moving Average * // ****************** // MA Settings showMA = input(true, title = "Show Moving Averages?", group = "Moving Averages") fastMALength = input(title = "Fast MA Length", minval = 1, step = 1, defval = 20, group = "Moving Averages") slowMALength = input(title = "Slow MA Length", minval = 1, step = 1, defval = 50, group = "Moving Averages") maType = input(title = "Moving Average Type", defval = "SMA", options = ["SMA", "EMA", "RMA", "WMA", "VWMA"], group = "Moving Averages") filterMALength = input(title = "Filter MA Length", minval = 1, step = 1, defval = 200, group = "Moving Averages") filterMAType = input(title = "Filter MA Type", defval = "EMA", options = ["SMA", "EMA", "RMA", "WMA", "VWMA"], group = "Moving Averages") // Calculate MA var float maFast = na var float maSlow = na var float maFilter = na if (maType == "SMA") maFast := sma(source, fastMALength) maSlow := sma(source, slowMALength) if (maType == "EMA") maFast := ema(source, fastMALength) maSlow := ema(source, slowMALength) if (maType == "RMA") maFast := rma(source, fastMALength) maSlow := rma(source, slowMALength) maFilter := rma(source, filterMALength) if (maType == "WMA") maFast := wma(source, fastMALength) maSlow := wma(source, slowMALength) if (maType == "VWMA") maFast := vwma(source, fastMALength) maSlow := vwma(source, slowMALength) if (filterMAType == "SMA") maFilter := sma(source, filterMALength) if (filterMAType == "EMA") maFilter := ema(source, filterMALength) if (filterMAType == "RMA") maFilter := rma(source, filterMALength) if (filterMAType == "WMA") maFilter := wma(source, filterMALength) if (filterMAType == "VWMA") maFilter := vwma(source, filterMALength) BiruAtasMerah = (maFast >= maSlow) and (maSlow >= maFilter) MerahAtasBiru = (maFast <= maSlow) and (maSlow <= maFilter) // Lukis MA plot(series = showMA ? maFast : na, color = color.blue, title = "MA Fast") plot(series = showMA ? maSlow : na, color = color.red, title = "MA Slow") plot(series = showMA ? maFilter : na, color = #FFCC00, title = "MA Filter") // ************** // * Stochastic * // ************** // Stochastic Settings showSSC = input(true, title = "Show Stochastic Crossovers?", group = "Stochastic") Length = input (10, minval = 1, title = "%K Length", group = "Stochastic") SmoothK = input (3, minval = 1, title = "%K Smoothing", group = "Stochastic") SmoothD = input (3, minval = 1, title = "%D Smoothing", group = "Stochastic") // Calculate Stochastic var float K = na var float D = na if (maType == "SMA") K := sma(stoch(source, high, low, Length), SmoothK) D := sma(K, SmoothD) if (maType == "EMA") K := ema(stoch(source, high, low, Length), SmoothK) D := ema(K, SmoothD) if (maType == "RMA") K := rma(stoch(source, high, low, Length), SmoothK) D := rma(K, SmoothD) if (maType == "WMA") K := wma(stoch(source, high, low, Length), SmoothK) D := wma(K, SmoothD) if (maType == "VWMA") K := vwma(stoch(source, high, low, Length), SmoothK) D := vwma(K, SmoothD) StochasticCrossOver = crossover(K, D) StochasticCrossUnder = crossunder(K, D) // Lukis SS plotshape(showSSC and StochasticCrossOver and K <= 20 ? K : na, text = "Golden\nCrossover", color = color.new(color.green, transp = 25), location = location.belowbar, size = size.tiny, title = "Golden Crossover" ) plotshape(showSSC and StochasticCrossUnder and K >= 80 ? D : na, text = "Deadly\nCrossover", color = color.new(color.red, transp = 25), location = location.belowbar, size = size.tiny, title = "Deadly Crossover" ) plotshape(showSSC and StochasticCrossOver and K <= 80 and K > 20 ? K : na, text = "Bullish\nCrossover", color = color.new(color.green, transp = 50), location = location.belowbar, size = size.tiny, title = "Bullish Crossover") plotshape(showSSC and StochasticCrossUnder and K >= 20 and K < 80 ? D : na, text = "Bearish\nCrossover", color = color.new(color.red, transp = 50), location = location.belowbar, size = size.tiny, title = "Bearish Crossover") showBull = input(true, title = "Show Bullish Signal?", group = "Signal") showBear = input(false, title = "Show Bearish Signal?", group = "Signal") bullishCriteria = 0 if (ha_open < ha_close) and (ha_open[1] < ha_close[1]) and (ha_open[2] >= ha_close[2]) bullishCriteria := bullishCriteria + 1 if (maFast > maSlow) and (maSlow > maFilter) bullishCriteria := bullishCriteria + 1 if (K > D) and (K > K[1]) and (D > D[1]) bullishCriteria := bullishCriteria + 1 bearishCriteria = 0 if (ha_open >= ha_close) and (ha_open[1] >= ha_close[1]) and (ha_open[2] < ha_close[2]) bearishCriteria := bearishCriteria + 1 if (maFast < maSlow) and (maSlow < maFilter) bearishCriteria := bearishCriteria + 1 if (K < D) and (K < K[1]) and (D < D[1]) bearishCriteria := bearishCriteria + 1 signal = color.new(color.white, transp = 0) if bearishCriteria == 2 signal := color.new(color.orange, transp = 50) if bearishCriteria == 3 signal := color.new(color.red, transp = 50) if bullishCriteria == 2 signal := color.new(color.aqua, transp = 50) if bullishCriteria == 3 signal := color.new(color.green, transp = 50) bullishCriteria := showBull ? bullishCriteria : 0 bearishCriteria := showBear ? bearishCriteria : 0 bgcolor(iff(bullishCriteria > 1, signal, na), title = 'Bullish Signal') bgcolor(iff(bearishCriteria > 1, signal, na), title = 'Bearish Signal') longTPPerc = input(title = "Take Profit Threshold (%)" , minval = 0.0, step = 0.5, defval = 2.5, group = "Trading") / 100 profitRatio = input(title = "Profit-to-Loss ratio (risk tolerance)", minval = 1.0, step = 0.1, defval = 1.4, group = "Trading") longSLPerc = longTPPerc / profitRatio takeProfit = strategy.position_avg_price * (1 + longTPPerc) stopLoss = strategy.position_avg_price * (1 - longSLPerc) strategy.initial_capital = 50000 strategy.entry("Long" , strategy.long , floor(strategy.initial_capital*.1/close), stop = strategy.position_avg_price * 1.25, when = bullishCriteria > 1) strategy.entry("Short", strategy.short, floor(strategy.initial_capital*.1/close), stop = strategy.position_avg_price * 1.25, when = bearishCriteria > 1) strategy.close("Long" , when = (open >= takeProfit) or (open <= stopLoss) or (high >= takeProfit) or (low <= stopLoss)) strategy.close("Short", when = (open >= takeProfit) or (open <= stopLoss) or (high >= takeProfit) or (low <= stopLoss)) plotshape(bullishCriteria, location = location.belowbar, color = color.new(color.black, transp = 100)) plotshape(bearishCriteria, location = location.belowbar, color = color.new(color.black, transp = 100))