OBVインジケーターに基づくトレンドフォロー戦略


作成日: 2024-02-20 15:35:08 最終変更日: 2024-02-20 15:35:08
コピー: 0 クリック数: 904
1
フォロー
1617
フォロワー

OBVインジケーターに基づくトレンドフォロー戦略

概要

この戦略は,双EMA平均線幅を用いてOBV指標の多空傾向を判断し,傾向の方向に応じて長短のアプローチを行う.その中で,OBV指標は,価格と取引量の関係をより明確に反映し,市場参加者の意向を判断し,したがって,市場トレンドを捕捉するために使用することができる.この戦略は,移動平均の指標の平滑処理と組み合わせて,市場ノイズを効果的に除し,主要トレンドを捕捉することができる.

戦略原則

この戦略は,主にOBV指標が上昇傾向にあるかどうかを判断して多頭入場のタイミングを判断する.具体的には,OBVの6日EMAと24日EMAを計算し,6日EMAの上を通過すると24日EMAが多頭信号を生じさせる.また,6日EMA下を通過すると24日EMAが空頭信号を生じさせる.さらに,戦略は3%のストップロスを設定する.

この戦略のトレンド判断の鍵は,OBV指標にある。OBV指標は,大資金の集合的意思を反映し,市場参加者の態度を効果的に反映できる。移動平均処理と組み合わせて,一部のノイズを除し,信号をより明確で信頼性のあるものにすることができる。戦略は,高速EMA線と遅いEMA線を使用して取引信号を構築し,価格データを平らにし,同時に傾向の変化をより敏感に捉えることができる。

優位分析

この戦略には以下の利点があります.

  1. 取引量に基づくOBV指標は,市場参加者の意思を明確に判断することができ,信号はより信頼性が高い.

  2. 双EMA均線処理により,部分的なノイズが除去され,信号がより明確になる.

  3. EMA線の組み合わせは,平らな価格とトレンドの変化を兼ね備える.

  4. 戦略操作はシンプルで実行しやすい.

リスク分析

この戦略にはいくつかのリスクがあります.

  1. OBV指標は,ある時点で誤った信号を発し,戦略は損をする可能性があります.

  2. EMAの線路の処理が遅れており,最適なエントリーポイントを逃す可能性があります.

  3. 固定のストップ・ロスの設定は,市場の変化に適応できず,過度に固執している可能性があります.

対策として

  1. 他の指標と組み合わせて確認し,誤信号を回避する.

  2. EMA線を敏感にするためにパラメータ設定を最適化します.

  3. ダイナミック・ストップを設定する.

最適化の方向

この戦略は以下の方向から最適化できます.

  1. EMAパラメータの組み合わせを最適化して,よりよくマッチする平均線パラメータを見つけます.

  2. MACD,RSIなどの他の指標を信号確認に追加し,信号の正確性を向上させる.

  3. ダイナミックストップを設定し,市場の変動に応じてリアルタイムでストップポイントを調整できます.

  4. パラメータの組み合わせを最適化して,最適なパラメータの組み合わせを見つけます.

要約する

この策略は全体的に比較してシンプルで信頼性の高いトレンド追跡策略である.OBV指標と双EMA均線を組み合わせてトレンド判断を実現している.操作が簡単で,信号が明快で,トレンドを効果的に追跡できるという利点がある.欠点は,誤信号が発生する可能性があり,EMA線処理が遅れていることである.他の指標を組み合わせて最適化することで,よりよい効果が得られる.

ストラテジーソースコード
/*backtest
start: 2024-01-01 00:00:00
end: 2024-01-31 23:59:59
period: 1h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=4
strategy("OBV EMA X BF 🚀", overlay=false, initial_capital=10000, default_qty_type=strategy.percent_of_equity, default_qty_value=100, commission_type=strategy.commission.percent, commission_value=0.0)

/////////////// Time Frame ///////////////
testStartYear = input(2017, "Backtest Start Year") 
testStartMonth = input(1, "Backtest Start Month")
testStartDay = input(1, "Backtest Start Day")
testPeriodStart = timestamp(testStartYear,testStartMonth,testStartDay, 0, 0)

testStopYear = input(2019, "Backtest Stop Year")
testStopMonth = input(12, "Backtest Stop Month")
testStopDay = input(31, "Backtest Stop Day")
testPeriodStop = timestamp(testStopYear,testStopMonth,testStopDay, 0, 0)

testPeriod() => true

/////////////// OBV /////////////// 
src = close
atr = atr(input(title="ATR Period", defval=3, minval=1))
atrmult = input(title="ATR Mult", defval=1, minval=0)
obv = cum(change(src) > 0 ? volume * (volume / atr) : change(src) < 0 ? -volume * (volume / atr) : 0 * volume / atr)
e1 = ema(obv, input(24))
e2 = ema(obv, input(6))

///////////////  Strategy  /////////////// 
long = crossover(e2, e1)
short = crossunder(e2, e1)

last_long = 0.0
last_short = 0.0
last_long := long ? time : nz(last_long[1])
last_short := short ? time : nz(last_short[1])

long_signal = crossover(last_long, last_short)
short_signal = crossover(last_short, last_long)

last_open_long_signal = 0.0
last_open_short_signal = 0.0
last_open_long_signal := long_signal ? open : nz(last_open_long_signal[1])
last_open_short_signal := short_signal ? open : nz(last_open_short_signal[1])

last_long_signal = 0.0
last_short_signal = 0.0
last_long_signal := long_signal ? time : nz(last_long_signal[1])
last_short_signal := short_signal ? time : nz(last_short_signal[1])

in_long_signal = last_long_signal > last_short_signal
in_short_signal = last_short_signal > last_long_signal

last_high = 0.0
last_low = 0.0
last_high := not in_long_signal ? na : in_long_signal and (na(last_high[1]) or high > nz(last_high[1])) ? high : nz(last_high[1])
last_low := not in_short_signal ? na : in_short_signal and (na(last_low[1]) or low < nz(last_low[1])) ? low : nz(last_low[1])

since_longEntry = barssince(last_open_long_signal != last_open_long_signal[1]) 
since_shortEntry = barssince(last_open_short_signal != last_open_short_signal[1]) 

//////////////// Stop loss /////////////// 
sl_inp = input(3.0, title='Stop Loss %') / 100
tp_inp = input(5000.0, title='Take Profit %') / 100
 
take_level_l = strategy.position_avg_price * (1 + tp_inp)
take_level_s = strategy.position_avg_price * (1 - tp_inp)

slLong = in_long_signal ? strategy.position_avg_price * (1 - sl_inp) : na
slShort = strategy.position_avg_price * (1 + sl_inp)
long_sl = in_long_signal ? slLong : na
short_sl = in_short_signal ? slShort : na

/////////////// Execution /////////////// 
if testPeriod()
    strategy.entry("L", strategy.long, when=long)
    strategy.entry("S", strategy.short, when=short)
    strategy.exit("L SL", "L", stop=long_sl, when=since_longEntry > 0)
    strategy.exit("S SL", "S", stop=short_sl, when=since_shortEntry > 0)

/////////////// Plotting /////////////// 
plot(e1, color = e1 > e1[1] ? color.lime : e1 < e1[1] ? color.red : color.white, linewidth = 2, offset = 0)
plot(e2, color = e2 > e2[1] ? color.lime : e2 < e2[1] ? color.red : color.white, linewidth = 1)
bgcolor(strategy.position_size > 0 ? color.lime : strategy.position_size < 0 ? color.red : color.white, transp=90)
bgcolor(long_signal ? color.lime : short_signal ? color.red : na, transp=60)