Les régularités des mouvements de prix : 2ème partie. Série de barres

 

Cette partie se concentrera sur l'exploration des séries de barres (chandeliers).
Dans le script ci-dessous, j'ai utilisé la terminologie suivante : une barre montante est une barre dont le prix de clôture est supérieur au prix d'ouverture et une barre descendante est une barre dont le prix de clôture est inférieur au prix d'ouverture.

Pour commencer, je vais publier le script. Je demande aux professionnels de la programmation de le vérifier afin de détecter les erreurs logiques dans les calculs de barres. S'il y a des erreurs de logique dans les calculs - je serai
J'apprécierais vos commentaires.
Le script calcule la part minimale de barres croissantes et décroissantes dans une série de longueur donnée. La longueur de la série est définie dans la fenêtre des données sources, elle est spécifiée par défaut à 100 barres.

Les résultats des opérations du script s'affichent sur le graphique quelque temps après le démarrage du script. Par exemple, pour une série de 100 barres pour l'EURUSD TF H1, le minimum historique le nombre de barres croissantes est
34 bars (34%) :

J'attire votre attention sur le fait que le script parcourt tout l'historique et que si l'historique est long (petit TF) ou comporte de grandes séries (plus de 100) le script
peut effectuer des calculs assez longtemps, jusqu'à plusieurs minutes (selon les capacités du PC) :

Script :

// Скрипт для подсчёта минимальных долей растущих и падающих баров в серии баров //
// 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);          
 }
Je voudrais également attirer votre attention sur le fait que le script ne prend pas en compte les barres zéro, c'est-à-dire les barres dont le prix d'ouverture est égal au prix de clôture.

Si quelqu'un a des critiques à formuler sur les calculs du scénario ou des résultats dans le domaine de la recherche similaire, qu'il s'exprime.
Plus tard, je me joindrai à la discussion sur les régularités liées aux séries de barres et à certaines tâches liées à ce sujet.
Dossiers :
 

mes résultats montrent une probabilité de série de 0.5^n

Sur MA, c'est la même chose

 
Rorschach:
D'après mes résultats, la probabilité d'une série est de 0,5^n
Par mes résultats aussi. Par exemple, la probabilité d'une série de 30 barres est d'environ un milliardième. S'il s'agissait de barres d'une minute, alors, considérant qu'il y a 1440 minutes dans un jour et 365 jours dans une année (période calendaire), la série
serait tombé la dernière fois autour de la période de Noël (il y a quelques milliers d'années).
 
la longueur de la série est-elle interrompue par une pluie ou une bougie d'aspect opposé avec un petit corps ?
 

Il y a une raison pour laquelle on appelle "court" un court et "long" un long.

Dans les actions, la disproportion sera généralement bonne, dans les devises, elle devrait être assez floue.

 
sever32:
La longueur de la série est-elle interrompue par un doj ou une bougie opposée avec un petit corps ?

Il est clair que oui.

La question portait sur le fait qu'une longue série est interrompue par un doj ou une bougie opposée et qu'ensuite la série précédente peut se répéter à nouveau.

Il n'y a pas de profit ici, mais il y a un sujet à aborder).

 

Je n'arrive pas à comprendre ce qu'une telle analyse peut faire, mais mettons cela sur le compte de mon incompétence.
Mais il y a une observation sur l'essence de l'analyse.
Si j'ai bien compris, les chandeliers à hauteur zéro sont exclus du calcul. Les chandeliers de hauteur minimale (1, 2, 3) sont-ils très différents de ceux-ci ? Je pense que ça ne diffère pas beaucoup.
Je pense qu'il serait plus correct de ne considérer que les chandeliers de longueur "significative". Pour le critère de signification, vous pouvez prendre le module du rapport (O-C)/(H-L).
La valeur seuil doit être considérée séparément.

 

Voici à quoi ressemble le résultat pour une série de 4 heures :

Une série de 100 barres doit comporter au moins 36 barres ascendantes.
Vous pouvez en conclure que si sur une série de 50 barres, vous avez déjà eu 10 barres ascendantes,
puis sur les 50 barres suivantes, vous devez avoir au moins 36-10=26 barres ascendantes (au moins).
Par conséquent, les barres tombantes y seront d'environ 50-26=24.
C'est-à-dire qu'il y aura à peu près le même nombre de barres descendantes et montantes.

Bien entendu, la hauteur de la barre n'est pas prise en compte.

 
DmitriyN:

Voici à quoi ressemble le résultat pour une série de 4 heures :

Une série de 100 barres doit comporter au moins 36 barres ascendantes.
Vous pouvez en conclure que si sur une série de 50 barres, vous avez déjà eu 10 barres ascendantes,
puis sur les 50 barres suivantes, vous devez avoir au moins 36-10=26 barres ascendantes (au moins).
Par conséquent, les barres tombantes y seront d'environ 50-26=24.
C'est-à-dire qu'il y aura à peu près le même nombre de barres descendantes et montantes.

Bien entendu, la hauteur de la barre n'est pas prise en compte.

c'est la partie délicate.
 
MikeM:

Je n'arrive pas à comprendre ce que ce genre d'analyse peut faire...

J'ai écrit à ce sujet à de nombreuses reprises, que le professionnalisme est constitué d'un grand nombre d'éléments de compréhension du processus. Chaque élément ne donne pas et ne peut pas donner quelque chose de manière isolée.
Cependant, il est tout à fait possible de bénéficier de la totalité des éléments.
A quoi sert un processeur ? Aucun, tant que c'est le seul. Mais si vous ajoutez une carte mère, une carte graphique, une alimentation, etc ... - vous savez ce qui se passe.
 
DmitriyN:
Ce ficus picus peut facilement être éliminé en numérisant le prix, c'est-à-dire en le convertissant en un format numérique - une grille avec un pas déterminé. Mais nous en reparlerons plus tard.

c'est là que vous auriez dû commencer.