
この戦略は,双波帯の指標を用いて,収束区域を識別し,突破戦略と合わせて,低買い高売りを実現する取引戦略である. 価格が中立区を突破すると,価格が新しいトレンドを開始し始めたことを示し,入場が多くなされる.価格が中立区を再び破ると,価格トレンドが終了し,平仓する.
この策略は2つのブリン帯を使用する.内層ブリン帯の上下軌は20日単調移動平均線±1倍標準差;外層ブリン帯の上下軌は20日単調移動平均線±2倍標準差である.価格が内外ブリン帯の間にあるとき,中立区として定義される.
価格が連続した2つのK線が中立区域にあるとき,収束状態にあると考えられる.価格が連続した2つのK線を収束した後に,第3のK線の閉盘価格がネブリン帯を上線したときに,多行シグナルが生成される.
利回りとリスク管理のために,最低価格の2倍ATRでストップ・ローンを設定し,価格が内ブリン帯線上線を下回ると平仓する.
この戦略は,指標とトレンドの2つの要素を組み合わせて,収束領域を識別し,価格が新しいトレンドのラウンドを起動したかどうかを判断することができ,低買い高売りを実現し,収益の余地が大きい.止損戦略は,利益をロックし,リスクを制御することができ,戦略の安定性が高くなります.
この戦略は,価格がブリン帯を突破して軌道上に形成される多信号に依存し,偽の突破が発生した場合,誤差と損失が生じます. さらに,ストップポイントがあまりにも近づくと,秒でストップされる可能性があります.
ブリン帯のパラメータを最適化したり,フィルタリング条件を増やしたりなど,偽突破の確率を減らすことができる.また,適切な止損点を緩め,十分なスペースを確保することができる.
この戦略は,双波帯の指標とトレンド戦略を統合し,低買い高売りを実現し,利益の余地が大きい.同時に,ストップ・ロスト戦略は,戦略をより安定的にする.さらなる最適化により,戦略の効果を向上させることができ,実地での検証に値する.
/*backtest
start: 2022-12-06 00:00:00
end: 2023-12-12 00:00:00
period: 1d
basePeriod: 1h
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/
// © DojiEmoji
//@version=4
strategy("[KL] Double BB Strategy",overlay=true,pyramiding=1)
ENUM_LONG = "LONG"
// Timeframe {
backtest_timeframe_start = input(defval = timestamp("01 Apr 2020 13:30 +0000"), title = "Backtest Start Time", type = input.time)
USE_ENDTIME = input(false,title="Define backtest end-time (If false, will test up to most recent candle)")
backtest_timeframe_end = input(defval = timestamp("19 Apr 2021 19:30 +0000"), title = "Backtest End Time (if checked above)", type = input.time)
within_timeframe = true
// }
// Bollinger bands
BOLL_length = 20, BOLL_src = close, SMA20 = sma(BOLL_src, BOLL_length)
BOLL_sDEV = stdev(BOLL_src, BOLL_length)
BOLL_upper1 = SMA20 + BOLL_sDEV, BOLL_lower1 = SMA20 - BOLL_sDEV
BOLL_upper2 = SMA20 + BOLL_sDEV*2, BOLL_lower2 = SMA20 - BOLL_sDEV*2
SMA_20_plot = plot(SMA20, "Basis", color=#872323, offset = 0)
BOLL_upper1_plot = plot(BOLL_upper1, "BOLL Upper1", color=color.navy, offset = 0, transp=50)
BOLL_lower1_plot = plot(BOLL_lower1, "BOLL Lower1", color=color.navy, offset = 0, transp=50)
BOLL_upper2_plot = plot(BOLL_upper2, "BOLL Upper2", color=color.navy, offset = 0, transp=50)
BOLL_lower2_plot = plot(BOLL_lower2, "BOLL Lower2", color=color.navy, offset = 0, transp=50)
fill(BOLL_upper2_plot, BOLL_upper1_plot, title = "Background", color=#198787, transp=85)
fill(BOLL_upper1_plot, SMA_20_plot, title = "Background", color=#198787, transp=75)
fill(SMA_20_plot, BOLL_lower1_plot, title = "Background", color=#198787, transp=75)
fill(BOLL_lower1_plot, BOLL_lower2_plot, title = "Background", color=#198787, transp=85)
// Trailing stop loss {
ATR_X2_TSL = atr(input(14,title="Length of ATR for trailing stop loss")) * input(2.0,title="ATR Multiplier for trailing stop loss",type=input.float)
TSL_source = low
var stop_loss_price = float(0)
TSL_line_color = color.green, TSL_transp = 100
if strategy.position_size == 0 or not within_timeframe
TSL_line_color := color.black
stop_loss_price := TSL_source - ATR_X2_TSL
else if strategy.position_size > 0
stop_loss_price := max(stop_loss_price, TSL_source - ATR_X2_TSL)
TSL_transp := 0
plot(stop_loss_price, color=color.new(TSL_line_color, TSL_transp))
// }
// Signals for entry
is_neutral = close < BOLL_upper1 and close > BOLL_lower2
is_consol = is_neutral and is_neutral[2]
entry_signal = is_consol[1] and close > BOLL_upper1
// MAIN:
if within_timeframe
// EXIT ::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
exit_msg = close <= strategy.position_avg_price ? "stop loss" : "take profit"
end_of_rally = close < BOLL_upper1 and strategy.position_avg_price > stop_loss_price // also detects false breakouts
if strategy.position_size > 0 and (TSL_source <= stop_loss_price or end_of_rally)
strategy.close(ENUM_LONG, comment=exit_msg)
// ENTRY :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
if (strategy.position_size == 0 or (strategy.position_size > 0 and close > stop_loss_price)) and entry_signal
entry_msg = strategy.position_size > 0 ? "adding" : "initial"
strategy.entry(ENUM_LONG, strategy.long, comment=entry_msg)
// CLEAN UP:
if strategy.position_size == 0
stop_loss_price := float(0)