記事についてのディスカッション - ページ 10

 

何が問題だったのかわかりました。最初にあなたは、プロセスの最大偏差は40であると言いました。 そしてあなたは40で計算しました。しかし、この過程には+にも-にもなる可能性があり、その結果81のバリエーション(正確には0)が生じます。

そして、X軸に2ステップで40点をプロットします。

だからこのようなグラフになるのです。

ExcelからMQLにデータを転送した。

そして標準ライブラリの機能を使ってシグマ・パラメータを選択し、Excelからあなたのグラフを繰り返しました。

その結果、あなたのコンビナトリックなプロセスには、MO 0、シグマ6.45の正規分布のプロセスが適していることがわかりました。

//+------------------------------------------------------------------+
//|NormalSimple.mq5
//|https://www.mql5.com
//+------------------------------------------------------------------+
#include <Graphics\Graphic.mqh>
#include <Math\Stat\Normal.mqh>
#include <Math\Stat\Math.mqh>
#property script_show_inputs
//--- 入力パラメータ
input double mean_value=0;  // 数学的期待値(平均)
input double std_dev=6.45;     // 標準偏差
//+------------------------------------------------------------------+
//| スクリプト番組開始機能|
//+------------------------------------------------------------------+
void OnStart()
  {
   double arrayTeoryX[41]= {-40,-38,-36,-34,-32,-30,-28,-26,-24,-22,-20,-18,-16,-14,-12,-10,-8,-6,-4,-2,0,
                            2,4,6,8,10,12,14,16,18,20,22,24,26,28,30,32,34,36,38,40
                           };
   double arrayTeoryY[41]= {0.00000009,3.63798 E-06,7.09406 E-05,0.000898581,0.008311872,0.059845479,0.349098627,
                            1.695621904,6.994440355,24.86912126,77.09427591,210.2571161,508.121364,1094.415245,
                            2110.657973,3658.473821,5716.365345,8070.162839,10311.87474,11940.06549,12537.06876,
                            11940.06549,10311.87474,8070.162839,5716.365345,3658.473821,2110.657973,1094.415245,
                            508.121364,210.2571161,77.09427591,24.86912126,6.994440355,1.695621904,0.349098627,
                            0.059845479,0.008311872,0.000898581,7.09406 E-05,3.63798 E-06,9.09495 E-08
                           };
//--- 価格チャートを表示しない
   ChartSetInteger(0,CHART_SHOW,false);
//--- 乱数発生器を初期化する
   MathSrand(GetTickCount());
//--- 確率変数のサンプルを生成する
   long chart=0;
   string name="GraphicNormal";
   int n=100000;       // サンプル内の値の数
   int ncells=41;       // ヒストグラムの区間数
   double x[];          // ヒストグラム・インターバル・センター
   double y[];          // 区間に入るサンプルの値の数
   double data[];       // ランダムな値のサンプリング
   double max,min;      // サンプルの最大値と最小値
//--- 正規分布からサンプルを得る
   MathRandomNormal(mean_value,std_dev,n,data);
//--- ヒストグラムを作成するためのデータを計算する
   CalculateHistogramArray(data,x,y,max,min,ncells);
   /*
//--- 理論曲線を構築するためのシーケンス境界とステップを取得
 double step;
 GetMaxMinStepValues(max,min,step);
 step=MathMin(step,(max-min)/ncells);
//--- 区間[min,max]上の理論的に計算されたデータを取得
 double x2[];
 double y2[];
 MathSequence(min,max,step,x2);
 MathProbabilityDensityNormal(x2,mean_value,std_dev,false,y2);
//--- スケーリング
 double theor_max=y2[ArrayMaximum(y2)];
 double sample_max=y[ArrayMaximum(y)];
 double k=sample_max/theor_max;
 */
   /*
 for(int i=0; i<ncells; i++)
 y[i]/=k;
 */
//--- グラフを表示する
   CGraphic graphic;
   if(ObjectFind(chart,name)<0)
      graphic.Create(chart,name,0,0,0,1000,680);
   else
      graphic.Attach(chart,name);
   graphic.BackgroundMain(StringFormat("Normal distribution mu=%G sigma=%G",mean_value,std_dev));
   graphic.BackgroundMainSize(16);
//--- すべての曲線をプロットする
   graphic.CurveAdd(x,y,CURVE_HISTOGRAM,"MQL step 2").HistogramWidth(6);
   graphic.CurveAdd(arrayTeoryX,arrayTeoryY,CURVE_LINES,"Excel");
//--- そして次に、理論的な分布密度曲線をプロットしてみよう。
//graphic.CurveAdd(x2,y2,CURVE_LINES, "Theory");
//--- すべての曲線をプロットする
   graphic.CurvePlotAll();
   graphic.Update();
   double summ=0;
   for(int i=0; i<ArraySize(y); i++)
     {
      summ+=y[i];
     }
   Print(「Yによる総額 + summ);
  }
//+------------------------------------------------------------------+
//| データセットの度数を計算する|
//+------------------------------------------------------------------+
bool CalculateHistogramArray(const double &data[],double &intervals[],double &frequency[],
                             double &maxv,double &minv,const int cells=10)
  {
   if(cells<=1)
      return (false);
   int size=ArraySize(data);
   if(size<cells*10)
      return (false);
   minv=data[ArrayMinimum(data)];
   maxv=data[ArrayMaximum(data)];
   double range=maxv-minv;
   double width=range/cells;
   width=2.0;
   minv=-41;
   if(width==0)
      return false;
   ArrayResize(intervals,cells);
   ArrayResize(frequency,cells);
//--- 区間の中心を設定する
   for(int i=0; i<cells; i++)
     {
      intervals[i]=minv+(i+0.5)*width;
      frequency[i]=0;
     }
//--- 間隔周波数を埋める
   for(int i=0; i<size; i++)
     {
      int ind=int((data[i]-minv)/width);
      if(ind>=cells)
         ind=cells-1;
      frequency[ind]++;
     }
   return (true);
  }
  /*
//+------------------------------------------------------------------+
//| シーケンス生成のための値を計算する。|
//+------------------------------------------------------------------+
void GetMaxMinStepValues(double &maxv,double &minv,double &stepv)
 {
//--- 正規化精度を得るためにシーケンスの絶対範囲を計算する
 double range=MathAbs(maxv-minv);
 int degree=(int)MathRound(MathLog10(range));
//--- 最大値と最小値を正規化する。とmin.値を指定された精度で正規化する
 maxv=NormaliseDouble(maxv,degree);
 minv=NormalizeDouble(minv,degree);
//--- 与えられた精度からのシーケンス生成のステップも設定する
 stepv=NormalizeDouble(MathPow(10,-degree),degree);
 if((maxv-minv)/stepv<10)
 stepv/=10.;
 }
//+------------------------------------------------------------------+
*/
 
Alexey Klenov:

何が問題だったのかわかりました。当初、あなたはプロセスの最大偏差は40であると言いました。 そしてあなたは40で計算しました。しかし、プロセスには+と-の両方の能力があるので、最終的には81のバリエーション(正確には0)になります。

そして、X軸に2刻みで40点をプロットします。

だからこのようなグラフになる。

エクセルからMQLにデータを移しました。

そして標準ライブラリーの機能を使ってシグマ・パラメーターを選択し、エクセルからあなたのグラフを繰り返し、ステップ2で強制的にグループ化しました。

その結果、あなたのコンビナトリックなプロセスには、MO 0、シグマ6.45の正規分布のプロセスが適していることがわかりました。

それは興味深い。そう、2ステップで-40...0...40の範囲があるんだ。たぶん、この点を記事の中で噛み砕いていなかったのだと思う。コードをありがとう。
 

午後

青いヒストグラムは、GBPUSD の 365 日分のティック・データのみを使った実験の繰り返しです。

レンコを0.0002ポイントで40レンコ・バーでスライスしています。

ほぼ完全にエクセルからあなたの理論曲線を繰り返します。

ですから、記事の図7はうまくいきません。

 

これがそのコードだ。

エラーを探していますが、まだ見つかっていません。

//+------------------------------------------------------------------+
//|プロジェクト名
//|著作権 2020, 会社名
//|http://www.会社名.net
//+------------------------------------------------------------------+
#include <Graphics\Graphic.mqh>
#include <Math\Stat\Normal.mqh>
#include <Math\Stat\Math.mqh>
#property script_show_inputs
//--- 入力パラメータ
//input double mean_value=0; // 数学的期待値(平均値)
//input double std_dev=1; // 標準偏差(標準偏差)
input double stepRenko=0.0002;   // 連子バーのピッチ
//+------------------------------------------------------------------+
//| スクリプト番組開始機能|
//+------------------------------------------------------------------+
void OnStart()
  {
//--- 価格チャートを表示しない
   ChartSetInteger(0,CHART_SHOW,false);
//--- 乱数発生器を初期化する
   MathSrand(GetTickCount());
//--- 確率変数のサンプルを生成する
   long chart=0;
   string name="GraphicNormal";
   int ncells=41;       // ヒストグラムの区間数
   double x[];          // ヒストグラム・インターバル・センター
   double y[];          // 区間に入るサンプルの値の数
   double data[];       // ランダムな値のサンプリング
   double max,min;      // サンプルの最大値と最小値

   MqlTick realTick[];
   ulong start=iTime(_Symbol,PERIOD_D1,365)*1000;         // 単位:ミリ秒
   ulong finish=iTime(_Symbol,PERIOD_D1,1)*1000;         // 単位:ミリ秒

   int countCopy=CopyTicksRange(_Symbol,realTick,COPY_TICKS_INFO,start,finish);
   Print("countCopy="+IntegerToString(countCopy));
   Print("0 tick time ="+TimeToString(realTick[0].time));
   Print("end tick time ="+TimeToString(realTick[countCopy-1].time));
   
   int index=0;
   double actualStep[];       // レンコ・バー用の配列
   ArrayResize(actualStep,countCopy);
   ArrayInitialize(actualStep,0);
   double priceForCheck= realTick[0].bid;
   actualStep[0]=0;
   int cnt=0;

   for(int i=0; i<countCopy; i++)
     {
      if(realTick[i].bid>priceForCheck+stepRenko)
        {
         int add=(int)((realTick[i].bid-priceForCheck)/stepRenko);
         actualStep[index]+=add;
         priceForCheck+=stepRenko*(double)add;
         cnt+=add;
         if(cnt>39)
           {
            index++;
            cnt=0;
           }
         continue;
        }
      if(realTick[i].bid<priceForCheck-stepRenko)
        {
         int add=(int)((priceForCheck-realTick[i].bid)/stepRenko);
         actualStep[index]-=add;
         priceForCheck-=stepRenko*(double)add;
         cnt+=add;
         if(cnt>39)
           {
            index++;
            cnt=0;
           }
        }
     }
   ArrayResize(actualStep,index+1);
   Print("Count index="+IntegerToString(index));
   CalculateHistogramArrayItsMy(actualStep,x,y,max,min,ncells);

// エクセルからのデータ
   double arrayTeoryX[41]= {-40,-38,-36,-34,-32,-30,-28,-26,-24,-22,-20,-18,-16,-14,-12,-10,-8,-6,-4,-2,0,
                            2,4,6,8,10,12,14,16,18,20,22,24,26,28,30,32,34,36,38,40
                           };
   double arrayTeoryY[41]= {0.00000009,3.63798 E-06,7.09406 E-05,0.000898581,0.008311872,0.059845479,0.349098627,
                            1.695621904,6.994440355,24.86912126,77.09427591,210.2571161,508.121364,1094.415245,
                            2110.657973,3658.473821,5716.365345,8070.162839,10311.87474,11940.06549,12537.06876,
                            11940.06549,10311.87474,8070.162839,5716.365345,3658.473821,2110.657973,1094.415245,
                            508.121364,210.2571161,77.09427591,24.86912126,6.994440355,1.695621904,0.349098627,
                            0.059845479,0.008311872,0.000898581,7.09406 E-05,3.63798 E-06,9.09495 E-08
                           };
   // 理論曲線を実曲線にスケーリングする 
   double div=100000/index;
   for(int i=0; i<ArraySize(arrayTeoryY); i++)
     {
      arrayTeoryY[i]/=div;
     }

   CGraphic graphic;
   if(ObjectFind(chart,name)<0)
      graphic.Create(chart,name,0,0,0,1080,580);
   else
      graphic.Attach(chart,name);
//graphic.BackgroundMain(StringFormat("Normal distribution mu=%G sigma=%G stepRenko=%G",mean_value,std_dev,stepRenko));
//graphic.BackgroundMain(StringFormat("Normal distribution mu=%G sigma=%G",mean_value,std_dev));
   graphic.BackgroundMainSize(16);
//--- すべての曲線をプロットする
   graphic.CurveAdd(x,y,CURVE_HISTOGRAM,"Sample").HistogramWidth(6);
   graphic.CurveAdd(arrayTeoryX,arrayTeoryY,CURVE_LINES,"Excel");


//--- すべての曲線をプロットする
   graphic.CurvePlotAll();
   graphic.Update();
  }
//+------------------------------------------------------------------+
//||
//+------------------------------------------------------------------+
bool CalculateHistogramArrayItsMy(const double &data[],double &intervals[],double &frequency[],
                                  double &maxv,double &minv,const int cells=10)
  {
   minv=data[ArrayMinimum(data)];
   maxv=data[ArrayMaximum(data)];
   int range=maxv-minv;
   ArrayResize(intervals,range+1);
   ArrayResize(frequency,range+1);
   for(int i=0; i<range+1; i++)
     {
      intervals[i]=minv+i;
     }
   for(int i=0; i<ArraySize(data); i++)
     {
      int ii=(MathAbs(minv)+data[i]);
      //frequency[ii]+=MathAbs(data[i]);
      frequency[ii]+=1.0;
     }
   return (true);
  }
//+------------------------------------------------------------------+
 
Alexey Klenov:

こんにちは

青いヒストグラムは、GBPUSDの365日分のティックデータのみを用いた実験の繰り返しです。

レンコを0.0002ピップで、40レンコバーをスライスしています。

ほぼ完全にエクセルからの理論曲線を繰り返しています。

ですから、記事の図7はうまくいきません。

私は分析するために分ローソク足を使いました、あなたがあまりにも小さなブロックでそれらをスライスするとき、いくらかの誤差があります。
私はrenkoバーを持っていません、アルゴリズムは少し違います。renkoバーでは反転ブロックを形成するのに2ピップスが必要ですが、私の場合は常に1倍です。
ティック履歴を送って ください。来週試して、私が得たものをお見せします。ティックについては、アイデアとしては若干トレンディであるべきですが、実際には、ティックはソースによって異なります。例えば、いくつかのデモ口座ではティックが多すぎて、これが反転プロセスにつながります。
 
Maxim Romanov:
分析には分足のローソク足を使いましたが、あまりに小さなブロックにスライスすると誤差が生じます。
私はrenkoバーを持っておらず、アルゴリズムが少し違います。renkoバーでは反転ブロックを形成するのに2ピップス必要ですが、私の場合は常に1倍です。
ティック履歴を送って ください。来週試して、私が得たものをお見せします。ティックについては、アイデアとしては若干トレンディであるべきですが、実際には、ティックはソースによって異なります。例えば、いくつかのデモ口座ではティックが多すぎて、これが反転プロセスにつながります。

ターミナルはティック履歴自体をダウンロードします(MT5、Alpari-MT5サーバー)。

ターミナルで Ctrl +U を押し、ticks タブですべてを行うことができます。

 
ストック分布の正規性は、オブザベーションの数に明らかに依存します:オブザベーションが多ければ多いほど、正規性が高くなります。より多くのオブザベーションがより正規的です。
 
Kristian Kafarov:
ストック分布の正規性は、オブザベーションの数に明らかに依存します:オブザベーションが多ければ多いほど、正規性が高くなります。同じような標本サイズを比較すべきです。

記事で示された例から、確かにそう見えるかもしれません。しかし実際には、そのような効果はありません。標本数が多ければ多いほど、より正確な結果が得られますが、分布は正規分布に近くはありません(研究において満たすべき一定の条件はありますが)。分布の性質はむしろ取引商品によって異なり、それぞれ微妙に異なる。

 
これはフラットなトレンドを分析するための興味深いアプローチである。しかし、実際にはあまり受け入れられないと思う。むしろ、この材料は別の側面に慣れるためであり、それ以上のものではない。
 
この市場に関する洞察と説明をありがとう。