Le regolarità dei movimenti dei prezzi: parte 2. Serie di barre

 

Questa parte si concentrerà sull'esplorazione delle serie di barre (candele).
Nello script qui sotto ho usato la seguente terminologia: una barra ascendente è una barra con un prezzo di chiusura superiore al prezzo di apertura e una barra discendente è una barra con un prezzo di chiusura inferiore al prezzo di apertura.

Per cominciare, pubblicherò lo script. Chiedo ai professionisti della programmazione di controllare se ci sono errori logici nei calcoli delle barre. Se ci sono errori di logica nei calcoli - sarò
Apprezzerei il vostro feedback.
Lo script calcola la quota minima di barre crescenti e decrescenti in una serie della lunghezza data. La lunghezza della serie è impostata nella finestra dei dati di origine, è specificata di default come 100 barre.

I risultati delle operazioni dello script vengono visualizzati sul grafico qualche tempo dopo l'avvio dello script. Per esempio, per una serie di 100 barre per EURUSD TF H1, il minimo storico il numero di barre crescenti è
34 barre (34%):

Voglio attirare la vostra attenzione sul fatto che lo script scorre l'intera storia e se la storia è lunga (piccola TF) o ha grandi serie (più di 100) lo script
può eseguire calcoli abbastanza a lungo, fino a diversi minuti (a seconda delle capacità del 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);          
 }
Vorrei anche attirare la vostra attenzione sul fatto che lo script non prende in considerazione le barre zero, cioè le barre con il prezzo di apertura uguale al prezzo di chiusura.

Se qualcuno ha qualche critica sui calcoli dello script o qualche risultato nel campo della ricerca simile, per favore parli.
Più tardi mi unirò alla discussione sulle regolarità relative alla serie di barre e ad alcuni compiti relativi a questo argomento.
 

i miei risultati mostrano una probabilità di serie di 0,5^n

Su MA è lo stesso

 
Rorschach:
Secondo i miei risultati, la probabilità di una serie è 0,5^n
Anche secondo i miei risultati. Per esempio, la probabilità di una serie di 30 barre è circa un miliardesimo. Se fossero barre di un minuto, considerando che ci sono 1440 minuti in un giorno e 365 giorni in un anno (periodo di calendario), la serie
sarebbe caduto l'ultima volta intorno al periodo natalizio (un paio di migliaia di anni fa).
 
la lunghezza della serie è interrotta da una pioggia o da una candela di aspetto opposto con un piccolo corpo?
 

C'è una ragione per cui si chiama "corto" un corto e "lungo" un lungo.

Nelle azioni la sproporzione sarà per lo più buona, nel forex dovrebbe essere abbastanza sfocata.

 
sever32:
La lunghezza della serie è interrotta da un doj o da una candela opposta con un piccolo corpo?

È chiaro che sì.

La domanda riguardava una lunga serie interrotta da un doj o da una candela opposta e poi la serie precedente può ripetersi di nuovo.

Non c'è profitto qui, ma c'è un argomento di cui parlare).

 

Non riesco a capire cosa possa fare una tale analisi, ma diamo la colpa alla mia inettitudine.
Ma c'è un'osservazione sull'essenza dell'analisi.
Come ho capito, i candelabri ad altezza zero sono esclusi dal calcolo. I candelieri di altezza minima (1, 2, 3) sono molto diversi da loro? Credo che non ci sia molta differenza.
Penso che sarebbe più corretto considerare solo le candele di lunghezza "significativa". Come criterio di significatività possiamo prendere un modulo del rapporto (O-C)/(H-L).
Il valore di soglia dovrebbe essere considerato separatamente.

 

Ecco come appare il risultato per una serie a ore 4:

Una serie di 100 barre dovrebbe avere almeno 36 barre crescenti.
Da questo si può concludere che se su una serie di 50 barre si sono già avute 10 barre crescenti,
poi sulle 50 barre successive dovete avere almeno 36-10=26 barre crescenti (almeno).
Di conseguenza, le barre cadenti saranno circa 50-26=24.
Vale a dire che ci sarà circa lo stesso numero di barre cadenti e crescenti.

Naturalmente, l'altezza della barra non è presa in considerazione.

 
DmitriyN:

Ecco come appare il risultato per una serie a ore 4:

Una serie di 100 barre dovrebbe avere almeno 36 barre crescenti.
Da questo si può concludere che se su una serie di 50 barre si sono già avute 10 barre crescenti,
poi sulle 50 barre successive dovete avere almeno 36-10=26 barre crescenti (almeno).
Di conseguenza, le barre cadenti saranno circa 50-26=24.
Vale a dire che ci sarà circa lo stesso numero di barre cadenti e crescenti.

Naturalmente, l'altezza della barra non è presa in considerazione.

Questa è la parte difficile.
 
MikeM:

Non riesco a capire cosa può fare questo tipo di analisi_

Ho scritto molte volte su questo, che la professionalità è composta da un gran numero di elementi di comprensione del processo. Ogni elemento non dà e non può dare nulla da solo.
Tuttavia, è possibile beneficiare della totalità degli elementi.
A cosa serve un processore? Nessuna, purché sia l'unica. Ma se si aggiunge una scheda madre, una scheda grafica, un alimentatore, ecc... - sai cosa succede.
 
DmitriyN:
Questo ficus picus può essere facilmente eliminato digitalizzando il prezzo, cioè convertendolo in un formato digitale - una griglia con un passo stabilito. Ma di questo parleremo più tardi.

è da lì che avresti dovuto iniziare.
Motivazione: