Esta es una estrategia de negociación que establece órdenes límite basadas en múltiples promedios móviles. Establecerá diferentes números de órdenes límite largos o cortos cuando el precio rompe diferentes niveles de MA, formando una posición múltiple en forma de pirámide. Cuando el precio rompe el MA nuevamente, se abrirán órdenes límite inversa. Cuando se mantienen posiciones, las posiciones se cerrarán por órdenes de mercado inverso si el precio rompe el MA medio.
La estrategia utiliza promedios móviles para determinar la dirección de la tendencia. Específicamente, determina el número de órdenes de límite largo basado en si el precio rompe las 3 líneas MA ascendentes. Y determina el número de órdenes de límite corto basado en si el precio rompe las 3 líneas MA descendentes.
Por lo tanto, cuanto más fuerte sea la tendencia, más órdenes límite en la misma dirección se establecerán. Cuando el precio muestra señales de reversión, se abrirán posiciones inversas.
Toda la estrategia combina la apertura de estilo pirámide con el cierre de estilo avance para formar la lógica de negociación.
Las ventajas de esta estrategia incluyen:
Utilizando MAs para determinar tendencias, simple e intuitivo de operar.
La apertura piramidal puede obtener mejores precios promedio en la etapa inicial de las tendencias.
El stop loss MA medio puede detener las pérdidas y controlar los riesgos a tiempo.
Las órdenes limitadas evitan deslizamientos.
Los parámetros personalizables se adaptan a los diferentes productos.
Estructura clara, fácil de entender y extender.
Los riesgos de la estrategia incluyen:
El retraso de la MA puede causar errores de juicio.
Las órdenes de límite fallidas pueden perder oportunidades de entrada.
La media de MA puede ser demasiado cruda para juzgar los avances.
La configuración incorrecta de los parámetros puede dar lugar a posiciones demasiado grandes.
El período de prueba posterior insuficiente puede causar un sobreajuste.
No hay consideración de los costos de transacción.
Las soluciones son:
Añadir otros indicadores para confirmar, optimizar parámetros.
Establece el vencimiento, ajusta los precios límite.
Agregue la toma de ganancias o la lógica en el medio de MA stop loss.
Optimizar los parámetros, evaluar las relaciones riesgo-recompensa.
Ampliar el período de pruebas de retroceso, pruebas de retroceso de múltiples mercados.
Agregue los costos de transacción y la lógica de deslizamiento.
La estrategia se puede optimizar en los siguientes aspectos:
Optimizar los parámetros para más productos, utilizando métodos de aprendizaje automático.
Añadir otros indicadores para su confirmación, por ejemplo, MACD, KDJ, etc.
Agregue la lógica de toma de ganancias en la línea media de MA.
Ajuste dinámico de los tamaños de las posiciones y los niveles de stop loss.
Optimizar los precios límite para mejorar los costes de entrada, por ejemplo basándose en la volatilidad.
Gestionar los costes para evitar las tendencias de exceso de persecución.
Prueba de parámetros en diferentes productos para construir conjuntos de parámetros.
Esta estrategia abre posiciones en forma de pirámide con órdenes límite para lograr mejores costos promedio. Utiliza el MA medio para detener la pérdida para controlar los riesgos. La estructura de la estrategia es simple y clara, fácil de entender y extender. Pero se puede mejorar introduciendo otros indicadores, optimizando parámetros, mejorando la lógica de orden límite, etc. para hacerlo más robusto. En general, esta estrategia proporciona una idea simple y práctica de la negociación de órdenes límite que tiene algún valor de referencia.
/*backtest start: 2022-09-15 00:00:00 end: 2023-09-21 00:00:00 period: 1d basePeriod: 1h exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}] */ //Noro //2019 //@version=4 strategy(title = "Robot WhiteBox MultiMA", shorttitle = "Robot WhiteBox MultiMA", overlay = true, default_qty_type = strategy.percent_of_equity, default_qty_value = 100, pyramiding = 3) //Settings capital = input(100, defval = 100, minval = 1, maxval = 10000, title = "Lot") len = input(3, minval = 1, title = "MA Length") s = input(defval = "7. OHLC4", options = ["1. Open", "2. High", "3. Low", "4. Close", "5. HL2", "6. HLC3", "7. OHLC4", "8. OC2", "9. PCMA"], title = "Data") short3 = input(true, title = "short 3") short2 = input(true, title = "short 2") short1 = input(true, title = "short 1") long1 = input(true, title = "long 1") long2 = input(true, title = "long 2") long3 = input(true, title = "long 3") shortlevel3 = input(15.0, title = "Short line 3") shortlevel2 = input(10.0, title = "Short line 2") shortlevel1 = input(5.0, title = "Short line 1") longlevel1 = input(-5.0, title = "Long line 1") longlevel2 = input(-10.0, title = "Long line 2") longlevel3 = input(-15.0, title = "Long line 3") needoffset = input(true, title = "Offset") 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") //Variables size = strategy.position_size mult = 1 / syminfo.mintick needtime = time > timestamp(fromyear, frommonth, fromday, 00, 00) and time < timestamp(toyear, tomonth, today, 23, 59) //MA oc2 = (open + close) / 2 pcma = (highest(high, len) + lowest(low, len)) / 2 src = s == "1. Open" ? open : s == "2. High" ? high : s == "3. Low" ? low : s == "4. Close" ? close : s == "5. HL2" ? hl2 : s == "6. HLC3" ? hlc3 : s == "7. OHLC4" ? ohlc4 : s == "8. OC2" ? oc2: close sma = sma(src, len) ma = s == "9. PCMA" ? round(pcma * mult) / mult : round(sma * mult) / mult //Levels longline1 = long1 ? round(ma * ((100 + longlevel1) / 100) * mult) / mult : close longline2 = long2 ? round(ma * ((100 + longlevel2) / 100) * mult) / mult : close longline3 = long3 ? round(ma * ((100 + longlevel3) / 100) * mult) / mult : close shortline1 = short1 ? round(ma * ((100 + shortlevel1) / 100) * mult) / mult : close shortline2 = short2 ? round(ma * ((100 + shortlevel2) / 100) * mult) / mult : close shortline3 = short3 ? round(ma * ((100 + shortlevel3) / 100) * mult) / mult : close //Lines colorlong1 = long1 ? color.lime : na colorlong2 = long2 ? color.lime : na colorlong3 = long3 ? color.lime : na colorshort1 = short1 ? color.red : na colorshort2 = short2 ? color.red : na colorshort3 = short3 ? color.red : na offset = needoffset ? 1 : 0 plot(shortline3, offset = offset, color = colorshort3, title = "Short line 3") plot(shortline2, offset = offset, color = colorshort2, title = "Short line 2") plot(shortline1, offset = offset, color = colorshort1, title = "Short line 1") plot(ma, offset = offset, color = color.blue, title = "MA line") plot(longline1, offset = offset, color = colorlong1, title = "Long line 1") plot(longline2, offset = offset, color = colorlong2, title = "Long line 2") plot(longline3, offset = offset, color = colorlong3, title = "Long line 3") //Trading lot = 0.0 lot := size == 0 ? strategy.equity / close * capital / 100 : lot[1] lots = 0.0 if ma > 0 lots := round(size / lot) strategy.entry("L1", strategy.long, lot, limit = longline1, when = (lots == 0 and long1 and needtime)) lots := round(size / lot) strategy.entry("L2", strategy.long, lot, limit = longline2, when = (lots <= 1 and long2 and needtime)) lots := round(size / lot) strategy.entry("L3", strategy.long, lot, limit = longline3, when = (lots <= 2 and long3 and needtime)) lots := round(size / lot) strategy.entry("S1", strategy.short, lot, limit = shortline1, when = (lots == 0 and short1 and needtime)) lots := round(size / lot) strategy.entry("S2", strategy.short, lot, limit = shortline2, when = (lots >= -1 and short2 and needtime)) lots := round(size / lot) strategy.entry("S3", strategy.short, lot, limit = shortline3, when = (lots >= -2 and short3 and needtime)) if size > 0 strategy.entry("TPL", strategy.short, 0, limit = ma) if size < 0 strategy.entry("TPS", strategy.long, 0, limit = ma) if time > timestamp(toyear, tomonth, today, 23, 59) strategy.close_all()