Erros, bugs, perguntas - página 2469

 

Eu saberei) então hackear

 

Estou a transferir um programa da MQL4 para a MQL5.

Enfrentei este erro.

Em prazos até m30, o valor Period() está correcto.

2019.05.22 17:45:38.628 TestStat (GBPUSD,M15) 4854 Período()=15
2019.05.22 17:46:08.267 TestStat (GBPUSD,M30) 4854 Período()=30

A partir do período de tempo H1 obtenho valores incompreensíveis.

2019.05.22 17:31:07.446 TestStat (GBPUSD,H1) 4854 Período()=16385
2019.05.22 17:46:39.362 TestStat (GBPUSD,H4) 4854 Período()=16388
2019.05.22 17:46:55.552 TestStat (GBPUSD,D1) 4854 Período()=16408

Versão terminal construída 2057 datada de 21 de Maio de 2019.

 

Obrigado.

Na descrição:

Período

Devolve o valor temporal do gráfico actual.

PeríodoENUM_TIMEFRAMES();

Valor devolvido

Conteúdo da variável _Periodo , contendo o valor temporal do gráfico actual. Ovalor pode ser um dos valores daenumeração de ENUM_TIMEFRAMES.

Ver também

PeríodoSegundos, Períodos do Gráfico, Data e Hora, , Visibilidade do Objecto

=================

Isso não está muito bem feito. Deve ser correctamente escrito na descrição. Não se deve procurar a origem do problema no fórum.

Acontece que o Period() não dá o valor do prazo actual como diz:O valor pode ser um dos valores da enumeração ENUM_TIMEFRAMES.

É algo completamente diferente.

Por favor, corrija a descrição linguística para os criadores.

 
Mais uma vez obrigado aoTheXpert por ter fornecido o código.
Temos os seguintes resultados no ArrayResize capacidade MT5(build 2057):

#import "msvcrt.dll"
  long memcpy(int &dst[], long &src, int cnt);
#import

#define  PRINT(x) ; Print(#x, ":", string(x))

template<typename T>
struct ArrayStore
{
   long offset;
   T x[];
   
   int capacity() 
   {
      int ints[sizeof(ArrayStore) / sizeof(int)];
      memcpy(ints, this.offset, sizeof(ArrayStore));
      return ints[8];
   }
   
   int size() 
   {
      int ints[sizeof(ArrayStore) / sizeof(int)];
      memcpy(ints, this.offset, sizeof(ArrayStore));
      return ints[4];
   }
};

template<typename T>
int TestArrayCapacity(ArrayStore<T> &store, int size, int reserved_size = 0){
   ArrayResize(store.x, size, reserved_size);
   return store.capacity(); 
}

template<typename T>
int TestArraySize(ArrayStore<T> &store, int size, int reserved_size = 0){
   ArrayResize(store.x, size, reserved_size);
   return store.size(); 
}


void OnStart()
{
   ArrayStore<int> store;
   
   PRINT("TEST_ArrayCapacity");
   
   PRINT(TestArrayCapacity(store, 100, 0)); 
   PRINT(TestArrayCapacity(store, 100, 100)); 
   PRINT(TestArrayCapacity(store, 101, 100)); 
   PRINT(TestArrayCapacity(store, 200, 100)); 
   PRINT(TestArrayCapacity(store, 201, 100)); 
   PRINT(TestArrayCapacity(store, 202, 100)); 
   PRINT(TestArrayCapacity(store, 100,   1)); 
   PRINT(TestArrayCapacity(store, 100, 400)); 
   PRINT(TestArrayCapacity(store, 300, 400)); 
   PRINT(TestArrayCapacity(store, 301, 600));
   PRINT(TestArrayCapacity(store, 302, 600));
   PRINT(TestArrayCapacity(store, 303, 600));
   PRINT(TestArrayCapacity(store, 100,   0)); 
   PRINT(TestArrayCapacity(store, 100, 100)); 
   PRINT(TestArrayCapacity(store, 100,  -1)); 
   PRINT(TestArrayCapacity(store, 100, 100)); 
   PRINT(TestArrayCapacity(store, 105, 100)); 
}

Resultado:
2019.05.22 17:00:50.249 Test_array_resize (EURUSD,H1)   TEST_ArrayCapacity:TEST_ArrayCapacity
2019.05.22 17:00:50.249 Test_array_resize (EURUSD,H1)   TestArrayCapacity(store,100,0):100
2019.05.22 17:00:50.249 Test_array_resize (EURUSD,H1)   TestArrayCapacity(store,100,100):100
2019.05.22 17:00:50.249 Test_array_resize (EURUSD,H1)   TestArrayCapacity(store,101,100):201
2019.05.22 17:00:50.249 Test_array_resize (EURUSD,H1)   TestArrayCapacity(store,200,100):201
2019.05.22 17:00:50.249 Test_array_resize (EURUSD,H1)   TestArrayCapacity(store,201,100):201
2019.05.22 17:00:50.249 Test_array_resize (EURUSD,H1)   TestArrayCapacity(store,202,100):302
2019.05.22 17:00:50.249 Test_array_resize (EURUSD,H1)   TestArrayCapacity(store,100,1):302
2019.05.22 17:00:50.249 Test_array_resize (EURUSD,H1)   TestArrayCapacity(store,100,400):302
2019.05.22 17:00:50.249 Test_array_resize (EURUSD,H1)   TestArrayCapacity(store,300,400):302
2019.05.22 17:00:50.249 Test_array_resize (EURUSD,H1)   TestArrayCapacity(store,301,600):302
2019.05.22 17:00:50.249 Test_array_resize (EURUSD,H1)   TestArrayCapacity(store,302,600):302
2019.05.22 17:00:50.249 Test_array_resize (EURUSD,H1)   TestArrayCapacity(store,303,600):903
2019.05.22 17:00:50.249 Test_array_resize (EURUSD,H1)   TestArrayCapacity(store,100,0):903
2019.05.22 17:00:50.249 Test_array_resize (EURUSD,H1)   TestArrayCapacity(store,100,100):903
2019.05.22 17:00:50.250 Test_array_resize (EURUSD,H1)   TestArrayCapacity(store,100,-1):100
2019.05.22 17:00:50.250 Test_array_resize (EURUSD,H1)   TestArrayCapacity(store,100,100):100
2019.05.22 17:00:50.250 Test_array_resize (EURUSD,H1)   TestArrayCapacity(store,105,100):205
 
Eugeni Neumoin:

Descrição:

Conteúdo da variável _Periodo , que armazena o valor temporal do gráfico actual. O valor pode ser um dos valores daenumeração de ENUM_TIMEFRAMES.

Isto não se faz bem. Deve ser correctamente escrito na descrição. Não se deve procurar a origem do problema no fórum.

Portanto, não está escrito em lado nenhum que este valor seja igual ao período em minutos (como estava em quad).

https://www.mql5.com/ru/articles/81

É aí que começa o artigo de ligação.

Переход с MQL4 на MQL5
Переход с MQL4 на MQL5
  • www.mql5.com
Данная статья, построенная в форме справочника по функциям MQL4, призвана помочь переходу с MQL4 на MQL5. Для каждой функции языка MQL4 приведено описание и представлен способ ее реализации на MQL5, что позволит вам значительно ускорить перевод своих программ с MQL4 на MQL5. Для удобства функции разбиты на группы, как в документации по MQL4.
 
Igor Zakharov:

Por isso, em lado nenhum diz que este valor é igual ao período em minutos (como foi em quatro).

https://www.mql5.com/ru/articles/81

É aqui que começa o artigo sobre a ligação.

Há uma descrição linguística que diz: O valor pode ser um dos valores daenumeração de ENUM_TIMEFRAMES.

Ver a descrição da língua mais abaixo:

Períodos gráficos

Todos os períodos gráficos pré-definidos têm identificadores únicos. O identificador PERIOD_CURRENT significa o período actual do gráfico, em que o programa mql5 está a decorrer.

ENUM_TIMEFRAMES

Identificador

Descrição

PERÍODO_CURSO

Período actual

PERÍODO_M1

1 minuto

PERÍODO_M2

2 minutos

PERÍODO_M3

3 minutos

PERÍODO_M4

4 minutos

PERÍODO_M5

5 minutos

PERÍODO_M6

6 minutos

PERÍODO_M10

10 minutos

PERÍODO_M12

12 minutos

PERÍODO_M15

15 minutos

PERÍODO_M20

20 minutos

PERÍODO_M30

30 minutos

PERÍODO_H1

1 hora

PERÍODO_H2

2 horas

PERÍODO_H3

3 horas

PERÍODO_H4

4 horas

PERÍODO_H6

6 horas

PERÍODO_H8

8 horas

PERÍODO_H12

12 horas

PERÍODO_D1

1 dia

PERÍODO_W1

1 semana

PERÍODO_MN1

1 mês

======================

E em nenhuma parte da descrição diz que este valor é em segundos.

A descrição deve dizer tudo.

E quando se tem de procurar outros artigos, é uma pena.

 
Sergey Dzyublik:
Mais uma vez obrigado aoTheXpert por ter fornecido o código.
Temos os seguintes resultados no ArrayResize capacidade MT5(build 2057):
Assim, conclusões sobre o desempenho do ArrayResize e o impacto na capacidade real:

1. o primeiro ArrayResize é muito importante, ele realmente atribui memória tendo em conta o tamanho + tamanho_reservado e define a capacidade.
2. Todas as execuções ArrayResize subsequentes com um novo valor de tamanho_reservado não têm qualquer efeito sobre a quantidade de memória e capacidade atribuídas, respectivamente.
3 A nova alocação de memória é executada apenas quando a capacidade é excedida e, neste caso, o tamanho + tamanho_reservado é utilizado novamente para determinar a quantidade de memória alocada e definir uma nova capacidade.
4. Um valor de tamanho_reservado < 0 libera a memória reservada para o tamanho.
 
Eugeni Neumoin:

E em nenhuma parte da descrição diz que este valor é em segundos.

Portanto, não é em segundos...

 
Eugeni Neumoin:

Há uma descrição linguística que diz: O valor pode ser um dos valores daenumeração de ENUM_TIMEFRAMES.

Ver mais na descrição da língua:

Períodos gráficos

Todos os períodos gráficos pré-definidos têm identificadores únicos. O identificador PERIOD_CURRENT significa o período actual do gráfico, em que o programa mql5 está em execução.

ENUM_TIMEFRAMES

======================

E em nenhuma parte da descrição diz que este valor é em segundos.

A descrição deve dizer tudo.

E quando se tem de passar por alguns outros artigos, é uma pena.

Quem lhe disse que estes são valores em segundos?

 
Eugeni Neumoin :

Há uma descrição linguística que diz: O valor pode ser um dos valores da enumeração ENUM_TIMEFRAMES.

Ver mais na descrição da língua:

Períodos gráficos

Todos os períodos gráficos pré-definidos têm identificadores únicos. O identificador PERIOD_CURRENT denota o período actual do gráfico, em que o programa mql5 está em execução.

ENUM_TIMEFRAMES

Identificador

Descrição

PERÍODO_CURSO

Período actual

PERÍODO_M1

1 minuto

PERÍODO_M2

2 minutos

PERÍODO_M3

3 minutos

PERÍODO_M4

4 minutos

PERÍODO_M5

5 minutos

PERÍODO_M6

6 minutos

PERÍODO_M10

10 minutos

PERÍODO_M12

12 minutos

PERÍODO_M15

15 minutos

PERÍODO_M20

20 minutos

PERÍODO_M30

30 minutos

PERÍODO_H1

1 hora

PERÍODO_H2

2 horas

PERÍODO_H3

3 horas

PERÍODO_H4

4 horas

PERÍODO_H6

6 horas

PERÍODO_H8

8 horas

PERÍODO_H12

12 horas

PERÍODO_D1

1 dia

PERÍODO_W1

1 semana

PERÍODO_MN1

1 mês

======================

E em nenhuma parte da descrição diz que este valor é em segundos.

A descrição deve dizer tudo.

E quando se tem de passar por alguns outros artigos, é uma pena.

Nunca se deve contar com um valor de enumeração.

Usar PeriodSeconds().

Razão: