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

 
Yuriy Asaulenko:
不思議ですね。ヘルプのどこかに、インジケータがすでに動作している場合、コピーは作成されないと書いてあったのですが。私には理解できない。

何か勘違いしていたようです。この仮説を検証するために、OnCalculate()とOnTimer()の2つのバッファを持つインジケータを作成し、スクリプト、Expert Advisor...を作成しました。OnCalculate()でバッファに入れた値をiCustom()で表示し、OnTimer()で空の値を演繹するようにしました。同時に、スクリプトやEAを配置したチャートにインジケータが表示されます。

結論:iCustom()でインジケータを呼び出した場合、インジケータ内でOnTimer()イベントが実行されない。

ドキュメントに書かれているのは、このためかもしれません

関数 OnTimer() は、イベントが発生したときに呼び出されます。タイマーはエキスパートアドバイザーとインジケータ用のシステムタイマーによってのみ生成さ れます。

しかも、指標には一切触れていない。

どうやらmqlには、文書化されていない便利な機能や、文書化されていない複雑な機能があるようです...。

События клиентского терминала - Программы MQL4 - Справочник MQL4
События клиентского терминала - Программы MQL4 - Справочник MQL4
  • docs.mql4.com
События клиентского терминала - Программы MQL4 - Справочник MQL4
 
comp:

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

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

読み書きが可能で、DLLは不要です。
 
pako:
読み書き可能でDLLは不要
さて、その例はどこにあるのでしょうか?
 
Alexey Viktorov:
さて、お手本はどこにあるのでしょうか?
インジケーターはどこですか?
 
comp:

残念ながら、この場合

はどうにもならない。

なぜ助からないのか?
 
pako:
インジケーターはどこですか?
ドミトリー・フェドセーエフ
なぜ、役に立たないのか?

件名

#property strict

#property indicator_separate_window
#property indicator_buffers 1
#property  indicator_type1 DRAW_LINE
#property  indicator_color1 clrRed

#define  PAUSE 100

input double EMA = 0.1;      // Коэффициент экспоненциального сглаживания
input int Amount = 100;      // Сколько раз применить до "сброса"

double Buffer[];

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[] )
{
  return(rates_total);
}

void OnInit( void )
{
  SetIndexBuffer(0, Buffer);

  EventSetMillisecondTimer(PAUSE);

  return;
}

void OnDeinit( const int reason )
{
  EventKillTimer();

  return;
}

void SetBuffer( const bool Random )
{
  const int Size = ArraySize(Buffer);

  if (Random)
  {
    MathSrand((int)TimeLocal());

    for (int i = 0; i < Size; i++)
      Buffer[i] = MathRand();
  }
  else
    for (int i = 1; i < Size; i++)
      Buffer[i] += (Buffer[i - 1] - Buffer[i]) * EMA;

  return;
}

void OnTimer( void )
{
  static int Count = 0;

  SetBuffer(Count % Amount == 0);
  ChartRedraw();

  Count++;

  return;
}
 
Yuriy Asaulenko:
不思議ですね。ヘルプのどこかに、インジケータがすでに動作している場合、コピーは作成されないと書いてあったのですが。何か見落としているのかもしれません。

最近、あるインジケータを投稿したのですが、それは単にテキスト文字列を 表示するだけです。また、iCustomを通して呼び出すと、チャート上のインジケータのラインとiCustomが干渉してしまい、プログラム的に1つだけ出力する必要がありました。

多分、コードのコピーはメモリに作成されないが、再計算はそのパラメータで行われる

https://www.mql5.com/ru/code/14737/83151#!tab=code

 
comp:

件名

それがどうした?
 
Alexey Volchanskiy:

最近、あるインジケータを投稿したのですが、それは単にテキスト文字列を 表示するだけです。また、iCustomを通して呼び出すと、チャート上のインジケータのラインとiCustomが干渉してしまい、プログラム的に1つだけ出力する必要がありました。

おそらく、コードのコピーはメモリに作成されませんが、再計算はそのパラメータで行われますCopy

https://www.mql5.com/ru/code/14737/83151#!tab=code

ダイナミックロードであるため、コードのコピーは作成できない。
 
Алексей Тарабанов:
コードコピーは、ダイナミックロードなので、作らないわけにはいきません。

口先だけの主張、それともMQ開発者?:))

とはいえ、プログラムコードが1つのインスタンスにあり、クライアント用にデータインスタンスが作られるDLLになぞらえて、私自身はそう考えています。

要するに、チャートにインデックスがある場合、iCustomはそこからではなく、別途作成したインスタンスからデータを取得するというのが現実的なところです。