Обсуждение статьи "Исследования технических фигур Меррилла"

 

Опубликована статья Исследования технических фигур Меррилла:

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

Для того чтобы было предельно ясно каким образом и для каких входных данных мы будем применять модель технических фигур Меррилла, необходимо разобраться что они из себя представляют. Основные две категории — это фигуры, которые выглядят в виде английских букв M и W. Они называются M-паттернами и W-паттернами. В каждой из этих категорий находиться по 16 фигур.

На рис.1 представлены 16 М-паттернов внешне, так или иначе, напоминающих букву М. Как видно из картинки, различие их состоит во взаимном расположении пяти точек, составляющих паттерн.  

 


Автор: Alexander Fedosov

 
Паттерны М2 и М4 на картинках одинаковые - это опечатка?
 

Интересный материал, спасибо!

не понравилась реализация распознавания паттернов:

//+------------------------------------------------------------------+
//| Распознавание паттернов                                          |
//+------------------------------------------------------------------+
PATTERN_TYPE CProgram::GetPatternType(double A,double B,double C,double D,double E)

понятно, что свою задачу метод выполняет, возможно для данной статьи это оптимальное решение


хотелось бы найти более изящное (универсальное) решение такой задачи, что то похожее как матрица для хранения данных(массив)? - кто нибудь встречал такую реализацию поиска паттернов?

 
Sergey Pavlov:
Паттерны М2 и М4 на картинках одинаковые - это опечатка?

Исправим, спасибо.

 
Igor Makanu:

Интересный материал, спасибо!

не понравилась реализация распознавания паттернов:

понятно, что свою задачу метод выполняет, возможно для данной статьи это оптимальное решение


хотелось бы найти более изящное (универсальное) решение такой задачи, что то похожее как матрица для хранения данных(массив)? - кто нибудь встречал такую реализацию поиска паттернов?

Можно конечно было загнать всё это в структуру или массив. Но так пока проще понять с нуля в виде точек ломаной.

 
Igor Makanu:

...

хотелось бы найти более изящное (универсальное) решение такой задачи, что то похожее как матрица для хранения данных(массив)? - кто нибудь встречал такую реализацию поиска паттернов?

Было, делал универсально. Но вряд ли найду, даже не знаю с чего начать искать.

Есть одна линия, это две точки. Третья точка может занять одну из двух позиций: между первой и второй точкой, или выше первой точки (допустим, что первый отрезок направлен вверх). Теперь есть три точки, четвертая может занять одну из трех позиций или дну из двух... Сначала в массиве две точки, стоишь на индексе 1, добавляешь в конец массива все варианты расположения третьей точки. Переходишь к индексу 2, еще в конец массива добавляешь все варианты расположения еще одной точки... и т.д. Сам паттерн задается номеров, как размер массива достиг указанного размера - вот он паттерн с этим номером. Нужен массив структур, а в структуре массив с номерами точек.

***

В массиве не координаты точек располагались, а номера вершин от начала. К примеру, М16, вот так бы кодировался: {1, 3, 2, 5, 4}. А если еще вершину добавить, то такие варианты получаются?

{1, 3, 2, 5, 4}

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

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


***

А проверять так. Допустим, ищем паттерн: {1, 3, 2, 5, 4} Это значит, что вершина 1 ниже 3, 5 - выше 2 и ниже 4 и т.д. 

 
Dmitry Fedoseev:

Было, делал универсально. Но вряд ли найду, даже не знаю с чего начать искать.

Есть одна линия, это две точки. Третья точка может занять одну из двух позиций: между первой и второй точкой, или выше первой точки (допустим, что первый отрезок направлен вверх). Теперь есть три точки, четвертая может занять одну из трех позиций или дну из двух... Сначала в массиве две точки, стоишь на индексе 1, добавляешь в конец массива все варианты расположения третьей точки. Переходишь к индексу 2, еще в конец массива добавляешь все варианты расположения еще одной точки... и т.д. Сам паттерн задается номеров, как размер массива достиг указанного размера - вот он паттерн с этим номером. Нужен массив структур, а в структуре массив с номерами точек.

***

В массиве не координаты точек располагались, а номера вершин от начала. К примеру, М16, вот так бы кодировался: {1, 3, 2, 5, 4}. А если еще вершину добавить, то такие варианты получаются?

{1, 3, 2, 5, 4}

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

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


***

А проверять так. Допустим, ищем паттерн: {1, 3, 2, 5, 4} Это значит, что вершина 1 ниже 3, 5 - выше 2 и ниже 4 и т.д. 

да, именно  такой способ кодирования и хотелось бы найти

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

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

Отличная работа - как в части постановки задачи, и его программного решения, так и в части реализации графического интерфейса.

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

Вероятно, в силу объёмности задачи, это может быть отдельной темой и отдельной публикацией.

 
Aleksandr Masterskikh:

Отличная работа - как в части постановки задачи, и его программного решения, так и в части реализации графического интерфейса.

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

Вероятно, в силу объёмности задачи, это может быть отдельной темой и отдельной публикацией.

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

В следующей статье я постараюсь расширить возможности приложения.

 
Alexander Fedosov:

Можно конечно было загнать всё это в структуру или массив. Но так пока проще понять с нуля в виде точек ломаной.

понятно, что кроме универсальности, в статье еще должен быть код наглядным и читаемым, но люблю задачи на комбинаторику, или пошевелить извилинами, вот через поиск в МЕ сгруппировал эту функцию по первому условию:

//+------------------------------------------------------------------+
//| Распознавание паттернов                                          |
//+------------------------------------------------------------------+
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);
  }

все равно должно быть компактное и универсальное решение!... но я пока его еще не вижу

 
Igor Makanu:

понятно, что кроме универсальности, в статье еще должен быть код наглядным и читаемым, но люблю задачи на комбинаторику, или пошевелить извилинами, вот через поиск в МЕ сгруппировал эту функцию по первому условию:

все равно должно быть компактное и универсальное решение!... но я пока его еще не вижу

Так хорошее решение выше Дмитрий предложил. Его можно обыграть так:

В аргументах метода GetPatternType передавать размерность паттерна и всё. Он сам из этой цифры составляет все возможные комбинации и на основе этих данных ищет заданный в структуре или массиве.