Fehler, Irrtümer, Fragen - Seite 712

 
Hallo,

Vielen Dank für Ihre Antwort, sie hilft, das Deklarationsproblem zu lösen.

Übrigens habe ich vielleicht einen Fehler gefunden, der mit der Fehlersuche zusammenhängt:

Wenn Sie beim Debuggen eines Indikators im Haltepunktmodus sind, drücken Sie in MetaTrader auf Indikatorliste.
Die Anwendung friert ein und wird nur durch den Task-Manager beendet (kill)


Bitte beachten Sie dies.
 
speedy:


Bitte beachten Sie dies.
Zur Kenntnis genommen, danke.
 

Die Funktion OnTimer() im Strategietester verlangsamt die Ausführung ziemlich stark, wenn sie jede Sekunde angefordert wird. void OnInit() { EventKillTimer(); EventSetTimer(1); } void OnTimer() { } Expert Advisor mit zwei externen Indikatoren, die alle Ticks durchlaufen, läuft 2012.04.11 14:32:07 Core 1 EURUSD,H1: 8083516 Ticks (4557 Bars) generiert innerhalb von 70418 ms (Gesamtbars in der Historie 6270, Gesamtzeit 70528 ms) Wenn OnTimer() kommentiert wird, wird die Ausführung deutlich beschleunigt 2012.04.11 14:36:22 Core 1 EURUSD,H1: 8083516 Ticks (4557 Balken) generiert innerhalb von 22730 ms (Gesamtbalken in der Historie 6270, Gesamtzeit 22870 ms) Sind diese Verzögerungen durch den Tester verursacht, oder können wir es irgendwie beschleunigen?

P.S. Eine Vorschau der Nachricht wäre sinnvoll gewesen(

 
sion:

Die Funktion OnTimer() im Strategietester verlangsamt die Ausführung ziemlich stark, wenn sie jede Sekunde angefordert wird. void OnInit() { EventKillTimer(); EventSetTimer(1); } void OnTimer() { } Expert Advisor mit zwei externen Indikatoren, die alle Ticks durchlaufen, läuft 2012.04.11 14:32:07 Core 1 EURUSD,H1: 8083516 Ticks (4557 Bars) generiert innerhalb von 70418 ms (Gesamtbars in der Historie 6270, Gesamtzeit 70528 ms) Wenn OnTimer() kommentiert wird, wird die Ausführung deutlich beschleunigt 2012.04.11 14:36:22 Core 1 EURUSD,H1: 8083516 Ticks (4557 Balken) generiert innerhalb von 22730 ms (Gesamtbalken in der Historie 6270, Gesamtzeit 22870 ms) Sind diese Verzögerungen durch den Tester verursacht, oder können wir es irgendwie beschleunigen?

P.S. Eine Vorschau der Nachricht wäre sinnvoll gewesen(

Es ist besser, den Code über die Schaltfläche "SRC" im Editorbereich einzufügen.
 
papaklass:

Was bedeutet dieser Eintrag im Testgerät?

Es handelt sich um eine Systemmeldung über das Paging der Historie.
 

Nicht lustig.

struct Test
  {
   double      data[];
   int         size;
   void        Init(int Size) {size=Size; ArrayResize(data,fmin(size,Max));}
   double &operator[] (int i) {return &data[i];} // ERROR :  '&' - reference cannot be used

private:
   static int  Max;
  };
//+------------------------------------------------------------------+

int Test::Max=1024;
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
  {
   Test t;  
   t.Init(16);
   for(int i=0;i<t.size;i++)
     {
      t[i]=i*i; // ERROR :'=' - l-value required
     }
  }

Ich verstehe irgendwie, dass Links im allgemeinen Fall in mql5 nicht von Funktionen zurückgegeben werden (übrigens, warum nicht?), aber dann ist es notwendig, etwas zu tun, um l-Wert-Indexer möglich zu machen. Zum Beispiel, um eine Syntax-Ausnahme von der allgemeinen Regel für Linkshänder-Indexer zu machen. Oder ein bestimmtes Schlüsselwort.

Die Lahmheit lässt mql5.... natürlich nicht gut aussehen.

 
MetaDriver:

Limp lässt mql5.... eindeutig nicht gut aussehen

Beleidigen Sie mql5 nicht, es ist immer noch "winzig", aber es reift sehr schnell von Build zu Build.
 
MetaDriver:

Die Lahmheit lässt mql5.... eindeutig nicht gut aussehen

Dafür müssen Sie vollwertige Links aufbauen :)

ZS: Es ist undicht :)

 

Wanze?


Der folgende Code erzeugt im Compiler eine Art Endlosschleife. Klicken Sie auf Abbrechen

funktioniert nicht sofort, aber wenn es funktioniert, gewinnt es die Kontrolle über den Editor zurück.

Die Schaltfläche Abbrechen selbst verschwindet nicht, aber sie ist auch nicht zugänglich.

Die Schaltfläche "Kompilieren" ist für immer verloren (Sie müssen den Editor neu laden, um sie wieder zu erhalten)


#include <Object.mqh>.

Klasse B;

Klasse A: B {
void a();
};

Klasse B: A {

CObject* a;
void b();
};
 
MetaDriver:

Nicht lustig.

Wie ich zu verstehen, dass Links im allgemeinen Fall in mql5-Funktionen nicht zurückkehren (übrigens, warum können sie nicht?), aber ich sollte etwas tun, um l-Wert-Indexer stattdessen möglich zu machen, z.B. eine Syntax-Ausnahme von der allgemeinen Regel für Lefty-Indexer machen. Oder ein bestimmtes Schlüsselwort.

Die Lahmheit lässt mql5.... eindeutig nicht gut aussehen.

Das "Weitergeben" von internen Nicht-Basisklassenelementen nach außen (und in diesem Beispiel nicht das Attribut selbst, sondern nur ein Array-Element!), insbesondere mit der Möglichkeit, seinen Wert zu ändern, ist nicht sicher.

Außerdem widerspricht es dem "Geist" der objektorientierten Programmierung: alle Arbeiten mit Objektdaten sollten innerhalb des Objekts, durch seine eigenen Methoden, durchgeführt werden...


Wie wäre es, wenn Sie einfach Setter für das Datenattribut verwenden?

Der Code würde an Lesbarkeit gewinnen. Letztendlich wird diese "Einfachheit" mit dem l-Wert-Indexer dazu führen, dass niemand mehr versteht, wie dieser Code funktioniert...

Sie werden mehr Zeit damit verbringen, nach Fehlern zu suchen, als Setter zu schreiben.

Hier ist ein Beispiel:

Wenn Sie Code wie while ((double)date[++i -1] < 10) durch etwas Längeres, aber Verdauliches ersetzen können, sollten Sie das besser auf diese Weise tun...

struct Test

{

double data[];

int Größe;

void Init(int Size) {size=Size; ArrayResize(data,fmin(size,Max));}

void setDataElement (int index, double value)

{

data[index] = Wert;

}


privat:

static int Max;

};

//+------------------------------------------------------------------+


int Test::Max=1024;

//+------------------------------------------------------------------+

//| Skriptprogramm-Startfunktion |

//+------------------------------------------------------------------+

void OnStart()

{

Test t;

t.Init(16);

for(int i=0;i<t.size;i++)

{

//t[i]=i*i; // ERROR :'=' - l-Wert erforderlich

t.setDataElement(i, i*i);

}

}