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

 
C'est une énorme révélation pour moi
// Скрипт показыает, что цены открытия/закрытия не просто не нормализованы, но и разные при схожем значении

#property strict

#include <MT4Orders.mqh>

// Заполнение массива ценами открытия/закрытия
int FillPrices( double &Prices[] )
{
  const int Total = OrdersHistoryTotal();
  
  ArrayResize(Prices, Total << 1);
  
  int Amount = 0;
  
  for (int i = 0; i < Total; i++)
    if (OrderSelect(i, SELECT_BY_POS, MODE_HISTORY))
    {
      Prices[Amount++] = OrderOpenPrice();
      Prices[Amount++] = OrderClosePrice();
    }

  return(ArrayResize(Prices, Amount));
}

// true - нормализованная разность равна нуля, сама разность - отлична от нуля.
bool IsBadPrices( const double &Price1, const double &Price2 )
{
  return(!NormalizeDouble(Price1 - Price2, 5) && (Price1 != Price2));
}

// Находит цены открытия/закрытия, которые
// с нормализацией равны друг другу,
// без нормализации - не равны.
int CheckPrices( const double &Prices[] )
{
  int Res = 0;
  const int Size = ArraySize(Prices);
  
  for (int i = 0; i < Size - 1; i++)
  {
    const double Price = Prices[i];
    
    for (int j = i + 1; j < Size; j++)
      if (IsBadPrices(Price, Prices[j]))
      {
        Print((string)Price + " - " + (string)Prices[j] + " = " + (string)(Price - Prices[j])); // Распечатываем найденые цены
        
        Res++;
      }
  }
    
  return(Res);
}

void OnStart()
{
  double Prices[];
  
  FillPrices(Prices);
  Print(CheckPrices(Prices)); // Количество "несовпадающих" пар цен.
}


Résultat

1.95562 - 1.95562 = -2.220446049250313 e-016
1.95562 - 1.95562 = -2.220446049250313 e-016
1.71599 - 1.71599 = -2.220446049250313 e-016
1.71599 - 1.71599 = -2.220446049250313 e-016
1.58028 - 1.58028 = -2.220446049250313 e-016
14.806 - 14.806 = -1.77635683940025 e-015
1.95521 - 1.95521 = -2.220446049250313 e-016
1.95521 - 1.95521 = -2.220446049250313 e-016
8


L'exécution du même script sur MT4 est encore plus déprimante - il y a là une histoire plus importante. Laissez-moi vous expliquer.


Vous voyez ici que la position a été ouverte et fermée au même prix. Mais leurs prix ne sont pas égaux lorsqu'on les compare sans normalisation !


ZZY a vérifié le testeur - il semble qu'il n'y ait pas de telles méchancetés.

 
Ilya Malev:

J'ai dû faire une faute de frappe.

Donc l'écart minimum est réel ? Si c'est le cas, vous devriez écrire au support technique pour qu'il soit corrigé (à moyen). Sinon, c'est une anecdote pour les grails des testeurs.

 
fxsaber:

J'ai vérifié le testeur - il ne semble pas y avoir de telles méchancetés.

Dans tous les modes Tester, à l'exception des ticks réels, les prix ne sont pas normalisés !

// Советник выводит цены, которые не нормализованы

#property strict

// true - нормализованная цена не равна оригинальной
bool IsBadPrice( const double &Price )
{
  return(NormalizeDouble(Price, 5) != Price);
}

#define  TOSTRING(A) #A + " = " + (string)(A) + " "

//const bool Init = EventSetMillisecondTimer(50);
//void OnTimer()
void OnTick()
{
  for (int i = SymbolsTotal(true) - 1; i >= 0; i--)
  {
    const string Symb = SymbolName(i, true);
    
    const double PriceBid = SymbolInfoDouble(Symb, SYMBOL_BID);
    const double PriceAsk = SymbolInfoDouble(Symb, SYMBOL_ASK);
    
    if (IsBadPrice(PriceBid))
      Print(TOSTRING(Symb) + TOSTRING(PriceBid) + TOSTRING(NormalizeDouble(PriceBid, 5) - PriceBid));

    if (IsBadPrice(PriceAsk))
      Print(TOSTRING(Symb) + TOSTRING(PriceAsk) + TOSTRING(NormalizeDouble(PriceAsk, 5) - PriceAsk));
  }
}


Résultat

2019.02.18 23:57:24   Symb = EURUSD PriceBid = 1.13088 NormalizeDouble(PriceBid,5)-PriceBid = -2.220446049250313 e-016 
2019.02.18 23:57:26   Symb = EURUSD PriceAsk = 1.13112 NormalizeDouble(PriceAsk,5)-PriceAsk = -2.220446049250313 e-016 
2019.02.18 23:57:27   Symb = EURUSD PriceBid = 1.13085 NormalizeDouble(PriceBid,5)-PriceBid = -2.220446049250313 e-016 
2019.02.18 23:58:18   Symb = EURUSD PriceAsk = 1.13112 NormalizeDouble(PriceAsk,5)-PriceAsk = -2.220446049250313 e-016 


Pour faire court, il s'agit d'un bogue dans le Testeur.

 

Imaginons que vous ne puissiez pas vous connecter au serveur de négociation lorsque vous essayez de vous connecter à votre compte.

Ou, par exemple, votre compte de démonstration a expiré et la tentative de connexion donne "Compte non valide".


Malgré cet échec, tout l'historique des transactions est disponible, même s'il n'apparaît pas dans le terminal !

 
fxsaber:

Imaginons que vous ne puissiez pas vous connecter au serveur de négociation lorsque vous essayez de vous connecter à votre compte.

Ou, par exemple, votre compte de démonstration a expiré et la tentative de connexion donne "Compte non valide".


Malgré cet échec, tout l'historique des transactions est disponible, même s'il n'apparaît pas dans le terminal !

Alors, où est stockée l'histoire ?

 
Alexey Navoykov:

En d'autres termes, l'écart minimum est-il réaliste ? Si c'est le cas, vous devez écrire au support technique pour qu'il le corrige (à un niveau moyen). Sinon, c'est une anecdote pour les testeurs.

Dans la branche "bugs, questions" ont déjà répondu officiellement que rien ne changera. Plus précisément, ils ont simplement ignoré toutes les questions rationnelles et ont répondu "tester par des ticks réels", ce que j'interprète comme une réponse strictement négative

Il s'agit d'un "tidbit" pour une auto-déception malheureuse. Bien que, peut-être que quelqu'un d'autre peut l'utiliser commercialement pour tricher d'une certaine manière (à savoir, les sociétés de courtage - qui créent ainsi une fausse impression de la norme des spreads, si la personne ne se lance pas dans les ticks réels, et 99,9% ne le feront pas).
 
Ilya Malev:

Bien qu'il soit possible que quelqu'un d'autre puisse l'utiliser commercialement pour tricher d'une manière ou d'une autre (à savoir, les sociétés de courtage - qui créent ainsi une fausse impression de la norme des spreads, si la personne n'entre pas dans les ticks réels, et 99,9% ne le feront pas).

En théorie, tout devrait être synchronisé sur le serveur. Ce qui est en ticks - devrait être en bars. Mais bien sûr, je ne sais pas comment cela se passe en réalité.

 
Les commentaires non pertinents pour ce sujet ont été déplacés vers "Caractéristiques du langage mql4, subtilités et techniques".
 

ME dispose d'une combinaison ALT+V où vous pouvez voir les valeurs précédentes du presse-papiers du système. Même si vous avez copié quelque chose depuis le navigateur et que ME travaillait en arrière-plan, ME le verra et s'en souviendra.

En gros, ME voit une grande partie de ce que vous faites sur l'ordinateur. Par exemple, si vous collez un mot de passe pour un compte ou un compte personnel à partir d'une autre ressource via le tampon, il sera placé dans l'historique de la session ME actuelle.

 
fxsaber:

ME dispose d'une combinaison ALT+V où vous pouvez voir les valeurs précédentes du presse-papiers du système. Même si vous avez copié quelque chose depuis le navigateur et que ME travaillait en arrière-plan, ME le verra et s'en souviendra.

En gros, ME voit une grande partie de ce que vous faites sur l'ordinateur. Par exemple, si vous collez le mot de passe d'un compte via le tampon, il sera placé dans l'historique de la session ME actuelle.

Wow, je copie les mots de passe des crypto-monnaies. En quoi est-ce préjudiciable pour moi ?

Raison: