Estratégia de tendência de alta do Bitcoin e Ethereum


Data de criação: 2023-10-07 10:16:09 última modificação: 2023-10-07 10:16:09
cópia: 5 Cliques: 704
1
focar em
1617
Seguidores

Visão geral

A estratégia é uma estratégia de tendência automática de múltiplos títulos simples, baseada em indicadores técnicos, para criptomoedas como Bitcoin e Ethereum, que visa capturar as principais tendências de alta e reduzir a perda de comissões causada por transações frequentes.

Princípio da estratégia

  1. Usar o MACD para determinar a direção da tendência, onde o MACD é mais visível quando cruza para cima;

  2. Calcular 20 EMAs, 100 SMAs e 200 SMAs, EMAs e SMAs com um aumento;

  3. EMA acima da linha SMA e SMA acima da linha SMA;

  4. Estabeleça uma linha de stop-loss e, se o preço for abaixo da linha de stop-loss, retire-a.

  5. Quando os preços caem, o EMA atravessa o SMA e o equilíbrio sai.

A estratégia integra vários indicadores para avaliar a tendência e o momento de entrada, obtendo lucros ao rastrear as principais tendências de alta.

Vantagens estratégicas

  1. A combinação de múltiplos indicadores permite filtrar os sinais errados, como a falsa brecha.

  2. A entrada em bolsa somente quando há uma tendência clara, reduzindo a frequência de transações desnecessárias;

  3. A estratégia de stop loss permite controlar efetivamente a perda máxima de uma única transação.

  4. Os dados de retrospectiva mostram que há melhores retornos em bitcoin e ethereum;

  5. A lógica da estratégia é simples e clara, fácil de entender e apropriada para os iniciantes.

  6. É altamente escalável e pode ser introduzido em mais indicadores para otimização.

Risco estratégico

  1. O mercado é muito aleatório, o risco de erro de julgamento;

  2. A única forma de manter uma posição não permite evitar riscos sistêmicos;

  3. A configuração inadequada do ponto de parada pode causar perda excessiva;

  4. Os dados de detecção não são representativos de desempenho em disco, e o efeito em disco deve ser verificado.

  5. O efeito do disco rígido pode variar sem levar em consideração as taxas de transação.

  6. A partir de agora, a variedade pode ser adaptada e aperfeiçoada sem levar em conta as características das diferentes variedades.

Direção de otimização da estratégia

  1. Testar diferentes combinações de parâmetros e otimizar parâmetros de indicadores;

  2. A adição de indicadores como o KDJ para filtrar os sinais de entrada;

  3. Otimizar a estratégia de stop loss, introduzindo stop loss dinâmico;

  4. Considerar a gestão dos fundos da conta e ajustar o tamanho das posições;

  5. Distinguir as características das variedades e ajustar os parâmetros;

  6. O que é que isso quer dizer?

  7. Teste as diferentes variedades e descubra qual é a melhor.

Resumir

A ideia geral da estratégia é clara e fácil de entender. O uso de vários indicadores de julgamento pode filtrar efetivamente os sinais de erro. Mas ainda é necessário otimizar ainda mais os parâmetros, o controle de risco, etc., e, em seguida, combinar com a verificação em campo, pode ser aplicado. Se a otimização for ampliada, pode ser uma estratégia de acompanhamento de tendências de criptomoedas muito prática.

Código-fonte da 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