この戦略は,ボリューム・価格ダイバージェンス戦略に属するボリューム・価格変化の変化率を計算することによって,牛と熊サイクルの変換を判断する.これはボリュームのモメンタム指標と価格のボリンジャーバンドを組み合わせて,価格に対するボリューム変化の主要な効果を決定し,トレンドのターニングポイントを捕捉する.
音量変化の変化率 (音量差指標の変化率) を計算し,音量運動量に基づく指標結果を得る.
n のボリンジャー帯を計算し,ボリュームモメントの標準偏差を表示する bbr を得ます.
価格の標準偏差を表すbbr1を得るために,閉じる価格のボリンジャー帯を計算します.
値の標準偏差を減算し,最終指標として計算します.
ヒストが0を超えると 短い入力信号で 0を下回ると 長い入力信号です
値の変化の変化率を計算することで,価格に対するボリューム変化の主要な効果が増幅される.価格がまだ逆転していない間にボリュームが逆転すると,histは0以上または0以下を横切り,取引信号を生成する.価格動向のターニングポイントを事前に予測することができる.
この戦略は,価格動向の転換点を事前に反映できる,量の変化率に基づいた量価格差の戦略です.
量変化の変化率を計算すると,価格に対する量変化の主要な効果が増幅され,より良い取引結果が得られる.
ボリンジャー・バンドの価格とボリューム・モメント・インディケーターを組み合わせることで,取引信号がより信頼性が高まります.
Histデータに対する3倍指数式スムーズ化により 信号がより正確でスムーズになります
過剰購入/過剰販売ラインと長期/短期ストップ損失/収益受領オーダーの設定は,リスクを効果的に制御するのに役立ちます.
ボリンジャーバンド長さ,標準偏差倍数,ヒストの滑らかな因子などの多くのカスタマイズ可能なパラメータは戦略の最適化を可能にします.
取引量データは,市場取引を真に反映していない可能性があり,操作される可能性があります.
価格と物価の差は持続しない可能性があり,価格が逆転せずに突破する可能性があります.
パラメータの設定が正しくない場合,過剰な取引または不正確な信号を引き起こす可能性があります.
異常音量データからの 誤った信号に注意してください
トレンドが強くなるときは逆転信号を避けるべきです.
パラメータを最適化し,他のフィルターを追加し,ストップ・ロスト/テイク・プロフィートを設定することでリスクは軽減できます.
より安定した信号のためにボリンガー帯のパラメータを最適化します
トレンドに反する取引を避けるためにトレンドフィルターを追加します.
信号の確認のためにMACDのような他の指標を組み込む.
AIを活用してパラメータを自動最適化します
リスク管理を最適化するために ダイナミックなストップ・ロスト/テイク・プロフィートを追加します
マシン学習を適用し,より高い信号品質のためにボリューム価格の差異の成功率を決定します.
この戦略は,ボリューム変化の変化率を計算することによって価格に対するボリューム変化の主要な影響を増幅し,トレンドターニングポイントを早期に検出することを可能にします.単一ボリューム指標と比較して,より高い信頼性と精度を持っています.しかし,ボリューム操作やダイバージェンスブレイクアウトなどのリスクは,パラメータ最適化,指標フィルターなどによって防げなければなりません.将来,AIは戦略の安定性と収益性をさらに向上させるために適応パラメータ最適化のために活用することができます.
/*backtest start: 2022-10-23 00:00:00 end: 2023-10-29 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/ // © tathal and special thanks to oakwhiz for his porting of my custom volume indicator //@version=5 strategy('Volume Difference Delta Cycle Oscillator', 'VDDC Osc', default_qty_type=strategy.percent_of_equity, default_qty_value=100, max_bars_back=5000) startDate = input.int(title='Start Date', defval=1, minval=1, maxval=31) startMonth = input.int(title='Start Month', defval=1, minval=1, maxval=12) startYear = input.int(title='Start Year', defval=2010, minval=1800, maxval=2100) endDate = input.int(title='End Date', defval=31, minval=1, maxval=31) endMonth = input.int(title='End Month', defval=12, minval=1, maxval=12) endYear = input.int(title='End Year', defval=2021, minval=1800, maxval=2100) // Normalize Function normalize(_src, _min, _max) => // Normalizes series with unknown min/max using historical min/max. // _src : series to rescale. // _min, _min: min/max values of rescaled series. var _historicMin = 10e10 var _historicMax = -10e10 _historicMin := math.min(nz(_src, _historicMin), _historicMin) _historicMax := math.max(nz(_src, _historicMax), _historicMax) _min + (_max - _min) * (_src - _historicMin) / math.max(_historicMax - _historicMin, 10e-10) // STEP 2: // Look if the close time of the current bar // falls inside the date range inDateRange = true // Stop loss & Take Profit Section l_sl_inp = input(2.0, title='Long Stop Loss %') / 100 l_tp_inp = input(4.0, title='Long Take Profit %') / 100 l_stop_level = strategy.position_avg_price * (1 - l_sl_inp) l_take_level = strategy.position_avg_price * (1 + l_tp_inp) s_sl_inp = input(2.0, title='Short Stop Loss %') / 100 s_tp_inp = input(4.0, title='Short Take Profit %') / 100 s_stop_level = strategy.position_avg_price * (1 + s_sl_inp) s_take_level = strategy.position_avg_price * (1 - s_tp_inp) src = close // Volume Differnce Indicator Delta float change_src = ta.change(src) float i_obv = ta.cum(change_src > 0 ? volume : change_src < 0 ? -volume : 0 * volume) float i_pvt = ta.pvt float result = ta.change(i_obv - i_pvt) float nresult = ta.ema(normalize(result, -1, 1), 20) // Volume Differnce Indicator Delta %B length = input.int(20, minval=1, title='Volume Bands Length') mult = input.float(2.0, minval=0.001, maxval=50, title='Volume Bands StdDev') basis = ta.ema(nresult, length) dev = mult * ta.stdev(nresult, length) upper = basis + dev lower = basis - dev bbr = (nresult - lower) / (upper - lower) // Normal %B, Based on close l1 = input.int(20, minval=1, title='Bollinger Bands Length') src2 = close mult1 = input.float(2.0, minval=0.001, maxval=50, title='Bollinger Bands StdDev') basis1 = ta.sma(src2, l1) dev1 = mult1 * ta.stdev(src2, l1) upper1 = basis1 + dev1 lower1 = basis1 - dev1 bbr1 = (src - lower1) / (upper1 - lower1) /// Final Output Line hist = ta.ema(ta.ema(ta.ema(bbr1 - bbr, input(2, title='Hist Smoothing Factor #1')), input(2, title='Hist Smoothing Factor #2')), input(2, title='Hist Smoothing Factor #3')) /// Overbought / Oversold Line Creation oversold = input(-.1) overbought = input(.4) hline(oversold, linewidth=2, color=color.new(#81c784, 62)) hline(overbought, linewidth=2, color=color.new(#c2185b, 38)) /// Long & Short Conditions short = hist > overbought long = hist < oversold /// Colors & Plotting histColor = hist >= 0 ? hist[1] < hist ? #26A69A : #B2DFDB : hist[1] < hist ? #FFCDD2 : #EF5350 plot(hist, title='Histogram', style=plot.style_columns, color=color.new(histColor, 0)) CrossBgColor = long ? color.new(#81c784, 62) : short ? color.new(#c2185b, 38) : na bgcolor(color.new(CrossBgColor, 90)) /// Strategy Methodology if inDateRange strategy.entry('long', strategy.long, when=long, stop=l_stop_level, limit=l_take_level) if inDateRange and strategy.position_size > 0 strategy.close_all(when=short) if inDateRange strategy.entry('short', strategy.short, when=short, stop=s_stop_level, limit=s_take_level) if inDateRange and strategy.position_size < 0 strategy.close_all(when=long)