Esta estrategia combina las bandas de Bollinger y el indicador MACD para identificar oportunidades de sobreventa e inversiones de tendencia para el comercio cuantitativo.
La estrategia primero calcula las bandas de Bollinger de 20 días, incluidas la banda media, la banda superior y la banda inferior. Cuando el precio toca la banda inferior, considera que el mercado está sobrevendido. En este punto, combina con el indicador MACD para juzgar si la tendencia se está revirtiendo. Si el histograma MACD cruza positivamente por encima de la línea de señal, determina el final de esta ronda de declive, que corresponde a la señal de compra.
Específicamente, tocar la banda inferior de Bollinger y la línea de señal de cruce del histograma MACD activa positivamente la señal de compra simultáneamente.
La estrategia integra bandas de Bollinger para juzgar la zona de sobreventa y el MACD para determinar las señales de inversión de tendencia, realizando un precio de entrada relativamente más bajo.
En particular, las ventajas son las siguientes:
Todavía existen algunos riesgos, principalmente en los siguientes aspectos:
Para protegernos de los riesgos mencionados anteriormente, podemos tomar las siguientes medidas:
Todavía hay espacio para una mayor optimización, incluida principalmente:
La estrategia integra el juicio de la zona de sobreventa de las bandas de Bollinger y el indicador de inversión de tendencia del MACD para lograr puntos de entrada relativamente mejores. También establece métodos de stop loss / take profit para controlar los riesgos. Esta es una estrategia de venta alta de compra baja que vale la pena para referirse y optimizar. Combinada con más filtros de indicadores y métodos de aprendizaje automático, todavía hay espacio para mejorar aún más su rendimiento.
/*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