Esta estrategia utiliza una curva de doble coincidencia con los puntos altos y bajos de la línea K para formar una señal de negociación. Cuando el precio real rompe la curva de coincidencia, genera una señal de compra y venta. La estrategia trata de usar un modelo matemático para identificar los soportes y resistencias clave y realizar una operación de ruptura.
Los principales componentes y reglas de la estrategia son los siguientes:
Aplicación de los puntos altos y bajos: Aplicación de los puntos altos y bajos de la línea K utilizando el bímetro mínimo de la curva secundaria.
Se produce una señal de compra cuando el precio de cierre de la línea K rompe la curva de la subida.
Se produce una señal de venta cuando el precio de cierre de la línea K se rompe en la curva de baja trazada.
Verificación de N ciclos: requiere que la ruptura se mantenga durante N ciclos para que se produzca, evitando falsas rupturas.
Señales de posición baja: no hay señales claras de posición baja, se determina el tiempo de mantenimiento de la posición mediante la optimización de la retroalimentación.
La estrategia trata de identificar precios clave a través de modelos matemáticos y entrar en juego en el momento de una ruptura, lo cual es típico de un sistema de ruptura.
Las principales ventajas de esta estrategia en comparación con otros sistemas innovadores son:
El uso de modelos matemáticos para la adecuación es más objetiva que subjetiva.
La tecnología de negociación se ha combinado con modelos estadísticos, lo cual es novedoso.
Introducción de la verificación de múltiples ciclos para filtrar las brechas falsas.
La optimización de la retroalimentación permite encontrar el mejor tiempo de mantenimiento de la posición.
No es muy difícil de implementar y se puede ajustar con flexibilidad.
El modelo se actualiza automáticamente sin necesidad de mantenimiento manual.
Se puede comprobar la robustez de los parámetros de diferentes variedades y ciclos.
Se puede introducir aprendizaje automático para una mayor optimización y verificación.
En general, el nivel de novedad es alto y vale la pena explorar.
Sin embargo, la estrategia también tiene los siguientes riesgos:
El efecto de ajuste depende de la elección de los parámetros y puede ser sobre optimizado.
El retraso en la curva de ajuste no puede evitar completamente las pérdidas.
Sin tomar en cuenta el volumen de transacciones, existe el riesgo de que se produzca un “sovestimiento”.
El arbitraje estadístico es difícil de mantener estable a largo plazo.
El ciclo de respuesta es corto y se necesita verificar la solidez del modelo.
La adaptabilidad de varias variedades al medio ambiente está pendiente de prueba.
Las posiciones fijas no se pueden ajustar dinámicamente.
Se debe evaluar rigurosamente el porcentaje de retiro de ganancias.
De acuerdo con el análisis anterior, la estrategia puede mejorar en los siguientes aspectos:
La robustez de los parámetros de prueba en diferentes entornos de mercado.
Se incluyen los indicadores de verificación de volumen de transacciones.
Optimización de la lógica de salida y entrada para mejorar la calidad de la señal.
Creación de un modelo de gestión de posiciones dinámicas.
Introducir una estrategia de stop loss para limitar las pérdidas.
Optimización de las estrategias de gestión de fondos.
Verificación de la ventana de retroceso
Evaluación de la capacidad de estabilidad de rendimiento de varias variedades.
El modelo se optimiza mediante el aprendizaje automático.
En general, la estrategia tiene cierto valor innovador y experimental. Sin embargo, la estabilidad de las ganancias de Statistical Arbitrage a largo plazo aún se enfrenta a pruebas.
/*backtest
start: 2023-08-23 00:00:00
end: 2023-09-22 00:00:00
period: 1h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/
//@version=4
//
// ▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒ //
strategy(title = " Strategy Quadratic Semaphore ",
shorttitle = "SQS",
overlay = true,
precision = 8,
calc_on_order_fills = true,
calc_on_every_tick = true,
backtest_fill_limits_assumption = 0,
default_qty_type = strategy.fixed,
default_qty_value = 2,
initial_capital = 10000,
pyramiding=5,
currency = currency.USD,
linktoseries = true)
//
// ▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒ //
backTestSectionFrom = input(title = "═══════════════ From ═══════════════", defval = true, type = input.bool)
FromMonth = input(defval = 1, title = "Month", minval = 1)
FromDay = input(defval = 1, title = "Day", minval = 1)
FromYear = input(defval = 2019, title = "Year", minval = 2014)
backTestSectionTo = input(title = "════════════════ To ════════════════", defval = true, type = input.bool)
ToMonth = input(defval = 31, title = "Month", minval = 1)
ToDay = input(defval = 12, title = "Day", minval = 1)
ToYear = input(defval = 9999, title = "Year", minval = 2014)
Config = input(title = "══════════════ Config ══════════════", defval = true, type = input.bool)
p = input(6)
length = input(30)
//
backTestPeriod() => (time > timestamp(FromYear, FromMonth, FromDay, 00, 00)) and (time < timestamp(ToYear, ToMonth, ToDay, 23, 59))
//
//
// ▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒ //
x1 = bar_index
x2 = sqrt(x1)
y = high
//
S11 = sum(x2,length) - sqrt(sum(x1,length)) / length
S12 = sum(x1*x2,length) - (sum(x1,length) * sum(x2,length)) / length
S22 = sum(sqrt(x2),length) - sqrt(sum(x2,length)) / length
Sy1 = sum (y*x1,length) - (sum(y,length) * sum(x1,length)) / length
Sy2 = sum (y*x2,length) - (sum(y,length) * sum(x2,length)) / length
//
max1 = sma(x1,length)
max2 = sma(x2,length)
may = sma(y,length)
b2 = ((Sy1 * S22) - (Sy2*S12))/(S22*S11 - sqrt(S12))
b3 = ((Sy2 * S11) - (Sy1 * S12))/(S22 * S11 - sqrt(S12))
b1 = may - b2*max1 - b3*max2
qr = b1 + b2*x1 + b3*x2
//
yl = low
//
Sy1l = sum(yl*x1,length) - (sum(yl,length) * sum(x1,length)) / length
Sy2l = sum(yl*x2,length) - (sum(yl,length) * sum(x2,length)) / length
//
mayl = sma(yl,length)
b2l = ((Sy1l * S22) - (Sy2l*S12))/(S22*S11 - sqrt(S12))
b3l = ((Sy2l * S11) - (Sy1l * S12))/(S22 * S11 - sqrt(S12))
b1l = mayl - b2l*max1 - b3l*max2
qrl = b1l + b2l*x1 + b3l*x2
//
period = round(p/2)+1
hh = qr[period]
ll = qrl[period]
countH = 0
countL = 0
buy=0
sell=0
//
for i = 1 to period-1
if qr[i]<hh
countH:=countH+1
if qrl[i]>ll
countL:=countL+1
for i = period+1 to p+1
if qr[i]<hh
countH:=countH+1
if qrl[i]>ll
countL:=countL+1
if countH==p
pivotH = high[period]
buy := 1
if countL==p
pivotL = low[period]
sell := 1
//
plotshape(buy == 1 , text='💣', style=shape.arrowup, location=location.belowbar, color=#32CD32, textcolor=color.white, offset=0, transp=0,size=size.auto)
plotshape(sell == 1 , text='🔨', style=shape.arrowdown, location=location.abovebar, color=#FF0000, textcolor=color.white, offset=0, transp=0,size=size.auto)
//
if (backTestPeriod())
strategy.entry("long", true, 1, when = buy == 1)
strategy.entry("short", false, 1, when = sell == 1)