戦略をフォローするデュアル移動平均ボリンガー帯のトレンド

作者: リン・ハーンチャオチャン,日付: 2023年11月1日 14:15:11
タグ:

img

概要

この戦略は,トレンドをフォローするために二重移動平均ボリンジャーバンドに基づいて取引決定を行う.ボリンジャーバンドの上下レールの収束と離散を使用してトレンド変化を決定し,下下レールの近くで購入し,上下レールの近くで販売し,低価格で購入し,高価格で販売する.

戦略の論理

この戦略は,単純なボリンジャー・バンドと強化されたボリンジャー・バンドの両方を適用します.

単純なボリンジャーバンドは中間のバンドの閉じる価格のSMAを使用し,強化されたボリンジャーバンドは閉じる価格のEMAを使用します.

上部と下部帯は,中部帯 ± N の標準偏差で計算される.

この戦略は,上と下の帯間のスプレッドに基づいてトレンドの強さを判断します.スプレッドが値を下回ると,トレンドをフォローするトレンド期間の始まりを示します.

ストップ・ロスは,ストップ・ストップの値が上昇し,ストップ・ロスは上昇し,ストップ・ロスは上昇し,ストップ・ロスは上昇し,ストップ・ロスは上昇し,ストップ・ロスは上昇し,ストップ・ロスは上昇し,ストップ・ロスは上昇し,ストップ・ロスは上昇し,ストップ・ロスは上昇し,ストップ・ロスは上昇し,ストップ・ロスは上昇し,ストップ・ロスは上昇し,ストップ・ロスは上昇し,ストップ・ロスは上昇し,ストップ・ロスは上昇し,ストップ・ロスは上昇し,ストップ・ロスは上昇し,ストップ・ロスは上昇し,ストップ・ロスは上昇し,ストップ・ロスは上昇し,ストップ・ロスは上昇し,ストップ・ロスは上昇し,ストップ・ロスは上昇し,ストップ・ロスは上昇し,ストップが上昇し,ストップ・ロスは上昇し,ストップが上昇し,ストップが上昇し,ストップが上昇し,ストップが上昇し,ストップが上昇し,スト

中間帯や上部帯の近くで閉じる場合です

損失を防ぐために 利潤で売るだけを選ぶこともできます

利点分析

この戦略の利点は

  1. 二重ボリンガー帯は効率を向上させる

シンプルなボリンジャーバンドと強化されたボリンジャーバンドを比較することで より効率的なバージョンを選択できます

  1. スプレッドはトレンド強さを判断する

スプレッドが狭くなると 傾向が強くなっていることを示します

  1. 柔軟な利益取りとストップ損失

固定パーセントストップ損失は,単一の取引損失を制御します. 中間または上部帯の近くで利益を得ます. トレイリングストップは,より多くの利益を得ます.

  1. 損失に対する保護メカニズム

利益を得て売れば 損失が拡大しない

リスク分析

リスクには以下が含まれます.

  1. 引き上げリスク

トレンドが続くと 引き下げリスクがつきものです 連続した損失を精神的に耐えなければなりません

  1. ワイプソーリスク

幅が広い場合,市場は横向きに回る可能性があります. 戦略は効果が少なくなります. 傾向が再開するまで取引を一時停止する必要があります.

  1. ストップ・ロスのリスク

ATRのストップのような 適度なストップが必要です

オプティマイゼーションの方向性

戦略は以下の点に最適化することができます.

  1. Bollinger Bands パラメータ

異なるMA長さと標準偏差倍数をテストして,異なる市場に最適な組み合わせを見つけます.

  1. フィルターを追加する

ボリンジャー信号の上にMACD,KDのようなフィルターを追加して,ウィップソー市場での取引を減らします.

  1. 利益取得とストップ損失

トレーリングストップの異なる方法をテストします. または,変動,ATRなどに基づいてストップ損失を最適化します.

  1. 資金管理

取引ごとにポジションのサイズを最適化し 異なるアドオン戦略をテストします

結論

この戦略は,デュアルボリンジャー帯の強みを組み合わせ,帯幅によるトレンド強さとトレンド中のトレードプルバックを判断する.また,リスクを制御するために適切なストップロスを設定する.パラメータ最適化やフィルターを追加することでさらなる改善が可能である.


/*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))

もっと