Chiến lược giao dịch Dynamic Momentum Oscillator (DMO) là một chiến lược giao dịch ngắn hạn 15 phút dựa trên các chỉ số dao động động. Chiến lược này kết hợp nhiều chỉ số kỹ thuật để tạo ra các tín hiệu giao dịch rất chính xác, có thể giúp các nhà giao dịch mới bắt đầu đưa ra quyết định mua và bán trong một khoảng thời gian ngắn, kiểm soát rủi ro và tăng lợi nhuận.
Chiến lược này đầu tiên sử dụng kênh Doinchian để xác định hướng xu hướng chính của thị trường. Một sự đột phá trên dải trên của kênh là một tín hiệu tăng, trong khi một sự đột phá dưới dải dưới là một tín hiệu giảm. Thứ hai, chiến lược này áp dụng một trong ba biến thể Hull Moving Average kết hợp với một kênh ATR thích nghi để đánh giá xu hướng chính xác hơn. Khi đường nhanh vượt qua trên đường giữa, đó là một tín hiệu mua, và khi nó vượt qua dưới, đó là một tín hiệu bán. Cuối cùng, với sự trợ giúp của chỉ số Halftrend để lọc thêm các tín hiệu sai, độ tin cậy của các tín hiệu giao dịch có thể được cải thiện hơn nữa. Sau khi nhận được các tín hiệu giao dịch tương đối đáng tin cậy, chiến lược sau đó sẽ nhập vào các vị trí dài hoặc ngắn tương ứng.
Lợi thế lớn nhất của chiến lược DMO nằm trong sự kết hợp hữu cơ của nhiều chỉ số. Các chỉ số khác nhau có thể xác minh lẫn nhau để lọc ra các tín hiệu sai, làm cho mỗi tín hiệu giao dịch chính xác và đáng tin cậy hơn. Ngoài ra, cách Doinchian kênh đánh giá xu hướng chính là đơn giản và thẳng thắn, và các phương tiện lọc tín hiệu với đường Halftrend cũng tương đối thông thường. Nhìn chung nó dễ hiểu với đường cong học tập thấp cho người mới bắt đầu. So với chỉ số duy nhất, DMO có thể đạt được tỷ lệ thắng cao hơn và lợi nhuận với cùng số lượng giao dịch.
Mặc dù chiến lược DMO tương đối ổn định và đáng tin cậy, nhưng bất kỳ chiến lược giao dịch định lượng nào cũng có những rủi ro nhất định. Cụ thể, khi đường nhanh vượt dưới đường trung bình, nó vẫn có thể là một tín hiệu sai mà không cần xác minh từ các chỉ số khác. Ngoài ra, giống như tất cả các chiến lược ngắn hạn, DMO cũng phải đối mặt với rủi ro liên quan đến quá mức giao dịch. Nếu các sự kiện thị trường đột ngột xảy ra khiến các chỉ số không hiệu quả, việc thiết lập stop loss không đúng cũng có thể dẫn đến tổn thất lớn hơn. Để giảm thiểu rủi ro, nên điều chỉnh các tham số của các chỉ số trung và dài hạn, kết hợp chúng với các chỉ số khung thời gian cao hơn để xác minh và tăng khoảng cách stop loss để kiểm soát chặt chẽ các lỗ giao dịch duy nhất.
Chiến lược DMO có thể được tối ưu hóa theo các khía cạnh sau: đầu tiên, điều chỉnh các tham số của Hull MA để cân bằng hiệu ứng làm mịn và độ nhạy của các đường trung bình động; thứ hai, cải thiện logic kênh Doinchian, chẳng hạn như điều chỉnh các tham số kênh hoặc thêm các hạn chế bổ sung; thứ ba, thử các chỉ số khác để thay thế Halftrend để lọc tốt hơn, chẳng hạn như Bollinger Bands, KDJ, vv; thứ tư, chỉ định khoảng thời gian giao dịch phù hợp dựa trên các đặc điểm của các công cụ giao dịch khác nhau, ví dụ như thay đổi nó thành một chiến lược 5 phút hoặc 30 phút. Các biện pháp tối ưu hóa này có thể giúp tùy chỉnh chiến lược DMO theo điều kiện thị trường và đặc điểm của công cụ để tăng sự ổn định.
DMO là một chiến lược ngắn hạn tối ưu hóa sự kết hợp của nhiều chỉ số. Nó tích hợp Doinchian Channel, Hull MA và Halftrend để xác định hiệu quả xu hướng thị trường và tạo ra các tín hiệu giao dịch chính xác. Với các kỹ thuật tương đối đơn giản và trực quan và hoạt động dễ dàng, nó có thể phục vụ như một chiến lược giới thiệu cho người mới bắt đầu. So với chỉ số duy nhất, DMO có thể đạt được tỷ lệ thắng cao hơn và lợi nhuận. Thông qua các biện pháp như điều chỉnh tham số, cải thiện sự kết hợp và đặc tả khoảng thời gian, chiến lược DMO có tiềm năng đạt được hiệu suất vượt trội lâu dài với sự ổn định tăng cường.
/*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)