値動きの規則性:その2。バーシリーズ

 

このパートでは、バー(ローソク足)シリーズの探索に焦点を当てます。
以下のスクリプトでは、次の用語を使用しています:上昇バーは 始値より 終値が高いバー、下降 バーは始値より終値が低いバーです。

まず始めに、スクリプトを公開します。棒グラフの計算に論理的な間違いがないか、プログラミングのプロにチェックしてもらうんです。計算のロジックに間違いがあれば-。
ご意見をお聞かせください。
このスクリプトは、与えられた長さの系列において、増加するバーと減少するバーの最小 シェアを計算します。シリーズの長さはソースデータのウィンドウで設定され、デフォルトで100本のバーとして指定されています。

スクリプトの動作結果は、スクリプト起動後しばらくしてチャートに表示されます。例えば、EURUSD TF H1 の 100 本のバーのシリーズでは、最小の 歴史的 増加するバーの数は
バー34本(34%)。

注意したいのは、スクリプトは履歴全体を実行するので、履歴が長い(TFが小さい)か、系列が大きい(100以上)場合、スクリプトは
は、最大で数分間(PCの性能に依存)、十分な計算を行うことができます。

スクリプトです。

// Скрипт для подсчёта минимальных долей растущих и падающих баров в серии баров //
// 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です。

MAでは同じです

 
Rorschach:
私の結果によると、直列の確率は0.5^nです
私の結果でもね。例えば、30本の棒グラフが連続する確率は、10億分の1程度です。仮に1分足だとすると、1日が1440分、1年が365日(暦の期間)であることを考慮すると、一連の
は、前回(数千年前)のクリスマスの頃に落ちていたはずです。
 
は、シリーズの長さを中断して、小さなボディを持つ雨や反対向きのろうそくがありますか?
 

ショート」を「ショート」、「ロング」を「ロング」と呼ぶのには理由があります。

株式ではその比率はほぼ良好ですが、FXではかなり不鮮明なはずです。

 
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:
このフィカスピクスは、価格のデジタル化、つまりピッチを設定したグリッドに変換することで簡単に解消することができます。しかし、それについては後で詳しく説明します。

というところから始めるべきでしたね。