ライブラリ: MovingAverages

 

MovingAverages:

移動平均のライブラリーは、 MetaTrader 5のクライアントターミナルに標準搭載されています。

このライブラリには、様々な種類の 移動平均が入っています。合計で8つあり、大きく2つの関数グループに分かれています。

最初のグループには、特定の場合における移動平均の単純な値や配列を返す関数が入っています。:

これらの関数は、一度だけ平均値を得ることを意図しています。瞬間的に何度も呼び出されることは意図されていません。ループ処理でこれらのグループの関数が必要な場合(平均値の値を計算する場合や配列を利用する場合)、最適化されたアルゴリズムを使う必要があります。

2番目の関数グループは、初期値の配列に基づいた移動平均の値によって、配列処理を受け取るように設計されています。:

  • SimpleMAOnBuffer() - price[]配列の単純平均の値で、配列buffer[]の出力を満たす。;
  • ExponentialMAOnBuffer() - price[]配列の指数平均の値で、配列buffer[]の出力を満たす。;
  • SmoothedMAOnBuffer() - price[]配列の平滑平均の値で、配列buffer[]の出力を満たす。;
  • LinearWeightedMAOnBuffer() - price[]配列の加重平均の値で、配列buffer[]の出力を満たす。

作者: MetaQuotes Software Corp.

 

ライン:

   if(period<=1 || rates_total-begin<period) return(0);

は非厳密な等号でなければなりません:

   if(period<1 || rates_total-begin<period) return(0);
そうしないと、例えばMACD.mq5の配信コードをコンパイルしてInpSignalSMA=1に設定した場合、MACDラインと等しくなるはずのSignal ラインがゼロに等しくなってしまいます。
 
ExponentiaMA関数で、3番目のパラメータprev_valueを入力する意味がよく理解できません。平均を計算するための 純粋な計算式で、前の期間の値が必要なのは明らかですが、この値を内部的にカウントし、SimpleMAのように3つのデータだけを関数に入力すれば、この関数は一般人にとってわかりやすいものになると思います。
 

の最後のパラメータweightsumが必要なのはなぜですか?

int LinearWeightedMAOnBuffer(const int rates_total,const int prev_calculated,const int begin,const int period,const double& price[],double& buffer[],int &weightsum)

他の3つの関数にはない。それでも必要であれば、外部変数weightsum=0を初期化するときにこれをどのように使うか。

 
Roman Sukhorukov:

の最後のパラメータweightsumが必要なのはなぜですか?

int LinearWeightedMAOnBuffer(const int rates_total,const int prev_calculated,const int begin,const int period,const double& price[],double& buffer[],int &weightsum)

他の3つの関数にはない。それでも必要であれば、外部変数weightsum=0を初期化するときにどのように使うかですが、他の関数はゼロ除算のエラーを発生させるなど、おかしな動きをします。

ターミナルに付属している同様のインジケータ Custom Moving Average.mq5 では、関数内で宣言されています:

   static int weightsum;

つまり、インジケータの新しい再計算のたびにリセットされることはありません。インジケータ静的intのweightsumで - 彼らは別のスレッドであり、それらは独自の変数を持っているので、交差しません。

しかし、(Expert Advisorから実行される)期間が異なる2つ以上のLWMAをカウントする場合、weightsumは関数内でstaticに宣言することですべてのLWMAに対して1ではなく、それぞれ異なるものにする必要があります。

したがって、LWMA ごとに独自のグローバル変数を 用意し、それを LinearWeightedMAOnBuffer() に渡す必要があります、

例えば、LWMAが2つある場合、以下の変数をグローバルに宣言する。

int weightsum1;
int weightsum2;

そして、それらを関数に渡す必要があります。

もし私が誤解していたら、訂正してください。

 
elibrarius:

したがって、LWMAごとにグローバル変数が 必要であり、それをLinearWeightedMAOnBuffer()に渡す、

例えば、2つのLWMAがある場合、グローバルに次のように宣言される。

int weightsum1;
int weightsum2;

であり、それらを関数に渡す必要がある。

グローバル・レベルで int weightsum1; int weightsum2; ...と宣言することでチェックできる。をグローバル・レベルで宣言してチェックした。正しく計算されている。
 
Maxim Khrolenko #:
ExponentiaMA関数で、3番目のパラメータprev_valueを入力する意味がよく理解できません。平均を計算するための 純粋な計算式では、前の期間の値が必要なのは明らかですが、私の意見では、この値を内部的にカウントし、SimpleMAのように3つのデータだけを関数に入力するようにすれば、この関数は一般人にとってわかりやすくなると思います。

まったく同感です!使い方がよくわからない。結局、私がExponentialMAOnBufferを選んだのは、prev_valueを どこで取るのか理解できなかったからだ。これらの関数はExpert Advisorから外部インジケータを呼び出すために必要なのではなく、内部のすべてを読み取るために必要なのです。開発者は何を提案したのでしょうか?

漫画「プロストクヴァシノ」の引用を思い出す。「必要のないものを売るには、まず必要のないものを買わなければならない。

 
Konstantin Efremov #:

まったく同感だ!使い方がよくわからない。結局、ExponentialMAOnBufferを選んだのは、prev_valueを どこで取るのかがわからなかったからです。これらの関数はExpert Advisorから外部インディケータを呼び出すために必要なのではなく、内部をすべて読み込むために必要なのです。開発者の提案は?

不要なものを売るには、まず不要なものを買わなければならない。

そうだね。同じことが当てはまる:

//+------------------------------------------------------------------+
//| 移動平均|
//+------------------------------------------------------------------+
double SmoothedMA(const int position,const int period,const double prev_value,const double &price[])
  {
   double result=0.0;
//--- チェック期間
   if(period>0 && period<=(position+1))
     {
      if(position==period-1)
        {
         for(int i=0; i<period; i++)
            result+=price[position-i];

         result/=period;
        }

      result=(prev_value*(period-1)+price[position])/period;
     }

   return(result);
  }

黄色の コードがどのように計算されるかは問題ではない。結果は緑の 文字列のままです。そして、これはMT5の標準ライブラリにあります! うん!

関数を改善してください。MQL5では、複数の商品のMA値を計算する必要がある場合に非常に便利です。しかも、事前にどれがどれだかわかりません。マーケット概要からすべての商品の MAハンドルを形成することはできません!

 
Konstantin Efremov #:

まったく同感だ!使い方がよくわからない。結局、ExponentialMAOnBufferを選んだのは、prev_valueを どこで取るのかがわからなかったからです。これらの関数はExpert Advisorから外部インディケータを呼び出すために必要なのではなく、内部をすべて読み込むために必要なのです。開発者の提案は?

不要なものを売るには、まず不要なものを買わなければならない。

アンドレイ・カウノフ#:

はい、私も同意見です。同じことが当てはまる:

黄色で ハイライトされたコードがどのように計算されるかは問題ではありません。結果は緑の 文字列のままです。そして、これはMT5の標準ライブラリにあります! うん!

関数を改善してください。MQL5では、複数の商品のMA値を計算する必要がある場合に非常に便利です。しかも、事前にどれがどれだかわかりません。マーケット概要からすべての商品の MAハンドルを形成することはできません!

まあ、CodeBaseで検索して、そこを見てください。このライブラリを使っているのは私だけではないでしょう。

MA on ATR
MA on ATR
  • www.mql5.com
Индикатор Moving Average по значениям индикатора Average True Range
 
Automated-Trading:

移動平均

著者MetaQuotes Software Corp.

すみません、"ポジション "という変数は何ですか?

double SimpleMA(const int position,const int period,const double &price[])
 
double SimpleMA( const int position, const int period, const double &price[])
  {
   double result= 0.0 ;
 //--- チェック期間 
   if (period> 0 && period<=(position+ 1 ))
     {
       for ( int i= 0 ; i<period; i++)
         result+=price[position-i];

      result/=period;
     }

   return (result);
  }

おはようございます。

こんな感じですか?