Strategi Moving Average Quadruple adalah strategi perdagangan yang didasarkan pada beberapa moving average. Strategi ini menggunakan 5 periode dan jenis moving average yang berbeda untuk mengidentifikasi tren kuat di pasar. Tiga moving average pertama adalah komponen inti dari strategi ini, terutama untuk identifikasi tren dan pembuatan sinyal; sedangkan moving average keempat dan kelima terutama untuk penilaian tambahan dan analisis visual.
Dengan mempertimbangkan secara komprehensif pergerakan dan hubungan posisi relatif dari berbagai periode dan jenis rata-rata bergerak, strategi ini dapat menilai dengan lebih akurat arah dan kekuatan tren pasar saat ini, dan menyesuaikan posisi tepat waktu sesuai dengan perubahan tren untuk mendapatkan keuntungan yang lebih baik.
Strategi ini menggunakan 5 periode dan jenis rata-rata bergerak yang berbeda, yaitu:
Lima jenis rata-rata bergerak ini dapat diatur secara fleksibel, termasuk 8 jenis seperti SMA, EMA, WMA, TMA, VAR, WWMA, ZLEMA, dan TSF.
Gagasan inti dari strategi ini adalah menggunakan multiple trend confirmation dari berbagai periode dan jenis moving average untuk menilai arah dan intensitas tren:
Selain itu, strategi ini juga menampilkan warna garis K berdasarkan arah posisi saat ini:
Untuk mengurangi risiko di atas, pertimbangan untuk melakukan perbaikan adalah sebagai berikut:
Strategi Moving Average Five-Strong adalah strategi perdagangan yang didasarkan pada konfirmasi tren ganda, dengan mempertimbangkan secara komprehensif pergerakan rata-rata bergerak dari beberapa periode dan jenis, dapat menilai dengan akurat arah dan kekuatan tren pasar saat ini, dan menyesuaikan posisi sesuai dengan perubahan tren. Logika strategi ini sederhana dan jelas, parameternya fleksibel, sesuai dengan beberapa pasar, tetapi umumnya terjadi di pasar yang bergolak, dan ada risiko optimasi parameter tertentu dan risiko pergeseran tren.
/*backtest
start: 2023-05-17 00:00:00
end: 2024-05-22 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/
//@version=5
strategy("Quintuple Strong Moving Average Strategy","QuisMa", overlay=true, margin_long=100, margin_short=100)
// 1
mav1_show = input.bool(true, 'Show Plot', group='Level 1 ', inline='mav1_0')
mav1_label = input.bool(true, 'Show Label', group='Level 1 ', inline='mav1_0')
mav1_source = input.source(close, '', group='Level 1 ', inline='mav1_1')
mav1_timeframe = input.timeframe('5', '', group='Level 1 ', inline='mav1_1')
mav1_length = input.int(50, 'Length', group='Level 1 ', inline='mav1_3')
mav1_size = input.int(2000, 'Size', minval=1, group='Level 1 ', inline='mav1_3')
mav1_width = input.int(2, '', minval=0, group='Level 1 ', inline='mav1_2')
mav1_color = input.color(color.new(#ffd000, 0), '', group='Level 1 ', inline='mav1_2')
mav1_type = input.string(title='Moving Average Type 1', defval='VAR', options=['SMA', 'EMA', 'WMA', 'TMA', 'VAR', 'WWMA', 'ZLEMA', 'TSF'])
// 2
mav2_show = input.bool(true, 'Show Plot', group='Level 2', inline='mav2_0')
mav2_label = input.bool(true, 'Show Label', group='Level 2', inline='mav2_0')
mav2_source = input.source(close, '', group='Level 2', inline='mav2_1')
mav2_timeframe = input.timeframe('30', '', group='Level 2', inline='mav2_1')
mav2_length = input.int(50, 'Length', group='Level 2', inline='mav2_3')
mav2_size = input.int(2000, 'Size', minval=1, group='Level 2', inline='mav2_3')
mav2_width = input.int(2, '', minval=0, group='Level 2', inline='mav2_2')
mav2_color = input.color(color.new(#ffd000, 0), '', group='Level 2', inline='mav2_2')
mav2_type = input.string(title='Moving Average Type 2', defval='VAR', options=['SMA', 'EMA', 'WMA', 'TMA', 'VAR', 'WWMA', 'ZLEMA', 'TSF'])
// 3
mav3_show = input.bool(true, 'Show Plot', group='Level 3', inline='mav3_0')
mav3_label = input.bool(true, 'Show Label', group='Level 3', inline='mav3_0')
mav3_source = input.source(close, '', group='Level 3', inline='mav3_1')
mav3_timeframe = input.timeframe('60', '', group='Level 3', inline='mav3_1')
mav3_length = input.int(50, 'Length', group='Level 3', inline='mav3_3')
mav3_size = input.int(2000, 'Size', minval=1, group='Level 3', inline='mav3_3')
mav3_width = input.int(2, '', minval=0, group='Level 3', inline='mav3_2')
mav3_color = input.color(color.new(#ffd000, 0), '', group='Level 3', inline='mav3_2')
mav3_type = input.string(title='Moving Average Type 3', defval='VAR', options=['SMA', 'EMA', 'WMA', 'TMA', 'VAR', 'WWMA', 'ZLEMA', 'TSF'])
// 4
mav4_show = input.bool(true, 'Show Plot', group='Level 4', inline='mav4_0')
mav4_label = input.bool(true, 'Show Label', group='Level 4', inline='mav4_0')
mav4_source = input.source(close, '', group='Level 4', inline='mav4_1')
mav4_timeframe = input.timeframe('480', '', group='Level 4', inline='mav4_1')
mav4_length = input.int(50, 'Length', group='Level 4', inline='mav4_3')
mav4_size = input.int(2000, 'Size', minval=1, group='Level 4', inline='mav4_3')
mav4_width = input.int(2, '', minval=0, group='Level 4', inline='mav4_2')
mav4_color = input.color(color.new(#ffd000, 0), '', group='Level 4', inline='mav4_2')
mav4_type = input.string(title='Moving Average Type 4', defval='VAR', options=['SMA', 'EMA', 'WMA', 'TMA', 'VAR', 'WWMA', 'ZLEMA', 'TSF'])
// 5
mav5_show = input.bool(true, 'Show Plot', group='Level 5', inline='mav5_0')
mav5_label = input.bool(true, 'Show Label', group='Level 5', inline='mav5_0')
mav5_source = input.source(close, '', group='Level 5', inline='mav5_1')
mav5_timeframe = input.timeframe('720', '', group='Level 5', inline='mav5_1')
mav5_length = input.int(50, 'Length', group='Level 5', inline='mav5_3')
mav5_size = input.int(2000, 'Size', minval=1, group='Level 5', inline='mav5_3')
mav5_width = input.int(2, '', minval=0, group='Level 5', inline='mav5_2')
mav5_color = input.color(color.new(#ffd000, 0), '', group='Level 5', inline='mav5_2')
mav5_type = input.string(title='Moving Average Type 5', defval='VAR', options=['SMA', 'EMA', 'WMA', 'TMA', 'VAR', 'WWMA', 'ZLEMA', 'TSF'])
// FUNCTIONS {{{
candle_size_ms = time - time[1] // milliseconds of a candle
timetostring(tms) =>
d_ = math.floor(tms / 86400)
h_ = math.floor((tms - d_ * 86400) / 3600)
m_ = math.floor((tms - d_ * 86400 - h_ * 3600) / 60)
s_ = math.floor(tms - d_ * 86400 - h_ * 3600 - m_ * 60)
ret = d_ > 0 ? str.tostring(d_) + ' D ' : ''
ret += (h_ > 0 ? str.tostring(h_) + ' H ' : '')
ret += (m_ > 0 ? str.tostring(m_) + ' m ' : '')
if d_ == 0
ret += (s_ > 0 ? str.tostring(s_) + ' s ' : '')
ret
ret
tftostring(tf) =>
tfa = str.split(tf, '')
tfalast = array.get(tfa, array.size(tfa) - 1)
tfalastIsNum = na(str.tonumber(tfalast)) ? false : true
txt = tfalastIsNum ? timetostring(str.tonumber(tf) * 60) : tf
txt
htfLabel(htfy, tf, col) =>
txt = tftostring(tf)
htftxt = 'ᐊ ' + txt
htftip = 'HTF [ ' + txt + ' ] ' + str.tostring(htfy, '#.##')
label.new(x=time + candle_size_ms * 2, y=htfy, xloc=xloc.bar_time, yloc=yloc.price, color=color.new(color.black, 100), textcolor=col, style=label.style_label_left, size=size.normal, text=htftxt, tooltip=htftip)
// Moving Averages Functions {{{
Var_Func(src, length) =>
valpha = 2 / (length + 1)
vud1 = src > src[1] ? src - src[1] : 0
vdd1 = src < src[1] ? src[1] - src : 0
vUD = math.sum(vud1, 9)
vDD = math.sum(vdd1, 9)
vCMO = nz((vUD - vDD) / (vUD + vDD))
VAR = 0.0
VAR := nz(valpha * math.abs(vCMO) * src) + (1 - valpha * math.abs(vCMO)) * nz(VAR[1])
VAR
Wwma_Func(src, length) =>
wwalpha = 1 / length
WWMA = 0.0
WWMA := wwalpha * src + (1 - wwalpha) * nz(WWMA[1])
WWMA
Zlema_Func(src, length) =>
zxLag = length / 2 == math.round(length / 2) ? length / 2 : (length - 1) / 2
zxEMAData = src + src - src[zxLag]
ZLEMA = ta.ema(zxEMAData, length)
ZLEMA
Tsf_Func(src, length) =>
lrc = ta.linreg(src, length, 0)
lrc1 = ta.linreg(src, length, 1)
lrs = lrc - lrc1
TSF = ta.linreg(src, length, 0) + lrs
TSF
getMA(src, length, mav_type) =>
ma = 0.0
if mav_type == 'SMA'
ma := ta.sma(src, length)
if mav_type == 'EMA'
ma := ta.ema(src, length)
if mav_type == 'WMA'
ma := ta.wma(src, length)
if mav_type == 'TMA'
ma := ta.sma(ta.sma(src, math.ceil(length / 2)), math.floor(length / 2) + 1)
if mav_type == 'VAR'
ma := Var_Func(src, length)
if mav_type == 'WWMA'
ma := Wwma_Func(src, length)
if mav_type == 'ZLEMA'
ma := Zlema_Func(src, length)
if mav_type == 'TSF'
ma := Tsf_Func(src, length)
ma
mav1 = request.security(syminfo.tickerid, mav1_timeframe, getMA(mav1_source, mav1_length, mav1_type), gaps=barmerge.gaps_off, lookahead=barmerge.lookahead_on)
plot(mav1_show ? mav1 : na, 'mav 1', color=mav1_color, linewidth=mav1_width, show_last=mav1_size)
var label mav1lbl = na
label.delete(mav1lbl)
mav1lbl := mav1_label ? htfLabel(mav1, mav1_timeframe, mav1_color) : na
mav2 = request.security(syminfo.tickerid, mav2_timeframe, getMA(mav2_source, mav2_length, mav2_type), gaps=barmerge.gaps_off, lookahead=barmerge.lookahead_on)
plot(mav2_show ? mav2 : na, 'mav 2', color=mav2_color, linewidth=mav2_width, show_last=mav2_size)
var label mav2lbl = na
label.delete(mav2lbl)
mav2lbl := mav2_label ? htfLabel(mav2, mav2_timeframe, mav2_color) : na
mav3 = request.security(syminfo.tickerid, mav3_timeframe, getMA(mav3_source, mav3_length, mav3_type), gaps=barmerge.gaps_off, lookahead=barmerge.lookahead_on)
plot(mav3_show ? mav3 : na, 'mav 3', color=mav3_color, linewidth=mav3_width, show_last=mav3_size)
var label mav3lbl = na
label.delete(mav3lbl)
mav3lbl := mav3_label ? htfLabel(mav3, mav3_timeframe, mav3_color) : na
mav4 = request.security(syminfo.tickerid, mav4_timeframe, getMA(mav4_source, mav4_length, mav4_type), gaps=barmerge.gaps_off, lookahead=barmerge.lookahead_on)
plot(mav4_show ? mav4 : na, 'mav 4', color=mav4_color, linewidth=mav4_width, show_last=mav4_size)
var label mav4lbl = na
label.delete(mav4lbl)
mav4lbl := mav4_label ? htfLabel(mav4, mav4_timeframe, mav4_color) : na
mav5 = request.security(syminfo.tickerid, mav5_timeframe, getMA(mav5_source, mav5_length, mav5_type), gaps=barmerge.gaps_off, lookahead=barmerge.lookahead_on)
plot(mav5_show ? mav5 : na, 'mav 5', color=mav5_color, linewidth=mav5_width, show_last=mav5_size)
var label mav5lbl = na
label.delete(mav5lbl)
mav5lbl := mav5_label ? htfLabel(mav5, mav5_timeframe, mav5_color) : na
// Alış ve Satış Koşulları
alisKosulu = close > mav1 and close > mav2 and close > mav3
satisKosulu = close < mav1 and close < mav2 and close < mav3
// Alış ve Satış Sinyalleri
if (alisKosulu and not satisKosulu)
strategy.entry("Alış", strategy.long)
if (satisKosulu and not alisKosulu)
strategy.entry("Satış", strategy.short)
// Pozisyonları Kapatma Koşulları
if (strategy.opentrades > 0)
if (close < mav1 and close < mav2 and strategy.position_size > 0)
strategy.close("Alış")
if (close > mav1 and close > mav2 and strategy.position_size < 0)
strategy.close("Satış")
// Mum Rengi Ayarlama
longKosul = strategy.opentrades > 0 and strategy.position_size > 0
shortKosul = strategy.opentrades > 0 and strategy.position_size < 0
barcolor(longKosul ? color.green : shortKosul ? color.red : color.gray)