Strategi Perdagangan Osilator Momentum Dinamis

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

img

Gambaran umum

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.

Logika Strategi

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.

Analisis Keuntungan

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.

Analisis Risiko

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.

Arahan Optimasi

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.

Kesimpulan

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)




Lebih banyak