Erros, bugs, perguntas - página 1850

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

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

um insecto quando se usa um modelador?

Vamos supor que estávamos a escrever usando o separador.

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

Não há erro.

depois usamos o estilizador, obtemos

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

ou seja, o modelador apaga o espaço entre oTWO_DIM(10000)

 
Erro de compilação
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
}
 
Uma pequena ponta do chapéu. Contornar o operador de atribuição
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);  
}

Resultado

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

Qual é o caminho certo?

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

void OnStart()
{
  STRUCT Struct;
  
  Struct.operator[]<int>(0); // Нормально
  Struct[0]<int>;            // Ошибка
}
 
outra questão - compreendo que em MT5 a hora da primeira cópia do copyClose tampão depende de:

1. se anteriormente não recebeu qualquer cotação para um tic-tac, não abriu um gráfico, etc. (depende do ping, velocidade da Internet, disco rígido, preparação do ficheiro Bases/Broker/histórico/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 as aspas tiverem sido previamente recebidas e depois o terminal tiver sido recarregado, desde que não tenha sido aberto nenhum gráfico deste ticker (preparação do ficheiro Bases/Base/Broker/História/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

o tempo é 10-15 vezes menos do que p.1


para comparação o tempo de acesso em МТ4 de acordo com o ponto 2, ou seja, após o reset do 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;

ou seja, o tempo após o reinício do terminal MT4 é de algumas ordens de magnitude a menos.

Desta vez verifiquei tudo no Windows, sem SSD!

Se obtive as citações, o terminal não foi reinicializado, os dados foram acedidos

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

Acertei que depois de carregar a cache, o terminal precisa de muito menos tempo para mais pedidos (a partir do 2º pedido)?

Podemos de alguma forma reduzir o tempo para a primeira chamada após o reinício do terminal para o fazer como no MT4?

O código estava em https://www.mql5.com/ru/forum/1111/page1870#comment_4856899

Ошибки, баги, вопросы
Ошибки, баги, вопросы
  • www.mql5.com
Форум алго-трейдеров MQL5
 
kaus_bonus:
Tenho outra pergunta - compreendo que no MT5 o tempo de primeira cópia do mesmo buffer CopyClose depende do tempo de cópia:

Tem um método de teste muito sujo, uma vez que não existe qualquer descrição do ambiente e do método de reprodução.

Não especificado:

  • Limites de barras na janela
  • volumes de dados reais nas bases de dados do terminal
  • exactamente que servidor, são as bases de dados em disco? todos os dados devem ter a garantia de estar em disco.
  • plataforma e taxa de bits de teste (em vinho? precisa de especificar em detalhes)
  • janelas abertas

Sem isto, as conclusões são infundadas.


Por exemplo, veja EURUSD M1 - MT5 tem lá mais de 6 milhões de barras (se ilimitado no modo em gráficos), mas MT4 tem quantas? Um par de dezenas de milhares de barras M1 na base de dados real?
 
Renat Fatkhullin:

Tem um método de teste muito confuso, uma vez que não há qualquer descrição do ambiente e do método de reprodução.

Não especificado:

  • limites das barras na janela

  • volumes de dados reais em bases de dados terminais
  • o que é exactamente o servidor, são as bases no disco? todos os dados devem ser garantidos de estarem em disco.
  • plataforma e taxa de bits de teste (em vinho? precisa de especificar em detalhes)
  • disponibilidade de janelas abertas

Sem isso as conclusões são infundadas.


Fiz a maioria das perguntas no meu posto, sem problemas, vou dar-vos agora todos os dados.

primeiro de tudo a resposta ao

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

servidor MQ-demo, os dados são carregados, pois estamos a falar do ponto 2 e do ponto 3 no post anterior. Com o ponto 1 tudo é claro e não há dúvidas - como foi escrito - os dados são carregados, a cache é formada no caminho especificado.

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

MT4

MT5

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

MT4

MT5

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

ganhar XP 32bit, todas as construções de MT todas as mais recentes

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

MT4 - abrir 1 gráfico, verificar com outro símbolo

MT5 - 1 gráfico aberto, verificar com outro símbolo

repetir, recarregar o terminal, enviar o script para a carta, seleccionar OUTRO símbolo, cujos dados foram carregados ANTES de recarregar o 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
 

Aqui está o meu teste com mais detalhe e mais precisão:

Descrição das condições
MetaTrader 4 construir 1065
MetaTrader 5 x64 construir 1580
Hardware e Sistema Operacional
Windows 10 Pro x64, Intel Xeon E5-2690 v3 @ 2.60GHz, RAM: 32 Gb, SSD Disco
Servidor comercial
MetaQuotes-Demo
MetaQuotes-Demo
Barras de limite nos gráficos em cenários
10 000
10 000
Limite de barras em configurações de história 10 000 000
Sem limite
Número real de barras no EURUSD, M1
3,382 milhões
6,538 milhões
Símbolo e período verificados
EURUSD, M1
EURUSD, M1
Gráficos abertos
GBPUSD, M1 apenas, o guião também é atirado sobre ele
apenas GBPUSD, M1, o mesmo guião é atirado sobre ele
Os resultados são frios, após o início do 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

Os resultados são quentes, segunda corrida imediatamente após a primeira
#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

Os ficheiros dos testes são anexados e estão sempre em microssegundos (não milissegundos, 1 milissegundo = 1000 microssegundos).

Agora as conclusões:

  1. A única diferença é a velocidade de inicialização inicial da cache do gráfico - 0,6 ms para MT4 vs. 113 ms para MT5

    Aqui não há problema - o levantamento custa sempre recursos.
    Especialmente quando são usadas arquitecturas conceptualmente diferentes: MT5 tem caches mais complexos (os ficheiros *.hc são construídos a partir de *.hcc originais) para o bem da escala + controlo de sincronização total obrigatório com os dados do servidor (binários *.hcc em pedaços).

  2. Pedidos repetidos mostram velocidade idêntica - 2-3 microssegundos por cópia de dados

    Não há falhas na implementação de ambos os terminais e tudo funciona rapidamente.
Arquivos anexados:
 

Obrigado pela sua resposta.

Globalmente, os resultados são os que mostrei nos meus cargos.

Tenho estado a testar regularmente.

E ainda assim os resultados entre MT4 e MT5 são quase 200 vezes diferentes (devido a -deve controlar a sincronização total com os dados do servidor?? e ping? ).

Habituei-me a isso antes de afixar aqui que é provavelmente uma característica do terminal. Posso até viver com isso, mas é difícil em alguns pontos. Por exemplo, como não há nenhum ecrã de mercado no MT, escrevi um pequeno guião, que acrescenta símbolos ao relógio do mercado, mas os preços só estão disponíveis via CopyClose, não estão disponíveis via SymbolInfoDouble ou via MqlTick até que o símbolo seja acrescentado ao relógio, por isso este guião corre "infinitamente" quando corre com uma aposta muito grande. Isto é apenas um exemplo.