Estrategia de negociación cuantitativa de doble presión

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

img

Resumen general

La estrategia de negociación cuantitativa de doble presión es una estrategia de seguimiento de tendencias que combina indicadores estocásticos y de volumen.

Estrategia lógica

Signales de compra

La principal señal de compra se activa cuando:

  1. Ambas líneas K y D cruzan por debajo del área de sobreventa (por ejemplo 20) y suben, y tanto K como D están aumentando

  2. El volumen está por encima de un umbral (por ejemplo, 1,4 veces el volumen medio)

  3. Cierre es por encima de abierto (lanterna blanca)

Las señales de compra adicionales pueden provenir de:

  1. Cruz de oro: la EMA rápida cruza la EMA lenta, ambas en alza

  2. Tanto K como D se elevan desde la zona baja a la zona media (por ejemplo, desde debajo de 20 a 20-80)

Las señales de venta

Las principales señales de venta se activan cuando:

  1. Tanto K como D entran en el área de sobrecompra (por ejemplo, por encima de 80%)

  2. Cruce de la muerte: la EMA rápida se cruza por debajo de la EMA lenta

  3. K se cruza por debajo de D, y tanto K como D están cayendo

Detener pérdida

Un porcentaje (por ejemplo, un 6%) por debajo del precio de compra se establece como nivel de stop loss.

Análisis de ventajas

  • El doble estocástico evita señales falsas
  • El volumen filtra el ruido y asegura la tendencia
  • Las múltiples señales combinadas mejoran la precisión
  • Las medias móviles favorecen la tendencia general
  • Control del riesgo de pérdida por parada

Ventaja 1: El doble estocástico evita señales falsas

La combinación estocástica dual filtra las señales falsas y mejora la confiabilidad.

Ventaja 2: El volumen filtra el ruido y garantiza la tendencia

La condición de volumen filtra los puntos de bajo volumen que no son tendencias y reduce el riesgo de quedar atrapados.

Ventaja 3: Las señales múltiples mejoran la precisión

Varios indicadores deben alinearse para activar señales comerciales reales. Esto mejora la fiabilidad de la señal.

Ventaja 4: Las medias móviles ayudan a la tendencia general

Las reglas como las medias móviles dobles aseguran que las señales se alineen con la tendencia general.

Ventaja 5: Control del riesgo de pérdida por parada

La lógica de stop loss realiza ganancias y controla las pérdidas en operaciones individuales.

Análisis de riesgos

  • Los parámetros necesitan una optimización cuidadosa, la configuración incorrecta conduce a un bajo rendimiento
  • La colocación de stop loss debe tener en cuenta el riesgo de brecha
  • El riesgo de liquidez debe controlarse para los instrumentos de negociación
  • Problema de retroceso entre diferentes marcos de tiempo

Riesgo 1: Los parámetros necesitan una optimización cuidadosa

La estrategia tiene múltiples parámetros que necesitan optimización para diferentes instrumentos, de lo contrario el rendimiento sufre.

Riesgo 2: La colocación de pérdidas de parada debe tener en cuenta el riesgo de brecha

El punto de stop loss debe tener en cuenta los escenarios de diferencia de precios.

Riesgo 3: Seguimiento del riesgo de liquidez

Para los instrumentos no líquidos, las reglas de volumen pueden filtrar demasiadas señales.

Riesgo 4: Problemas de retroceso entre los plazos

Puede ocurrir una desalineación entre las señales en diferentes marcos de tiempo. Las señales deben verificarse para que coincidan.

Oportunidades de mejora

La estrategia puede mejorarse en ámbitos como:

  1. Optimizar los parámetros de robustez

  2. Introducir el aprendizaje automático para los parámetros adaptativos

  3. Mejorar la estrategia de stop loss para reducir la tasa de stop loss

  4. Añadir filtros para reducir la frecuencia de las operaciones

  5. Explorar órdenes condicionales o obtener ganancias para mejorar la recompensa

Oportunidad 1: Optimizar los parámetros de robustez

Métodos como los algoritmos genéticos pueden optimizar sistemáticamente los parámetros para la estabilidad a través de los regímenes de mercado.

Oportunidad 2: Introducir el aprendizaje automático para parámetros adaptativos

Los modelos pueden evaluar las condiciones del mercado y ajustar los parámetros en consecuencia, logrando una optimización dinámica.

Oportunidad 3: Mejorar la estrategia de stop loss para reducir la tasa de stop loss

Los mejores algoritmos de stop loss pueden reducir las paradas innecesarias manteniendo el control del riesgo.

Oportunidad 4: Añadir filtros para reducir la frecuencia del comercio

El fortalecimiento de los filtros puede reducir la frecuencia del comercio, reducir los costos y mejorar los rendimientos por comercio.

Oportunidad 5: Explore órdenes condicionales o obtención de beneficios

De acuerdo con las condiciones del mercado, las órdenes condicionales o las estrategias de obtención de ganancias pueden maximizar mejor las ganancias al tiempo que controlan el riesgo.

Conclusión

La estrategia equilibra la tendencia, el control de riesgos, los costos y otros aspectos. Las principales ventajas son doble estocástico más volumen para la tendencia y stop loss para el control de riesgos. Los próximos pasos son mejorar la robustez, los parámetros adaptativos, la optimización de stop loss, etc. para obtener ganancias constantes en más regímenes de mercado.


/*backtest
start: 2023-10-02 00:00:00
end: 2023-11-01 00:00:00
period: 1h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=3
// SW SVE - Stochastic+Vol+EMAs [Sergio Waldoke]
// Script created by Sergio Waldoke (BETA VERSION v0.5, fine tuning PENDING)
// Stochastic process is the main source of signals, reinforced on buying by Volume. Also by Golden Cross.
// Selling is determined by K and D entering overselling zone or EMA's Death Cross signal, the first occurring,
// and some other signals combined.
// Buy Long when you see a long buy arrow.
// Sell when you see a close arrow.
// This is a version to be tuned and improved, but already showing excelent results after tune some parameters
// according to the kind of market.
// Strategy ready for doing backtests.

// SVE SYSTEM DESIGN:
// Buy Signal Trigger:
// - Both Stoch <= 20 crossing up and both growing and green candle and Vol/sma vol >= 1.40 Avg Vol
//   or
// - Both Stoch growing up and Vol/sma vol >= 1.40 Avg Vol and green candle and
//   both prior Stoch crossing up
//   or
//   [OPTIONAL]: (Bad for BTC 2018, excelent for 2017)
// - Crossingover(fast_ema, slow_ema) and growing(fast_ema) and growing(slow_ema) and green candle

// Exit position:
// - Both Stoch <= 20 and Both Stoch were > 20 during position
//   or
// - CrossingUnder(Fast EMA, Medium EMA)
//   or   [OPTIONAL] (Better for BTC 2018, Worse for BNB 1H)
// - CrossingUnder(k, d) and (k and d starting over over_buying) and (k and d descending) and k crossing down over_buying line

//calc_on_every_tick=true,
//calc_on_order_fills=true,   (affects historical calculation, triggers in middle of the bar, may be better for automatic orders)
strategy("SW SVE - Stochastic+Vol+EMAs [Sergio Waldoke]", shorttitle="SW SVE", overlay=true, max_bars_back=5000,
         default_qty_type=strategy.percent_of_equity, default_qty_value=100, currency="USD",
         commission_type=strategy.commission.percent, commission_value=0.25)

//Strategy Parameters
FromDay   = input(defval = 1, title = "From Day", minval = 1, maxval = 31)
FromMonth = input(defval = 1, title = "From Month", minval = 1, maxval = 12)
FromYear  = input(defval = 2018, title = "From Year", minval = 2009, maxval = 2200)
ToDay     = input(defval = 31, title = "To Day", minval = 1, maxval = 31)
ToMonth   = input(defval = 12, title = "To Month", minval = 1, maxval = 12)
ToYear    = input(defval = 2030, title = "To Year", minval = 2009, maxval = 2200)

//Indicator Parameters
//Original defaults for 4HS: 14, 3, 80, 20,   14, 23, 40,   20, 40,   3:
stoch_k = input(title="Stoch K",  defval=14, minval=1)
stoch_d = input(title="Stoch D",  defval=3, minval=1)
over_buying  = input(title="Stoch Overbuying Zone",  defval=80, minval=0, maxval=100)
over_selling = input(title="Stoch Overselling Zone",  defval=20, minval=0, maxval=100)

fast_ema_periods = input(title="Fast EMA (Death Cross)",  defval=14, minval=1, maxval=600)
slow_ema_periods = input(title="Slow EMA (Death Cross)",  defval=23, minval=1, maxval=600)
trend_ema_periods = input(title="Slowest EMA (Trend Test)",  defval=40, minval=1, maxval=600)

volume_periods = input(title="Volume Periods",  defval=20, minval=1, maxval=600)
volume_factor = input(title="Min Volume/Media Increase (%)",  defval=80, minval=-100) / 100 + 1

threshold_sl_perc = input(title="[Sell Trigger] Stop Loss Threshold %", defval=6.0, type=float, minval=0, maxval=100)

//before_buy = input(title="# Growing Before Buy",  defval=2, minval=1)
//before_sell = input(title="# Decreasing Before Sell",  defval=1, minval=1)
//stepsignal = input(title="Show White Steps", type=bool, defval=true)
//steps_base = input(title="White Steps Base",  defval=242, minval=0)

//Signals
fast_ema = ema(close, fast_ema_periods)
slow_ema = ema(close, slow_ema_periods)
trend_ema = ema(close, trend_ema_periods)
k = stoch(close, high, low, stoch_k)
d = sma(k, stoch_d)
vol_ma = sma(volume, volume_periods)

//REVIEW CONSTANT 1.75:
in_middle_zone(a) => a > over_selling * 1.75 and a < over_buying
growing(a) => a > a[1] 

was_in_middle_zone = k == d
was_in_middle_zone := was_in_middle_zone[1] or in_middle_zone(k) and in_middle_zone(d)

//Buy Signal Trigger:
//- Both Stoch <= 20 crossing up and both growing and 
//  green candle and Vol/sma vol >= 1.40 Avg Vol
buy = k <= over_selling and d <= over_selling and crossover(k, d) and growing(k) and growing(d) and
      close > open and volume/vol_ma >= volume_factor

//or
//- Both Stoch growing up and Vol/sma vol >= 1.40 Avg Vol and green candle and
//  both prior Stoch crossing up
buy := buy or (growing(k) and growing(d) and volume/vol_ma >= volume_factor and close > open and
              crossover(k[1], d[1]) )
//Worse:
//              (crossover(k[1], d[1]) or (crossover(k, d) and k[1] <= over_selling and d[1] <= over_selling) ) )

//or
//  [OPTIONAL]: (Bad for BTC 2018, excelent for 2017)
//- Crossingover(fast_ema, slow_ema) and growing(fast_ema) and growing(slow_ema) and green candle
buy := buy or (crossover(fast_ema, slow_ema) and growing(fast_ema) and growing(slow_ema) and close > open)


//Debug:
//d1 = close > open  ? 400 : 0
//plot(d1+5200, color=white, linewidth = 3, style = stepline)

//Exit position:
//- Both Stoch <= 20 and Both Stoch were > 20 during position
sell = k <= over_selling and d <= over_selling and was_in_middle_zone

//  or
//- CrossingUnder(Fast EMA, Medium EMA)
sell := sell or crossunder(fast_ema, slow_ema)

//  or  [OPTIONAL] (Better for BTC 2018, Worse for BNB 1H)
//- CrossingUnder(k, d) and (k and d starting over over_buying) and (k and d descending) and k crossing down over_buying line
sell := sell or (crossunder(k, d) and k[1] >= over_buying and d[1] >= over_buying and
                 not growing(k) and not growing(d) and k <= over_buying)

color = buy ? green : red

bought_price = close
bought_price := nz(bought_price[1])

already_bought = false
already_bought := nz(already_bought[1], false)

//Date Ranges
buy  := buy and  not already_bought


//d1 = buy ? 400 : 0
//plot(d1+6500, color=white, linewidth = 3, style = stepline)

was_in_middle_zone := (not buy and was_in_middle_zone) or (in_middle_zone(k) and in_middle_zone(d))

already_bought   := already_bought[1] or buy
bought_price := buy ? close * (1 - threshold_sl_perc/100) : bought_price[1]
trigger_SL = close < bought_price[0]
sell := sell or trigger_SL

sell := sell and  
                 already_bought and not buy and (was_in_middle_zone or trigger_SL)

//plot((sell?400:0)+5200, title="Buy-Sell", color=yellow, linewidth = 3, style = stepline)
                 
already_bought   := already_bought[0] and not sell
bought_price := sell ? 0 : bought_price[0]

//plot((was_in_middle_zone?400:0)+5200, title="Buy-Sell", color=yellow, linewidth = 3, style = stepline)

was_in_middle_zone := not sell and was_in_middle_zone

//Plot signals
plot(fast_ema, title="Fast EMA", color=red, linewidth = 4)
plot(slow_ema, title="Slow EMA", color=blue, linewidth = 4)
plot(trend_ema, title="Trend EMA", color=yellow, linewidth = 4)

//Stop Loss
plot(bought_price, color=gray, linewidth=2, style=cross, join=true, title="Stop Loss")

//Y = stepsignal ? lowest(40) : na
//Y = steps_base
//plot(mysignal+Y, title="Steps", color=white, linewidth = 3, style = stepline)
//Unit steps - for debugging
//plot(mysteps+Y, title="Steps2", color=yellow, linewidth = 3, style = stepline)

//Bought or not - for debugging
//plot((already_bought?400:0)+5200, title="Buy-Sell", color=yellow, linewidth = 3, style = stepline)
//plot((sell?400:0)+5200, title="Buy-Sell", color=yellow, linewidth = 3, style = stepline)

plotshape(buy, title="Buy arrows", style=shape.arrowup, location=location.belowbar, color=color, text="Buy", textcolor=color, size=size.huge, transp=30)
plotshape(sell, title="Sell arrows", style=shape.arrowdown, location=location.abovebar, color=color, text="Sell", textcolor=color, size=size.huge, transp=30)

//if n>2000
strategy.entry("buy", strategy.long, when=buy)
strategy.close_all(when=sell)

//plot(strategy.equity, title="Equity", color=white, linewidth = 4, style = line)

//AlertS trigger
//msg = "[SW Magic Signals EMA] BUY/SELL Signal has been triggered." + "(" + tostring(fastema) + ", " + tostring(slowema) + ") on " + tickerid + ", " + period + "."
msg = "SW SVE BUY/SELL Signal has been triggered. (#, #) on EXCH:PAIR, period: #."

alertcondition(buy or sell, title="SW SVE (BUY/SELL SIGNAL)", message=msg)
alertcondition(buy, title="SW SVE (BUY SIGNAL)", message=msg)
alertcondition(sell, title="SW SVE (SELL SIGNAL)", message=msg)


Más.