Фракталы Уильямса в сочетании с индикатором ZZ для количественных торговых стратегий

Автор:Чао Чжан, Дата: 2024-01-29 15:24:30
Тэги:

img

Обзор

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

Принцип стратегии

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

Затем он рисует линии поддержки и сопротивления индикатора ZZ на основе фрактальных точек. Если цена проходит через линию сопротивления, соответствующую растущему фракталу, перейдите в длинный курс. Если цена проходит через линию поддержки, соответствующую падающему фракталу, перейдите в короткий.

Благодаря такой комбинации можно своевременно отслеживать изменения тенденций и осуществлять сделки в соответствии с тенденциями.

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

Эта стратегия объединяет два различных метода технического анализа - фракталы Уильямса и индикаторы ZZ - для выявления большего количества торговых возможностей.

Он может своевременно оценивать поворотную точку рыночных тенденций и имеет хорошие критерии стоп-лосса / прибыли для определения основного направления тренда.

В целом эта стратегия учитывает как суждение о тенденции, так и конкретный выбор точки входа для сбалансирования рисков и прибыли.

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

Самый большой риск этой стратегии заключается в том, что фрактальные суждения и индикатор ZZ могут выдавать неправильные торговые сигналы, что приводит к ненужным потерям.

Кроме того, способы расчета фракталов могут привести к ошибочным оценкам, если временные рамки установлены неправильно.

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

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

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

  1. Добавьте фильтры индикаторов импульса, такие как MACD или полосы Боллинджера, чтобы избежать ложных прорывов.

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

  3. Увеличить алгоритмы машинного обучения для оценки точности тренда и избежать человеческих ограничений.

  4. Добавить адаптивный механизм стоп-лосса на основе волатильности рынка.

  5. Используйте алгоритмы глубокого обучения для оптимизации общих параметров.

Резюме

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


/*backtest
start: 2023-12-01 00:00:00
end: 2023-12-31 23:59:59
period: 1h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=4
strategy(title = "robotrading ZZ-8 fractals", shorttitle = "ZZ-8", overlay = true, default_qty_type = strategy.percent_of_equity, initial_capital = 100, default_qty_value = 100, commission_value = 0.1)

//Settings
needlong  = input(true, defval = true, title = "Long")
needshort = input(false, defval = true, title = "Short")
filterBW = input(false, title="filter Bill Williams Fractals")
showll = input(true, title = "Show levels")
showff = input(true, title = "Show fractals (repaint!)")
showdd = input(true, title = "Show dots (repaint!)")
showbg = input(false, title = "Show background")
showlb = input(false, title = "Show drawdown")
startTime = input(defval = timestamp("01 Jan 2000 00:00 +0000"), title = "Start Time", type = input.time, inline = "time1")
finalTime = input(defval = timestamp("31 Dec 2099 23:59 +0000"), title = "Final Time", type = input.time, inline = "time1")

//Variables
loss = 0.0
maxloss = 0.0
equity = 0.0
truetime = true

//Fractals
isRegularFractal(mode) =>
    ret = mode == 1 ? high[4] < high[3] and high[3] < high[2] and high[2] > high[1] and high[1] > high[0] : mode == -1 ? low[4] > low[3] and low[3] > low[2] and low[2] < low[1] and low[1] < low[0] : false
isBWFractal(mode) =>
    ret = mode == 1 ? high[4] < high[2] and high[3] <= high[2] and high[2] >= high[1] and high[2] > high[0] : mode == -1 ? low[4] > low[2] and low[3] >= low[2] and low[2] <= low[1] and low[2] < low[0] : false
filteredtopf = filterBW ? isRegularFractal(1) : isBWFractal(1)
filteredbotf = filterBW ? isRegularFractal(-1) : isBWFractal(-1)

//Triangles
plotshape(filteredtopf and showff, title='Filtered Top Fractals', style=shape.triangledown, location=location.abovebar, color= color.red, offset=-2)
plotshape(filteredbotf and showff, title='Filtered Bottom Fractals', style=shape.triangleup, location=location.belowbar, color= color.lime, offset=-2)

//Levels
hh = 0.0
ll = 0.0
hh := filteredtopf ? high[2] : hh[1]
ll := filteredbotf ? low[2] : ll[1]

//Trend
trend = 0
trend := high >= hh[1] ? 1 : low <= ll[1] ? -1 : trend[1]

//Lines
hcol = showll and hh == hh[1] and close < hh ? color.lime : na
lcol = showll and ll == ll[1] and close > ll ? color.red : na
plot(hh, color = hcol)
plot(ll, color = lcol)

//Dots
// var line hline = na
// if hh != hh[1] and showdd
//     hline := line.new(bar_index - 0, hh[0], bar_index - 2, hh[0], xloc = xloc.bar_index, extend = extend.none, style = line.style_dotted, color = color.lime, width = 1)
// var line lline = na
// if ll != ll[1] and showdd
//     lline := line.new(bar_index - 0, ll[0] - syminfo.mintick, bar_index - 2, ll[0] - syminfo.mintick, xloc = xloc.bar_index, extend = extend.none, style = line.style_dotted, color = color.red, width = 1)
    
//Background
bgcol = showbg == false ? na : trend == 1 ? color.lime : trend == -1 ? color.red : na
bgcolor(bgcol, transp = 80)

//Orders
if hh > 0 and needlong
    strategy.entry("Long", strategy.long, na, stop = hh, when = needlong and truetime)
    strategy.exit("Exit Long", "Long", stop = ll, when = needshort == false)
if ll > 0 and startTime
    strategy.entry("Short", strategy.short, na, stop = ll, when = needshort and truetime)
    strategy.exit("Exit Short", "Short", stop = hh, when = needlong == false)
if time > finalTime
    strategy.close_all()
    strategy.cancel("Long")
    strategy.cancel("Short")

if showlb

    //Drawdown
    max = 0.0
    max := max(strategy.equity, nz(max[1]))
    dd = (strategy.equity / max - 1) * 100
    min = 100.0
    min := min(dd, nz(min[1]))
    
    //Max loss size
    equity := strategy.position_size != strategy.position_size[1] ? strategy.equity : equity[1]
    loss := equity < equity[1] ? ((equity / equity[1]) - 1) * 100 : 0
    maxloss := min(nz(maxloss[1]), loss)
    
    //Label
    min := round(min * 100) / 100
    maxloss := round(maxloss * 100) / 100
    labeltext = "Drawdown: " + tostring(min) + "%" + "\nMax.loss " + tostring(maxloss) + "%"
    var label la = na
    label.delete(la)
    tc = min > -100 ? color.white : color.red
    osx = timenow + round(change(time)*50)
    osy = highest(100)
    la := label.new(x = osx, y = osy, text = labeltext, xloc = xloc.bar_time, yloc = yloc.price, color = color.black, style = label.style_labelup, textcolor = tc)

Больше