
Эта стратегия использует комбинацию различных сильных индикаторов, таких как Aroon, MA, BB, Williams, %R, ADX и т. Д., с помощью различных различных циклов, чтобы сформировать многомерный сильный индикатор открытия позиции, который позволяет эффективно открывать позиции, когда тенденция более очевидна.
Эта стратегия обеспечивает сильные сигналы открытия позиции, в основном, с помощью комбинации следующих индикаторов:
Aroon Indicator: рассчитывает максимальные и минимальные цены за определенный период, образуя шокирующий индикатор, который определяет направление тенденции с помощью комбинации показателей Aroon с несколькими периодами длины.
MA средняя линия: рассчитывается средняя линия MA с пересечением коротких и длительных периодов, чтобы определить переломный момент тренда.
BB: Сигналы для продажи, когда цена пробивается через B.
Индекс Williams %R: индикатор формирует отклонение в зоне перепродажи в качестве сигнала для открытия позиции.
Индекс среднего направленного движения ADX: для оценки силы тренда, ADX выше определенного положения, когда создается сигнал открытия позиции.
Вышеперечисленные показатели, с помощью различных параметров длины цикла, составляют многомерную систему суждения, когда тенденция более очевидна, несколько показателей могут формировать сильный сигнал открытия позиции.
В частности, условия покупки:
Сильный сигнал покупки создается, когда выполняются 3 из 5 вышеперечисленных условий покупки.
Аналогичным образом, существует пять условий продажи, при выполнении трех из которых создается сигнал продажи.
Таким образом, эта стратегия использует комбинацию различных индикаторов, чтобы создать сильный сигнал открытия позиции с высокой степенью уверенности, когда тенденция очевидна.
Наибольшим преимуществом этой стратегии является многомерное сочетание сигналов индикатора, что значительно снижает вероятность ошибочного сигнала, вызванного одним индикатором, что позволяет создавать высококачественные сигналы открытия позиций при более заметных тенденциях, что является главной особенностью этой стратегии.
Другие плюсы:
Приспособность к различным рыночным особенностям с помощью параметров
Настройка параметров показателя является научно обоснованной, а параметры более устойчивы
Сочетание нескольких временных циклов повышает точность суждения
Ясная структура кода, легко понятная и вторичная разработка
Однако есть и другие риски:
Несмотря на то, что комбинация показателей повышает качество суждений, она также увеличивает сложность стратегии и увеличивает риск переоптимизации.
Параметры не на 100% идеальны и могут не работать в определенных рынках
Существует еще много возможностей для оптимизации комбинации показателей, и логика комбинации может быть доработана.
Возможности для краткосрочной адаптации могут быть упущены
Решение проблемы:
Повышение резкости отбора образцов и параметров тестирования
Настройка некоторых параметров для большего количества рынков
Оптимизация методов интеграции показателей для повышения качества суждений
Сокращение параметров некоторых показателей, чтобы увеличить улов краткосрочных корректировок
Основными направлениями оптимизации данной стратегии является оптимизация методов интеграции показателей, включая:
Добавление большего количества различных типов показателей, формирующих индикаторные леса, что еще больше повышает точность суждения
Оптимизация параметров показателя, позволяющая автоматически адаптироваться к изменениям рынка
Использование методов машинного обучения для автоматического поиска оптимальных интеграционных решений для показателей
Увеличение стратегии по борьбе с убытками для контроля риска
В сочетании с эмоциональными показателями и т. д. для определения температуры рынка, динамических параметров корректировки
Существует много возможностей для улучшения качества суждений и надежности этой стратегии путем интеграции большего количества показателей, автоматизированных параметров оптимизации и интеграционных программ.
Самым ярким моментом этой стратегии является научная интеграция различных индикаторов, формирующих сильные сигналы открытия позиций, эффективность которых заметна при очевидном тренде. Существует много возможностей для оптимизации этой стратегии, которая может стать очень мощной количественной стратегией торговли путем введения большего количества индикаторов, а также интеллектуальной оптимизации параметров и способов интеграции.
/*backtest
start: 2023-12-19 00:00:00
end: 2024-01-18 00:00:00
period: 1h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/
//@version=3
strategy(title="Aroon+Williams+MA2+ADX+Aroon Str.", shorttitle="Aroon+Williams+MA2+ADX+Aroon Str.", overlay=true)
//https://cafe.naver.com/watchbot/1945
//<<빙썸 매각 기념>> 바이낸스 이오스 복합지표
//Aroon_1
length_1 = input(264, minval=1, title="Length Aroon_1")
upper_1 = 100 * (highestbars(high, length_1+1) + length_1)/length_1
lower_1 = 100 * (lowestbars(low, length_1+1) + length_1)/length_1
midp_1 = 0
oscillator_1 = upper_1 - lower_1
//osc_1 = plot(oscillator_1, color=red)
//Aroon_2
length_2 = input(72, minval=1, title="Length Aroon_2")
upper_2 = 100 * (highestbars(high, length_2+1) + length_2)/length_2
lower_2 = 100 * (lowestbars(low, length_2+1) + length_2)/length_2
midp_2 = 0
oscillator_2 = upper_2 - lower_2
//osc_2 = plot(oscillator_2, color=red)
//Aroon_3
length_3 = input(137, minval=1, title="Length Aroon_3")
upper_3 = 100 * (highestbars(high, length_3+1) + length_3)/length_3
lower_3 = 100 * (lowestbars(low, length_3+1) + length_3)/length_3
midp_3 = 0
oscillator_3 = upper_3 - lower_3
//osc_3 = plot(oscillator_3, color=red)
//Aroon_4
length_4 = input(62, minval=1, title="Length Aroon_4")
upper_4 = 100 * (highestbars(high, length_4+1) + length_4)/length_4
lower_4 = 100 * (lowestbars(low, length_4+1) + length_4)/length_4
midp_4 = 0
oscillator_4 = upper_4 - lower_4
//osc_4 = plot(oscillator_4, color=red)
//Ma double
short_ma_1 = sma(close, 9)
long_ma_1 = sma(close, 21)
// plot(short_ma_1, color = red)
// plot(long_ma_1, color = green)
// plot(cross(short_ma_1, long_ma_1) ? short_ma_1 : na, style = cross, linewidth = 4)
short_ma_2 = sma(close, 9)
long_ma_2 = sma(close, 21)
// plot(short_ma_2, color = red)
// plot(long_ma_2, color = green)
plot(cross(short_ma_2, long_ma_2) ? short_ma_2 : na, transp= 100, title = "ma cross_2", style = cross, linewidth = 4)
//BB
length_bb = input(270, minval=1, title="BB length")
src_bb = input(close, title="Source")
mult_bb = input(2.0, minval=0.001, maxval=50, title="BB mult")
basis_bb = sma(src_bb, length_bb)
dev_bb = mult_bb * stdev(src_bb, length_bb)
upper_bb = basis_bb + dev_bb
lower_bb = basis_bb - dev_bb
// plot(basis_bb, color=red)
// p1 = plot(upper_bb, color=blue)
// p2 = plot(lower_bb, color=blue)
// fill(p1, p2)
//Williams
length_wil = input(130, minval=1, title="Length Williams %R")
upper_wil = highest(length_wil)
lower_wil = lowest(length_wil)
out_wil = 100 * (close - upper_wil) / (upper_wil - lower_wil)
// plot(out_wil)
// band1 = hline(-20)
// band0 = hline(-80)
// fill(band1, band0)
//ADX
adxlen = input(14, title="ADX Smoothing")
dilen = input(145, title="DI Length")
dirmov(len) =>
up_adx = change(high)
down_adx = -change(low)
plusDM = na(up_adx) ? na : (up_adx > down_adx and up_adx > 0 ? up_adx : 0)
minusDM = na(down_adx) ? na : (down_adx > up_adx and down_adx > 0 ? down_adx : 0)
truerange = rma(tr, len)
plus_adx = fixnan(100 * rma(plusDM, len) / truerange)
minus_adx = fixnan(100 * rma(minusDM, len) / truerange)
[plus_adx, minus_adx]
adx(dilen, adxlen) =>
[plus_adx, minus_adx] = dirmov(dilen)
sum_adx = plus_adx + minus_adx
adx = 100 * rma(abs(plus_adx - minus_adx) / (sum_adx == 0 ? 1 : sum_adx), adxlen)
sig_adx = adx(dilen, adxlen)
// plot(sig_adx, color=red, title="ADX")
//ADX 2
adxlen_2 = input(14, title="ADX Smoothing")
dilen_2 = input(150, title="DI Length")
dirmov_2(len) =>
up_adx_2 = change(high)
down_adx_2 = -change(low)
plusDM_2 = na(up_adx_2) ? na : (up_adx_2 > down_adx_2 and up_adx_2 > 0 ? up_adx_2 : 0)
minusDM_2 = na(down_adx_2) ? na : (down_adx_2 > up_adx_2 and down_adx_2 > 0 ? down_adx_2 : 0)
truerange_2 = rma(tr, len)
plus_adx_2 = fixnan(100 * rma(plusDM_2, len) / truerange_2)
minus_adx_2 = fixnan(100 * rma(minusDM_2, len) / truerange_2)
[plus_adx_2, minus_adx_2]
adx_2(dilen_2, adxlen_2) =>
[plus_adx_2, minus_adx_2] = dirmov_2(dilen_2)
sum_adx_2 = plus_adx_2 + minus_adx_2
adx_2 = 100 * rma(abs(plus_adx_2 - minus_adx_2) / (sum_adx_2 == 0 ? 1 : sum_adx_2), adxlen_2)
sig_adx_2 = adx(dilen_2, adxlen_2)
// plot(sig_adx_2, color=red, title="ADX_2")
//Input Position
//buy position
pos_aroon1 = input(-85, title="Aroon_1 Position Index_Down")
pos_madouble1_short = input(117, title="ma double_1 wma_Short")
pos_madouble1_long = input(86, title="ma double_1 sma_Long")
pos_wil = input(-99, title="Williams Position Index_Down")
pos_adx= input(14, title="ADX Position Index_Up")
pos_aroon2 = input(-39, title="Aroon_2 Position Index_Up")
//sell position
pos_bb = input(120, title="BB Position Index_Up")
pos_aroon_3 = input(99, title="Aroon_3 Position Index_Up")
pos_madouble2_short= input(88, title="ma double_2 ema_Short")
pos_madouble2_long= input(96, title="ma double_2 sma_Long")
pos_adx_2= input(9, title="ADX_2 Position Index_Up")
pos_aroon_4 = input(35, title="Aroon_4 Position Index_Down")
//Condition
longCondition_aroon_1 = (oscillator_1 <= pos_aroon1)
longCondition_ma2 = (pos_madouble1_short > pos_madouble1_long)
longCondition_wil = (out_wil <= pos_wil)
longCondition_adx = (sig_adx >= pos_adx)
longCondition_aroon_2 = (oscillator_2 >= pos_aroon2)
shortCondition_bb = (close > basis_bb)
shortCondition_aroon_3 = (oscillator_3 >= pos_aroon_3)
shortCondition_ma2 = (pos_madouble2_short < pos_madouble2_long)
shortCondition_adx = (sig_adx_2 >= pos_adx_2)
shortCondition_aroon_4 = (oscillator_4 <= pos_aroon_4)
vl_aroon_1 = 0
vl_ma2 = 0
vl_wil = 0
vl_adx = 0
vl_aroon_2 = 0
if longCondition_aroon_1
vl_aroon_1 := 1
if longCondition_ma2
vl_ma2 := 3
if longCondition_wil
vl_wil := 1
if longCondition_adx
vl_adx := -1
if longCondition_aroon_2
vl_aroon_2 := -1
vs_bb = 0
vs_aroon_3 = 0
vs_ma2 = 0
vs_adx = 0
vs_aroon_4 = 0
if shortCondition_bb
vs_bb := 1
if shortCondition_aroon_3
vs_aroon_3 := 1
if shortCondition_ma2
vs_ma2 := 3
if shortCondition_adx
vs_adx := -2
if shortCondition_aroon_4
vs_aroon_4 := -1
// plotshape(vl_aroon_1, title= "vl_aroon_1", location=location.belowbar, color=green, text="vl_aroon_1")
// plotshape(vl_ma2, title= "vl_ma2", location=location.belowbar, color=green, text="\nvl_ma2")
// plotshape(vl_wil, title= "vl_wil", location=location.belowbar, color=green, text="\n\nvl_wil")
// plotshape(vl_adx, title= "vl_adx", location=location.belowbar, color=green, text="\n\n\nvl_adx")
// plotshape(vl_aroon_2, title= "vl_aroon_2", location=location.belowbar, color=green, text="\n\n\n\nvl_aroon_2")
// plotshape(vs_bb, title= "vs_bb", location=location.abovebar, color=orange, text="vs_bb")
// plotshape(vs_aroon_3, title= "vs_aroon_3", location=location.abovebar, color=orange, text="vs_aroon_3\n")
// plotshape(vs_ma2, title= "vs_ma2", location=location.abovebar, color=orange, text="vs_ma2\n\n")
// plotshape(vs_adx, title= "vs_adx", location=location.abovebar, color=orange, text="vs_adx\n\n\n")
// plotshape(vs_aroon_4, title= "vs_aroon_4", location=location.abovebar, color=orange, text="vs_aroon_4\n\n\n\n")
longCondition = (vl_aroon_1 + vl_ma2 + vl_wil + vl_adx + vl_aroon_2) >= 3 ? true : na
shortCondition = (vs_bb + vs_aroon_3 + vs_ma2 + vs_adx + vs_aroon_4) >= 3 ? true : na
buy = longCondition == 1 ? longCondition : na
sell = shortCondition == 1? shortCondition : na
// plotshape(buy, title= "buy", location=location.bottom, color=green, text="buy")
// plotshape(sell, title= "sell", location=location.top, color=orange, text="sell")
// === BACKTEST RANGE ===
FromMonth = input(defval = 8, title = "From Month", minval = 1, maxval = 12)
FromDay = input(defval = 1, title = "From Day", minval = 1, maxval = 31)
FromYear = input(defval = 2018, title = "From Year", minval = 2014)
ToMonth = input(defval = 12, title = "To Month", minval = 1, maxval = 12)
ToDay = input(defval = 31, title = "To Day", minval = 1, maxval = 31)
ToYear = input(defval = 2018, title = "To Year", minval = 2014)
strategy.entry("L", strategy.long, when=(buy))
strategy.close("L", when=(sell))
// strategy.entry("S", strategy.short, when=(sell and (time >= timestamp(FromYear, FromMonth, FromDay, 00, 00)) and (time <= timestamp(ToYear, ToMonth, ToDay, 23, 59))))
// strategy.close("S", when=(buy and (time <= timestamp(ToYear, ToMonth, ToDay, 23, 59))))