Fehler, Irrtümer, Fragen - Seite 452

 

Ich danke Ihnen!

 
alexvd:

Ja, in Bezug auf den ersten Punkt bin ich eindeutig verwirrt. Erklären Sie, was genau an der Beschreibung falsch ist, so dass eine Kopie zurückgeschickt werden sollte?

Und was die Verkettung betrifft, so hätten Sie in Ihrem Fall etwas schreiben müssen wie

Zur Klarstellung. Es heißt: "Gibt eine Kopie der Zeichenkette mit einem geänderten Wert des Zeichens an der angegebenen Position zurück. "Der Funktionsprototyp ist boolStringSetCharacter(...). Offensichtlich kann man eine Zeichenkette nicht in ein bool einfügen. Wenn tatsächlich ein Boolescher Wert zurückgegeben wird, dann ist dies offensichtlich ein Zeichen für Erfolg/Fehler. Normalerweise haben andere Dokumentationsseiten einen separaten Abschnitt für den Rückgabewert, aber diese Seite hat keinen. Sie sollte hinzugefügt werden, und in der textlichen Beschreibung sollte ein Satz formuliert werden, der sich auf die Semantik der Funktion und nicht auf den Rückgabewert bezieht.


Wenn das, was Sie geschrieben haben, richtig ist, sollte auch die Beschreibung der Funktion StringConcatenate geändert werden. Die Beschreibung besagt, dass der Parameterstring_var ein[in][out] String ist, der als Ergebnis der Verkettung erzeugt wird. Sie geben an, dass dieser Parameter nur [out] ist.

 
Neue Frage. Was bedeutet es, wenn BarsCalculated 0 zurückgibt. Es scheint kein Fehler zu sein, aber wie können 0 Balken berechnet werden? In der Tat wurde nichts gezählt. Ist das nicht ein Irrtum?
 
MoneyJinn:

Leider besteht das Problem darin, dass das Terminal nur Aufträge zur Schließung von Positionen mit Kommentaren auf der Registerkarte "Ergebnisse" veröffentlicht.

Die entsprechende Bestellung wird nicht in die Liste von HistoryDealsTotal() aufgenommen.

In der allgemeinen Liste der Aufträge HistoryOrdersTotal() fehlt der Auftrag auch dann, wenn Sie einen Zeitraum mit einer gewissen Redundanz auswählen.

Ich kann Ihnen versichern, dass sowohl die Aufträge als auch die Geschäfte, wenn sie bis zum "Ende des Tests" abgeschlossen werden, in der Historie vorhanden sind. Meine Multiwährung berechnet den Gewinn, der mit jedem Symbol erzielt wird. Geschäfte, die im Tester bis zum "Testende" geschlossen wurden, werden bei der Deinitialisierung korrigiert, um diese Geschäfte zu berücksichtigen. Der Gesamtgewinn für alle Symbole stimmt mit den Daten aus dem Testbericht überein. Dies ist der Code;

       if(HistorySelect(0,TimeTradeServer()))   // Поправка для 'end of test'
        {
         int DeelsTotal=HistoryDealsTotal();
         for(int i=0;i<SymbolsNumber;i++)
           {
            ulong ticket=HistoryDealGetTicket(DeelsTotal-1-i);
            string comment=HistoryDealGetString(ticket,DEAL_COMMENT);
            if(comment!="end of test"&&StringSubstr(comment,0,3)!="so ")
               break;
            for(int j=0;j<SymbolsNumber;j++)
              {
               if(HistoryDealGetString(ticket,DEAL_SYMBOL)!=m_expert[j].Name())
                continue;
               m_Profit[j]=m_Profit[j]+HistoryDealGetDouble(ticket,DEAL_PROFIT)+  // Добавим профит закрытой позиции для "end of test" и "so"
                           HistoryDealGetDouble(ticket,DEAL_SWAP)+HistoryDealGetDouble(ticket,DEAL_COMMISSION);
              }
           }
        }
 

Liebe Kollegen, gibt es eine Möglichkeit, SymbolInfoSessionTrade im Strategietester zum Laufen zu bringen?

Ein trivialer Eintrag funktioniert nicht:

void OnTick() {
  datetime from, to;
  if (SymbolInfoSessionTrade(_Symbol, FRIDAY, 0, from, to)) Print("WOW!");
}
Документация по MQL5: Получение рыночной информации / SymbolInfoSessionQuote
Документация по MQL5: Получение рыночной информации / SymbolInfoSessionQuote
  • www.mql5.com
Получение рыночной информации / SymbolInfoSessionQuote - Документация по MQL5
 

Eine weitere Frage, wenn möglich. Ich würde gerne die Bedeutung des neuen Betreibers verstehen. Was ist die Idee dahinter? Warum erstellen Sie das Objekt nicht auf die übliche Weise? Schließlich geht nach dem Ende des Blocks der Zugriff auf das durch new deklarierte Objekt verloren, wozu brauchen wir es also?

P.S. Ich konnte es ehrlich gesagt nicht in der Dokumentation finden :)

Документация по MQL5: Основы языка / Операторы / Оператор создания объекта new
Документация по MQL5: Основы языка / Операторы / Оператор создания объекта new
  • www.mql5.com
Основы языка / Операторы / Оператор создания объекта new - Документация по MQL5
 
220Volt:

Eine weitere Frage, wenn möglich. Ich würde gerne die Bedeutung des neuen Betreibers verstehen. Was ist die Idee dahinter? Warum erstellen Sie das Objekt nicht auf die übliche Weise? Schließlich geht nach dem Ende des Blocks der Zugriff auf das durch new deklarierte Objekt verloren, wozu brauchen wir es also?

Alles geht irgendwann einmal vorbei. Bedeutet das, dass nichts getan werden muss...?


P.S. Ehrlich gesagt, konnte ich es in der Dokumentation nicht finden :)

Ich glaube dir... :))
 
Valmars:

Ich danke Ihnen! Ich habe es herausgefunden. Es ist notwendig und ausreichend,TimeTradeServer() anstelle von TimeCurrent() zu verwenden.

Am Ende der Handelswoche gibt es keine neuen Kurse und deshalb wird TimeCurrent() lange Zeit nicht aktualisiert.

Beim Deinitialisieren des Expert Advisors zeigt TimeCurrent() die Zeit 23:00 an; TimeTradeServer() zeigt die Zeit 23:59 an, was mit dem Ende des Tests übereinstimmt.

 
MoneyJinn:

Ich danke Ihnen! Ich habe es herausgefunden. Es ist notwendig und ausreichend,TimeTradeServer() anstelle von TimeCurrent() zu verwenden.

Am Ende der Handelswoche gibt es keine neuen Kurse und daher wird TimeCurrent() lange Zeit nicht aktualisiert.

Der Punkt liegt nicht in den Anführungszeichen, sondern darin, dass "End of Test"-Geschäfte nach Ablauf der Testphase durchgeführt werden. Daher können weder 'OnTick' noch 'OnTimer' sie aus der Historie abrufen. Zumindest war das vor einem Jahr so, also habe ich ihre Überprüfung auf 'OnDeinit' verschoben.
 
220Volt:

Eine weitere Frage, wenn möglich. Ich würde gerne die Bedeutung des neuen Betreibers verstehen. Was ist die Idee dahinter? Warum erstellen Sie das Objekt nicht auf die übliche Weise? Schließlich geht nach dem Ende des Blocks der Zugriff auf das mit new deklarierte Objekt verloren, warum brauchen wir es also überhaupt?

P.S ehrlich gesagt konnte ich es in der Dokumentation nicht finden :)

Erstellen Sie keine dynamischen Objekte - Sie müssen dann nicht mehr alles verwenden, was mit diesen Objekten verbunden ist (obwohl Sie dann nicht mehr viel tun können).

Sie wollen nicht die Bedeutung des Jetzt verstehen, sondern die Bedeutung der Arbeit mit dynamischen Objekten...

Initialisierung und Deinitialisierung von dynamisch platzierten Objekten

Zeiger auf Objekte sindein Sonderfall, da die Deklaration eines Zeigers keine Initialisierung des betreffenden Objekts erfordert. Dynamisch platzierte Objekte werden nur in dem Moment initialisiert, in dem eine Instanz einer Klasse mit dem new-Operator erzeugt wird. Die Initialisierung eines Objekts impliziert einen Aufruf des Konstruktors der entsprechenden Klasse. Wenn es keinen entsprechenden Konstruktor in einer Klasse gibt, werden die Mitglieder des einfachen Typs nicht automatisch initialisiert; die Mitglieder der Typen String, dynamisches Array und komplexes Objekt werden automatisch initialisiert.

Zeiger können lokal oder global deklariert und mit einem leeren NULL-Wert oder mit einem Zeiger desselben oder eines gespawnten Typs initialisiert werden. Wirdnewfür einen Zeiger aufgerufen, der auf lokaler Ebene deklariert wurde ,muss diedelete-Anweisungfür diesen Zeiger ausgeführt werden, bevor er die lokale Ebene verlässt. Andernfalls geht der Zeiger verloren und das Objekt kann nicht explizit gelöscht werden.

Alle durch den Ausdruck pointer_object=new_ClassNameerzeugten Objekte müssen anschließend durch den Operator delete(pointer_object) zerstört werden.Wenn diese Variable aus irgendeinem Grund nicht durch den Löschoperator zerstört wurde, erscheint die entsprechende Meldung im Expertenjournal. Sie können mehrere Variablen deklarieren und allen von ihnen Zeiger auf das gleiche Objekt zuweisen.

Wenn das Objekt, das dynamisch erstellt wird, einen Konstruktor hat, wird dieser Konstruktor aufgerufen, wenn der Operator newausgeführt wird . Wenn das Objekt einen Destruktor hat, wird dieser aufgerufen, wenn derLöschoperator ausgeführt wird.

So werden dynamisch platzierte Objekte nur erstellt, wenn sie mit dem new-Operatorerstellt werden , und sie werden garantiert entweder durch den delete-Operator oder automatisch durch das ausführende System von MQL5 im Moment des Entladens des Programms gelöscht .Die Reihenfolge der Deklaration der Zeiger von dynamisch erstellten Objekten hat keinen Einfluss auf die Reihenfolge ihrer Initialisierung. Die Reihenfolge der Initialisierung und Deinitialisierung wird vollständig vom Programmierer kontrolliert.