Закономерности движений цен: Часть 1. Ориентация цены

 

Решил перенести сообщения в отдельную тему...

1. Началось всё с того, что перечитывал книгу Вильямса и решил проверить какова доля внутренних баров на графике. Далее решил сопоставить долю внутренних и внешних баров, в результате чего выявилась закономерность: доля внутренних баров выше доли внешних баров.

Напомню, что такое внутренние и внешние бары:

На скрине выше: бар B для бара А является внешним, а бар F для бара R является внутренним.

Для исследований в этой области был написан простой скрипт:

// Скрипт для подсчёта доли внешних и внутренних бар //
#property  copyright "Copyright © Svinotavr-2000"
#property  link      "DmitriyN"

int start()
 {
   double n;                // Количество бар всего, шт
   double KolVneshBar;      // Количество внешних бар, шт
   double KolVnutrBar;      // Количество внутренних бар, шт
   double ProcentVneshBar;  // Процент внешних бар, %
   double ProcentVnutrBar;  // Процент внутренних бар, %
   double OtnoshVnutKVnesh; // Отношение числа внутренних бар к числу внешних бар, раз
   // Берём число бар на единицу меньшее, чем всего
   n=Bars-1; 
   // Цикл по всем барам
        for(int j = 0; j < n; j++)
        {      
               // Считаем количество внешних бар
               if ((High[j+1] < High[j]) && (Low[j+1] > Low[j]))
               {
               KolVneshBar=KolVneshBar+1;
               }  
               // Считаем количество внутренних бар
               if ((High[j+1] > High[j]) && (Low[j+1] < Low[j]))
               {
               KolVnutrBar=KolVnutrBar+1;
               }      
         }
  // Считаем отношение числа внутренних бар к числу внешних бар
  OtnoshVnutKVnesh=KolVnutrBar/KolVneshBar;
  // Переводим в проценты
  ProcentVneshBar=KolVneshBar/n*100;
  ProcentVnutrBar=KolVnutrBar/n*100;
  // Формируем строки для печати
   string S0 = "\n" + "=============== Результаты расчётов ===============" + "\n" + "\n";  
   string S1 = "Исследовано бар = " + DoubleToStr(n,0)+ " шт" + "\n"; 
   string S2 = "Процент внешних бар = " + DoubleToStr(ProcentVneshBar,3) +" %" + "\n"; 
   string S3 = "Процент внутренних бар = " + DoubleToStr(ProcentVnutrBar,3)+ " %" +"\n";
   string S4 = "Отношение числа внутренних бар к числу внешних бар = " + DoubleToStr(OtnoshVnutKVnesh,2);
  // Выводим на экран     
   Comment(S0, S1, S2, S3, S4);          
 }

Пример результата работы скрипта:

2. Далее, следуя этой логике, решил исследовать соотношение внутрених и внешних треугольников. Внутренние треугольники я назвал затухающими, а внешние - разгорающимися.
С этой целью был написан простейший скрипт:

// Скрипт для подсчёта соотношения чисел затухающих и разгорающихся треугольников //
// Skript OtnoshZatRazTreug, июнь 2012
// Примечание: скрипт может немного подвисать на ТФ M1.
#property  copyright "Copyright © Svinotavr-2000"
#property  link      "DmitriyN"

int start()
 { 
   // Декларация
   double DliPer;           // Длительность периода исследования, лет
   double n;                // Количество бар, шт
   double KolZatTre;        // Количество затухающих треугольников, шт
   double KolRazTre;        // Количество разгорающихся треугольников, шт   
   double OtnoshZatRaz;     // Отношение числа затухающих треугольников к числу разгорающихся, раз
   double Pogreshnost;      // Погрешность исследования, %
   // Берём число бар на 5 меньшее, чем всего
   n=Bars-5; 
        // Цикл по всем барам
        for(int j = 0; j < n; j++)
        {             
               // Считаем количество ЗАТУХАЮЩИХ треугольников    ===========              
               
               // Проверяем, являются ли High баров после начального бара (j+5) 
               // _ меньше либо равными High начального бара (j+5)
               if (High[j+5] >= High[j+4]) {
               if (High[j+5] >= High[j+3]) {
               if (High[j+5] >= High[j+2]) {
               if (High[j+5] >= High[j+1]) {
               if (High[j+5] >= High[j])   {
               // Проверяем, являются ли Low баров после начального бара (j+5) 
               // _ больше либо равными Low начального бара (j+5)
               if (Low[j+5] <= Low[j+4])   {
               if (Low[j+5] <= Low[j+3])   {
               if (Low[j+5] <= Low[j+2])   {
               if (Low[j+5] <= Low[j+1])   {
               if (Low[j+5] <= Low[j])     {
               KolZatTre=KolZatTre+1;               
               }}}}}  }}}}}
               
               // Считаем количество РАЗГОРАЮЩИХСЯ треугольников ===========                
               
               // Проверяем, являются ли High баров после начального бара (j+5) 
               // _ больше либо равными High начального бара (j+5)
               if (High[j+5] <= High[j+4]) {
               if (High[j+5] <= High[j+3]) {
               if (High[j+5] <= High[j+2]) {
               if (High[j+5] <= High[j+1]) {
               if (High[j+5] <= High[j])   {
               // Проверяем, являются ли Low баров после начального бара (j+5) 
               // _ меньше либо равными Low начального бара (j+5)
               if (Low[j+5] >= Low[j+4])   {
               if (Low[j+5] >= Low[j+3])   {
               if (Low[j+5] >= Low[j+2])   {
               if (Low[j+5] >= Low[j+1])   {
               if (Low[j+5] >= Low[j])     {
               KolRazTre=KolRazTre+1;               
               }}}}}  }}}}}                          
         }
  // Вычисляем длительность периода истории исследования (календарный)
  DliPer = n*Period()/(1440*365);         
  // Считаем отношение числа затухающих треугольников к разгорающимся
  OtnoshZatRaz=KolZatTre/KolRazTre;
  // Вычисляем погрешность расчётов
  Pogreshnost=(1/(KolZatTre) + 1/(KolRazTre))*100;
  // Формируем строки для печати
   string S0 = "\n" + "================= Результаты расчётов =================" + "\n" + "\n";  
   string S1 = "Исследовано бар = " + DoubleToStr(n,0)+ " шт" + "\n";
   string S2 = "Длительность периода исследования = " + DoubleToStr(DliPer,1)+ " лет" + "\n";
   string S3 = "Погрешность расчётов = " + DoubleToStr(Pogreshnost,3)+ " %"+ "\n";  
   string S4 = "Отношение числа затухающих треугольников к разгорающимся = " + DoubleToStr(OtnoshZatRaz,3)+ " раз";
  // Выводим строки на экран     
   Comment(S0, S1, S2, S3, S4);          
 }

Вышеуказанный скрипт анализировал треугольники размером в 6 (шесть) бар. В этом скрипте был добавлен очень простой способ расчёта погрешности вычислений.

Пример результата работы скрипта:

Напомню, что такое затухающиеся и разгорающиеся треугольники. Пример затухающего треугольника (1) и разгорающегося (2):

1). 2).

 

3. Далее, решил увеличить число баров в треугольниках до 7, немного переделал скрипт:

// Скрипт для подсчёта соотношения чисел затухающих и разгорающихся треугольников //
// Skript OtnoshZatRazTreug, июнь 2012
// Примечание: скрипт может немного подвисать на ТФ M1.
#property  copyright "Copyright © Svinotavr-2000"
#property  link      "DmitriyN"
//#property show_inputs     

int start()
 { 
   // Декларация
   double DliPer;           // Длительность периода исследования, лет
   double n;                // Количество бар, шт
   double KolZatTre;        // Количество затухающих треугольников, шт
   double KolRazTre;        // Количество разгорающихся треугольников, шт   
   double OtnoshZatRaz;     // Отношение числа затухающих треугольников к числу разгорающихся, раз
   double Pogreshnost;      // Погрешность исследования, %
   // Берём число бар на 6 меньшее, чем всего
   n=Bars-6; 
        // Цикл по всем барам
        for(int j = 0; j < n; j++)
        {             
               // Считаем количество ЗАТУХАЮЩИХ треугольников    ===========              
               
               // Проверяем, являются ли High баров после начального бара (j+5) 
               // _ меньше либо равными High начального бара (j+5)
               if (High[j+6] >= High[j+5]) {
               if (High[j+6] >= High[j+4]) {
               if (High[j+6] >= High[j+3]) {
               if (High[j+6] >= High[j+2]) {
               if (High[j+6] >= High[j+1]) {
               if (High[j+6] >= High[j])   {
               // Проверяем, являются ли Low баров после начального бара (j+5) 
               // _ больше либо равными Low начального бара (j+5)
               if (Low[j+6] <= Low[j+5])   {
               if (Low[j+6] <= Low[j+4])   {
               if (Low[j+6] <= Low[j+3])   {
               if (Low[j+6] <= Low[j+2])   {
               if (Low[j+6] <= Low[j+1])   {
               if (Low[j+6] <= Low[j])     {
               KolZatTre=KolZatTre+1;               
               }}}}}}  }}}}}}
               
               // Считаем количество РАЗГОРАЮЩИХСЯ треугольников ===========                
               
               // Проверяем, являются ли High баров после начального бара (j+5) 
               // _ больше либо равными High начального бара (j+5)
               if (High[j+6] <= High[j+5]) {
               if (High[j+6] <= High[j+4]) {
               if (High[j+6] <= High[j+3]) {
               if (High[j+6] <= High[j+2]) {
               if (High[j+6] <= High[j+1]) {
               if (High[j+6] <= High[j])   {
               // Проверяем, являются ли Low баров после начального бара (j+5) 
               // _ меньше либо равными Low начального бара (j+5)
               if (Low[j+6] >= Low[j+5])   {
               if (Low[j+6] >= Low[j+4])   {
               if (Low[j+6] >= Low[j+3])   {
               if (Low[j+6] >= Low[j+2])   {
               if (Low[j+6] >= Low[j+1])   {
               if (Low[j+6] >= Low[j])     {
               KolRazTre=KolRazTre+1;               
               }}}}}}  }}}}}}                          
         }
  // Вычисляем длительность периода истории исследования (календарный)
  DliPer = n*Period()/(1440*365);         
  // Считаем отношение числа затухающих треугольников к разгорающимся
  OtnoshZatRaz=KolZatTre/KolRazTre;
  // Вычисляем погрешность расчётов
  Pogreshnost=(1/(KolZatTre) + 1/(KolRazTre))*100;
  // Формируем строки для печати
   string S0 = "\n" + "================= Результаты расчётов =================" + "\n" + "\n";  
   string S1 = "Исследовано бар = " + DoubleToStr(n,0)+ " шт" + "\n";
   string S2 = "Длительность периода исследования = " + DoubleToStr(DliPer,1)+ " лет" + "\n";
   string S3 = "Погрешность расчётов = " + DoubleToStr(Pogreshnost,3)+ " %"+ "\n";  
   string S4 = "Отношение числа затухающих треугольников к разгорающимся = " + DoubleToStr(OtnoshZatRaz,3)+ " раз"+ "\n";
   string S5 = "Число затухающих треугольников = " + DoubleToStr(KolZatTre,0)+ " шт"+ "\n";
   string S6 = "Число разгорающихся треугольников = " + DoubleToStr(KolRazTre,0)+ " шт";
  // Выводим строки на экран     
   Comment(S0, S1, S2, S3, S4, S5, S6);          
 }

Пример результата работы скрипта:



Согласитесь, разницу в 23,1 раз при точности расчётов немногим более 2% сложно не назвать закономерностью.

Какой вывод из всего это можно сделать? Вывод - цена имеет ориентацию (направление).

Вполне возможно, что если цену вывернуть зеркально, то результаты работы многих советников будут совершенно иными и скорее всего - в пользу трейдеров:

Кому интересно - читайте, думайте, экспериментируйте ...
У кого есть желание проверить данную закономерность на графике со случайными приращениями, находящимися в нормальном распределении - дерзайте :)
Если у кого-то есть конструктивная критика (именно конструктивная, а не огульная) или предложения - буду рад выслушать.

 

из последних - вероятнее всего то что ты называешь затухающими треугольниками да ещё на часовках - это просто Сессионное уменьшение волатильности свечек :-)

и далее, ты пока - так сказать - нашёл точки отсчёта - а вот за ними - поведения баров (направление движения) - будут около 50/50... засим - всё это не имеет практической ценности :-) (без учёта ММ :-) ИМХО..

 
DmitriyN:

Если у кого-то есть конструктивная критика (именно конструктивная, а не огульная) или предложения - буду рад выслушать.

если вы в поиске закономерностей на форе, то будьте приличными:

1.Укажите от какого ДЦ данные или сведите для сравнения данные разных ДЦ, как по мне, закономерности фильтров нас мало интересуют.

2.Укажите не одну валютную пару и ТФ, а лучше - опять в таблычку разные пары и разные ТФ.

Имея подобный табличный материал уже можно будет поговорить...

;)

 
avatara:
Сделаю, несколько позже, нужно время для этого. В данном случае - ДЦ Альпари.
Исправил ошибки выше.
 

Думаю если поискать треугольники по кроссам их будет еще больше например SGDJPY

к сожалению истории по такой экзотике у меня мало

 
Таблица 1: Пара - EURUSD | Демо счёт | котировки Альпари | 7-и баровые треугольники

Таймфрейм
Отношение, раз
Точность, %
Период истории, лет
М1
2,185
0,003
8,3
М5
3,849
0,038
8,9
М15
9,569
0,313
8,9
М30
14,39
0,836
8,9
Н1
23,17
2,268
8,9


На ТФ H4 погрешность становится недопустимо большой - мало данных.
Число затухающих треугольников там - 143, а число разгорающихся - 1 (один) за историю в 9 лет.

Скорее всего метод расчёта точности и алгоритм формализации треугольников нужно будет пересмотреть.

 

А если еще не много усложнить ваш скрипт проверить временную частоту повторения появления треугольников

например в течении торгового месяца, недели, дня

имхо практической пользы было бы больше

 

Таблица 2: Пара - GBPUSD | Демо счёт | котировки Альпари | 7-и баровые треугольники

Таймфрейм
Отношение, раз
Точность, %
Период истории, лет
M1
2,844
0,004
8,1
M5
4,289
0,041
8,8
M15
7,688
0,243
8,9
M30
10,84
0,642
8,9
H1
17,25
1,793
8,9

На ТФ H4 погрешность большая - около 17,3%. Количество треугольников на истроии 9 лет - 161 шт /6 шт = 26,8 раз.

 
DmitriyN:

Решил перенести сообщения в отдельную тему...

1. Началось всё с того, что перечитывал книгу Вильямса и решил проверить какова доля внутренних баров на графике. Далее решил сопоставить долю внутренних и внешних баров, в результате чего выявилась закономерность: доля внутренних баров выше доли внешних баров.

это очевидно и без опытов. берем три тополя на плющихе - мал, мала, меньше.

каких тополей больше "внутренних" или "внешних"? конечно "внутренних" !

потому что внешние это те, которые - большие, а больших, длинных топол... тьфу ты, баров - очевидно меньше по статистике чем маленьких, коротких. Длинные свечи - реже. Короткие - чаще.

Закономерность? Да.

а теперь внимание вопрос: И что нам это дает?

ответ: Сетку!

рецепт обогащения:

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

 
DmitriyN:

2. Далее, следуя этой логике, решил исследовать соотношение внутрених и внешних треугольников. Внутренние треугольники я назвал затухающими, а внешние - разгорающимися.
С этой целью был написан простейший скрипт:


Хорошо бы еще собрать статистику по размерам в пунктах этих треугольников, и совсем хорошо бы - по времени (суток) их образования.

Предположу, что затухающие треугольники возникают на новостях.