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

 
comp:

件名

スペルを正しく書けば、幸せになれる。
 
Dmitry Fedoseev:
それで?

インジケータを 起動し、次に - Expert Advisorを起動します。

#property strict

#define  PAUSE 100

sinput int BufferIndex = 0;     // Номер буфера индикатора
sinput bool TimerEvent = FALSE; // Использование события Timer

string IndicatorName;

string GetBetweenString( string &SourceString, const string BeginString, const string EndString = "" )
{
  string Str = SourceString;
  int Pos1 = 0;
  int Pos2 = 0;

  if (BeginString != "")
    Pos1 = StringFind(SourceString, BeginString);

  if (Pos1 >= 0)
  {
    Pos1 += StringLen(BeginString);

    Pos2 = StringFind(SourceString, EndString, Pos1);

    if (Pos2 != Pos1)
      Str = StringSubstr(SourceString, Pos1, Pos2 - Pos1);
    else
      Str = "";
  }

  SourceString = StringSubstr(SourceString, Pos2 + StringLen(EndString));

  return(Str);
}

string FileToString( const string FileName )
{
  string Res = "";

  const int handle = FileOpen(FileName, ::FILE_READ|::FILE_BIN);

  if (handle != INVALID_HANDLE)
  {
    uchar Array[];

    FileReadArray(handle, Array);

    Res = CharArrayToString(Array);

    FileClose(handle);
  }

  return(Res);
}

string GetIndicatorName( const long Chart_ID = 0 )
{
  string Res = "";

  const string FileName = ::WindowExpertName() + ".tpl";

  if (ChartSaveTemplate(Chart_ID, "..\\MQL4\\Files\\" + FileName))
  {
    string Str = FileToString(FileName);

    if (StringFind(Str, "name=Custom Indicator") > 0)
      Res = GetBetweenString(Str, "<indicator>\r\nname=Custom Indicator\r\n<expert>\r\nname=", "\r\n");
  }

  return(Res);
}

string GetIndicatorString( const int Pos = -1 )
{
  static int PrevPos = 0;

  if (Pos != -1)
    PrevPos = Pos;

  const string Str = ((PrevPos < 0) || (IndicatorName == "")) ? "" : IndicatorName + "[" + (string)BufferIndex + "][" + (string)PrevPos + " - " + (string)Time[PrevPos] +
                                                                     "] = " + (string)iCustom(Symbol(), Period(), IndicatorName, BufferIndex, Pos);
  return(Str);
}

void OnInit( void )
{
  IndicatorName = GetIndicatorName();

  ChartSetInteger(0, CHART_EVENT_MOUSE_MOVE, TRUE);

  if (TimerEvent)
    EventSetMillisecondTimer(PAUSE);

  return;
}

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

  Comment("");

  return;
}

void OnTimer( void )
{
  Comment(GetIndicatorString());

  return;
}

void OnChartEvent( const int id, const long& lparam, const double& dparam, const string& sparam )
{
  if (id == CHARTEVENT_MOUSE_MOVE)
  {
    datetime time;
    double price;
    int SubWindow;

    ChartXYToTimePrice(0, (int)lparam, (int)dparam, SubWindow, time, price);
    const int Pos = iBarShift(Symbol(), Period(), time, TRUE);

    Comment(GetIndicatorString(Pos));
  }

  return;
}

インジケータ バッファ値 (CTRL+D) が iCustom 値と一致しないことに気づきます (これらは Expert Advisor のチャート コメントに表示されます)。

今回のテストでは、iCustomはEMPTY_VALUEかゼロを出力します。

 

確認しました。合わないというより、まったくないんです。かなりイケてますね。

 
comp:

この問題が4つ目のフォーラムで公表されてから7年以上経過しても、開発者は機能を作成していないことから、沈黙が続いています(Googleは覚えています)。

なぜか未だにチャートからインジケーターデータを人間が読み取るということができないんですよねー。お かしいと思うかもしれませんが、そうなんです。

問題は問題文にある。

指標の使い方を間違えているだけです。時間軸を決めてイベントに反応するのではなく、経済的に時系列を作り直すために設計されているんです。

このような場合、反対側からアプローチすることで、経済的な解決策を見出すことができます。

 
バッファの読み取りの問題ではなく、iCustom()を介して呼び出されたインジケータには、タイマーもチャートイベントもないのです。
 
Dmitry Fedoseev:
バッファの読み取りの問題ではなく、iCustom()を介して呼び出されたインジケータには、タイマーもチャートイベントもないのです。

何のために?

まあ、真面目な話、何のために?

 
Andrey Khatimlianskii:

何のために?

まあ、真面目な話、なんで?

必要ないしかし、ここでは誰かがそれを必要としていたことがわかった。
 
Andrey Khatimlianskii:

問題は問題文にある。

インジケーターの使用目的を間違えているに過ぎません。時間に追われ、イベントに反応するのではなく、経済的に時系列を手直しするために設計されています。

反対側からアプローチすれば、経済的で素敵な解決策が見つかるはずです。

そんな発言をするのは、頭をハンマーで殴られたようなものです。kodobaseでインジケータを探すことにしました。私が慣れ親しんでいるイベント駆動型モデル+OOPを採用しているものは、まだ見つかっていません。

この状態に対して、悔しいというか、残念というか、なんとも言えない気持ちです。指標は、原始的に書かなければならないことがわかった。

インジケータでイベントモデル+OOPを使っている人はいるのでしょうか?

それでも、目で見たものをプログラムでグラフにできない、という戸惑いは消えませんね

 
iCustomでExpert Advisorのテストを 書いているとき、解決できないMQLの問題に直面したことがあります。インジケーターのファイル名(コードを参照)と入力パラメータの値を知ること - 問題ありません。しかし、その後、インディケータの入力パラメータをiCustomに挿入することは不可能です。iCustomの呼び方は、どのような指標に対しても普遍的な解決策は、デフォルトの入力パラメータの場合にのみ適しているということです。そうでなければ、コードの中に入っていかなければなりません。この解決策は不便です。インジケータの入力は、適切な文字列フィールドを持つ構造体として渡すことができた。しかし、私たちは省略 形を使い、呼びかけの普遍性を殺してしまったのです。また妙な制約が!?
 
comp:

そういう発言をするのは、頭を蹴られたようなものです。kodobaseでインジケータを探すことにしました。私が慣れ親しんでいるイベント駆動型モデル+OOPを採用しているものは、まだ見つかっていません。

この状態に対して、悔しいというか、残念というか、なんとも言えない気持ちです。指標は、原始的に書かなければならないことがわかった。

インジケータでイベントモデル+OOPを使っている人はいるのでしょうか?

それでも、目で見たものをプログラムでグラフにできない、という戸惑いは消えませんね

なぜ?OnCalculate関数、tickイベントなど、すでに目の前ですべてが盗まれています。OOPを 使いたいなら使えばいい、でも何のためにあるのか、どこに置けばいいのか。