チャートに設定されたインジケーターバッファの読み取り

 

チャート上にインジケータが配置されます。Timer、ChartEvent、Calculateイベントによって 再描画されます。

CTRL+Dで見ることができるそのインジケーターバッファ(INDICATOR_DATA)の現在値を読み取るスクリプトが必要です。MT4で可能でしょうか?

 

DLLを使った解決方法は、「インジケーター間のデータ転送 - この問題の簡単な解決 方法」の記事で説明しています。しかし、インジケーターのソースコードに外部のGetPtrの 呼び出しを追加する必要があり、必ずしもそれが可能とは限りません。

DLLを使わずに、バッファの読み込みだけを行うことは可能でしょうか(記事では書き込みも行っています)?記事が書かれた当時(2010年)から、このテーマについて何か変化があったのでしょうか?

 
iCustom() が役に立ちます。
iCustom - Технические индикаторы - Справочник MQL4
iCustom - Технические индикаторы - Справочник MQL4
  • docs.mql4.com
iCustom - Технические индикаторы - Справочник MQL4
 
Alexey Viktorov:
iCustom() が役に立ちます。

残念ながら、この場合

Timer、ChartEvent、Calculateイベントによる再描画

は役に立ちません。

 
必要な数値はいくつですか?これらの値の複製を、端末のグローバル変数、チャート上のオブジェクトのプロパティ、ファイル
 
Alexander Puzanov:
必要な数値はいくつですか?これらの値の複製を、端末のグローバル変数、チャートのオブジェクトのプロパティ、ファイルに保存するように、インジケータ自身に設定します。

チャート上のインジケーターのバッファの値(少なくとも1つ)を取得するスクリプトが必要です。インジケータからファイルへバッファをダンプすることは、バッファを読み込むスクリプトではありません。

上記の記事では、ポインターを使った素晴らしいソリューションが紹介されており、チャート上の他のインジケーターのバッファを読むだけでなく、上書きすることさえ可能です。これがバッファリードと呼ばれるものです。しかし、それはDLLである。

次のようなスキームを実装することができますね。

  • は、グローバル変数がそのバッファをファイルに書き込むのを待つインジケータです。
  • スクリプトは実行時にこのような変数を作成し、対応するファイルを受け取ります。
しかし、これでは松葉づえにもならない。バッファを読み込んでいない

この問題が4番目のフォーラムで公に発表されてから7年以上が経ちますが、沈黙から判断すると、開発者は機能的なものを作成していません(googleは覚えています)。

なぜか未だにチャートからインジケーターデータを人間が読み取るということができないんですよねー。妄 想のようですが、そうなんです。

 
comp:

残念ながら、この場合

はどうにもならない。

iCustom()は、このバッファがどのように満たされるかに関係なく、インジケータ・バッファを 読み取ります。結局のところ、バッファはどのような場合でもグローバル変数のレベルで宣言されます。
 
Alexey Viktorov:
iCustom()はインジケータ・バッファを 読み込みますが、このバッファがどのように満たされるかに関係なく、なぜダメなのでしょうか?結局のところ、バッファはどのような場合でもグローバル変数のレベルで宣言されます。

iCustomはTimerとChartEventのイベントについては何も知らないからです。

例えば、チャート上のインジケータが1秒ごとに(タイマーイベント)、その唯一のバッファを乱数で埋める(または以前のバッファの値にEMAを適用する)。これはかなりのコード行数です。この場合のiCustomは、チャート上に表示されるものを返すことはありません。

 
comp:

iCustomはTimerとChartEventのイベントについては何も知らないからです。

例えば、チャート上のインジケータが1秒ごとに(タイマーイベント)、その唯一のバッファを乱数で埋める(または以前のバッファの値にEMAを適用する)。これはかなりのコード行数です。iCustomは、チャート上に表示されるものを返すことはありません。

私の誤解が理解できました、ありがとうございます。
 
Alexey Viktorov:
iCustom()はインジケータ・バッファを 読み込みますが、このバッファがどのように満たされるかに関係なく、なぜダメなのでしょうか?結局のところ、バッファはどのような場合でもグローバル変数のレベルで宣言されます。

iCustomはチャート上のインジケータからバッファを読み取るのではなく、メモリ上にインジケータのコピーを独自に作成し、そこから読み取るので、バッファのコピーがチャート上に表示されないだけです。しかし、インディケータが単独でチャート上に何かを描画する場合、iCustom経由で呼び出されたときに描画されるため、問題が発生します。

例えば、以下のようなコードを持つインジケータであれば、iCustomを呼び出した際に描画され、チャート上にインジケータのテキストがオーバーレイ表示されます。

ObjectSetString(0, ShortName, OBJPROP_TEXT, "какой-то текст");
ChartRedraw();
 
Alexey Volchanskiy:

iCustomはチャート上のインジケータからバッファを読み取るのではなく、メモリ上にインジケータのコピーを独自に作成し、そこから読み取るので、バッファのコピーがチャート上に表示されないだけです。しかし、インディケータが単独でチャート上に何かを描画する場合、iCustom経由で呼び出されたときに描画されるため、問題が発生します。

例えば、以下のようなコードを持つインジケータであれば、iCustomを呼び出した際に描画され、チャート上にインジケータのテキストがオーバーレイ表示されます。

不思議ですね。ガイドのどこかに、インジケータがすでに起動している場合、コピーは作成されないと書いてありました。何か理解できていないのかもしれない。