Основная идея этой стратегии заключается в том, чтобы объединить уровни поддержки/сопротивления и прорывы объема для определения сигналов входа и использовать индикатор ATR для динамической корректировки стоп-лосса для получения прибыли, чтобы получить больше потенциальной прибыли.
Стратегия состоит из следующих основных логических принципов:
Используйте ta.pivothigh и ta.pivotlow для расчета максимальной цены предыдущих свечей L_Bars и самой низкой цены предыдущих свечей R_Bars в качестве уровней сопротивления и поддержки.
Когда цена закрытия пересекает уровень сопротивления, а объем превышает порог объемного диапазона, перейти на длинный.
После длинного входа, установите стоп-лосс на close-ATR_LO. После короткого входа, установите стоп-лосс на close+ATR_SH. Это реализует динамическое регулирование стоп-лосса.
Принимать только первый сигнал в течение торгового времени (0915-1445) каждый день.
Использовать теорию поддержки/сопротивления в сочетании с индикатором объема для улучшения точности входа.
Последующая остановка потерь на основе ATR может гибко регулировать уровень остановки на основе волатильности рынка, снижая вероятность восстановления прибыли.
Соответствующий контроль над ежедневным временем торговли и риском по сделке помогает улавливать тенденцию и избегать чрезмерного стоп-лосса.
Уровни поддержки/сопротивления могут потерпеть неудачу и не обеспечить эффективные сигналы входа.
Слишком высокий мультипликатор ATR может привести к тому, что остановка потерь будет слишком далеко, что увеличит риск потери.
Превышение порога объема может привести к упущению возможностей, а слишком высокое может привести к ложным сигналам.
Решения:
Настройка параметров поддержки/сопротивления на основе различных характеристик продукции.
Оптимизировать множитель ATR и пороговые параметры объема.
Добавьте другие индикаторы для подтверждения сигналов входа.
Добавьте другие показатели, такие как скользящие средние, чтобы помочь определить сигналы входа.
Оптимизировать такие параметры, как ATR мультипликатор и порог объема.
Использовать алгоритмы машинного обучения для реализации динамической оптимизации параметров.
Расширить стратегию на другие продукты, чтобы найти шаблоны параметров.
Стратегия интегрирует различные аналитические инструменты, применяя методы поддержки / сопротивления, объема и стоп-лосса, и достигла хороших результатов бэкстеста. Но в реальном трейдинге может существовать больше неопределенностей, что требует дальнейших улучшений, таких как оптимизация параметров и дополнительные индикаторы подтверждения входа, чтобы улучшить эффективность в реальном мире. В целом стратегия имеет четкую логику и легко понять, обеспечивая хороший справочный случай для количественных торговых стратегий.
/*backtest start: 2024-01-03 00:00:00 end: 2024-01-10 00:00:00 period: 30m basePeriod: 15m exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}] */ // ____________ _________ _____________ // |____________| ||________| ||__________| // || ____ || || || ______ ________ _____ ________ // || | || || ||________|| | || || || || | || /\\ | // |______| || || |______| // || |===|| |=== ||__________ | || || || || |===|| /__\\ |=== || || \\ || // || | || ||___ || || |___|| ||___ ||___ || | || / \\ | \\ || || ___|| || // || ||________|| ||__________ // || ||________| ||__________| //@version=5 strategy("SUPPORT RESISTANCE STRATEGY [5MIN TF]",overlay=true ) L_Bars = input.int(defval = 10, minval = 1 , maxval = 50, step =1) R_Bars = input.int(defval = 15, minval = 1 , maxval = 50, step =1) volumeRange = input.int(20, title='Volume Break [threshold]', minval = 1) // ═══════════════════════════ // // ——————————> INPUT <——————— // // ═══════════════════════════ // EMA1 = input.int(title='PRICE CROSS EMA', defval = 150, minval = 10 ,maxval = 400) factor1 = input.float(title='_ATR LONG',defval = 3.2 , minval = 1 , maxval = 5 , step = 0.1, tooltip = "ATR TRAIL LONG") factor2 = input.float(title='_ATR SHORT',defval = 3.2 , minval = 1 , maxval = 5 , step = 0.1, tooltip = "ATR TRAIL SHORT") risk = input.float(title='RISK',defval = 200 , minval = 1 , maxval = 5000 , step = 50, tooltip = "RISK PER TRADE") var initialCapital = strategy.equity t = time(timeframe.period, '0915-1445:1234567') time_cond = not na(t) // ══════════════════════════════════ // // ———————————> EMA DATA <——————————— // // ══════════════════════════════════ // ema1 = ta.ema(close, EMA1) plot(ema1, color=color.new(color.yellow, 0), style=plot.style_linebr, title='ema1') // ══════════════════════════════════ // // ————————> TRAIL DATA <———————————— // // ══════════════════════════════════ // // *******Calculate LONG TRAIL data***** ATR_LO = ta.atr(14)*factor1 // *******Calculate SHORT TRAIL data***** ATR_SH = ta.atr(14)*factor2 long_trail = close - ATR_LO short_trail = close + ATR_SH // Plot atr data //plot(longStop, color=color.new(color.green, 0), style=plot.style_linebr, title='Long Trailing Stop') //plot(shortStop , color=color.new(color.red, 0), style=plot.style_linebr, title='Short Trailing Stop') // ══════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════ // // ————————————————————————————————————————————————————————> RESISTANCE/SUPPORT LEVELS DATA <————————————————————————————————————————————————————————————————————————————————————————————— // // ══════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════ // Resistance_pi = fixnan(ta.pivothigh(L_Bars, R_Bars)[1]) Support_pi = fixnan(ta.pivotlow(L_Bars, R_Bars)[1]) r1 = plot(Resistance_pi, color=ta.change(Resistance_pi) ? na : color.red, offset=-(R_Bars + 1),linewidth=2, title='RESISTANCE') s1 = plot(Support_pi, color=ta.change(Support_pi) ? na : color.green, offset=-(R_Bars + 1),linewidth=2, title='SUPPORT') //Volume vol_1 = ta.ema(volume, 5) vol_2 = ta.ema(volume, 10) osc_vol = 100 * (vol_1 - vol_2) / vol_2 // ══════════════════════════════════// // ————————> LONG POSITIONS <————————// // ══════════════════════════════════// //******barinstate.isconfirmed used to avoid repaint in real time******* if ( ta.crossover(close, Resistance_pi) and osc_vol > volumeRange and not(open - low > close - open) and strategy.opentrades==0 and barstate.isconfirmed and time_cond and close >= ema1 ) strategy.entry(id= "Long" ,direction = strategy.long, comment = "BUY") plot(long_trail , color=color.new(color.blue, 0), style=plot.style_linebr, title='long Stop') if strategy.position_size > 0 strategy.exit("long tsl", "Long" , stop = long_trail ,comment='SELL') // ═════════════════════════════════════// // ————————> SHORT POSITIONS <————————— // // ═════════════════════════════════════// if ( ta.crossunder(close, Support_pi) and osc_vol > volumeRange and not(open - close < high - open) and strategy.opentrades==0 and barstate.isconfirmed and time_cond and close <= ema1 ) strategy.entry(id = "Short" ,direction = strategy.short, comment = "SELL") if strategy.position_size < 0 strategy.exit("short tsl", "Short" , stop = short_trail ,comment='BUY') // ════════════════════════════════════════════════// // ————————> CLOSE ALL POSITIONS BY 3PM <————————— // // ════════════════════════════════════════════════// strategy.close_all(when = hour == 14 and minute == 55) // ════════════════════════════════════════// // ————————> MAX INTRADAY LOSS <————————— // // ════════════════════════════════════════// // strategy.risk.max_intraday_loss(type = strategy.cash, value = risk)