Estrategia de apretamiento de impulso

El autor:¿ Qué pasa?, Fecha: 2023-11-14 14:04:24
Las etiquetas:

img

Resumen general

La idea principal de esta estrategia es combinar el indicador de impulso de Lazy Bear y el indicador de IFM de Crypto Face para ir largo cuando la tendencia sube y corto cuando la tendencia baja, realizando una estrategia comercial cuantitativa que sigue las tendencias del mercado.

Estrategia lógica

  1. Utilice el indicador de impulso BlueWave de Lazy Bear, que calcula la regresión lineal del precio de cierre frente al máximo máximo de 20 días, el mínimo más bajo y el promedio cercano para determinar la dirección de la tendencia.

  2. Utilice el indicador mejorado de las IFM de Crypto Face, que calcula la suma del cambio de precios y el volumen en los últimos 58 días para determinar el flujo de dinero.

  3. Cuando el BlueWave sobrepasa 0 y la IFM es superior a 0, se genera una señal de compra para abrir una posición larga; cuando el BlueWave sobrepasa 0 y la IFM es inferior a 0, se genera una señal de venta para abrir una posición corta.

  4. Establezca condiciones de stop loss y take profit para seguir la tendencia del mercado para obtener ganancias, controlando los riesgos.

Ventajas

  1. La combinación de dos indicadores puede determinar con mayor precisión la dirección de la tendencia del mercado.

  2. La curva suave de BlueWave evita el sesgo de los valores atípicos, lo que hace que el juicio de la tendencia sea más confiable.

  3. Las IFM pueden determinar el flujo de dinero, evitando las pérdidas por falsas rupturas.

  4. La estrategia tiene pocos parámetros y es fácil de implementar y operar.

  5. Los ajustes flexibles de stop loss y take profit ayudan a controlar los riesgos comerciales.

  6. Las sesiones de negociación se pueden configurar para evitar una volatilidad anormal durante horarios de mercado específicos.

Los riesgos

  1. Una tendencia bajista continua puede dar lugar a posiciones cortas y pérdidas sucesivas.

  2. Las señales falsas pueden llevar a quedar atrapados después de entrar en posiciones.

  3. Las pérdidas de parada de gran tamaño pueden amplificar las pérdidas.

  4. La alta volatilidad puede alcanzar frecuentemente puntos de stop loss.

  5. La optimización inadecuada de los parámetros puede conducir a un mal desempeño de la estrategia.

  6. Las señales comerciales demasiado frecuentes pueden aumentar los costes de transacción y el deslizamiento.

Mejoramiento

  1. Optimizar los parámetros de BlueWave y MFI para señales más estables y confiables.

  2. Incorporar indicadores de tendencia para evitar pérdidas cortas sostenidas.

  3. Ajustar dinámicamente las relaciones stop loss/take profit para reducir la probabilidad de quedar atrapado.

  4. Refine las condiciones de entrada para reducir las señales falsas.

  5. Considere el tamaño de la posición para evitar perseguir los rallies y los descensos.

  6. Combinar con modelos de aprendizaje automático para puntos de entrada y salida más precisos.

Conclusión

Esta estrategia combina los indicadores BlueWave y MFI para determinar la dirección de la tendencia, yendo largo en tendencias alcistas y corto en tendencias bajistas, siguiendo efectivamente las tendencias del mercado para obtener ganancias. Sin embargo, existen riesgos en la configuración de parámetros, stop loss / take profit, tendencias bajistas sostenidas, etc., que requieren una mayor optimización en el ajuste de parámetros, mecanismos de stop loss, condiciones de filtro, etc. para mejorar el rendimiento y la robustez de la estrategia.


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

// @version=4
// This source code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/
// © Bunghole 2021
strategy(title="Crypto Squeeze Strategy", initial_capital = 100000, default_qty_type = strategy.percent_of_equity, default_qty_value = 100, pyramiding = 0, currency = 'USD', overlay=true)

//// Stoploss and Take Profit Parameters
// Enable Long Strategy
enable_long_strategy = input(true, title="Enable Long Strategy", group="SL/TP For Long Strategy",inline="1")
long_stoploss_value = input(defval=50, title='Stoploss %', type=input.float, minval=0.1, group="SL/TP For Long Strategy",inline="2")
long_stoploss_percentage = (close * (long_stoploss_value / 100)) / syminfo.mintick
long_takeprofit_value = input(defval=50, title='Take Profit %', type=input.float, minval=0.1, group="SL/TP For Long Strategy",inline="2")
long_takeprofit_percentage = (close * (long_takeprofit_value / 100)) / syminfo.mintick

// Enable Short Strategy
enable_short_strategy = input(true, title="Enable Short Strategy", group="SL/TP For Short Strategy",inline="3")
short_stoploss_value = input(defval=50, title='Stoploss %', type=input.float, minval=0.1, group= "SL/TP For Short Strategy",inline="4")
short_stoploss_percentage = (close * (short_stoploss_value / 100)) / syminfo.mintick
short_takeprofit_value = input(defval=50, title='Take Profit %', type=input.float, minval=0.1, group="SL/TP For Short Strategy",inline="4")
short_takeprofit_percentage = (close * (short_takeprofit_value / 100)) / syminfo.mintick

// Plot Stoploss & Take Profit Levels
long_stoploss_price = strategy.position_avg_price * (1 - long_stoploss_value/100)
long_takeprofit_price = strategy.position_avg_price * (1 + long_takeprofit_value/100)
short_stoploss_price = strategy.position_avg_price * (1 + short_stoploss_value/100)
short_takeprofit_price = strategy.position_avg_price * (1 - short_takeprofit_value/100)
plot(enable_long_strategy and not enable_short_strategy ? long_stoploss_price: na, color=#ff0000, style=plot.style_linebr, linewidth=2, title="Long SL Level")
plot(enable_long_strategy and not enable_short_strategy ? long_takeprofit_price: na, color=#008000, style=plot.style_linebr, linewidth=2, title="Long TP Level")
plot(enable_short_strategy and not enable_long_strategy ? short_stoploss_price: na, color=#ff0000, style=plot.style_linebr, linewidth=2, title="Short SL Level")
plot(enable_short_strategy and not enable_long_strategy ? short_takeprofit_price: na, color=#008000, style=plot.style_linebr, linewidth=2, title="Short TP Level")

// Date Range
start_date = input(title="Start Date", type=input.integer, defval=1, minval=1, maxval=31, group="Date Range")
start_month = input(title="Start Month", type=input.integer, defval=1, minval=1, maxval=12, group="Date Range")
start_year = input(title="Start Year", type=input.integer, defval=1804, minval=1800, maxval=3000, group="Date Range")
end_date = input(title="End Date", type=input.integer, defval=1, minval=1, maxval=3, group="Date Range")
end_month = input(title="End Month", type=input.integer, defval=1, minval=1, maxval=12, group="Date Range")
end_year = input(title="End Year", type=input.integer, defval=2077, minval=1800, maxval=3000, group="Date Range")
in_date_range = (time >= timestamp(syminfo.timezone, start_year, start_month, start_date, 0, 0)) and (time < timestamp(syminfo.timezone, end_year, end_month, end_date, 0, 0))


//// Indicator Inputs
// Lazy Bear's Momentum Indicator
BlueWave = linreg(close - avg(avg(highest(high, 20), lowest(low, 20)), sma(close, 20)), 20, 0)

// Replicated version of Crypto Face's MFI Indicator
mfiUpper = sum(volume * (change(hlc3) <= 0 ? 0 : hlc3), 58)
mfiLower = sum(volume * (change(hlc3) >= 0 ? 0 : hlc3), 58)
_mfiRsi(mfiUpper, mfiLower) =>
    if mfiLower == 0
        100
    if mfiUpper == 0
        0
	100.0 - (100.0 / (1.0 + mfiUpper / mfiLower))

mf = _mfiRsi(mfiUpper, mfiLower)
mfi = (mf - 50) * 3


//// Strategy
// Creating Long and Short Strategy
buy_signal = crossover(BlueWave, 0) and mfi > 0 
sell_signal = crossunder(BlueWave, 0) and mfi < 0 

// Long Strategy
if buy_signal and in_date_range and enable_long_strategy == true
    strategy.entry("Long", true, when=buy_signal, alert_message="Open Long Position")
    strategy.exit("Long  SL/TP", from_entry="Long", loss=long_stoploss_percentage, profit=long_takeprofit_percentage, alert_message="Your Long SL/TP Limit As Been Triggered.")
    strategy.close("Long", when=sell_signal, alert_message="Close Long Position")

// Short Strategy
if sell_signal and in_date_range and enable_short_strategy == true
    strategy.entry("Short", false, when = sell_signal, alert_message="Open Short Position")
    strategy.exit("Short SL/TP", from_entry="Short", loss=short_stoploss_percentage, profit=short_takeprofit_percentage, alert_message="Your Short SL/TP Limit As Been Triggered.")
    strategy.close("Short", when=buy_signal, alert_message="Close Short Position")


Más.