Errori, bug, domande - pagina 2469

 

Lo saprò) poi hackerare

 

Sto trasferendo un programma da MQL4 a MQL5.

Ho affrontato questo errore.

Sui timeframe fino a m30 il valore di Period() è corretto.

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

Dal timeframe H1 ottengo valori incomprensibili.

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

Versione terminale build 2057 del 21 maggio 2019.

 

Grazie.

Nella descrizione:

Periodo

Restituisce il valore del timeframe del grafico corrente.

ENUM_TIMEFRAMESPeriodo();

Valore restituito

Contenuto della variabile _Period , che contiene il valore del timeframe del grafico corrente. Ilvalore può essere uno dei valori dell'enumerazione ENUM_TIMEFRAMES.

Vedi anche

PeriodSeconds, Chart Periods, Date and Time, , Object Visibility

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

Questo non è fatto molto bene. Dovrebbe essere scritto correttamente nella descrizione. Non dovreste cercare la fonte del problema sul forum.

Si scopre che Period() non darà il valore del timeframe corrente come dice:Il valore può essere uno dei valori dell'enumerazione ENUM_TIMEFRAMES.

È qualcosa di completamente diverso.

Si prega di correggere la descrizione della lingua per gli sviluppatori.

 
Grazie ancora aTheXpert per aver fornito il codice.
Abbiamo i seguenti risultati su ArrayResize capacità 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)); 
}

Risultato:
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:

Descrizione:

Contenuto della variabile _Period , che memorizza il valore del timeframe del grafico corrente. Il valore può essere uno dei valori dell'enumerazione ENUM_TIMEFRAMES.

Questo non è fatto bene. Dovrebbe essere scritto correttamente nella descrizione. Non dovreste cercare la fonte del problema sul forum.

Quindi non c'è scritto da nessuna parte che questo valore è uguale al periodo in minuti (come era in quad).

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

È da qui che parte l'articolo del link.

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

Quindi non c'è scritto da nessuna parte che questo valore è uguale al periodo in minuti (come lo era in quattro).

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

Qui inizia l'articolo del link.

C'è una descrizione del linguaggio che dice: Il valore può essere uno dei valori dell'enumerazione ENUM_TIMEFRAMES.

Vedere la descrizione della lingua più in basso:

Periodi del grafico

Tutti i periodi predefiniti del grafico hanno identificatori unici. L'identificatore PERIOD_CURRENT indica il periodo corrente del grafico in cui il programma mql5 è in esecuzione.

ENUM_TIMEFRAMES

Identificatore

Descrizione

PERIODO_CORRENTE

Periodo corrente

PERIODO_M1

1 minuto

PERIODO_M2

2 minuti

PERIODO_M3

3 minuti

PERIODO_M4

4 minuti

PERIODO_M5

5 minuti

PERIODO_M6

6 minuti

PERIODO_M10

10 minuti

PERIODO_M12

12 minuti

PERIODO_M15

15 minuti

PERIODO_M20

20 minuti

PERIODO_M30

30 minuti

PERIODO_H1

1 ora

PERIODO_H2

2 ore

PERIODO_H3

3 ore

PERIODO_H4

4 ore

PERIODO_H6

6 ore

PERIODO_H8

8 ore

PERIODO_H12

12 ore

PERIODO_D1

1 giorno

PERIODO_W1

1 settimana

PERIODO_MN1

1 mese

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

E da nessuna parte nella descrizione si dice che questo valore è in secondi.

La descrizione dovrebbe dire tutto.

E quando devi cercare altri articoli, è un peccato.

 
Sergey Dzyublik:
Grazie ancora aTheXpert per aver fornito il codice.
Abbiamo i seguenti risultati su ArrayResize capacità MT5 (build 2057):
Quindi, conclusioni sulle prestazioni di ArrayResize e sull'impatto sulla capacità reale:

1. Il primo ArrayResize è molto importante, alloca realmente la memoria tenendo conto della dimensione + reserved_size e imposta la capacità.
2. Tutte le successive esecuzioni di ArrayResize con un nuovo valore di reserved_size non hanno effetto sulla quantità di memoria allocata e sulla capacità, rispettivamente.
3 Una nuova allocazione di memoria viene eseguita solo quando la capacità viene superata e in questo caso size + reserved_size viene utilizzato di nuovo per determinare la quantità di memoria allocata e impostare una nuova capacità.
4. Un valore di reserved_size < 0 libera la memoria riservata alla dimensione.
 
Eugeni Neumoin:

E da nessuna parte nella descrizione si dice che questo valore è in secondi.

Quindi non è in secondi...

 
Eugeni Neumoin:

C'è una descrizione del linguaggio che dice: Il valore può essere uno dei valori dell'enumerazione ENUM_TIMEFRAMES.

Vedere più avanti nella descrizione della lingua:

Periodi del grafico

Tutti i periodi predefiniti del grafico hanno identificatori unici. L'identificatore PERIOD_CURRENT indica il periodo corrente del grafico in cui il programma mql5 è in esecuzione.

ENUM_TIMEFRAMES

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

E da nessuna parte nella descrizione si dice che questo valore è in secondi.

La descrizione dovrebbe dire tutto.

E quando si deve passare attraverso altri articoli, è un peccato.

Chi vi ha detto che questi sono valori in secondi?

 
Eugeni Neumoin :

C'è una descrizione del linguaggio che dice: Il valore può essere uno dei valori dell'enumerazione ENUM_TIMEFRAMES.

Vedere più avanti nella descrizione della lingua:

Periodi del grafico

Tutti i periodi predefiniti del grafico hanno identificatori unici. L'identificatore PERIOD_CURRENT denota il periodo corrente del grafico, al quale il programma mql5 sta girando.

ENUM_TIMEFRAMES

Identificatore

Descrizione

PERIODO_CORRENTE

Periodo corrente

PERIODO_M1

1 minuto

PERIODO_M2

2 minuti

PERIODO_M3

3 minuti

PERIODO_M4

4 minuti

PERIODO_M5

5 minuti

PERIODO_M6

6 minuti

PERIODO_M10

10 minuti

PERIODO_M12

12 minuti

PERIODO_M15

15 minuti

PERIODO_M20

20 minuti

PERIODO_M30

30 minuti

PERIODO_H1

1 ora

PERIODO_H2

2 ore

PERIODO_H3

3 ore

PERIODO_H4

4 ore

PERIODO_H6

6 ore

PERIODO_H8

8 ore

PERIODO_H12

12 ore

PERIODO_D1

1 giorno

PERIODO_W1

1 settimana

PERIODO_MN1

1 mese

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

E da nessuna parte nella descrizione si dice che questo valore è in secondi.

La descrizione dovrebbe dire tutto.

E quando si deve passare attraverso altri articoli, è un peccato.

Non dovreste mai fare affidamento su un valore di enumerazione.

Utilizzare PeriodSeconds().