이것은 입구 신호로 볼링거 밴드 및 K-라인 형식을 모두 사용하는 트렌드 다음 전략입니다. 더 긴 시간 프레임에서 트렌드를 포착하는 것을 목표로 Forex 거래에 적합합니다.
이 전략은 가격 변동성을 나타내는 볼링거 밴드를 구축하고 과잉 구매/ 과잉 판매 수준을 식별합니다. 상위 또는 하위 밴드를 만지면 극단적 인 신호가됩니다. 특정 K-라인 패턴과 함께 시간 항목에 결합됩니다.
구체적으로, 긴 신호는 가격이 하위 대역 이상으로 깨지고 상승성 침몰 또는 긴 하위 그림자 촛불이 나타나면 발동됩니다. 짧은 신호는 가격이 상위 대역 이하로 깨지고 하위 침몰 또는 긴 상위 그림자 촛불이 나타나면 발동됩니다.
스톱 로스는 미리 설정된 가격 수준입니다. 가격이 볼링거 중간에 넘어가면 이윤을 취합니다.
이 전략은 트렌드와 인하 기회를 결합합니다. 볼링거 밴드는 트렌드와 과잉 확장을 식별합니다. K-라인 패턴은 재입시에 대한 신뢰성을 높이고 잘못된 브레이크오웃을 피합니다.
스톱 로스 및 취득 로직은 명확하고 위험 통제됩니다. 낮은 거래 빈도는 장기 보유에 적합합니다.
가장 큰 위험은 트렌드를 파악하지 못하거나 윙사 (Whipsaws) 가 발생한다는 것입니다.
또한 이윤은 중간선을 넘어서기 때문에 이른 또는 늦은 출구가 발생할 수 있습니다.
매개 변수 선택의 개선, 더 신뢰할 수 있는 촛불 패턴을 식별하거나 변동성에 기반한 적응 수익 목표가 최적화에 도움이 될 수 있습니다.
다른 지표를 통합하여 전체 주기의 추세를 측정하고, 역 추세를 피합니다. 또는 최적의 매개 변수 조합을 찾기 위해 기계 학습 모델을 사용합니다.
이윤을 취하는 것은 수익을 극대화하기 위해 후속 정지 또는 변동성 기반 출구에 적응할 수 있습니다.
이것은 볼링거 밴드 및 촛불 기법에 기반한 전략을 따르는 더 긴 시간 프레임 트렌드입니다. 신뢰성과 수익성을 가진 기본 전략으로 괜찮게 작동하지만 견고성을 향상시키기 위해 지속적인 테스트와 조정이 필요합니다.
/*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)