DLLを使った解決方法は、「インジケーター間のデータ転送 - この問題の簡単な解決 方法」の記事で説明しています。しかし、インジケーターのソースコードに外部のGetPtrの 呼び出しを追加する必要があり、必ずしもそれが可能とは限りません。
DLLを使わずに、バッファの読み込みだけを行うことは可能でしょうか(記事では書き込みも行っています)?記事が書かれた当時(2010年)から、このテーマについて何か変化があったのでしょうか?
- docs.mql4.com
チャート上のインジケーターのバッファの値(少なくとも1つ)を取得するスクリプトが必要です。インジケータからファイルへバッファをダンプすることは、バッファを読み込むスクリプトではありません。
上記の記事では、ポインターを使った素晴らしいソリューションが紹介されており、チャート上の他のインジケーターのバッファを読むだけでなく、上書きすることさえ可能です。これがバッファリードと呼ばれるものです。しかし、それはDLLである。
次のようなスキームを実装することができますね。
- は、グローバル変数がそのバッファをファイルに書き込むのを待つインジケータです。
- スクリプトは実行時にこのような変数を作成し、対応するファイルを受け取ります。
なぜか未だにチャートからインジケーターデータを人間が読み取るということができないんですよねー。妄 想のようですが、そうなんです。
残念ながら、この場合
はどうにもならない。
iCustom()はインジケータ・バッファを 読み込みますが、このバッファがどのように満たされるかに関係なく、なぜダメなのでしょうか?結局のところ、バッファはどのような場合でもグローバル変数のレベルで宣言されます。
iCustomはTimerとChartEventのイベントについては何も知らないからです。
例えば、チャート上のインジケータが1秒ごとに(タイマーイベント)、その唯一のバッファを乱数で埋める(または以前のバッファの値にEMAを適用する)。これはかなりのコード行数です。この場合のiCustomは、チャート上に表示されるものを返すことはありません。
iCustomはTimerとChartEventのイベントについては何も知らないからです。
例えば、チャート上のインジケータが1秒ごとに(タイマーイベント)、その唯一のバッファを乱数で埋める(または以前のバッファの値にEMAを適用する)。これはかなりのコード行数です。iCustomは、チャート上に表示されるものを返すことはありません。
iCustom()はインジケータ・バッファを 読み込みますが、このバッファがどのように満たされるかに関係なく、なぜダメなのでしょうか?結局のところ、バッファはどのような場合でもグローバル変数のレベルで宣言されます。
iCustomはチャート上のインジケータからバッファを読み取るのではなく、メモリ上にインジケータのコピーを独自に作成し、そこから読み取るので、バッファのコピーがチャート上に表示されないだけです。しかし、インディケータが単独でチャート上に何かを描画する場合、iCustom経由で呼び出されたときに描画されるため、問題が発生します。
例えば、以下のようなコードを持つインジケータであれば、iCustomを呼び出した際に描画され、チャート上にインジケータのテキストがオーバーレイ表示されます。
ObjectSetString(0, ShortName, OBJPROP_TEXT, "какой-то текст"); ChartRedraw();
iCustomはチャート上のインジケータからバッファを読み取るのではなく、メモリ上にインジケータのコピーを独自に作成し、そこから読み取るので、バッファのコピーがチャート上に表示されないだけです。しかし、インディケータが単独でチャート上に何かを描画する場合、iCustom経由で呼び出されたときに描画されるため、問題が発生します。
例えば、以下のようなコードを持つインジケータであれば、iCustomを呼び出した際に描画され、チャート上にインジケータのテキストがオーバーレイ表示されます。
- 無料取引アプリ
- 8千を超えるシグナルをコピー
- 金融ニュースで金融マーケットを探索
チャート上にインジケータが配置されます。Timer、ChartEvent、Calculateイベントによって 再描画されます。
CTRL+Dで見ることができるそのインジケーターバッファ(INDICATOR_DATA)の現在値を読み取るスクリプトが必要です。MT4で可能でしょうか?