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.
Usar o MACD para determinar a direção da tendência, onde o MACD é mais visível quando cruza para cima;
Calcular 20 EMAs, 100 SMAs e 200 SMAs, EMAs e SMAs com um aumento;
EMA acima da linha SMA e SMA acima da linha SMA;
Estabeleça uma linha de stop-loss e, se o preço for abaixo da linha de stop-loss, retire-a.
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.
A combinação de múltiplos indicadores permite filtrar os sinais errados, como a falsa brecha.
A entrada em bolsa somente quando há uma tendência clara, reduzindo a frequência de transações desnecessárias;
A estratégia de stop loss permite controlar efetivamente a perda máxima de uma única transação.
Os dados de retrospectiva mostram que há melhores retornos em bitcoin e ethereum;
A lógica da estratégia é simples e clara, fácil de entender e apropriada para os iniciantes.
É altamente escalável e pode ser introduzido em mais indicadores para otimização.
O mercado é muito aleatório, o risco de erro de julgamento;
A única forma de manter uma posição não permite evitar riscos sistêmicos;
A configuração inadequada do ponto de parada pode causar perda excessiva;
Os dados de detecção não são representativos de desempenho em disco, e o efeito em disco deve ser verificado.
O efeito do disco rígido pode variar sem levar em consideração as taxas de transação.
A partir de agora, a variedade pode ser adaptada e aperfeiçoada sem levar em conta as características das diferentes variedades.
Testar diferentes combinações de parâmetros e otimizar parâmetros de indicadores;
A adição de indicadores como o KDJ para filtrar os sinais de entrada;
Otimizar a estratégia de stop loss, introduzindo stop loss dinâmico;
Considerar a gestão dos fundos da conta e ajustar o tamanho das posições;
Distinguir as características das variedades e ajustar os parâmetros;
O que é que isso quer dizer?
Teste as diferentes variedades e descubra qual é a melhor.
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.
/*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