ボリューム変化率に基づくロングショート交互サイクルオシレーター戦略


作成日: 2023-10-30 11:45:42 最終変更日: 2023-10-30 11:45:42
コピー: 1 クリック数: 686
1
フォロー
1617
フォロワー

ボリューム変化率に基づくロングショート交互サイクルオシレーター戦略

概要

この戦略は,取引量の変化率の変化率を計算して,多空周期の変換を判断するために,量価背離型の戦略に属している.それは,取引量の動量指標と価格のブリン帯を組み合わせて,取引量の変化が価格に及ぼすリード効果を判断して,トレンドの転換点を捕捉する.

戦略原則

  1. 取引量変化率の変化率を計算して,取引量動力の指標 nresult を得ます.

  2. nresult に対してブリン帯を計算し,交差量動力の標準差を代表するbbr を得る.

  3. 閉盤価格に対してブリン帯を計算すると,価格標準差を代表するbbr1が得られる.

  4. 2つの差値hist,すなわち,取引量動力の標準差を減算した価格標準差を,最終指標として計算する.

  5. 上のhistは0を空頭入場点として,下のhistは0を多頭入場点として使う.

この戦略は,取引量の変化率を計算することによって,取引量の変化が価格に与える先導的効果を拡大する.取引量が反転し,価格がまだ反転していないとき,histは上または下を穿え,取引信号を生成する.これは,価格の傾向の転換点を事前に判断する.

戦略的優位性

  1. この戦略は,取引量の変化率に基づく量価格の策略から離れているので,価格の傾向を早期に反映できるターニングポイントである.

  2. 取引量変化率の変動率を計算すると,取引量変化が価格に与える主導的効果が大きくなり,取引効果が優れている.

  3. 交差量動量指標と価格指標を組み合わせたブリン帯は,取引信号をより信頼できるようにする.

  4. ヒストデータを指数三回流し処理することで,信号をより正確で滑らかにする.

  5. オーバーバイオーバーセールラインを設定し,長空のストップ・ロズ・リミット・リストを配合することで,リスクを効果的に制御できます.

  6. ブリン帯の長さ,標準差倍数,Histデータ平滑パラメータなど,カスタマイズ可能なパラメータが多く,戦略の最適化が可能である.

戦略リスク

  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)