Это количественная торговая стратегия, которая сочетает в себе использование теории фрактала Билла Уильямса и индикатора ZZ. Он оценивает рыночные тенденции с помощью расчета фракталов Уильямса и определяет потенциальные точки прорыва, рисуя линии поддержки / сопротивления с использованием индикатора ZZ для реализации трендовых сделок.
Стратегия сначала рассчитывает фракталы Уильямса, чтобы определить, растет ли текущий фрактал или падает. Если это растущий фрактал, считается, что текущая тенденция повышается. Если это падающий фрактал, считается, что текущая тенденция снижается.
Затем он рисует линии поддержки и сопротивления индикатора ZZ на основе фрактальных точек. Если цена проходит через линию сопротивления, соответствующую растущему фракталу, перейдите в длинный курс. Если цена проходит через линию поддержки, соответствующую падающему фракталу, перейдите в короткий.
Благодаря такой комбинации можно своевременно отслеживать изменения тенденций и осуществлять сделки в соответствии с тенденциями.
Эта стратегия объединяет два различных метода технического анализа - фракталы Уильямса и индикаторы ZZ - для выявления большего количества торговых возможностей.
Он может своевременно оценивать поворотную точку рыночных тенденций и имеет хорошие критерии стоп-лосса / прибыли для определения основного направления тренда.
В целом эта стратегия учитывает как суждение о тенденции, так и конкретный выбор точки входа для сбалансирования рисков и прибыли.
Самый большой риск этой стратегии заключается в том, что фрактальные суждения и индикатор ZZ могут выдавать неправильные торговые сигналы, что приводит к ненужным потерям.
Кроме того, способы расчета фракталов могут привести к ошибочным оценкам, если временные рамки установлены неправильно.
Для уменьшения этих рисков, надлежащим образом корректировать параметры расчета фракталов и увеличить условия фильтрации, чтобы уменьшить ошибочные сигналы.
Эта стратегия может быть дополнительно оптимизирована в следующих аспектах:
Добавьте фильтры индикаторов импульса, такие как MACD или полосы Боллинджера, чтобы избежать ложных прорывов.
Оптимизировать настройки фрактальных параметров и скорректировать расчет максимумов и минимумов и сократить временные рамки для получения более точных суждений о тренде.
Увеличить алгоритмы машинного обучения для оценки точности тренда и избежать человеческих ограничений.
Добавить адаптивный механизм стоп-лосса на основе волатильности рынка.
Используйте алгоритмы глубокого обучения для оптимизации общих параметров.
Умело сочетая теорию фрактала Уильямса и индикатор 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)