ボリンジャーバンドとK線組み合わせ戦略

作者: リン・ハーンチャオチャン開催日:2024年1月15日 (火) 14時30分
タグ:

img

概要

これはトレンドフォロー戦略で,ボリンジャーバンドとK線の両方をエントリー信号として使用する.これは,より長い時間枠におけるトレンドを把握することを目的とし,外為取引に適しています.

戦略の論理

この戦略は,価格変動を表現し,過買い/過売りレベルを特定するためにボリンジャーバンドを構築する.上または下帯に触ると極端な信号が表示されます.特定のK線パターンと時間エントリを組み合わせます.

具体的には,価格が下帯を超えて上昇し,上昇し,高値が上昇し,下帯を超えて上昇し,低値が上昇し,低値が上昇し,低値が上昇し,低値が上昇し,低値が上昇し,低値が上昇し,低値が上昇し,低値が上昇し,低値が上昇し,低値が上昇し,低値が上昇し,低値が上昇し,低値が上昇し,低値が上昇し,低値が上昇し,低値が上昇し,低値が上昇し,低値が上昇し,低値が上昇し,低値が上昇し,低値が上昇し,低値が上昇し,低値が上昇し,低値が上昇し,低値が上昇し,低値が上昇し,低値が上昇し,低値が上昇し,低値が上昇し,低値が上昇し,低値が上昇し,低値が上昇し,低値が上昇し,低値が上昇し,低値が上昇し,低値が上昇し,低値が上昇し,低値が上昇

ストップ・ロスは,前もって設定された価格レベルです. 価格がボリンジャー・バンドを横切ったときに,出口から利益を得ます.

利点分析

この戦略は,トレンドと引き下げの機会を組み合わせます.ボリンジャー帯はトレンドと過剰拡張を識別します.K線パターンは再入入りの信頼性を高め,偽のブレイクを避ける.

ストップ・ロストとテイク・プロフィートの論理は明確で リスク制御です 低取引頻度は長期保有に適しています

リスク分析

ストップ・ロスの連続的なヒットが起こる可能性が高い.

利益は中間線を越えることによって決まるので 早期か遅めの出口が起こる可能性があります

パラメータの選択を改善し,より信頼性の高いキャンドルスタイクパターンを特定したり,波動性に基づく適応性のある利益目標を設定することで,最適化できるかもしれません.

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

逆トレンド取引を避け,全体的なサイクル傾向を測定するために他の指標を組み込む. または最適なパラメータ組み合わせを見つけるために機械学習モデルを使用します.

利潤を最大化するために 遅延停止や不安定性ベースの出口に適応できます

概要

これは,ボリンジャー帯とキャンドルスティック技術に基づく戦略を伴うより長い時間枠の傾向です.信頼性と収益性のある基本的な戦略として立派に機能しますが,安定性を向上させるために継続的なテストと調整が必要です.


/*backtest
start: 2024-01-07 00:00:00
end: 2024-01-14 00:00:00
period: 3m
basePeriod: 1m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=4
strategy("BB策略", overlay=true)
length = input(20, minval=1)
src = input(close, title="Source")
mult = input(2.0, minval=0.001, maxval=50, title="StdDev")
basis = sma(src, length)
dev = mult * stdev(src, length)
upper = basis + dev
lower = basis - dev
offset = input(0, "Offset", type = input.integer, minval = -500, maxval = 500)
plot(basis, "Basis", color=#872323, offset = offset)
p1 = plot(upper, "Upper", color=color.teal, offset = offset)
p2 = plot(lower, "Lower", color=color.teal, offset = offset)
fill(p1, p2, title = "Background", color=#198787, transp=95)
diff=upper-lower
//plot(upper*0.9985, "Upper", color=color.white, offset = offset)
//plot(lower*1.0015, "Lower", color=color.white, offset = offset)

//Engulfing Candles
openBarPrevious = open[1]
closeBarPrevious = close[1]
openBarCurrent = open
closeBarCurrent = close
//If current bar open is less than equal to the previous bar close AND current bar open is less than previous bar open AND current bar close is greater than previous bar open THEN True
bullishEngulfing = openBarCurrent <= closeBarPrevious and openBarCurrent < openBarPrevious and 
   closeBarCurrent > openBarPrevious
//If current bar open is greater than equal to previous bar close AND current bar open is greater than previous bar open AND current bar close is less than previous bar open THEN True
bearishEngulfing = openBarCurrent >= closeBarPrevious and openBarCurrent > openBarPrevious and 
   closeBarCurrent < openBarPrevious
//bullishEngulfing/bearishEngulfing return a value of 1 or 0; if 1 then plot on chart, if 0 then don't plot
//plotshape(bullishEngulfing, style=shape.triangleup, location=location.belowbar, color=color.green, size=size.tiny)
//plotshape(bearishEngulfing, style=shape.triangledown, location=location.abovebar, color=color.red, size=size.tiny)
//alertcondition(bullishEngulfing, title="Bullish Engulfing", message="[CurrencyPair] [TimeFrame], Bullish candle engulfing previous candle")
//alertcondition(bearishEngulfing, title="Bearish Engulfing", message="[CurrencyPair] [TimeFrame], Bearish candle engulfing previous candle")

//Long Upper Shadow - Bearish
C_Len = 14 // ema depth for bodyAvg
C_ShadowPercent = 5.0 // size of shadows
C_ShadowEqualsPercent = 100.0
C_DojiBodyPercent = 5.0
C_Factor = 2.0 // shows the number of times the shadow dominates the candlestick body
C_BodyHi = max(close, open)
C_BodyLo = min(close, open)
C_Body = C_BodyHi - C_BodyLo
C_BodyAvg = ema(C_Body, C_Len)
C_SmallBody = C_Body < C_BodyAvg
C_LongBody = C_Body > C_BodyAvg
C_UpShadow = high - C_BodyHi
C_DnShadow = C_BodyLo - low
C_HasUpShadow = C_UpShadow > C_ShadowPercent / 100 * C_Body
C_HasDnShadow = C_DnShadow > C_ShadowPercent / 100 * C_Body
C_WhiteBody = open < close
C_BlackBody = open > close
C_Range = high-low
C_IsInsideBar = C_BodyHi[1] > C_BodyHi and C_BodyLo[1] < C_BodyLo
C_BodyMiddle = C_Body / 2 + C_BodyLo
C_ShadowEquals = C_UpShadow == C_DnShadow or (abs(C_UpShadow - C_DnShadow) / C_DnShadow * 100) < C_ShadowEqualsPercent and (abs(C_DnShadow - C_UpShadow) / C_UpShadow * 100) < C_ShadowEqualsPercent
C_IsDojiBody = C_Range > 0 and C_Body <= C_Range * C_DojiBodyPercent / 100
C_Doji = C_IsDojiBody and C_ShadowEquals
patternLabelPosLow = low - (atr(30) * 0.6)
patternLabelPosHigh = high + (atr(30) * 0.6)
C_LongUpperShadowBearishNumberOfCandles = 1
C_LongShadowPercent = 75.0
C_LongUpperShadowBearish = C_UpShadow > C_Range/100*C_LongShadowPercent
//alertcondition(C_LongUpperShadowBearish, title = "Long Upper Shadow", message = "New Long Upper Shadow - Bearish pattern detected.")
//if C_LongUpperShadowBearish
//    var ttBearishLongUpperShadow = "Long Upper Shadow\nTo indicate buyer domination of the first part of a session, candlesticks will present with long upper shadows, as well as short lower shadows, consequently raising bidding prices."
//    label.new(bar_index, patternLabelPosHigh, text="LUS", style=label.style_label_down, color = color.red, textcolor=color.white, tooltip = ttBearishLongUpperShadow)
//gcolor(highest(C_LongUpperShadowBearish?1:0, C_LongUpperShadowBearishNumberOfCandles)!=0 ? color.red : na, offset=-(C_LongUpperShadowBearishNumberOfCandles-1))

C_Len1 = 14 // ema depth for bodyAvg
C_ShadowPercent1 = 5.0 // size of shadows
C_ShadowEqualsPercent1 = 100.0
C_DojiBodyPercent1 = 5.0
C_Factor1 = 2.0 // shows the number of times the shadow dominates the candlestick body

C_BodyHi1 = max(close, open)
C_BodyLo1 = min(close, open)
C_Body1 = C_BodyHi1 - C_BodyLo1
C_BodyAvg1 = ema(C_Body1, C_Len1)
C_SmallBody1 = C_Body1 < C_BodyAvg1
C_LongBody1 = C_Body1 > C_BodyAvg1
C_UpShadow1 = high - C_BodyHi1
C_DnShadow1 = C_BodyLo1 - low
C_HasUpShadow1 = C_UpShadow1 > C_ShadowPercent1 / 100 * C_Body1
C_HasDnShadow1 = C_DnShadow1 > C_ShadowPercent1 / 100 * C_Body1
C_WhiteBody1 = open < close
C_BlackBody1 = open > close
C_Range1 = high-low
C_IsInsideBar1 = C_BodyHi1[1] > C_BodyHi1 and C_BodyLo1[1] < C_BodyLo1
C_BodyMiddle1 = C_Body1 / 2 + C_BodyLo1
C_ShadowEquals1 = C_UpShadow1 == C_DnShadow1 or (abs(C_UpShadow1 - C_DnShadow1) / C_DnShadow1 * 100) < C_ShadowEqualsPercent1 and (abs(C_DnShadow1 - C_UpShadow1) / C_UpShadow1 * 100) < C_ShadowEqualsPercent1
C_IsDojiBody1 = C_Range1 > 0 and C_Body1 <= C_Range1 * C_DojiBodyPercent1 / 100
C_Doji1 = C_IsDojiBody1 and C_ShadowEquals1

patternLabelPosLow1 = low - (atr(30) * 0.6)
patternLabelPosHigh1 = high + (atr(30) * 0.6)

C_LongLowerShadowBullishNumberOfCandles1 = 1
C_LongLowerShadowPercent1 = 75.0
C_LongLowerShadowBullish1 = C_DnShadow1 > C_Range1/100*C_LongLowerShadowPercent1
//alertcondition1(C_LongLowerShadowBullish1, title = "Long Lower Shadow", message = "New Long Lower Shadow - Bullish pattern detected.")

// Make input options that configure backtest date range
startDate = input(title="Start Date", type=input.integer,
     defval=1, minval=1, maxval=31)
startMonth = input(title="Start Month", type=input.integer,
     defval=1, minval=1, maxval=12)
startYear = input(title="Start Year", type=input.integer,
     defval=2018, minval=1800, maxval=2100)
endDate = input(title="End Date", type=input.integer,
     defval=1, minval=1, maxval=31)
endMonth = input(title="End Month", type=input.integer,
     defval=11, minval=1, maxval=12)
endYear = input(title="End Year", type=input.integer,
     defval=2030, minval=1800, maxval=2100)
// Look if the close time of the current bar
// falls inside the date range
inDateRange = true
     
//多單
if ((bullishEngulfing or C_LongLowerShadowBullish1) and inDateRange and cross(low,lower))
    strategy.entry("L", strategy.long, qty=1,stop=(low[1]))
//strategy.close("L",comment = "L exit",when=cross(basis,close),qty_percent=50)
if crossunder(close,upper*0.9985)
    strategy.close("L",comment = "L exit",qty_percent=1)

//空單
if (((bullishEngulfing == 0) or C_LongUpperShadowBearish) and inDateRange and cross(close,upper))
    strategy.entry("S", strategy.short,qty= 1,stop=(high[1]))
//strategy.close("S",comment = "S exit",when=cross(basis,close),qty_percent=50)
if crossunder(lower*1.0015,close)
    strategy.close("S",comment = "S exit",qty_percent=1)


もっと