Закономерности движений цен: Часть 2. Серии бар

 

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

Для начала, опубликую скрипт. Прошу профессионалов в области программирования его проверить на наличие логических ошибок в подсчётах баров. Если есть ошибки в логике вычислений - буду
благодарен за сообщения.
Скрипт вычисляет минимальную долю растущих и падающих баров на серии заданной длины. Длина серии задаётся в окне исходных данных, по умолчанию она указана размером в 100 бар.

Результаты работа скрипта выводятся на график через некоторое время после запуска скрипта. Например, для серии из 100 бар для EURUSD ТФ H1 минимальное историческое число растущих бар составляет
34 шт (34%):

Хочу обратить внимание на то, что скрипт проходится по всей истории и при большой длине истории (небольшие ТФ) и больших сериях (больше 100, например) скрипт
может проводить вычисления достаточно долго - до нескольких минут (в зависимости от возможносей ПК):

Скрипт:

// Скрипт для подсчёта минимальных долей растущих и падающих баров в серии баров //
// Skript MinRastPadBarSeriya, июнь 2012
// Примечание: скрипт подвешивает терминал при больших сериях на малых ТФ - ждите
#property  copyright "Copyright © Svinotavr-2000"
#property  link      "https://www.mql5.com/ru/users/DmitriyN" 
#property show_inputs             // Показываем окно исходных данных   

extern int DlinSer=100;           // Вводим длину серии, бар, по умолчанию - 100 бар.
   
int start()
 { 
   // Декларация переменных
   double DliPer;                 // Длительность периода исследования, лет
   double n;                      // Количество бар главного цикла, шт
   double Pogreshnost;            // Погрешность, %
   
   double progr;                  // Переменная прогресс-индикатора (доля единицы)
   
   double DolyRastBar;            // Доля растущих бар в серии, %
   double MinDolyRastBar=101;     // Минимальная доля ростущих бар %, для начала - >100
   double KolRast;                // Количество растущих баров в серии, шт
   
   double DolyPadBar;             // Доля падающих бар в серии, %
   double MinDolyPadBar=101;      // Минимальная доля падающих бар %, для начала - >100
   double KolPad;                 // Количество падающих баров в серии, шт
   
   // Берём число бар на DlinSer меньшее, чтобы не залезть за пределы истории
   n=Bars-DlinSer-1;
   // Цикл по всем барам
        Comment("Ждите, идёт расчёт");               // На мелких ТФ скрипт подвисает
        for(int j = 0; j < n; j++)                 // Главный цикл - по всем доступным барам
        { 
            KolRast=0;                             // Обнуляем счётчик для след. цикла серии
            KolPad=0;                              // Обнуляем счётчик для след. цикла серии
            for(int i = j; i < (j+DlinSer+1); i++) // Цикл серии
            {   
                if (Close[i] > Open[i]) KolRast=KolRast+1; // Добавляем к счётчику 1 бар      
                if (Close[i] < Open[i]) KolPad=KolPad+1;   // Добавляем к счётчику 1 бар              
                    
            DolyRastBar=KolRast/DlinSer*100;       // Вычисляем долю растущих бар, %
            DolyPadBar= KolPad/DlinSer*100;        // Вычисляем долю падающих бар, %
            }                                      // Конец цикла серий
         // Если доля растущих бар за этот цикл меньше, чем минимальная доля за предыдущие _
         // _ циклы, то принимаем её как минимальную в главном цикле
         if (MinDolyRastBar > DolyRastBar) MinDolyRastBar= DolyRastBar;
         // Если доля падающих бар за этот цикл меньше, чем минимальная доля за предыдущие _
         // _ циклы, то принимаем её как минимальную в главном цикле     
         if (MinDolyPadBar > DolyPadBar) MinDolyPadBar= DolyPadBar;                      
         
             // Прогресс-индикатор ======================================
             progr=(j/n)*1000 - MathFloor((j/n)*1000);
             if (progr>0.9999)                     // Частые комменты тормозят расчёты, _
             {                                     // _ поэтому ограничим число изменений
             Comment("Ждите, идёт расчёт, выполнено: ", (j/n)*100 , " %");
             } //========================================================
        }                                          //Конец цикла по всем барам
  // Вычисляем длительность периода истории исследования (календарный период)
  DliPer = n*Period()/(1440*365);
  // Вычисляем относительную погрешность расчётов (погрешность частичная)
  Pogreshnost=(DlinSer/n)*100;         
  // Формируем строки для печати
   string S0 = "\n" + "================= Результаты расчётов =================" + "\n" + "\n";  
   string S1 = "1. Исследовано бар = " + DoubleToStr(n,0)+ " шт" + "\n";
   string S2 = "2. Длительность периода исследования = " + DoubleToStr(DliPer,2)+ " лет" + "\n";
   string S3 = "3. Длина серии = " + DlinSer+ " бар"+ "\n"+ "\n";
   string S4 = "4. Минимальная доля рaстущих бар = " + DoubleToStr(MinDolyRastBar,2)+ " %"+ "\n";
   string S5 = "5. Минимальное количество рaстущих бар = " + DoubleToStr(MinDolyRastBar*DlinSer/100,0)+ " шт"+ "\n"+ "\n";
   string S6 = "6. Минимальная доля падающих бар = " + DoubleToStr(MinDolyPadBar,2)+ " %"+ "\n";
   string S7 = "7. Минимальное количество падающих бар = " + DoubleToStr(MinDolyPadBar*DlinSer/100,0)+ " шт"+ "\n"+ "\n"; 
   string S8 = "8. Погрешность расчётов (по длине серии/истории) = " + DoubleToStr(Pogreshnost,4)+ " %";  
  // Выводим строки на экран     
   Comment(S0, S1, S2, S3, S4, S5, S6, S7, S8);          
 }
Хочу обратить внимание также на то, что скрипт не учитывает нулевые бары - бары, у которых цена открытия равна цене закрытия.

Если у кого-то есть критика расчётной части скрипта, свои результаты в области подобных исследований - прошу высказываться.
Несколько позже присоединюсь к обсуждению закономерностей связанных с сериями баров, а также некоторых задач связанных с этой темой.
Файлы:
 

по моим результатом вероятность серии 0.5^n

На МА такая же

 
Rorschach:
по моим результатам вероятность серии 0.5^n
По моим тоже. Например, вероятность серии из 30 бар - где-то одной миллиардной доли. Если это были бы минутные бары, то учитывая, что в сутках 1440 минут, а в году 365 дней (календарный период), то такая серия
выпадала бы в предыдущий раз где-то в рождество Христово (пару тысяч лет назад).
 
длина серии прерывается дожем или свечой противоположного вида с небольшим телом?
 

Ну неспроста же назвали "шорт" -шортом, а "лонг"- лонгом.

На акциях в основном диспропорция хорошая будет, на форе она должна быть совсем размыта.

 
sever32:
длина серии прерывается дожем или свечой противоположного вида с небольшим телом?

понятно что да.

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

профита тут нет. а поговорить, да, есть тема)

 

Никак не могу въехать, что может дать такой анализ, но спишем это на мою бестолковость.
А вот по сути анализа есть замечание.
Как я понял, из подсчёта исключаются свечи нулевой высоты. А сильно ли отличаются от них свечи минимальной высоты (1, 2, 3)? Думаю, не сильно.
Считаю, что корректнее было бы учитывать только свечи "знАчимой" длины. За критерий знАчимости можно взять модуль отношения (O-C)/(H-L).
О пороговом значении нужно подумать отдельно.

 

Вот так выглядит результат для 4х часовки:

На серии в 100 бар должно быть не меньше 36 растущих бар.
Из этого можно сделать вывод, что если на серии 50 бар у вас уже появилось 10 растущих бар,
то на последующих 50-ти барах у вас должно быть не менее 36-10=26 растущих бар (не менее).
Следовательно, падающих бар там будет около 50-26=24.
Т.е. падающих и растущих будет примерно одинаково.

Разумеется, высоту бар не учитываем.

 
DmitriyN:

Вот так выглядит результат для 4х часовки:

На серии в 100 бар должно быть не меньше 36 растущих бар.
Из этого можно сделать вывод, что если на серии 50 бар у вас уже появилось 10 растущих бар,
то на последующих 50-ти барах у вас должно быть не менее 36-10=26 растущих бар (не менее).
Следовательно, падающих бар там будет около 50-26=24.
Т.е. падающих и растущих будет примерно одинаково.

Разумеется, высоту бар не учитываем.

вот в этом и фикус- пикус.
 
MikeM:

Никак не могу въехать, что может дать такой анализ_

Я об этом уже ни раз писал, что профессонализм складывается из большого числа элементов понимания процесса. Каждый элемент не даёт и не может дать ничего по отдельности.
Однако, из совокупности элементов вполне можно извлечь пользу.
Каков толк от процессора? Никакого, пока он один. Но, если к нему добавить материнскую плату, видеокарточку, блок питания и т.д. ... - сами знаете, что будет.
 
DmitriyN:
Этот фикус-пикус можно легко ликвидировать, если оцифровать цену, т.е. перевести её в цифровой формат - сетку с заданным шагом. Но, об этом позже.

с этого надо было начинать.
Причина обращения: