Ошибки, баги, вопросы - страница 2469

 

буду знать ) тогда хак

 

Перевожу программу с MQL4 на MQL5.

Столкнулся с такой ошибкой.

На таймфреймах до m30 значение Period() выдается правильно.

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

А начиная с таймфрейма H1 выводятся непонятные значения.

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

Версия терминала build 2057 от 21 мая 2019 года.

 

Спасибо.

В описании:

Period

Возвращает значение таймфрейма текущего графика.

ENUM_TIMEFRAMES  Period();

Возвращаемое значение

Содержимое переменной _Period, в которой хранится значение таймфрейма текущего графика. Значение может быть одним из значений перечисления ENUM_TIMEFRAMES.

Смотри также

PeriodSeconds, Периоды графиков, Дата и время, , Видимость объектов

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

Как-то плохо все сделано. В описании должно быть корректно написано. А не на форуме надо искать источник проблемы.

Выходит, Period() выдат не значение текущего таймфрейма, как это сказано : Значение может быть одним из значений перечисления ENUM_TIMEFRAMES.

А что-то совсем другое. 

Разработчики поправьте описание языка.

 
Спасибо еще раз TheXpert за предоставленный код.
Имеем следующие результаты по ArrayResize capacity МТ5(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)); 
}

Результат:
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:

В описании:

Содержимое переменной _Period, в которой хранится значение таймфрейма текущего графика. Значение может быть одним из значений перечисления ENUM_TIMEFRAMES.

Как-то плохо все сделано. В описании должно быть корректно написано. А не на форуме надо искать источник проблемы.

Так нигде же не написано, что это значение равно периоду в минутах (как было в четвёрке).

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

С этого начинается статья по ссылке.

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

Так нигде же не написано, что это значение равно периоду в минутах (как было в четвёрке).

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

С этого начинается статья по ссылке.

Есть описание языка, в котором сказано : Значение может быть одним из значений перечисления ENUM_TIMEFRAMES.

Смотрим в описании языка далее:

Периоды графиков

Все предопределенные периоды графиков имеют уникальные идентификаторы. Идентификатор PERIOD_CURRENT означает текущий период графика, на котором запущена mql5-программа.

ENUM_TIMEFRAMES

Идентификатор

Описание

PERIOD_CURRENT

Текущий период

PERIOD_M1

1 минута

PERIOD_M2

2 минуты

PERIOD_M3

3 минуты

PERIOD_M4

4 минуты

PERIOD_M5

5 минут

PERIOD_M6

6 минут

PERIOD_M10

10 минут

PERIOD_M12

12 минут

PERIOD_M15

15 минут

PERIOD_M20

20 минут

PERIOD_M30

30 минут

PERIOD_H1

1 час

PERIOD_H2

2 часа

PERIOD_H3

3 часа

PERIOD_H4

4 часа

PERIOD_H6

6 часов

PERIOD_H8

8 часов

PERIOD_H12

12 часов

PERIOD_D1

1 день

PERIOD_W1

1 неделя

PERIOD_MN1

1 месяц

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

И нигде в описании не говорится, что это значение в секундах.

В описании должно быть все сказано.

А когда надо лазить еще по каким-то статьям, то это очень плохо.

 
Sergey Dzyublik:
Спасибо еще раз TheXpert за предоставленный код.
Имеем следующие результаты по ArrayResize capacity МТ5(build 2057):
И так, выводы по работе ArrayResize и влияние на реальное capacity:

1. Очень важен первый ArrayResize, он реально выделяет память с учетом size + reserved_size и устанавливает capacity.
2. Все последующие выполнения ArrayResize с новым значением reserved_size - не имеют ни какого влияние на количество выделенной памяти и capacity, соответственно.
3. Новое выделение памяти происходит только при превышении capacity и в этом случаи опять используется size + reserved_size для определения количества выделяемой памяти и установки нового capacity.
4. Значение reserved_size < 0 освобождает зарезервированную память до размера size. 
 
Eugeni Neumoin:

И нигде в описании не говорится, что это значение в секундах.

Так оно и не в секундах...

 
Eugeni Neumoin:

Есть описание языка, в котором сказано : Значение может быть одним из значений перечисления ENUM_TIMEFRAMES.

Смотрим в описании языка далее:

Периоды графиков

Все предопределенные периоды графиков имеют уникальные идентификаторы. Идентификатор PERIOD_CURRENT означает текущий период графика, на котором запущена mql5-программа.

ENUM_TIMEFRAMES

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

И нигде в описании не говорится, что это значение в секундах.

В описании должно быть все сказано.

А когда надо лазить еще по каким-то статьям, то это очень плохо.

А кто вам сказал что это значения в секундах?

 
Eugeni Neumoin :

Есть описание языка, в котором сказано : Значение может быть одним из значений перечисления ENUM_TIMEFRAMES .

Смотрим в описании языка далее:

Периоды графиков

Все предопределенные периоды графиков имеют уникальные идентификаторы. Идентификатор PERIOD_CURRENT означает текущий период графика, на котором запущена mql5-программа.

ENUM_TIMEFRAMES

Идентификатор

Описание

PERIOD_CURRENT

Текущий период

PERIOD_M1

1 минута

PERIOD_M2

2 минуты

PERIOD_M3

3 минуты

PERIOD_M4

4 минуты

PERIOD_M5

5 минут

PERIOD_M6

6 минут

PERIOD_M10

10 минут

PERIOD_M12

12 минут

PERIOD_M15

15 минут

PERIOD_M20

20 минут

PERIOD_M30

30 минут

PERIOD_H1

1 час

PERIOD_H2

2 часа

PERIOD_H3

3 часа

PERIOD_H4

4 часа

PERIOD_H6

6 часов

PERIOD_H8

8 часов

PERIOD_H12

12 часов

PERIOD_D1

1 день

PERIOD_W1

1 неделя

PERIOD_MN1

1 месяц

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

И нигде в описании не говорится, что это значение в секундах.

В описании должно быть все сказано.

А когда надо лазить еще по каким-то статьям, то это очень плохо.

Вы никогда не должны полагаться на значение перечисления.

Используйте PeriodSeconds().