Strategi Dagangan Osilator Momentum Dinamik

Penulis:ChaoZhang, Tarikh: 2023-12-15 11:00:25
Tag:

img

Ringkasan

Strategi Dagangan Osilator Momentum Dinamis (DMO) adalah strategi dagangan jangka pendek 15 minit berdasarkan penunjuk osilator momentum. Strategi ini menggabungkan beberapa penunjuk teknikal untuk menjana isyarat dagangan yang sangat tepat, yang dapat membantu peniaga baru membuat keputusan beli dan jual dalam tempoh masa yang singkat, mengawal risiko, dan meningkatkan keuntungan.

Logika Strategi

Strategi ini pertama menggunakan Saluran Doinchian untuk menentukan arah trend utama pasaran. Penembusan di atas jalur atas saluran adalah isyarat kenaikan, sementara penembusan di bawah jalur bawah adalah isyarat penurunan. Kedua, strategi ini menggunakan salah satu daripada tiga varian Hull Moving Average dalam kombinasi dengan saluran ATR adaptif untuk penilaian trend yang lebih tepat. Apabila garis cepat melintasi di atas garis tengah, ia adalah isyarat beli, dan apabila ia melintasi di bawah, ia adalah isyarat jual. Akhirnya, dengan bantuan penunjuk Halftrend untuk penapisan tambahan isyarat palsu, kebolehpercayaan isyarat perdagangan dapat ditingkatkan lagi. Setelah menerima isyarat perdagangan yang agak boleh dipercayai, strategi kemudian akan memasuki kedudukan panjang atau pendek yang sesuai.

Analisis Kelebihan

Kelebihan terbesar strategi DMO terletak pada gabungan organik beberapa penunjuk. Penunjuk yang berbeza boleh mengesahkan antara satu sama lain untuk menapis isyarat palsu, menjadikan setiap isyarat perdagangan lebih tepat dan boleh dipercayai. Di samping itu, cara Doinchian saluran untuk menilai trend utama adalah mudah dan mudah, dan cara penapis isyarat dengan garis Halftrend juga agak konvensional. Secara keseluruhan mudah difahami dengan kurva pembelajaran yang rendah untuk pemula. Berbanding dengan penunjuk tunggal, DMO dapat mencapai kadar kemenangan dan keuntungan yang lebih tinggi dengan jumlah dagangan yang sama.

Analisis Risiko

Walaupun strategi DMO agak stabil dan boleh dipercayai, mana-mana strategi perdagangan kuantitatif pasti membawa risiko tertentu. Khususnya, apabila garis cepat melintasi di bawah garis tengah, ia masih boleh menjadi isyarat palsu tanpa pengesahan dari penunjuk lain. Di samping itu, seperti semua strategi jangka pendek, DMO juga menghadapi risiko yang berkaitan dengan overtrading. Sekiranya berlaku peristiwa pasaran tiba-tiba yang menjadikan penunjuk tidak berkesan, tetapan stop loss yang tidak tepat juga boleh menyebabkan kerugian yang lebih besar. Untuk mengurangkan risiko, adalah dinasihatkan untuk menyesuaikan parameter penunjuk jangka menengah dan panjang dengan sewajarnya, menggabungkannya dengan penunjuk jangka masa yang lebih tinggi untuk pengesahan, dan meningkatkan jarak stop loss untuk mengawal ketat kerugian perdagangan tunggal.

Arahan pengoptimuman

Strategi DMO boleh dioptimumkan dalam aspek berikut: pertama, sesuaikan parameter Hull MA untuk mengimbangi kesan pelunturan dan kepekaan purata bergerak; kedua, memperbaiki logik saluran Doinchian, seperti menyesuaikan parameter saluran atau menambah sekatan tambahan; ketiga, cuba penunjuk lain untuk menggantikan Halftrend untuk penapisan yang lebih baik, seperti Bollinger Bands, KDJ, dll.; keempat, tentukan selang perdagangan yang sesuai berdasarkan ciri-ciri instrumen perdagangan yang berbeza, contohnya mengubahnya menjadi strategi 5 minit atau 30 minit. Langkah pengoptimuman ini dapat membantu menyesuaikan strategi DMO mengikut keadaan pasaran dan ciri instrumen untuk meningkatkan kestabilan.

Kesimpulan

DMO adalah strategi jangka pendek yang mengoptimumkan gabungan beberapa penunjuk. Ia mengintegrasikan Saluran Doinchian, Hull MA dan Halftrend untuk menentukan dengan berkesan trend pasaran dan menghasilkan isyarat perdagangan yang tepat. Dengan teknik yang agak mudah dan intuitif dan operasi yang mudah, ia boleh berfungsi sebagai strategi pengenalan untuk pemula. Berbanding dengan penunjuk tunggal, DMO dapat mencapai kadar kemenangan dan keuntungan yang lebih tinggi. Melalui langkah-langkah seperti penyesuaian parameter, peningkatan kombinasi dan spesifikasi selang, strategi DMO mempunyai potensi untuk mencapai prestasi unggul jangka panjang dengan kestabilan yang dipertingkatkan.


/*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)




Lebih lanjut