Erreurs, bugs, questions - page 1850

 

un bug lors de l'utilisation d'un styler?

Supposons que nous écrivions en utilisant l'onglet.

//+------------------------------------------------------------------+
//|                                                      ProjectName |
//|                                      Copyright 2012, CompanyName |
//|                                       http://www.companyname.net |
//+------------------------------------------------------------------+
   input int x=0;
   #define  TWO_DIM (10000)
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
  {
//---
   double      massive[][TWO_DIM];
  }
//+------------------------------------------------------------------+

Il n'y a pas d'erreur.

puis on utilise le styler, on obtient

//+------------------------------------------------------------------+
//|                                                      ProjectName |
//|                                      Copyright 2012, CompanyName |
//|                                       http://www.companyname.net |
//+------------------------------------------------------------------+
input int x=0;
#define  TWO_DIM(10000)
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
  {
//---
   double      massive[][TWO_DIM];
  }
//+------------------------------------------------------------------+
'10000' - unexpected in macro formal parameter list     bug.mq5 7       17
'[' - invalid index value       bug.mq5 13      25

c'est-à-dire que le styliste efface l'espace entre leTWO_DIM(10000)

 
Erreur de compilation
template <typename T>
struct STRUCT
{
  template <typename T1>  
  STRUCT( T1 Value ) {} // 'STRUCT<int><int>' - declaration without type

};

void OnStart()
{
  STRUCT<int> Struct(0); // 'STRUCT<int>' - cannot to apply function template
}
 
Un petit coup de chapeau. Contournement de l'opérateur d'affectation
template <typename T>
struct STRUCT_COPY
{
  T Value;
  
  STRUCT_COPY( const T& tValue)
  {
    this = (STRUCT_COPY)tValue;
  }  
};

struct STRUCT
{
  int i;
  
  void operator =( const STRUCT& )
  {
    this.i = 5;
  }
};

#define  PRINT(A) ::Print(#A + " = " + (string)(A));

void OnStart()
{
  STRUCT Struct;  
  Struct.i = 1;  
  PRINT(Struct.i);
  
  STRUCT StructCopy1 = Struct;
  PRINT(StructCopy1.i);
  
  // Обходим void STRUCT::operator=(const STRUCT&)
  STRUCT_COPY<STRUCT> StructCopy2(Struct);
  PRINT(StructCopy2.Value.i);  
}

Résultat

Struct.i = 1
StructCopy1.i = 5
StructCopy2.Value.i = 1
 

Quelle est la bonne méthode ?

struct STRUCT
{
  template <typename T>
  void operator []( int ) {}
};

void OnStart()
{
  STRUCT Struct;
  
  Struct.operator[]<int>(0); // Нормально
  Struct[0]<int>;            // Ошибка
}
 
Une autre question - Je comprends que dans MT5 le premier temps de copie du tampon CopyClose dépend de :

1. si, auparavant, vous ne receviez pas du tout de cotations pour un ticker, n'ouvriez pas de graphique, etc. (dépend du ping, de la vitesse de l'internet, du disque dur, de la préparation du fichier Bases/Broker/history/ticker/cache/)

2017.04.11 11:27:38.828 время копирования буфера (EURUSD,M1)    проход = 0  время= 8355581
2017.04.11 11:27:38.828 время копирования буфера (EURUSD,M1)    проход = 1  время= 1083

2. si les cotations ont été reçues précédemment et que le terminal a été rechargé, à condition qu'aucun graphique de ce ticker n'ait été ouvert (préparation du fichier Bases/Broker/History/Ticker/Cache/)

2017.04.11 11:29:14.672 время копирования буфера (EURUSD,M1)    проход = 0  время= 599396
2017.04.11 11:29:14.734 время копирования буфера (EURUSD,M1)    проход = 1  время= 259
/////////////////////////////
2017.04.12 19:32:46.489 время копирования буфера (FULT,M5)      проход = 0  время= 98167
2017.04.12 19:32:46.557 время копирования буфера (FULT,M5)      проход = 1  время= 155
2017.04.12 19:32:46.557 время копирования буфера (FULT,M5)      проход = 2  время= 14

le temps est 10 à 15 fois inférieur à celui de p.1


pour comparaison, le temps d'accès en МТ4 selon le point 2, c'est-à-dire après la réinitialisation du terminal.

2017.04.12 19:30:38.831 время копирования буфера EURUSD,M1: проход = 2  время= 276
2017.04.12 19:30:38.831 время копирования буфера EURUSD,M1: проход = 1  время= 434
2017.04.12 19:30:38.831 время копирования буфера EURUSD,M1: проход = 0  время= 2260
2017.04.12 19:30:38.816 время копирования буфера EURUSD,M1: initialized
2017.04.12 19:30:38.666 время копирования буфера EURUSD,M1 inputs: Pair=USDCAD;

c'est-à-dire que le temps après le redémarrage du terminal MT4 est inférieur de quelques ordres de grandeur.

Cette fois, j'ai tout vérifié sur le Windows, sans SSD !

Quand j'ai obtenu les citations, le terminal n'a pas été redémarré, les données ont été accédées

2017.04.11 11:35:30.648 время копирования буфера (EURUSD,M1)    проход = 0  время= 89
2017.04.11 11:35:30.648 время копирования буфера (EURUSD,M1)    проход = 1  время= 42

Ai-je bien compris qu'après le chargement du cache, le terminal a besoin de beaucoup moins de temps pour les requêtes suivantes (à partir de la deuxième requête) ?

Peut-on réduire le temps du premier appel après le redémarrage du terminal pour le rendre similaire à celui de MT4 ?

Le code était dans https://www.mql5.com/ru/forum/1111/page1870#comment_4856899

Ошибки, баги, вопросы
Ошибки, баги, вопросы
  • www.mql5.com
Форум алго-трейдеров MQL5
 
kaus_bonus:
J'ai une autre question - je comprends que sur MT5 le premier temps de copie du même tampon CopyClose dépend de :

Vous avez une méthode de test très sale car il n'y a pas du tout de description de l'environnement et de la méthode de lecture.

Non spécifié :

  • limites des barres dans la fenêtre
  • les volumes de données réels dans les bases de données terminales
  • sur quel serveur exactement, les bases de données sont-elles sur le disque ? toutes les données doivent être garanties sur le disque.
  • plate-forme et débit binaire de test (sous vin ? à préciser en détail)
  • fenêtres ouvertes

Sans cela, les conclusions ne sont pas fondées.


Par exemple, regardez EURUSD M1 - MT5 a plus de 6 millions de barres là (si le mode illimité aux graphiques), mais MT4 a combien ? Quelques dizaines de milliers de barres M1 dans la base de données actuelle ?
 
Renat Fatkhullin:

Vous avez une méthode de test très désordonnée car il n'y a aucune description de l'environnement et de la méthode de lecture.

Non spécifié :

  • limites des barres dans la fenêtre

  • les volumes de données réels dans les bases de données terminales
  • quel est exactement le serveur, les bases sont-elles sur le disque ? toutes les données doivent être garanties sur le disque.
  • plate-forme et débit binaire de test (sous vin ? à préciser en détail)
  • disponibilité des fenêtres ouvertes

Sans cela, les conclusions ne sont pas fondées.


On m'a posé la plupart des questions dans mon post, pas de problème, je vais vous donner toutes les données maintenant.

Tout d'abord, la réponse à la question

какой точно сервер, находятся ли базы на диске? все данные обязаны быть гарантированно на диске.

Le serveur MQ-demo, les données sont chargées, comme nous parlons du point 2 et du point 3 dans le post précédent. Avec le point 1 tout est clair et il n'y a pas de questions là - comme il a été écrit - les données sont chargées, le cache est formé sur le chemin spécifié.

лимиты баров в окне

MT4

MT5

фактические объемы данных в базах терминалов

MT4

MT5

платформа и битность тестирования (под вайном? нужно указывать детально)

win XP 32bit, toutes les constructions de MT, toutes les dernières

наличие открытых окон

MT4 - ouvrir 1 graphique, vérifier avec un autre symbole

MT5 - 1 graphique ouvert, vérifier avec un autre symbole

répéter, recharger le terminal, envoyer le script au graphique, sélectionner un AUTRE symbole dont les données ont été chargées AVANT de recharger le terminal.

MT4

2017.04.12 21:18:31.575 время копирования буфера EURUSD,M1: проход = 2  время= 36
2017.04.12 21:18:31.575 время копирования буфера EURUSD,M1: проход = 1  время= 282
2017.04.12 21:18:31.575 время копирования буфера EURUSD,M1: проход = 0  время= 1871
2017.04.12 21:18:31.575 время копирования буфера EURUSD,M1: initialized
2017.04.12 21:18:31.405 время копирования буфера EURUSD,M1 inputs: Pair=GBPUSD; 

MT5

2017.04.12 21:19:47.735 время копирования буфера (EURUSD,H1)    проход = 0  время= 303951
2017.04.12 21:19:47.735 время копирования буфера (EURUSD,H1)    проход = 1  время= 29
2017.04.12 21:19:47.735 время копирования буфера (EURUSD,H1)    проход = 2  время= 25
 

Voici mon test avec plus de détails et plus de précision :

Description des conditions
MetaTrader 4 build 1065
MetaTrader 5 x64 build 1580
Matériel et système d'exploitation
Windows 10 Pro x64, Intel Xeon E5-2690 v3 @ 2.60GHz, RAM : 32 Gb, Disque SSD
Serveur de commerce
MetaQuotes-Démo
MetaQuotes-Démo
Limiter les barres sur les graphiques dans les paramètres
10 000
10 000
Limiter les barres dans les paramètres de l'historique 10 000 000
Aucune limite
Nombre réel de barres sur EURUSD, M1
3,382 millions
6,538 millions
Symbole et période vérifiés
EURUSD, M1
EURUSD, M1
Graphiques ouverts
GBPUSD, M1 seulement, le script est aussi lancé dessus
seulement GBPUSD, M1, le même script est lancé dessus
Les résultats sont froids, après le démarrage du terminal
#0 pass, 1000 records in 680 msc
#1 pass, 1000 records in 2 msc
#2 pass, 1000 records in 2 msc

#0 pass, 1000 records in 113497 msc
#1 pass, 1000 records in 3 msc
#2 pass, 1000 records in 3 msc

Les résultats sont chauds, le deuxième passage se fait immédiatement après le premier.
#0 pass, 1000 records in 13 msc
#1 pass, 1000 records in 2 msc
#2 pass, 1000 records in 2 msc
#0 pass, 1000 records in 14 msc
#1 pass, 1000 records in 2 msc
#2 pass, 1000 records in 2 msc

Les fichiers de test sont joints et tous les temps sont exprimés en microsecondes (et non en millisecondes, 1 milliseconde = 1000 microsecondes).

Maintenant, les conclusions :

  1. La seule différence est la vitesse d'initialisation du cache des graphiques - 0,6 ms pour MT4 contre 113 ms pour MT5

    Aucun problème ici - le levage coûte toujours des ressources.
    En particulier lorsque des architectures conceptuellement différentes sont utilisées : MT5 a des caches plus complexes (les fichiers cache\*.hc sont construits à partir des *.hcc originaux) pour des raisons de mise à l'échelle + contrôle obligatoire de la synchronisation complète avec les données du serveur (morceaux binaires *.hcc).

  2. Des demandes répétées montrent une vitesse identique - 2-3 microsecondes par copie de données.

    Il n'y a aucune défaillance dans la mise en œuvre des deux terminaux et tout fonctionne rapidement.
Dossiers :
 

Je vous remercie de votre réponse.

Dans l'ensemble, les résultats sont tels que je les ai montrés dans mes posts.

J'ai fait des tests sur un régulier.

Et pourtant les résultats entre MT4 et MT5 sont presque 200 fois différents (en raison de -doit contrôler la synchronisation complète avec les données du serveur? ? et ping ? ).

Je m'y suis habitué avant de poster ici que c'est probablement une caractéristique du terminal. Je peux même vivre avec, mais c'est difficile à certains moments. Par exemple, les prix sont uniquement disponibles via CopyClose, ils ne sont pas disponibles via SymbolInfoDouble ou via MqlTick jusqu'à ce que le symbole soit ajouté à la surveillance du marché, donc ce script s'exécute "infiniment" longtemps après le démarrage du terminal. Ce n'est qu'un exemple.

 
kaus_bonus:

Je vous remercie de votre réponse.

Dans l'ensemble, les résultats sont tels que je les ai montrés dans mes posts.

J'ai fait des tests sur un régulier.

Pas de triche, ce sont les mêmes conditions pour les deux systèmes.


Et pourtant les résultats entre MT4 et MT5 sont presque 200 fois différents (à cause du -contrôle obligatoire de la synchronisation complète avec les données du serveur? ? et du ping ? ).

Environ 0.6ms dans MT4, je vais encore trouver une solution. Apparemment, les données qui s'y trouvent sont déjà préparées à l'avance et ce chiffre ne montre donc pas les coûts réels.

MT4 a une idéologie assez différente et en fait le terminal copie une énorme quantité de données pour chaque script/expert au niveau du système à partir du code MQL4. Par conséquent, les mesures effectuées dans MQL4 ne démontrent généralement pas la consommation réelle des ressources pour la réception des données. Les dépenses existent bien sûr, mais elles se situent à un autre niveau - le système en est responsable.

Il est clair que le mécanisme MT4 (création de copies des données du marché pour chaque robot) ne peut pas être appliqué lorsque votre tâche est mise à l'échelle de flux de données infinis (historique profond, dizaines de milliers d'instruments). Par conséquent, j'ai dû modifier et améliorer considérablement MQL5 en me débarrassant des accès directs Open/High/Low/Close et en passant aux fonctions CopyXXX. Compte tenu de la taille des données MT5, il est trop coûteux pour un conseiller expert de construire la copie EURUSD M1 pour 6 millions de barres.

MT5/MQL5 utilise la stratégie de téléchargement des données à la demande sans copie à l'avance, ce qui signifie une meilleure possibilité de mesurer les coûts réels du code MQL5.

Amener la base de données en mémoire, vérifier la synchronisation et préparer les caches d'un objet complexe dans MT5 en 113 millisecondes est acceptable.