Estratégia de tendência longa do BTC e do ETH

Autora:ChaoZhang, Data: 2023-10-07 10:16:09
Tags:

Resumo

Esta é uma estratégia de tendência longa automatizada baseada em indicadores técnicos simples para criptomoedas como Bitcoin e Ethereum, com o objetivo de capturar grandes tendências de alta e reduzir as perdas de taxas de negociação de negociação frequente.

Estratégia lógica

  1. Usar o MACD para determinar a direção da tendência, longo quando o MACD cruza para cima;

  2. Calcular a EMA de 20 períodos, a SMA de 100 períodos e a SMA de 200 períodos, ir longo quando a EMA e a SMA apontam para cima juntas;

  3. Comprar quando a EMA é superior à SMA e a SMA é superior à SMA lenta;

  4. Configure a linha de stop loss, parar quando o preço quebra stop loss.

  5. Fechar posição quando o preço cai e a EMA cruza abaixo da SMA.

Esta estratégia combina múltiplos indicadores para determinar a tendência e o momento de entrada para lucrar com as principais tendências de alta.

Vantagens

  1. Uma combinação de múltiplos indicadores pode ajudar a filtrar falhas e sinais errados.

  2. Apenas entrar em tendências óbvias pode reduzir as transacções desnecessárias e reduzir a frequência das transacções.

  3. O stop loss pode efetivamente limitar a perda máxima por negociação.

  4. O backtest mostra uma rentabilidade decente em BTC e ETH.

  5. Lógica simples e clara, fácil de entender e implementar, boa para iniciantes.

  6. Alta extensibilidade para incluir mais indicadores de otimização.

Riscos

  1. Alta aleatoriedade do mercado, riscos de julgamento errado.

  2. A abordagem da posição única não pode cobrir riscos sistemáticos.

  3. A configuração inadequada de stop loss pode causar overstop loss.

  4. O backtest não representa os resultados em tempo real, o desempenho real ainda não foi validado.

  5. O impacto dos custos de negociação não considerado pode diferir do desempenho ao vivo.

  6. Não considerou as características do produto, precisou de ajustar os parâmetros.

Orientações de otimização

  1. Teste diferentes combinações de parâmetros para otimizar os parâmetros do indicador.

  2. Adicione filtros como o KDJ para filtrar os sinais de entrada.

  3. Otimizar a estratégia de stop loss, como adicionar stop loss dinâmico.

  4. Considerar o dimensionamento das posições com base no tamanho da conta.

  5. Distinguir as características do produto e ajustar os parâmetros em conformidade.

  6. Incorporar mais prazos para análise.

  7. Teste diferentes produtos e encontre os mais adequados.

Conclusão

A lógica da estratégia é simples e clara. Usar vários indicadores pode ajudar a filtrar sinais errados de forma eficaz. Mas é necessária uma otimização adicional sobre parâmetros, controle de risco, etc., combinada com verificação de negociação ao vivo, antes da aplicação real. Com extensões adequadas, pode se tornar uma tendência de criptografia muito prática após a estratégia.


/*backtest
start: 2023-09-06 00:00:00
end: 2023-10-06 00:00:00
period: 1h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=4
strategy(title="BTC Long strategy", overlay=true, max_bars_back=3000, initial_capital=1000, commission_value=0.075)

//////////// !!!!!!!!!!!!!!!! WORK BEST IN 2 HOURS for BTC, ETH and ETHXBT !!!!!!!!!!!!!!!!!!! /////////////////////


[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 (1.5, "StopLoss in %", type=input.float) //StopLoss associated with the order 
//positionSize = input (1000, "in $")
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  = 2019


//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     = 31
ToMonth   = 12
ToYear    = 2099

// === 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"



//emaLength = input(20, "EMA Length")
//smaLength = input(100, "SMA Length")
//smaSlowLength = input(200, "SMA Length") 
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]) ? 50000 : positionSize[1]
stockPositionSize := na(stockPositionSize[1]) ? 0 : stockPositionSize[1]
//leverage := na(leverage[1]) ? 1 : leverage[1]
 
//ReEvaluate the direction of indicators
bEMAIsRising := rising(ema, 2) 
bSMAIsRising := rising(sma, 3)
bMACDIsRising := rising(macdLine, 3)
bMACDHistIsRising := rising(macdHist, 1)
bSMASlowIsRising := rising(smaSlow, 10)
bMACDSignalIsRising := rising(macdSignalLine, 3)

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


//There is too many signal in tranding market, to avoid this we need to make sure that the smaSlow has a mininal increase
//THIS DOES NOT WORK AT ALL!!!!!
//if bSMASlowIsRising == true
//    //calculate the percentegage difference over the last 10 bars
//    smaPercentageIncrease := ((smaSlow[0]/sma[10])-1)*100
//    if smaPercentageIncrease < SMA_PERCENT_INCREASE
//        //Not enough increase we reset the flag 
//        bSMASlowIsRising := false 
        
 
if (window()) 
    //Check if we can open a LONG
//sma > smaSlow and
    if ( volatilityPercentage < 2 and bPositionOpened == false and bSMASlowIsRising == true and bMACDIsRising == true and bEMAIsRising == true and bSMAIsRising == true and ema[0] > sma[0] and sma[0] < currentPrice)
    // add comparaison between macd and macd signal line
    //if (bPositionOpened == false and macdSignalLine < macdLine and bMACDIsRising == true and bMACDHistIsRising == true and bEMAIsRising == true and bSMAIsRising == true and ema[1] > sma[1] and sma[1] < 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]) or currentPrice < sma[1]))  
    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.