複数フィルター ボリンジャーバンド取引戦略


作成日: 2024-01-17 15:12:57 最終変更日: 2024-01-17 15:12:57
コピー: 1 クリック数: 592
1
フォロー
1617
フォロワー

複数フィルター ボリンジャーバンド取引戦略

概要

複数の選型ブリン帯取引戦略は,ブリン帯指標,平均線指標,RSI指標,K線図形特性を組み合わせた複数の条件を選し,条件が満たされると取引信号を発信する量化取引戦略である.これは典型的なトレンド追跡戦略であり,中長線の価格傾向の変動を捕捉して利益を得る.

戦略原則

指標計算

この戦略は主にブリン帯,平均線およびRSIの3つの指標を使用する. ブリン帯の中央線は,価格のn日間のシンプル移動平均線であり,上線と下線は,中線+2倍標準差と中線-2倍標準差である. RSI指標は,一定の期間の落に基づいて計算された範囲の0~100の数値である.

取引信号

この戦略は,以下の3つの主要な条件によって取引信号を生成します.

(1) ブリンが下行突破&K線実体反撃. 閉盤価格が下行突破し,K線実体が現在のトレンド方向と逆の色をしているとき,多めに行う.

(2) ブリン帯上線突破&K線実体反転. 閉盤価格の下線上線に突破し,K線実体色が現在のトレンド方向に反するときは空白する.

(3) K線実体転向。 ポジション保持方向がK線実体色転向と一致する場合は平仓。

さらに,入場を厳格に制御するために,この戦略は均線フィルター,K線実体フィルター,RSIフィルターなどの補助条件を設定しています.

優位分析

  • 多重条件の厳格な管理により,偽突破のリスクを減らす
  • トレンドフォローにより取引頻度が低下
  • RSI指標は反転の罠を回避するために判断を助ける

リスク分析

  • ブリン帯のパラメータが正しく設定されていない場合,信号が少ない可能性があります.
  • 突破失敗は大きな損失をもたらす可能性がある
  • 取引の頻度が低いため,取引の機会を逃している可能性もあります.

ブリン帯のパラメータを調整し,ストップロスを厳格に制御することでリスクを減らすことができます.

最適化の方向

  • 異なるパラメータで戦略のパフォーマンスをテストし,最適なパラメータを探します.
  • 戦略を自動的に最適化するための機械学習アルゴリズムを組み込むことができます.
  • 戦略の安定性を高めるために,より多くの要素とフィルターを追加できます.

要約する

この戦略は,全体として,典型的な中長線トレンド追跡戦略である. 多重条件のフィルタリング,入場出場のタイミングを厳格に制御し,トレンド取引方法を採用することで,不要な取引を減らすことができ,市場の中長線トレンドを捕捉することができる. この戦略の最適化スペースは大きく,パラメータ調整,より多くの補助ツールを追加することによって,戦略の安定性と収益性をさらに向上させることができる.

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

//Noro
//2018

//@version=3
strategy("Noro's Bollinger Strategy v1.4", shorttitle = "Bollinger str 1.4", overlay = true )

//Settings
needlong = input(true, defval = true, title = "Long")
needshort = input(false, defval = false, title = "Short")

length = input(20, defval = 20, minval = 1, maxval = 1000, title = "Bollinger Length")
mult = input(1, defval = 1, minval = 0.001, maxval = 50, title = "Bollinger Mult")
source = input(ohlc4, defval = ohlc4, title = "Bollinger Source")

usebf = input(true, defval = true, title = "Use body-filter")
usecf = input(true, defval = true, title = "Use color-filter")
userf = input(true, defval = true, title = "Use RSI-filter")

fromyear = input(1900, defval = 1900, minval = 1900, maxval = 2100, title = "From Year")
toyear = input(2100, defval = 2100, minval = 1900, maxval = 2100, title = "To Year")
frommonth = input(01, defval = 01, minval = 01, maxval = 12, title = "From Month")
tomonth = input(12, defval = 12, minval = 01, maxval = 12, title = "To Month")
fromday = input(01, defval = 01, minval = 01, maxval = 31, title = "From day")
today = input(31, defval = 31, minval = 01, maxval = 31, title = "To day")
showbands = input(true, defval = true, title = "Show Bollinger Bands")

//Bollinger Bands
basis = sma(source, length)
dev = mult * stdev(source, length)
upper = basis + dev
lower = basis - dev

//Lines
col = showbands ? black : na 
plot(upper, linewidth = 1, color = col)
plot(basis, linewidth = 1, color = col)
plot(lower, linewidth = 1, color = col)

//Body filter
nbody = abs(close - open)
abody = sma(nbody, 10)
body = nbody > abody / 2 or usebf == false

//Color filter
bar = close > open ? 1 : close < open ? -1 : 0 
gb = bar == 1 or usecf == false
rb = bar == -1 or usecf == false

//RSI Filter
fastup = rma(max(change(close), 0), 7)
fastdown = rma(-min(change(close), 0), 7)
rsi = fastdown == 0 ? 100 : fastup == 0 ? 0 : 100 - (100 / (1 + fastup / fastdown))
ursi = rsi > 70 or userf == false
drsi = rsi < 30 or userf == false

//Signals
up = close <= lower and rb and body and drsi and (close < strategy.position_avg_price or strategy.position_size == 0)
dn = close >= upper and gb and body and ursi and (close > strategy.position_avg_price or strategy.position_size == 0)
exit = ((strategy.position_size > 0 and close > open) or (strategy.position_size < 0 and close < open)) and body

//Trading
if up
    strategy.entry("Long", strategy.long, needlong == false ? 0 : na)

if dn
    strategy.entry("Short", strategy.short, needshort == false ? 0 : na)
    
if  exit
    strategy.close_all()