Discussão do artigo "Estudo dos padrões de Merrill"

 

Novo artigo Estudo dos padrões de Merrill foi publicado:

Neste artigo, nós examinaremos o modelo de padrões de Merrill e tentaremos avaliar qual a sua relevância atual. Para isso, nós desenvolveremos uma ferramenta para testar tais padrões e aplicar o modelo a vários tipos de dados, como preços de fechamento, máxima e mínima, além dos osciladores.

Para esclarecer como e para quais dados nós vamos aplicar os padrões de Merrill, nós precisamos entender o que eles realmente são. As duas principais categorias são os padrões que se assemelham às letras M e W. Eles são chamados de padrões M e W. Cada uma das categorias contém 16 padrões.

Fig. 1 Representação visual dos 16 padrões M. Como nós podemos ver, a diferença está no arranjo mútuo dos cinco pontos que compõem o padrão.  

Autor: Alexander Fedosov

 
Os padrões M2 e M4 nas fotos são os mesmos - isso é um erro de digitação?
 

Material interessante, obrigado!

Não gostei da implementação do reconhecimento de padrões:

//+------------------------------------------------------------------+
//|| Reconhecimento de padrões|
//+------------------------------------------------------------------+
PATTERN_TYPE CProgram::GetPatternType(double A,double B,double C,double D,double E)

está claro que o método cumpre sua tarefa, talvez para este artigo seja a solução ideal


Eu gostaria de encontrar uma solução mais elegante (universal) para esse problema, algo como uma matriz para armazenar dados (array)? - Alguém já se deparou com uma implementação desse tipo de pesquisa de padrões?

 
Sergey Pavlov:
Os padrões M2 e M4 nas fotos são os mesmos - isso é um erro de digitação?

Vamos corrigi-lo, obrigado.

 
Igor Makanu:

Material interessante, obrigado!

Não gostei da implementação do reconhecimento de padrões:

está claro que o método cumpre sua tarefa, talvez para este artigo seja a solução ideal


Eu gostaria de encontrar uma solução mais elegante (universal) para esse problema, algo como uma matriz para armazenar dados (array)? - Alguém já encontrou uma implementação desse tipo de pesquisa de padrões?

É claro que poderíamos colocar tudo em uma estrutura ou matriz. Mas, até agora, é mais fácil entender do zero na forma de pontos de uma polilinha.

 
Igor Makanu:

...

Eu gostaria de encontrar uma solução mais elegante (universal) para esse problema, algo como uma matriz para armazenar dados (array)? - Alguém já se deparou com uma implementação desse tipo de pesquisa de padrões?

Eu encontrei, fiz isso universalmente. Mas é improvável que eu a encontre, nem sei por onde começar a procurar.

Há uma linha, há dois pontos. O terceiro ponto pode ocupar uma de duas posições: entre o primeiro e o segundo ponto, ou acima do primeiro ponto (vamos supor que a primeira linha esteja direcionada para cima). Agora há três pontos, o quarto ponto pode ocupar uma das três posições ou a parte inferior de dois.... Primeiro, há dois pontos na matriz, você fica no índice 1 e adiciona todas as variantes da localização do terceiro ponto ao final da matriz. Você se move para o índice 2, adiciona todas as variantes de outro ponto ao final da matriz.... etc. O padrão em si é definido por números, assim que o tamanho da matriz atinge o tamanho especificado - aqui está o padrão com esse número. Você precisa de uma matriz de estruturas e, na estrutura, uma matriz com números de pontos.

***

A matriz não contém coordenadas de pontos, mas números de vértices desde o início. Por exemplo, M16 seria codificado da seguinte forma: {1, 3, 2, 5, 4}. E se você adicionar outro vértice, obterá estas opções?

{1, 3, 2, 5, 4}

{1, 3, 2, 5, 6, 4}

{1, 3, 2, 5, 4, 6}


***

Veja como verificamos isso. Digamos que estejamos procurando um padrão: {1, 3, 2, 5, 4} Isso significa que o vértice 1 está abaixo de 3, 5 está acima de 2 e abaixo de 4, etc.

 
Dmitry Fedoseev:

Era, era universal. Mas acho que não vou encontrá-lo, nem sei por onde começar a procurar.

Há uma linha, são dois pontos. O terceiro ponto pode ocupar uma de duas posições: entre o primeiro e o segundo ponto, ou acima do primeiro ponto (vamos supor que a primeira linha esteja direcionada para cima). Agora há três pontos, o quarto ponto pode ocupar uma das três posições ou a parte inferior de dois.... Primeiro, há dois pontos na matriz, você fica no índice 1 e adiciona todas as variantes da localização do terceiro ponto ao final da matriz. Você se move para o índice 2, adiciona todas as variantes de outro ponto ao final da matriz.... etc. O padrão em si é definido por números, assim que o tamanho da matriz atinge o tamanho especificado - aqui está o padrão com esse número. Você precisa de uma matriz de estruturas e, na estrutura, uma matriz com números de pontos.

***

A matriz não contém coordenadas de pontos, mas números de vértices desde o início. Por exemplo, M16 seria codificado da seguinte forma: {1, 3, 2, 5, 4}. E se você adicionar outro vértice, obterá essas variantes?

{1, 3, 2, 5, 4}

{1, 3, 2, 5, 6, 4}

{1, 3, 2, 5, 4, 6}


***

E a maneira de verificar isso é a seguinte. Digamos que estejamos procurando um padrão: {1, 3, 2, 5, 4} Isso significa que o vértice 1 está abaixo de 3, 5 está acima de 2 e abaixo de 4, etc.

Sim, esse é o tipo de codificação que eu gostaria de encontrar.

Parece uma matriz de adjacência de gráfico ponderado, em que o peso significa qual vértice é mais alto/baixo do que o vértice atual.

Матрица смежности графа — Викиконспекты
Матрица смежности графа — Викиконспекты
  • neerc.ifmo.ru
Матрицей смежности (англ. Adjacency matrix) невзвешенного графа называется матрица , в которой — количество рёбер, соединяющих вершины и , причём при каждую петлю учитываем дважды, если граф не является ориентированным, и один раз, если граф ориентирован. Матрицей смежности (англ. Adjacency matrix) взвешенного графа называется матрица , в...
 

Excelente trabalho, tanto em termos da declaração do problema e de sua solução de software quanto em termos da implementação da interface gráfica.

E apenas a título de sugestão: se possível, acrescente os resultados da pesquisa sobre a eficácia das próprias figuras para encontrar pontos de entrada no mercado.

Provavelmente, devido à natureza volumosa da tarefa, esse pode ser um tópico separado e uma publicação separada.

 
Aleksandr Masterskikh:

Excelente trabalho, tanto em termos da declaração do problema e de sua solução de software quanto da implementação da GUI.

E apenas como sugestão: se possível, adicione os resultados da pesquisa sobre a eficácia das próprias figuras para encontrar pontos de entrada no mercado.

Provavelmente, devido à natureza volumosa da tarefa, esse pode ser um tópico separado e uma publicação separada.

Obrigado, Alexander, por gostar do meu artigo. Sobre a pesquisa, o aplicativo deste artigo está pronto para eles. As opções de personalização atuais já apresentam um grande número de opções de pesquisa.

No próximo artigo, tentarei expandir as possibilidades do aplicativo.

 
Alexander Fedosov:

É claro que poderíamos colocar tudo isso em uma estrutura ou matriz. Mas, dessa forma, é mais fácil entender do zero na forma de pontos de uma polilinha.

É claro que, além da universalidade, o código no artigo deve ser claro e legível, mas eu gosto de problemas combinatórios ou de mexer com meu cérebro, então agrupei essa função pela primeira condição por meio de uma pesquisa no ME:

//+------------------------------------------------------------------+
//|| Reconhecimento de padrões|
//+------------------------------------------------------------------+
PATTERN_TYPE GetPatternType(double A,double B,double C,double D,double E)
  {
   if(A>B && C>A && B>E && E>D) return(W6);
   if(A>B && C>E && E>A && B>D) return(W11);
   if(A>B && E>C && C>A && B>D)return(W12);
   if(A>B && C>E && E>D && D>A)return(W15);
   if(A>B && E>C && C>D && D>A) return(W16);

// A>C
   if(A>C && B>D && D>A && C>E) return(M3);
   if(A>C && B>D && D>E && E>A) return(M8);
   if(A>C && D>B && B>E && E>A) return(M10);
   if(A>C && C>B && B>E && E>D) return(W1);
   if(A>C && C>E && E>B && B>D) return(W2);
   if(A>C && C>E && E>D && D>B) return(W4);
   if(A>C && E>A && C>B && B>D) return(W8);
   if(A>C && E>A &&  C>D && D>B)return(W10);
// C>A else ? 
   if(C>A && B>D && D>C && A>E) return(M7);
   if(C>A && D>B && B>C && A>E) return(M9);
   if(C>A && B>D && D>E && E>C) return(M13);
   if(C>A && D>B && B>E && E>C) return(M15);
   if(C>A && D>E && E>B && B>C) return(M16);
   if(C>A && A>E && E>B && B>D) return(W7);
   if(C>A && A>E && E>D && D>B) return(W9);
   if(C>A && E>C && A>D && D>B) return(W14);
   
   
   if(B>A && A>D && D>C && C>E) return(M1);
   if(B>A && A>D && D>E && E>C) return(M2);
   if(B>A && D>B && A>C && C>E) return(M5);
   if(B>A && D>B && A>E && E>C) return(M6);
   if(B>A && D>E && E>B && A>C) return(M11);
   

   if(B>D && D>A && A>E && E>C) return(M4);
   if(B>D && D>C && C>E && E>A) return(M12);
   if(B>D && A>E && E>C && C>B) return(W3);
   if(D>B && B>C && C>E && E>A) return(M14);
   if(D>B && A>E && E>C && C>D) return(W5);
   if(D>B && C>E && E>A && A>D) return(W13);
   
   
   return(-1);
  }

ainda deve haver uma solução compacta e universal!..... mas ainda não a vi

 
Igor Makanu:

É claro que, além da universalidade, o código no artigo também deve ser visual e legível, mas eu gosto de problemas de combinatória ou de mexer com meu cérebro, então agrupei essa função pela primeira condição por meio da pesquisa no ME:

ainda deve haver uma solução compacta e universal!..... mas ainda não a vi

Portanto, a solução acima sugerida por Dmitry é muito boa. Você pode fazer isso desta forma:

Nos argumentos do método GetPatternType, passe a dimensão do padrão e pronto. Ele mesmo faz todas as combinações possíveis a partir desse número e, com base nesses dados, procura uma determinada combinação em uma estrutura ou matriz.