P-Signal Multi-Time Frame Trading Strategy - это алгоритмическая торговая стратегия цифровой валюты, основанная на статистических принципах, в сочетании с многократным анализом временных рамок. Эта стратегия использует функцию ошибки Гаусса и индикатор P-Signal для моделирования биткоина на солнечную, солнечную и лунную линии, чтобы совершать волатильные сделки в соответствии с индикатором Gold Forks.
Ключевым показателем стратегии P-Signal является P-Signal, который сочетает в себе статистические стандартные отклонения и простые движущиеся средние, отображаемые на диапазоне от -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.