Erros, bugs, perguntas - página 2646

 
Andrei Trukhanovich :

porque o modelo só produz tipos por parâmetro, não por valor de saída.

Isto não é exacto.

struct A
  {
   int               i;
   double            d;
  };

template<typename T>
T f(int value)
  {
   T result={0};
   return(result);
  }
//+------------------------------------------------------------------+
void OnStart()
  {
   A a;
   int i = 1;
   a = f<A>(i);
  }
 
Alain Verleyen:

Isso não é certo.

Obrigado!

Sim, vai funcionar, ficou confuso na sintaxe

ZS: tudo como se pretende agora funciona:

struct A
  {
   long              l;
   uint              ui;
  };
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
  {
   A a;
   uchar u_arr[];
   string result = "";
   a.l  = 0xFFFFFFFFFFFFFFFF;
   a.ui = 0x0000;
//--- проверка работоспособности вывода
   StructToCharArray(a, u_arr);
   for(int i = 0; i < ArraySize(u_arr); i++)
     {
      result += StringFormat("%x", u_arr[i]);
     }
   printf("result = %s", result);   // result = ffffffffffffffff0000

//----  
   string s = StructEncodeBase64(a);
   Print(s);
   A b;
   b = StructDecodeBase64<A>(s);

   StructToCharArray(b, u_arr);
   result="";
   for(int i = 0; i < ArraySize(u_arr); i++)
     {
      result += StringFormat("%x", u_arr[i]);
     }
    printf("result = %s", result);

  }
//+------------------------------------------------------------------+
template<typename T>
string StructEncodeBase64(T &s_value)
  {
   const uchar key[1] = {0};
   uchar data[], result[];
   StructToCharArray(s_value, data);
   CryptEncode(CRYPT_BASE64, data, key, result);
   return(CharArrayToString(result));
  }
//+------------------------------------------------------------------+
template<typename T>
T StructDecodeBase64(string value)
  {
   const uchar key[1] = {0};
   uchar data[], decode[];
   T result;
   StringToCharArray(value, data, 0, StringLen(value));
   CryptDecode(CRYPT_BASE64, data, key, decode);
   CharArrayToStruct(result, decode);
   return(result);
  }
Serialização em série das estruturas POD base64
 
Alain Verleyen:

Isso não é certo.

Não, não é. Notou a definição explícita dos tipos de parâmetros do modelo na função, e eu estava a falar de saída, sobre a definição explícita fxsaber respondeu antes de mim e antes de si

 
Andrei Trukhanovich :

Não, é isso mesmo. Notou a definição explícita dos tipos de parâmetros do modelo na função, e eu estava a falar de saída, sobre a definição explícita fxsaber respondeu antes de mim e antes de si

Problema linguístico.
 

Não consegui encontrá-lo no fórum ou nos documentos, por isso tenho uma pergunta a fazer:

1. Qual é o tamanho máximo de cordel que a MQL5 pode armazenar?

2. Qual é o tamanho máximo de cordel que a MQL4 pode armazenar?

3. se não houver memória suficiente, este tamanho máximo será reduzido (ou não haverá memória alocada para uma string) ou ocorrerá um erro de tempo de execução ?

 

Defeitos:
(não corrigido pelo MT5(build 2319)) bug na operação de cache da classe modelo: "Cria-se várias vezes um objecto complexo embrulhado com tipo interno "C", e acaba por ser um tipo de dados bastante diferente, talvez "B", talvez "int", o que se quiser...".
(não corrigido pelo MT5(build 2319)) bug com geração de código de classe modelo quando se usa a classe interna.
(não corrigido MT5(build 2319)) bug ao definir a classe interna - sem capacidade de referenciar explicitamente o espaço de nomes global ao especificar uma classe base.


Sugestões:
ref - sobre a necessidade de introduzir a funcionalidade de declaração de typedef na MQL.
Referência- para permitir a geração forçada de construtores de cópias por defeito e operadores de cessão.

 
Sergey Dzyublik:

Defeitos:

É bom para si por manter um registo dos seus relatórios de erros. Não o fiz, foi por isso que tudo se perdeu irremediavelmente no fórum.

Talvez devesse adicionar algum do mesmo registo de hash às suas mensagens de relatório de bugs, para que possa procurá-los todos de uma só vez.

 
Igor Makanu:

Não consegui encontrá-lo no fórum ou nas docas, por isso tenho uma pergunta a fazer:

1. Qual é o tamanho máximo de cordel que a MQL5 pode armazenar?

2. Qual é o tamanho máximo de cordel que a MQL4 pode armazenar?

3. se não houver memória suficiente, este tamanho máximo será reduzido (ou não haverá memória alocada para string) ou haverá um erro de tempo de execução ?

tentou testar uma corda no MT4

void OnTick()
  {
   static bool frun = true;
   uchar u_arr[102400];
   if(frun)
     {
      frun = false;
      string s = "";
      while(!IsStopped())
        {
         ArrayInitialize(u_arr, uchar(rand() % 255));
         s += CharArrayToString(u_arr);
         printf("StringLen = %i , m_physical = %i, m_total = %i, m_available = %i, m_used = %i", StringLen(s), TerminalInfoInteger(TERMINAL_MEMORY_PHYSICAL), TerminalInfoInteger(TERMINAL_MEMORY_TOTAL),
                TerminalInfoInteger(TERMINAL_MEMORY_AVAILABLE), TerminalInfoInteger(TERMINAL_MEMORY_USED));
         Sleep(150);
        }
     }
  }
//+------------------------------------------------------------------+

A memória vaza lentamente (5,1 de 11,9), em MT4 no diário de bordo:

StringLen = 221696000 , m_physical = 12157, m_total = 4095, m_disponível = 3365, m_utilizado = 729


em geral, para tarefas sensatas, pode usar uma grande cadeia, talvez mais tarde eu copie o ficheiro através de uma cadeia para verificar

UPD: substituiuuchar u_arr[102400]; por uchar u_arr[524224]; para acelerar o processo

Conclusão: em MT4, o máximo aproximado que pode ser posto em cordel é:

2020.02.13 21:11:24.177 tst_string EURUSD,H1: fora de memória

2020.02.13 21:11:24.024 tst_string EURUSD,H1: StringLen = 640601728 , m_physical = 12157, m_total = 4095, m_disponível = 2556, m_utilizado = 1539


ou seja, cerca de 640 MB

SZZ: MT5

2020.02.13 21:56:12.964 tst_string (EURUSD,H1) StringLen = 1073610752 , m_physical = 12157, m_total = 24314, m_disponível = 21975, m_utilizado = 2339

2020.02.13 21:56:13.140 tst_string (EURUSD,H1) fora de memória em 'tst_string.mq5' (41,12)

ou seja, cerca de 1GB
 
Igor Makanu :

tentou testar cadeia no MT4

A memória está a vazar um pouco em Win Manager (5,1 de 11,9), em MT4 no diário de bordo:

StringLen = 221696000 , m_physical = 12157, m_total = 4095, m_disponível = 3365, m_utilizado = 729


em geral, para tarefas sensatas, pode usar uma grande cadeia, talvez mais tarde eu copie o ficheiro através de uma cadeia para verificar

UPD: substituiu uchar u_arr[ 102400 ]; por uchar u_arr[524224]; para acelerar o processo

Resumindo: em MT4 o máximo aproximado que pode ser posto em cordel é:

2020.02.13 21:11:24.177 tst_string EURUSD,H1: fora de memória

2020.02.13 21:11:24.024 tst_string EURUSD,H1: StringLen = 640601728 , m_physical = 12157, m_total = 4095, m_disponível = 2556, m_utilizado = 1539


ou seja, cerca de 640 MB

SZZ: MT5

2020.02.13 21:56:12.964 tst_string (EURUSD,H1) StringLen = 1073610752 , m_physical = 12157, m_total = 24314, m_disponível = 21975, m_utilizado = 2339

2020.02.13 21:56:13.140 tst_string (EURUSD,H1) fora de memória em 'tst_string.mq5' (41,12)

ou seja, cerca de 1GB

Este é o comprimento de corda para Unicode, por isso em MB é pelo menos o dobro. 1,3 GB para MT4, o que faz sentido uma vez que é necessário um buffer de memória contínuo e MT4 é uma aplicação de 32 bits. Assim, a limitação mql4 não é uma limitação em si mesma, mas é apenas limitada pela memória disponível.

Estou um pouco surpreendido que o MT5 não permita mais, pois parece que tem muita memória disponível. Vou tentar o meu melhor do meu lado.

 
Alain Verleyen:

Este é o comprimento de corda para Unicode, por isso em MB é pelo menos o dobro. 1,3 GB para MT4, o que faz sentido uma vez que é necessário um buffer de memória contínuo e MT4 é uma aplicação de 32 bits. Assim, a limitação do mql4 em si não é uma limitação, é apenas limitada pela memória disponível.

Estou um pouco surpreendido que o MT5 não permita mais, pois parece que tem muita memória disponível. Vou tentar o meu melhor do meu lado.

tenho 12gb de memória, Windows 10 , memória livre cerca de 8gb


precisava deste teste para descobrir o comprimento máximo de linha permitido em terminais mt4/ mt5

Quero agora trocar entre terminais através da base de dados Redis

Redis é uma base de dados muito simples e funciona apenas com cordas (chave - valor --> corda - corda)

Ontem, eu serializei as estruturas POD na Base64 e aumenta o tamanho dos dados em cerca de 1/3

Penso que mesmo neste caso tenho a possibilidade de trocar estruturas com um tamanho de 400 Mb por transacção - isso é mais do que suficiente para qualquer propósito! ;)

Razão: