Fehler, Irrtümer, Fragen - Seite 1930

 
Eine fast kindliche Frage: Warum ist das so?
void OnStart()
{
  const double Norm = NormalizeDouble(8905 / 1000.0, 3);
  Print(Norm); // 8.904999999999999
  Print(DoubleToString(Norm, 3)); // 8.905
  
  const double Norm2 = (double)DoubleToString(Norm, 3);
  Print(Norm2); // 8.904999999999999
  Print(Norm == Norm2); // true
}

Aus irgendeinem Grund war ich sicher, dass DoubleToString nach der Normalisierung bedeutungslos ist. Aber nein, wie das Drehbuch zeigt. Warum ist das so?

Es scheint, dass die Konvertierung Double -> String nicht korrekt funktioniert.

 
Die PositionGet-Funktionen sind im Testgerät sehr langsam. Zu Demonstrationszwecken wurde der folgende Expert Advisor geschrieben
// #include <TesterBench.mqh> // https://www.mql5.com/ru/code/18804/

input int Interval = 3600;
input double Lots = 1;

void OnTick()
{
  if (!PositionSelect(_Symbol))
  {
    if (HistorySelect(0, TimeCurrent()))
    {
      const int Total = HistoryDealsTotal() - 1;

      MqlTradeRequest Request = {0};
      MqlTradeCheckResult CheckResult;
  
      Request.action = TRADE_ACTION_DEAL;
  
      Request.symbol = _Symbol;
      Request.type = ((Total >= 0) && ((ENUM_DEAL_TYPE)HistoryDealGetInteger(HistoryDealGetTicket(Total), DEAL_TYPE) == DEAL_TYPE_SELL)) ?
                     ORDER_TYPE_SELL : ORDER_TYPE_BUY;;
  
      Request.volume = Lots;
      Request.price = SymbolInfoDouble(Request.symbol, (Request.type == ORDER_TYPE_BUY) ? SYMBOL_ASK : SYMBOL_BID);

      if (OrderCheck(Request, CheckResult))
      {
        MqlTradeResult Result;

        const bool AntiWarning = OrderSend(Request, Result);            
      }
    }
  }
  else
  {
    // Если раскоментировать эти строки, одиночный прогон станет на 20% медленнее.
//    string Symbol = ::PositionGetString(POSITION_SYMBOL);
//    string Comment = ::PositionGetString(POSITION_COMMENT);

    if (TimeCurrent() - PositionGetInteger(POSITION_TIME) >= Interval)      
    {
      MqlTradeRequest Request = {0};
      MqlTradeResult Result;
      
      Request.action = TRADE_ACTION_DEAL;
      Request.position = PositionGetInteger(POSITION_TICKET);
  
      Request.symbol = PositionGetString(POSITION_SYMBOL);
      Request.type = (ENUM_ORDER_TYPE)(1 - PositionGetInteger(POSITION_TYPE));
  
      Request.volume = PositionGetDouble(POSITION_VOLUME);
      Request.price = PositionGetDouble(POSITION_PRICE_CURRENT);
          
      const bool AntiWarning = OrderSend(Request, Result);
    }
  }
}


Ergebnis der Einzelfahrt mit auskommentierten gelben Linien

Core 1  2017.07.17 23:59:58   Interval = 7.09 s.
Core 1  EURUSD,M1: 13369675 ticks, 47426 bars generated. Environment synchronized in 0:00:00.857. Test passed in 0:00:09.720 (including ticks preprocessing 0:00:01.950).
Core 1  EURUSD,M1: total time from login to stop testing 0:00:10.577 (including 0:00:00.857 for history data synchronization)


Ergebnis eines einzelnen Laufs mit NICHT auskommentierten gelben Linien

Core 1  2017.07.17 23:59:58   Interval = 9.336 s.
Core 1  EURUSD,M1: 13369675 ticks, 47426 bars generated. Environment synchronized in 0:00:00.062. Test passed in 0:00:11.997 (including ticks preprocessing 0:00:01.934).
Core 1  EURUSD,M1: total time from login to stop testing 0:00:12.059 (including 0:00:00.062 for history data synchronization)


DieTesterBench-Bibliothek zeigt den gleichen Rückgang der Ausführungszeit.


HH Nicht nur PositionGet, sondern auch OrderGet, HistoryDealGet und HistoryOrderGet sind langsam.

 

Im Tester (1629) werden Geschäfte zu Nullkursen eröffnet

Ausführung des Expert Advisors im Tester mit echten Ticks des FIBOGroup-MT5 Servers


 

Frage an Entwickler und interessierte Kollegen.

Im Tester gibt es im Visualisierungsmodus ein Objekt der CiMA-Klasse - muwings.

Modus = "Jeder Tick basiert auf echten Ticks". Die Geschwindigkeit im Visualizer ist nahe dem Maximum.

Das Problem ist folgendes. Wenn ein neuer Balken erscheint, müssen Sie auf einen Haufen neuer Ticks warten, um die Werte der CiMA-Muwings bzw. die Werte im Muwings-Puffer zu aktualisieren.

Und bei jedem Tick wird die Aktualisierung durch die Methode CiMA::Refresh(-1) beschleunigt.

Warum funktioniert der Tester so schlecht?

Im realen Handel gibt es solche Probleme nicht.

 

Pusha ist in diesen Tagen ein seltsamer Mensch:

uest/302788

Anfrage/302788

Wie ich mir denken kann, war ich es, der als Kandidat aufgestellt wurde und die gleiche Reihenfolge kommentierte.

Aber die Nachrichten sind genau wie für Programmierer)

 

Aus der Dokumentation

ENUM_BASE_CORNER

Kennung

Beschreibung

ECKE_LINKS_OBEN

Zentrum der Koordinaten in der linken oberen Ecke der Karte

ECKE_LINKS_UNTEN

Zentrum der Koordinaten in der unteren linken Ecke der Karte

ECKE_RECHTS_UNTEN

Zentrum der Koordinaten in der unteren rechten Ecke der Karte

ECKE_RECHTS_OBEN

Zentrum der Koordinaten in der oberen rechten Ecke der Karte

Frage: Warum kann die Tabelle nicht in numerischer Reihenfolge gezeichnet werden? Sie geben 1 ein - und statt der erwarteten"Koordinatenmitte in der oberen linken Ecke des Diagramms" erhalten Sie"Koordinatenmitte in der unteren rechten Ecke des Diagramms".

Jetzt sieht es so aus

1 - Koordinatenmitte in der unteren linken Ecke der Karte.
2 - Koordinatenzentrum in der rechten unteren Ecke des Diagramms
3 - Koordinatenmitte in der oberen rechten Ecke der Karte
4 - Koordinatenmitte in der linken oberen Ecke des Diagramms

 
Aleksey Vyazmikin:

Aus der Dokumentation

ENUM_BASE_CORNER

Kennung

Beschreibung

ECKE_LINKS_OBEN

Zentrum der Koordinaten in der linken oberen Ecke der Karte

ECKE_LINKS_UNTEN

Zentrum der Koordinaten in der unteren linken Ecke der Karte

ECKE_RECHTS_UNTEN

Zentrum der Koordinaten in der unteren rechten Ecke der Karte

ECKE_RECHTS_OBEN

Zentrum der Koordinaten in der oberen rechten Ecke der Karte

Frage: Warum kann die Tabelle nicht in numerischer Reihenfolge sein? Sie setzen 1 ein - und statt der erwarteten"Koordinatenmitte in der oberen linken Ecke des Diagramms" erhalten Sie"Koordinatenmitte in der unteren rechten Ecke des Diagramms".

Es sieht folgendermaßen aus

1 - Koordinatenmitte in der unteren linken Ecke der Karte.
2 - Koordinatenzentrum in der rechten unteren Ecke des Diagramms
3 - Koordinatenmitte in der oberen rechten Ecke der Karte
4 - Koordinatenmitte in der linken oberen Ecke des Diagramms

Die Zählung beginnt bei Null.

Was hindert Sie daran, CORNER_LEFT_UPPER anstelle einer Zahl einzugeben? Dafür ist die Aufzählung da, damit man nicht über Zahlen nachdenken muss.

 

Im Helpdesk

MT4:

Für Objekte mit fester Größe: OBJ_BUTTON, OBJ_RECTANGLE_LABEL und OBJ_EDIT Eigenschaften OBJPROP_XDISTANCE und OBJPROP_YDISTANCE legen die Position des oberen linken Objektpunktes relativ zur Diagrammecke (OBJPROP_CORNER) fest, von der aus die X- und Y-Koordinaten in Pixel gezählt werden.


MT5:

Für Objekte mit fester Größe: OBJ_BUTTON, OBJ_RECTANGLE_LABEL, OBJ_EDIT und OBJ_CHART, legen die Eigenschaften OBJPROP_XDISTANCE und OBJPROP_YDISTANCE die Position des oberen linken Punktes des Objekts relativ zur Diagrammecke (OBJPROP_CORNER) fest, von der aus die X- und Y-Koordinaten in Pixel gemessen werden.

Das Problem ist, dass die alte Version von MT4, die ObjectSet verwendet , die Platzierung von Objekten relativ zu ihren Kanten (Ecken) erlaubt - für Objekte im linken Teil wird die Berechnung der Pixel vom ersten Symbol aus durchgeführt, für Objekte im rechten Teil - vom letzten Symbol aus, während die neue Version die Berechnung immer vom ersten Symbol aus durchführt, was die Positionierung von Etiketten mit Text schwierig macht, weil man nicht immer weiß, wie viele Textsymbole es geben wird. Ich fordere die Entwickler auf, eine Auswahl an Textausrichtungsmethoden hinzuzufügen!

//+------------------------------------------------------------------+
//|Функция вывода информации на экран -- Старый вариант              |
//+------------------------------------------------------------------+

void Label_MQL4(string _name,int _window,int _x,int _y,string _text,int _font,color _color,int corner)
  {
   ObjectDelete(_name);
   ObjectCreate(_name,OBJ_LABEL,_window,0,0);
   ObjectSet(_name,OBJPROP_CORNER,corner);
   ObjectSet(_name,OBJPROP_XDISTANCE,_x);
   ObjectSet(_name,OBJPROP_YDISTANCE,_y);
   ObjectSetText(_name,_text,_font,"Arial",_color);
  }
  
//+------------------------------------------------------------------+
//|Функция вывода информации на экран -- Новый вариант               |
//+------------------------------------------------------------------+
void Label_MQL5(string _name,int _window,int _x,int _y,string _text,int _font,color _color,int corner)
  {
   //corner=4;
   ObjectDelete(0,_name);
   ObjectCreate(0,_name,OBJ_LABEL,_window,0,0);
   ObjectSetInteger(0,_name,OBJPROP_CORNER,corner);
   ObjectSetInteger(0,_name,OBJPROP_XDISTANCE,_x);
   ObjectSetInteger(0,_name,OBJPROP_YDISTANCE,_y);
   ObjectSetText(_name,_text,_font,"Arial",_color);
  }  


Wenn jemand weiß, wie man sich in MT5 nach links und rechts ausrichten kann, bitte die entsprechende Funktion mitteilen!

 
Artyom Trishkin:

Die Zählung beginnt bei Null.

Was hindert Sie daran, CORNER_LEFT_UPPER anstelle einer Zahl einzugeben? Dafür ist die Aufzählung da, damit man nicht über Zahlen nachdenken muss.

Von Null an? Nun, OK - lass es Null sein - ich habe es nicht berücksichtigt - aber es funktioniert trotzdem nicht!

Weil es für mich mehr Sinn macht und ich es schon einmal benutzt habe.

 
Aleksey Vyazmikin:

Von Grund auf? Nun, OK - selbst wenn es von Grund auf neu ist - ich habe es nicht in Betracht gezogen - aber es funktioniert trotzdem nicht!

Weil es für mich mehr Sinn ergibt und ich es schon mal benutzt habe...

Soll ich den Listenpunkt, den Sie mit der Nummer 4 zu identifizieren versuchen, die es nicht gibt, nach oben verschieben? Es wird Null - und alles ist an seinem Platz.