Стратегия отслеживания тенденции волатильности

Автор:Чао Чжан, Дата: 2024-02-18 10:07:29
Тэги:

img

Обзор

Эта стратегия использует индикатор 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, это перепродажа, чтобы пойти длинным.

Анализ преимуществ

Преимущества этой стратегии включают:

  1. Индикатор WaveTrend может точно и надежно определить направление ценового тренда.
  2. Фильтры RSI могут избежать ненужных сделок и улучшить уровень выигрыша.
  3. Метод отслеживания трендов может максимизировать прибыль от улавливания ценовых тенденций.
  4. Идея стратегии проста и ясна, параметры гибкие для адаптации к различным продуктам и рынкам.
  5. Легко внедряется и тестируется в режиме реального времени, хорошо для дальнейшей оптимизации.

Анализ рисков

Существуют также некоторые риски:

  1. И WaveTrend, и RSI имеют некоторое отставание, могут пропустить точки переворота цен.
  2. Несмотря на фильтры, на боковых рынках могут появляться ложные сигналы.
  3. Отсутствие эффективного метода остановки потерь для контроля одиночных потерь.
  4. Разумная настройка параметров должна соответствовать характеристикам и частоте торговли.

Решения:

  1. Добавить индикаторы для комбинированной оптимизации для улучшения точности сигнала.
  2. Добавьте стратегии стоп-лосса для контроля одиночных потерь.
  3. Найдите оптимальные комбинации параметров для адаптации стратегии.

Руководство по оптимизации

Стратегия может быть оптимизирована в следующих направлениях:

  1. Изменить или добавить показатели оценки для улучшения точности сигнала, например, MACD, KD и т.д.

  2. Оптимизировать настройки параметров для адаптации различных продуктов, например, регулировать периоды плавности.

  3. Добавить стратегии отслеживания стоп-лосса для контроля одиночных потерь, например, процент стоп-лосса, отслеживание стоп-лосса и т.д.

  4. Рассмотрим различные стратегии пирамиды, например, Мартингейл вместо фиксированного количества.

  5. Оптимизировать параметры адаптивного диапазона для улучшения точности суждения.

Заключение

Общая идея стратегии ясна, используя индикаторы волатильности для определения ценовых тенденций и эффективного фильтрации шума. Есть возможность оптимизации во многих аспектах, чтобы сделать стратегию более надежной. Благодаря настройке параметров она может быть адаптирована к различным продуктам и стоит дальнейшего тестирования в режиме реального времени.


/*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()

Больше