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.
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.
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.
Use várias médias móveis combinadas para julgar a tendência, que é relativamente confiável.
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.
A combinação de indicadores como o MACD e o RSI para confirmação de sinais de estratégia pode filtrar falhas.
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.
Pode controlar eficazmente os riscos limitando as perdas através de stop loss.
O principal problema é que não é possível deter as perdas a tempo quando a tendência se inverte.
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.
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.
Os indicadores de média móvel tendem a atrasar: adicionar uma certa percentagem de linhas de stop loss para stop loss ativo.
Esta estratégia pode também ser otimizada nos seguintes aspectos:
Teste mais combinações de ciclos de média móvel para encontrar os parâmetros ideais.
Tente outros indicadores ou modelos para julgar tendências e tempo de entrada, como Bandas de Bollinger, Indicador KD, etc.
Usar aprendizado de máquina e outros métodos para otimizar dinamicamente os parâmetros.
Incorporar indicadores de volume de negociação para evitar falhas. Por exemplo, volume de saldo, volume de transações, etc.
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.
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