Fehler, Irrtümer, Fragen - Seite 1679

 
fxsaber:
Es wäre gut, sie auch in den Nachkommen privat zu machen. Zum besseren Verständnis. Das ist nicht der Punkt, kurz gesagt.
Sie sollte in Nachkommenschaft aufgerufen werden. )
 
Sergei Vladimirov:
Sie muss in den Nachkommen abgerufen werden. )
Der springende Punkt ist ja gerade, dass Sie das nicht müssen. Siehe mein Beispiel.
 
fxsaber:
Der springende Punkt ist ja gerade, dass Sie das nicht müssen. Siehe mein Beispiel.
Ihr Beispiel ist nur anders, aber der Punkt ist derselbe - der Nachkomme überschreibt eine virtuelle Methode der Basisklasse. Okay, nun, es ist allen klar.
 

Fehler in den Indikatorpuffern

#property indicator_chart_window
#property indicator_buffers 1
#property indicator_plots   1

class BUFFER
{
public:
  double Buffer[];
  
  BUFFER()
  {
    ::SetIndexBuffer(0, this.Buffer);
  }
};

BUFFER* Buf;

void OnInit()
{
  Buf = new BUFFER;
}

void OnDeinit( const int Reason )
{
  delete(Buf);
}

void Restart()
{
  OnDeinit(REASON_PARAMETERS);
  OnInit();
}

#define  PRINT(A) Print(#A + " = " + (string)A);

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[] )
{
  static bool Flag = false;
  
  if (Flag)
    Restart();
  
  Flag = true;
  
  PRINT(ArraySize(Buf.Buffer));
  
  Buf.Buffer[0] = 0; // array out of range
  
  return(rates_total);
}

Ergebnis im Protokoll

2016.09.12 17:21:54.851 Test (RTS-9.16,H1)      array out of range in 'Test.mq5' (56,13)
2016.09.12 17:21:54.851 Test (RTS-9.16,H1)      ArraySize(Buf.Buffer) = 0
2016.09.12 17:21:54.828 Test (RTS-9.16,H1)      ArraySize(Buf.Buffer) = 2067

Der Debugger sagt hartnäckig, dass Buf.Buffer IMMER dynamisches Array[0] ist, I. D.h. ist ein Indikatorpuffer. Aber in einer Größe von Null, wie sich herausstellt.

Es hat sich herausgestellt, dass der Debugger mehr in das Protokoll schreibt als die Freigabe. In der Pressemitteilung werden solche Dinge nicht erwähnt

2016.09.12 17:25:08.706 Test (RTS-9.16,M1)      Indicator buffer #0  detached
Ist es möglich, den Indikatorpuffer in MT5 nur einmal zu setzen?
 

Warum die Komplikationen, wenn es kein Geheimnis ist? Nun, abgesehen vom Interesse an der Forschung natürlich.

Stattdessen (was übrigens prinzipiell falsch ist, weil eine Neuinitialisierung nicht nur beim Start, sondern auch während des Betriebs erforderlich sein kann):

  static bool Flag = false;
  
  if (Flag)
    Restart();
  
  Flag = true;

Einfach so:

if(prev_calculated == 0)
   ArrayInitialize(Buf.Buffer, 0.0);
 
Sergei Vladimirov:

Warum die Komplikationen, wenn es kein Geheimnis ist? Nun, abgesehen vom Interesse an der Forschung natürlich.

Ich habe Fälle, in denen ein dynamisches Array, das als Indikatorpuffer festgelegt ist, gelöscht wird. Dann müssen Sie erneut ein dynamisches Array erstellen und es als Indikatorpuffer zuweisen. Der Debugger zeigt an, dass sie zugewiesen ist. Aber nur seine Größe ist Null. Hier liegt ein Fehler vor.

Das Problem ist alt, wie sich herausstellt.

Forum für Handel, automatisierte Handelssysteme und Strategietests

Ausblenden der Meldung "Indikatorpuffer #x abgetrennt"

Konstantin Ivanov, 2015.02.17 21:18

In meinem Indikator speichere ich Array-Puffer in Instanzen des Objekts.
Beim Löschen eines Objekts in OnDeinit() wird eine Meldung für alle mit Puffern verknüpften Arrays angezeigt (SetIndexBuffer()):

"Indikatorpuffer #x abgetrennt"

Wie kann man ein Array aus einem Puffer lösen, ohne dass diese Meldung erscheint?
Oder wie kann man diese Meldung ausblenden?

Ich habe den Zweig http://forum.mql4.com/63975 gefunden, aber die vorgeschlagene Option, Puffer in einem globalen Kontext zu speichern, funktioniert bei mir nicht.


Die Option, Puffer in einem globalen Kontext zu speichern, funktioniert bei mir ebenfalls nicht. Interessanterweise funktioniert es in MT4.

 

Artikel Eine schrittweise Anleitung zum Schreiben von EAs in MQL5 für Anfänger Es gibt Code:


Ist es nicht notwendig, durch drei Stellen zu teilen?

 
Aleksey Rodionov:

Artikel Eine schrittweise Anleitung zum Schreiben von EAs in MQL5 für Anfänger Es gibt Code:


Ist es nicht notwendig, durch drei Stellen zu teilen?

Dies ist ein Überbleibsel von EURUSD (5-stellig) und USDJPY (3-stellig). Es ist kein Fehler, aber es ist besser, dies nicht zu tun, insbesondere für Anfänger.
 
Ich muss eine einzige Schnittstelle für alle geerbten Klassen definieren. Sie sollte immer die Methode Init haben. Aber Init ist wie ein Konstruktorduplikat, so dass Varianten von Eingabeparametern nicht im Voraus definiert werden können. Wie kann man eine solche Schnittstelle angeben?
 
MK, warum nicht die folgende Syntax für importierte Funktionen akzeptabel machen:
#import ...
 int send(SOCKET s, void &buf[], int len, int flags);
 int send(SOCKET s, void &buf, int len, int flags);
#import

Jetzt müssen wir hässliche Dinge machen:

#import ...
 int send(SOCKET s, char &buf[], int len, int flags);
 int send(SOCKET s, int &buf, int len, int flags);
 int send(SOCKET s, char &buf, int len, int flags);
 int send(SOCKET s, Cpoint &buf[], int len, int flags);
 ...
#import

Ich empfehle es nicht für interne Inline-Funktionen, aber für importierte Funktionen sollte es sicher sein.