
La estrategia de comercio de fuerza de presión bidireccional es una estrategia de seguimiento de tendencias que combina indicadores aleatorios y indicadores de volumen de transacción. La estrategia utiliza principalmente las líneas K y D de los indicadores aleatorios y los indicadores de volumen de transacción para generar señales de compra y venta, complementadas con la línea de oro y la línea de muerte para generar señales adicionales.
La principal lógica de activación de las señales de compra es:
La línea K y la línea D rompen simultáneamente la zona de sobreventa (por ejemplo, 20) y producen un cruce ascendente, y la línea K y la línea D están simultáneamente en una tendencia alcista
El volumen de transacciones es superior a un determinado umbral (por ejemplo, 1.4 veces el volumen de transacciones promedio)
El precio de cierre es más alto que el precio de apertura (línea K en blanco)
Las señales de compra adicionales podrían venir de:
Fork de oro de línea media: cruza la línea EMA lenta en la línea EMA rápida, y las dos líneas medias suben al mismo tiempo
La línea K y la línea D entran simultáneamente en la zona de sobreventa desde los bajos (por ejemplo, suben desde debajo de 20 hasta el rango de 20 a 80)
La principal lógica de activación de las señales de venta es la siguiente:
Las líneas K y D entran simultáneamente en zonas de sobreventa (por ejemplo, 80)
La línea media de la horquilla muerta: la línea rápida de la EMA bajo la línea lenta de la EMA
La línea K pasa por debajo de la línea D, y la línea K y la línea D están en una tendencia descendente al mismo tiempo
Establezca un porcentaje del precio de compra (por ejemplo, el 6%) como una línea de stop-loss que, si el precio cae por debajo de esa línea, desencadena una venta de stop-loss.
Un solo indicador aleatorio puede generar una gran cantidad de señales falsas. La estrategia utiliza una combinación de indicadores aleatorios dobles (línea K y línea D (la media móvil de la línea K) para filtrar eficazmente las señales falsas y garantizar la fiabilidad de la señal.
Se añade la condición de volumen de transacción como criterio de evaluación auxiliar, que requiere que el volumen de transacción supere un cierto nivel, para filtrar la cantidad baja de puntos de compra y venta no tendenciales y reducir el riesgo de estar sujeto a la posición.
La estrategia combina múltiples señales de compra y venta de indicadores aleatorios, de volumen de transacción y de línea media, que necesitan ser activadas simultáneamente para generar una señal de negociación real. La superposición de varios indicadores puede mejorar la fiabilidad de la señal.
Añadir reglas de mediano de juicio, por ejemplo, sólo se considera una señal de compra cuando la mediana de la línea rápida y lenta al mismo tiempo sube. Esto puede evitar la contratiempo de compra o repunte, a partir de grandes períodos de tiempo para juzgar la tendencia.
La estrategia incluye un diseño de señales de stop loss, que se detiene automáticamente si el precio cae por debajo de una cierta proporción de la compra. Esto permite controlar eficazmente la pérdida máxima de una sola operación.
La estrategia incluye varios parámetros, como el parámetro de índice aleatorio, el parámetro de media, el parámetro de la cantidad de entrega, etc. Estos parámetros necesitan ser optimizados para diferentes variedades, y el ajuste incorrecto puede causar resultados poco atractivos.
Al establecer un punto de parada, se debe tener en cuenta la posibilidad de que el precio salte. Si el punto de parada está demasiado cerca del precio de compra, el salto puede causar una parada innecesaria.
En el caso de variedades de baja movilidad, la regla de volumen de apareamiento puede filtrar el exceso de señales. En este caso, es necesario reducir los límites de las condiciones de volumen de apareamiento.
Puede haber problemas de inconsistencia de secuencia entre diferentes indicadores de ciclo, lo que puede afectar la precisión de la señal. Se necesita verificar la consistencia de la secuencia de puntos de la señal.
La estrategia puede ser optimizada en los siguientes aspectos:
Parámetros optimizados para mejorar la estabilidad
Añadir un parámetro de ajuste dinámico para el método de aprendizaje automático
Optimización de las estrategias de detención de pérdidas para reducir la tasa de detención
Añadir más condiciones de filtrado para reducir el número de transacciones
Prueba estrategias de unidad condicional o suspensión para aumentar la rentabilidad
Se pueden optimizar los parámetros principales a través de métodos más sistemáticos, como los algoritmos genéticos, para asegurar que los parámetros obtengan un rendimiento estable en diferentes ciclos de mercado.
Se puede entrenar a los modelos para evaluar el estado del mercado en tiempo real y ajustar los parámetros de la estrategia de acuerdo con esto, para lograr la optimización dinámica de los parámetros.
Se pueden estudiar mejores estrategias de stop loss para reducir los stop loses innecesarios y aumentar el margen de ganancias, mientras se mantiene el control del riesgo.
El aumento de las condiciones de filtración adecuado para reducir el número de transacciones, reducir el impacto de los costos de transacción, y hacer que el retorno de cada transacción sea más alto.
Se puede diseñar una estrategia de parada móvil o una estrategia de parada única, de acuerdo con las características del mercado, para cerrar posiciones de estabilidad al tiempo que se garantiza el alto en las pérdidas y se maximiza la ganancia.
La estrategia tiene en cuenta varios aspectos, como el juicio de tendencias, el control de riesgos y la frecuencia de las operaciones. La ventaja central es que los indicadores de doble aleatoriedad se combinan con el juicio de tendencias de los indicadores de la transacción y el control de riesgos. El mecanismo de parada de pérdidas puede optimizarse a continuación para mejorar la estabilidad de los parámetros, ajustar los parámetros dinámicamente y reducir la parada de pérdidas, por ejemplo, para que la estrategia obtenga ganancias estables en más entornos 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)