Estrategia de trading automático con algoritmo de doble canal


Fecha de creación: 2023-10-10 15:25:53 Última modificación: 2023-10-10 15:25:53
Copiar: 0 Número de Visitas: 639
1
Seguir
1617
Seguidores

Descripción general

Esta estrategia utiliza dos indicadores, el Supertrend y el StochRSI, para analizar las tendencias de los precios y los excesos de compra y venta en diferentes períodos de tiempo, para identificar posibles señales de compra y venta. La estrategia tiene como objetivo seguir la dirección de las tendencias principales y capturar la dirección principal de los precios en la línea media y larga.

Principio de estrategia

La estrategia utiliza el indicador Supertrend de 1 hora y 4 horas para determinar la dirección de la tendencia de los precios. Cuando las Supertrends de los dos períodos de tiempo se presentan en la misma dirección, podemos considerar que existe una tendencia de precios más fuerte.

Además, la estrategia utiliza el indicador StochRSI para determinar si hay sobreventa o sobreventa. El indicador StochRSI combina las ventajas de los indicadores RSI y Stochastic Oscillator.

Para verificar aún más la señal, la estrategia también establece un período de retroceso, después de que la señal de sobremarcha de sobremarcha de StochRSI se muestre, se requiere un número determinado de líneas K para retroceder. Si la tendencia de precios confirma la señal de StochRSI durante este período de tiempo, se activará la compra o la venta.

En su conjunto, la estrategia combina el uso de Supertrend en los dos marcos de tiempo para determinar la tendencia general, y el método StochRSI para determinar el ajuste local, para realizar operaciones de seguimiento de tendencia en la línea media y larga.

Ventajas estratégicas

  • El uso de indicadores de ciclo múltiple para juzgar puede filtrar eficazmente las señales erróneas
  • Las ventajas de combinar los indicadores Supertrend y StochRSI para juzgar la tendencia y determinar la sobreventa
  • Establecer un período de retroceso para la verificación de señales para evitar transacciones innecesarias
  • La adopción de estrategias de operación de líneas medianas y largas reduce la pérdida de puntos de deslizamiento causada por operaciones demasiado frecuentes
  • Una combinación de dos indicadores fácil de entender y una flexibilidad para ajustar los parámetros

Riesgo estratégico

  • Durante los períodos de crisis, la tendencia de la línea media-larga no es clara y es probable que haya más señales erróneas
  • El retrospectivo es demasiado largo y puede perderse una mejor oportunidad de compra/venta
  • Los parámetros de StochRSI están mal configurados y pueden generar una señal de sobreventa y sobreventa errónea
  • Los parámetros de Supertrend no están configurados correctamente, lo que puede determinar la dirección de la tendencia errónea
  • Siguiendo mecánicamente las señales de los indicadores, es fácil pasar por alto los cambios fundamentales importantes

Mejoramiento:

  • Optimización de las combinaciones de parámetros de StochRSI y Supertrend
  • Ajuste de la longitud del ciclo de retroceso en diferentes entornos de disco
  • Indicadores como el volumen de transacciones para la verificación
  • Atención a las noticias fundamentales y intervención cuando sea necesario.

Dirección de optimización de la estrategia

  • Añadir más indicadores de Supertrend de diferentes períodos de tiempo, formando una selección de varios niveles
  • Sustituir el StochRSI por otros indicadores de tipo sobrecompra y sobreventa, como KD, RSI, etc.
  • Aumentar las estrategias de stop loss móviles para obtener mayores ganancias según las tendencias
  • Combinando indicadores de medias importantes, como las medias de 30 períodos, para determinar las grandes tendencias
  • Desarrollar programas de optimización automática de parámetros para que las estrategias sean más robustas

Resumir

La estrategia de la cuenca de la cocina de dos canales aprovecha el método de Supertrend para determinar la tendencia general y el ajuste local de StochRSI para lograr una estrategia de seguimiento de tendencias confiable. La estrategia se basa en el manejo de líneas medias largas, que puede evitar la pérdida de ganancias causada por el comercio demasiado frecuente.

Código Fuente de la Estrategia
/*backtest
start: 2023-09-09 00:00:00
end: 2023-10-09 00:00:00
period: 4h
basePeriod: 15m
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/
// © Baby_whale_to_moon

//@version=5
strategy('Kitchen [ilovealgotrading]', overlay=true, format=format.price, initial_capital = 1000)

// BACKTEST DATE
Start_Time = input(defval=timestamp('01 January 2017 13:30 +0000'), title='Start_Time', group = " ################# BACKTEST DATE ################ " )
End_Time = input(defval=timestamp('30 April 2024 19:30 +0000'), title='End_Time', group = " ################# BACKTEST DATE ################ " )

// supertrend 
atrPeriod = input(10, 'ATR Length', group = " #################  Supertrend  ################ ")
factor = input(3, 'Factor', group = " #################  Supertrend  ################ ")

time1 = input.string(title='Short Time Period', defval='07 1h', options=['01 1m','02 3m','03 5m',  '04 15m', '05 30m', '06 45m', '07 1h', '08 2h', '09 3h', '10 4h', '11 1D', '12 1W' ], group = " #################  Supertrend  ################ ",tooltip = "this timeframe is the value of our short-time supertrend indicator")
time2 = input.string(title='Long Time Period', defval='10 4h', options=[ '01 1m','02 3m','03 5m', '04 15m', '05 30m', '06 45m', '07 1h', '08 2h', '09 3h', '10 4h', '11 1D', '12 1W' ], group = " #################  Supertrend  ################ ",tooltip = "this timeframe is the value of our long-time supertrend indicator")


res(Resolution) =>
    if Resolution == '00 Current'
        timeframe.period
    else
        if Resolution == '01 1m'
            '1'
        else
            if Resolution == '02 3m'
                '3'
            else
                if Resolution == '03 5m'
                    '5'
                else
                    if Resolution == '04 15m'
                        '15'
                    else
                        if Resolution == '05 30m'
                            '30'
                        else
                            if Resolution == '06 45m'
                                '45'
                            else
                                if Resolution == '07 1h'
                                    '60'
                                else
                                    if Resolution == '08 2h'
                                        '120'
                                    else
                                        if Resolution == '09 3h'
                                            '180'
                                        else
                                            if Resolution == '10 4h'
                                                '240'
                                            else
                                                if Resolution == '11 1D'
                                                    '1D'
                                                else
                                                    if Resolution == '12 1W'
                                                        '1W'
                                                    else
                                                        if Resolution == '13 1M'
                                                            '1M'


// supertrend Long time period 
[supertrend2, direction2] = request.security(syminfo.tickerid, res(time2), ta.supertrend(factor, atrPeriod))
bodyMiddle4 = plot((open + close) / 2, display=display.none)
upTrend2 = plot(direction2 < 0 ? supertrend2 : na, 'Up Trend', color=color.new(color.green, 0), style=plot.style_linebr, linewidth=2)
downTrend2 = plot(direction2 < 0 ? na : supertrend2, 'Down Trend', color=color.new(color.red, 0), style=plot.style_linebr, linewidth=2)

// supertrend short time period 
[supertrend1, direction1] = request.security(syminfo.tickerid, res(time1), ta.supertrend(factor, atrPeriod))
bodyMiddle = plot((open + close) / 2, display=display.none)
upTrend = plot(direction1 < 0 ? supertrend1 : na, 'Up Trend', color=color.new(color.yellow, 0), style=plot.style_linebr)
downTrend = plot(direction1 < 0 ? na : supertrend1, 'Down Trend', color=color.new(color.orange, 0), style=plot.style_linebr)


// Stochastic RSI
low_limit_stoch_rsi = input.float(title = 'Stoch Rsi Low Limit', step=0.5, defval=15, group = " #################  Stoch RSI   ################ ", tooltip = "when Stock rsi value crossover Low Limit value we get Long")
up_limit_stoch_rsi = input.float(title = 'Stoch Rsi Up Limit', step=0.5, defval=85, group = " #################  Stoch RSI   ################ ", tooltip = "when Stock rsi value crossunder Up Limit value we get Short")
stocrsi_back_length = input.int(20, 'Stoch Rsi retroactive length', minval=1, group = " #################  Stoch RSI   ################ ", tooltip = "How many candles are left behind, even if there is a buy or sell signal, it will be valid now")
smoothK = input.int(3, 'Stochastic RSI K', minval=1, group = " #################  Stoch RSI   ################ ")
lengthRSI = input.int(14, 'RSI Length', minval=1, group = " #################  Stoch RSI   ################ ")
lengthStoch = input.int(14, 'Stochastic Length', minval=1, group = " #################  Stoch RSI   ################ ")
src_rsi = input(close, title='RSI Source', group = " #################  Stoch RSI   ################ ")
rsi1 = request.security(syminfo.tickerid, '240', ta.rsi(src_rsi, lengthRSI))
k = request.security(syminfo.tickerid, '240', ta.sma(ta.stoch(rsi1, rsi1, rsi1, lengthStoch), smoothK))

// Strategy settings 
dollar = input.float(title='Dollar Cost Per Position ', defval=20000, group = " #################  Strategy Settings  ################ ")
trade_direction = input.string(title='Trade_direction', group = " #################  Strategy Settings  ################ ", options=['LONG', 'SHORT', 'BOTH'], defval='BOTH')
Long_message_open = input('Long Open', title = "Long Open Message", group = " #################  Strategy Settings  ################ ", tooltip = "if you write your alert window this code {{strategy.order.alert_message}} .When trigger Long signal you will get dynamically what you pasted here for Long Open Message ")
Short_message_open = input('Short Open', title = "Short Open Message", group = " #################  Strategy Settings  ################ ", tooltip = "if you write your alert window this code {{strategy.order.alert_message}} .When trigger Long signal you will get dynamically what you pasted here for Short Open Message ")
Long_message_close = input('Long Close', title = "Long Close Message", group = " #################  Strategy Settings  ################ ", tooltip = "if you write your alert window this code {{strategy.order.alert_message}} .When trigger Long signal you will get dynamically what you pasted here for Long Close Message ")
Short_message_close = input('Short Close', title = "Short Close Message", group = " #################  Strategy Settings  ################ ", tooltip = "if you write your alert window this code {{strategy.order.alert_message}} .When trigger Long signal you will get dynamically what you pasted here for Short Close Message ")

Time_interval = true
bgcolor(Time_interval ? color.rgb(255, 235, 59, 95) : na)

back_long = 0
back_short = 0

for i = 1 to stocrsi_back_length by 1
    if ta.crossover(k, low_limit_stoch_rsi)[i] == true 
        back_long += i
        back_long
    if ta.crossunder(k, up_limit_stoch_rsi)[i] == true 
        back_short += i
        back_short

// bgcolor(back_long>0?color.rgb(153, 246, 164, 54):na)
// bgcolor(back_short>0?color.rgb(246, 153, 153, 54):na)

buy_signal = false
sell_signal = false

if direction2 < 0 and direction1 < 0 and back_long > 0
    buy_signal := true
    buy_signal

if direction2 > 0 and direction1 > 0 and back_short > 0
    sell_signal := true
    sell_signal


//bgcolor(buy_signal  ? color.new(color.lime,90) : na ,title="BUY bgcolor")
plotshape( buy_signal[1] == false and  strategy.opentrades == 0 and Time_interval and buy_signal  ? supertrend2 : na, title="Buy", text="Buy", location=location.absolute, style=shape.labelup, size=size.tiny, color=color.green, textcolor=color.white)

//bgcolor(sell_signal  ? color.new(color.red,90) : na ,title="SELL bgcolor")
plotshape(sell_signal[1] == false and strategy.opentrades == 0 and Time_interval and sell_signal  ? supertrend2 : na , title="Sell", text="Sell", location=location.absolute, style=shape.labeldown, size=size.tiny, color=color.red, textcolor=color.white)


// Strategy entries 
if strategy.opentrades == 0 and Time_interval and buy_signal and ( trade_direction == 'LONG' or trade_direction == 'BOTH')
    strategy.entry('Long_Open', strategy.long, qty=dollar / close, alert_message=Long_message_open)

if strategy.opentrades == 0 and Time_interval and sell_signal and ( trade_direction == 'SHORT' or trade_direction == 'BOTH')
    strategy.entry('Short_Open', strategy.short, qty=dollar / close, alert_message=Short_message_open)


// Strategy Close
if close < supertrend1 and strategy.position_size > 0 
    strategy.exit('Long_Close',from_entry = "Long_Open", stop=close, qty_percent=100, alert_message=Long_message_close)

if close > supertrend1 and strategy.position_size < 0 
    strategy.exit('Short_Close',from_entry = "Short_Open", stop=close, qty_percent=100, alert_message=Short_message_close)