この戦略は,平均の真の範囲 (ATR) から計算されたポジティブな方向指標 (DI+) とネガティブな方向指標 (DI-) のクロスオーバーに基づいて取引信号を生成する.DI+とDI-のクロスオーバーを通じてトレンド逆転点を識別するトレンドフォロー戦略に属します.ATRはストップ損失と利益レベルを設定するために使用されます.
ATRを計算する (※14):過去14日間の平均的な実値範囲を計算し,高値,低値,近値を用いる.
DI+とDI-を計算する
DI+ = 100 * RMA ((MAX ((UP,0),N) /ATNR
DI- = 100 * RMA ((MAX ((DOWN,0),N) / ATNR
UPは現在の高値と前の閉店との差であり,DOWNは現在の低値と前の閉店との差であり,Nはパラメータ期間であり,デフォルトは14で,ATNRはステップ1から計算されたATRです.
入口と出口を決定する
DI+が DI-を横切ると,買い信号が生成される.
DI+がDI−を下回ると,売り信号が生成される.
ストップ・ロスを設定し 利益を取ります
ロングストップ・ロスは,エントリー価格マイナスATRをストップ・ロスの倍数で掛ける.
ロング・テイク・プロフィートは,エントリー価格加えてATRをテイク・プロフィートの倍数で掛ける.
ショートストップ損失は,エントリー価格加えてATRをストップ損失倍数で掛ける
ショート・テイク・プロフィートは,入場価格マイナスATRをテイク・プロフィートの倍数で掛ける
トレンド逆転を決定するためにDI+/DI-クロスオーバーを使用することで,新しいトレンド方向性に対するタイミングのシグナルが提供されます.
ATRは動的ストップ・ロース/テイク・プロフィート指標として,市場の変動に基づいて合理的なレベルを設定することができます.
戦略にはパラメータが少なく,理解し実行するのが簡単です.
バックテストの結果 この戦略は ポジティブな利益因子を持ち バイ・アンド・ホールに優れていることが示されています
DIクロスオーバーによる誤信号リスク
ストップ・ロスト/得益の接近が過度に近かった
範囲限定市場での非効率性
引き上げリスク
移動平均値のようなフィルターを追加して 範囲内での誤った信号を避けるのです
固定分数やマルティンゲールのような ポジションサイズを導入して 引き下げを制御し 収益性を高めます
ATR パラメータを最適化して,異なる取引手段の変動に対応する.
最適な組み合わせを見つけるためにDI期,ATR期,ATR倍数等でパラメータ最適化
戦略を24/7実行するために 夜間と初期のセッションの論理を追加します
これはDIクロスオーバーからシグナルを生成し,ATRで動的なストップ・ロスト/テイク・プロフィートを設定するシンプルで実践的な戦略である.いくつかのパラメータを使用して,テストし最適化することは簡単である.しかしDIクロスオーバーは統合中に効果が低い.今後,追加のフィルターを組み合わせることが主な改善分野である.全体的にこの戦略は短期間の日取引に適した安定したパフォーマンスを示している.
/*backtest start: 2022-11-06 00:00:00 end: 2023-11-12 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/ // © TheHulkTrading //@version=4 strategy("DI Crossing Daily Straregy HulkTrading", overlay=true) // ATR Multiplier. Recommended values between 1..4 atr_multiplier = input(1, minval=1, title="ATR Multiplier") //Length of DI. Recommended default value = 14 length = input(14, minval=1, title="Length di") up = change(high) down = -change(low) range = rma(tr, 14) //DI+ and DI- Calculations di_plus = fixnan(100 * rma(up > down and up > 0 ? up : 0, length) / range) di_minus = fixnan(100 * rma(down > up and down > 0 ? down : 0, length) / range) //Long and short conditions longCond = crossover(di_plus,di_minus) shortCond = crossunder(di_plus,di_minus) //Stop levels and take profits stop_level_long = strategy.position_avg_price - atr_multiplier*atr(14) take_level_long = strategy.position_avg_price + 2*atr_multiplier*atr(14) stop_level_short = strategy.position_avg_price + atr_multiplier*atr(14) take_level_short = strategy.position_avg_price - 2*atr_multiplier*atr(14) //Entries and exits strategy.entry("Long", strategy.long, when=longCond) strategy.exit("Close Long","Long", stop=stop_level_long, limit = take_level_long) strategy.entry("Short", strategy.short, when=shortCond) strategy.exit("Close Short","Short", stop=stop_level_short, limit = take_level_short)