Esta estrategia se llama
La estrategia utiliza precios de origen durante un período de tiempo para calcular el promedio móvil, donde los precios de origen pueden ser OHLC4, HLC3, precio de cierre, etc. El promedio móvil resultante se define como sma. Luego, la línea larga y la línea corta se trazan en función del porcentaje del valor promedio móvil para determinar si actualmente estamos en una tendencia al alza o a la baja.
Específicamente, la línea corta se calcula como: shortline = sma * ((100 + shortlevel) / 100), donde shortlevel es un número positivo establecido por el usuario, que representa el porcentaje que la línea corta está por encima del promedio móvil.
Por lo tanto, el valor de la línea corta es siempre mayor que el promedio móvil, y el valor de la línea larga es siempre menor que el promedio móvil. Cuando el precio cruza por encima de la línea corta, representa que comienza una tendencia al alza. En este momento, si el needlong permite largo, colocará un pedido largo en el nivel del precio de la línea larga. Cuando el precio cruza por debajo de la línea larga, representa que comienza una tendencia a la baja. En este momento, si el needshort permite corto, colocará un pedido corto en el nivel del precio de la línea corta.
Independientemente de largo o corto, cuando el precio vuelve a la media móvil, significa que la tendencia termina.
Así que la dirección de la tendencia y las entradas correspondientes y existen están determinados por la relación dinámica entre las líneas largo / corto y la línea de media móvil.
La mayor ventaja de esta estrategia es que, al establecer dinámicamente las líneas largas y cortas, puede capturar con relativa flexibilidad la dirección de la tendencia principal.
En segundo lugar, la media móvil en sí tiene un efecto de filtro hasta cierto punto, lo que evita quedar atrapado por las fluctuaciones de alta frecuencia hasta cierto punto.
El mayor riesgo de esta estrategia es que el rendimiento de los promedios móviles difiere en diferentes períodos. Normalmente, el promedio móvil es suficiente para representar la dirección de la tendencia, pero en algunas condiciones extremas del mercado, el promedio móvil podría penetrar en el corto plazo, causando entradas erróneas, o divergencia superior, etc. En este caso, se necesitan promedios móviles de período más largo para garantizar la precisión del juicio de la tendencia.
Otro aspecto del riesgo es que las medias móviles tienen una alta inercia. Para algunas fluctuaciones de precios cortas e intensas, es difícil que las medias móviles respondan a tiempo, por lo que se pierden puntos de entrada o salida.
La estrategia se puede optimizar aún más en los siguientes aspectos:
Añadir la lógica de stop loss. Dado que las medias móviles tienen retraso en juzgar las tendencias, no se puede evitar completamente quedar atrapados. Por lo tanto, las paradas de trailing adecuadas pueden reducir aún más los riesgos.
Optimizar los parámetros de las líneas largas / cortas. Actualmente los porcentajes de las líneas largas / cortas que se desvían de la media móvil son fijos. Estos pueden probarse en diferentes conjuntos de datos para encontrar valores óptimos.
Además de las posiciones de línea larga / corta, los algoritmos también pueden juzgar la fuerza de la tendencia, para evitar errores de señales de tendencia débiles.
Intentar aplicar medias móviles a otros productos de negociación para verificar el rendimiento de los productos cruzados.
Esta estrategia determina la tendencia y coloca las operaciones largas / cortas correspondientes estableciendo dinámicamente puntos de entrada y salida basados en promedios móviles. Este método de generación dinámica de señales comerciales basadas en promedios móviles es más flexible e inteligente en la captura de tendencias de precios en comparación con los niveles de desencadenante estáticos. También resuelve el problema de la falta de puntualidad de los propios promedios móviles.
/*backtest start: 2022-11-16 00:00:00 end: 2023-11-22 00:00:00 period: 1d basePeriod: 1h exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}] */ //Noro //2018 //@version=3 strategy(title = "Noro's ShiftMA Strategy v1.1", shorttitle = "ShiftMA str 1.1", overlay = true, default_qty_type = strategy.percent_of_equity, default_qty_value = 100, pyramiding = 100) //Settings needlong = input(true, defval = true, title = "Long") needshort = input(false, defval = false, title = "Short") capital = input(100, defval = 100, minval = 1, maxval = 10000, title = "Lot, %") per = input(3, title = "Length") src = input(ohlc4, title = "Source") shortlevel = input(10.0, title = "Short line (red)") longlevel = input(-5.0, title = "Long line (lime)") fromyear = input(1900, defval = 1900, minval = 1900, maxval = 2100, title = "From Year") toyear = input(2100, defval = 2100, minval = 1900, maxval = 2100, title = "To Year") frommonth = input(01, defval = 01, minval = 01, maxval = 12, title = "From Month") tomonth = input(12, defval = 12, minval = 01, maxval = 12, title = "To Month") fromday = input(01, defval = 01, minval = 01, maxval = 31, title = "From day") today = input(31, defval = 31, minval = 01, maxval = 31, title = "To day") //SMAs sma = sma(src, per) //sma = lowest(low, per) shortline = sma * ((100 + shortlevel) / 100) longline = sma * ((100 + longlevel) / 100) plot(shortline, linewidth = 2, color = red, title = "Short line") plot(sma, linewidth = 2, color = blue, title = "SMA line") plot(longline, linewidth = 2, color = lime, title = "Long line") //plot(round(buy * 100000000), linewidth = 2, color = lime) //plot(round(sell * 100000000), linewidth = 2, color = red) //Trading size = strategy.position_size lot = 0.0 lot := size == 0 ? strategy.equity / close * capital / 100 : lot[1] if (not na(close[per])) and size == 0 and needlong strategy.entry("L", strategy.long, lot, limit = longline, when = (time > timestamp(fromyear, frommonth, fromday, 00, 00) and time < timestamp(toyear, tomonth, today, 23, 59))) if (not na(close[per])) and size == 0 and needshort strategy.entry("S", strategy.short, lot, limit = shortline, when = (time > timestamp(fromyear, frommonth, fromday, 00, 00) and time < timestamp(toyear, tomonth, today, 23, 59))) if (not na(close[per])) and size > 0 strategy.entry("Close", strategy.short, 0, limit = sma, when = (time > timestamp(fromyear, frommonth, fromday, 00, 00) and time < timestamp(toyear, tomonth, today, 23, 59))) if (not na(close[per])) and size < 0 strategy.entry("Close", strategy.long, 0, limit = sma, when = (time > timestamp(fromyear, frommonth, fromday, 00, 00) and time < timestamp(toyear, tomonth, today, 23, 59))) if time > timestamp(toyear, tomonth, today, 23, 59) strategy.close_all()