Оптимизация адаптивной интеллектуальной многофакторной стратегии рыбака Халла


Дата создания: 2024-01-16 15:10:06 Последнее изменение: 2024-01-16 15:10:06
Копировать: 1 Количество просмотров: 396
1
Подписаться
1237
Подписчики

Оптимизация адаптивной интеллектуальной многофакторной стратегии рыбака Халла

Обзор

Стратегия представляет собой адаптивную многофакторную стратегию, которая сочетает в себе Hull Moving Average, Fisherman’s Turnover Indicator и Commodity Channel Index. Она способна интеллектуально распознавать тенденции, автоматически корректировать параметры, чтобы адаптироваться к различным сортам и периодам.

Стратегический принцип

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

Стратегия сначала рассчитывает Hull Moving Average и рыбацкий переходный показатель. Затем, в сочетании с индексом товарного коридора и вспомогательным суждением, формирует условия входа. Когда рыбацкий переходный показатель проходит ниже нулевой оси или за пределы установленного диапазона параметров, он устанавливается в качестве золотого форка, формируя многосигнал; когда рыбацкий переходный показатель проходит ниже нулевой оси или за пределы установленного диапазона параметров, он устанавливается в качестве мертвого форка, формируя вакуумный сигнал.

Выходные условия наоборот, золотые форсы делают многоопись на мертвых форсах; мертвые форсы делают открытую позицию на золотых форсах. Таким образом, используется перекресток между показателями, чтобы захватить переломные моменты тенденции.

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

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

Кроме того, в стратегию включен механизм автоматического остановки убытков. Когда цена снова пересекает Hull Moving Average, она автоматически прекращает проигрыш. Это значительно снижает риск потери стратегии.

Риски и решения

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

Решение состоит в том, чтобы корректировать параметры показателя, отфильтровывая некоторые небольшие сигналы. Или объединить больше вспомогательных показателей для подтверждения. Например, увеличить показатель объема сделок, чтобы определить истинный сигнал.

Направление оптимизации

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

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

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

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

  4. Добавлен модуль оценки риска, который позволяет автоматически корректировать размер позиции и размер стоп-лосса в зависимости от рыночной ситуации.

Подвести итог

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

Исходный код стратегии
/*backtest
start: 2023-01-09 00:00:00
end: 2024-01-15 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

// This source code is free to copy/paste/use. no permission required. just do it!
// © @SeaSide420 
//@version=4
strategy(title="Hull Fisher",currency="USD",default_qty_type=strategy.percent_of_equity,default_qty_value=100,commission_type=strategy.commission.percent,commission_value=0.25)

//=================================== Inputs =========================================================
period =input(title="HullMA Length", type=input.integer, defval=14, minval=2)
length =input(9, minval=1, title="Signal Length")
line1 = input(5, minval=2, title="Top Line")
line5 = input(-5, maxval=-2, title="Bottom Line")
price = input(open, type=input.source, title="Price data")
entry1 =input(true,type=input.bool, title="Open when HullFisher crossover outside Lines")
entry2 =input(true,type=input.bool, title="Open when HullFisher past zero")
useHMA =input(true,type=input.bool, title="Include Hull_moving_average")
useCCI =input(true,type=input.bool, title="Include Commodity_channel_index")
fishclose=input(true,type=input.bool, title="Close order when Fisher crossover")
HMAclose=input(true,type=input.bool, title="Close order when Hull crossover")

//================================ Calculations ======================================================
HMA = hma(price,period)
HMA2 = HMA[1]
high_ = highest(HMA, length)
low_ = lowest(HMA, length)
round_(val) => val > .99 ? .999 : val < -.99 ? -.999 : val
value = 0.0
value := round_(.66 * ((HMA - low_) / max(high_ - low_, .001) - .5) + .67 * nz(value[1]))
value1 = 0.0
value1 := .5 * log((1 + value) / max(1 - value, .001)) + .5 * nz(value1[1])
value2 = value1[1]
CCI1 = cci(price,period)
CCI2 = CCI1[1]
line2 = line1/2
line4 = line5/2

//================================ Draw Plots =======================================================
colorchange1 =CCI1>CCI2?color.lime:color.red
colorchange2 =value1>value2?color.lime:color.red
a =plot(line1,style=plot.style_line,color=color.red,transp=50,linewidth=2,title="Top Line")
b =plot(line2,style=plot.style_line,color=color.red,transp=50,linewidth=2,title="Upper Line")
c =plot(0,style=plot.style_line,color=color.black,transp=50,linewidth=2,title="Middle Line")
d =plot(line4,style=plot.style_line,color=color.lime,transp=50,linewidth=2,title="Lower Line")
e =plot(line5,style=plot.style_line,color=color.lime,transp=50,linewidth=2,title="Bottom Line")
f =plot(value1, color=color.black,transp=50,linewidth=2, title="Value 1")
g =plot(value2, color=color.black,transp=50,linewidth=2, title="Value 2")
h =plot(CCI1/50,style=plot.style_area, color=colorchange1,transp=50,linewidth=2, title="CCI")
fill(f,g,color=colorchange2,transp=20,title="Color fill")
plot(cross(value1, value2) ? value1 : na, style=plot.style_circles, color=color.black, linewidth=10)
plot(cross(value1, value2) ? value1 : na, style=plot.style_circles, color=color.white, linewidth=8)
plot(cross(value1, value2) ? value1 : na, style=plot.style_circles, color=colorchange2, linewidth=5)

//============================= Entry conditions ====================================================
// Outside Lines crossover or zero lines crossover
LongCondition1 = value1>value2 and value1<line5 and entry1 and not useCCI and not useHMA
ShortCondition1 = value1<value2 and value1>line1 and entry1 and not useCCI and not useHMA
LongCondition2 = value1>value2 and value1>0 and entry2 and not useCCI and not useHMA
ShortCondition2 = value1<value2 and value1<0 and entry2 and not useCCI and not useHMA

// Use CCI
LongCondition3 = value1>value2 and value1<line5 and CCI1>CCI2 and entry1 and useCCI and not useHMA
ShortCondition3 = value1<value2 and value1>line1 and CCI1<CCI2 and entry1 and useCCI and not useHMA
LongCondition4 = value1>value2 and value1>0 and CCI1>CCI2 and entry2 and useCCI and not useHMA
ShortCondition4 = value1<value2 and value1<0 and CCI1<CCI2 and entry2 and useCCI and not useHMA

// Use HMA
LongCondition5 = value1>value2 and value1<line5 and CCI1>CCI2 and HMA>HMA2 and entry1 and not useCCI and useHMA
ShortCondition5 = value1<value2 and value1>line1 and CCI1<CCI2 and HMA<HMA2 and entry1 and not useCCI and useHMA
LongCondition6 = value1>value2 and value1>0 and CCI1>CCI2 and HMA>HMA2 and entry2 and not useCCI and useHMA
ShortCondition6 = value1<value2 and value1<0 and CCI1<CCI2 and HMA<HMA2 and entry2 and not useCCI and useHMA

//Use CCI & HMA
LongCondition7 = value1>value2 and value1<line5 and CCI1>CCI2 and HMA>HMA2 and entry1 and useCCI and useHMA
ShortCondition7 = value1<value2 and value1>line1 and CCI1<CCI2 and HMA<HMA2 and entry1 and useCCI and useHMA
LongCondition8 = value1>value2 and value1>0 and CCI1>CCI2 and HMA>HMA2 and entry2 and useCCI and useHMA
ShortCondition8 = value1<value2 and value1<0 and CCI1<CCI2 and HMA<HMA2 and entry2 and useCCI and useHMA

//========================= Exit & Entry excecution =================================================
if HMAclose and fishclose and value1<value2 and HMA<HMA2
    strategy.close("BUY")
if HMAclose and fishclose and value1>value2 and HMA>HMA2
    strategy.close("SELL")
if HMAclose and HMA<HMA2
    strategy.close("BUY")
if HMAclose and HMA>HMA2
    strategy.close("SELL")
if fishclose and value1<value2
    strategy.close("BUY")
if fishclose and value1>value2
    strategy.close("SELL")    
if LongCondition1 or LongCondition2 or LongCondition3 or LongCondition4 or LongCondition5 or LongCondition6 or LongCondition7 or LongCondition8
    strategy.entry("BUY", strategy.long)
if ShortCondition1 or ShortCondition2 or ShortCondition3 or ShortCondition4 or ShortCondition5 or ShortCondition6 or ShortCondition7 or ShortCondition8
    strategy.entry("SELL", strategy.short)