Esta estrategia es una estrategia de negociación cuantitativa basada en el indicador P-Signal calculado por función de error de Gauss para medir los cambios de precios.
El indicador central de esta estrategia es la señal P. La fórmula de cálculo de la señal P es:
fPSignal(ser, int) =>
nStDev = stdev(ser, int)
nSma = sma(ser, int)
fErf(nStDev > 0 ? nSma/nStDev/sqrt(2) : 1.0)
Aquí ser representa la serie de precios, int representa el parámetro nPoints, que es el número de barras para mirar hacia atrás.
El significado de toda la fórmula es tomar el promedio móvil del precio dividido por la desviación estándar del precio, luego dividido por sqrt (((2) para la estandarización, y finalmente mapeado al rango (-1, 1) por la función de error de Gauss. Es decir, si la fluctuación del precio es mayor que el promedio, la señal P está cerca de 1; si la fluctuación del precio es menor que el promedio, la señal P está cerca de -1.
La estrategia utiliza el valor de la señal P y el signo de su cambio para determinar entradas y salidas:
strategy.entry("long", strategy.long, 1, when = nPSignal < 0 and ndPSignal > 0)
strategy.close("long", when = nPSignal > 0 and ndPSignal < 0)
Se hace largo cuando la señal P es menor que 0 y cambia a positivo. Cierra la posición cuando la señal P es mayor que 0 y cambia a negativa.
Las ventajas de esta estrategia incluyen:
También hay algunos riesgos con esta estrategia:
Para reducir esos riesgos, se pueden tomar en consideración algunas medidas: añadir filtros para reducir la frecuencia de las operaciones; optimizar la combinación de parámetros y establecer los costes de transacción; realizar pruebas en vivo y elegir productos adecuados.
Hay margen de mejora:
En conclusión, la idea central de esta estrategia es innovadora, la distribución de precios adecuada con función de Gauss y el ajuste automático de parámetros.
/*backtest start: 2023-01-12 00:00:00 end: 2024-01-18 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 // @version=4 // ********************************************************************************************************** strategy("P-Signal Strategy", precision = 3) // Parameters and const of P-Signal. nPoints = input(title = "Number of Bars", type = input.integer, defval = 9, minval = 4, maxval = 100, group = "Parameters of observation.") int nIntr = nPoints - 1 // 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) // Strat. float nPSignal = sma(fPSignal(change(ohlc4), nIntr), nIntr) float ndPSignal = sign(nPSignal[0] - nPSignal[1]) strategy.entry("long", strategy.long, 1, when = nPSignal < 0 and ndPSignal > 0) strategy.close("long", when = nPSignal > 0 and ndPSignal < 0) // 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, color = color.blue, style = plot.style_line) plot(strategy.position_size, color = color.white, style = plot.style_cross) // Alerts. if(strategy.position_size[0] > strategy.position_size[1]) alert("P-Signal strategy opened the long position: " + syminfo.tickerid + " " + timeframe.period, alert.freq_once_per_bar) if(strategy.position_size[0] < strategy.position_size[1]) alert("P-Signal strategy closed the long position: " + syminfo.tickerid + " " + timeframe.period, alert.freq_once_per_bar) // The end.