Auslesen von Indikatorpuffern, die auf Diagramm eingestellt sind - Seite 3

 
comp:

Thema:

Buchstabiere es richtig und du wirst glücklich sein.
 
Dmitry Fedoseev:
Und?

Starten Sie den Indikator, dann - den 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;
}

Sie stellen fest, dass die Pufferwerte des Indikators (CTRL+D) nicht mit den iCustom-Werten übereinstimmen (sie werden im Chart-Kommentar des Expert Advisors ausgedruckt).

Im Falle unseres Tests liefert iCustom entweder EMPTY_VALUE oder Null.

 

Geprüft. Es ist nicht so, dass es nicht passt, es ist überhaupt nicht da. Ziemlich cool.

 
comp:

Nach dem Schweigen zu urteilen, mehr als sieben Jahre seit dieses Problem öffentlich im vierten Forum (google erinnert sich) angekündigt wurde, haben die Entwickler nicht eine Funktionalität erstellt.

Aus irgendeinem Grund können sie immer noch nicht die Indikatordaten aus dem Diagramm auslesen! Es klingt verrückt, ist aber so.

Das Problem liegt in der Aufgabenstellung.

Sie setzen die Indikatoren nur für den falschen Zweck ein. Sie sind nicht darauf ausgelegt, zeitgesteuert zu sein und auf Ereignisse zu reagieren, sondern darauf, Zeitreihen wirtschaftlich zu bearbeiten.

Nähern Sie sich Ihrer Aufgabe von der anderen Seite und Sie werden eine schöne und wirtschaftliche Lösung finden.

 
Es geht nicht um das Lesen von Puffern, sondern um die Tatsache, dass der über iCustom() aufgerufene Indikator keinen Timer und keine Chart-Ereignisse hat.
 
Dmitry Fedoseev:
Es geht nicht um das Lesen von Puffern, sondern um die Tatsache, dass der über iCustom() aufgerufene Indikator keinen Timer und keine Chart-Ereignisse hat.

Wozu sind sie da?

Nun, ernsthaft, wozu?

 
Andrey Khatimlianskii:

Wozu sind sie da?

Nun, ernsthaft, warum?

Ich brauche es nicht. Aber hier brauchte sie jemand, wie sich herausstellte.
 
Andrey Khatimlianskii:

Das Problem liegt in der Aufgabenstellung.

Sie verwenden die Indikatoren einfach für den falschen Zweck. Sie sind nicht darauf ausgelegt, zeitgesteuert zu sein und auf Ereignisse zu reagieren, sondern darauf, Zeitreihen wirtschaftlich zu überarbeiten.

Nähern Sie sich Ihrer Aufgabe von der anderen Seite und Sie werden eine schöne und wirtschaftliche Lösung finden.

Es ist wie ein Hammer auf den Kopf, eine solche Aussage zu treffen. Ich beschloss, in kodobase nach Indikatoren zu suchen. Ich habe KEINE gefunden, die das verwendet, was ich gewohnt bin: ereignisgesteuertes Modell + OOP.

Es ist schwer zu sagen, was größer ist: die Frustration oder die Enttäuschung über diesen Stand der Dinge. Es hat sich herausgestellt, dass Indikatoren primitiv geschrieben werden MÜSSEN.

Verwendet jemand das Ereignismodell + OOP in Indikatoren?

Das ändert aber nichts an der Tatsache, dass man das, was man mit den Augen sieht, nicht programmatisch auf einer Karte ablesen kann!

 
Beim Schreiben eines Test Expert Advisors mit iCustom, habe ich ein unlösbares MQL-Problem konfrontiert. Den Dateinamen (siehe den Code) des Indikators und die Werte der Eingabeparameter zu kennen - kein Problem. Danach ist es jedoch nicht mehr möglich, die Eingabeparameter des Indikators in iCustom einzufügen. Die Art und Weise, wie iCustom aufgerufen wird, ist, dass eine universelle Lösung für jeden Indikator nur im Falle der Standard-Eingabeparameter geeignet ist. Ansonsten müssen wir in den Code gehen. Diese Lösung ist nicht bequem. Wir könnten die Indikatoreingaben als Struktur mit den entsprechenden String-Feldern übergeben. Aber wir haben die Ellipse verwendet, was die Universalität des Aufrufs zunichte macht. Eine weitere seltsame Einschränkung!
 
comp:

Es ist wie ein Tritt in den Kopf, eine solche Aussage zu machen. Ich beschloss, in kodobase nach Indikatoren zu suchen. Ich habe KEINE gefunden, die das verwendet, was ich gewohnt bin: ereignisgesteuertes Modell + OOP.

Es ist schwer zu sagen, was größer ist: die Frustration oder die Enttäuschung über diesen Stand der Dinge. Es hat sich herausgestellt, dass Indikatoren primitiv geschrieben werden MÜSSEN.

Verwendet jemand das Ereignismodell + OOP in Indikatoren?

Das ändert aber nichts an der Tatsache, dass man das, was man mit den Augen sieht, nicht programmatisch auf einer Karte ablesen kann!

Und warum? Alles wurde dort bereits vor uns gestohlen, es gibt die Funktion OnCalculate - Tick Event. Wenn Sie OOP verwenden wollen - verwenden Sie es, aber wozu ist es da, wo soll es hin?
Grund der Beschwerde: