Merkmale der Sprache mql5, Feinheiten und Techniken - Seite 152

 
Slava:

Gibt es eine? Sind Sie sicher, dass es dort ist? Auf welchem Weg befindet sie sich?

Wie kann ich es reproduzieren?

Platzieren Sie das Skript in den Navigator-Favoriten.

void OnStart() {}


Kompilieren Sie die falsche Version.

void OnStart() {} 123


Starten Sie das Terminal neu und versuchen Sie, das Skript in den Favoriten zu bearbeiten.

 
Vladimir Simakov:

Die Entwickler. Eine Erklärung ist erforderlich. Was soll man glauben? Die Unterlagen oder die Umsetzung? Bisher ist das Verhalten undefiniert.

@fxsaber, ich empfehle Ihnen nicht, es vor den offiziellen Erklärungen zu verwenden, vielleicht werden sie es beheben.

Die Dokumentation ist im Rückstand, das müssen wir ändern.

Ich empfehle nicht, statische Variablen mit Ausdrücken zu initialisieren, sondern wenn möglich eine Konstante zu verwenden.

Denn wenn Sie einen nicht konstanten Ausdruck verwenden, erzeugt der Compiler folgenden Code

//--- исходная функция
int func(int value)
  {
   static int myStaticVar=value;    
   
   myStaticVar += value;
   return(myStaticVar);
  }

//--- то, что будет сгенерировано 
bool __Implicit_myStaticVar_initialized=false;
int  __Implicit_myStaticVar=0;

//--- исходная функция
int func(int value)
  {
   if(!__Implicit_myStaticVar_initialized)
     {
      __Implicit_myStaticVar_initialized=true;
      __Implicit_myStaticVar=value;
     }

   __Implicit_myStaticVar += value;
   return(__Implicit_myStaticVar);
  }


Es gibt einen Overhead, da jeder Aufruf das __Implicit_myStaticVar_initialized-Flag prüft

Für den Fall der Konstante erhalten Sie den folgenden Code

//--- исходная функция
int func(int value)
  {
   static int myStaticVar=10;

   myStaticVar += value;
   return(myStaticVar);
  }

//--- то, что будет сгенерировано 
int  __Implicit_myStaticVar=10;

int func(int value)
  {
   __Implicit_myStaticVar += value;
   return(__Implicit_myStaticVar);
  }

Es gibt keine Gemeinkosten.

 
Ilyas:

Danke, jetzt verstehe ich, was es mit den Gemeinkosten auf sich hat.

 
Sie können nicht-normalisierte Preiswerte einfach in benutzerdefinierte Zeichen schreiben. Nachstehend finden Sie eine einfache Überprüfung.
bool IsNorm( const double Price )
{
  return(NormalizeDouble(Price, _Digits) == Price);
}

#define  TOSTRING(A) #A + " = " + DoubleToString(A, 16) + " "
#define  PRINT(A) Print(TOSTRING(A) + TOSTRING(NormalizeDouble(A, _Digits)))
#define  ISNORM(A) if (!IsNorm(A)) PRINT(A);

void OnTick()
{
  MqlTick Tick;
  
  if (SymbolInfoTick(_Symbol, Tick))
  {
    ISNORM(Tick.bid)
    ISNORM(Tick.ask)
    ISNORM(Tick.last)
  }
}


Ergebnis

2019.12.11 06:46:56.458 2019.10.09 23:59:00   Tick.last = 1.8151900000000002 NormalizeDouble(Tick.last,_Digits) = 1.8151900000000000 
2019.12.11 06:46:56.458 2019.10.09 23:59:11   Tick.bid = 1.8151100000000003 NormalizeDouble(Tick.bid,_Digits) = 1.8151100000000001 
2019.12.11 06:46:56.458 2019.10.09 23:59:11   Tick.ask = 1.8153800000000003 NormalizeDouble(Tick.ask,_Digits) = 1.8153800000000001 
2019.12.11 06:46:56.458 2019.10.09 23:59:17   Tick.bid = 1.8151200000000002 NormalizeDouble(Tick.bid,_Digits) = 1.8151199999999999 
2019.12.11 06:46:56.458 2019.10.09 23:59:17   Tick.ask = 1.8153800000000003 NormalizeDouble(Tick.ask,_Digits) = 1.8153800000000001 
 
Kommentare, die sich nicht auf dieses Thema beziehen, wurden nach "Fragen von MQL5 MT5 MetaTrader 5 Anfängern" verschoben.
 
RickD:
... Die Frage ist eine andere. Vielleicht gibt es einen Fehler in MQL5, mit dem wir uns befassen müssen, aber es auf das Thema für Neulinge zu verschieben, hilft nicht, die Situation schnell zu lösen.

Bitte lesen Sie den Titel des Themas.

 
Artyom Trishkin:

Bitte lesen Sie den Titel des Themas.

Und wo sehen Sie den Widerspruch? Die beschriebene Situation kann ein Merkmal der Sprache oder ein Fehler sein. Das ist es, was Sie herausfinden wollten.

 
RickD:

Und wo sehen Sie den Widerspruch? Die beschriebene Situation könnte ein Merkmal der Sprache sein, oder es könnte sich um einen Fehler handeln. Das ist es, was Sie herausfinden wollten.

Nein. Zuerst wird festgestellt, ob es sich um einen Fehler oder eine Besonderheit handelt - dann wird es genau und ausschließlich als Besonderheit ausgewiesen. Bei diesem Thema geht es nur um Funktionen.

 

@Ilyas@Slava@Renat Fatkhullin

mql hat Unterstützung für undokumentierte Schlüsselwörter für Funktionen

__inline
__forceinline

Ist es sinnvoll, sie zu verwenden?
Wenn ja, wann wird der Compiler sie akzeptieren?

 

In der ArrayReverse Hilfe:

Die FunktionArraySetAsSeries() verschiebt die Elemente des Arrays nicht physisch, sondern kehrt nur die Indizierungsrichtung um, um den Zugriff auf die Elemente wie bei einerZeitreihe zu gestalten. Die Funktion ArrayReverse() verschiebt Array-Elemente physisch, so dass das Array "umgekehrt" wird.

Dieser Code beweist jedoch das Gegenteil:

  MqlRates rt[];
  CopyRates(Symbol(), 0, 0, 5, rt);
  ArraySetAsSeries(rt, true);
  ArrayResize(rt, 6); // добавляет элемент в конец массива
  //ArraySetAsSeries(rt, true);
  for (int x = 0; x < ArraySize(rt); x++) {
      Print(rt[x].time);
  }
  Print("=================");
(EURUSD,H1)     2019.12.13 02:00:00
(EURUSD,H1)     2019.12.13 01:00:00
(EURUSD,H1)     2019.12.13 00:00:00
(EURUSD,H1)     2019.12.12 23:00:00
(EURUSD,H1)     2019.12.12 22:00:00
(EURUSD,H1)     1970.01.01 00:00:00 - последний элемент
(EURUSD,H1)     =================
  MqlRates rt[];
  CopyRates(Symbol(), 0, 0, 5, rt);
  //ArraySetAsSeries(rt, true);
  ArrayResize(rt, 6); // добавляет элемент в конец массива
  ArraySetAsSeries(rt, true);
  for (int x = 0; x < ArraySize(rt); x++) {
      Print(rt[x].time);
  }
  Print("=================");
(EURUSD,H1)     1970.01.01 00:09:19 - последний элемент
(EURUSD,H1)     2019.12.13 02:00:00
(EURUSD,H1)     2019.12.13 01:00:00
(EURUSD,H1)     2019.12.13 00:00:00
(EURUSD,H1)     2019.12.12 23:00:00
(EURUSD,H1)     2019.12.12 22:00:00
(EURUSD,H1)     =================