
La estrategia es un sistema de trading de seguimiento de tendencias basado en múltiples cruces de medias móviles y filtros de volatilidad. Utiliza medias móviles de tres períodos diferentes para identificar tendencias en el mercado y usa una cuarta media móvil como referencia para juzgar un mercado alcista o bajista. La estrategia también introduce un indicador de volatilidad como condición de filtro de negociación para evitar el comercio en entornos de baja volatilidad.
Selección de promedios móviles: la estrategia utiliza tres promedios móviles principales para juzgar la tendencia: a corto plazo, a mediano plazo y a largo plazo. El usuario puede elegir entre seis promedios móviles predefinidos, y cada promedio móvil puede configurar los parámetros individualmente, incluidos el período de cálculo, la fuente de datos y el tipo (como SMA, EMA, etc.).
En cuanto a las tendencias:
El juicio del mercado alcista y bajista: se puede optar por usar la cuarta media móvil como la línea divisoria del mercado alcista y bajista. Cuando el precio está por encima de esta línea, solo se permite hacer más; a la inversa, solo se permite hacer menos.
Filtración de fluctuaciones: utiliza un indicador de fluctuaciones basado en precios máximos y mínimos. La estrategia emite una señal de negociación solo cuando la fluctuación supera el umbral establecido por el usuario.
Logía de entrada:
La lógica de salida:
Detención de pérdidas: el porcentaje de pérdidas fijo es el que el usuario puede personalizar.
Administración de posiciones: Cada vez que se abre una posición, el usuario puede personalizar el porcentaje fijo de los derechos y intereses de la cuenta.
Análisis multidimensional de tendencias: mediante el uso de múltiples medias móviles, las estrategias pueden capturar las tendencias del mercado de manera más completa y reducir las falsas señales.
Configuración de parámetros flexible: El usuario puede ajustar los parámetros de forma flexible, incluidos el tipo de línea promedio, el período y la fuente de datos, según las características de los diferentes mercados y variedades de transacciones.
Filtración de la tasa de fluctuación: mediante la introducción de indicadores de la tasa de fluctuación, la estrategia permite evitar el comercio en entornos de baja volatilidad y mejorar la calidad de la señal.
Adaptación a los mercados alcista y bajista: los mecanismos de decisión al alza y bajista permiten que las estrategias se adapten mejor a diferentes entornos de mercado, reduciendo las operaciones adversas.
Gestión de posiciones dinámica: un método de gestión de posiciones basado en los intereses de la cuenta que permite ajustar automáticamente el tamaño de las transacciones según el tamaño de la cuenta.
Control de riesgo a múltiples niveles: incluye filtros de fluctuación, confirmación de tendencias, posiciones cerradas parciales y paradas fijas.
Negociación bidireccional: soporte para hacer más y hacer menos, con la capacidad de buscar oportunidades de negociación en diversos entornos de mercado.
Ayuda visual: la estrategia traza las etiquetas de las medias móviles y las señales de negociación en los gráficos para facilitar el análisis y la retroalimentación visual.
Retraso: el promedio móvil es un indicador de retraso en la naturaleza, lo que puede causar ligeros retrasos en el tiempo de entrada y salida, lo que afecta la rentabilidad.
Los mercados convulsivos no funcionan bien: en los mercados convulsivos horizontales, las estrategias pueden generar señales falsas con frecuencia, lo que lleva a una sobrecambio y pérdidas.
Sensibilidad de parámetros: el rendimiento de la estrategia depende en gran medida de la configuración de parámetros, y diferentes mercados y marcos de tiempo pueden requerir diferentes combinaciones de parámetros.
Riesgo de retroceso: la estrategia puede no estar en juego a tiempo y causar un retroceso mayor si la tendencia se invierte.
Exceso de dependencia de indicadores técnicos: Las estrategias se basan exclusivamente en indicadores técnicos y ignoran los factores fundamentales, lo que puede hacer que no funcionen bien cuando ocurren noticias o eventos importantes.
Riesgo de gestión de fondos: el método de gestión de posiciones de proporción fija puede generar una abertura de riesgo excesiva en caso de pérdidas continuas.
Establecimiento de stop loss: el stop loss porcentual fijo puede no ser aplicable en todos los entornos de mercado y puede causar un stop loss prematuro en períodos de alta volatilidad.
Parámetros de adaptación: Introducción de un mecanismo de adaptación para ajustar los parámetros de las medias móviles y los umbrales de volatilidad en función de la dinámica de las condiciones del mercado.
Análisis de múltiples marcos de tiempo: combinación de información de marcos de tiempo más largos y más cortos para mejorar la precisión de los juicios de tendencias.
Optimización de indicadores de volatilidad: Considere el uso de indicadores de volatilidad más complejos, como el ATR o el Bollinger Bandwidth, para evaluar con mayor precisión la situación del mercado.
Introducción de indicadores de dinámica: combinación de indicadores de dinámica como el RSI o el MACD para optimizar el tiempo de entrada y salida.
Mejora de los mecanismos de stop loss: implementación de stop loss de seguimiento o stop loss dinámico basado en ATR para adaptarse mejor a las fluctuaciones del mercado
Integración de los indicadores de sentimiento de mercado: introducción de indicadores de sentimiento de mercado como VIX, estrategias de optimización para el desempeño en diferentes entornos de mercado.
Optimización de la gestión de posiciones: Realización de la gestión de posiciones dinámicas basadas en la volatilidad o la pérdida actual, para un mejor control del riesgo.
Añadir un filtro básico: considerar factores básicos como la publicación de datos económicos importantes o los resultados de las empresas y evitar el comercio durante los períodos de alto riesgo.
Optimización de aprendizaje automático: optimización de la combinación de parámetros y las reglas de decisión con algoritmos de aprendizaje automático para mejorar la adaptabilidad de las estrategias.
Retrospectiva y pruebas de avance: realice una retrospectiva más completa y pruebas de avance en diferentes mercados y períodos de tiempo para verificar la solidez de la estrategia.
La estrategia de seguimiento de tendencias de cruce de líneas medias múltiples y filtración de la tasa de fluctuación es un sistema de negociación completo y flexible que combina múltiples promedios móviles, indicadores de la tasa de fluctuación y principios de seguimiento de tendencias. A través de un análisis de tendencias multidimensional y un control riguroso del riesgo, la estrategia tiene el potencial de capturar tendencias continuas en una variedad de entornos de mercado.
/*backtest
start: 2023-07-23 00:00:00
end: 2024-07-28 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/
//@version=5
strategy(title="WODIsMA Strategy", shorttitle="WMA_Strategy", overlay=true, overlay=true, pyramiding=2, default_qty_value=6, default_qty_type=strategy.fixed, initial_capital=1000, currency=currency.USD)
// 用户输入参数
capital_pct = input.float(20, title="每笔订单使用的资金百分比(%)", minval=0.1, maxval=100, group="Position") / 100
close_pct = input.float(20, title="每次平仓使用的百分比(%)", minval=0, maxval=100, group="Position") / 100
stop_loss_user = input.float(10, title="止损百分比(%)", minval=0, maxval=100, group="Position") / 100
allow_long = input.bool(true, title="是否做多", group="Position")
allow_short = input.bool(true, title="是否做空", group="Position")
// 用户选择的移动平均线
short_term_ma = input.string("MA 0", title="短期趋势均线", options=["MA 0", "MA 1", "MA 2", "MA 3", "MA 4", "MA 5"], group="TrendIdentify")
mid_term_ma = input.string("MA 1", title="中期趋势均线", options=["MA 0", "MA 1", "MA 2", "MA 3", "MA 4", "MA 5"], group="TrendIdentify")
long_term_ma = input.string("MA 2", title="长期趋势均线", options=["MA 0", "MA 1", "MA 2", "MA 3", "MA 4", "MA 5"], group="TrendIdentify")
bull_bear_ma = input.string("MA 3", title="牛熊趋势均线", options=["MA 0", "MA 1", "MA 2", "MA 3", "MA 4", "MA 5"], group="TrendIdentify")
enable_bull_bear = input.bool(false, title="是否启用牛熊趋势线", group="TrendIdentify")
// 波动率指标参数
volatility_k = input.int(60, title="波动率数值K线数" , group="volatility")
volatility_threshold = input.float(1, minval=0, title="波动率值 0则不使用(%)", group="volatility")
// 定义不同类型的移动平均线函数
ma(source, length, type) =>
switch type
"SMA" => ta.sma(source, length)
"EMA" => ta.ema(source, length)
"SMMA (RMA)" => ta.rma(source, length)
"WMA" => ta.wma(source, length)
"VWMA" => ta.vwma(source, length)
// 定义每根均线的输入参数和颜色
length0 = input.int(16, minval=1, title="Length 0", group="MA 0")
source0 = input.source(hl2, title="Source 0", group="MA 0")
type0 = input.string("SMA", title="Type 0", options=["SMA", "EMA", "SMMA (RMA)", "WMA", "VWMA"], group="MA 0")
timeframe0 = input.timeframe("", title="Timeframe 0", group="MA 0")
color0 = input.color(color.gray, title="Color 0", group="MA 0")
show0 = input.bool(true, title="Show MA 0", group="MA 0")
length1 = input.int(48, minval=1, title="Length 1", group="MA 1")
source1 = input.source(hl2, title="Source 1", group="MA 1")
type1 = input.string("SMA", title="Type 1", options=["SMA", "EMA", "SMMA (RMA)", "WMA", "VWMA"], group="MA 1")
timeframe1 = input.timeframe("", title="Timeframe 1", group="MA 1")
color1 = input.color(color.aqua, title="Color 1", group="MA 1")
show1 = input.bool(true, title="Show MA 1", group="MA 1")
length2 = input.int(144, minval=1, title="Length 2", group="MA 2")
source2 = input.source(hl2, title="Source 2", group="MA 2")
type2 = input.string("SMA", title="Type 2", options=["SMA", "EMA", "SMMA (RMA)", "WMA", "VWMA"], group="MA 2")
timeframe2 = input.timeframe("", title="Timeframe 2", group="MA 2")
color2 = input.color(color.orange, title="Color 2", group="MA 2")
show2 = input.bool(true, title="Show MA 2", group="MA 2")
length3 = input.int(432, minval=1, title="Length 3", group="MA 3")
source3 = input.source(hl2, title="Source 3", group="MA 3")
type3 = input.string("SMA", title="Type 3", options=["SMA", "EMA", "SMMA (RMA)", "WMA", "VWMA"], group="MA 3")
timeframe3 = input.timeframe("", title="Timeframe 3", group="MA 3")
color3 = input.color(color.green, title="Color 3", group="MA 3")
show3 = input.bool(true, title="Show MA 3", group="MA 3")
length4 = input.int(91, minval=1, title="Length 4", group="MA 4")
source4 = input.source(hl2, title="Source 4", group="MA 4")
type4 = input.string("SMA", title="Type 4", options=["SMA", "EMA", "SMMA (RMA)", "WMA", "VWMA"], group="MA 4")
timeframe4 = input.timeframe("D", title="Timeframe 4", group="MA 4")
color4 = input.color(color.rgb(159, 110, 208), title="Color 4", group="MA 4") // 浅紫色
style4 = input.string("step", title="Style 4", options=["line", "step"], group="MA 4")
show4 = input.bool(false, title="Show MA 4", group="MA 4")
length5 = input.int(182, minval=1, title="Length 5", group="MA 5")
source5 = input.source(hl2, title="Source 5", group="MA 5")
type5 = input.string("SMA", title="Type 5", options=["SMA", "EMA", "SMMA (RMA)", "WMA", "VWMA"], group="MA 5")
timeframe5 = input.timeframe("D", title="Timeframe 5", group="MA 5")
color5 = input.color(color.red, title="Color 5", group="MA 5")
style5 = input.string("step", title="Style 5", options=["line", "step"], group="MA 5")
show5 = input.bool(true, title="Show MA 5", group="MA 5")
// 计算每根均线的值
value0 = request.security(syminfo.tickerid, timeframe0, ma(source0, length0, type0))
value1 = request.security(syminfo.tickerid, timeframe1, ma(source1, length1, type1))
value2 = request.security(syminfo.tickerid, timeframe2, ma(source2, length2, type2))
value3 = request.security(syminfo.tickerid, timeframe3, ma(source3, length3, type3))
value4 = request.security(syminfo.tickerid, timeframe4, ma(source4, length4, type4))
value5 = request.security(syminfo.tickerid, timeframe5, ma(source5, length5, type5))
// 绘制每根均线
plot(show0 ? value0 : na, title="MA 0", color=color0)
plot(show1 ? value1 : na, title="MA 1", color=color1)
plot(show2 ? value2 : na, title="MA 2", color=color2)
plot(show3 ? value3 : na, title="MA 3", color=color3)
plot(show4 ? value4 : na, title="MA 4", color=color4, style=style4 == "step" ? plot.style_stepline : plot.style_line, linewidth=2)
plot(show5 ? value5 : na, title="MA 5", color=color5, style=style5 == "step" ? plot.style_stepline : plot.style_line, linewidth=2)
// 添加策略部分
// 选择均线值
get_ma_value(ma_name) =>
if (ma_name == "MA 0")
value0
else if (ma_name == "MA 1")
value1
else if (ma_name == "MA 2")
value2
else if (ma_name == "MA 3")
value3
else if (ma_name == "MA 4")
value4
else
value5
short_ma_value = get_ma_value(short_term_ma)
mid_ma_value = get_ma_value(mid_term_ma)
long_ma_value = get_ma_value(long_term_ma)
bull_bear_ma_value = get_ma_value(bull_bear_ma)
// 计算波动率
high_close = ta.highest(high, volatility_k)
low_close = ta.lowest(low, volatility_k)
volatility = 100 * (high_close - low_close) / low_close
// 波动率条件背景色
volatilityCondition = (volatility > volatility_threshold)
volatilityConditionBG = (volatility > volatility_threshold) and volatility_threshold != 0
bgcolor(volatilityConditionBG ? color.new(color.green, 90) : na, title="Volatility Background")
// 策略信号
long_condition = (short_ma_value > long_ma_value and ta.crossover(mid_ma_value, long_ma_value))
short_condition = (short_ma_value < long_ma_value and ta.crossunder(mid_ma_value, long_ma_value))
var float stop_level_long = na
var float stop_level_short = na
// 执行策略
if (volatilityCondition and allow_long and (not enable_bull_bear or close > bull_bear_ma_value))
if (long_condition and close > long_ma_value) // 判断是否立即触发止损
strategy.entry("Long", strategy.long, qty=capital_pct * strategy.equity / close)
label.new(bar_index, low*0.996, text="BUY", color=color.green, textcolor=color.white, style=label.style_label_up, size=size.small)
if (volatilityCondition and allow_short and (not enable_bull_bear or close < bull_bear_ma_value))
if (short_condition and close < long_ma_value) // 判断是否立即触发止损
strategy.entry("Short", strategy.short, qty=capital_pct * strategy.equity / close)
label.new(bar_index, high*1.004, text="SELL", color=color.red, textcolor=color.white, style=label.style_label_down, size=size.small)
// 部分平仓逻辑
if (enable_bull_bear)
// 当当前价格处在牛熊趋势均线之下时
if (close < bull_bear_ma_value)
// 平所有多仓
if (strategy.position_size > 0)
strategy.close("Long", comment="平所有多仓")
label.new(bar_index, low*0.996, text="CLOSE", color=color.gray, textcolor=color.white, style=label.style_label_up, size=size.small)
// 当短期均线在长期均线之上时,中期均线向上穿过长期均线,平空
if (short_ma_value > long_ma_value and ta.crossover(mid_ma_value, long_ma_value) and volatilityCondition)
if (strategy.position_size < 0)
strategy.close("Short", qty=close_pct * strategy.position_size, comment="部分平空")
label.new(bar_index, high*1.004, text="CLOSE", color=color.gray, textcolor=color.white, style=label.style_label_down, size=size.small)
// 当当前价格处在牛熊趋势均线之上时
if (close > bull_bear_ma_value)
// 平所有空仓
if (strategy.position_size < 0)
strategy.close("Short", comment="平所有空仓")
label.new(bar_index, high*1.004, text="CLOSE", color=color.gray, textcolor=color.white, style=label.style_label_up, size=size.small)
// 当短期均线在长期均线之下时,中期均线向下穿过长期均线,平多
if (short_ma_value < long_ma_value and ta.crossunder(mid_ma_value, long_ma_value) and volatilityCondition)
if (strategy.position_size > 0)
strategy.close("Long", qty=close_pct * strategy.position_size, comment="部分平多")
label.new(bar_index, low*0.996, text="CLOSE", color=color.gray, textcolor=color.white, style=label.style_label_down, size=size.small)
else if (not enable_bull_bear and not (allow_long and allow_short))
// 当短期均线在长期均线之上时,中期均线向上穿过长期均线,平空
if (short_ma_value > long_ma_value and ta.crossover(mid_ma_value, long_ma_value) and volatilityCondition)
if (strategy.position_size < 0)
strategy.close("Short", qty=close_pct * strategy.position_size, comment="部分平空")
label.new(bar_index, low*0.996, text="CLOSE", color=color.gray, textcolor=color.white, style=label.style_label_up, size=size.small)
// 当短期均线在长期均线之下时,中期均线向下穿过长期均线,平多
if (short_ma_value < long_ma_value and ta.crossunder(mid_ma_value, long_ma_value) and volatilityCondition)
if (strategy.position_size > 0)
strategy.close("Long", qty=close_pct * strategy.position_size, comment="部分平多")
label.new(bar_index, high*1.004, text="CLOSE", color=color.gray, textcolor=color.white, style=label.style_label_down, size=size.small)
// 止损处理
if (strategy.position_size > 0)
stop_level_long_user = strategy.position_avg_price * (1 - stop_loss_user)
strategy.exit("Stop Loss", from_entry="Long", stop=stop_level_long_user)
else if (strategy.position_size < 0)
stop_level_short_user = strategy.position_avg_price * (1 + stop_loss_user)
strategy.exit("Stop Loss", from_entry="Short", stop=stop_level_short_user)