Fehler, Irrtümer, Fragen - Seite 1850

 
Ist es ein Fehler?
struct STRUCT
{
  int a;
  
  STRUCT() {} // Если закомментировать, ошибка пропадает
};

void OnStart()
{
  STRUCT Struct = {1}; // cannot be initialized with initializer list
}
 

einen Fehler bei der Verwendung eines Stylers?

Nehmen wir an, wir schreiben mit dem Tabulator.

//+------------------------------------------------------------------+
//|                                                      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];
  }
//+------------------------------------------------------------------+

Es liegt kein Fehler vor.

dann verwenden wir den Styler, wir erhalten

//+------------------------------------------------------------------+
//|                                                      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

d.h. der Styler löscht den Abstand zwischen denTWO_DIM(10000)

 
Kompilierungsfehler
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
}
 
Ein kleiner Hinweis auf den Hut. Umgehung des Zuweisungsoperators
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);  
}

Ergebnis

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

Was ist der richtige Weg?

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

void OnStart()
{
  STRUCT Struct;
  
  Struct.operator[]<int>(0); // Нормально
  Struct[0]<int>;            // Ошибка
}
 
eine andere Frage - ich verstehe, dass in MT5 die erste Kopierzeit des CopyClose-Puffers von abhängt:

1. wenn Sie vorher überhaupt keine Tickerkurse erhalten haben, den Chart nicht geöffnet haben usw. (abhängig von Ping, Internetgeschwindigkeit, Festplatte, Vorbereitung der Datei 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. wenn die Kurse zuvor empfangen wurden und dann das Terminal neu geladen wurde, sofern noch kein Chart dieses Tickers geöffnet wurde (Erstellung der Datei 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

die Zeit ist 10-15 mal kürzer als bei p.1


zum Vergleich die Zugriffszeit in МТ4 gemäß Punkt 2, d. h. nach dem Reset des Terminals

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;

d.h. die Zeit nach dem Neustart des MT4-Terminals ist um einige Größenordnungen geringer.

Dieses Mal habe ich alles auf dem Windows überprüft, ohne SSD!

Wenn ich die Anführungszeichen richtig verstanden habe, wurde das Terminal nicht neu gebootet, sondern es wurde auf die Daten zugegriffen.

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

Habe ich es richtig verstanden, dass das Terminal nach dem Laden des Caches deutlich weniger Zeit für weitere Anfragen benötigt (ab der 2. Anfrage)?

Können wir die Zeit für den ersten Aufruf nach dem Neustart des Terminals irgendwie verkürzen, damit es wie in MT4 ist?

Der Code war in https://www.mql5.com/ru/forum/1111/page1870#comment_4856899

Ошибки, баги, вопросы
Ошибки, баги, вопросы
  • www.mql5.com
Форум алго-трейдеров MQL5
 
kaus_bonus:
Ich habe eine weitere Frage - ich verstehe, dass auf MT5 die erste Kopierzeit des gleichen CopyClose Puffer abhängt von:

Sie haben eine sehr unsaubere Testmethode, da es überhaupt keine Beschreibung der Umgebung und der Wiedergabemethode gibt.

Nicht angegeben:

  • Begrenzung der Balken im Fenster
  • tatsächliche Datenmengen in den Terminaldatenbanken
  • Auf welchem Server befinden sich die Datenbanken genau? Alle Daten müssen garantiert auf der Festplatte gespeichert sein.
  • Plattform und Bitrate des Tests (unter wine? muss im Detail angegeben werden)
  • offene Fenster

Ohne dies sind die Schlussfolgerungen unbegründet.


Schauen Sie sich zum Beispiel EURUSD M1 an - MT5 hat dort mehr als 6 Millionen Balken (wenn unbegrenzter Modus bei Charts), aber MT4 hat wie viele? Ein paar zehntausend M1-Balken in der aktuellen Datenbank?
 
Renat Fatkhullin:

Sie haben eine sehr unübersichtliche Testmethode, da es keinerlei Beschreibungen der Umgebung und der Wiedergabemethode gibt.

Nicht angegeben:

  • Grenzen der Balken im Fenster

  • tatsächliche Datenmengen in Terminaldatenbanken
  • Was genau ist der Server, sind die Datenbanken auf der Festplatte? Alle Daten müssen garantiert auf der Festplatte sein.
  • Plattform und Bitrate des Tests (unter wine? muss im Detail angegeben werden)
  • Verfügbarkeit offener Fenster

Ansonsten sind die Schlussfolgerungen unbegründet.


Die meisten Fragen in meinem Beitrag wurden mir bereits gestellt, kein Problem, ich werde Ihnen jetzt alle Daten geben.

zunächst einmal die Antwort auf die Frage

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

MQ-Demo-Server werden die Daten geladen, wie in Punkt 2 und Punkt 3 des vorherigen Beitrags beschrieben. Bei Punkt 1 ist alles klar, und es gibt dort keine Fragen - wie es geschrieben wurde - Daten werden geladen, Cache wird auf dem angegebenen Pfad gebildet.

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

MT4

MT5

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

MT4

MT5

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

win XP 32bit, alle MT-Builds, alle aktuellen

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

MT4 - 1 Chart öffnen, mit einem anderen Symbol prüfen

MT5 - 1 Chart geöffnet, Überprüfung mit einem anderen Symbol

Wiederholen Sie den Vorgang, laden Sie das Terminal neu, senden Sie das Skript an den Chart, wählen Sie ein ANDERES Symbol, dessen Daten geladen wurden, BEVOR Sie das Terminal neu laden.

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
 

Hier ist mein Test mit mehr Details und mehr Genauigkeit:

Beschreibung der Bedingungen
MetaTrader 4 Build 1065
MetaTrader 5 x64 Build 1580
Hardware und Betriebssystem
Windows 10 Pro x64, Intel Xeon E5-2690 v3 @ 2.60GHz, RAM: 32 Gb, SSD Festplatte
Handels-Server
MetaQuotes-Demo
MetaQuotes-Demo
Balken auf Diagrammen in den Einstellungen begrenzen
10 000
10 000
Balken in den Verlaufseinstellungen begrenzen 10 000 000
Keine Begrenzung
Tatsächliche Anzahl der Balken auf EURUSD, M1
3,382 Millionen
6,538 Millionen
Geprüftes Symbol und Punkt
EURUSD, M1
EURUSD, M1
Diagramme öffnen
GBPUSD, nur M1, das Skript wird auch auf ihn geworfen
nur GBPUSD, M1, das gleiche Skript wird auf ihn geworfen
Ergebnisse sind kalt, nach dem Start des Terminals
#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

Ergebnisse sind warm, zweiter Lauf unmittelbar nach dem ersten
#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

Die Testdateien sind beigefügt und alle Zeiten sind in Mikrosekunden angegeben (nicht in Millisekunden, 1 Millisekunde = 1000 Mikrosekunden).

Nun zu den Schlussfolgerungen:

  1. Der einzige Unterschied ist die Geschwindigkeit der anfänglichen Initialisierung des Chart-Caches - 0,6 ms für MT4 vs. 113 ms für MT5

    Das ist kein Problem - Heben kostet immer Ressourcen.
    Vor allem, wenn konzeptionell unterschiedliche Architekturen verwendet werden: MT5 verfügt über komplexere Caches (cache\*.hc-Dateien werden aus den ursprünglichen *.hcc-Dateien erstellt), um eine Skalierung zu ermöglichen, sowie über eine obligatorische vollständige Synchronisationskontrolle mit Serverdaten (binäre *.hcc-Blöcke).

  2. Wiederholte Anfragen zeigen die gleiche Geschwindigkeit - 2-3 Mikrosekunden pro Datenkopie

    Bei beiden Terminalimplementierungen gibt es keine Ausfälle und alles funktioniert schnell.
Dateien:
 

Ich danke Ihnen für Ihre Antwort.

Insgesamt sind die Ergebnisse so, wie ich sie in meinen Beiträgen dargestellt habe.

Ich habe einen regelmäßigen Test durchgeführt.

Und doch sind die Ergebnisse zwischen MT4 und MT5 fast 200-mal anders (aufgrund von -muss die vollständige Synchronisation mit Server-Daten?? und ping? ).

Ich habe mich irgendwie daran gewöhnt, bevor ich hier gepostet habe, dass es wahrscheinlich eine Funktion des Terminals ist. Ich kann sogar damit leben, aber es ist an manchen Stellen schwierig. Da es zum Beispiel keinen Market-Screener in MT gibt, habe ich ein kleines Skript geschrieben, das Symbole zur Marktbeobachtung hinzufügt, aber die Preise sind nur über CopyClose verfügbar, sie sind nicht über SymbolInfoDouble oder über MqlTick verfügbar, bis das Symbol zur Beobachtung hinzugefügt wird, so dass dieses Skript "unendlich" lange läuft , wenn es mit einem sehr großen Einsatz ausgeführt wird. Dies ist nur ein Beispiel.