Tendência média móvel de vários fatores seguindo a estratégia

Autora:ChaoZhang, Data: 2024-01-18 12:07:52
Tags:

img

Resumo

Esta é uma simples média móvel de tendência após estratégia adequada para Bitcoin e Ethereum. Ele combina vários indicadores, como médias móveis, MACD e RSI para identificar a direção da tendência, e adota dimensionamento de posição fixo para rastreamento de tendência de longo prazo.

Estratégia lógica

A lógica central da estratégia é ir longo quando a EMA de 20 dias cruza acima da SMA de 100 dias e a SMA de 100 dias cruza acima da SMA de 200 dias; fechar posições quando a EMA de 20 dias cruza abaixo da SMA de 100 dias. Ou seja, use três médias móveis de períodos diferentes para determinar a direção da tendência.

Especificamente, a estratégia calcula os valores da EMA de 20 dias, SMA de 100 dias e SMA de 200 dias e compara sua relação de magnitude para julgar a tendência. Quando a EMA de 20 dias cruza acima da SMA de 100 dias, isso significa que os preços começaram a subir. Neste ponto, se a SMA de 100 dias também for maior que a SMA de 200 dias, isso indica que as tendências de médio e longo prazo também estão subindo. Este é um forte sinal longo.

Após entrar em uma posição longa, a estratégia continuará a manter a posição para seguir a tendência. Quando a EMA de 20 dias cruza abaixo da SMA de 100 dias novamente, indica que ocorreu um sinal de reversão de tendência de curto prazo. Neste ponto, a estratégia optará por fechar posições para parar as perdas.

Além disso, a estratégia também incorpora indicadores como o MACD e o RSI para confirmar a tendência. Apenas quando a linha DIF, a linha DEMA e a linha da barra HIST do MACD estiverem em alta e o indicador RSI estiver acima de 50, optará por abrir posições longas.

Vantagens

A maior vantagem desta estratégia é a formulação de regras claras de negociação de tendências que permitem acompanhar eficazmente as tendências a médio e longo prazo.

  1. Use várias médias móveis combinadas para julgar a tendência, que é relativamente confiável.

  2. Adotar posições de detenção de longo prazo para acompanhar os movimentos da tendência sem ser perturbado por flutuações de curto prazo do mercado.

  3. A combinação de indicadores como o MACD e o RSI para confirmação de sinais de estratégia pode filtrar falhas.

  4. Usando a cruz de ouro e a cruz da morte das linhas EMA e SMA para determinar os pontos de entrada e saída, as regras são simples e claras.

  5. Pode controlar eficazmente os riscos limitando as perdas através de stop loss.

Riscos e soluções

O principal problema é que não é possível deter as perdas a tempo quando a tendência se inverte.

  1. Incapacidade de acompanhar os pontos de inversão da tendência no tempo: encurtar os ciclos da média móvel ou adicionar mais indicadores para um julgamento abrangente.

  2. O longo tempo de espera pode facilmente levar a perdas maiores: Encurtar corretamente as linhas de saída para parar a perda em tempo hábil.

  3. Os indicadores de média móvel tendem a atrasar: adicionar uma certa percentagem de linhas de stop loss para stop loss ativo.

Orientações de otimização

Esta estratégia pode também ser otimizada nos seguintes aspectos:

  1. Teste mais combinações de ciclos de média móvel para encontrar os parâmetros ideais.

  2. Tente outros indicadores ou modelos para julgar tendências e tempo de entrada, como Bandas de Bollinger, Indicador KD, etc.

  3. Usar aprendizado de máquina e outros métodos para otimizar dinamicamente os parâmetros.

  4. Incorporar indicadores de volume de negociação para evitar falhas. Por exemplo, volume de saldo, volume de transações, etc.

  5. Desenvolver sistemas automáticos de stop loss e de rastreamento de stop loss que possam ajustar as posições de stop loss com base nas condições de mercado.

Conclusão

Em resumo, esta estratégia é uma estratégia simples e direta de seguir tendências. Ele usa médias móveis para determinar a direção da tendência, MACD e RSI para filtrar sinais. Adotar períodos de retenção relativamente longos para rastrear os movimentos da tendência. Pode capturar efetivamente oportunidades de tendência de médio e longo prazo. Ao mesmo tempo, também há o risco de atraso na identificação de inversões de tendência. Melhorias e atualizações futuras podem ser feitas por meio da otimização de parâmetros, adição de indicadores, etc.


/*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
        


Mais.