Эта стратегия сочетает в себе полосы Боллинджера и индикатор 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