Strategi Trading Dynamic Momentum Oscillator (DMO) adalah strategi trading jangka pendek 15 menit berdasarkan indikator momentum oscillator. Strategi ini menggabungkan beberapa indikator teknis untuk menghasilkan sinyal trading yang sangat akurat, yang dapat secara efektif membantu trader pemula dalam membuat keputusan beli dan jual dalam waktu singkat, mengendalikan risiko, dan meningkatkan profitabilitas.
Strategi ini pertama-tama menggunakan saluran Doinchian untuk menentukan arah tren utama pasar. Penembusan di atas band atas saluran adalah sinyal bullish, sementara penembusan di bawah band bawah adalah sinyal bearish. Kedua, strategi mengadopsi salah satu dari tiga varian Hull Moving Average dalam kombinasi dengan saluran ATR adaptif untuk penilaian tren yang lebih tepat. Ketika garis cepat melintasi di atas garis tengah, itu adalah sinyal beli, dan ketika melintasi di bawah, itu adalah sinyal jual. Akhirnya, dengan bantuan indikator Halftrend untuk penyaringan tambahan sinyal palsu, keandalan sinyal perdagangan dapat ditingkatkan lebih lanjut. Setelah menerima sinyal perdagangan yang relatif dapat diandalkan, strategi kemudian akan memasuki posisi panjang atau pendek yang sesuai.
Keuntungan terbesar dari strategi DMO terletak pada kombinasi organik dari beberapa indikator. Indikator yang berbeda dapat memverifikasi satu sama lain untuk menyaring sinyal palsu, membuat setiap sinyal perdagangan lebih akurat dan dapat diandalkan. Selain itu, cara Doinchian channel untuk menilai tren utama sederhana dan langsung, dan cara penyaringan sinyal dengan garis Halftrend juga relatif konvensional. Secara keseluruhan mudah dipahami dengan kurva belajar yang rendah untuk pemula. Dibandingkan dengan indikator tunggal, DMO dapat mencapai tingkat kemenangan dan profitabilitas yang lebih tinggi mengingat jumlah perdagangan yang sama.
Meskipun strategi DMO relatif stabil dan dapat diandalkan, setiap strategi perdagangan kuantitatif pasti membawa risiko tertentu. Secara khusus, ketika garis cepat melintasi di bawah garis tengah, itu mungkin masih menjadi sinyal palsu tanpa verifikasi dari indikator lain. Selain itu, seperti semua strategi jangka pendek, DMO juga menghadapi risiko yang terkait dengan overtrading. Jika terjadi peristiwa pasar mendadak yang membuat indikator tidak efektif, pengaturan stop loss yang tidak tepat juga dapat menyebabkan kerugian yang lebih besar. Untuk mengurangi risiko, disarankan untuk menyesuaikan parameter indikator jangka menengah dan panjang dengan tepat, menggabungkannya dengan indikator jangka waktu yang lebih tinggi untuk verifikasi, dan meningkatkan jarak stop loss untuk mengontrol kerugian perdagangan tunggal secara ketat.
Strategi DMO dapat dioptimalkan dalam aspek berikut: pertama, menyesuaikan parameter Hull MA untuk menyeimbangkan efek perataan dan sensitivitas rata-rata bergerak; kedua, meningkatkan logika saluran Doinchian, seperti menyesuaikan parameter saluran atau menambahkan pembatasan tambahan; ketiga, mencoba indikator lain untuk menggantikan Halftrend untuk penyaringan yang lebih baik, seperti Bollinger Band, KDJ, dll.; keempat, menentukan interval perdagangan yang sesuai berdasarkan karakteristik instrumen perdagangan yang berbeda, misalnya mengubahnya menjadi strategi 5 menit atau 30 menit. Langkah-langkah optimalisasi ini dapat membantu menyesuaikan strategi DMO sesuai dengan kondisi pasar dan karakteristik instrumen untuk meningkatkan stabilitas.
DMO adalah strategi jangka pendek yang mengoptimalkan kombinasi beberapa indikator. Ini mengintegrasikan Doinchian Channel, Hull MA dan Halftrend untuk secara efektif menentukan tren pasar dan menghasilkan sinyal perdagangan yang tepat. Dengan teknik yang relatif sederhana dan intuitif dan pengoperasian yang mudah, ini dapat berfungsi sebagai strategi pengantar bagi pemula. Dibandingkan dengan indikator tunggal, DMO dapat mencapai tingkat kemenangan dan profitabilitas yang lebih tinggi. Melalui langkah-langkah seperti penyesuaian parameter, peningkatan kombinasi dan spesifikasi interval, strategi DMO memiliki potensi untuk mencapai kinerja unggul jangka panjang dengan stabilitas yang ditingkatkan.
/*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/ // © kgynofomo //@version=5 strategy(title="[Salavi] | Andy Super Pro Strategy [BTC|M15]",overlay = true, pyramiding = 1,initial_capital = 10000, default_qty_type = strategy.cash,default_qty_value = 10000) //Doinchian Trend Ribbon dlen = input.int(defval=30, minval=10) dchannel(len) => float hh = ta.highest(len) float ll = ta.lowest(len) int trend = 0 trend := close > hh[1] ? 1 : close < ll[1] ? -1 : nz(trend[1]) trend dchannelalt(len, maintrend) => float hh = ta.highest(len) float ll = ta.lowest(len) int trend = 0 trend := close > hh[1] ? 1 : close < ll[1] ? -1 : nz(trend[1]) maintrend == 1 ? trend == 1 ? #00FF00ff : #00FF009f : maintrend == -1 ? trend == -1 ? #FF0000ff : #FF00009f : na maintrend = dchannel(dlen) donchian_bull = maintrend==1 donchian_bear = maintrend==-1 //Hulls src = input(hlc3, title='Source') modeSwitch = input.string('Hma', title='Hull Variation', options=['Hma', 'Thma', 'Ehma']) length = input(55, title='Length') lengthMult = input(1.0, title='Length multiplier ') useHtf = false htf = '240' switchColor = true candleCol = false visualSwitch = true thicknesSwitch = 1 transpSwitch = 40 //FUNCTIONS //HMA HMA(_src, _length) => ta.wma(2 * ta.wma(_src, _length / 2) - ta.wma(_src, _length), math.round(math.sqrt(_length))) //EHMA EHMA(_src, _length) => ta.ema(2 * ta.ema(_src, _length / 2) - ta.ema(_src, _length), math.round(math.sqrt(_length))) //THMA THMA(_src, _length) => ta.wma(ta.wma(_src, _length / 3) * 3 - ta.wma(_src, _length / 2) - ta.wma(_src, _length), _length) //SWITCH Mode(modeSwitch, src, len) => modeSwitch == 'Hma' ? HMA(src, len) : modeSwitch == 'Ehma' ? EHMA(src, len) : modeSwitch == 'Thma' ? THMA(src, len / 2) : na //OUT _hull = Mode(modeSwitch, src, int(length * lengthMult)) HULL = useHtf ? request.security(syminfo.ticker, htf, _hull) : _hull MHULL = HULL[0] SHULL = HULL[2] //COLOR hullColor = switchColor ? HULL > HULL[2] ? #00ff00 : #ff0000 : #ff9800 hull_bull = HULL > HULL[2] bull_start = hull_bull and hull_bull[1]==false hull_bear = HULL < HULL[2] bear_start = hull_bear and hull_bear[1]==false barcolor(color=candleCol ? switchColor ? hullColor : na : na) //halftrend amplitude = input(title='Amplitude', defval=2) channelDeviation = input(title='Channel Deviation', defval=2) // showArrows = input(title='Show Arrows', defval=true) // showChannels = input(title='Show Channels', defval=true) var int trend = 0 var int nextTrend = 0 var float maxLowPrice = nz(low[1], low) var float minHighPrice = nz(high[1], high) var float up = 0.0 var float down = 0.0 float atrHigh = 0.0 float atrLow = 0.0 float arrowUp = na float arrowDown = na atr2 = ta.atr(100) / 2 dev = channelDeviation * atr2 highPrice = high[math.abs(ta.highestbars(amplitude))] lowPrice = low[math.abs(ta.lowestbars(amplitude))] highma = ta.sma(high, amplitude) lowma = ta.sma(low, amplitude) if nextTrend == 1 maxLowPrice := math.max(lowPrice, maxLowPrice) if highma < maxLowPrice and close < nz(low[1], low) trend := 1 nextTrend := 0 minHighPrice := highPrice minHighPrice else minHighPrice := math.min(highPrice, minHighPrice) if lowma > minHighPrice and close > nz(high[1], high) trend := 0 nextTrend := 1 maxLowPrice := lowPrice maxLowPrice if trend == 0 if not na(trend[1]) and trend[1] != 0 up := na(down[1]) ? down : down[1] arrowUp := up - atr2 arrowUp else up := na(up[1]) ? maxLowPrice : math.max(maxLowPrice, up[1]) up atrHigh := up + dev atrLow := up - dev atrLow else if not na(trend[1]) and trend[1] != 1 down := na(up[1]) ? up : up[1] arrowDown := down + atr2 arrowDown else down := na(down[1]) ? minHighPrice : math.min(minHighPrice, down[1]) down atrHigh := down + dev atrLow := down - dev atrLow ht = trend == 0 ? up : down var color buyColor = color.blue var color sellColor = color.red htColor = trend == 0 ? buyColor : sellColor // htPlot = plot(ht, title='HalfTrend', linewidth=2, color=htColor) // atrHighPlot = plot(showChannels ? atrHigh : na, title='ATR High', style=plot.style_circles, color=color.new(sellColor, 0)) // atrLowPlot = plot(showChannels ? atrLow : na, title='ATR Low', style=plot.style_circles, color=color.new(buyColor, 0)) // fill(htPlot, atrHighPlot, title='ATR High Ribbon', color=color.new(sellColor, 90)) // fill(htPlot, atrLowPlot, title='ATR Low Ribbon', color=color.new(buyColor, 90)) HalfTrend_buySignal = not na(arrowUp) and trend == 0 and trend[1] == 1 HalfTrend_sellSignal = not na(arrowDown) and trend == 1 and trend[1] == 0 // plotshape(showArrows and buySignal ? atrLow : na, title='Arrow Up', style=shape.triangleup, location=location.absolute, size=size.tiny, color=color.new(buyColor, 0)) // plotshape(showArrows and sellSignal ? atrHigh : na, title='Arrow Down', style=shape.triangledown, location=location.absolute, size=size.tiny, color=color.new(sellColor, 0)) //ema filter_ema = ta.ema(close,200) ema_bull = close>filter_ema ema_bear = close<filter_ema atr_length = input.int(7) atr = ta.atr(atr_length) atr_rsi_length = input.int(50) atr_rsi = ta.rsi(atr,atr_rsi_length) atr_valid = atr_rsi>50 longCondition = bull_start and atr_valid shortCondition = bear_start and atr_valid Exit_long_condition = shortCondition Exit_short_condition = longCondition if longCondition strategy.entry("Andy Buy",strategy.long, limit=close,comment="Andy Buy Here") if Exit_long_condition strategy.close("Andy Buy",comment="Andy Buy Out") // strategy.entry("Andy fandan Short",strategy.short, limit=close,comment="Andy 翻單 short Here") // strategy.close("Andy fandan Buy",comment="Andy short Out") if shortCondition strategy.entry("Andy Short",strategy.short, limit=close,comment="Andy short Here") // strategy.exit("STR","Long",stop=longstoploss) if Exit_short_condition strategy.close("Andy Short",comment="Andy short Out") // strategy.entry("Andy fandan Buy",strategy.long, limit=close,comment="Andy 翻單 Buy Here") // strategy.close("Andy fandan Short",comment="Andy Buy Out") inLongTrade = strategy.position_size > 0 inLongTradecolor = #58D68D notInTrade = strategy.position_size == 0 inShortTrade = strategy.position_size < 0 // bgcolor(color = inLongTrade?color.rgb(76, 175, 79, 70):inShortTrade?color.rgb(255, 82, 82, 70):na) plotshape(close!=0,location = location.bottom,color = inLongTrade?color.green:inShortTrade?color.red:na) plotshape(longCondition, title='Buy', text='Andy Buy', style=shape.labelup, location=location.belowbar, color=color.new(color.green, 0), textcolor=color.new(color.white, 0), size=size.tiny) plotshape(shortCondition, title='Sell', text='Andy Sell', style=shape.labeldown, location=location.abovebar, color=color.new(color.red, 0), textcolor=color.new(color.white, 0), size=size.tiny) Fi1 = plot(MHULL, title='MHULL', color=hullColor, linewidth=thicknesSwitch, transp=50) Fi2 = plot(SHULL, title='SHULL', color=hullColor, linewidth=thicknesSwitch, transp=50) fill(Fi1, Fi2, title='Band Filler', color=hullColor, transp=transpSwitch)