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

 

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

似たものをを持たないか、代替の実装よりもはるかに高速で動作する、異なる場所から取得したオリジナルの数学関数です。

作者: fxsaber

 
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で十分だ。

それは素晴らしい。私は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);
}

 

コンパイルしようとしたらエラーが出た:

can't open "C:♪Program FilesAlpari MT4MQL4include ♪fxsaber ♪Math ♪Math.mqh" include file ... 18 11

'i' - 変数がすでに定義されている 77 12

'MathCorrelationPearson' -関数が 定義されていない 128 3

なぜだろう?



 
YarTrade:

コンパイルしようとしたらエラーが出た:

can't open "C:♪Program FilesAlpari MT4MQL4include ♪fxsaber ♪Math ♪Math.mqh" include file ... 18 11

'i' - 変数がすでに定義されている 77 12

'MathCorrelationPearson' -関数が 定義されていない 128 3

なぜですか?

ディレクティブを書く

#property strict