Estratégia de acompanhamento de tendência de média móvel balanceada longa-curta


Data de criação: 2024-01-18 12:07:52 última modificação: 2024-01-18 12:07:52
cópia: 0 Cliques: 608
1
focar em
1617
Seguidores

Estratégia de acompanhamento de tendência de média móvel balanceada longa-curta

Visão geral

A estratégia é uma estratégia de seguimento de tendências de média móvel simples para bitcoin e ethereum. Combina vários indicadores, como a linha média, o MACD e o RSI, para identificar a direção da tendência e acompanhar a tendência usando uma linha de posição fixa.

Princípio da estratégia

A lógica central da estratégia é fazer mais quando a linha 20 da EMA atravessa a linha 100 da SMA e a linha 100 da SMA atravessa a linha 200 da SMA; e fazer menos quando a linha 20 da EMA atravessa a linha 100 da SMA. Isto é, usar a média móvel de três períodos diferentes para determinar a direção da tendência.

Especificamente, a estratégia julga a tendência calculando os valores da linha EMA de 20 dias, da linha SMA de 100 dias e da linha SMA de 200 dias e comparando a relação de tamanho entre eles. Quando a linha EMA de 20 dias atravessa a linha SMA de 100 dias, ou seja, a linha EMA de 20 dias é maior que a linha SMA de 100 dias, o preço começa a subir; então, se a linha SMA de 100 dias também é maior que a linha SMA de 200 dias, a tendência de médio e longo prazo também está subindo, o que é um sinal mais forte de fazer mais.

Depois de entrar em uma posição de multi-posição, a estratégia manterá a posição e seguirá a tendência. Quando a linha de EMA de 20 dias cruzará novamente a linha de SMA de 100 dias, indicando um sinal de reversão da tendência de curto prazo, a estratégia optará por uma parada de parada.

Além disso, a estratégia também combina indicadores como MACD e RSI para confirmar a tendência. A opção de abrir uma posição é feita apenas quando a linha DIF, a linha DEMA e a linha HIST da MACD estão em alta e o indicador RSI está acima de 50.

Vantagens estratégicas

A principal vantagem desta estratégia é a definição de regras claras de negociação de tendências, que permitem o acompanhamento eficaz das tendências de linha média. As vantagens específicas são as seguintes:

  1. Usando múltiplos conjuntos de médias móveis para determinar tendências, é mais confiável.
  2. A forma de manter uma posição de linha longa é seguir a tendência e não ser perturbado por oscilações do mercado de curto prazo.
  3. Combinando indicadores como MACD e RSI para a confirmação de sinais estratégicos, pode-se filtrar brechas falsas.
  4. Os pontos de entrada e saída são avaliados por meio de uma linha EMA e uma linha SMA. As regras são simples e claras.
  5. A capacidade de controlar o risco de forma eficaz, limitando os prejuízos através de stop loss.

Riscos e soluções

A estratégia também apresenta alguns riscos, principalmente a impossibilidade de parar a tendência em tempo hábil. Os riscos específicos e soluções são os seguintes:

  1. Não é possível rastrear o ponto de reversão da tendência a tempo: pode-se reduzir o ciclo médio, ou adicionar mais indicadores para um julgamento integrado.

  2. Porém, a maior parte dos investidores que não conseguem se manter em posição por muito tempo tendem a perder muito dinheiro: a linha de saída pode ser reduzida adequadamente e os perdas podem ser suspensos em tempo hábil.

  3. O indicador de linha média é propenso a atraso: pode-se adicionar uma linha de stop loss com uma certa taxa de retração, stop loss ativo.

Direção de otimização

A estratégia também pode ser melhorada nos seguintes aspectos:

  1. Teste mais combinações de ciclos medíocres, procurando o parâmetro ótimo.

  2. Tente outros indicadores ou modelos para julgar a tendência e o momento de entrada. Por exemplo, a faixa de Brin, o indicador KD, etc.

  3. Parâmetros de otimização dinâmica por meio de aprendizado de máquina. Por exemplo, o uso de aprendizado de reforço para ajustar a amplitude de parada.

  4. Combinação de indicadores de volume de transação para evitar falsas rupturas, como indicadores de energia, volume de transação, etc.

  5. Desenvolver um sistema de stop loss automático e de rastreamento de stop loss, capaz de ajustar a posição de stop loss de acordo com as condições do mercado.

Resumir

A estratégia em geral é uma estratégia de acompanhamento de tendência simples e direta. Ela usa a média móvel para determinar a direção da tendência, os sinais de filtragem MACD e RSI.

Código-fonte da estratégia
/*backtest
start: 2024-01-16 00:00:00
end: 2024-01-17 00:00:00
period: 10m
basePeriod: 1m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=4
strategy(title="BTC_Long_Only_TV01_200507", overlay=true)

//////////// !!!!!!!!!!!!!!!! WORK BEST IN 2 HOURS for BTC, ETH and ETHXBT !!!!!!!!!!!!!!!!!!! /////////////////////
//280820 - After long esting this is the best script for ETHUSD in 4 hours. From 01/01/2020 til 28/08/2020


[macdLine, macdSignalLine, macdHist] = macd(close, 12, 26, 7)  

//_rsi_len = input(14, title="RSI length")
_rsi_len = 14 
  
NewValue = 0
PreviousValue = 0
leverage = 1

smaPercentageIncrease = 0.0
SMA_PERCENT_INCREASE = 0.0
float atrValue = 0
bool bPositionOpened = false
float stockPositionSize = 0 
float volatilityPercentage = 0.0
bool bDisplayArrow = false 
bool bEMAIsRising = false
bool bSMAIsRising = false
bool bSMASlowIsRising = false
bool bMACDIsRising = false
bool bMACDHistIsRising = false
bool bMACDSignalIsRising = false

float stopLoss = input (5, "StopLoss in %", type=input.float) //StopLoss associated with the order
//Best for alt versus BTC float stopLoss = input (3, "StopLoss in %", type=input.float) //StopLoss associated with the order 
float positionSize = 1000
float currentPrice = close 
float stopLossPrice = 0
float entryPrice = 0


//-----------------------------------------------------------


// === INPUT BACKTEST RANGE ONE YEAR 
//FromDay   = input(defval = 01, title = "From Day", minval = 1, maxval = 31)
//FromMonth = input(defval = 01, title = "From Month", minval = 1, maxval = 12)
//FromYear  = input(defval = 2020, title = "From Year", minval = 2017)
FromDay   = 01
FromMonth = 01
FromYear  = 2020

//ToDay     = input(defval = 01, title = "To Day", minval = 1, maxval = 31)
//ToMonth   = input(defval = 01, title = "To Month", minval = 1, maxval = 12)
//ToYear    = input(defval = 2023, title = "To Year", minval = 2017)
ToDay     = 14
ToMonth   = 05
ToYear    = 2029

// === FUNCTION EXAMPLE ===
start     = timestamp(FromYear, FromMonth, FromDay, 00, 00)  // backtest start window
finish    = timestamp(ToYear, ToMonth, ToDay, 23, 59)        // backtest finish window
window()  => true // create function "within window of time"


//FUNCTION DEFINITIONS
//----------------------
IsRising(data, loopBack) =>
    bIsRising = true
    for n = 1 to loopBack
        if data[n] > data[n-1]
            bIsRising := false
        continue
    bIsRising
    
IsFalling(data, loopBack) =>
    bIsFalling = true
    for n = 1 to loopBack
        if data[n] < data[n-1]
            bIsFalling := false
        continue
    bIsFalling
    
// END OF FUNCTION DEFINITIONS //


emaLength = 20
smaLength = 100
smaSlowLength = 200
 
ema = ema(close, emaLength) 
sma = sma(close, smaLength)
smaSlow = sma(close, smaSlowLength)

plot(sma, color=color.green)
plot(smaSlow, color=color.orange)
plot(ema, color=color.yellow)

//reload previous values
stopLossPrice := na(stopLossPrice[1]) ? 0.0 : stopLossPrice[1]
entryPrice := na(entryPrice[1]) ? 0.0 : entryPrice[1]
bPositionOpened := na(bPositionOpened[1]) ? false : bPositionOpened[1]
positionSize := na(positionSize[1]) ? 1000 : positionSize[1]
stockPositionSize := na(stockPositionSize[1]) ? 0 : stockPositionSize[1]
//leverage := na(leverage[1]) ? 1 : leverage[1]

bEMAIsRising := IsRising(ema, 2) 
bSMAIsRising := IsRising(sma, 3)
bMACDIsRising := IsRising(macdLine, 3)
bMACDHistIsRising := IsRising(macdHist, 1)
bSMASlowIsRising := IsRising(smaSlow, 10)
bMACDSignalIsRising := IsRising(macdSignalLine, 3)


atrValue := atr(14)
volatilityPercentage := (atrValue/currentPrice)*100 //calcute the volatility. Percentage of the actual price

 
if (window()) 
    //Check if we can open a LONG
    if (bPositionOpened == false and bSMASlowIsRising == true and bMACDIsRising == true and bEMAIsRising == true and bSMAIsRising == true and ema[0] > sma[0] and sma[0] < currentPrice)
        //Enter in short position 
        stockPositionSize := (positionSize*leverage)/currentPrice //Calculate the position size based on the actual price and the position Size (in $) configured.
        
        //calculate exit values
        stopLossPrice := currentPrice*(1-stopLoss/100) 
        strategy.entry("myPosition", strategy.long, qty=stockPositionSize, comment="BUY at " + tostring(currentPrice))
        entryPrice := currentPrice //store the entry price
        bPositionOpened := true  
        bDisplayArrow := true 
        
    if (bPositionOpened == true and (currentPrice <= stopLossPrice or crossunder(ema[1], sma[1])))
        strategy.close("myPosition", comment="" + tostring(currentPrice) ) //Stop
        //uncomment the below line to make the bot investing the full portfolio amount to test compounding effect.
        //positionSize := positionSize + ((stockPositionSize * currentPrice) - (positionSize*leverage)) 
        //reset some flags 
        bPositionOpened := false 
        bDisplayArrow := true 
        entryPrice := 0.0