В этой статье в основном описывается торговая стратегия, которая сочетает в себе индекс относительной силы (RSI) и уровни ретракциона Фибоначчи. Стратегия сначала рассчитывает ключевые уровни ретракциона Фибоначчи на основе исторической динамики цен за определенный период, а затем использует индикатор RSI для оценки того, является ли рынок перекупленным или перепроданным вблизи уровней ретракциона для генерации торговых сигналов.
Основными принципами этой стратегии являются:
Использовать данные о ценах за определенный период (например, 200 бар) для расчета медианной цены, стандартного отклонения и ключевых уровней ретрекшемента Фибоначчи (например, 0,764) за этот период;
Когда цена приближается к верхнему или нижнему уровню ретрексера, используйте индикатор RSI для определения наличия условий перекупа или перепродажи вокруг этих уровней;
Если индикатор RSI показывает сигналы перекупленности или перепроданности, то вокруг уровней ретрексера будут генерироваться длинные или короткие сигналы;
Установите стоп-лосс и принимайте прибыль, чтобы закрыть позиции, когда цена превышает заданный уровень или когда происходит стоп-лосс.
Выше приведены основные рабочие процессы для выявления торговых возможностей в этой стратегии.
По сравнению с использованием RSI или Фибоначчи в одиночку, эта комбинированная стратегия имеет следующие преимущества:
Двойная индикаторная фильтрация может уменьшить ложные сигналы и улучшить качество сигнала;
Торговля на уровнях ретрекшемента Фибоначчи является классическим методом технического анализа;
С помощью остановки потерь и получения прибыли в темпе, максимальный убыток за сделку может быть эффективно контролирован;
Параметры могут быть оптимизированы для различных периодов и продуктов.
Для этой стратегии также существуют некоторые риски:
Вероятность перехода на ключевые уровни не составляет 100%, необходимо сочетать с ценовым движением;
Однократный период RSI может генерировать ложные сигналы от отскоков мертвой кошки, рассмотрите многократную валидацию временных рамок;
Низкая настройка стоп-лосса может увеличивать потери;
Стопы могут быть выполнены во время волатильных колебаний цен.
Эти риски можно управлять путем настройки параметров, оптимизации комбинаций индикаторов и т.д.
К областям дальнейшей оптимизации относятся:
Добавить индикатор объема для предотвращения ложных прорывов при низком объеме;
Для сигналов от прорывов диапазона следует рассматривать полосы Боллинджера;
Создание моделей машинного обучения для автоматического обнаружения высококачественных торговых возможностей;
Использовать генетические алгоритмы для автоматической настройки параметров и корректировки уровней стоп-лосса/прибыли.
Эта статья подробно описывает количественную торговую стратегию, которая сочетает в себе анализ RSI и ретрецимента Фибоначчи. Сочетая анализ двойных индикаторов и классические технические стратегии, стратегия улучшает качество сигнала при управляемых рисках. Дальнейшие успехи могут быть достигнуты за счет постоянной настройки параметров и оптимизации модели.
/*backtest start: 2023-11-26 00:00:00 end: 2023-12-26 00:00:00 period: 1h basePeriod: 15m exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}] */ //@version=4 strategy(title="Gab Fib + RSI", overlay=true, default_qty_type=strategy.cash, default_qty_value=100000, initial_capital=1000, currency=currency.USD, commission_type=strategy.commission.cash_per_order, commission_value=4) // Inputs timeFilter = year >= 2000 // Stop Loss stop_loss = input(title="SL in % of Instrum. i.e 1.5%=150pips", minval=0, step=0.1, defval=1.5) /100 // RSI Inputs len = input(title="[RSI] Length", minval=0, step=1, defval=14) overSold = input(title="[RSI] Over Sold %", defval=30) overBought = input(title="[RSI] Over Bought %", defval=70) // Fibonacci Levels length = input(title="[Fibonacci] Length", defval=200, minval=1) src = input(hlc3, title="[Fibonacci] Source") mult = input(title="[Fibonacci] Multiplier", defval=3.0, minval=0.001, maxval=50) level = input(title="[Fibonacci] Level", defval=764) // Calculate Fibonacci basis = vwma(src, length) dev = mult * stdev(src, length) fu764= basis + (0.001*level*dev) fu1= basis + (1*dev) fd764= basis - (0.001*level*dev) fd1= basis - (1*dev) // Calculate RSI vrsi = rsi(close, len) // Calculate the Targets targetUp = fd764 targetDown = fu764 // Actual Targets bought = strategy.position_size[0] > strategy.position_size[1] exit_long = valuewhen(bought, targetUp, 0) sold = strategy.position_size[0] < strategy.position_size[1] exit_short = valuewhen(sold, targetDown, 0) // Calculate Stop Losses sl_long = close * (1-stop_loss) sl_short = close * (1+stop_loss) // Conditions to Open Trades openLong = low < fd1 and crossover(vrsi[1], overSold) openShort = high > fu1 and crossunder(vrsi[1], overBought) // Conditions to Close Trades closeLong = high > exit_long or sl_long closeShort = low < exit_short or sl_short //Rounding to MinTick value roundtargetUp = round_to_mintick(targetUp) roundtargetDown = round_to_mintick(targetDown) roundsllong = round_to_mintick(sl_long) roundslshort = round_to_mintick(sl_short) // Plots plot(basis, color=color.blue, linewidth=2, title="[Fibonacci Level] Basis") plot(fu764, color=color.white, linewidth=1, title="[Fibonacci Level] Short Target") plot(fu1, color=color.red, linewidth=2, title="[Fibonacci Level] Top") plot(fd764, color=color.white, linewidth=1, title="[Fibonacci Level] Long Target") plot(fd1, color=color.green, linewidth=2, title="[Fibonacci Level] Bottom") // Strategy Orders if timeFilter // Entry Orders strategy.entry(id="buy", long=true, when=openLong and high < targetUp, limit=close, alert_message="buy,"+tostring(syminfo.ticker)+",tp="+tostring(roundtargetUp)+",sl="+tostring(roundsllong)) strategy.entry(id="sell", long=false, when=openShort and low > targetDown, limit=close, alert_message="sell,"+tostring(syminfo.ticker)+",tp="+tostring(roundtargetDown)+",sl="+tostring(roundslshort)) // Exit Orders strategy.exit(id="closelong", when=closeLong and strategy.position_size > 0, limit=exit_long, stop=sl_long, alert_message="closelong,"+tostring(syminfo.ticker)) strategy.exit(id="closeshort", when=closeShort and strategy.position_size < 0, limit=exit_short, stop=sl_short, alert_message="closeshort,"+tostring(syminfo.ticker))