Las regularidades de los movimientos de los precios: Parte 2. Serie de barras

 

Esta parte se centrará en explorar las series de barras (velas).
En el siguiente script he utilizado la siguiente terminología: una barra ascendente es una barra con un precio de cierre superior al de apertura y una barra descendente es una barra con un precio de cierre inferior al de apertura.

Para empezar, publicaré el guión. Pido a los profesionales de la programación que lo comprueben en busca de errores lógicos en los cálculos de la barra. Si hay errores lógicos en los cálculos - estaré
agradecido por sus comentarios.
El script calcula la proporción mínima de barras crecientes y decrecientes en una serie de la longitud dada. La longitud de la serie se establece en la ventana de datos de origen, se especifica por defecto como 100 barras.

Los resultados de la operación de script se muestran en el gráfico un tiempo después de iniciar el script. Por ejemplo, para una serie de 100 barras para EURUSD TF H1, el mínimo histórico número de barras crecientes es
34 bares (34%):

Quiero llamar tu atención sobre el hecho de que el script recorre todo el historial y si el historial es largo (TF pequeño) o tiene series grandes (más de 100) el script
puede realizar cálculos durante bastante tiempo, hasta varios minutos (dependiendo de las capacidades del PC):

Guión:

// Скрипт для подсчёта минимальных долей растущих и падающих баров в серии баров //
// 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);          
 }
También me gustaría llamar su atención sobre el hecho de que el script no tiene en cuenta las barras cero, es decir, las barras con el precio de apertura igual al precio de cierre.

Si alguien tiene alguna crítica sobre los cálculos del guión o algún resultado en el campo de la investigación similar, por favor, que hable.
Más adelante me uniré a la discusión de las regularidades relacionadas con las series de barras y algunas tareas relacionadas con este tema.
Archivos adjuntos:
 

mis resultados muestran una probabilidad de serie de 0,5^n

En MA es lo mismo

 
Rorschach:
Según mis resultados, la probabilidad de una serie es de 0,5^n
Por mis resultados también. Por ejemplo, la probabilidad de una serie de 30 barras está en torno a la milmillonésima parte. Si se tratara de barras de un minuto, teniendo en cuenta que hay 1440 minutos en un día y 365 días en un año (periodo natural), la serie
se habría caído la última vez en la época de Navidad (hace un par de miles de años).
 
¿se interrumpe la duración de la serie por una lluvia o una vela de aspecto opuesto con un cuerpo pequeño?
 

Hay una razón por la que se llama "corto" a un corto y "largo" a un largo.

En la renta variable la desproporción será mayoritariamente buena, en el forex debería ser bastante difusa.

 
sever32:
¿La longitud de la serie se interrumpe por un doj o una vela opuesta con un cuerpo pequeño?

Está claro que sí.

La pregunta era sobre una serie larga que se interrumpe por un doj o una vela opuesta y entonces la serie anterior puede repetirse de nuevo.

Aquí no hay beneficios, pero sí un tema del que hablar).

 

No consigo entender qué puede hacer un análisis así, pero atribuyámoslo a mi ineptitud.
Pero hay una observación sobre la esencia del análisis.
Según he entendido, los candelabros de altura cero están excluidos del cálculo. ¿Los candelabros de altura mínima (1, 2, 3) son muy diferentes de ellos? Creo que no hay mucha diferencia.
Creo que sería más correcto considerar sólo las velas de longitud "significativa". Para el criterio de significación se puede tomar el módulo de la relación (O-C)/(H-L).
El valor del umbral debe considerarse por separado.

 

Este es el resultado de una serie a las 4 horas:

Una serie de 100 barras debe tener al menos 36 barras ascendentes.
De esto se puede concluir que si en una serie de 50 barras ya ha tenido 10 barras alcistas,
entonces en las siguientes 50 barras debe tener al menos 36-10=26 barras ascendentes (como mínimo).
En consecuencia, las barras que caen allí serán aproximadamente 50-26=24.
Es decir, habrá aproximadamente el mismo número de barras descendentes y ascendentes.

Por supuesto, no se tiene en cuenta la altura de la barra.

 
DmitriyN:

Este es el resultado de una serie de 4 en punto:

Una serie de 100 barras debe tener al menos 36 barras ascendentes.
De esto se puede concluir que si en una serie de 50 barras ya ha tenido 10 barras alcistas,
entonces en las siguientes 50 barras debe tener al menos 36-10=26 barras ascendentes (como mínimo).
En consecuencia, las barras que caen allí serán aproximadamente 50-26=24.
Es decir, habrá aproximadamente el mismo número de barras descendentes y ascendentes.

Por supuesto, no se tiene en cuenta la altura de la barra.

esa es la parte complicada.
 
MikeM:

No puedo entender lo que este tipo de análisis puede hacer_

He escrito muchas veces sobre esto, que la profesionalidad se compone de un gran número de elementos de comprensión del proceso. Cada elemento no da ni puede dar nada por separado.
Sin embargo, es muy posible beneficiarse de la totalidad de los elementos.
¿De qué sirve un procesador? Ninguna, siempre que sea la única. Pero si añades una placa base, una tarjeta gráfica, una fuente de alimentación, etc... - ya sabes lo que pasa.
 
DmitriyN:
Este ficus picus puede eliminarse fácilmente digitalizando el precio, es decir, convirtiéndolo a un formato digital: una cuadrícula con un paso establecido. Pero más adelante hablaremos de ello.

ahí es donde deberías haber empezado.
Razón de la queja: