English Русский 中文 Español Deutsch 日本語
preview
Teoria das Categorias em MQL5 (Parte 12): Ordem

Teoria das Categorias em MQL5 (Parte 12): Ordem

MetaTrader 5Sistemas de negociação | 3 novembro 2023, 15:54
286 0
Stephen Njuki
Stephen Njuki

Introdução

No artigo anterior, analisamos os grafos, vértices e setas de um sistema interligado, no âmbito da teoria das categorias, e exploramos como diferentes caminhos com seus atributos podem ser usados para definir diferentes métodos de trailing stop em um sistema de negociação típico.

Neste artigo, veremos a ordem (orders) na teoria das categorias e como ela pode complementar as configurações de negociação com trailing stops. Em termos simples, a ordem tem a ver com a classificação da "magnitude" dos vários elementos comumente encontrados em um conjunto. Ela implementa a ideia de que os elementos de um determinado conjunto podem ser classificados de acordo com diversos critérios. A teoria das categorias acrescenta uma nova dimensão a essa ideia ao introduzir a noção de conjuntos de conjuntos e até mesmo conjuntos de conjuntos de conjuntos, etc. Por isso, neste artigo, vamos nos concentrar nas classificações de conjuntos (set ranks).

Em particular, vamos nos concentrar em padrões (patterns) em conjuntos ordenados como um meio de gerar saídas das operações de negociação. Há vários conjuntos a serem considerados, pois nossa lista pode variar de padrões de ação de preço a padrões de indicadores ou até mesmo padrões comuns de índices de diversos ativos. Entretanto, seguindo as etapas do sistema básico de negociação que abordamos em artigos anteriores, dividiremos as três etapas internas entre a primeira e a última etapa de nosso processo de cinco etapas em subconjuntos para obter nossos conjuntos ordenados de padrões.


Entendendo a ordem na teoria das categorias

De acordo com a relação de ordem, há três tipos básicos de ordem: pré-ordens (pre-orders), ordem parcial (partial orders) e ordens lineares ou totais (lineal or total orders). Uma pré-ordem é uma classificação de elementos de um conjunto em que cada elemento do conjunto é comparado com todos os outros elementos (reflexividade), e os resultados de cada comparação têm significado lógico para a comparação de outros elementos (transitividade). A pré-ordem leva em conta a ambiguidade: se dois elementos tiverem o mesmo valor de acordo com uma operação binária, ambos poderão ser incluídos no conjunto de saída. Além disso, os conjuntos de pré-ordem levam em conta os resultados incertos que surgem se dois elementos não puderem ser combinados devido, por exemplo, a uma diferença fundamental. A ordenação parcial é um tipo de pré-ordem que introduz o conceito adicional de antissimetria. Isso significa que, se dois elementos quaisquer tiverem o mesmo valor como resultado de uma operação de comparação binária, apenas um deles será incluído no conjunto de saída. Assim, a definição de "não estrito" é usada porque apenas um dos elementos iguais é gerado. Por fim, as ordenações lineares são uma forma especializada de ordenação parcial em que não há resultados indeterminados. Isso significa que todos os elementos são comparáveis. Assim como na pré-ordem, alguns elementos podem ser incomparáveis, o que significa que a operação binária gera um resultado indefinido. Isso não é considerado pela ordem linear.

Assim, formalmente, para um conjunto S com uma relação binária R

R ⊆ S x S

R será considerada uma pré-ordem se, para todos:

s, s', s" ∈ S

temos reflexividade, que é formalmente representada como:

s ≦ s

e também transitividade, que está implícita da seguinte forma:

s ≦ s' e s' ≦ s", que é s ≦ s"

A ordem parcial, conforme mencionado acima, adiciona antissimetria à pré-ordem, portanto, se:

s ≦ s' e s' ≦ s, então s = s',

o que implica que apenas um de s ou s' é representado na saída.

A ordenação linear adiciona comparabilidade à ordem parcial, de modo que, para quaisquer dois elementos, há uma relação definida:

s ≦ s' ou s' ≦ s,

o que significa que resultados indefinidos não são considerados.

Conforme mencionado acima, esses formatos de ordem são úteis para denotar padrões que podem ajudar na tomada de decisões em qualquer sistema de negociação. Neste artigo, recriaremos os conjuntos monoides de etapas internas usados nos artigos anteriores para o período de análise retrospectiva, preço e indicador aplicados, mantendo os conjuntos finitos de período e ação de negociação para simplificar. Como no artigo anterior, o principal parâmetro a ser testado será a ordem de decisão; no entanto, como estaremos analisando uma ordem parcial, há a possibilidade de resultados incertos. Isso significa que nossa ordem de saída dos conjuntos de monoides que representam os pontos de decisão pode ser menor do que a ordem de entrada 3. Pode ser 2 ou até 1. Isso significa que, em determinadas situações, talvez tenhamos de tomar apenas 3 ou 4 decisões, em vez das 5 padrão, ao avaliar se devemos alterar nosso stop loss.


Aplicação da relação de ordem no MQL5

Neste artigo, não consideraremos a pré-ordem, pois, se fosse esse o caso, o artigo ficaria muito extenso. Em vez disso, vamos nos concentrar em ordens parciais e lineares. Como já temos estruturas de dados que definem nossas cinco etapas de negociação de acordo com o artigo anterior, a principal coisa que se espera da implementação de uma relação de ordem são funções binárias que processam nossas estruturas de dados e geram um conjunto (geralmente um subconjunto dos dados de entrada). Como estamos considerando uma ordem parcial e linear, haverá uma função diferente para cada uma delas.

Pode ser útil enfatizar as diferenças e as vantagens relativas das duas formas de ordem que estamos vendo neste artigo. Conforme mencionado acima, a ordem parcial permite a classificação indeterminada dos resultados, ao contrário da ordem linear. Isso pode ser útil em vários casos. Vejamos o caso simples de classificar as barras de preço em um gráfico como de alta ou de baixa. Nesse processo, é provável que você encontre uma vela Doji de pernas longas que, a rigor, não é nem de alta nem de baixa. Em uma classificação de ordem linear, esse ponto de dados teria de ser omitido, pois violaria o axioma da comparabilidade.

Entretanto, com a ordem parcial, a inclusão desse ponto de dados e, portanto, de seu resultado, tornará o conjunto de saída mais completo e representativo do conjunto de dados. Para mostrar por que isso é importante, as velas Doji de pernas longas e outras velas semelhantes, incluindo a Doji Lápide e a Doji Libélula, tendem a aparecer nas principais áreas de suporte e resistência de preço. Assim, se sua classificação não tiver nenhum desses padrões, sua análise e, portanto, suas previsões serão menos precisas, pois, para a maioria dos sistemas de negociação de longo prazo, as áreas de suporte e resistência de preço desempenham um papel crucial na determinação das configurações de negociação. Assim, a adição da propriedade de antissimetria em uma ordem parcial pode ser usada para filtrar melhor os sinais de negociação.

Considerar um sistema de negociação que difere de nosso processo de cinco etapas discutido em artigos anteriores pode envolver a vetorização das barras de preço. Ao exibir cada barra de preço como um vetor, que é simplesmente um array de pesos, podemos comparar a semelhança entre diferentes padrões. Se treinarmos por um período de tempo suficiente e identificarmos possíveis formações de preços para um número significativo de modelos vetorizados, poderemos comparar qualquer novo modelo com o que foi treinado e, com base na distância euclidiana em relação a esses modelos treinados, o modelo mais próximo do nosso novo modelo poderá considerar sua formação "pós-preço" como o resultado mais provável do novo modelo.

A ordem linear pode ser preferível à ordem parcial em casos de análise de portfólio. Se estivermos diante de uma grande variedade de ativos a serem avaliados ou incluídos em um portfólio, a ordem linear com requisitos rigorosos de igual ponderação (comparabilidade) é obrigatória. Isso se deve a vários motivos, alguns dos quais são considerados óbvios. A ordem linear permite que os ativos sejam avaliados de maneira consistente, o que proporciona um processo otimizado. Independentemente do número de ativos, as prioridades já são identificadas por meio da ponderação dos ativos, que pode ser um valor que abrange desde o valor realizado no passado até o risco potencial futuro. Isso não apenas aumenta a eficiência, mas também permite que o trader evite dispersar sua atenção por todos os ativos possíveis.

Essa priorização significa que as decisões de investimento nos ativos mais importantes são consideradas primeiro, o que leva à questão crítica da alocação de ativos. Como será determinado o tamanho de cada ativo no portfólio? Em uma ordem linear, o peso de cada ativo pode, muitas vezes, funcionar como um indicador justo de quanto capital deve ser usado para comprar o ativo, o que seria mais difícil de ser feito de forma consistente em uma ordem parcial.


Exemplo: Desenvolvimento de um sistema de negociação com diferentes formatos de ordem

A estratégia de negociação escolhida é baseada no sistema que discutimos em artigos anteriores e envolverá a seleção das etapas intermediárias 2 a 4 do nosso método de 5 etapas. Nós as selecionaremos usando o método de ordem parcial em um sistema de negociação e o método de ordem linear em outro sistema.

Para a seleção imediata da ordem parcial, todos os nossos conjuntos de monoides são não comparáveis porque temos um período de observação, que é do tipo inteiro. Aplicamos um preço, que é uma enumeração de strings, e, por fim, um tipo de indicador, que também é, estritamente falando, uma seleção de strings. Logo, para introduzir a possibilidade de usar um operador binário:


Normalizamos apenas dois conjuntos, deixando o terceiro conjunto no formato padrão. Os dados de entrada para a função de ordem parcial serão inerentemente uma ação de preço. Os parâmetros de preço que consideraremos como entradas para nossa função de ordem parcial serão indexados pela autocorrelação. Simplesmente atribuiremos índices aos vários padrões de autocorrelação e, para cada índice, teremos um par de conjuntos normalizados específicos, que informarão a ordem que escolheremos para nosso sistema de negociação. Para uma ordem parcial, como acima, ter conjuntos indefinidos significa que apenas dois conjuntos serão escolhidos, o que significa que quase certamente sempre teremos um processo de 4 etapas em vez do processo de 5 etapas que usamos.

Entretanto, para a ordem linear, todos os conjuntos monoidais serão normalizados. Isso deve nos dar as cinco etapas completas que estamos considerando e, assim como na ordem parcial, a entrada para a função de ordem linear será o nosso índice de autocorrelação. A atribuição do índice de autocorrelação será muito simples, como você pode ver na listagem abaixo.

//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
bool CTrailingCT::Ordering(int Lookback)
   {
      m_low.Refresh(-1);
      m_high.Refresh(-1);
      m_close.Refresh(-1);
      
      double _c[],_l[],_h[];
      
      ArrayResize(_c,Lookback);ArrayInitialize(_c,0.0);
      ArrayResize(_l,Lookback);ArrayInitialize(_l,0.0);
      ArrayResize(_h,Lookback);ArrayInitialize(_h,0.0);
      
      for(int i=0;i<Lookback;i++)
      {
         _c[i]=m_close.GetData(i);
         _l[i]=m_low.GetData(Lookback+i);
         _h[i]=m_high.GetData(Lookback+i);
      }
      
      double _r_h=0.0,_r_l=0.0;
      
      if(MathCorrelationSpearman(_c,_l,_r_l) && MathCorrelationSpearman(_c,_h,_r_h))
      {
         if(_r_l>=__PHI){ LongIndex(5); }
         else if(_r_l>=1.0-__PHI){ LongIndex(4); }
         else if(_r_l>=0.0){ LongIndex(3); }
         else if(_r_l>=(-1.0+__PHI)){ LongIndex(2); }
         else if(_r_l>=(-__PHI)){ LongIndex(1); }
         else{ LongIndex(0);}
         
         if(_r_h>=__PHI){ ShortIndex(5); }
         else if(_r_h>=1.0-__PHI){ ShortIndex(4); }
         else if(_r_h>=0.0){ ShortIndex(3); }
         else if(_r_h>=(-1.0+__PHI)){ ShortIndex(2); }
         else if(_r_h>=(-__PHI)){ ShortIndex(1); }
         else{ ShortIndex(0);}
         
         return(true);
      }
      
      return(false);
   }


Para lidar com a ordem parcial, o código será incorporado nas funções de processamento de trailing stop longo e curto, conforme descrito no anexo a este artigo. O que é notável aqui é que, de fato, cada índice atribuído associa apenas dois conjuntos, já que o terceiro conjunto não é definido. A ordem definida por cada índice possível implica que o primeiro conjunto atribuído tem um peso maior do que o último. Assim, a necessidade de criar uma função de normalização que dê um peso físico a cada um é cancelada, pois não terá um impacto significativo no resultado final.

Da mesma forma, uma função de ordem linear seria parecida com a seguinte:

	ENUM_TIMEFRAMES _timeframe=GetTimeframe(m_timeframe,__TIMEFRAMES);
         
         int _lookback=m_default_lookback;
         ENUM_APPLIED_PRICE _appliedprice=__APPLIEDPRICES[m_default_appliedprice];
         double _indicator=m_default_indicator;
         
         if(m_long_index==0)
         {
            _lookback=GetLookback(m_lookback,__LOOKBACKS,_timeframe);
            _appliedprice=GetAppliedprice(m_appliedprice,__APPLIEDPRICES,_lookback,_timeframe);
            _indicator=GetIndicator(_lookback,_timeframe,_appliedprice);
         }
         else if(m_long_index==1)
         {
            _appliedprice=GetAppliedprice(m_appliedprice,__APPLIEDPRICES,__LOOKBACKS[m_default_lookback],_timeframe);
            _lookback=GetLookback(m_lookback,__LOOKBACKS,_timeframe);
            _indicator=GetIndicator(_lookback,_timeframe,_appliedprice);
         }
         else if(m_long_index==2)
         {
            _appliedprice=GetAppliedprice(m_appliedprice,__APPLIEDPRICES,__LOOKBACKS[m_default_lookback],_timeframe);
            _indicator=GetIndicator(m_default_lookback,_timeframe,_appliedprice);
            _lookback=GetLookback(m_lookback,__LOOKBACKS,_timeframe);
         }
         else if(m_long_index==3)
         {
            _indicator=GetIndicator(__LOOKBACKS[m_default_lookback],_timeframe,__APPLIEDPRICES[m_default_appliedprice]);
            _appliedprice=GetAppliedprice(m_appliedprice,__APPLIEDPRICES,m_default_lookback,_timeframe);
            _lookback=GetLookback(m_lookback,__LOOKBACKS,_timeframe);
         }
         else if(m_long_index==4)
         {
            _indicator=GetIndicator(__LOOKBACKS[m_default_lookback],_timeframe,__APPLIEDPRICES[m_default_appliedprice]);
            _lookback=GetLookback(m_lookback,__LOOKBACKS,_timeframe);
            _appliedprice=GetAppliedprice(m_appliedprice,__APPLIEDPRICES,_lookback,_timeframe);
         }
         else if(m_long_index==5)
         {
            _lookback=GetLookback(m_lookback,__LOOKBACKS,_timeframe);
            _indicator=GetIndicator(_lookback,_timeframe,__APPLIEDPRICES[m_default_appliedprice]);
            _appliedprice=GetAppliedprice(m_appliedprice,__APPLIEDPRICES,_lookback,_timeframe);
         }
         //
         int _trade_decision=GetTradeDecision(_timeframe,_lookback,_appliedprice,_indicator);


O que é notável aqui é que cada índice fornece uma lista exaustiva de todos os conjuntos, uma vez que a comparabilidade é um requisito para todos os conjuntos. E, conforme mencionado acima, o procedimento de atribuir números de ponderação a cada conjunto, que são então usados na classificação, é evitado porque a indexação usada envolve uma ordem de ponderação, que é implementada conforme mostrado acima.

Se executarmos testes usando nossas novas classes de trailing, na classe de sinais da biblioteca Awesome Oscillator usando margem fixa para o símbolo USDJPY nos últimos 12 meses, obteremos os seguintes relatórios para cada um dos métodos de ordem. Método de ordem parcial:

r_2


Nosso EA ganhou mais de 100 mil, como sempre acontece nesta série, se não usarmos preços-alvo para take profit ou stop loss, mas mantivermos as posições somente até que o indicador de sinal considere que elas devam ser fechadas. Além disso, à medida que melhoramos nosso trailing stop, a maioria das posições fechadas lucrativas estava, na verdade, relacionada ao nosso trailing stop, o que mostra a vantagem da ordem parcial na criação de indicadores confiáveis de configuração de trailing stop. Também testamos trailing stops com base em ordem linear. Os resultados estão resumidos abaixo.

r_2


Os lucros aqui são surpreendentemente menores do que os obtidos com a ordem parcial ("ambígua", adaptativa). Curiosamente, o rebaixamento do capital se torna ainda maior com menos operações. É necessário testar por períodos mais longos e em vários símbolos para tirar conclusões definitivas, mas é seguro dizer que a ordem parcial é mais promissora do que a ordem linear.


Conclusão

Analisamos a eficácia da ordem parcial em comparação com a linear ao configurar e modificar um trailing stop para um EA típico. Anteriormente, analisamos os méritos relativos dos dois princípios de ordenação e não consideramos o princípio vinculativo de ambos, ou seja, a pré-ordem, pois isso teria tornado o artigo muito extenso, acrescentando pouco conteúdo. Lembre-se de que a ordem parcial é uma forma especializada de pré-ordem, e a ordem linear também é uma forma especializada de ordem parcial. Como as definições básicas desses tipos de ordenação são praticamente as mesmas, vamos nos concentrar nas duas últimas.

Os métodos de relação de ordem linear e parcial foram usados por suas vantagens específicas. A ordem parcial oferece maior flexibilidade na classificação de conjuntos de dados brutos, o que pode levar a análises mais ricas e precisas. Por outro lado, a ordem linear mais rígida tende a exigir a normalização dos dados brutos para garantir a comparabilidade, levando à priorização geral e à eficiência da tomada de decisões.

Esses métodos de ordenação têm potencial para serem estudados e refinados à medida que começamos a integrar conceitos anteriores a novos conceitos. 

Traduzido do Inglês pela MetaQuotes Ltd.
Artigo original: https://www.mql5.com/en/articles/12873

Arquivos anexados |
TrailingCT_12_2.mqh (50.71 KB)
ct_12.mqh (27.33 KB)
Redes neurais de maneira fácil (Parte 48): métodos para reduzir a superestimação dos valores da função Q Redes neurais de maneira fácil (Parte 48): métodos para reduzir a superestimação dos valores da função Q
No artigo anterior, nós exploramos o método DDPG, projetado para treinar modelos em espaços de ação contínua. No entanto, como outros métodos de aprendizado Q, ele está sujeito ao problema da sobreavaliação dos valores da função Q. Esse problema geralmente leva eventualmente ao treinamento de um agente com uma estratégia não otimizada. Neste artigo, examinaremos algumas abordagens para superar o problema mencionado.
Teoria das Categorias em MQL5 (Parte 11): Grafos Teoria das Categorias em MQL5 (Parte 11): Grafos
Esse artigo é uma continuação da série sobre como implementar a teoria das categorias no MQL5. Aqui consideramos como a teoria dos grafos pode ser integrada com monoides e outras estruturas de dados ao desenvolver uma estratégia para fechar um sistema de negociação.
Desenvolvendo um sistema de Replay (Parte 34): Sistema de Ordens (III) Desenvolvendo um sistema de Replay (Parte 34): Sistema de Ordens (III)
Vamos neste artigo concluir a primeira fase da construção. Será algo relativamente rápido, mas explicarei detalhes que podem não ter sido comentados no passado. Mas ainda assim aqui explicarei algumas coisas que muitos não entender por que são como são. Um destes casos é o Mouse. Você sabe o motivo de ter que pressionar a tecla Shift ou Ctrl no teclado ?!?!
Desenvolvendo um sistema de Replay (Parte 33): Sistema de Ordens (II) Desenvolvendo um sistema de Replay (Parte 33): Sistema de Ordens (II)
Vamos continuar o desenvolvimento do sistema de ordens. Mas você irá ver que iremos fazer uma reutilização massiva de coisas já vistas em outros artigos. Mesmo assim teremos um bônus neste artigo. Iremos desenvolver, primeiramente um sistema que consiga ser operado junto ao servidor de negociação real, seja usando uma conta demo, seja usando uma conta real. Vamos fazer uso massivo e extensivo da plataforma MetaTrader 5, para nos fornecer todo o suporte do qual precisaremos neste inicio de jornada