La estrategia es una estrategia de tendencia automática simple y múltiple, basada en indicadores técnicos, que se aplica a criptomonedas como Bitcoin y Ethereum, con el objetivo de capturar las principales tendencias al alza y reducir la pérdida de comisiones por transacciones frecuentes.
Utiliza el MACD para determinar la dirección de la tendencia, el MACD es más visible cuando cruza hacia arriba;
Calcule el EMA de 20 ciclos, el SMA de 100 ciclos y el SMA de 200 ciclos, el EMA y el SMA se ven más al subir;
Si la EMA está por encima de la SMA, se compra más, y si la SMA está por encima de la línea lenta, se compra más.
Establecer una línea de stop loss y salir de ella cuando el precio cae por debajo de la línea de stop loss.
Cuando los precios bajan, el EMA baja y se retira de la posición en blanco.
La estrategia integra varios indicadores para determinar la tendencia y el momento de entrada, para obtener ganancias al seguir las principales tendencias de alza.
La combinación de varios indicadores puede filtrar de manera efectiva señales erróneas como las falsas brechas.
La entrada en el mercado sólo cuando la tendencia es clara, reduce las transacciones innecesarias y reduce la frecuencia de las transacciones.
Las estrategias de stop loss son efectivas para controlar las pérdidas máximas de una sola transacción.
Los datos de retroalimentación muestran que se pueden obtener mejores ganancias en Bitcoin y Ethereum;
La lógica de la estrategia es simple, clara, fácil de entender y adecuada para los principiantes.
Escalable, puede introducir más indicadores para su optimización.
El mercado es aleatorio y el riesgo de error es alto.
El riesgo sistémico no puede evitarse con una sola posición.
La configuración incorrecta de los puntos de parada puede causar pérdidas excesivas;
Los datos de la detección no son representativos del rendimiento del disco, y el efecto en el disco está pendiente de verificación.
Sin tener en cuenta el impacto de los gastos de transacción, la efectividad en el disco duro puede variar.
Sin tener en cuenta las características de las diferentes variedades, es necesario ajustar la optimización.
Prueba diferentes combinaciones de parámetros para optimizar los parámetros indicadores.
El objetivo de este proyecto es mejorar la calidad de vida de las personas que viven en las calles.
Optimizar las estrategias de detención de pérdidas e introducir el deterioro dinámico.
Considerar la administración de fondos de las cuentas y ajustar el tamaño de las posiciones;
Distinguir las características de las variedades y ajustar los parámetros;
El objetivo de este proyecto es mejorar la calidad de vida de las personas con discapacidad.
Probar las diferentes variedades para encontrar la mejor.
La idea general de la estrategia es clara y fácil de entender, el uso de varios indicadores de juicio puede filtrar eficazmente las señales de error. Pero aún se necesita una optimización adicional de los parámetros, el control de riesgos, etc., y luego se combina con la verificación en el mercado real, para su aplicación práctica. Si se amplía aún más la optimización, puede convertirse en una estrategia de seguimiento de tendencias de criptomonedas muy práctica.
/*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