이 전략은 양적 거래에 대한 과판 기회와 트렌드 반전을 식별하기 위해 볼링거 밴드와 MACD 지표를 결합합니다. 전략 이름은
이 전략은 먼저 중간 밴드, 상부 밴드 및 하부 밴드를 포함한 20 일간의 볼링거 밴드를 계산합니다. 가격이 하부 밴드에 닿을 때, 그것은 시장을 과판된 것으로 간주합니다. 이 시점에서 트렌드가 역전되고 있는지 판단하기 위해 MACD 지표와 결합합니다. MACD 히스토그램이 신호 라인 위에 긍정적으로 넘어가면 구매 신호에 해당하는 이 하락 라운드의 끝을 결정합니다.
구체적으로 볼린거 하위 대역과 MACD 히스토그램 교차 신호 라인을 만지면 구매 신호가 동시에 긍정적으로 발동됩니다. 닫기 가격이 스톱 로스 수준을 넘으면 수익 신호가 발동됩니다.
이 전략은 과잉 판매 구역과 MACD를 판단하기 위해 볼링거 밴드를 통합하여 트렌드 반전 신호를 결정하여 상대적으로 낮은 입시 가격을 실현합니다. 이윤을 확보하고 손실을 피하기 위해 수익을 취하는 방법도 포함합니다.
특히 이점은 다음과 같습니다.
여전히 다음과 같은 측면에서 몇 가지 위험이 있습니다.
위의 위험으로부터 헤딩을 하기 위해 다음의 조치를 취할 수 있습니다.
아직은 더 많은 최적화를 위한 여지가 있습니다.
이 전략은 상대적으로 더 나은 입구점을 달성하기 위해 볼링거 밴드 과잉 판매 구역 판단과 MACD 트렌드 역전 지표를 통합합니다. 또한 위험을 제어하기 위해 스톱 로스 / 취득 방법을 설정합니다. 이것은 참조 및 최적화를위한 가치있는 낮은 구매 높은 판매 전략입니다. 더 많은 지표 필터와 기계 학습 방법과 결합하여 성능을 더 향상시킬 여지가 있습니다.
/*backtest start: 2023-11-19 00:00:00 end: 2023-12-19 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/ // © DojiEmoji //@version=4 strategy("[KL] BOLL + MACD Strategy v2 (published)",overlay=true) // BOLL bands { BOLL_length = 20 BOLL_src = close BOLL_mult = 2.0 BOLL_basis = sma(BOLL_src, BOLL_length) BOLL_dev = BOLL_mult * stdev(BOLL_src, BOLL_length) BOLL_upper = BOLL_basis + BOLL_dev BOLL_lower = BOLL_basis - BOLL_dev BOLL_offset = 0 plot(BOLL_basis, "Basis", color=#872323, offset = BOLL_offset) BOLL_p1 = plot(BOLL_upper, "Upper", color=color.navy, offset = BOLL_offset, transp=50) BOLL_p2 = plot(BOLL_lower, "Lower", color=color.navy, offset = BOLL_offset, transp=50) fill(BOLL_p1, BOLL_p2, title = "Background", color=#198787, transp=85) // } // MACD signals { MACD_fastLen = 12 MACD_slowLen = 26 MACD_Len = 9 MACD = ema(close, MACD_fastLen) - ema(close, MACD_slowLen) aMACD = ema(MACD, MACD_Len) MACD_delta = MACD - aMACD // } backtest_timeframe_start = input(defval = timestamp("01 Nov 2010 13:30 +0000"), title = "Backtest Start Time", type = input.time) //backtest_timeframe_end = input(defval = timestamp("05 Mar 2021 19:30 +0000"), title = "Backtest End Time", type = input.time) TARGET_PROFIT_MODE = input(false,title="Exit when Risk:Reward met") REWARD_RATIO = input(3,title="Risk:[Reward] (i.e. 3) for exit") // Trailing stop loss { var entry_price = float(0) ATR_multi_len = 26 ATR_multi = input(2, "ATR multiplier for stop loss") ATR_buffer = atr(ATR_multi_len) * ATR_multi risk_reward_buffer = (atr(ATR_multi_len) * ATR_multi) * REWARD_RATIO take_profit_long = low > entry_price + risk_reward_buffer take_profit_short = low < entry_price - risk_reward_buffer var bar_count = 0 //number of bars since entry var trailing_SL_buffer = float(0) var stop_loss_price = float(0) stop_loss_price := max(stop_loss_price, close - trailing_SL_buffer) // plot TSL line trail_profit_line_color = color.green if strategy.position_size == 0 trail_profit_line_color := color.blue stop_loss_price := low plot(stop_loss_price,color=trail_profit_line_color) // } var touched_lower_bb = false if true// and time <= backtest_timeframe_end if low <= BOLL_lower touched_lower_bb := true else if strategy.position_size > 0 touched_lower_bb := false//reset state expected_rebound = MACD > MACD[1] and abs(MACD - aMACD) < abs(MACD[1] - aMACD[1]) buy_condition = touched_lower_bb and MACD > aMACD or expected_rebound //ENTRY: if strategy.position_size == 0 and buy_condition entry_price := close trailing_SL_buffer := ATR_buffer stop_loss_price := close - ATR_buffer strategy.entry("Long",strategy.long, comment="buy") bar_count := 0 else if strategy.position_size > 0 bar_count := bar_count + 1 //EXIT: // Case (A) hits trailing stop if strategy.position_size > 0 and close <= stop_loss_price if close > entry_price strategy.close("Long", comment="take profit [trailing]") stop_loss_price := 0 else if close <= entry_price and bar_count strategy.close("Long", comment="stop loss") stop_loss_price := 0 bar_count := 0 // Case (B) take targeted profit relative to risk if strategy.position_size > 0 and TARGET_PROFIT_MODE if take_profit_long strategy.close("Long", comment="take profits [risk:reward]") stop_loss_price := 0 bar_count := 0