Caractéristiques du langage mql5, subtilités et techniques - page 152

 
Slava:

Y en a-t-il un ? Vous êtes sûr qu'il y en a un ? Sur quel chemin se trouve-t-il ?

Comment puis-je le reproduire ?

Placez le script dans les favoris du navigateur.

void OnStart() {}


Compilez la mauvaise version.

void OnStart() {} 123


Redémarrez le Terminal et essayez de modifier le script à partir des Favoris.

 
Vladimir Simakov:

Les développeurs. Une explication est nécessaire. Lequel croire ? Les documents ou la mise en œuvre ? Jusqu'à présent, un comportement indéfini apparaît.

@fxsaber, je ne vous recommande pas de l'utiliser avant les explications officielles, peut-être qu'ils vont corriger le problème.

La documentation est en souffrance, réparons-la.

Je ne recommande pas d'initialiser les variables statiques avec des expressions, si possible utilisez une constante.

Car lorsque vous utilisez une expression non constante, le compilateur génère le code suivant

//--- исходная функция
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);
  }


Il y a une surcharge, chaque appel vérifiera le drapeau __Implicit_myStaticVar_initialized.

Pour le cas constant, vous obtiendrez le code suivant

//--- исходная функция
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);
  }

Il n'y a pas de frais généraux.

 
Ilyas:

Merci, maintenant je comprends ce qu'est l'overhead.

 
Vous pouvez facilement écrire des valeurs de prix non normalisées dans des caractères personnalisés. Vous trouverez ci-dessous une vérification simple.
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)
  }
}


Résultat

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 
 
Les commentaires non liés à ce sujet ont été déplacés vers "Questions des débutants de MQL5 MT5 MetaTrader 5".
 
RickD:
... La question est différente. Il y a peut-être un bug dans MQL5, nous devons le traiter, mais le reporter dans le sujet pour les débutants ne nous aide pas à le découvrir assez tôt.

Veuillez lire le titre du sujet.

 
Artyom Trishkin:

Veuillez lire le titre du fil de discussion.

Et où voyez-vous la contradiction ? La situation décrite peut être une caractéristique de la langue, ou un bug. C'est ce que vous vouliez savoir.

 
RickD:

Et où voyez-vous la contradiction ? La situation décrite peut être une caractéristique du langage ou un bug. C'est ce que vous vouliez savoir.

Non. On détermine d'abord s'il s'agit d'un bug ou d'une particularité - puis on l'affiche exactement et exclusivement comme une particularité. Le sujet porte uniquement sur les fonctionnalités.

 

@Ilyas@Slava@Renat Fatkhullin

mql a un support pour les mots-clés non documentés pour les fonctions

__inline
__forceinline

Est-il raisonnable de les utiliser ?
Si oui, quand le compilateur les acceptera-t-il ?

 

Dans l'aide de ArrayReverse :

La fonctionArraySetAsSeries() ne déplace pas physiquement les éléments du tableau, mais inverse seulement la direction d'indexation vers l'arrière pour organiser l'accès aux éléments comme dans unesérie temporelle. La fonction ArrayReverse() déplace physiquement les éléments du tableau de manière à ce que celui-ci soit "inversé".

Mais ce code prouve le contraire :

  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)     =================
Raison: