Estratégia de negociação de reversão de impulso

Autora:ChaoZhang, Data: 2023-10-07 16:52:05
Tags:

Resumo

Esta estratégia baseia-se no conceito de negociação de reversão de momento. Ele usa o RSI, Stoch e MACD para determinar a direção da tendência atual, e define stop loss e take profit com base no ATR, para implementar uma estratégia de negociação automatizada que pode capturar de forma eficiente as reversões de tendência.

Lógica de negociação

A estratégia usa RSI, Stoch e MACD como três indicadores para determinar a direção da tendência atual.

  • RSI(7): RSI acima de 50 indica uma tendência de alta, enquanto abaixo de 50 uma tendência de queda
  • Stoch ((%K, 14, 3, 3): %K acima de 50 é tendência ascendente, abaixo de 50 é tendência descendente
  • MACD ((12, 26, 9): MACD acima da linha de sinal é tendência de alta, abaixo é tendência de baixa

Quando todos os três indicadores estão em alta, a cor da barra é definida em verde. Quando todos estão em baixa, a cor da barra é definida em vermelho. Se houver divergência entre os indicadores, a cor da barra é definida em preto.

As regras de negociação são as seguintes:

  • Quando a barra atual for verde e a barra anterior for preta ou vermelha, vá longo.
  • Quando a barra atual for vermelha e a barra anterior for preta ou verde, vá curto.
  • Se a barra ficar vermelha ou preta durante uma posição longa, feche a negociação longa.
  • Se a barra se tornar verde ou preta durante uma posição curta, feche a negociação curta.

A estratégia também usa o ATR(7) para definir o stop loss e take profit.

Análise das vantagens

As vantagens desta estratégia incluem:

  1. O uso de vários indicadores para determinar a tendência pode efetivamente filtrar falhas.

  2. O ATR é um sistema de negociação de preços que permite a troca de informações entre os clientes.

  3. Lógica simples e clara, fácil de entender e automatizar.

Análise de riscos

Os riscos desta estratégia incluem:

  1. Os erros em indicadores individuais podem afetar o tempo de entrada. Pode considerar ajustar parâmetros ou adicionar mais indicadores de confirmação para reduzir erros.

  2. O tamanho do ATR afeta significativamente as paradas e os alvos. O cálculo incorreto do ATR pode resultar em paradas muito largas ou alvos muito apertados. Pode adicionar indicadores adicionais para confirmar o ATR.

  3. Falta de determinação de tendência. Focado na negociação de reversão, a análise de tendência insuficiente pode levar a batidas em mercados variados. Pode adicionar indicadores de tendência.

  4. Risco de sobreajuste Requer um exame posterior minucioso para verificar a robustez dos parâmetros e das regras.

Orientações para melhorias

Possíveis melhorias desta estratégia:

  1. Ajuste ou adição de indicadores para melhorar a precisão na determinação dos pontos de reversão, por exemplo, adição de bandas de Bollinger para verificar níveis de sobrecompra/supervenda.

  2. Otimizar o cálculo do ATR para melhor acompanhar a volatilidade, por exemplo, utilizando os rácios ATR/Preço.

  3. Adicionar indicadores de tendência para evitar problemas durante os mercados variáveis, por exemplo médias móveis.

  4. Otimizar a gestão de fundos, tais como o ajustamento do tamanho das posições com base na retirada.

  5. Optimização do período para testar a robustez em diferentes prazos.

  6. Mais backtesting em vários produtos e períodos de tempo para verificar a confiabilidade.

Resumo

Esta estratégia é projetada com base em conceitos de reversão de momento, usando o RSI, Stoch e MACD combo para identificar reversões, com paradas e alvos dinâmicos ATR. Forma um sistema de reversão de tendência relativamente completo. As vantagens incluem lógica clara e paradas / alvos razoáveis. As deficiências incluem erros de sinal e falta de filtros de tendência. Melhorias podem ser feitas por otimização de indicadores, adição de tendências e ajuste do tamanho da posição. Isso pode tornar a estratégia mais robusta.


/*backtest
start: 2023-09-06 00:00:00
end: 2023-10-06 00:00:00
period: 2h
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/
// © jwitt98
//The PowerX strategy - based on the rules outlined in the book "The PowerX Strategy: How to Trade Stocks and Options in Only 15 Minutes a Day" by Markus Heitkoetter

//@version=5
strategy("PowerX", overlay=true)
strategy.initial_capital = 50000
longEntry = "Enter long"
shortEntry = "Enter short"
longExit = "Exit long"
shortExit = "Exit short"

//*********************************Begin inputs*********************************

//get time range inputs and set time range bool
timeRangeGroup = "Select the trading range"
startDate = input(timestamp("1 Jan 2021 00:00 +0000"), "Start date", "Select the start date for the trading range", "", timeRangeGroup)
endDate = input(timestamp("1 Jan 2050 00:00 +0000"), "End date", "Select the end date for the trading range", "", timeRangeGroup)
isInTimeRange = true

//get long/short inputs
positionsAllowedGroup = "Select the direction(s) of trades to allow"
isLongsAllowed = input.bool(true, "Allow long positions", "Check the box if you want to allow long positions", "", positionsAllowedGroup)
isShortsAllowed = input.bool(true, "Allow short positions", "Check the box if you want to allow short positions", "", positionsAllowedGroup)

//get the stop loss and profit target multiples.  Per the PowerX rules the ratio shoud be 1:2.  1.5 and 3 are defaults
adrMultuplesGroup="Select the multipliers for the stop loss and profit targets"
stopLossMultiple = input.float(1.5, "Stop loss multiple", 0.1, 10, 0.1, "The ADR is multiplied by the stop loss multiple to calculate the stop loss", group=adrMultuplesGroup)
profitTargetMultiple=input.float(3.0, "Profit target multiple", 0.1, 10, 0.1, "The ADR is multiplied by the profit target multiple to calculate the profit target", group=adrMultuplesGroup)

//get the option to use the money management stategy or not.  This is a fixed ratio type management system
moneyManagementGroup="Money management"
isUsingMoneyManagement=input.bool(false, "Use money management", "Check the box if you want to use a fixed ratio type money management system, such as the type described in PowerX", group=moneyManagementGroup)
initial_riskPercent=input.float(2.0, "Percent risk per trade", .1, 100, .1, "The percentage of capital you want to risk when starting out.  This will increase or decrease base on the money management rules.  Only applicable if money managent is used", group=moneyManagementGroup)/100
isRiskDowsideLimited=input.bool(false, "Keep risk at or above the set point", "Check the box if you don't want the risk to fall below the set \"risk per trade\" percentage, for example, when your equity is underwater. Only applicable if money management is used", "", moneyManagementGroup)
initial_riskPerTrade=initial_riskPercent * strategy.initial_capital 
riskFactor = 0.0
currentProfit = 0.0
currentRisk = 0.0

//*********************************End inputs*********************************

//*********************************Begin money management*********************************

if(isUsingMoneyManagement)
    currentProfit := strategy.equity - strategy.initial_capital
    if(currentProfit < 0)
        currentProfit:=math.abs(currentProfit)
        riskFactor := 0.5*(math.pow(1+8*currentProfit/(2*initial_riskPerTrade), 0.5)+1)
        currentRisk := 1/riskFactor * initial_riskPercent * strategy.initial_capital
        if(isRiskDowsideLimited)
            currentRisk := initial_riskPerTrade
    else
        riskFactor := 0.5*(math.pow(1+8*currentProfit/(2*initial_riskPerTrade), 0.5)+1)
        currentRisk := riskFactor * initial_riskPercent * strategy.initial_capital
        
plot(strategy.equity, "Strategy equity")
plot(currentRisk, "Current risk")
plot(riskFactor, "Risk Factor")

//*********************************End money management*********************************


//*********************************Begin indicators*********************************
//4 indicators are used in this strategy, RSI(7), Stochastics(14, 3, 3), MACD(12, 26, 9), and ADR(7)

rsiVal = ta.rsi(close, 7)//this checks out
plot(rsiVal, "RSI(7)", color.lime)

stochKVal = ta.sma(ta.sma(ta.stoch(close, high, low, 14),3),3)//this formula checks out
plot(stochKVal, "Stoch %K", color.lime)

[macdLine, signalLine, histLine] = ta.macd(close, 12, 26, 9)
plot(histLine, "MACD Hist", color.lime)

adr = ta.sma(high, 7) - ta.sma(low, 7)
plot(adr, "Average daily range", color.orange)


//*********************************End indicators*********************************

//*********************************Define the bar colors*********************************

greenBar = rsiVal > 50 and stochKVal > 50 and histLine > 0
redBar = rsiVal < 50 and stochKVal < 50 and histLine < 0
blackBar = not greenBar and not redBar

color currentBarColor = switch
    greenBar => color.green
    redBar => color.red
    blackBar => color.gray //because black is too hard to see in dark mmode
    => color.yellow
    
barcolor(currentBarColor)

//*********************************End defining the bar colors*********************************

//*********************************Define the entry, stop loss and profit target*********************************

longStopLimit = high + .01
longProfitTarget = high + (profitTargetMultiple * adr)
longStopLoss = high - (stopLossMultiple * adr)

shortStopLimit = low - .01
shortProfitTarget = low - (profitTargetMultiple * adr)
shortStopLoss = low + (stopLossMultiple * adr)

qtyToTrade= math.floor(currentRisk / (stopLossMultiple * adr))//only if using money management
if(qtyToTrade * high > strategy.equity)
    qtyToTrade := math.floor(strategy.equity / high)

//*********************************End defining stop loss and profit targets*********************************

//*********************************Execute trades, set rules, stop loss and profit targets*********************************

if (greenBar and not greenBar[1] and isInTimeRange and isLongsAllowed)
    if(isUsingMoneyManagement)
        strategy.order(longEntry, strategy.long, qtyToTrade, limit=longStopLimit, stop=longStopLimit)
        //strategy.order(longEntry, strategy.long, qtyToTrade, stop=longStopLimit)
    else
        strategy.order(longEntry, strategy.long, limit=longStopLimit,stop=longStopLimit)
        //strategy.order(longEntry, strategy.long, stop=longStopLimit)
    strategy.exit("Long limit/stop", from_entry=longEntry, limit=longProfitTarget, stop=longStopLoss)
    

if(blackBar or redBar)
    strategy.cancel(longEntry)
    strategy.close(longEntry, longExit)
    

if (redBar and not redBar[1] and isInTimeRange and isShortsAllowed)
    if(isUsingMoneyManagement)
        strategy.order(shortEntry, strategy.short, qtyToTrade, limit=shortStopLimit, stop=shortStopLimit)
        //strategy.order(shortEntry, strategy.short, qtyToTrade, stop=shortStopLimit)
    else
        strategy.order(shortEntry, strategy.short, limit=shortStopLimit, stop=shortStopLimit)
        //strategy.order(shortEntry, strategy.short, stop=shortStopLimit)
    strategy.exit("Short limit/stop", from_entry=shortEntry, limit=shortProfitTarget, stop=shortStopLoss)

if(blackBar or greenBar)
    strategy.cancel(shortEntry)
    strategy.close(shortEntry, shortExit)
    

//*********************************End execute trades, set rules, stop loss and profit targets*********************************






















Mais.