Fehler, Irrtümer, Fragen - Seite 1661

 

Ist es ein Fehler oder eine Frage, aber etwas Unverständliches ...geschieht im Tester und im Debugger... Beim EURUSD ist alles in Ordnung, aber beim USDJPY gibt es ein Problem...

Teil des Codes

void funArrPositionTicket(ulong & arrBuy[], int & buySize, ulong & arrSell[], int & sellSize)
{
 double bp, sp;
  buyProfit = 0; sellProfit = 0; buyVolume = 0; sellVolume = 0;
   int i, total = PositionsTotal();
    for(i = 0; i < total; i++)
     {
      if(PositionGetTicket(i) > 0 && PositionGetString(POSITION_SYMBOL) == _Symbol)
       {
        if(PositionGetInteger(POSITION_TYPE) == POSITION_TYPE_BUY)
         {
          buySize = ArraySize(arrBuy);
           ArrayResize(arrBuy, buySize+1);
            arrBuy[buySize] = (int)PositionGetInteger(POSITION_TICKET);
           buyProfit += PositionGetDouble(POSITION_PROFIT);
          buyVolume += PositionGetDouble(POSITION_VOLUME);
         }
        if(PositionGetInteger(POSITION_TYPE) == POSITION_TYPE_SELL)
         {
          sellSize = ArraySize(arrSell);
           ArrayResize(arrSell, sellSize+1);
            arrSell[sellSize] = (int)PositionGetInteger(POSITION_TICKET);
           sp = PositionGetDouble(POSITION_PROFIT);
           sellProfit += sp;
          sellVolume += PositionGetDouble(POSITION_VOLUME);
         }
       }
     }
}/*******************************************************************/

Was mich an dem Code interessiert, geht aus den Screenshots hervor... Sie ist im Code gekennzeichnet.

Es gibt EINE Verkaufsorder mit einem Verlust von 7,39, aber der Code zeigt einen Verlust von nur 0,93


Der grüne Pfeil in der folgenden Abbildung zeigt, dass das Debugging in dieser Zeile angehalten wurde...



Das heißt, die Variable sl wurde bereits auf PositionGetDouble(POSITION_PROFIT) gesetzt.


FRAGE: Warum ist das so? Handelt es sich dabei um einen Fehler oder ein Muster, eine spezielle Funktion des mql5-Testers/Debuggers???

Die Variable sp wurde etwas später eingeführt, zunächst wurde die Variable sellProfit geprüft, die bei Eingabe der Funktion auf Null gesetzt wurde.

 
Alexey Viktorov:

Ob es ein Fehler oder eine Frage ist, aber etwas ist unklar... passiert im Tester und im Debugger... Beim EURUSD ist alles in Ordnung, aber beim USDJPY gibt es ein Problem...

Ein Dutzend Jahre zuvor gab es ein Problem bei der Erstellung, als der Visualizer die Zukunft um einen Tick anzeigte, während MQL normal funktionierte - die Zukunft wurde nicht gesehen.

Versuchen Sie, PositionGetDouble(POSITION_PROFIT) beim nächsten Tick zu vergleichen. Wenn es mit dem übereinstimmt, was der Visualizer zuvor angezeigt hat, liegt das Problem vor. Slawa gab eine Erklärung ab und versprach, den Fehler zu korrigieren.

Wenn nicht - ein weiterer Fehler in diesem Fall.

 
fxsaber:

Auf einem Build, der ein oder zwei Dutzend Jahre älter war als der aktuelle, gab es ein Problem, als der Visualizer die Zukunft auf einem Tick anzeigte, während MQL gut funktionierte - die Zukunft wurde nicht gesehen.

Versuchen Sie, PositionGetDouble(POSITION_PROFIT) beim nächsten Tick zu vergleichen. Wenn es mit dem übereinstimmt, was der Visualizer zuvor angezeigt hat, liegt das Problem vor. Slawa gab eine Erklärung ab und versprach, den Fehler zu korrigieren.

Wenn nicht - ein weiterer Fehler in diesem Fall.

Das mag sein, aber der Code sieht keine Überprüfung beim nächsten Tick vor. Nur einmal bei der Eröffnung einer neuen Bar. Und welche Garantie gibt es, dass diese Werte vom nächsten Tick stammen? Keine... Ich habe es erneut versucht; der Verlust beträgt 2,55, aber der Debugger zeigt immer noch 0,93 an.

Aber, Daumen drücken... Tester 5 ist viel besser als Tester 4... Nur Pannen und unzureichende Bedienung... Wie kann man einen Expert Advisor mit solchen Fehlern debuggen? Wie kann man sonst noch optimieren? In der Tat ist Optimierung Selbstbetrug, und bei solchen Spielereien ist es Selbstbetrug bis zum Grad der Lüge 8.

Ich muss es mit einer Demo testen... seit Wochen...

 

Nur weil der Visualisierer Unsinn anzeigt, bedeutet das nicht, dass das Prüfgerät selbst falsch ist. Der Prüfer kümmert sich nicht um Visualisierungsprobleme, überhaupt nicht.

Verwenden Sie TickValue zur Berechnung der Gewinngröße und vergleichen Sie diese mit POSITION_PROFIT. Sie werden sehen, dass alles gleich ist. Die Visualisierung scheint ein Fehler zu sein.

 
fxsaber:

Nur weil der Visualisierer Unsinn anzeigt, bedeutet das nicht, dass das Prüfgerät selbst falsch ist. Der Prüfer kümmert sich nicht um Visualisierungsprobleme, überhaupt nicht.

Verwenden Sie TickValue zur Berechnung der Gewinngröße und vergleichen Sie diese mit POSITION_PROFIT. Sie werden sehen, dass alles gleich ist. Die Visualisierung scheint ein Fehler zu sein.

Ja, ich habe es neu berechnet, bevor ich die Frage gestellt habe. Scheint zu stimmen, Sie können anhand von Screenshots neu berechnen. Ich habe nicht ohne Grund mit der Überprüfung begonnen. Der Verlust wird auf der Grundlage der Losgröße berechnet, die zum erwarteten Gewinn beim Schließen des Take-Profits führt. Beim EURUSD wurde alles korrekt berechnet, aber beim USDJPY sind die Verluste plötzlich nicht mehr gedeckt... Ich begann, die Formel zu überprüfen... und erreichte diesen Fehler. Es stellt sich heraus, dass der Visualizer nichts damit zu tun hat.

 
Alexey Viktorov:

Ja, ich habe sie gezählt, bevor ich die Frage gestellt habe. Scheint zu stimmen, Sie können anhand der Screenshots nachrechnen. Ich habe nicht ohne Grund mit der Überprüfung begonnen. Der Verlust wird auf der Grundlage der Größe des Loses berechnet, bei dem der erwartete Gewinn bei der Übernahme geschlossen wird. Beim EURUSD wurde alles korrekt berechnet, aber beim USDJPY sind die Verluste plötzlich nicht mehr gedeckt... Ich begann, die Formel zu überprüfen... und erreichte diesen Fehler. Es stellt sich heraus, dass der Visualizer nichts damit zu tun hat.

Es tut mir leid, aber ich verstehe nicht, was Sie meinen. Wer ist Ihrer Meinung nach der Fehler - der Prüfer oder der Visualisierer?
 

Fehler beim Kompilieren von Script1.mq5

//Script.mqh
typedef void (*fn)();
#import "Script1.ex5"
        void g();
#import "Script2.ex5"
        void h();
        void h( fn );
#import
class A {
public:
        void f1() { h( g ); } //Error: #1 - no one of the overloads can be applied to the function call
                              //Error: #2 - cannot resolve function address
        void f2() {    g(); } //нормально (*)
        void f3() { Print( __FUNCTION__ ); }
};
//Script1.mq5
#property library
#include "Script.mqh"
void g() export
{
        A a;
        a.f3();
}

Fehler Nr. 1. Der h-Aufruf ist hier durch die Signatur eindeutig.

Fehler #2. In A::f1() kann der Aufruf von h( g ) im Sinne von g zweideutig erscheinen, in A::f2() hingegen stellt der Compiler keine unnötigen Fragen zu g() (und das zu Recht - zumindest die zunächst bestehenden Probleme der Einbindung der Header-Datei mit der Funktionsdeklaration in das Modul mit ihrer Implementierung und weiteren Verwendung in diesem Modul wurden längst gelöst). Außerdem ist es schwierig, die Datei anders zu schreiben, da Script.mqh eine allgemeine Header-Datei ist

 
fxsaber:
Es tut mir leid, aber ich verstehe nicht, worauf Sie hinauswollen. Wer hat Ihrer Meinung nach Unrecht - der Prüfer oder der Visualisierer?

Wenn es Werte anzeigt, die der Wahrheit ähneln, diese aber mit den falschen Daten berechnet werden, dann liegt das Problem bei mql5 und nicht beim Tester oder Visualizer.

Alles in allem, danke für Ihren Beitrag, wird das Problem auf lange Sicht zu besiegen. Und ich werde heute ein anderes, ähnliches Geldstück überprüfen. Vielleicht ist es das Problem mit den Zecken an diesem Ort, hhz?

 

Warum ist die Warnung gleichberechtigt?

void OnStart()
{
  uchar Data[];  
  ArrayInitialize(Data, UCHAR_MAX); // Warning: truncation of constant value
}
 
Liebe Fachleute, bitte helfen Sie mir, das Problem zu verstehen. Der Expert Advisor arbeitet mit dem Signal des Indikators, dessen Periode in einem weiten Bereich von 3 Balken bis zu 10000 und mehr geändert werden kann. Der Indikator selbst funktioniert gut und reagiert angemessen auf Periodenänderungen innerhalb dieser Grenzen. Der Expert Advisor im Strategy Tester akzeptiert jedoch keine Einstellungen über 1002 Takte und meldet "Zero Divide". Was könnte das Problem sein? Ich habe keine Einschränkungen im Code des Expert Advisors gefunden.