ドンキアン適応型移動平均取引システム (Donchian adaptive moving average trading system) は,価格動向を追跡する定量的な取引戦略である.この戦略は,ドンキアンチャネル指標を長期および短期移動平均値と組み合わせて,価格動向を判断し,追跡し,トレンド取引のための中長期価格動向を把握する.
この戦略は,まず真の波動性範囲を計算する.真の波動性範囲は,前のキャンドルスティックの閉店価格から現在のキャンドルスティックの最高値と最低値までの価格動き範囲を指します.その後,ドンチアンチャネルの帯幅として真の波動性範囲の単純な移動平均を計算します.二つの時間期間の移動平均と組み合わせて,価格傾向を判断します.特定の判断ルールは以下のとおりです:
価格が長期移動平均値プラス帯域幅と短期移動平均値プラス帯域幅を突破すると,ロング;価格が長期移動平均値マイナス帯域幅と短期移動平均値マイナス帯域幅を下回ると,ショート.閉じる条件は,価格が帯域幅増加した長期移動平均値を下回るときのロング・ショート・ポジションの閉じる;価格が帯域幅増加した長期移動平均値を超えるとショート・ポジションの閉じる.
したがって,真の波動性に基づいてドンチェインチャネルの帯域幅を動的に調整し,二重移動平均値でフィルタリングすることで,戦略は中長期の価格動向を効果的に追跡し,誤った信号を削減し,安定した長期取引機会を得ることができます.
この戦略には以下の利点があります.
チャンネル帯域幅を動的に調整するために真の波動性を利用することで 静的パラメータを避け,市場の変化により良く適応できます.
二重移動平均値の組み合わせにより 騒音を効果的にフィルタリングし 誤った信号を減らすことができます
中長期のトレンドを追跡することで,長期の利益の機会を得るため,繰り返し取引や取引頻度を減らすことができます.
戦略論理はシンプルで明確で,実行が容易で,エラー耐性があり,自動化されたアルゴリズム取引に適しています.
この戦略にはいくつかのリスクもあります:
短期調整では,長期取引のベストなエントリータイミングを把握するのは難しい.波動性指標は,短期的な状況を判断し,エントリーを最適化するのに役立ちます.
パラメータは,異なる部門と個々のストックに最適化する必要があります.動的最適化されたパラメータポートフォリオを検討することができます.
ストップロスのポイントは 緊急事態による 重要なトレンド変化に対して 適切に緩めなければなりません
概要すると,ドンチアン適応型移動平均取引システムは,全体的に安定した,シンプルで実行しやすい定量戦略である.動的チャネルと二重移動平均フィルタリングを利用することで,中長期市場トレンドを効果的に追跡し,取引頻度を削減し,長期的な持続的な利益を得ることができる.一方,パラメータ設定を最適化し,リスクを防止し,緊急事態に適応するために適切なストップロスを注意すべきである.全体的に見ると,この戦略は優れたパフォーマンスを有し,中長期アルゴリズムトレンド追跡に適している.
/*backtest start: 2023-02-14 00:00:00 end: 2024-02-20 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/ // © dongyun //@version=4 strategy("唐齐安移动平均交易系统", overlay=true) longperiod = input(20,'长线') shortperiod = input(5,'短线') bandfactor = input(1.0,'') TrueHigh = 0.0 TrueLow = 0.0 TrueRange = 0.0 TrueHigh := close[1] > high ? close[1] : high TrueLow := close[1] < low ? close[1] : low TrueRange := TrueHigh - TrueLow AvgTrueRange = sma(TrueRange,longperiod) MAlong = sma(close,longperiod) MAshort = sma(close,shortperiod) band = AvgTrueRange * bandfactor if close > MAlong[1] + band[1] and close > MAshort[1] + band[1] strategy.entry("Long", strategy.long, when=strategy.position_size < 1) else if close < MAlong[1] - band[1] and close < MAshort[1] - band[1] strategy.entry("Short", strategy.short, when=strategy.position_size > -1) if close < MAlong[1] - band[1] or close < MAshort[1] - band[1] strategy.close("Long", when=strategy.position_size > 0) else if close > MAlong[1] + band[1] or close > MAshort[1] + band[1] strategy.close("Short", when=strategy.position_size < 0)