Fehler, Irrtümer, Fragen - Seite 2708

 

Ich schlage vor, die automatische Validierung von Produkten auf dem Marktplatz zu präzisieren. Zusätzlich zu den allgemeinen Fehlern, die vom Validator gemeldet werden, werden der Kontext des durchgeführten Tests und die Protokolle dringend benötigt. Insbesondere konnte ich einen Indikator seit einigen Jahren nicht mehr aktualisieren, weil der Fehler "Tester braucht zu viel Zeit" auftrat. Die erste Version wurde unter "menschlicher" Moderation hochgeladen und es gab keine Beschwerden. Es ist völlig unklar, nach welchen Kriterien der Autovalidator diesen Fehler feststellt.

Hier eine konkrete Frage: Wie viele Ticks in welcher Zeitspanne sollte das Produkt auf welcher Hardware bereitstellen, damit die Meldung "Tester braucht zu lange" nicht erscheint?

Der Indikator ist für die Verarbeitung von Ticks durch den MapReduce-Algorithmus vorgesehen, es werden ganzzahlige Berechnungen verwendet, es gibt also nichts zu komprimieren, es sei denn, man wirft den Algorithmus selbst weg. Der Profiler wurde verwendet, ein Trotlining wurde hinzugefügt, um die Reihe der neuen Ticks mit einer bestimmten Periode neu zu berechnen. Vergeblich.

Auf meinem Computer wird das Jahr in ein paar Minuten getestet. Was tatsächlich im Autovalidator vor sich geht und warum er langsamer wird, kann man im Moment nicht wissen.

Das Fehlen einer angemessenen Produktunterstützung ist sowohl für die Benutzer als auch für MQ ein Problem - es beeinträchtigt die Implementierung.

 

Ist das so gewollt?

class cA
  {
public:
   int               Add(int i1,int i2)
     {
      return i1+i2;
     };
                     cA()
     {
      Print("+++");
     };
                    ~cA()
     {
      Print("---");
     };
  };

void OnStart()
  {
   cA a=cA();
  }

Protokoll:

2020.04.17 18:39:32.996 test3 (EURUSD,M1)       +++
2020.04.17 18:39:32.996 test3 (EURUSD,M1)       +++
2020.04.17 18:39:32.996 test3 (EURUSD,M1)       ---
2020.04.17 18:39:32.996 test3 (EURUSD,M1)       ---

Doppelter Konstruktor- und Destruktoraufruf, als ob zwei Objekte erstellt und gelöscht werden. Bei der Verwendung von Neu und Löschen ist alles in Ordnung.

Build 2380.

 
Aliaksandr Hryshyn:

als ob zwei Objekte erstellt und gelöscht werden würden.

So ist das nun mal.

 
fxsaber:

Das ist es.

Und mein Objekt wird als zweites erstellt:

class cA
  {
public:
   int               my_i;
   int               Add(int i1,int i2)
     {
      return i1+i2;
     };
                     cA()
     {
      static int i=0;
      my_i=i;
      i++;
      Print("+++");
     };
                    ~cA()
     {
      Print("---");
     };
  };

void OnStart()
  {
   cA a=cA();
   Print(a.my_i);
  }
2020.04.17 18:47:34.771 test3 (EURUSD,M1)       +++
2020.04.17 18:47:34.771 test3 (EURUSD,M1)       +++
2020.04.17 18:47:34.771 test3 (EURUSD,M1)       ---
2020.04.17 18:47:34.771 test3 (EURUSD,M1)       1
2020.04.17 18:47:34.771 test3 (EURUSD,M1)       ---
 
Aliaksandr Hryshyn:

Und mein Objekt wird als zweites erstellt:

Erstes Objekt.

cA a=cA();


Zweites Objekt.

cA a=cA();
 

Dann sollte das auch so sein:

cA a;
Print(a.my_i);
 
Stanislav Korotky:

Auf meinem Computer wird ein Jahr in ein paar Minuten getestet. Was tatsächlich im Autovalidator vor sich geht und warum er langsamer wird, kann man im Moment nicht wissen.

Ein Jahr in ein paar Minuten ist eine Menge. Kaum jemand hätte gewartet (wenn es ein EA gewesen wäre).
Zeichnet es visuell normal? Ist es möglich, etwas zu verstehen, indem man den Prüfer beobachtet?

Fügen Sie einen Hinweis auf den Markt hinzu - Beschleunigung der Berechnungen auf Kosten der Genauigkeit (wenn möglich) oder Zeichnen von "etwas Ähnlichem". Das Produkt ist eindeutig spezifisch, und jeder, der es braucht, kann den richtigen Parameter wählen.

 
Andrey Khatimlianskii:

Ein Jahr in ein paar Minuten ist eine Menge. Kaum jemand hätte gewartet (wenn es ein EA gewesen wäre).
Ist die Zeichnung visuell in Ordnung? Ist es möglich, etwas zu verstehen, indem man den Prüfer beobachtet?

Fügen Sie einen Stummel für den Marktplatz hinzu - beschleunigen Sie die Berechnungen auf Kosten der Genauigkeit (wenn möglich), oder zeichnen Sie "etwas Ähnliches" insgesamt. Das Produkt ist eindeutig spezifisch, und jeder, der es braucht, kann den richtigen Parameter wählen.

Meiner Meinung nach ist ein Jahr in ein paar Minuten im potischen Modus in Ordnung. Früher gab es bei Meisterschaften ein Limit von 15-20 Minuten (ich weiß es nicht mehr genau). Ein Stall wurde bereits hinzugefügt (Zeitraffer Trabrennen). Sie können die Zecken auslassen, aber dann geht der Sinn des Produkts verloren. Spezifität ist ein relativer Begriff: Ich weiß, dass viele im Tickermodus arbeiten (und sie haben alle ein Add-on mit Preis- und/oder Volumenprüfung). Und umso wichtiger ist es, genauere Kriterien zu haben, plus Feedback vom Autovalidator (wenn wir im Forum sagen "Ihr Terminal funktioniert nicht", wir MQ, was fragen wir dann? - Geben Sie Protokolle und Bedingungen für die Reproduktion an; hier erhalten wir eine Meldung, dass unser Produkt nicht funktioniert, aber keine Einzelheiten). Und es ist richtiger, die Besonderheiten des Produkts zu berücksichtigen. Schließlich besteht die Gesamtlaufzeit des Produkts nicht nur aus der Zeit des MQL-Codes, sondern auch aus dem Terminal selbst. Es gibt teurere Aufrufe wie CopyTicksRange. Diese Gemeinkosten werden nun als Fehler im MQL-Produkt berücksichtigt.

PS. Bei den Indikatoren scheint nicht der Tickbetrieb kritischer zu sein, sondern die Anzahl der Puffer (von denen es aufgrund der Besonderheiten der Aufgabe viele gibt). Ich werde mich bemühen, die Anzahl dieser Fahnen für den Prüfer zu begrenzen (sie machen das Produkt komplizierter und fehleranfälliger, ebenso wie andere Fahnen, die durch äußere Bedingungen auferlegt werden, wie z. B. Trabrennen). Dies beweist einmal mehr die Notwendigkeit, dass der Autovalidator die Leistungsbewertung anhand mehrerer Parameter variieren muss.

PPS. Ich fordere Zecken für den letzten Tag an, und der Prüfer lädt sie für 2 Jahre auf - und auch das braucht Zeit.

 
Stanislav Korotky:

PPS. Ich fordere Zecken für den letzten Tag an, und der Prüfer lädt sie für 2 Jahre

Aus irgendeinem Grund ist dieses Verhalten offiziell.

Ich nehme an, dass sie für Expert Advisors, die keine Indikatoren oder Adressbalken usw. verwenden, überhaupt keine Balken erzeugen sollten.

Zum Beispiel, wenn es nur SymbolInfoTick gibt - keine Balken erzeugen, keine Historie für Copyticks speichern.


Diese Barophilie ist für ein seriöses Algotrading-Tool wie Tester überhaupt nicht nachvollziehbar. Aber da selbst MO-Ästheten immer wieder an diesem Kaktus knabbern, gibt es wahrscheinlich kein Verständnis.

 

Warum kann ich in MQL den geschützten Konstruktor nicht von meiner Fabrikmethode aus aufrufen?

class A1
{
  protected:
    A1(const bool x = false){}
  public:  
    static A1 *creator()
    {
      return new A1(true);
    }
};

void OnStart()
{
  A1 *a = A1::creator();
}

Der Code gibt einen Kompilierungsfehler "'A1::A1' - cannot access protected member function", und gibt die Zeile an, in der die Klassenbeschreibung beginnt, nicht die, in der der Konstruktor aufgerufen wird (d. h. ich muss manuell nach dem Problem suchen).

Aber der Punkt ist, dass es überhaupt keinen Fehler geben sollte. C++ lässt sich ohne Probleme kompilieren.

Grund der Beschwerde: