错误、漏洞、问题 - 页 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

2019年5月21日的终端版本build 2057。

 

谢谢你。

在描述中。

期间

返回当前图表的时间框架值。

ENUM_TIMEFRAMESPeriod()。

返回的值

_Period 变量的内容,持有当前图表的时间框架值。值可以是 ENUM_TIMEFRAMES的一个 枚举值。

另见

PeriodSeconds,图表周期,日期和时间, ,对象可见性

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

这一点做得不是很好。它应该正确地写在描述中。你不应该在论坛上寻找问题的根源。

事实证明,Period()不会给出当前时间框架的值,因为它说:该值可以是 枚举 ENUM_TIMEFRAMES中的一个值

这完全是另一回事。

请为开发者纠正语言描述。

 
再次感谢TheXpert 提供的代码。
我们在ArrayResize capacity 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)); 
}

结果。
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枚举 中的一个值

这一点做得很不好。它应该正确地写在描述中。你不应该在论坛上寻找问题的根源。

因此,没有任何地方写明这个值等于以分钟为单位的周期(就像在quad中那样)。

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

链接上的文章就是从这里开始的。

有一个语言的描述说:Value可以是 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 MT5(build 2057)上有如下结果。
因此,关于ArrayResize性能和对实际容量的影响的结论。

1.第一个ArrayResize非常重要,它真正分配内存时考虑到了size+reserved_size并设置了容量。
2.所有后续的ArrayResize的执行都有一个新的reserved_size值,分别对分配的内存和容量的数量没有影响。
3 新的内存分配只有在超过容量时才会进行,在这种情况下,size+reserved_size被再次用来确定分配的内存数量,并设置新的容量。
4.reserved_size < 0的值将保留的内存释放到大小。
 
Eugeni Neumoin:

而且描述中没有任何地方说这个值是以秒为单位的。

所以它不是在几秒钟内...

 
Eugeni Neumoin:

有一个语言描述说:Value可以是 ENUM_TIMEFRAMES 的一个 枚举 值。

见语言描述中的进一步说明。

图表时期

所有预定义的图表周期都有唯一的标识符。PERIOD_CURRENT标识符指的是图表的当前周期,在该周期,mql5-程序正在运行。

enum_timeframes

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

而且描述中没有任何地方说这个值是以秒为单位的。

描述应该说明一切。

而当你不得不去看其他一些文章时,那就太糟糕了。

谁告诉你这些是以秒为单位的数值?

 
Eugeni Neumoin :

有一个语言描述说:Value可以是 枚举 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()。