Эта стратегия использует индикатор WaveTrend для определения ценовых тенденций и ситуаций перекупки/перепродажи.
Стратегия использует индикатор WaveTrend для определения направления ценового тренда. Индикатор WaveTrend улучшен на основе индикатора Rainbow. Он оценивает направление ценового тренда путем расчета разницы между скользящей средней Heikin-Ashi и абсолютной стоимостью цены. Он генерирует торговые сигналы путем объединения индикатора RSI для определения ситуаций перекупки / перепродажи.
В частности, формула WaveTrend в стратегии:
esa = ema(hlc3, 10)
d = ema(abs(hlc3 - esa), 10)
ci = (hlc3 - esa) / (0.015 * d)
wt = ema(ci, 21)
где esa - рассчитанная скользящая средняя Heikin-Ashi, d - среднее значение разницы между скользящей средней Heikin-Ashi и абсолютной стоимостью цены. ci - так называемый адаптивный диапазон, отражающий волатильность цен. wt - скользящая средняя ci, которая определяет направление ценового тренда и является ключевым индикатором для длинного и короткого.
Показатель RSI используется для определения ситуации перекупления/перепродажи.
rsiup = rma(max(change(close), 0), 14)
rsidown = rma(-min(change(close), 0), 14)
rsi = rsidown == 0 ? 100 : rsiup == 0 ? 0 : 100 - (100 / (1 + rsiup / rsidown))
Его стандартное значение - 0-100. Выше 70 - перекуплено, а ниже 30 - перепродано.
В сочетании с этими двумя показателями, когда RSI ниже 25 и WaveTrend ниже -60, это перепродажа, чтобы пойти длинным.
Преимущества этой стратегии включают:
Существуют также некоторые риски:
Решения:
Стратегия может быть оптимизирована в следующих направлениях:
Изменить или добавить показатели оценки для улучшения точности сигнала, например, MACD, KD и т.д.
Оптимизировать настройки параметров для адаптации различных продуктов, например, регулировать периоды плавности.
Добавить стратегии отслеживания стоп-лосса для контроля одиночных потерь, например, процент стоп-лосса, отслеживание стоп-лосса и т.д.
Рассмотрим различные стратегии пирамиды, например, Мартингейл вместо фиксированного количества.
Оптимизировать параметры адаптивного диапазона для улучшения точности суждения.
Общая идея стратегии ясна, используя индикаторы волатильности для определения ценовых тенденций и эффективного фильтрации шума. Есть возможность оптимизации во многих аспектах, чтобы сделать стратегию более надежной. Благодаря настройке параметров она может быть адаптирована к различным продуктам и стоит дальнейшего тестирования в режиме реального времени.
/*backtest start: 2024-01-01 00:00:00 end: 2024-01-31 23:59:59 period: 1h basePeriod: 15m exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}] */ //Noro //2018 //@version=2 strategy(title = "Noro's WaveTrender Strategy v1.0", shorttitle = "WaveTrender str 1.0", overlay = true, default_qty_type = strategy.percent_of_equity, default_qty_value = 100, pyramiding = 10) //Settings needlong = input(true, defval = true, title = "Long") needshort = input(true, defval = true, title = "Short") usemar = input(false, defval = false, title = "Use Martingale") capital = input(100, defval = 100, minval = 1, maxval = 10000, title = "Capital, %") showarr = input(true, defval = true, title = "Show Arrows") fromyear = input(2018, defval = 2018, minval = 1900, maxval = 2100, title = "From Year") toyear = input(2100, defval = 2100, minval = 1900, maxval = 2100, title = "To Year") frommonth = input(01, defval = 01, minval = 01, maxval = 12, title = "From Month") tomonth = input(12, defval = 12, minval = 01, maxval = 12, title = "To Month") fromday = input(01, defval = 01, minval = 01, maxval = 31, title = "From day") today = input(31, defval = 31, minval = 01, maxval = 31, title = "To day") //RSI rsiup = rma(max(change(close), 0), 14) rsidown = rma(-min(change(close), 0), 14) rsi = rsidown == 0 ? 100 : rsiup == 0 ? 0 : 100 - (100 / (1 + rsiup / rsidown)) //WaveTrend esa = ema(hlc3, 10) d = ema(abs(hlc3 - esa), 10) ci = (hlc3 - esa) / (0.015 * d) wt = ema(ci, 21) //Body body = abs(close - open) abody = sma(body, 10) //Signals bar = close > open ? 1 : close < open ? -1 : 0 overs = rsi < 25 and wt < -60 overb = rsi > 75 and wt > 60 up1 = (strategy.position_size == 0 or close < strategy.position_avg_price) and overs and bar == -1 dn1 = (strategy.position_size == 0 or close > strategy.position_avg_price) and overb and bar == 1 exit = (strategy.position_size > 0 and overs == false) or (strategy.position_size < 0 and overb == false) //Arrows col = exit ? black : up1 or dn1 ? blue : na needup = up1 needdn = dn1 needexitup = exit and strategy.position_size < 0 needexitdn = exit and strategy.position_size > 0 plotarrow(showarr and needup ? 1 : na, colorup = blue, colordown = blue, transp = 0) plotarrow(showarr and needdn ? -1 : na, colorup = blue, colordown = blue, transp = 0) plotarrow(showarr and needexitup ? 1 : na, colorup = black, colordown = black, transp = 0) plotarrow(showarr and needexitdn ? -1 : na, colorup = black, colordown = black, transp = 0) //Trading profit = exit ? ((strategy.position_size > 0 and close > strategy.position_avg_price) or (strategy.position_size < 0 and close < strategy.position_avg_price)) ? 1 : -1 : profit[1] mult = usemar ? exit ? profit == -1 ? mult[1] * 2 : 1 : mult[1] : 1 lot = strategy.position_size == 0 ? strategy.equity / close * capital / 100 * mult : lot[1] if up1 if strategy.position_size < 0 strategy.close_all() strategy.entry("Long", strategy.long, needlong == false ? 0 : lot) if dn1 if strategy.position_size > 0 strategy.close_all() strategy.entry("Short", strategy.short, needshort == false ? 0 : lot) if exit strategy.close_all()