mql5言語の特徴、微妙なニュアンスとテクニック - ページ 31

 
アルチョム・トリシキン

私が示したコードを見たことがありますか?実行したのですか?

インジケータのバッファを埋める方法ではなく、現在のバーからではなくAOから値を取るとなぜ空の値が返されるのかを聞いていたのです。
履歴がなく、読み込み中で、ネイティブでないタイムフレームからAOを読み込み中に、「データがない」というエラーを返しました。

インジケータサイクルに入らないように、ヒストリが完全にロードされているかどうかをチェックしたいのですが。

インジケータでCopyBufferを使用して、他のインジケータからデータを受け取る場合、必要です。

  1. チャート上の右端のバーが、インジケータバッファのインデックス「0」に対応するように、インジケータバッファを反転させてください。
  2. したがって、"iMTF_AO.mq5 "インディケータの「現在のバー」は、チャートの右端のバーとなり、それはインディケータ・バッファ "Buffer[]"のインデックス「0」に対応することになる。
  3. また、インジケータ(CopyBuffer(handle,0,shift,1,array))から「現在のバー」を取得するには、「shift」パラメータが「0」に等しい必要があります。

インジケータバッファを反転させたくない場合は、次のようにしてください(一時的に): AO(0) - INDICATORから別のインジケータの値を取得する方法を理解するためです。一度や二度はエラーが出るかもしれませんが、それは時系列が構築されるまでのことで、その後は安定した値が出るようになります。

 
アルチョム・トリシキン
私の答えを見ましたか?試してみましたか?
 
ウラジーミル・カルプトフ

インジケータでCopyBufferを使用して、他のインジケータからデータを取得する場合。

  1. チャートの一番右のバーが、インジケーターバッファのインデックス「0」に対応するように、インジケーターバッファを反転させてください。
  2. したがって、「iMTF_AO.mq5」インディケータの「現在のバー」は、チャートの右端のバーとなり、インディケータ・バッファ「Buffer[]」のインデックス「0」に対応することになります。
  3. また、インジケータ(CopyBuffer(handle,0,shift,1,array))から「現在のバー」を取得するには、「shift」パラメータが「0」に等しい必要があります。

インジケータバッファを反転させたくない場合は、次のようにしてください(一時的に): AO(0) - INDICATORから別のインジケータの値を取得する方法を理解するためです。一度や二度はエラーが出るかもしれません。しかし、それは時系列が構築され、値が安定するまでの話です。

1.私のコードには それがあり、すぐにありました。

   ArraySetAsSeries(Buffer,true);
   int bars=Bars(NULL,PeriodForWork);
   datetime time_limit=GetTime(Symbol(),PeriodForWork,bars-1);
   int limit_p=GetBarShift(Symbol(),Period(),time_limit);
   if(rates_total<1) return(0);

2.そうです。

3. シフトはサイクルインデックスiに等しい。そして、履歴データの最初(rates_total-1)から最後(現在のデータ)までループします。

もう一つの疑問は、欠損バーによるデータを取得しないために、非ネイティブのTFを基準としてこのデータを計算する必要があるかということです。そして、目的のTFの履歴が完全に同期していることをサイクル前に判断する必要があります。

 
アルチョム・トリシキン

1.私のコードにはそれが あり、すぐに持っていました。

2.ありのままの姿であること。

3. シフトはサイクルインデックスiに等しい。そして、ループは過去のデータの最初(rates_total-1)から最後(現在のデータまで)へと続く

もう一つの問題は、このデータをネイティブでないタイムフレームに関連して計算する必要があるため、欠損バーからデータを取得することができないことです。そして、必要な時間軸の歴史が完全に同期していることをループの前に判断する必要があります。


AO: put を呼び出すループを、"0 "からある値まで(現在はある値からゼロまで)作り直せ。エラーが発生した場合、計算されたバーの数("limit_p")と現在のインジケーターのレート_合計を一度に比較します。


追加:そしてここで、これらの行は、計算された「限界」のすべての努力を消去します(私たちが非ネイティブの時間枠を参照する場合)。

   if(limit>1) 
     {
      limit=rates_total-1;
     }

大雑把に言うと、最初(ネイティブでない時間軸にアクセスした場合)「リミット」は「156」と同じでしたが、BACK!以下では「リミット」は「1545666666」となりました。



 
アレクセイ・コジツィン
同期を試されましたか?また、タイマーを使って必要なTF/シンボルのデータを常に最新の状態に保つよう、開発者は助言しています。

いや、まだ試していないんです。データの関連性のサポートについては、見たことがありますね〜。

しかし、最初は、指定した日付と現在の日付のデータがまだ同期していない場合、OnCalculate()を終了する必要があります。

現在のものについては理解しています。

if(rates_total<1) return(0);

については、そのBars()を確認する必要があります - rate_totalの代わりにその数。

しかし、私はリミットについて知らない - それは、(別の指標の例として)現在の時間枠でチェックすることができます。

   int limit=rates_total-prev_calculated;
   if(limit>1) {
      limit=rates_total-4;
      ArrayInitialize(BufferAoDN,EMPTY_VALUE);
      ArrayInitialize(BufferAoUP,EMPTY_VALUE);
      ArrayInitialize(BufferMacdDN,EMPTY_VALUE);
      ArrayInitialize(BufferMacdUP,EMPTY_VALUE);
      ArrayInitialize(BufferRsiDN,EMPTY_VALUE);
      ArrayInitialize(BufferRsiUP,EMPTY_VALUE);
      ArrayInitialize(BufferStochDN,EMPTY_VALUE);
      ArrayInitialize(BufferStochUP,EMPTY_VALUE);
      }

しかし、このテストインジケータでは、現在のタイムフレーム(OnCalculate()で計算を表示します)と指定したタイムフレームの両方からデータを取得します - 指定したタイムフレームからAOデータを取得するためです。

私はまだバーの 数のすべての必要なデータを計算する方法を覚えていない - ループは、現在のまたは指定された1のいずれかの最初の既存のデータを持つ歴史のバーの時間に対応するバーで始まるべきであるので - それが少ない場合 - そのバーから我々はループを開始します。また、新しいバーの出現を検出し、完全な再計算または現在のバーのみの再計算(新しいバーの出現または履歴の読み込みなど、何が起こったかに依存する)を行うために、リミットを正しく計算する必要があります。

たぶん、すべてを一度に考えようとすると、余計なことをたくさん考えてしまうんでしょうね......。

 
ウラジーミル・カルプトフ


AOへのループコールをやり直す:「0」からある値へ置く(現在はある値から0へ)。エラー発生時:計算されたバーの数("limit_p")と現在の指標のレート_合計を一度に比較します。


追加:そして、これらの行は、計算された「限界」のすべての努力を消去します(非ネイティブの時間枠を参照する場合)

大雑把に言うと、最初(ネイティブでない時間軸を扱う場合)"limit "が156になり、BATCH!以下では "limit "がすでに "1545666666 "になっています。

そう、ここで慌てて失敗したことをすぐさま書きました。

しかし、私はループを変更しません - すべてが最初から最後までの歴史の計算で構築されている非常に複雑なインジケータがあります - それは全体の指標 - そのロジックのすべてを書き換えるよりも、限界を再計算してデータを取得する方が簡単です。

 
アルチョム・トリシキン

いや、まだ試していないんです。データの関連性のサポートについては、見たことがありますね〜。

しかし、最初は、指定した日付と現在の日付のデータがまだ同期していない場合、OnCalculate()を終了する必要があります。

現行品はクリアしています。

なかなかそうはいきませんね。最初に端末にインジケータをセットしたとき、期待したものと違うものが表示されることがあります。日中や接続が途切れた場合、エラーが発生することがあります。

OnCalculate() の終了について:最初のリクエストBars()は初期化段階で行い、OnCalculate()で現在と必要なTFの同期を確認する。同期がとれていない場合は、そのままにしておきます。

 
アルチョム・トリシキン

はい、それは私がすぐに言ったことです、急いで台無しにしたことを。

ループを変えたくないのですが、かなり複雑なインジケータがあり、それは最初から最後までの 履歴の計算に基づいています - インジケータ全体(そのロジックすべて)を書き直すよりも、限界を再計算してデータを適切に受信する方が簡単です。

アルテム 「最初から最後まで」ってどういうこと?

すべてのアレイを反転させることが最良の方法だと思いますか?

なぜ

ArraySetAsSeries(Buffer,true);

1つの値しかコピーしていない場合は?

現在の TF 以外をコピーする場合は、必要なバーの時刻をCopyBuffer() 関数に 渡すとよいでしょう。そうでないと、希望のバーがコピーされません。

 
アレクセイ・ヴィクトロフ

1.アーティオム、「初めから終わりまで」とはどういう意味ですか?

2.すべてのアレイを反転させることが最善の方法だと思いますか?

3.なぜ

4.1つの値だけをコピーする場合?

現在のタイムフレームではない、必要なバーの時刻を関数CopyBuffer() にコピーする場合、それを渡す方が良い。そうでないと、希望のバーがコピーされません。

1.ヒストリカルデータの開始は、ヒストリーの中で最も短い開始時間を持つ最初のバー、ヒストリカルデータの終了は現在のバーとなります。

2.4から5へコピーしています。

Buffer[]ではrates_total-1から0までループでデータを書き込むので、時系列でやらないとチャート上では前後して表示されてしまうからです。

4.ある時間枠のバーiのデータに対応する、ある瞬間の1つの値をコピーしたい。

mql4で現在のタイムフレームでないデータを取得するのがいかにラクか、そして簡単かをご覧ください。mql5でインジケーターのデータを受信しても動作しないのはどうしてでしょうか。AOデータを受信する機能で、インジケーターが動作するチャートのタイムフレームに対応していないタイムフレームを渡すと必ずエラー4806が発生します。

//+------------------------------------------------------------------+
double GetDataAO(string sy, int timeframe, int shift) {
   double array[1];
   ZeroMemory(array);
#ifdef __MQL4__
   array[0]=iAO(sy,timeframe,shift);
#else 
   ResetLastError();
   if(CopyBuffer(handle_ao,0,shift,1,array)==WRONG_VALUE) {
      Print(__FUNCTION__," > Error: ",GetLastError());
      return(0);
      }
#endif 
   return(array[0]);
}
//+------------------------------------------------------------------+

同時に、OnInit()で、データを受け取りたい現在の価格に対応するインジケータハンドルが作成されます。

handle_ao=iAO(symbol,periodForWork);

つまり、どのようにfを切り替えても、必要な(設定で選択された)fでハンドルが作成されるのです。しかし、AOデータは、セッティングで選択した関数とcurrentfunctionが一致しなければ得られない。もしそれらが一致しない場合は、常にゼロが関数から返される。

問題は、「なぜ?

 
アルチョム・トリシキン

1.ヒストリカルデータの開始は、歴史上最も短い開始時間の最初のバーで、ヒストリカルデータの終了は、現在のバーです。

2.4から5へ書き換えています。

Buffer[]ではrates_total-1から0までループでデータを書き込むので、時系列でやらないとチャート上では前後して表示されてしまうからです。

4.指定した時間枠のバーiのデータに対応する値を一度に一つずつコピーしています。

mql4でcurrentfactor以外のデータを取得するのがいかに簡潔で簡単であるかをご覧ください。mql5でインジケーターのデータを受信しても動作しないのはどうしてでしょうか。AOデータを受信する機能で、インジケーターが動作するチャートのタイムフレームに対応していないタイムフレームを渡すと必ずエラー4806が発生します。

同時に、OnInit()で、データを受け取りたい現在の価格に対応するインジケータハンドルが作成されます。

つまり、fをどのように切り替えても、必要な(設定で選択された)fでハンドルが作成されるのです。しかし、AOデータは、セッティングで選択した関数とcurrentfunctionが一致しなければ得られない。一致しない場合は、常にゼロが関数から返される。

質問:「なぜ?

1.ただ、明確にしておくことがあります。今、私たちは同じことを話しているのだと理解しました。

それはわかるが、逆アレイにする必要があるのは納得できない。2つの端子に対して1つのインジケーターが必要なのでしょうか?鎌と斧を2in1にしているようなものです。

3.私の理解では、Buffer[]は、関数CopyBuffer() で受信者が1つの指標値だけを取得するために使用します。

4.一番大事なことに目を向けていない。指標値のコピー開始は、バーインデックスではなく、i番目のバーの時刻で判断する必要があります。

int  CopyBuffer( 
   int       indicator_handle,     // handle индикатора 
   int       buffer_num,           // номер буфера индикатора 
   datetime  start_time,           // с какой даты 
   int       count,                // сколько копируем 
   double    buffer[]              // массив, куда будут скопированы данные 
   );
理由: