
P-Signal 다중 시간 프레임 거래 전략은 통계적 원리에 기반하여 다중 시간 프레임 분석과 결합된 디지털 통화 알고리즘 거래 전략이다. 이 전략은 가우스 오류 함수와 P-Signal 지표를 사용하여 비트코인의 일선, 주선 및 달선에 대한 모델 피트를 수행하고, 지표 골드 포크에 따라 더 많은 것을 하고, 데드 포크가 빈 것을 하고, 변동률 거래를 실현한다.
P-Signal 전략의 핵심 지표는 P-Signal이며, 통계적 표준 차와 간단한 이동 평균을 결합하여 가우스 오류 함수 (Gauss error function) 를 통해 -1에서 1의 범위로 매핑하여 시장이 정형 분포에 부합하는지 검출합니다. 구체적인 계산 공식은 다음과 같습니다.
fErf(x) = 1.0 - 1.0/(1.0 + 0.5*abs(x)) * exp(-x*x - 1.26551223 + ...) # 高斯误差函数
fPSignal(ser, n) = fErf((stdev(ser, n) > 0 ? sma(ser, n)/stdev(ser, n)/sqrt(2) : 1)) # P-Signal指标
이 전략은 일선, 둘선, 달선 시간 프레임에 따라 각각 P-Signal 지표를 계산하고, 지표 위 0축을 통과할 때 더하고, 0축을 통과할 때 평소한다. 동시에 지표 값 밸브 제어 반복 개설한다.
P-Signal 전략의 가장 큰 장점은 다중 시간 프레임을 사용하여 전략의 안정성을 높이는 것입니다. 일일선은 시장의 단기 변동성을 포착하고 주 월선은 필터링 할 때 돌파를 돌파합니다. 또한, P-Signal 지표는 자체적으로 약간의 예측 능력을 가지고 있으며, 추세적 행동의 변동성을 확대 할 수 있습니다.
단일 시간 프레임에 비해, 다중 시간 프레임은 철회할 때 일선 상쇄를 활용할 수 있고, 격동적인 상황에서는 고급 시간 프레임을 활용하여 거래 빈도를 줄일 수 있다. 전체적으로, 이 조합은 수익성을 보장하면서 절대적 및 상대적 철수를 최소화할 수 있다.
P-Signal 전략의 가장 큰 위험은 지표 자체가 양적 거래자에 대한 블랙 박스라는 것입니다. 특정 시장에 대한 지표의 적합성을 결정하는 것은 어렵고, 매개 변수의 최적화된 범위를 결정하는 것도 어렵습니다. 이것은 실물에서 전략의 부실한 성과를 초래할 수 있습니다.
또한, 전략 자체에도 일정 한계가 있다. 예를 들어, 급격한 시장을 처리할 수 없으며, 지표 차이는 거래 신호로 지연될 수 있다. 이러한 문제들은 실장시장의 숨겨진 위험일 수 있다.
이러한 문제를 해결하기 위해 우리는 지표 변수를 조정할 수 있고, 손실을 막는 방법을 최적화하고, 더 많은 보조 지표를 도입할 수 있습니다. 그러나 충분한 재측정 영역에서 전략의 안정성을 검증해야 합니다.
P-Signal 전략에는 몇 가지 최적화 가능한 방향이 있습니다:
P-Signal 지표의 변수를 교체: nIntr_D, nIntr_W 및 nIntr_M, 최적의 변수 조합을 찾아
손실을 증가시키는 방법: 추적 손실, 시간 손실, ATR 손실 등, 최적의 손실 방법을 찾아
보조 지표를 도입: MACD 판단 트렌드를 도입하는 것과 같은 특정 상황에 대한 판단 능력을 강화하는 전략
포지션 관리를 최적화: 동적 포지션을 설정하고 자금 사용 효율을 최적화
기계 학습 최적화 매개 변수: 신경 네트워크, 유전 알고리즘 등의 매개 변수 전체 최적화를 찾는다.
P-Signal의 다중 시간 프레임 거래 전략은 전체적으로 매우 잠재적인 전략 아이디어입니다. 그것은 통계적 원리와 기술 지표를 결합하여 다중 시간 프레임 분석을 사용하여 안정성을 높입니다. 우리가 많은 리테크와 최적화를 통해 일부 한계를 해결할 수 있다면, 실제로 사용할 수 있는 디지털 통화 알고리즘 거래 전략으로 변환하는 것이 완전히 가능합니다.
/*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.