La estrategia de negociación del oscilador de momento dinámico (DMO) es una estrategia de negociación a corto plazo de 15 minutos basada en indicadores de oscilador de momento. Esta estrategia combina múltiples indicadores técnicos para generar señales comerciales altamente precisas, que pueden ayudar eficazmente a los operadores novatos a tomar decisiones de compra y venta en un corto período de tiempo, controlar riesgos y aumentar la rentabilidad.
Esta estrategia utiliza primero el canal Doinchian para determinar la dirección de tendencia principal del mercado. Una ruptura por encima de la banda superior del canal es una señal alcista, mientras que una ruptura por debajo de la banda inferior es una señal bajista. En segundo lugar, la estrategia adopta una de las tres variantes de Hull Moving Average en combinación con un canal ATR adaptativo para un juicio de tendencia más preciso. Cuando la línea rápida cruza por encima de la línea media, es una señal de compra, y cuando cruza por debajo, es una señal de venta. Finalmente, con la ayuda del indicador Halftrend para filtrar adicionalmente las señales falsas, la confiabilidad de las señales de negociación puede mejorarse aún más.
La mayor ventaja de la estrategia de DMO radica en la combinación orgánica de múltiples indicadores. Diferentes indicadores pueden verificarse entre sí para filtrar señales falsas, haciendo que cada señal de negociación sea más precisa y confiable. Además, la forma en que el canal Doinchian® juzga la tendencia principal es simple y directa, y los medios de filtrar señales con la línea de media tendencia también son relativamente convencionales. En general, es fácil de entender con una baja curva de aprendizaje para los principiantes. En comparación con los indicadores individuales, DMO puede lograr tasas de ganancia y rentabilidad más altas dado el mismo número de operaciones.
Aunque la estrategia de DMO es relativamente estable y confiable, cualquier estrategia de negociación cuantitativa está destinada a conllevar ciertos riesgos. Específicamente, cuando la línea rápida cruza por debajo de la línea media, aún puede ser una señal falsa sin verificación de otros indicadores. Además, como todas las estrategias a corto plazo, DMO también enfrenta riesgos asociados con el exceso de negociación. Si ocurren eventos repentinos del mercado que hacen que los indicadores sean ineficaces, la configuración inadecuada de stop loss también puede conducir a mayores pérdidas. Para mitigar los riesgos, es aconsejable ajustar adecuadamente los parámetros de los indicadores a mediano y largo plazo, combinarlos con indicadores de marcos de tiempo más altos para la verificación y aumentar la distancia de stop loss para controlar estrictamente las pérdidas de una sola operación.
La estrategia DMO puede optimizarse en los siguientes aspectos: primero, ajustar los parámetros del Hull MA para equilibrar el efecto de suavización y la sensibilidad de las medias móviles; segundo, mejorar la lógica del canal Doinchian, como ajustar los parámetros del canal o agregar restricciones adicionales; tercero, probar otros indicadores para reemplazar la Halftrend para una mejor filtración, como bandas de Bollinger, KDJ, etc.; cuarto, especificar intervalos de negociación apropiados basados en las características de diferentes instrumentos comerciales, por ejemplo, cambiándolo a una estrategia de 5 minutos o 30 minutos. Estas medidas de optimización pueden ayudar a personalizar la estrategia DMO de acuerdo con las condiciones del mercado y las características del instrumento para mejorar la estabilidad.
DMO es una estrategia a corto plazo que optimiza la combinación de múltiples indicadores. Integra Doinchian Channel, Hull MA y Halftrend para determinar efectivamente las tendencias del mercado y generar señales comerciales precisas. Con técnicas relativamente simples e intuitivas y fácil operación, puede servir como una estrategia introductoria para principiantes. En comparación con indicadores individuales, DMO puede lograr tasas de ganancia y rentabilidad más altas. A través de medidas como ajuste de parámetros, mejoras de combinación y especificación de intervalos, la estrategia DMO tiene el potencial de lograr un rendimiento superior a largo plazo con una mayor estabilidad.
/*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)