
Strategi moving average multi-faktor adalah strategi gabungan yang menggunakan garis intraday, moving average, crossover, dan garis rata-rata HA. Strategi ini bertujuan untuk menemukan lebih banyak peluang perdagangan dan mendapatkan keuntungan akumulasi yang lebih tinggi di pasar bull.
Logika inti dari strategi ini adalah bahwa sinyal jual beli yang dinilai menggunakan beberapa indikator teknis yang dikombinasikan, memberikan sinyal perdagangan dengan intensitas yang berbeda berdasarkan hasil dari pencocokan faktor yang berbeda.
Secara khusus, empat indikator teknis utama yang digunakan dalam strategi ini adalah:
Garis tengah. Strategi menggunakan warna garis tengah untuk menentukan tren harga, dua entitas hijau berturut-turut HA rata-rata adalah sinyal beli, dua entitas merah berturut-turut kosong HA rata-rata adalah sinyal kosong.
Moving Average. Strategi ini menggunakan tiga set parameter yang berbeda, yaitu Fast, Slow, dan Filter. Moving Average berfungsi sebagai sinyal beli ketika garis cepat melewati garis lambat dan garis lambat melewati garis geser, dan sebaliknya sebagai sinyal jual.
Indikator Stochastic. Indikator ini menentukan waktu persilangan polygon. Ketika %K garis dari arah bawah menembus %D garis, untuk sinyal beli; Ketika dari arah atas menembus bawah, untuk sinyal jual.
Mekanisme penilaian pencocokan. Menurut pencocokan beberapa faktor di atas, strategi menggunakan mekanisme penilaian. Semakin banyak faktor pencocokan, semakin besar kekuatan sinyal yang sesuai.
Dengan penilaian multi-faktor yang komprehensif, strategi dapat menangkap lebih banyak peluang perdagangan mikro dalam jangka pendek dan menengah, sehingga menghasilkan keuntungan ekstra di pasar banteng.
Keuntungan terbesar dari strategi moving average multi-faktor adalah meningkatkan keandalan sinyal. Indikator teknis tunggal mudah terjadi kesalahan sinyal, dan strategi ini digunakan dalam kombinasi dengan beberapa indikator untuk berpasangan, yang dapat secara efektif mengurangi gangguan sinyal palsu.
Selain itu, kombinasi multi-faktor dapat meningkatkan peluang perdagangan dibandingkan dengan hanya mengikuti satu indikator. Dalam pasar banteng, strategi dapat memperoleh keuntungan akumulatif yang lebih tinggi.
Risiko utama dari strategi ini adalah bahwa kombinasi multi faktor itu sendiri akan meningkatkan kompleksitas strategi. Perlu untuk menyelaraskan pengaturan parameter dari beberapa indikator, penyesuaian yang sering, dan sebagainya.
Selain itu, dalam pasar beruang, strategi memegang posisi bisa terlalu lama. Bahkan dengan pengaturan stop loss, sulit untuk menghindari kerugian besar.
Selain itu, indikator-indikator teknis seperti indikator stokastik dan garis rata-rata HA rentan terhadap kejadian tak terduga, mudah menghasilkan sinyal yang salah, yang menyebabkan kerugian yang tidak perlu.
Strategi ini dapat dioptimalkan dalam beberapa hal:
Mengoptimalkan pengaturan setiap parameter indikator untuk menemukan kombinasi parameter yang optimal.
Tambahkan modul pelatihan model dan parameter adaptasi, optimasi parameter secara real-time.
Meningkatkan strategi stop loss dan mengurangi strategi maksimum withdrawal.
Menambahkan modul kontrol posisi untuk menyesuaikan posisi secara dinamis sesuai dengan kondisi pasar.
Dengan menggunakan algoritma pembelajaran mesin, membangun model jaringan saraf untuk penilaian multi-faktor.
Kombinasi multi-faktor mengadaptasi strategi moving average secara komprehensif menggunakan keuntungan dari beberapa indikator teknis. Strategi ini dapat secara efektif meningkatkan kualitas sinyal dan mendapatkan keuntungan ekstra di pasar bullish. Tetapi juga meningkatkan kompleksitas strategi yang memerlukan pengujian dan pengoptimalan 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))