이 전략은 가격 변화를 측정하기 위해 가우스 오류 함수로 계산된 P-신호 지표에 기반한 양적 거래 전략입니다. P-신호를 사용하여 가격 추세와 입출점의 전환점을 결정합니다.
이 전략의 핵심 지표는 P-신호입니다. P-신호의 계산 공식은:
fPSignal(ser, int) =>
nStDev = stdev(ser, int)
nSma = sma(ser, int)
fErf(nStDev > 0 ? nSma/nStDev/sqrt(2) : 1.0)
여기 ser는 가격 시리즈를 나타내고 int는 nPoints라는 매개 변수를 나타냅니다. 이것은 되돌아볼 바의 수입니다. 이 공식은 세 부분으로 구성됩니다.
전체 공식의 의미는 가격의 이동 평균을 가격의 표준편차로 나누고, 그 다음 표준화를 위해 sqrt(2) 로 나누고, 마지막으로 가우스 오류 함수로 (-1, 1) 범위에 매핑하는 것입니다. 즉, 가격 변동이 평균보다 크다면 P 신호는 1에 가깝습니다. 가격 변동이 평균보다 작다면 P 신호는 -1에 가깝습니다.
이 전략은 P 신호의 값과 그 변화의 기호를 입력 및 출구를 결정하기 위해 사용합니다.
strategy.entry("long", strategy.long, 1, when = nPSignal < 0 and ndPSignal > 0)
strategy.close("long", when = nPSignal > 0 and ndPSignal < 0)
P-신호가 0보다 작고 양으로 바뀌면 긴 위치로 이동합니다. P-신호가 0보다 크고 음으로 바뀌면 포지션을 닫습니다.
이 전략의 장점은 다음과 같습니다.
이 전략에는 몇 가지 위험도 있습니다.
이러한 위험을 줄이기 위해 몇 가지 조치가 고려 될 수 있습니다. 무역 빈도를 줄이기 위해 필터를 추가하고 매개 변수 조합을 최적화하고 거래 비용을 설정하고 실시간 테스트 및 적합한 제품을 선택하십시오.
더 발전할 수 있는 공간이 있습니다.
결론적으로, 이 전략의 핵심 아이디어는 혁신적인, 가우스 함수와 자동 조정 매개 변수를 맞는 가격 분포입니다. 그러나 높은 주파수 거래 전략으로, 특히 높은 주파수 거래 전략으로 라이브 거래에서 안정적인 수익성 이전에 위험 통제 및 매개 변수 조정에 대한 추가 테스트 및 최적화가 필요합니다.
/*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.