ADF検定やその他の検定を実施して、共和分(cointegration)をチェックしてください。
fxsaberからまたいいものをもらった。)
// インジケータは、各履歴区間と現在の区間の類似度を示す。 #property indicator_separate_window #property indicator_buffers 1 #property indicator_plots 1 #property indicator_minimum -1 #property indicator_maximum 1 #property indicator_color1 clrRed #property indicator_type1 DRAW_LINE #property indicator_width1 2 sinput int Amount = 100; // 最後の小節の数(パターン) #include <fxsaber\Math\Math.mqh> //https://www.mql5.com/ja/code/17982 double Buffer[]; void OnInit() { SetIndexBuffer(0, Buffer); } int OnCalculate( const int rates_total, const int prev_calculated, const datetime &time[], const double &open[], const double &high[], const double &low[], const double &close[], const long &tick_volume[], const long &volume[], const int &spread[] ) { if (rates_total > prev_calculated) { double Pattern[]; ArrayCopy(Pattern, open, 0, rates_total - Amount, Amount); MathCorrelationPearson(open, Pattern, Buffer); const int Pos = ArrayMaximum(Buffer, 0, rates_total - Amount); Comment("最も最近の(")に対応する歴史の最も類似したストレッチ。 + (string)time[rates_total - 1] + ") " + (string)Amount + "バラム、ここにあるよ" + (string)time[Pos] + 「ピアソンのIQ = " + (string)Buffer[Pos]); } return(rates_total); }
ピアソンによれば)最も類似した歴史の断片を素早く見つける方法の一例。
この実装の強みはアルゴリズムにある。
fxsaber:
ピアソンによれば)最も類似した歴史の断片を素早く見つける方法の一例。
この実装の強みはアルゴリズムにある。
歴史の上では、それは良いことだ。しかし、私は逆に、ヒストリー上でいくつかのバーの断片を選択し、インジケータが偶然の一致を見つけたらそれを知らせてくれるようにしたいのです。そのような実装は原理的に可能ですか?
s22aa:
ヒストリー上では、それは良いことです。しかし、私は逆に、ヒストリー上でいくつかのバーの断片を選択し、インジケータが偶然の一致を見つけたらそれを通知するようにしたいのです。そのような実装は原理的に可能でしょうか?
単純な標準の MathCorrelationPearson で十分でしょう。
ヒストリー上では、それは良いことです。しかし、私は逆に、ヒストリー上でいくつかのバーの断片を選択し、インジケータが偶然の一致を見つけたらそれを通知するようにしたいのです。そのような実装は原理的に可能でしょうか?
fxsaber:
社内のシンプルなMathCorrelationPearsonで十分だ。
社内のシンプルなMathCorrelationPearsonで十分だ。
それは素晴らしい。私はC++の勉強を始めたばかりですが、すでに何サイクルもパスし、ほとんどプログラミングの第一人者になった気分です。数年後には、標準のMathCorrelationPearsonも私にとって「シンプル」になると思います。
// 現在の区間と「最も類似した」区間を見つける例(ピアソンのQC基準)。 #property indicator_chart_window #property indicator_buffers 2 #property indicator_plots 2 #property indicator_color1 clrRed #property indicator_type1 DRAW_LINE #property indicator_width1 2 #property indicator_color2 clrYellow #property indicator_type2 DRAW_LINE #property indicator_width2 2 sinput int inAmount = 20; // 最後の小節の数(パターン) input int inMaxBars = 1 e5; // 分析するバーの数 #include <fxsaber\Math\Math.mqh> //https://www.mql5.com/ja/code/17982 double Buffer0[]; double Buffer1[]; double Buffer2[]; int handle; const long handleChart = ChartOpen(_Symbol, PERIOD_CURRENT); void OnInit() { SetIndexBuffer(0, Buffer0); SetIndexBuffer(1, Buffer1); PlotIndexSetString(0, PLOT_LABEL, "Pattern"); PlotIndexSetString(1, PLOT_LABEL, "Sample"); ChartSetInteger(handleChart, CHART_MODE, CHART_LINE); ChartSetInteger(handleChart, CHART_AUTOSCROLL, false); } //------ Take from IncludeMathStatMath.mqh -https://www.mql5.com/ru/forum/97153/page15#comment_5927026 const double QNaN =(double)"nan"; // QNaN. //+------------------------------------------------------------------+ //| 配列[]の値の平均値を計算する。 //+------------------------------------------------------------------+ double MathMean(const double &array[]) { int size=ArraySize(array); //--- データ範囲をチェックする if(size<1) return(QNaN); // 少なくとも1回の観測が必要 //--- 平均を計算する double mean=0.0; for(int i=0; i<size; i++) mean+=array[i]; mean=mean/size; //--- 平均値を返す return(mean); } //+------------------------------------------------------------------+ //| 配列[]の値の分散を計算する。 //+------------------------------------------------------------------+ double MathVariance(const double &array[]) { int size=ArraySize(array); //--- データ範囲をチェックする if(size<2) return(QNaN); // 少なくとも2回の観測が必要 //--- 平均を計算する double mean=0.0; for(int i=0; i<size; i++) mean+=array[i]; mean=mean/size; //--- 分散を計算する double variance=0; for(int i=0; i<size; i++) variance+=MathPow(array[i]-mean,2); variance=variance/size; //--- 分散を返す return(variance); } //------ // サンプルをパターンに合わせる void NormalizeArray( const double &Pattern[], double &Sample[], const bool Reverse = false ) { const double MeanPattern = MathMean(Pattern); const double MeanSample = MathMean(Sample); const double Koef = (Reverse ? -1 : 1) * MathSqrt(MathVariance(Pattern) / MathVariance(Sample)); const int Total = ArraySize(Pattern); for (int i = 0; i < Total; i++) Sample[i] = (Sample[i] - MeanSample) * Koef + MeanPattern; } void MathLog( double &Array[] ) { for (int i = ArraySize(Array) - 1; i >= 0; i--) Array[i] = MathLog(Array[i]); } void MathExp( double &Array[] ) { for (int i = ArraySize(Array) - 1; i >= 0; i--) Array[i] = MathExp(Array[i]); } // パターンから最適なサンプルを探す int GetSample1( const int Amount, const double &Prices[], double &Sample[], double &Pattern[], int MaxBars ) { const int Total = ArraySize(Prices) - 1; // 最後のバーを計算から外す ArrayCopy(Pattern, Prices, 0, Total - Amount, Amount); MaxBars = (Total > MaxBars) ? MaxBars : Total; double Prices2[]; ArrayCopy(Prices2, Prices, 0, Total - MaxBars, MaxBars); MathLog(Prices2); double Pattern2[]; ArrayCopy(Pattern2, Pattern); MathLog(Pattern2); double Pearson[]; MathCorrelationPearson(Prices2, Pattern2, Pearson); const int PosMax = ArrayMaximum(Pearson, 0, MaxBars - Amount); const int PosMin = ArrayMaximum(Pearson, 0, MaxBars - Amount); const bool Res = (MathAbs(Pearson[PosMax]) < MathAbs(Pearson[PosMin])); const int Pos2 = Res ? PosMin : PosMax; ArrayCopy(Sample, Prices2, 0, Pos2 - Amount + 1, Amount); NormalizeArray(Pattern2, Sample, Res); MathExp(Sample); return(Pos2 + Total - MaxBars); } void OnDeinit( const int ) { ChartClose(handleChart); } int OnCalculate( const int rates_total, const int prev_calculated, const datetime &time[], const double &open[], const double &high[], const double &low[], const double &close[], const long &tick_volume[], const long &volume[], const int &spread[] ) { if (rates_total > prev_calculated) { double Pattern[]; double Sample[]; const int Pos = GetSample1(inAmount, close, Sample, Pattern, inMaxBars); // パターンそのものを導き出した ArrayInitialize(Buffer0, EMPTY_VALUE); ArrayCopy(Buffer0, Pattern, rates_total - inAmount - 1); // 出力サンプル ArrayInitialize(Buffer1, EMPTY_VALUE); ArrayCopy(Buffer1, Sample, rates_total - inAmount - 1); Comment("Interval: " + (string)time[Pos - inAmount + 1] + " - " + (string)time[Pos]); // 見つかったセクションを表示する const int Offset = 10; ChartNavigate(handleChart, CHART_BEGIN, Pos - inAmount + 1 - Offset); // サンプル・ソースの開始前にオフセット・バー分だけチャートをシフトさせる。 ObjectCreate(handleChart, "Left", OBJ_VLINE, 0, time[Pos - inAmount + 1], 0); ObjectCreate(handleChart, "Right", OBJ_VLINE, 0, time[Pos], 0); } return(rates_total); }
コードベースにも似たようなものが ある。
取引の機会を逃しています。
- 無料取引アプリ
- 8千を超えるシグナルをコピー
- 金融ニュースで金融マーケットを探索


オリジナル数学関数のクロスプラットフォームライブラリです。:
作者: fxsaber