Estrategia de negociación de múltiples plazos de P-Signal

El autor:¿ Qué pasa?, Fecha: 2023-11-28 16:32:36
Las etiquetas:

img

Resumen general

La estrategia de negociación de múltiples plazos de P-Signal es una estrategia de negociación algorítmica de criptomonedas basada en principios estadísticos y análisis de múltiples plazos de tiempo. La estrategia utiliza la función de error de Gauss y el indicador de P-Signal para modelar los gráficos diarios, semanales y mensuales de Bitcoin, y va largo en cruces de indicadores por encima de 0 y sale en cruces por debajo de 0, con el fin de negociar la volatilidad.

Estrategia lógica

El indicador central de la estrategia de señal P es la señal P en sí misma, que combina la desviación estándar estadística y la media móvil simple y la asigna al rango de -1 a 1 utilizando la función de error de Gauss, para detectar si el mercado se ajusta a la distribución normal.

fErf(x) = 1.0 - 1.0/(1.0 + 0.5*abs(x)) * exp(-x*x - 1.26551223 + ...) # Gaussian error function 

fPSignal(ser, n) = fErf((stdev(ser, n) > 0 ? sma(ser, n)/stdev(ser, n)/sqrt(2) : 1)) # P-Signal indicator

La estrategia calcula el indicador de P-Signal en los marcos de tiempo diarios, semanales y mensuales para Bitcoin, va largo cuando el indicador cruza por encima de 0, y sale cuando vuelve a cruzar por debajo de 0.

Análisis de ventajas

La mayor ventaja de la estrategia P-Signal es el uso de múltiples marcos de tiempo para mejorar la estabilidad de la estrategia. El gráfico diario captura las fluctuaciones del mercado a corto plazo, mientras que los gráficos semanales y mensuales filtran las fallas.

En comparación con un solo marco de tiempo, múltiples marcos de tiempo permiten el uso de paradas diarias para controlar la caída durante los tiempos volátiles, al tiempo que reducen la frecuencia de transacciones utilizando los marcos de tiempo más altos durante los mercados variados.

Análisis de riesgos

El mayor riesgo de la estrategia de P-Signal es que el indicador en sí es una caja negra para los operadores de cantidad. No tenemos manera de determinar la adaptabilidad de este indicador a mercados específicos, ni podemos determinar el rango óptimo de sus parámetros. Esto puede conducir a un mal rendimiento de la estrategia en el comercio en vivo.

Además, la estrategia en sí tiene algunas limitaciones. Por ejemplo, la incapacidad de manejar movimientos violentos, la demora de la señal del cruce de indicadores, etc. Todos estos pueden convertirse en problemas ocultos durante el comercio en vivo.

Para resolver estos problemas, podemos ajustar los parámetros del indicador, optimizar el stop loss, introducir más indicadores auxiliares, etc. Pero la premisa es probar la estabilidad a través de períodos de backtesting lo suficientemente grandes.

Direcciones de optimización

Hay varias direcciones para optimizar la estrategia de P-Signal:

  1. Cambiar los parámetros del indicador de señal P: nIntr_D, nIntr_W y nIntr_M, encontrar las combinaciones óptimas de parámetros

  2. Añadir los métodos de stop loss: trailing stop loss, tiempo stop loss, ATR stop loss, etc., encontrar la pérdida de stop óptima

  3. Introducir indicadores auxiliares: mejorar el juicio de las condiciones específicas del mercado, por ejemplo, utilizar el MACD para determinar las tendencias

  4. Optimizar el tamaño de la posición: establecer el tamaño de la posición dinámica basado en la eficiencia de uso de la cuenta

  5. Optimización del aprendizaje automático: utilizar redes neuronales, algoritmos genéticos para encontrar parámetros óptimos a nivel mundial

Conclusión

La estrategia de negociación de múltiples marcos de tiempo de P-Signal es en general una idea de estrategia muy prometedora. Combina principios estadísticos e indicadores técnicos, y utiliza el análisis de múltiples marcos de tiempo para mejorar la estabilidad. Si podemos resolver algunas limitaciones a través de una extensa backtesting y optimización, es completamente posible transformarla en una estrategia de negociación algorítmica de criptomonedas real y utilizable.


/*backtest
start: 2022-11-21 00:00:00
end: 2023-11-27 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/
// P-Signal Strategy © Kharevsky
// A good strategy should be able to handle backtesting.
// @version=4
// **********************************************************************************************************
strategy("P-Signal Strategy:", precision = 3, pyramiding = 3)
//
// Parameters and const of P-Signal.
//
nPoints_D = input(title = "Number of D Bars", type = input.integer, defval = 9, minval = 4, maxval = 100, group = "Parameters of observation.")
nPoints_W = input(title = "Number of W Bars", type = input.integer, defval = 4, minval = 4, maxval = 100, group = "Parameters of observation.")
nPoints_M = input(title = "Number of M Bars", type = input.integer, defval = 6, minval = 4, maxval = 100, group = "Parameters of observation.")
int nIntr_D = nPoints_D - 1
int nIntr_W = nPoints_W - 1
int nIntr_M = nPoints_M - 1
bool bDValveOpen = true
bool bWValveOpen = true
bool bMValveOpen = true
// 
// Horner's method for the error (Gauss) & P-Signal functions.
//
fErf(x) =>
    nT = 1.0/(1.0 + 0.5*abs(x))
    nAns = 1.0 - nT*exp(-x*x - 1.26551223 + 
     nT*( 1.00002368 + nT*( 0.37409196 + nT*( 0.09678418 + 
     nT*(-0.18628806 + nT*( 0.27886807 + nT*(-1.13520398 + 
     nT*( 1.48851587 + nT*(-0.82215223 + nT*( 0.17087277 ))))))))))
    x >= 0 ? nAns : -nAns
fPSignal(ser, int) => 
    nStDev = stdev(ser, int)
    nSma = sma(ser, int)
    fErf(nStDev > 0 ? nSma/nStDev/sqrt(2) : 1.0)
//
// Signals for the strategy.
//
float nPSignal_D = sma(fPSignal(change(ohlc4), nIntr_D), nIntr_D)
float ndPSignal_D = sign(nPSignal_D[0] - nPSignal_D[1])
//
float nPSignal_W = sma(security(syminfo.tickerid, "W",fPSignal(change(ohlc4), nIntr_W)), nIntr_W)
float ndPSignal_W = sign(nPSignal_W[0] - nPSignal_W[1])
//
float nPSignal_M = sma(security(syminfo.tickerid, "M",fPSignal(change(ohlc4), nIntr_M)), nIntr_M)
float ndPSignal_M = sign(nPSignal_M[0] - nPSignal_M[1])
//
// P-Signal plotting. 
//
hline(+1.0, color = color.new(color.orange,70), linestyle = hline.style_dotted)
hline(-1.0, color = color.new(color.orange,70), linestyle = hline.style_dotted)
plot(nPSignal_D, color = color.blue, style = plot.style_line)
//
// Multi Frame Strategy 
// ... Day
if(nPSignal_D < 0 and ndPSignal_D > 0 and bDValveOpen)
    strategy.entry("long_D", strategy.long, 1) 
    bDValveOpen := false
if(nPSignal_D > 0 and ndPSignal_D < 0)
    strategy.close("long_D")
    bDValveOpen := true
// ... Week
if(nPSignal_W < 0 and ndPSignal_W > 0 and bWValveOpen)
    strategy.entry("long_W", strategy.long, 1) 
    bWValveOpen := false
if(nPSignal_W > 0 and ndPSignal_W < 0)
    strategy.close("long_W")
    bWValveOpen := true
// ... Month
if(nPSignal_M < 0 and ndPSignal_M > 0 and bMValveOpen)
    strategy.entry("long_M", strategy.long, 1) 
    bMValveOpen := false
if(nPSignal_M > 0 and ndPSignal_M < 0)
    strategy.close("long_M")
    bMValveOpen := true
// The end.

Más.