Estrategia de swing trading basada en media móvil doble


Fecha de creación: 2024-01-08 16:29:21 Última modificación: 2024-01-08 16:29:21
Copiar: 0 Número de Visitas: 716
1
Seguir
1617
Seguidores

Estrategia de swing trading basada en media móvil doble

Descripción general

La estrategia es una estrategia de negociación de oscilación basada en las líneas de paridad. Utiliza el cruce de las medias móviles rápidas y las medias móviles lentas como una señal de compra y venta. Genera una señal de compra cuando la media móvil rápida atraviesa la media móvil lenta desde abajo; genera una señal de venta cuando la media móvil rápida atraviesa la media móvil lenta desde arriba.

Principio de estrategia

La estrategia utiliza una RMA de longitud 6 como promedio móvil rápido y una HMA de longitud 4 como promedio móvil lento. La estrategia determina la tendencia de los precios y genera señales de negociación a través de la cruz de líneas rápidas y lentas.

Cuando la línea rápida cruza la línea lenta desde la parte inferior, indica que el precio ha cambiado de posición en el corto plazo y pertenece al momento de la conversión de chips, por lo que la estrategia genera una señal de compra en este momento; cuando la línea rápida cruza la línea lenta desde la parte superior, indica que el precio ha cambiado de posición en el corto plazo y pertenece al momento de la conversión de chips, por lo que la estrategia genera una señal de venta en este momento.

Además, la estrategia también detecta los juicios de tendencia a largo plazo para evitar el comercio contrario. Sólo cuando los juicios de tendencia a largo plazo también apoyan la señal, se generan señales de compra y venta reales.

Ventajas estratégicas

La estrategia tiene las siguientes ventajas:

  1. El uso de la discernimiento de doble equilátero cruzado permite identificar con eficacia los puntos de inflexión de precios a corto plazo.
  2. Las líneas rápidas y las lentas, combinadas razonablemente, pueden generar señales de negociación más precisas.
  3. La combinación de un análisis de tendencias a largo plazo con un análisis de tendencias a corto plazo puede filtrar la mayor parte del ruido de las señales comerciales.
  4. La lógica Stop Loss permite evitar el riesgo de manera activa.
  5. Es fácil de entender y de implementar, adecuado para los principiantes en el trading cuantitativo.

Riesgos y soluciones

La estrategia también tiene sus riesgos:

  1. La estrategia de doble línea equitativa es fácil de producir pequeñas ganancias en varias ocasiones, pero una gran pérdida. La solución es ajustar adecuadamente el nivel de parada de pérdidas.

  2. Las señales de transacción son frecuentes en situaciones de crisis, lo que puede conducir a un exceso de transacciones. La solución es flexibilizar adecuadamente las condiciones de transacción y reducir las transacciones.

  3. Los parámetros de la estrategia son fácilmente sobre-optimizados, y el disco duro puede no funcionar bien. La solución es probar la estabilidad de los parámetros.

  4. La estrategia no funciona bien en situaciones de tendencia. La solución es agregar un módulo de juicio de tendencia o usarlo en combinación con la estrategia de tendencia.

Dirección de optimización

La estrategia puede optimizarse aún más en:

  1. Actualización de los indicadores de medias, uso de filtros adaptativos como Kalman.

  2. Se añade un módulo de aprendizaje automático que utiliza el entrenamiento de la IA para determinar puntos de venta.

  3. Se ha añadido un módulo de gestión de fondos para automatizar el control de riesgos.

  4. En combinación con el factor de alta frecuencia, se encuentran señales de negociación más fuertes.

  5. Arbitraje entre varias variedades.

Resumir

La estrategia de oscilación bidireccional es una estrategia de comercio cuantitativa típica y práctica en su conjunto. Tiene una gran adaptabilidad, y los principiantes pueden aprender mucho sobre el desarrollo de estrategias. Al mismo tiempo, también tiene un gran espacio de mejora, que se puede optimizar aún más, combinando más técnicas cuantitativas, para obtener mejores resultados estratégicos.

Código Fuente de la Estrategia
/*backtest
start: 2023-12-31 00:00:00
end: 2024-01-07 00:00:00
period: 3m
basePeriod: 1m
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/
// © dc_analytics
// https://datacryptoanalytics.com/


//@version=5
strategy("Scalping Trading", overlay=true)

//  INPUTS  //
bar_color       = input(true, title='Bar Color', group='⚙ Settings',tooltip='Color chart bars.', inline = "1")
mostrar         = input(true, 'Show Alerts', group='⚙ Settings', inline = "1")
tempo           = input.timeframe('60', group='⚙ Settings', title='🕗 Timeframe', options=['1', '5', '15', '30', '60', '120', '240', '360', '720', 'D', 'W'])

i_position      = input.string("Bottom Center", title = "⚙ D-Panel Location", 
 options = ["Top Right", "Bottom Center", "Bottom Right"], group='⚙ D-Panel Settings️',
 tooltip='Choose the location of the information table on the chart.(D-Panel) ')

position        = i_position == "Top Right" ? position.top_right : i_position == "Bottom Center" ? position.bottom_center : position.bottom_right

i_tam           = input.string('Big', title = '⚙ D-Painel Size', 
 options = ["Tiny", "Small", "Big"], group='⚙ D-Panel Settings️',tooltip='Choose the size of the information panel (D-Panel).')

tamanho         = i_tam == "Tiny" ? size.tiny : i_tam == "Small" ? size.small : size.normal

show_tp_sl      = input(true, title='Show Take Profit/Stop Loss', group='⚙ Settings',tooltip='Show Take Profit/Stop Loss.')
TP              = input.float(defval=4500, title='Take Profit:',group='⚙ Risk Management',tooltip='Choose amount of profit')
SL              = input.float(defval=2500, title='Stop Loss:', group='⚙ Risk Management',tooltip='Choose amount of loss') 
//  END INPUTS  //


//  DECLARATIONS  //
t_up    = '📈'
t_down  = '📉'

c_buy   = 'Long ⇡'
c_sell  = 'Short ⇣'

// _DECLARATION TREND
t_sma       = ta.hma(close, 200)
tend_sma    = ta.sma(close, 12)

tendencia   = request.security(syminfo.tickerid, timeframe.period, t_sma, barmerge.gaps_off, barmerge.lookahead_off)
tend_tabela = request.security(syminfo.tickerid, timeframe.period, tend_sma, barmerge.gaps_off, barmerge.lookahead_off)
// _END DECLARATION TREND

circle = plot.style_circles
//  END DECLARATIONS  //


//  COLORS  //
color gray   = color.gray
color red    = color.new(#ff8c05, 0)
color orange = color.new(#ff8c05, 0)
color silver = color.silver
color up_vol = color.new(color.green, 0)
color dn_vol = color.new(color.purple, 0)

color orange_tranp  = color.new(#ff8c05, 95)
// END COLORS //

//  SCANNER MARKET MAKERS  //
periodo  = input.int(20, 'Period Volume', group='⚙️ Scanner Market Makers Settings')
fator    = input.float(1.85, 'Proportion to the mean: (1.25 = 125% of the mean)', minval=0, group='⚙️ Scanner Market Makers Settings')
vol_up   = close > open
vol_down = open > close
vol      = volume
pesado   = volume > ta.ema(volume, periodo) * fator

palette  = pesado and vol_up ? gray : pesado and vol_down ? orange : vol_up ? silver : gray
//  END SCANNER MARKET MAKERS  //


//  LOGIC ONE  //
s = ta.rma(close, 6)
v = ta.hma(close, 4)

//  TREND  
t_baixa     = tendencia > tendencia[1]
t_alta      = tendencia < tendencia[1]

te_d        = tend_tabela > tend_tabela[1]
trend       = te_d ? t_up : t_down
//  END TREND  

a = request.security(syminfo.tickerid, tempo, s)
b = request.security(syminfo.tickerid, tempo, ohlc4)

c_dn   = a > b and a[1] < b[1]
c_up   = b > a and b[1] < a[1]

compra = mostrar and c_up ? a : na
venda  = mostrar and c_dn ? a : na

s_sell = venda and t_alta
s_buy  = compra and t_baixa
c_vela = b > a and te_d ? gray : orange

s_up = false
s_dw = false

b_sinal = not s_up and s_buy
s_sinal = not s_dw and s_sell

if b_sinal
    s_dw := false
    s_up := true
    s_up

if s_sinal
    s_dw := true
    s_up := false
    s_up

// END LOGIC ONE //


//  DATA TABLE  //
c = b > a ? orange : gray 
c_sinal = b > a ? c_buy : c_sell
//  END DATA TABLE  //


//  PLOT/BARCOLOR  //
c_barcolor = pesado and vol_up ? up_vol : pesado and vol_down ? dn_vol : vol_up ? c : c

barcolor(bar_color ? c_barcolor : na)
plot(a, color=orange_tranp, style=circle)
//  END PLOT/BARCOLOR  //


//  TABLE  //
var dash = table.new(position=position, columns=2, rows=3, border_width=1)
if barstate.islast
    table.cell(table_id=dash, column=1, row=2, text='Scalping DCA', bgcolor=orange)
    table.cell(table_id=dash, column=1, row=0, text='Trade: ' + c_sinal)
    table.cell(table_id=dash, column=1, row=1, text='Trend: ' + trend)
//  END TABLE  //


//  SETTINGS STRATEGY  //
exitPrice = strategy.closedtrades.exit_price(strategy.closedtrades - 1)

// OPEN ORDER
if (b_sinal)
    strategy.order("Long", strategy.long , comment = "Entry: " + str.tostring(close, "#.####"))
//    strategy.exit("EXIT", trail_points = 1000, trail_offset = 0, comment_trailing = "Close with Profit: " + str.tostring(close, "#.####"))
//    strategy.entry("long", strategy.long)

if (s_sinal)
    strategy.order("Short", strategy.short , comment = "Entry: " + str.tostring(close, "#.####"))
//    strategy.exit("EXIT", trail_points = 1000, trail_offset = 0, comment_trailing = "Close with Profit: " + str.tostring(close, "#.####"))
//    strategy.entry("short", strategy.short)

//  TP/SL ORDERS
if strategy.position_size > 0
    strategy.exit('Long_Close', 'Long',profit = TP , loss=SL, qty_percent=100, comment_profit = "Profit Long: " + str.tostring(exitPrice, "#.####"), comment_loss = "Stop Long: " + str.tostring(exitPrice, "#.####"))
//if  strategy.position_size > 0
//    strategy.exit("Long", "Long", stop = longSL, limit = longTP, comment_profit = "Profit Long: " + str.tostring(exitPrice, "#.####"), comment_loss = "Stop Long: " + str.tostring(exitPrice, "#.####"))
    
if strategy.position_size < 0
    strategy.exit('Short_Close', 'Short',profit = TP, loss=SL, qty_percent=100, comment_profit = "Profit Short: " + str.tostring(exitPrice, "#.####"), comment_loss = "Stop Short: " + str.tostring(exitPrice, "#.####"))
//if strategy.position_size < 0
//    strategy.exit("Short", "Short", stop = shortSL, limit = shortTP, comment_profit = "Profit Short: "+ str.tostring(exitPrice, "#.####"), comment_loss = "Stop Short: " + str.tostring(exitPrice, "#.####")) 

//  END SETTINGS STRATEGY  //

// LOGS 
// if strategy.opentrades > 10
//     log.warning("{0} positions opened in the same direction in a row. Try adjusting `bracketTickSizeInput`", strategy.opentrades)

// last10Perc = strategy.initial_capital / 10 > strategy.equity
// if (last10Perc and not last10Perc[1])
//     log.error("The strategy has lost 90% of the initial capital!")