Otimizando a estratégia adaptativa inteligente multifatorial do pescador de casco


Data de criação: 2024-01-16 15:10:06 última modificação: 2024-01-16 15:10:06
cópia: 1 Cliques: 606
1
focar em
1617
Seguidores

Otimizando a estratégia adaptativa inteligente multifatorial do pescador de casco

Visão geral

A estratégia é uma estratégia multifatorial auto-adaptável que combina a média móvel de Hull, o indicador de rotação dos pescadores e o índice de canais de mercadorias. Ela é capaz de identificar inteligentemente as tendências e ajustar automaticamente os parâmetros para adaptá-los a diferentes variedades e períodos.

Princípio da estratégia

A lógica central da estratégia baseia-se em um indicador de troca de pescadores para determinar entradas e saídas. O indicador de troca de pescadores combina os benefícios da média móvel e do indicador de choque para determinar com mais precisão o ponto de reversão da tendência.

A estratégia começa com o cálculo da média móvel do casco e do indicador de desvio do pescador. Em seguida, é combinado com o julgamento auxiliar do índice de corredor de mercadorias para formar a condição de entrada. Quando o indicador de desvio do pescador passa por baixo do eixo zero ou sobe fora do intervalo de parâmetros definidos, é definido como condição de golden fork, formando um sinal múltiplo; quando o pescador passa por cima do eixo zero e desce ou desce fora do intervalo de parâmetros, é definido como condição de dead fork, formando um sinal de vazio.

As condições de saída são as opostas: o Gold Forks faz a compra com o Dead Forks; o Dead Forks faz a compra com o Gold Forks. Assim, o cruzamento entre os indicadores é usado para capturar o ponto de viragem da tendência.

Análise de vantagens

A maior vantagem da estratégia é a adaptação de múltiplos fatores. Ela aproveita simultaneamente os benefícios das médias móveis, os indicadores de choque e os indicadores de tendência, podendo obter um bom desempenho em mercados de baixa. A configuração dos parâmetros também pode ser ajustada de acordo com a variedade e o período, para obter adaptação.

Além disso, a estratégia inclui um mecanismo de parada automática. Quando o preço volta a ultrapassar a média móvel de Hull, a parada automática é executada. Isso reduz significativamente o risco de perda da estratégia.

Riscos e soluções

O maior risco desta estratégia é a criação de sinais de erro entre os indicadores. Quando os preços sofrem oscilações intermédias, os indicadores podem produzir alguns cruzamentos desnecessários, o que pode levar a entradas e paradas desnecessárias.

A solução é ajustar adequadamente os parâmetros do indicador, filtrando alguns pequenos sinais. Ou combinar mais indicadores auxiliares para confirmar. Por exemplo, aumentar o indicador de volume de transação para determinar o sinal verdadeiro.

Direção de otimização

A estratégia pode ser otimizada em várias direções:

  1. A adição de algoritmos de aprendizagem de máquina permite a otimização automática dos parâmetros. Os parâmetros do indicador podem ser ajustados em tempo real com base no treinamento de dados históricos.

  2. Aumentar o número de pacotes de indicadores para classificação, a maioria das estratégias de tomada de decisão e a precisão da tomada de decisão.

  3. Aumentar o mecanismo de confirmação de ruptura, utilizando níveis e canais importantes de preços para a reconfirmação, evitando erros.

  4. A adição de um módulo de avaliação de risco, que permite ajustar automaticamente o tamanho da posição e o limiar de perda de acordo com a situação do mercado.

Resumir

A estratégia é, em geral, uma excelente estrutura de auto-adaptação multifatorial. Combina o julgamento de tendências de médias móveis, o julgamento de super-compra e venda de indicadores de choque e a aplicação cruzada de indicadores de tendências, formando um conjunto completo de mecanismos de entrada e saída. Se puder ser otimizado ainda mais, adicionando componentes de auto-adaptação e inteligência, será um produto estratégico de grande valor comercial.

Código-fonte da estratégia
/*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)