この戦略は,長期および短期間の移動平均値のクロスオーバーに基づいています. 取引量の長期および短期間のトレンドを計算するために,異なる期間のEMAを使用し,その違いに基づいて振動器を構築します.振動器がゼロレベルを超えると長行し,下を横切ると短行します. また,特定の方向性を決定するために以前の高値と低値も組み込みます.
この戦略のコア指標はボリュームオシレーターである.これは長期および短期指数関数移動平均の違いを計算することによって取引量の変化の傾向を反映する.具体的な式は:
ボリュームオシレーター = (ショートEMA - ロングEMA) / ロングEMA * 100
ここでは,ShortEMAとLongEMAはそれぞれ短期および長期EMAを指します.ShortEMAがLongEMAを横切ると,指標は正になり,取引量が拡大することを意味します.ShortEMAがLongEMAを下回ると,指標は負になり,取引量が収縮することを意味します.
オシレータを計算した後,この戦略は取引信号を生成するためにゼロレベルとのクロスオーバーを使用します.オシレータがマイナスからポジティブに回るとき,つまりゼロレベルを超越したとき,そしてポジティブからマイナスに回るとき,つまりゼロレベル以下を超越したとき,ショートになります.これは取引量のモメント変換を反映します.
また,戦略は,特定の方向性を決定するために以前の高値と低値も組み込む.つまり,振動器がゼロレベルを超えると,以前の高値が以前の低価格の絶対値よりも大きい場合,それは長い信号,そうでなければ短い信号を意味している.この機能は,ボリューム拡大の強さを判断するのに役立ちます.
この戦略には以下の利点があります.
取引量をベース指標として使うことは,市場参加者の意欲を効果的に決定し,非常に実用的です.
長期と短期の EMA を併用することで,中長期の動向と短期の動向を同時に把握できます.
インディケーターとゼロレベルによって形成される交差信号は 意思決定にシンプルで明白です
過去の高値と低値を足して方向性を決定することで,取引量のインパントサイズをうまく利用できます.
戦略の論理は単純で,パラメータは調整に柔軟で,適応性は比較的高い.
この戦略にはいくつかのリスクがあります.
市場の誤ったブレイクによって影響を受け,誤ったシグナルが生成される可能性があります.リスクを制御するためにストップロスを設定する必要があります.
範囲限定市場では,ボリュームクロスオーバーが頻繁に起こる可能性があります.指標のターニングポイントの適切な確認が必要です.
過去の高低は最近の拡大を反映し その持続可能性を決定することはできない.
パラメータは,異なる製品と時間帯に別々の最適化が必要です.普遍性は限られています.
ボリュームインジケーターは高周波のアルゴリズム取引にゆっくり反応し,おそらくベストなエントリータイミングを逃している.
戦略は以下の側面で最適化できます.
偽信号を避けるためにフィルターを追加します.例えば価格指標で確認します.
長期および短期EMAの期間を最適化し,異なる製品の特徴に合わせて
過去の高値と低値の期間パラメータを設定し,期間中の最大値と最低値を使用する.
過剰な取引を避けるため,単一のレベルではなく指標のターニングエリアの範囲を定義する.
ストップ・ロスの戦略を追加して 単一の損失を制御する
VRP のような他の量に基づく指標を組み込む.
マシン学習方法を使って パラメータを自動最適化します
概要すると,ボリュームオシレーター長期短期移動平均クロスオーバー戦略はボリューム逆転機能をうまく利用し,トレンドの初期段階において強力な判断力を備えています.トレンドの方向性を決定するために以前の高値と低値を追加することで,取引決定がより正確になります.また,誤った信号による損失を防ぐためにリスク制御も重要です.この戦略は,パラメータ調節や指標の組み合わせなどの側面で最適化のための大きな余地があり,市場の変化に対する取引遅延と反応時間を短縮します.
/*backtest start: 2022-12-05 00:00:00 end: 2023-03-11 00:00:00 period: 1d basePeriod: 1h exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}] */ //@version=3 strategy("SB_Volume_oscillator_Prev_high_low", overlay=true,default_qty_type = strategy.percent_of_equity, default_qty_value = 100) shortlen = input(5, minval=1) longlen = input(10, minval=1) short = ema(volume, shortlen) long = ema(volume, longlen) osc = 100 * (short - long) / long //hline(0, title="Zero") //plot(osc) zero=input(0.0) low_val=input(0.0) high_val=input(0.0) prev_high_val=input(0.0) prev_low_val=input(0.0) where=input(0) where:=nz(where[1]) low_val:=nz(low_val[1]) high_val:=nz(high_val[1]) prev_high_val:=nz(prev_high_val[1]) prev_low_val:=nz(prev_low_val[1]) if(crossover(osc,zero)) high_val:=osc where:=1 prev_low_val:=low_val low_val:=osc if(crossunder(osc,zero)) low_val:=osc where:=-1 prev_high_val:=high_val high_val:=osc if(where==1) if(high_val<osc) high_val:=osc if(where==-1) if(low_val>osc) low_val:=osc if (crossover(osc,zero)) if(prev_high_val<=abs(prev_low_val)) strategy.entry("My Long Entry Id", strategy.long) if(prev_high_val>abs(prev_low_val)) strategy.entry("My Short Entry Id", strategy.short) if (crossunder(osc,zero)) if(prev_high_val<=abs(prev_low_val)) strategy.entry("My Long Entry Id", strategy.long) if(prev_high_val>abs(prev_low_val)) strategy.entry("My Short Entry Id", strategy.short)