
Strategi Dagangan Dynamic Momentum Oscillator (DMO) adalah strategi perdagangan 15 minit yang pendek berdasarkan indikator goyah dinamik. Strategi ini menggabungkan pelbagai petunjuk teknikal untuk menghasilkan isyarat perdagangan yang sangat tepat, yang dapat membantu pedagang pemula membuat keputusan jual beli dalam masa yang singkat, mengawal risiko, meningkatkan kebarangkalian keuntungan.
Strategi ini pertama menggunakan saluran Doinchian untuk menentukan arah trend utama pasaran. Apabila harga menembusi saluran itu, ia adalah isyarat bullish, dan jika ia menembusi saluran itu, ia adalah isyarat bearish. Kemudian, strategi ini menggunakan salah satu daripada 3 varian Hull Moving Average, yang digabungkan dengan penyesuaian saluran ATR untuk mencapai penilaian trend yang lebih tepat.
Kelebihan terbesar strategi DMO adalah gabungan organik pelbagai petunjuk, yang boleh diverifikasi antara satu sama lain, sehingga menyaring isyarat palsu, menjadikan setiap isyarat perdagangan lebih tepat dan boleh dipercayai. Selain itu, cara saluran Doinchian menentukan trend utama adalah mudah dan langsung, cara penyaring isyarat separuh rata-rata adalah lebih biasa, secara keseluruhan mudah difahami, dan tidak sukar untuk pemula.
Walaupun strategi DMO lebih stabil dan boleh dipercayai, strategi perdagangan kuantitatif tidak dapat dielakkan dengan risiko tertentu. Khususnya, apabila garis cepat dan garis tengah menghasilkan garpu mati, ia mungkin masih menjadi isyarat palsu jika tidak ada pengesahan indikator lain. Selain itu, seperti semua strategi garis pendek, DMO juga menghadapi risiko perdagangan berlebihan.
Strategi DMO boleh dioptimumkan dari beberapa dimensi berikut: pertama, menyesuaikan parameter Hull MA, mengoptimumkan panjang rata-rata bergerak, keseimbangan antara kesan halus dan kepekaan; kedua, memperbaiki logik penghakiman saluran Doinchian, seperti menyesuaikan parameter saluran, atau menambah sekatan tambahan untuk masuk ke dalam permainan; ketiga, mencuba indikator lain untuk menggantikan purata separuh bulat, seperti pita Brin, KDJ, dan lain-lain, untuk meningkatkan kesan penapisan tambahan; keempat, menetapkan jarak perdagangan yang sesuai mengikut ciri-ciri produk yang berbeza, seperti perubahan kepada 5 minit atau 30 minit.
DMO adalah satu set strategi garis pendek untuk mengoptimumkan portfolio pelbagai indikator. Ia menggabungkan saluran Doinchian, Hull MA dan purata separuh keseluruhan, menilai tren pasaran dengan berkesan, menghasilkan isyarat perdagangan yang tepat.
/*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)