資源の読み込みに... 荷物...

取引戦略 円周オシレーター

作者: リン・ハーンチャオチャン開催日:2023年10月30日11時45分42秒
タグ:

img

概要

この戦略は,ボリューム・価格ダイバージェンス戦略に属するボリューム・価格変化の変化率を計算することによって,牛と熊サイクルの変換を判断する.これはボリュームのモメンタム指標と価格のボリンジャーバンドを組み合わせて,価格に対するボリューム変化の主要な効果を決定し,トレンドのターニングポイントを捕捉する.

取引の論理

  1. 音量変化の変化率 (音量差指標の変化率) を計算し,音量運動量に基づく指標結果を得る.

  2. n のボリンジャー帯を計算し,ボリュームモメントの標準偏差を表示する bbr を得ます.

  3. 価格の標準偏差を表すbbr1を得るために,閉じる価格のボリンジャー帯を計算します.

  4. 値の標準偏差を減算し,最終指標として計算します.

  5. ヒストが0を超えると 短い入力信号で 0を下回ると 長い入力信号です

値の変化の変化率を計算することで,価格に対するボリューム変化の主要な効果が増幅される.価格がまだ逆転していない間にボリュームが逆転すると,histは0以上または0以下を横切り,取引信号を生成する.価格動向のターニングポイントを事前に予測することができる.

利点

  1. この戦略は,価格動向の転換点を事前に反映できる,量の変化率に基づいた量価格差の戦略です.

  2. 量変化の変化率を計算すると,価格に対する量変化の主要な効果が増幅され,より良い取引結果が得られる.

  3. ボリンジャー・バンドの価格とボリューム・モメント・インディケーターを組み合わせることで,取引信号がより信頼性が高まります.

  4. Histデータに対する3倍指数式スムーズ化により 信号がより正確でスムーズになります

  5. 過剰購入/過剰販売ラインと長期/短期ストップ損失/収益受領オーダーの設定は,リスクを効果的に制御するのに役立ちます.

  6. ボリンジャーバンド長さ,標準偏差倍数,ヒストの滑らかな因子などの多くのカスタマイズ可能なパラメータは戦略の最適化を可能にします.

リスク

  1. 取引量データは,市場取引を真に反映していない可能性があり,操作される可能性があります.

  2. 価格と物価の差は持続しない可能性があり,価格が逆転せずに突破する可能性があります.

  3. パラメータの設定が正しくない場合,過剰な取引または不正確な信号を引き起こす可能性があります.

  4. 異常音量データからの 誤った信号に注意してください

  5. トレンドが強くなるときは逆転信号を避けるべきです.

パラメータを最適化し,他のフィルターを追加し,ストップ・ロスト/テイク・プロフィートを設定することでリスクは軽減できます.

増進 の 機会

  1. より安定した信号のためにボリンガー帯のパラメータを最適化します

  2. トレンドに反する取引を避けるためにトレンドフィルターを追加します.

  3. 信号の確認のためにMACDのような他の指標を組み込む.

  4. AIを活用してパラメータを自動最適化します

  5. リスク管理を最適化するために ダイナミックなストップ・ロスト/テイク・プロフィートを追加します

  6. マシン学習を適用し,より高い信号品質のためにボリューム価格の差異の成功率を決定します.

結論

この戦略は,ボリューム変化の変化率を計算することによって価格に対するボリューム変化の主要な影響を増幅し,トレンドターニングポイントを早期に検出することを可能にします.単一ボリューム指標と比較して,より高い信頼性と精度を持っています.しかし,ボリューム操作やダイバージェンスブレイクアウトなどのリスクは,パラメータ最適化,指標フィルターなどによって防げなければなりません.将来,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)



もっと