Esta estrategia identifica la dirección de la tendencia actual mediante el cálculo de promedios móviles de diferentes períodos y genera señales comerciales combinadas con el indicador RSI. Cuando el promedio móvil de corto período cruza por encima del promedio móvil de largo período, la tendencia se considera y se genera una señal de compra. Cuando el promedio móvil de corto período cruza por debajo del promedio móvil de largo período, la tendencia se considera inversa y se genera una señal de venta. El indicador RSI se utiliza para evitar señales falsas causadas por fluctuaciones menores de precios.
Calcular las medias móviles simples de 10 días, 20 días, 50 días, 100 días y 200 días.
Calcule el valor del RSI de 14 días.
Cuando la SMA de 10 días se cruce por encima de la SMA de 50 días, y el RSI es mayor que 30, y la SMA de 20 días es mayor o igual a la SMA de 100 días o la SMA de 50 días es mayor o igual a la SMA de 100 días, comprar.
El valor de las pérdidas se calculará en función de los precios de entrada multiplicados por (1 - porcentaje de pérdidas).
Vender cuando:
Esta estrategia juzga la tendencia del mercado utilizando promedios móviles y establece stop loss para controlar los riesgos. El RSI filtra las falsas rupturas. Compra cuando el SMA de corto período cruza por encima del SMA de largo período, lo que indica una tendencia alcista, y establece una línea de stop loss para controlar los riesgos durante el período de retención. Vende cuando ocurre una señal de inversión de tendencia o se activa el precio de stop loss.
La optimización se puede hacer mediante el ajuste de los períodos de promedio móvil, los niveles de stop loss, etc. También considere combinar con otros indicadores para mejorar la precisión.
La estrategia tiene una lógica clara en general, utilizando promedios móviles para la determinación de tendencias y la configuración de stop loss para controlar riesgos. Es una estrategia típica de seguimiento de tendencias. Se pueden lograr mejoras adicionales a través del ajuste de parámetros y la adición de otros indicadores.
/*backtest start: 2022-09-30 00:00:00 end: 2023-10-06 00:00:00 period: 1d basePeriod: 1h exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}] */ //@version=4 strategy("MA_Script", overlay=true) // STEP 1: // Configure trail stop level with input options (optional) longTrailPerc=input(title="Trail Long Loss (%)", type=input.float, minval=0.0, step=0.05, defval=0.1) // Configure backtest start date with inputs startDate=input(title="Start Date", type=input.integer, defval=1, minval=1, maxval=31) startMonth=input(title="Start Month", type=input.integer, defval=1, minval=1, maxval=12) startYear=input(title="Start Year", type=input.integer, defval=2020, minval=1800, maxval=2100) // See if this bar's time happened on/after start date afterStartDate=(time >=timestamp(syminfo.timezone, startYear, startMonth, startDate, 0, 0)) // Calculate Relative Strength Index rsiValue=rsi(close, 14) // Calculate moving averages MA10_Val =sma(close, 10) //plot(MA10_Val, color=color.yellow, linewidth=1) MA20_Val =sma(close, 20) plot(MA20_Val, color=color.green, linewidth=1) MA50_Val =sma(close, 50) plot(MA50_Val, color=color.red, linewidth=1) MA100_Val =sma(close, 100) plot(MA100_Val, color=color.blue, linewidth=1) MA200_Val =sma(close, 200) plot(MA200_Val, color=color.purple, linewidth=1) // Calculate candlestick C_BodyHi = max(close, open) C_BodyLo = min(close, open) C_Body = C_BodyHi - C_BodyLo C_UpShadow = high - C_BodyHi C_DnShadow = C_BodyLo - low // STEP 2: // Calculate entry trading conditions buyCondition_1=crossover(MA10_Val, MA50_Val) and (rsiValue > 30) and ((MA20_Val >= MA100_Val) or (MA50_Val >= MA100_Val)) avg_price = (close + open)/2 // First Entry if (afterStartDate) strategy.entry(id="Entry_Trade_1", long=true, limit=avg_price, when=buyCondition_1) plotchar(afterStartDate and crossover(MA10_Val, MA50_Val), textcolor = color.blue, text = 'MA\n') // Determine trail stop loss prices longStopPrice=0.0 longStopPrice :=if (strategy.position_size > 0) stopValue=C_BodyHi * (1 - longTrailPerc) max(stopValue, longStopPrice[1]) else 0 plot(longStopPrice, color=color.orange, linewidth=1) bought_1=strategy.position_size[0] > strategy.position_size[1] entry_Point_1=valuewhen(bought_1, avg_price, 0) // STEP 3: // Calculate exit trading conditions sellCondition_2=crossunder(MA10_Val, MA50_Val) and (close < MA20_Val) sellCondition_3_temp=valuewhen((C_BodyHi >= entry_Point_1*1.2), 1, 0) sellCondition_1=(entry_Point_1*0.95 > close) and (sellCondition_3_temp != 1) sellCondition_3=(sellCondition_3_temp == 1) and (strategy.position_size > 0) and close <= longStopPrice plotchar((sellCondition_3 == 1) and (strategy.position_size > 0) and close <= longStopPrice, textcolor = color.red, text = 'TS\n', show_last = 11) plotchar(crossunder(MA10_Val, MA50_Val), textcolor = color.red, text = 'MA\n') id_val = "" stop_val = close condition = false if sellCondition_1 id_val := "Exit By Stop Loss At 7%" stop_val := entry_Point_1*0.93 condition := true else if sellCondition_2 id_val := "Exit By Take Profit based on MA" stop_val := close condition := true else if sellCondition_3 id_val := "Exit By Trailing Stop" stop_val := longStopPrice condition := true // Submit exit orders for trail stop loss price if (strategy.position_size > 0) //strategy.exit(id="Exit By Stop Loss At 7%", from_entry="Entry_Trade_1", stop=entry_Point_1*0.93, when=sellCondition_1) //strategy.exit(id="Exit By Take Profit based on MA", from_entry="Entry_Trade_1", stop=close, when=sellCondition_2) strategy.exit(id=id_val, from_entry="Entry_Trade_1", stop=stop_val, when=condition)