As regularidades de movimentos de preços: Parte 2. Série de barras

 

Esta parte se concentrará em explorar a série de barras (castiçal).
No roteiro abaixo eu usei a seguinte terminologia: uma barra crescente é uma barra com um preço de fechamento mais alto do que o preço de abertura e uma barra decrescente é uma barra com um preço de fechamento mais baixo do que o preço de abertura.

Para começar, vou publicar o roteiro. Peço aos profissionais da área de programação que verifiquem a existência de erros lógicos nos cálculos de barras. Se houver erros lógicos nos cálculos - eu serei
Agradecia seu feedback.
O roteiro calcula a proporção mínima de barras crescentes e decrescentes em uma série do comprimento dado. O comprimento da série é definido na janela de dados da fonte, é especificado por padrão como 100 barras.

Os resultados da operação do roteiro são exibidos no gráfico algum tempo após o início do roteiro. Por exemplo, para uma série de 100 barras para EURUSD TF H1, o mínimo histórico número crescente de barras é
34 barras (34%):

Quero chamar sua atenção para o fato de que o roteiro percorre toda a história e se a história é longa (pequena TF) ou tem séries grandes (mais de 100) o roteiro
pode realizar cálculos por tempo suficiente, até vários minutos (dependendo da capacidade do PC):

Roteiro:

// Скрипт для подсчёта минимальных долей растущих и падающих баров в серии баров //
// 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);          
 }
Gostaria também de chamar sua atenção para o fato de que o roteiro não leva em conta barras zero, ou seja, barras com o preço de abertura igual ao preço de fechamento.

Se alguém tiver alguma crítica sobre os cálculos do roteiro ou qualquer resultado no campo de pesquisa semelhante, por favor, fale mais alto.
Mais tarde, participarei da discussão sobre as regularidades relacionadas à série de bares e algumas tarefas relacionadas a este tópico.
Arquivos anexados:
 

meus resultados mostram uma probabilidade de série de 0,5^n

Na MA é a mesma coisa

 
Rorschach:
De acordo com meus resultados, a probabilidade de uma série é de 0,5^n
Pelos meus resultados também. Por exemplo, a probabilidade de uma série de 30 barras está em torno de um bilionésimo. Se fossem barras de um minuto, então considerando que há 1440 minutos em um dia e 365 dias em um ano (período do calendário), a série
teria caído na última vez por volta da época do Natal (há alguns milhares de anos).
 
o comprimento da série é interrompido por uma chuva ou uma vela de aspecto oposto com um corpo pequeno?
 

Há uma razão pela qual eles chamam de "curto" um curto e "longo" um longo.

Em ações a desproporção será maioritariamente boa, em forex deve ser bastante embaçada.

 
sever32:
O comprimento da série é interrompido por uma doj ou uma vela oposta com um corpo pequeno?

É claro que sim.

A pergunta era sobre uma longa série interrompida por uma doj ou uma vela oposta e então a série anterior pode se repetir novamente.

Não há lucro aqui, mas há um tópico a ser discutido).

 

Não consigo entender o que uma análise desse tipo pode fazer, mas vamos avaliar a situação até a minha inépcia.
Mas há uma observação sobre a essência da análise.
Como entendi, os castiçais de altura zero são excluídos do cálculo. Os candelabros de altura mínima (1, 2, 3) são muito diferentes deles? Acho que não é muito diferente.
Penso que seria mais correto considerar apenas os castiçais de comprimento "significativo". Como critério de significância podemos tomar um módulo de relação (O-C)/(H-L).
O valor limite deve ser considerado separadamente.

 

Este é o resultado para uma série de 4 horas:

Uma série de 100 barras deve ter pelo menos 36 barras ascendentes.
A partir disto você pode concluir que se em uma série de 50 barras você já teve 10 barras em ascensão,
então nas 50 barras seguintes você deve ter pelo menos 36-10=26 barras ascendentes (pelo menos).
Conseqüentemente, as barras em queda lá serão cerca de 50-26=24.
Ou seja, haverá aproximadamente o mesmo número de barras que caem e sobem.

Naturalmente, a altura da barra não é levada em consideração.

 
DmitriyN:

Este é o resultado para uma série de 4 horas:

Uma série de 100 barras deve ter pelo menos 36 barras ascendentes.
A partir disto você pode concluir que se em uma série de 50 barras você já teve 10 barras em ascensão,
então nas 50 barras seguintes você deve ter pelo menos 36-10=26 barras ascendentes (pelo menos).
Conseqüentemente, as barras em queda lá serão cerca de 50-26=24.
Ou seja, haverá aproximadamente o mesmo número de barras que caem e sobem.

Naturalmente, a altura da barra não é levada em consideração.

essa é a parte complicada.
 
MikeM:

Eu não consigo entender o que este tipo de análise pode fazer_

Tenho escrito sobre isso muitas vezes, que o profissionalismo é composto de um grande número de elementos de compreensão do processo. Cada elemento não dá e não pode dar nada isoladamente.
Entretanto, é bastante possível se beneficiar da totalidade dos elementos.
De que serve um processador? Nenhum, desde que seja o único. Mas se você adicionar uma placa mãe, uma placa gráfica, uma fonte de alimentação, etc ... - você sabe o que acontece.
 
DmitriyN:
Este ficus picus pode ser facilmente eliminado digitalizando-se o preço, ou seja, convertendo-o para um formato digital - uma grade com uma inclinação definida. Mas mais sobre isso, mais tarde.

é por aí que você deveria ter começado.
Razão: