この戦略は,移動平均値,ボリンジャー帯とRSIを組み合わせて,価格動向と取引シグナルに対する過剰購入/過剰販売レベルを評価します. 精度を向上させるために複数の指標の強みを活用します.
戦略論理:
移動平均値とボリンジャー帯を計算して価格傾向を決定します.
RSIを計算して,買い過ぎ/売過ぎのレベルを特定します.
価格がBB下帯とRSI上昇クロスオーバーを超えるとロングに入ります.
ストップロスを使って,取引ごとに損失を制御する.
利点:
複数の指標による検証は 不良取引を減らす
RSIはMAsの限界を補完します.
BBは脱出レベルを特定する
リスク:
複数のパラメータを最適化するのに時間がかかる
RSIとBBの間の冗長性がある
脱出は失敗や逆転に易しい
要するに,この戦略は,MAs,BBsおよびRSIを組み合わせて,トレンドと逆転の取引機会の両方を特定します.複数の指標を使用することで結果が改善できますが,パラメータの最適化とリスク管理が必要です.
/*backtest start: 2023-08-13 00:00:00 end: 2023-09-12 00:00:00 period: 30m basePeriod: 15m 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/ // © LucasVivien //@version=4 strategy("MA Bolinger Bands + RSI ", shorttitle="MABB + RSI", overlay=true) // User input source = input(title="Price source" , type=input.source , defval=close) RSIlen = input(title="RSI Length" , type=input.integer , defval=6 , group="RSI") RSIlvlOB = input(title="RSI Overbough" , type=input.integer , defval=50 , group="RSI") RSIlvlOS = input(title="RSI Oversold" , type=input.integer , defval=50 , group="RSI") RSIN = input(title="RSI Neutral" , type=input.integer , defval=50 , group="RSI") MAlen = input(title="MA Length" , type=input.integer , defval=200 , group="MABB") BBlen = input(title="BB Length" , type=input.integer , defval=200 , group="MABB") BBmult = input(title="BB multiplier" , type=input.float , defval=2.0 , group="MABB" , tooltip="Set BB closer / appart", minval=0.001, maxval=50) MAtype = input(title="MA type" , type=input.string , defval="SMA", group="MABB" , tooltip="MA type used in BB", options=["SMA", "EMA", "HMA"]) //SLmult = input(title="SL value" ,type=input.float , defval=0.06) // Used indicators RSI = rsi(source, RSIlen) MA = sma(source, MAlen) if MAtype == "EMA" MA := ema(source, MAlen) if MAtype == "HMA" MA := hma(source, MAlen) // Perform Calculations BBdev = BBmult * stdev(source, BBlen) BBupper = MA + BBdev BBlower = MA - BBdev longSL = close - close * 0.06 shortSL = close + close * 0.06 // Signals validation ([0] is trade displayed from strategy() on chart => long/short entry) BBbull = (open < BBlower) and (close > BBlower) BBbear = (open > BBupper) and (close < BBupper) RSIbull = crossover(RSI , RSIN) RSIbear = crossunder(RSI, RSIN) Longsignal = (BBbull) and (RSIbull or RSIbull[1] or RSIbull[2] or RSIbull[3] or RSIbull[4] or RSIbull[5] or RSIbull[6] or RSIbull[7] or RSIbull[8] or RSIbull[9] or RSIbull[10]) Shortsignal = (BBbear) and (RSIbear or RSIbear[1] or RSIbear[2] or RSIbear[3] or RSIbear[4] or RSIbear[5] or RSIbear[6] or RSIbear[7] or RSIbear[8] or RSIbear[9] or RSIbear[10]) // Save SL values var SLlongsaved = 0.0 var SLshortsaved = 0.0 if Longsignal and (strategy.position_size == -1) /////////////////////////////// SLlongsaved := longSL if Shortsignal and (strategy.position_size == 1) //////////////////////////////// SLshortsaved := shortSL // Plots //plotshape(Longsignal , size=size.small, color=color.teal) //plotshape(Shortsignal, size=size.small, color=color.fuchsia) plot(Longsignal ? longSL : na, color=color.red, style=plot.style_linebr, linewidth=6) plot(Shortsignal ? shortSL : na, color=color.red, style=plot.style_linebr, linewidth=6) p1 = plot(BBupper,title="Bollinger Bands Upper Line", color=color.gray, transp=60) p2 = plot(BBlower,title="Bollinger Bands Lower Line", color=color.gray, transp=60) plot(MA, title="Bollinger Bands MA Basis Line" , color=color.white, transp=50) fill(p1, p2, color=color.white, transp=92) // Strategy Entry & Exit //if Longsignal strategy.entry(id="Long entry", long=true, when=Longsignal) //, oca_name="x", oca_type=strategy.oca.cancel) //if Shortsignal strategy.entry(id="Short entry", long=false, when=Shortsignal) //, oca_name="x", oca_type=strategy.oca.cancel) strategy.close(id="Long exit", when=strategy.position_size > 0)//, from_entry="Long entry" //, when=strategy.position_size > 0 // , stop=SLlongsaved) strategy.close(id="Short Exit", when=strategy.position_size < 0)//, from_entry="Short entry" //, when=strategy.position_size < 0 //, stop=SLshortsaved) plot(strategy.position_size) //////////////////////////////////////////////