Стратегия многочасовой торговли P-Signal - это алгоритмическая стратегия торговли криптовалютами, основанная на статистических принципах и многочасовом анализе.
Основным показателем стратегии P-сигнала является сам P-сигнал, который сочетает в себе статистическое стандартное отклонение и простую скользящую среднюю, и отображает его в диапазоне от -1 до 1 с использованием функции ошибки Гаусса, чтобы обнаружить, соответствует ли рынок нормальному распределению.
fErf(x) = 1.0 - 1.0/(1.0 + 0.5*abs(x)) * exp(-x*x - 1.26551223 + ...) # Gaussian error function
fPSignal(ser, n) = fErf((stdev(ser, n) > 0 ? sma(ser, n)/stdev(ser, n)/sqrt(2) : 1)) # P-Signal indicator
Стратегия рассчитывает индикатор P-сигнала на ежедневных, еженедельных и ежемесячных временных рамках для Биткойна, заходит в длинный, когда индикатор пересекает 0, и выходит, когда он пересекает обратно ниже 0, клапаны значения индикатора также настроены для контроля повторных записей.
Наибольшее преимущество стратегии P-Signal заключается в использовании нескольких временных рамок для улучшения стабильности стратегии. Ежедневный график фиксирует краткосрочные колебания рынка, в то время как еженедельные и ежемесячные графики фильтруют ложные прорывы.
По сравнению с одним временным рамоком, несколько временных рамок позволяют использовать ежедневные остановки для контроля за снижением во время волатильности, снижая при этом частоту транзакций с использованием более высоких временных рамок во время колебания рынков.
Самый большой риск стратегии P-Signal заключается в том, что сам индикатор является черным ящиком для квантовых трейдеров. Мы не можем определить адаптивность этого индикатора к конкретным рынкам, и мы не можем определить оптимальный диапазон его параметров. Это может привести к плохой производительности стратегии в живой торговле.
Кроме того, сама стратегия имеет некоторые ограничения. Например, неспособность справиться с насильственными движениями, задержка сигнала от перекрестного показателя и т. Д. Все это может стать скрытыми проблемами во время торговли в режиме реального времени.
Чтобы решить эти проблемы, мы можем скорректировать параметры индикатора, оптимизировать стоп-лосс, ввести больше вспомогательных индикаторов и т. Д. Но предпосылкой является проверка стабильности в достаточно большие периоды обратного тестирования.
Существует несколько направлений оптимизации стратегии P-сигнала:
Изменить параметры индикатора P-сигнала: 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.