MT4 iMAOnArrayとiBandsOnArrayの要素数が計算に与える影響について - ページ 2

 
Sergey Efimenko:
何を期待しているのかって?また、オフセット299-0で配列にアクセスしますが、「配列の最後」から「配列の最後-300」までの値(私の場合は4999から4700まで)のオフセットでデータを取得します。つまり、オフセット299にある値はオフセット4999であるべきで、同様にオフセット0にある値はオフセット4700であるべきだということです。問題は、現在の値が算出されないのに、昔の値を算出する目的は何なのか、ということです。

書いてある内容から明らかなら、何の疑問も湧かないはずです。

double  iMAOnArray(
   double       array[],          // массив               // С этим понятно...
   int          total,            // количество элементов // Это у тебя 300
   int          ma_period,        // период               // Это ???
   int          ma_shift,         // сдвиг средней        // понятно
   int          ma_method,        // метод усреднения     // понятно
   int          shift             // сдвиг                // А здесь чему равна i???
   );

コードサンプルを示せと言われたのに、例の断片を見せただけ。それ以外の部分については、すべてループしているとしか思えません。iのどの値で、最後の、現在の値を取得したいのですか?i=4700のとき、あるいはどこ?

 
Alexey Viktorov:

書いてある内容から明らかであれば、質問はないはずです。

コード例を示せと言われたのに、例の一部しか示せなかったんですね。それ以外はループしているとしか思えません。iのどの値で、最後の、現在の値を取得したいのですか?i=4700のとき、あるいはどこ?

実際に計算配列の長さに制限のあるこれらの関数を使ったことがある人なら、私の言っている意味がわかると思いますが、そうでなければ、何のための理論武装なのか・・・?私のコードのどこが不明なのでしょうか? 最初のケースでは、配列の計算に長さの制限を使わないという違いだけで、全く同じ部分を引用しています。この場合、シフト平均と平均法のどちらの計算期間であっても、どちらも同じなので、まったく問題ないのでは?上に書いたshiftの値も、同様に全く同じ使い方をしています。i "をループ内のシフト変数に置き換え、GetValue(i) 関数を少なくとも Open[i] に置き換え、前述の3つの配列をインジケータの表示バッファにし、1つ目と2つ目がどう動くかを見てみましょう。しかし、ここでは問題の理解を深めるために、2つのバリアントでシンプルなバリアントのインジケーターのフルコードの例を示します。

//これで問題なく動作します。
#property strict
#property indicator_separate_window
#property indicator_buffers 3
#property  indicator_color1 clrYellow
#property  indicator_color2 clrGreen
#property  indicator_color3 clrRed
double Buffer[],BufferMA[],BufferBMA[]; bool firstrun=true;
int init() { firstrun=true; SetIndexBuffer(0,Buffer); SetIndexBuffer(1,BufferMA); SetIndexBuffer(2,BufferBMA); return(0); }
int start() { int i,limit; int counted_bars=IndicatorCounted(); if(counted_bars<0) return(-1); if(counted_bars>0) counted_bars--; limit=Bars-counted_bars-1;
   if(firstrun) {ArrayInitialize(Buffer,Open[Bars-1]); ArrayInitialize(BufferMA,Open[Bars-1]); ArrayInitialize(BufferBMA,Open[Bars-1]); firstrun=false; }
   for(i=limit; i>=0; i--) { Buffer[i]=Open[i]; BufferMA[i]=iMAOnArray(Buffer,0,12,0,0,i); BufferBMA[i]=iBandsOnArray(Buffer,0,12,2,0,MODE_MAIN,i); }
return(0); }

//正しく動作しません。

#property strict
#property indicator_separate_window
#property indicator_buffers 3
#property  indicator_color1 clrYellow
#property  indicator_color2 clrGreen
#property  indicator_color3 clrRed
double Buffer[],BufferMA[],BufferBMA[]; bool firstrun=true;
int init() { firstrun=true; SetIndexBuffer(0,Buffer); SetIndexBuffer(1,BufferMA); SetIndexBuffer(2,BufferBMA); return(0); }
int start() { int i,limit; int counted_bars=IndicatorCounted(); if(counted_bars<0) return(-1); if(counted_bars>0) counted_bars--; limit=Bars-counted_bars-1;
   if(firstrun) {ArrayInitialize(Buffer,Open[Bars-1]); ArrayInitialize(BufferMA,Open[Bars-1]); ArrayInitialize(BufferBMA,Open[Bars-1]); firstrun=false; }
   for(i=limit; i>=0; i--) { Buffer[i]=Open[i]; BufferMA[i]=iMAOnArray(Buffer,300,12,0,0,i); BufferBMA[i]=iBandsOnArray(Buffer,300,12,2,0,MODE_MAIN,i);  }
return(0); }

チャート上に指標を 描画した後、チャートの先頭(左側)に移動し、12バー以降から1指標を見て、それは配列の2と3の "非空 "充填の始まりです、約0と異なる最初のいくつかの値を覚えて、次に現在の引用符にチャートを移動して300バーから始まる値を見るように2(ボトム)指標の値は、あなたが1指標のチャートの先頭で見たものと同じで、一方アイデアで値が現在と一致するはずです。わかりやすく説明できたでしょうか。また、オンラインチャートに載せても、1枚目は正常に動作し、2枚目は「勝手にぶら下がる」ことになります。

 
Sergey Efimenko:


スタイルが崩れるだけでなく、コードをプレーンテキストで挿入して しまうのです。コードを正しく挿入してください。
 

あなたのコードをより読みやすい形で、新しい記法で紹介します(本当に、いつまでこの時代錯誤のint start()をインジケータで使うことができるのでしょうか?)

指標1.

//+------------------------------------------------------------------+
//|                                                         Test.mq4 |
//|                        Copyright 2015, MetaQuotes Software Corp. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2015, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"
#property strict
#property indicator_separate_window
#property indicator_buffers 3
#property  indicator_color1 clrYellow
#property  indicator_color2 clrGreen
#property  indicator_color3 clrRed
double Buffer[];
double BufferMA[];
double BufferBMA[];
bool firstrun=true;
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- indicator buffers mapping
   firstrun=true;
   SetIndexBuffer(0,Buffer,INDICATOR_DATA);
   SetIndexBuffer(1,BufferMA,INDICATOR_DATA);
   SetIndexBuffer(2,BufferBMA,INDICATOR_DATA);
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
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[])
  {
//---
   int i,limit;
   limit=rates_total-prev_calculated-1;
   if(prev_calculated==0)
     {
      ArrayInitialize(Buffer,open[rates_total-1]);
      ArrayInitialize(BufferMA,open[rates_total-1]);
      ArrayInitialize(BufferBMA,open[rates_total-1]);
     }
   for(i=limit; i>=0; i--)
     {
      Buffer[i]=open[i];
      BufferMA[i]=iMAOnArray(Buffer,0,12,0,MODE_SMA,i);
      BufferBMA[i]=iBandsOnArray(Buffer,0,12,2,0,MODE_MAIN,i);
     }
   return(rates_total);
  }
//+------------------------------------------------------------------+

指標2.

//+------------------------------------------------------------------+
//|                                                         Test.mq4 |
//|                        Copyright 2015, MetaQuotes Software Corp. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2015, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"
#property strict
#property indicator_separate_window
#property indicator_buffers 3
#property  indicator_color1 clrYellow
#property  indicator_color2 clrGreen
#property  indicator_color3 clrRed
double Buffer[];
double BufferMA[];
double BufferBMA[];
bool firstrun=true;
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- indicator buffers mapping
   firstrun=true;
   SetIndexBuffer(0,Buffer,INDICATOR_DATA);
   SetIndexBuffer(1,BufferMA,INDICATOR_DATA);
   SetIndexBuffer(2,BufferBMA,INDICATOR_DATA);
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
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[])
  {
//---
   int i,limit;
   limit=rates_total-prev_calculated-1;
   if(prev_calculated==0)
     {
      ArrayInitialize(Buffer,open[rates_total-1]);
      ArrayInitialize(BufferMA,open[rates_total-1]);
      ArrayInitialize(BufferBMA,open[rates_total-1]);
     }
   for(i=limit; i>=0; i--)
     {
      Buffer[i]=open[i];
      BufferMA[i]=iMAOnArray(Buffer,300,12,0,MODE_SMA,i);
      BufferBMA[i]=iBandsOnArray(Buffer,300,12,2,0,MODE_MAIN,i);
     }
   return(rates_total);
  }
//+------------------------------------------------------------------+

そして実行した結果。

結果

о

ファイル:
Test.mq4  3 kb
Test300.mq4  3 kb
 
Sergey Efimenko:

これらの機能を使用した場合

そうでなければ、正しい解決策を提案するために質問することもないでしょう。

12の周期を計算する必要があるのに、300本のバーを取る意味はあるのでしょうか?なぜなら」必要だとしても、平均を計算する上で12個の要素がどうなるかを理解しておく必要がある。そして、配列のインデックスの 方向についてのヒントは、非常に正しかった。

紙や電卓、エクセルでの手計算で実験してみるとよくわかります。

 

回答を見ていると、問題の本質を示そうとして、それに対して「美しい」と言われるのは、ここで時間を浪費しているだけなんだなぁと思います(もちろん感謝ですが、提案したコードは問題の本質を示すためだけに2分で書いたもので、読みやすさなどの変換は必要ありません)...。

そして、特に私の投稿の前に回答があったことに喜びを感じています...。どんな電卓で、どんな手計算で、どんな索引で?ユーザーの皆様、自分の時間だけでなく、誰かの時間も無駄にしないよう、本質を理解してください。私の投稿をよく読み直してください、しかし、それが困難であれば、私は簡単に答える:両方のケースで配列のインデックスの 方向は正しいです、それは主要なコードで示されているように、必要な計算や他の変更可能なパラメータのサイズは、外部変数で設定されています、独自の関数を作成するというバリエントは、(そしてそれは実際に唯一の正しいソリューションです)、私は繰り返したい、私は組み込みMT4からそれを取得したいのですが。

一般的にすべてのあなたに感謝し、私は要約します:どちらかservicedeskまたは関数の独自のアナログを。

 

と、投稿前の答えに落胆しています...。

そんなに頑固なら⇒サービスデスク、彼らは退屈しのぎにそんな質問に答えるだけで、退屈することはほとんどないのだから。

もう一回やってみるか...

iMAOnArray()は、あなたの場合、300本のバーを取り、300本のうち過去12本のバーの平均値を計算します。最初の12本のバーを平均化するには、配列のインデックスを 逆にして、ArraySetAsSeries(BufferMA, false); または12本のバーだけを取る必要があります。

BufferMA[i]=iMAOnArray(Buffer,12,12,0,MODE_SMA,i);

つまり、その仕組みや使い方を理解しようとするのではなく、単に「動かない」「間違っている」と述べたことが判明したわけです。そして、それはあなたの意見では正しいことではありません。

次はコードの美しさについて。一行で書かれたコードを読んで目が潰れる人がいて、面白いと思うのか?間違っている。個人的には読んでませんでした。一日に何度も辛抱強く皆に指示を出してくれるリトルドラマーに感謝...。を間違えた。

 

とても「詳しく」答えたかったのですが、もう一度書き込みを読み直して、自分の回答を削除し、ようやく、同じことを何度も違う言葉で説明して、ここで時間を浪費しているだけだと気づきました・・・。

PSすべてのおかげで、本当にありがとう "Barabashke"(ウラジミール)、彼はよくやったが、この全体の状況は、彼の労働の価値がなかった、私はそれが作ることは難しいことではありません場合はさらに感謝されるだろう、キーでスクリーンショット 前へ、第三のオプションを追加し、インデックスの方向を 変更するアドバイスに従うならばどうなるかを示しています。機能の仕組みに終止符を打つために。

 
Sergey Efimenko:

とても「詳しく」答えたかったのですが、もう一度書き込みを読み直して、自分の回答を削除し、ようやく、同じことを何度も違う言葉で説明して、ここで時間を浪費しているだけだと気づきました・・・。

PSすべてのおかげで、本当にありがとう "Barabashke"(ウラジミール)、彼はよくやったが、この全体の状況は、彼の労働の価値がなかった、私はそれが作ることは困難ではない場合、さらに感謝されるだろう、キーでスクリーンショット 前へ、第三のオプションを追加し、インデックスの方向を変更するアドバイスに従うならばどうなるかを示しています。機能の仕組みに終止符を打つために。

オプション3.

//+------------------------------------------------------------------+
//|                                         Test300AsSeriesFalse.mq4 |
//|                        Copyright 2015, MetaQuotes Software Corp. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2015, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"
#property strict
#property indicator_separate_window
#property indicator_buffers 3
#property  indicator_color1 clrYellow
#property  indicator_color2 clrGreen
#property  indicator_color3 clrRed
double Buffer[];
double BufferMA[];
double BufferBMA[];
bool firstrun=true;
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- indicator buffers mapping
   firstrun=true;
   SetIndexBuffer(0,Buffer,INDICATOR_DATA);
   SetIndexBuffer(1,BufferMA,INDICATOR_DATA);
   SetIndexBuffer(2,BufferBMA,INDICATOR_DATA);
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
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[])
  {
//---
   ArraySetAsSeries(open,false);
//---
   int i,limit;
   limit=rates_total-prev_calculated-1;
   if(prev_calculated==0)
     {
      ArrayInitialize(Buffer,open[rates_total-1]);
      ArrayInitialize(BufferMA,open[rates_total-1]);
      ArrayInitialize(BufferBMA,open[rates_total-1]);
     }
   for(i=limit; i>=0; i--)
     {
      Buffer[i]=open[i];
      BufferMA[i]=iMAOnArray(Buffer,300,12,0,MODE_SMA,i);
      BufferBMA[i]=iBandsOnArray(Buffer,300,12,2,0,MODE_MAIN,i);
     }
   return(rates_total);
  }
//+------------------------------------------------------------------+

そして、全体の仕上がり。

オプション1、2、3

ファイル:
 

いいえ、ウラジミールです。ちょっと間違っていますね。

この場合、iMAOnArray()を考慮した300要素の配列に対して、ArraySetAsSeries(array, false);を適用する必要があります。しかし、配列の充填ループの代わりにCopyOpen() を使用した方が良いですね。

私の理解では、このバリエーションでは、次のようにするのがよいでしょう。

   for(i=limit; i>=0; i--)
     {
      Buffer[i]=open[i];
      BufferMA[i]=iMAOnArray(Buffer,12,12,0,MODE_SMA,i);
      BufferBMA[i]=iBandsOnArray(Buffer,12,12,2,0,MODE_MAIN,i);
     }