Errori, bug, domande - pagina 1850

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

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

un bug quando si usa uno styler?

Supponiamo di scrivere usando la scheda.

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

Non c'è nessun errore.

poi usiamo lo styler, otteniamo

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

cioè, lo styler cancella lo spazio traTWO_DIM(10000)

 
Errore di compilazione
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
}
 
Una piccola punta di cappello. Bypassare l'operatore di assegnazione
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);  
}

Risultato

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

Qual è il modo giusto?

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

void OnStart()
{
  STRUCT Struct;
  
  Struct.operator[]<int>(0); // Нормально
  Struct[0]<int>;            // Ошибка
}
 
un'altra domanda - ho capito che in MT5 il primo tempo di copia del buffer CopyClose dipende da:

1. se prima non ricevevi affatto le quotazioni di un ticker, non aprivi un grafico ecc. (dipende dal ping, dalla velocità di internet, dal disco rigido, dalla preparazione del file 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. se le quotazioni sono state ricevute in precedenza e poi il terminale è stato ricaricato, sempre che non sia stato aperto nessun grafico di questo ticker (preparazione del file 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

il tempo è 10-15 volte inferiore a p.1


per il confronto il tempo di accesso in МТ4 secondo il punto 2, cioè dopo il reset del terminale

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;

cioè il tempo dopo il riavvio del terminale MT4 è di qualche ordine di grandezza inferiore.

Questa volta ho controllato tutto su Windows, senza SSD!

Quando ho ottenuto le citazioni, il terminale non è stato riavviato, i dati sono stati acceduti

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

Ho capito bene che dopo aver caricato la cache, il terminale ha bisogno di molto meno tempo per ulteriori richieste (a partire dalla 2a richiesta)?

Possiamo in qualche modo ridurre il tempo della prima chiamata dopo il riavvio del terminale per renderlo come in MT4?

Il codice era in https://www.mql5.com/ru/forum/1111/page1870#comment_4856899

Ошибки, баги, вопросы
Ошибки, баги, вопросы
  • www.mql5.com
Форум алго-трейдеров MQL5
 
kaus_bonus:
Ho un'altra domanda - ho capito che su MT5 il primo tempo di copia dello stesso buffer CopyClose dipende da:

Avete un metodo di prova molto sporco, poiché non c'è alcuna descrizione dell'ambiente e del metodo di riproduzione.

Non specificato:

  • limiti della barra nella finestra
  • volumi di dati effettivi nei database terminali
  • esattamente quale server, i database sono su disco? tutti i dati devono essere garantiti su disco.
  • piattaforma e bit rate di test (sotto wine? è necessario specificare nei dettagli)
  • finestre aperte

Senza questo le conclusioni sono infondate.


Per esempio guardate EURUSD M1 - MT5 ha più di 6 milioni di barre lì (se la modalità illimitata ai grafici), ma MT4 quante ne ha? Un paio di decine di migliaia di barre M1 nel database attuale?
 
Renat Fatkhullin:

Avete un metodo di prova molto disordinato, poiché non ci sono affatto descrizioni dell'ambiente e del metodo di riproduzione.

Non specificato:

  • limiti di barre nella finestra

  • volumi di dati effettivi nei database terminali
  • cos'è esattamente il server, le basi sono su disco? tutti i dati devono essere garantiti su disco.
  • piattaforma e bit rate di test (sotto wine? è necessario specificare nei dettagli)
  • disponibilità di finestre aperte

Senza questo le conclusioni sono infondate.


Mi è stata posta la maggior parte delle domande nel mio post, nessun problema, vi darò tutti i dati ora.

prima di tutto la risposta al

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

MQ-demo server, i dati vengono caricati, come stiamo parlando del punto 2 e del punto 3 nel post precedente. Con il punto 1 tutto è chiaro, e non ci sono domande - come è stato scritto - i dati vengono caricati, la cache si forma sul percorso specificato.

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

MT4

MT5

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

MT4

MT5

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

win XP 32bit, tutte le build di MT tutte le ultime

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

MT4 - aprire 1 grafico, controllare con un altro simbolo

MT5 - 1 grafico aperto, controllare con un altro simbolo

ripetere, ricaricare il terminale, inviare lo script al grafico, selezionare ALTRO simbolo, i cui dati sono stati caricati PRIMA di ricaricare il terminale

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
 

Ecco il mio test con più dettagli e più precisione:

Descrizione delle condizioni
MetaTrader 4 build 1065
MetaTrader 5 x64 build 1580
Hardware e sistema operativo
Windows 10 Pro x64, Intel Xeon E5-2690 v3 @ 2.60GHz, RAM: 32 Gb, disco SSD
Server commerciale
MetaQuotes-Demo
MetaQuotes-Demo
Limitare le barre sui grafici nelle impostazioni
10 000
10 000
Limitare le barre nelle impostazioni della cronologia 10 000 000
Nessun limite
Numero effettivo di barre su EURUSD, M1
3,382 milioni
6,538 milioni
Simbolo e periodo verificati
EURUSD, M1
EURUSD, M1
Grafici aperti
GBPUSD, solo M1, lo script è lanciato anche su di esso
solo GBPUSD, M1, lo stesso script viene lanciato su di esso
I risultati sono freddi, dopo l'avvio del terminale
#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

I risultati sono tiepidi, la seconda corsa subito dopo la prima
#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

I file di prova sono allegati e tutti i tempi sono in microsecondi (non millisecondi, 1 millisecondo = 1000 microsecondi).

Ora le conclusioni:

  1. L'unica differenza è la velocità di inizializzazione della cache dei grafici - 0,6 ms per MT4 contro 113 ms per MT5

    Nessun problema qui - il sollevamento costa sempre risorse.
    Soprattutto quando si usano architetture concettualmente diverse: MT5 ha cache più complesse (i file cache\*.hc sono costruiti da *.hcc originali) per il bene della scalabilità + controllo obbligatorio della sincronizzazione completa con i dati del server (chunks *.hcc binari).

  2. Richieste ripetute mostrano una velocità identica - 2-3 microsecondi per la copia dei dati

    Non ci sono fallimenti nell'implementazione di entrambi i terminali e tutto funziona velocemente.
File:
 

Grazie per la vostra risposta.

Nel complesso, i risultati sono quelli che ho mostrato nei miei post.

Ho fatto dei test su uno regolare.

Eppure i risultati tra MT4 e MT5 sono quasi 200 volte diversi (a causa di -deve controllare la sincronizzazione completa con i dati del server e il ping? ).

Mi sono abituato prima di postare qui che probabilmente è una caratteristica del terminale. Posso anche conviverci, ma è difficile in alcuni punti. Per esempio, i prezzi sono disponibili solo tramite CopyClose, non sono disponibili tramite SymbolInfoDouble o tramite MqlTick fino a quando il simbolo viene aggiunto al mercato che guarda, quindi questo script gira "all'infinito" molto dopo l'inizio del terminale. Questo è solo un esempio.