ボリンジャー帯とMACDに基づく定量取引戦略

作者: リン・ハーンチャオチャン開催日:2024年2月23日 14時30分
タグ:

img

概要

この戦略は,ボリンジャーバンドとMACD指標に基づいた定量的な取引戦略である.取引信号の質を改善するために,ボリンジャーバンドのブレークアウト取引とMACDトレンド追跡を組み合わせます.

戦略原則

この戦略は主にボリンジャー帯とMACD指標を使用して取引信号を決定します.

ボリンジャーバンドは,中帯,上帯,下帯からなる.価格が下帯を突破すると買い信号が生成される.価格が上帯を突破すると売り信号が生成される.戦略は,より強いブレイクアウト信号を決定するためにボリンジャーバンドのブレイクアウト原理を使用する.

MACD指標は,短期および長期移動平均の関係を反映する.入口および出口点を決定するために,差線と信号線のクロスオーバーを使用する.この戦略は,MACD指標を使用してボリンジャーバンドの取引信号をフィルターし,差線が信号線の上を横切るとより効果的な購入信号を生成する.

全体的に,この戦略はボリンジャー・バンドのトレンド追跡とMACDの移動平均の優位性を組み合わせ,強力なトレンドにおけるより大きな市場の変動を把握することを目指しています.

戦略 の 利点

  1. ボリンジャー帯とMACD指標を組み合わせることで,取引信号がより信頼性が高まります.

  2. ボリンジャー・バンドのトレンド・トラッキングとMACD移動平均のクロスオーバーは,トレンド市場におけるより強いエントリー・シグナルを生むことができます.

  3. 誤った信号は二重指標判断によって効果的にフィルタリングされ,取引リスクが軽減されます.

  4. 戦略のパラメータ最適化には大きな余地があり,異なる製品とサイクルに応じて調整することができます.

戦略 の リスク

  1. レンジ・バインド市場では,ボリンジャー・バンドやMACDによって生成される取引信号が頻繁に発生し,過剰取引のリスクが生じる可能性があります.

  2. 3回連続でMACDの黄金値が低水準に上昇すると,下向きの反転の危険性があります.

  3. 戦略は複数の指標を使用し,パラメータ最適化と戦略テストをかなり困難にします.

これらのリスクに対処するために,保持期間を調整し,ストップ損失を設定し,パラメータを最適化するなどの方法を使用してそれらを制御することができます.

戦略の最適化のための方向性

  1. 取引頻度を減らすため,長い期間ボリンジャーバンドのパラメータをテストします.

  2. MACDの快線と遅線パラメータを最適化して指標の感度を向上させる.

  3. フィルタリング用の他の指標,KDJ,RSIなどを追加して信号品質を改善します.

  4. ダイナミックストップを設定し,自動で取引を終了し,単一の取引リスクを制御します.

結論

理論的には,ボリンジャーバンドのブレイクアウト取引とMACD指標のフィルタリングを統合することで,この戦略は高品質の取引信号を生成することができる.パラメータ最適化とリスク管理措置を通じて,良いバックテスト結果を達成することができる.しかし,いかなる戦略も完全に損失を回避することはできません.実際の取引パフォーマンスには慎重な評価が必要です.


/*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=5
strategy("Nabz-BBMACD-2022-V1.1", shorttitle="BBM-Nabz", overlay=true)


// My 1st Pine Scrpt Indicator
// Work on best on 1Hr Chart
// Open for Help/Donations.


var float lastentry=1
int result = 0
float x = 0
drawshape = false

/////////////EMA
shortest = ta.ema(close, 20)
short = ta.ema(close, 50)
longer = ta.ema(close, 100)
longest = ta.ema(close, 200)

plot(shortest, color = color.red)
plot(short, color = color.orange)
plot(longer, color = color.aqua)
plot(longest, color = color.blue)

///////////// RSI
RSIlength = input(6,title="RSI Period Length") 
RSIoverSold = 50
RSIoverBought = 50
price = close
vrsi = ta.rsi(price, RSIlength)


///////////// Bollinger Bands
BBlength = input.int(200, minval=1,title="Bollinger Period Length")
BBmult = 2 // input(2.0, minval=0.001, maxval=50,title="Bollinger Bands Standard Deviation")
BBbasis = ta.sma(price, BBlength)
BBdev = BBmult * ta.stdev(price, BBlength)
BBupper = BBbasis + BBdev
BBlower = BBbasis - BBdev
source = close
buyEntry = ta.crossover(source, BBlower)
sellEntry = ta.crossunder(source, BBupper)



////////////// MACD
fastLength = input(12)
slowlength = input(26)
MACDLength = input(9)
MACD = ta.ema(close, fastLength) - ta.ema(close, slowlength)
aMACD = ta.ema(MACD, MACDLength)
delta = MACD - aMACD


///////////// Colors
switch1=input(true, title="Enable Bar Color?")
switch2=input(true, title="Enable Background Color?")
TrendColor = RSIoverBought and (price[1] > BBupper and price < BBupper) and BBbasis < BBbasis[1] ? color.red : RSIoverSold and (price[1] < BBlower and price > BBlower) and BBbasis > BBbasis[1] ? color.green : na


///////////Strategy

bool tcu = not (ta.crossunder(price[0],shortest[0]))


if (((price[1]<BBlower[1]) and (ta.crossover(price,BBlower))))
    lastentry := low[1]
    strategy.entry("RSI_BB_L", strategy.long, comment="Buy 1st IF")
    
if (((ta.crossover(delta, 0.0) and (ta.crossover(price,BBlower)))))
    lastentry := low[1]
    strategy.entry("RSI_BB_L", strategy.long, comment="Buy 2nd IF")    
    
if (((ta.crossover(delta, 0.0)) and (low[0]>shortest[0])) and (price[1]<low))
    lastentry := low[1]
    strategy.entry("RSI_BB_L", strategy.long, comment="Buy 3rd IF")   //else

if (((ta.crossover(delta, 0.01)) and (high[1]<BBupper)) and (tcu))
    lastentry := low[1]
    strategy.entry("RSI_BB_L", strategy.long, comment="Buy 4th IF")

       
if ((ta.crossunder(low[0],shortest[0]) and close<shortest))
    strategy.close(id="RSI_BB_L", comment="Close by 1st IF")
    
    
    
if (price<lastentry)
    drawshape := true
    
if (price<strategy.opentrades.entry_price(0)/1.01175734321249)
    strategy.close(id="RSI_BB_L", comment="Close by 2nd IF")



plot(strategy.opentrades.entry_price(0), color=color.yellow)


もっと