この戦略は,トレンドをフォローするために二重移動平均ボリンジャーバンドに基づいて取引決定を行う.ボリンジャーバンドの上下レールの収束と離散を使用してトレンド変化を決定し,下下レールの近くで購入し,上下レールの近くで販売し,低価格で購入し,高価格で販売する.
この戦略は,単純なボリンジャー・バンドと強化されたボリンジャー・バンドの両方を適用します.
単純なボリンジャーバンドは中間のバンドの閉じる価格のSMAを使用し,強化されたボリンジャーバンドは閉じる価格のEMAを使用します.
上部と下部帯は,中部帯 ± N の標準偏差で計算される.
この戦略は,上と下の帯間のスプレッドに基づいてトレンドの強さを判断します.スプレッドが値を下回ると,トレンドをフォローするトレンド期間の始まりを示します.
ストップ・ロスは,ストップ・ストップの値が上昇し,ストップ・ロスは上昇し,ストップ・ロスは上昇し,ストップ・ロスは上昇し,ストップ・ロスは上昇し,ストップ・ロスは上昇し,ストップ・ロスは上昇し,ストップ・ロスは上昇し,ストップ・ロスは上昇し,ストップ・ロスは上昇し,ストップ・ロスは上昇し,ストップ・ロスは上昇し,ストップ・ロスは上昇し,ストップ・ロスは上昇し,ストップ・ロスは上昇し,ストップ・ロスは上昇し,ストップ・ロスは上昇し,ストップ・ロスは上昇し,ストップ・ロスは上昇し,ストップ・ロスは上昇し,ストップ・ロスは上昇し,ストップ・ロスは上昇し,ストップ・ロスは上昇し,ストップ・ロスは上昇し,ストップ・ロスは上昇し,ストップが上昇し,ストップ・ロスは上昇し,ストップが上昇し,ストップが上昇し,ストップが上昇し,ストップが上昇し,ストップが上昇し,スト
中間帯や上部帯の近くで閉じる場合です
損失を防ぐために 利潤で売るだけを選ぶこともできます
この戦略の利点は
シンプルなボリンジャーバンドと強化されたボリンジャーバンドを比較することで より効率的なバージョンを選択できます
スプレッドが狭くなると 傾向が強くなっていることを示します
固定パーセントストップ損失は,単一の取引損失を制御します. 中間または上部帯の近くで利益を得ます. トレイリングストップは,より多くの利益を得ます.
利益を得て売れば 損失が拡大しない
リスクには以下が含まれます.
トレンドが続くと 引き下げリスクがつきものです 連続した損失を精神的に耐えなければなりません
幅が広い場合,市場は横向きに回る可能性があります. 戦略は効果が少なくなります. 傾向が再開するまで取引を一時停止する必要があります.
ATRのストップのような 適度なストップが必要です
戦略は以下の点に最適化することができます.
異なるMA長さと標準偏差倍数をテストして,異なる市場に最適な組み合わせを見つけます.
ボリンジャー信号の上にMACD,KDのようなフィルターを追加して,ウィップソー市場での取引を減らします.
トレーリングストップの異なる方法をテストします. または,変動,ATRなどに基づいてストップ損失を最適化します.
取引ごとにポジションのサイズを最適化し 異なるアドオン戦略をテストします
この戦略は,デュアルボリンジャー帯の強みを組み合わせ,帯幅によるトレンド強さとトレンド中のトレードプルバックを判断する.また,リスクを制御するために適切なストップロスを設定する.パラメータ最適化やフィルターを追加することでさらなる改善が可能である.
/*backtest start: 2023-10-01 00:00:00 end: 2023-10-31 00:00:00 period: 1h 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/ // © JCGMarkets //@version=4 strategy("B.Bands | Augmented | Intra-range | Long-Only", shorttitle = "BB|A|IR|L", initial_capital=5000, commission_value=0.075, slippage = 1, overlay = true) //Technical Indicators Data show_simp = input(false, title="Trade on Simple Bollinger Bands ", type= input.bool, group="Select Strategy System") show_augm = input(true, title="Trade on Augmented Bollinger Bands", type= input.bool, group="Select Strategy System") periods = input(20, title="Periods for Moving Average", type =input.integer, minval = 2, step = 1, group="Technical Inputs") std = input(2, title="Std", type = input.float, minval=0.1 , step = 0.1, group="Technical Inputs") // Strategy data max_spread_bb = input(20000.0, title="Max Spread Tolerance Beetween Bands", type=input.float, step=0.1, group="Strategy Inputs") entry_source = input(close, title="Entry data source", type=input.source, group="Strategy Inputs") exit_source = input(high, title="Exit data source", type=input.source, group="Strategy Inputs") take_profit = input("middle", title = "Profit to band:", options = ["middle", "opposite"], group="Strategy Inputs") stop_loss = input(3.00, title="Stop Loss %", type=input.float, step=0.05, group="Strategy Inputs") trailing = input(false, title="Activate trailing stop?", type = input.bool, group="Strategy Inputs") stop_perc = input(6.00, title="Trailing %", type=input.float, step=0.125, group="Strategy Inputs") * 0.01 sell_profit = input(false, title="Only sell in profit (Stop Loss still active) ", type= input.bool, group="Strategy Inputs") var SL = 0.0 var SLT= 0.0 //Simple BB Calculation -> adapt if needed with different std for upper-lower, sma-ema, etc middle_sim = sma(close, periods) //Augmented BB Calculation -> adapt if needed with different std for upper lower, etc middle_augm = ema(close, periods) middle_upp = ema(high, periods) middle_low = ema(low, periods) //Multiplier dev = stdev(close, periods) * std //Upper & Lower Bands upper = (middle_sim + dev) lower = (middle_sim - dev) //Augmented Bands upper_augm = (middle_upp + dev) lower_augm = (middle_low - dev) //Bands Spread spread = upper - lower spread_augm = upper_augm - lower_augm //From date filter_from = input( true, title="===> From", group="Date Control") from_y = input( 2010, title = "from year", group="Date Control") from_m = input( 1, title = "from month", minval =1, maxval=12, group="Date Control") from_d = input( 1, title = "from day", minval=1, maxval=31, group="Date Control") //To date filter_to = input( true, title="===> To", group="Date Control") to_y = input( 2030, title = "To year", group="Date Control") to_m = input( 1, title = "To month", minval =1, maxval=12, group="Date Control") to_d = input( 1, title = "To day", minval=1, maxval=31, group="Date Control") // Date Condition In_date() => true in_position = strategy.position_size > 0 // Trailing stop SLT := if in_position and In_date() stop_inicial = entry_source * (1 - stop_perc) max(stop_inicial, SLT[1]) else 0 slts = (low <= SLT) and (trailing == true) //Essential Trade logics entry_long = (entry_source <= lower) and (spread < max_spread_bb) entry_long_augm = (entry_source <= lower_augm) and (spread_augm < max_spread_bb) // Simple Bollinger Conditions if (not in_position and show_simp and In_date()) if entry_long // Trigger buy order position_size = round( strategy.equity / close ) // All available equity for this strategy example strategy.entry("Entry", strategy.long, qty = position_size ) SL := close * (1 - (stop_loss / 100)) // You could determine wether or not implement stop loss with bool input and if condition here. if in_position and show_simp and not sell_profit and In_date() //Exits if not sell in profit if take_profit == "middle" strategy.exit("Target", "Entry", limit = middle_sim, stop = SL, comment="Exit") if take_profit == "opposite" strategy.exit("Target", "Entry", limit = upper, stop = SL, comment="Exit") if in_position and show_simp and sell_profit and In_date() //Exits if sell in profit if take_profit == "middle" strategy.exit("Target", "Entry", limit = (strategy.openprofit > 0 ? middle_sim: na), stop = SL, comment="Exit") if take_profit == "opposite" strategy.exit("Target", "Entry", limit = (strategy.openprofit > 0 ? upper: na), stop = SL, comment="Exit") if in_position and show_simp and slts and In_date() //Trailing activation strategy.close("Entry", comment="SLT") if not In_date() //Exit due out of date range strategy.close("Entry", comment="Out of date range") // Augmented Bollinger Conditions if (not in_position and show_augm and In_date()) if entry_long_augm // Trigger buy order position_size = round( strategy.equity / close ) strategy.entry("Entry_A", strategy.long, qty = position_size ) SL := close * (1 - (stop_loss / 100) ) if in_position and show_augm and not sell_profit and In_date() //Exits and not sell in profit if take_profit == "middle" strategy.exit("Target", "Entry_A", limit = middle_augm, stop = SL, comment="Exit") if take_profit == "opposite" strategy.exit("Target", "Entry_A", limit = upper_augm, stop = SL, comment="Exit") if in_position and show_augm and sell_profit and In_date() //Exit only in profit if take_profit == "middle" strategy.exit("Target", "Entry_A", limit = (strategy.openprofit > 0 ? middle_augm:na), stop = SL, comment="Exit") if take_profit == "opposite" strategy.exit("Target", "Entry_A", limit = (strategy.openprofit > 0 ? upper_augm: na) , stop = SL, comment="Exit") if in_position and show_augm and slts and In_date() //Trigger trailing strategy.close("Entry_A", comment="SLT") if not In_date() //Out of date trigger strategy.close("Entry_A", comment= "Out of date range") // Plotting plot(in_position ? SL > 0 ? SL : na : na , style = plot.style_circles, color = color.red, title = "Stop Loss") plot(in_position ? trailing ? SLT > 0 ? SLT : na : na : na , style = plot.style_circles, color = color.blue, title = "Trailing Stop" ) s = plot(show_simp ? upper : na , color = color.aqua) plot(show_simp ? middle_sim : na , color=color.red) i = plot(show_simp ? lower : na , color = color.aqua) fill(s,i, color=color.new(color.aqua,90)) plot(show_augm ? middle_augm : na , color=color.blue) s_a = plot( show_augm ? upper_augm : na, color=color.orange) i_a = plot( show_augm ? lower_augm : na, color= color.orange) fill(s_a,i_a, color=color.new(color.orange, 90))