
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.
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.
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:
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:
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.
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.
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.
A estratégia também pode ser melhorada nos seguintes aspectos:
Teste mais combinações de ciclos medíocres, procurando o parâmetro ótimo.
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.
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.
Combinação de indicadores de volume de transação para evitar falsas rupturas, como indicadores de energia, volume de transação, etc.
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.
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.
/*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