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