Estrategia de negociación del oscilador de impulso dinámico

El autor:¿ Qué pasa?, Fecha: 2023-12-15 11:00:25
Las etiquetas:

img

Resumen general

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.

Estrategia lógica

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.

Análisis de ventajas

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.

Análisis de riesgos

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.

Direcciones de optimizació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.

Conclusión

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)




Más.