Estratégias de negociação bidirecional longas e curtas baseadas em MACD e RSI


Data de criação: 2023-10-09 15:33:17 última modificação: 2023-10-09 15:33:17
cópia: 0 Cliques: 701
1
focar em
1617
Seguidores

Visão geral

Esta estratégia combina MACD e RSI, e pode ser executada quando a direção da tendência é incerta, mas também pode ser executada com o objetivo de obter ganhos extras.

Princípio da estratégia

  1. Calcule o EMA rápido (linha de 12 dias) e o EMA lento (linha de 26 dias)
  2. Calcule a diferença de convergência do MACD (EMA rápido menos o EMA lento)
  3. Calcule a média móvel de 9 dias do MACD como uma linha de sinal
  4. Calculando o RSI de 14 dias
  5. Quando o MACD <-0.1, o RSI <27 e o EMA rápido estiver abaixo do EMA lento, faça mais
  6. Caso o MACD seja maior que 0,125 e o RSI seja maior que 81, e o EMA rápido seja maior que o EMA lento, faça um corte
  7. Configure stop loss, stop loss e move stop loss para gerenciar posições

Análise de vantagens

  1. A negociação de ativos de longo prazo permite obter lucros extras em situações fora de tendência.
  2. A combinação do indicador de tendência EMA e o indicador de reversão RSI pode melhorar a qualidade do sinal
  3. O uso de stop loss móvel para bloquear lucros permite controlar o risco de perdas

Análise de Riscos

  1. A transação bidirecional precisa de mais fundos para sustentar a garantia.
  2. A reversão da tendência pode travar a perda de posições em excesso
  3. Parâmetros mal definidos podem levar a transações muito frequentes

A solução para o risco:

  1. Apoio financeiro suficiente para controlar o tamanho das posições
  2. Ajuste razoavelmente a distância de parada para evitar uma parada excessivamente densa
  3. Parâmetros de otimização para reduzir a frequência de transações

Direção de otimização

  1. Pode-se considerar a combinação de indicadores de volatilidade para otimizar o momento de entrada
  2. Pode testar diferentes combinações de parâmetros para encontrar o melhor
  3. Pode-se otimizar estratégias de stop loss de acordo com as condições do mercado, como stop loss de seguimento
  4. Parâmetros de otimização automática que podem ser combinados com algoritmos de aprendizado de máquina

Resumir

Esta estratégia permite a negociação bidirecional através de uma combinação de MACD e RSI. Usando o stop loss móvel para bloquear o lucro, pode-se obter ganhos excedentários em situações de não-trend. A estratégia pode otimizar ainda mais a configuração de parâmetros, a estratégia de stop loss, etc., para obter ganhos excedentários mais estáveis.

Código-fonte da estratégia
/*backtest
start: 2023-09-08 00:00:00
end: 2023-10-08 00:00:00
period: 1h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=3
// Revision:        290
// Author:          @Hugo_Moriceau
//study("Moriceau_Crypto_strategies_Long_short_indicator_thesis",overlay=true)

// Pyramide 10 order size 100, every tick

strategy("Moriceau_Crypto_strategies_Long_short_indicator",overlay=true)

// === GENERAL INPUTS ===

fast = 12, slow = 26
fastMA = ema(close, fast)
slowMA = ema(close, slow)

macd = fastMA - slowMA
signal = sma(macd, 9)
rsi = rsi(close,14)

dataB = macd < -0.1  and rsi<27 and fastMA < slowMA
// data1 = macd > 0.125  and rsi>81 and fastMA> slowMA
dataS = macd > 0.125 and rsi > 81 and fastMA > slowMA

tradeInvert     = input(defval = false, title = "Invert Trade Direction?")

// === LOGIC ===

// is fast ma above slow ma?
Achat = macd < -0.1  and rsi < 27 and fastMA < slowMA ? true : false
vente = macd > 0.125 and rsi > 81 and fastMA > slowMA ? true : false

// are we inverting our trade direction?
tradeDirection = vente ? Achat ? false : true : Achat ? true : false

// === Plot Setting ===

plot(fastMA,color=red)
plot(slowMA,color=blue)
barcolor(color=iff(fastMA > slowMA, yellow, na))
barcolor(color=iff(fastMA < slowMA, black, na))
//barcolor(color=iff(macd > 0.12*close , fuchsia, na))
//barcolor(color=iff(macd < -0.1*close , lime, na))
plotchar(dataB, char='B',color=black,size = size.auto,location = location.belowbar,transp= 0)  
plotchar(dataS, char='S',color=black,size = size.auto,location = location.abovebar,transp= 0)

//fast = plot(maFast, title = "FastMA", color = yellow, linewidth = 2, style = line, transp = 50)
//slow = plot(maSlow, title = "SlowMA", color = black, linewidth = 2, style = line, transp = 50)

// === BACKTEST RANGE ===
FromMonth = input(defval = 05, title = "From Month", minval = 1)
FromDay   = input(defval = 23, title = "From Day", minval = 1)
FromYear  = input(defval = 2021, title = "From Year", minval = 2017)
ToMonth   = input(defval = 5, title = "To Month", minval = 1)
ToDay     = input(defval = 25, title = "To Day", minval = 1)
ToYear    = input(defval = 2021, title = "To Year", minval = 2017)


// === STRATEGY RELATED INPUTS ===+
// the risk management inputs
inpTakeProfit   = input(defval = 2500, title = "Take Profit", minval = 28)
inpStopLoss     = input(defval = 600, title = "Stop Loss", minval = 15)
inpTrailStop    = input(defval = 300, title = "Trailing Stop Loss", minval = 5)
inpTrailOffset  = input(defval = 50, title = "Trailing Stop Loss Offset", minval = 1)

// === RISK MANAGEMENT VALUE PREP ===

// if an input is less than 1, assuming not wanted so we assign 'na' value to disable it.

useTakeProfit   = inpTakeProfit  >= 1 ? inpTakeProfit  : na
useStopLoss     = inpStopLoss    >= 1 ? inpStopLoss    : na
useTrailStop    = inpTrailStop   >= 1 ? inpTrailStop   : na
useTrailOffset  = inpTrailOffset >= 1 ? inpTrailOffset : na


// === STRATEGY - LONG POSITION EXECUTION ===

enterLong() => not tradeDirection[1] and tradeDirection 
exitLong() => tradeDirection[1] and not tradeDirection
strategy.entry(id = "Achat", long = true, when = enterLong()) // use function or simple condition to decide when to get in
strategy.close(id = "TP 50% Sell", when = exitLong()) // ...and when to get out

// === STRATEGY - SHORT POSITION EXECUTION ===

enterShort() => tradeDirection[1] and not tradeDirection
exitShort() => not tradeDirection[1] and tradeDirection
strategy.entry(id = "Vente", long = false, when = enterShort())
strategy.close(id = "Vente", when = exitShort())

// === STRATEGY RISK MANAGEMENT EXECUTION ===

// finally, make use of all the earlier values we got prepped
strategy.exit("Vente", from_entry = "Vente", profit = useTakeProfit, loss = useStopLoss, trail_points = useTrailStop, trail_offset = useTrailOffset)
strategy.exit("Short", from_entry = "Achat", profit = useTakeProfit, loss = useStopLoss, trail_points = useTrailStop, trail_offset = useTrailOffset)