
Стратегия представляет собой высокотехнологичную торговую систему, основанную на многократном анализе временных циклов, которая используется для захвата рыночных возможностей для переворота путем выявления ключевых точек на более высоких временных периодах. Стратегия сочетает в себе динамический процентный механизм стоп-стоп, эффективно контролирующий риски и одновременно стремящийся к стабильной прибыли. Система также включает в себя управление интервалом торгов и тестирование временного диапазона, что делает ее более подходящей для реальной торговой среды.
Основная логика стратегии основана на следующих ключевых элементах:
Стратегия обеспечивает целостную структуру торговой системы с помощью многочасового анализа и динамического управления рисками. Хотя есть некоторые места, где требуется оптимизация, общая концепция дизайна является разумной и имеет хорошую практичность. С помощью рекомендуемой направленности оптимизации стратегия может быть более стабильной в различных рыночных условиях.
/*backtest
start: 2025-01-01 00:00:00
end: 2025-01-31 23:59:59
period: 1h
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/
//@version=6
strategy("Pivot Reversal Strategy with MTF TP & SL in Percent and Test Range", overlay=true)
// Входные параметры
higher_tf = input.timeframe("60", title="Higher Timeframe for Breakout Check") // Таймфрейм для анализа пробоя
leftBars = input(4, title="Left Bars")
rightBars = input(2, title="Right Bars")
TP_percent = input.float(1.0, title="Take Profit (%)", minval=0.1, step=0.1) // Тейк-профит в процентах
SL_percent = input.float(0.5, title="Stop Loss (%)", minval=0.1, step=0.1) // Стоп-лосс в процентах
trade_interval = input.int(1440, title="Minimum Time Between Trades (Minutes)") // Интервал между сделками
// Диапазон тестирования (используем UNIX timestamps)
start_date = input(timestamp("2023-01-01 00:00 +0000"), title="Start Date") // Стартовая дата для тестирования
end_date = input(timestamp("2023-12-31 23:59 +0000"), title="End Date") // Конечная дата для тестирования
// Проверка, попадает ли текущая свеча в указанный диапазон времени
in_test_range = true
// Определение пивотов на более крупном таймфрейме
higher_tf_high = request.security(syminfo.tickerid, higher_tf, ta.pivothigh(leftBars, rightBars))
higher_tf_low = request.security(syminfo.tickerid, higher_tf, ta.pivotlow(leftBars, rightBars))
// Последнее время открытия сделки
var float last_trade_time = na
// Логика для лонга
swh_cond = not na(higher_tf_high)
hprice = 0.0
hprice := swh_cond ? higher_tf_high : hprice[1]
le = false
le := swh_cond ? true : (le[1] and high > hprice ? false : le[1])
if le and in_test_range and (na(last_trade_time) or (time - last_trade_time >= trade_interval * 60 * 1000))
tp_price_long = hprice * (1 + TP_percent / 100) // Тейк-профит в процентах
sl_price_long = hprice * (1 - SL_percent / 100) // Стоп-лосс в процентах
strategy.entry("PivRevLE", strategy.long, stop=hprice + syminfo.mintick)
strategy.exit("TP_SL_Long", from_entry="PivRevLE",
limit=tp_price_long,
stop=sl_price_long)
last_trade_time := time
// Логика для шорта
swl_cond = not na(higher_tf_low)
lprice = 0.0
lprice := swl_cond ? higher_tf_low : lprice[1]
se = false
se := swl_cond ? true : (se[1] and low < lprice ? false : se[1])
if se and in_test_range and (na(last_trade_time) or (time - last_trade_time >= trade_interval * 60 * 1000))
tp_price_short = lprice * (1 - TP_percent / 100) // Тейк-профит в процентах
sl_price_short = lprice * (1 + SL_percent / 100) // Стоп-лосс в процентах
strategy.entry("PivRevSE", strategy.short, stop=lprice - syminfo.mintick)
strategy.exit("TP_SL_Short", from_entry="PivRevSE",
limit=tp_price_short,
stop=sl_price_short)
last_trade_time := time
// Для наглядности отображаем уровни на графике
plot(le and in_test_range ? hprice * (1 + TP_percent / 100) : na, color=color.green, title="Long Take Profit")
plot(le and in_test_range ? hprice * (1 - SL_percent / 100) : na, color=color.red, title="Long Stop Loss")
plot(se and in_test_range ? lprice * (1 - TP_percent / 100) : na, color=color.green, title="Short Take Profit")
plot(se and in_test_range ? lprice * (1 + SL_percent / 100) : na, color=color.red, title="Short Stop Loss")