Estrategia de intercambio de ALMA

El autor:¿ Qué pasa?, Fecha: 2023-09-23 15:11:02
Las etiquetas:

Resumen general

Esta estrategia utiliza dos promedios móviles de Arnaud Legoux (ALMA), uno rápido y otro lento, para generar señales de cruce. ALMA reduce el retraso y suaviza la línea de señal en comparación con los MA tradicionales. Se agrega un filtro de volumen para mejorar la precisión de la señal. Está optimizado para criptomonedas pero se puede ajustar para otros instrumentos.

Estrategia lógica

Los indicadores y las reglas principales son:

  1. Rápido ALMA: período más corto para atrapar los escapes.

  2. ALMA lento: período más largo para medir la tendencia.

  3. Filtro de volumen: es válido cuando la EMA corta cruza la EMA larga.

  4. Signales de compra: ALMA rápido cruza por encima de ALMA lento y el filtro de volumen pasa.

  5. Signo de venta: ALMA rápido cruza bajo ALMA lento.

  6. Señal corto: ALMA rápido cruza por debajo de ALMA lento y el filtro de volumen pasa.

  7. Signo de cobertura: ALMA rápido cruza por encima de ALMA lento.

La estrategia combina tendencia, impulso y análisis de volumen para señales robustas.

Ventajas

En comparación con las estrategias tradicionales de media móvil, las principales ventajas son:

  1. ALMA reduce el retraso y mejora la calidad de la señal.

  2. El filtro de volumen evita las pérdidas por fallas.

  3. El combo rápido/lento mide la dirección de la tendencia.

  4. Reglas simples e intuitivas, fáciles de implementar.

  5. Ajuste flexible de los parámetros de la OA para los diferentes mercados.

  6. Gestión razonable del riesgo.

  7. Potencial de optimización adicional mediante ajuste de parámetros.

  8. En general, mejor estabilidad y calidad en comparación con las estrategias tradicionales de cruce.

Los riesgos

A pesar de los méritos, hay que tener en cuenta los siguientes riesgos:

  1. Los sistemas cruzados son intrínsecamente vulnerables a las flechas.

  2. El rendimiento de ALMA depende del ajuste de parámetros.

  3. Los picos de volumen pueden engañar la generación de señales.

  4. Siempre hay un poco de retraso, no se pueden evitar todas las pérdidas.

  5. Riesgo de sobreajuste por optimización excesiva.

  6. Las señales fallan cuando el volumen es anormal.

  7. Las técnicas de aprendizaje automático pueden generar mejores resultados.

  8. Vigilar la relación beneficio/riesgo para evitar extracciones excesivas.

Mejoramiento

Para hacer frente a los riesgos, se pueden mejorar las siguientes áreas:

  1. Optimice los parámetros de ALMA para una mejor sensibilidad.

  2. Experimenta con diferentes métricas de volumen.

  3. Introducir el stop loss para controlar la pérdida por operación.

  4. Incorporar otros indicadores para señales sólidas.

  5. Agregue el módulo de aprendizaje automático para un ajuste más inteligente de la señal.

  6. Despliegue en múltiples productos para la diversificación de la estrategia.

  7. Optimizar los modelos de posicionamiento para diferentes mercados.

  8. Investiga la robustez para evitar el sobreajuste.

Conclusión

En conclusión, en comparación con las estrategias de cruce tradicionales, esta estrategia mejora la calidad y robustez de la señal a través del algoritmo ALMA y el filtro de volumen.


/*backtest
start: 2022-09-16 00:00:00
end: 2023-09-22 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

// This source code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/
// © Sarahann999
// Calculations for TP/SL based off: https://kodify.net/tradingview/orders/percentage-profit/
//@version=5
strategy("ALMA Cross", overlay=true)

//User Inputs
src= (close)
long_entry = input(true, title='Long Entry')
short_entry = input(true, title='Short Entry')

//Fast Settings
ALMA1 = input(100, "ALMA Lenghth 1", group= "ALMA Fast Length Settings")
alma_offset = input.float(defval=0.85, title='Arnaud Legoux (ALMA) - Offset Value', minval=0, step=0.01)
alma_sigma = input.int(defval=6, title='Arnaud Legoux (ALMA) - Sigma Value', minval=0)
Alma1 = ta.alma(src, ALMA1, alma_offset, alma_sigma)

//Slow Settings
ALMA2 = input(120, "ALMA Length 2", group = "ALMA Slow Length Settings")
alma_offset2 = input.float(defval=0.85, title='Arnaud Legoux (ALMA) - Offset Value', minval=0, step=0.01)
alma_sigma2 = input.int(defval=6, title='Arnaud Legoux (ALMA) - Sigma Value', minval=0)
Alma2 = ta.alma(src, ALMA2, alma_offset2, alma_sigma2)

//Volume
var cumVol = 0.
cumVol += nz(volume)
if barstate.islast and cumVol == 0
    runtime.error("No volume is provided by the data vendor.")
shortlen = input.int(5, minval=1, title = "Short Length", group= "Volume Settings")
longlen = input.int(10, minval=1, title = "Long Length")
short = ta.ema(volume, shortlen)
long = ta.ema(volume, longlen)
osc = 100 * (short - long) / long

//Define Cross Conditions
buy = ta.crossover(Alma1, Alma2)
sell = ta.crossunder(Alma1, Alma2)

//Calculate Take Profit Percentage
longProfitPerc = input.float(title="Long Take Profit", group='Take Profit Percentage',
     minval=0.0, step=0.1, defval=2) / 100
shortProfitPerc = input.float(title="Short Take Profit",
     minval=0.0, step=0.1, defval=2) / 100
     
// Figure out take profit price 1
longExitPrice  = strategy.position_avg_price * (1 + longProfitPerc)
shortExitPrice = strategy.position_avg_price * (1 - shortProfitPerc)

// Make inputs that set the stop %  1
longStopPerc = input.float(title="Long Stop Loss", group='Stop Percentage',
     minval=0.0, step=0.1, defval=2.5) / 100
shortStopPerc = input.float(title="Short Stop Loss",
     minval=0.0, step=0.1, defval=2.5) / 100

// Figure Out Stop Price
longStopPrice  = strategy.position_avg_price * (1 - longStopPerc)
shortStopPrice = strategy.position_avg_price * (1 + shortStopPerc)

//Define Conditions
buySignal = buy and osc > 0
     and strategy.position_size == 0

//sellSignal 
sellSignal = sell and osc > 0
     and strategy.position_size == 0

// Submit entry orders
if buySignal and long_entry
    strategy.entry(id="Long", direction=strategy.long, alert_message="Enter Long")
    alert(message="BUY Trade Entry Alert", freq=alert.freq_once_per_bar)
    
if sellSignal and short_entry
    strategy.entry(id="Short", direction=strategy.short, alert_message="Enter Short")
    alert(message="SELL Trade Entry Alert", freq=alert.freq_once_per_bar)
    
// Submit exit orders based on take profit price
if (strategy.position_size > 0)
    strategy.exit(id="Long TP/SL", limit=longExitPrice, stop=longStopPrice, alert_message="Long Exit 1 at {{close}}")
if (strategy.position_size < 0)
    strategy.exit(id="Short TP/SL", limit=shortExitPrice, stop=shortStopPrice, alert_message="Short Exit 1 at {{close}}")

//Draw
plot(Alma1,"Alma Fast", color=color.purple, style=plot.style_circles)
plot(Alma2,"Alma Slow", color=#acb5c2, style=plot.style_circles)

Más.