この戦略の主な考え方は,パーセンテージランク指標とパラメータ最適化を組み合わせて価格動向を判断し追跡することです.この戦略は,ミラー効果を捉え,過剰なリターンのトレンドを追跡するために,現在の価格と特定の歴史的期間の価格の割合を比較することによって取引信号を生成します.
この戦略は,価格動向を決定するために百分位ランク指標を使用する.百分位ランクは,見られる期間の現在の価格の相対的な強さを表している.パラメータlenは,見られる歴史的期間の長さを示している.
パーセントランク値の範囲は0から100である. パーセントランク値が0に近い場合,現在の価格は見られた期間の最低価格に近いものであり,過大評価された領域にあることを意味します. 100に近い場合,現在の価格は見られた期間の最高価格に近いものであり,過大評価された領域にあることを意味します.
この戦略は,スケールパラメータをオフセットとして導入し,0から100の範囲をスケールから100+の範囲に移動します.また,2つの信号線level_1とlevel_2が設定されています.ここでlevel_1は長いレベルを表示し,level_2は短いレベルを表示します.
値%rank指標が level_1 を上へと越えると,長い信号が生成される. level_2 を下へと越えると,短い信号が生成される. 出口条件は入口信号とは反対である.
上記のリスクに対処するために,レン,スケール,レベルなどのパラメータは最適化のために調整できます.他の指標も誤った取引を避けるために確認のために組み込まれる可能性があります.
戦略をさらに最適化できる余地があります.
戦略の全体的な考え方は明確であり,価格動向を判断し追跡するためにパラメータ最適化の定量的な方法を適用する.これはいくつかの実践的な価値を持っていますが,リスクを軽減し安定した収益性を向上させるためにさらなるテストと最適化が必要です.
/*backtest start: 2023-12-02 00:00:00 end: 2024-01-01 00:00:00 period: 4h basePeriod: 15m 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/ // © Alex_Dyuk //@version=4 strategy(title="percentrank", shorttitle="percentrank") src = input(close, title="Source") len = input(title="lookback - Период сравнения", type=input.integer, defval=10, minval=2) scale = input(title="scale offset - смещение шкалы", type=input.integer, defval=50, minval=0, maxval=100) level_1 = input(title="sygnal line 1", type=input.integer, defval=30) level_2 = input(title="sygnal line 2", type=input.integer, defval=-30) prank = percentrank(src,len)-scale plot(prank, style = plot.style_columns) plot(level_2, style = plot.style_line, color = color.red) plot(level_1, style = plot.style_line, color = color.green) longCondition = (crossunder(level_1, prank) == true) if (longCondition) strategy.entry("Long", strategy.long) longExitCondition = (crossover(level_2, prank) == true) if (longExitCondition) strategy.close("Long") shortCondition = (crossover(level_2, prank) == true) if (shortCondition) strategy.entry("Short", strategy.short) shortexitCondition = (crossunder(level_1, prank) == true) if (shortexitCondition) strategy.close("Short")