
P-Signalマルチタイムフレーム取引戦略は,統計学原理に基づく,マルチタイムフレーム分析を組み合わせたデジタル通貨アルゴリズム取引戦略である.この戦略は,高氏誤差関数とP-Signal指標をビットコインの日線,周線,月線にモデルフィットして,指標金叉の多行と死叉の空行に基づいて,波動率取引を実現する.
P-シグナル戦略の核心指標はP-シグナルであり,統計学的標準差と単純な移動平均を組み合わせ,高氏誤差関数によって-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-シグナル戦略の最大のリスクは,指標自体が量化トレーダーにとってブラックボックスであることです.特定の市場への指標の適合度や,そのパラメータの最適化範囲を決定することは困難です.これは,実物での戦略の不良なパフォーマンスを引き起こす可能性があります.
また,戦略自体にも一定の限界がある.例えば,急激な状況に対処できないこと,指標差値が取引信号として遅滞する可能性があることなど.これらの問題は,リアルタイムでの隠された危険になる可能性がある.
これらの問題に対処するために,指標パラメータを調整し,ストップ・ロスを最適化し,より多くの補助指標を導入することができます.しかし,十分な回測範囲で戦略の安定性を検証する必要があります.
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.