mql5语言的特点、微妙之处以及技巧 - 页 138 1...131132133134135136137138139140141142143144145...247 新评论 Igor Makanu 2019.07.08 07:00 #1371 fxsaber: // Некоторые возможности структур, которых нет у классов. 嗯,有意思,我真的很喜欢用常量字段的想法,常量字段只会被初始化一次。 Andrey Barinov 2019.07.08 09:01 #1372 Igor Makanu: 嗯,有意思,我喜欢用常量字段的想法,常量字段将只被初始化一次。 你现在可以用这种方式进行批量规范化。 你也可以在类中声明常量成员。 Igor Makanu 2019.07.08 09:41 #1373 Andrey Barinov: 你也可以在类中声明常量成员。 嗯,是的,我在这里没有正确地使用所有的修饰语,这就是为什么它引起了我的钦佩,我检查了一下,现在我把代码混淆了,虽然我想只是把它写得很紧凑 )))) #property strict //+------------------------------------------------------------------+ class NL { #ifndef SID #define SID(v) SymbolInfoDouble(_Symbol,v) private: const class sl { public:double s,b,l;int d;sl():s(SID(SYMBOL_VOLUME_STEP)),b(SID(SYMBOL_VOLUME_MAX)),l(SID(SYMBOL_VOLUME_MIN)){;long i=10000000,k=long(s/0.0000001);d=0;while(d<7 && k%i>0){i/=10;d++;}}#endif } param; public: double Lot(double value){return(NormalizeDouble(fmax(fmin(param.s*round(value/param.s),param.b),param.l),param.d));} } Normalize; //+------------------------------------------------------------------+ void OnStart() { double l = 0.0; for(int i=0;i<10;i++) { l+=0.005; Print(Normalize.Lot(l)); } } //+------------------------------------------------------------------+ ZS:ME中的折页真的很缺乏!- 在这里和那里滚动鼠标滚轮很累人(())。 Alexey Navoykov 2019.07.09 00:13 #1374 我通过MQL为每个人 实现了构造。 到目前为止,它只适用于数组:1)常规的mql-arrays;2)自定义数组类,它应该有[](int)操作符的定义和全局ArraySize函数 的重载。 语法。 foreach(element_var, array) { ... } 数组既可以定义为变量,也可以定义为表达式--这就是为什么我们要建园的原因)。该表达式被执行一次,存储一个指向数组的指针,然后访问该指针。 #define TEMPL(T) template<typename T> enum E_TRUE { __TRUE=1 }; enum E_FALSE { __FALSE=0 }; TEMPL(T) E_TRUE __IsMqlArray(T&[], int) { return true; } TEMPL(T) E_FALSE __IsMqlArray(T&, int) { return false; } TEMPL(T) E_FALSE __IsMqlArray(T, uint) { return false; } #define IS_MQL_ARRAY(var) ( typename(__IsMqlArray(var, 0))==typename(E_TRUE) ) static class __CForeachHelper { public: TEMPL(T) class __CDummyArr { public: T data[]; }; TEMPL(T) struct __TValue { public: T data; __TValue(T value) { data= value; } }; TEMPL(T) T* Ptr(T* a) { return a; } TEMPL(T) T* Ptr(T& a) { return &a; } TEMPL(T) __CDummyArr<T>* Ptr(const T&[]) { return NULL; } TEMPL(T) __TValue<T> Obj(const void* p, T) { return (T)p; } TEMPL(T) __CDummyArr<T>* Obj(const void* p, __CDummyArr<T>*) { return (__CDummyArr<T>*)p; } } __foreachhelper; #define __ARR_ITEM(ptr, array, i) (IS_MQL_ARRAY(array) ? array[i] : __foreachhelper.Obj(ptr, 0 ?__foreachhelper.Ptr(array) : NULL).data[i]) #define __ARR_SIZE(ptr, array) (IS_MQL_ARRAY(array) ? ArraySize(array) : ArraySize(__foreachhelper.Obj(ptr, 0 ?__foreachhelper.Ptr(array) : NULL).data)) #define CONCAT(a, b) a##b #define CONCAT2(a, b) CONCAT(a, b) #define __FORVAR(var) CONCAT2(__for##var, __LINE__) #define foreach(element, array) \ if (0) { class __CForeachArrCheck \ // Проверка наличия конструктора у элемента mql-массива { public: TEMPL(T) void f(T&){} TEMPL(T) void f(T*){} TEMPL(T) void f(T*const&[]){} TEMPL(T) void f(T const&[]) { T arr[1]; } \ } _fcheck; _fcheck.f(array); \ } \ else \ for (int __FORVAR(state)=1; __FORVAR(state)==1; ) \ for (const void* __FORVAR(ptr)=__foreachhelper.Ptr(array); __FORVAR(state)==1; ) \ for(int __FORVAR(i)=0, __FORVAR(count)=__ARR_SIZE(__FORVAR(ptr), array); __FORVAR(state)--==1 && __FORVAR(i)<__FORVAR(count); __FORVAR(i)++) \ for (element=__ARR_ITEM(__FORVAR(ptr), array, __FORVAR(i)); __FORVAR(state)==0; __FORVAR(state)=1) 使用实例。 template<typename T> class CArr { public: T data[]; T operator[](int i) const { return data[i]; } void operator=(T const &arr[]) { int size=ArraySize(arr); ArrayResize(data, size); for (int i=0; i<size; i++) data[i]=arr[i]; } }; template<typename T> int ArraySize(const CArr<T> &arr) { return ArraySize(arr.data); } class A { public: double value; A(double val=0) { value=val; } }; CArr<int>* GetArr() { Print("Get Array"); static int arr[]={10,20,30}; static CArr<int> Arr= arr; return &Arr; } void OnStart() { Print("Test 1"); double arr[]= { 10, 20, 30 }; foreach(double val, arr) Print(val); Print("Test 2"); CArr<double> arr2 = arr; foreach(double val, arr2) Print(val); Print("Test 3"); A _a(10), _b(20), _c(30); A* arr3[3]; arr3[0]=&_a; arr3[1]=&_b; arr3[2]=&_c; foreach(A* a, arr3) Print(a.value); Print("Test 4"); CArr<A*> arr4 = arr3; foreach(A* a, arr4) Print(a.value); Print("Test 5"); foreach(int a, GetArr()) Print(a); } fxsaber 2019.07.09 11:23 #1375 Alexey Navoykov: 使用的例子。 改写了一点 //void operator=(T const &arr[]) { int size=ArraySize(arr); ArrayResize(data, size); for (int i=0; i<size; i++) data[i]=arr[i]; } void operator=(T const &arr[]) { ArrayResize(data, ArrayCopy(data, arr)); } fxsaber 2019.07.09 11:33 #1376 Alexey Navoykov: 我通过MQL为每个人 实现了构造。 到目前为止,它只对数组起作用:1)常规的mql-arrays;2)自定义数组类,它应该有[](int)操作符的定义和全局ArraySize函数 重载。 这很好!有可能做出这样的变体吗? void OnStart() { MqlTick Ticks[3]; for (int i = 0; i < ArraySize(Ticks); i++) Ticks[i].bid = i + 1; foreach(MqlTick Tick, Ticks) Print(Tick.bid); // OK foreach(MqlTick Tick[1], Ticks) ArrayPrint(Tick); // 'Tick' - invalid array access } Alexey Navoykov 2019.07.09 12:01 #1377 fxsaber: 这很好!有可能做一个这样的版本吗? 那么,在MQL中不支持用变量初始化数组。 你可以对数组元素 进行赋值。foreach(Ticks[0], Ticks) ArrayPrint(Ticks[0].bid); fxsaber 2019.07.09 12:18 #1378 Alexey Navoykov: 那么,在MQL中不支持用变量初始化数组。你可以 对一个数组元素 进行赋值 。 我还没有想出实现的方法,但我不认为这样做有什么意义。 这并不奏效 void f( const int &Array[] ) { foreach(int val, Array) Print(val); } Alexey Navoykov 2019.07.09 13:17 #1379 fxsaber: 这个变体不起作用 是的,它是。当我开始研究它时,我发现了一个有趣的特殊性。当一个常量类型的参数(例如const int)被传递给一个模板时,它被简单地认为是:T = int,但常量也会被考虑在内,这很令人困惑。 template<typename T> class B { }; template<typename T> void f(T & a) { B<const T> b; // OK. Значит T==int const T arr[]={}; // Тоже всё ОК. T arr2[]; // 'arr2' - 'const' variable must be initialized. wtf? } void OnStart() { const int a=0; f(a); } 起初我以为这是MQL的一个特点,但在C++中也是如此。 TheXpert 2019.07.09 13:32 #1380 Alexey Navoykov: 起初我以为这是MQL的一个特点,但在C++中也是如此。 因为类型是const int。只是在模板中,你仍然可以将const附加到前面而没有任何问题。 但是如果在C++中你可以通过一些简单的操作从一个类型中移除const,那么在Mql中你就不能这样做。 1...131132133134135136137138139140141142143144145...247 新评论 您错过了交易机会: 免费交易应用程序 8,000+信号可供复制 探索金融市场的经济新闻 注册 登录 拉丁字符(不带空格) 密码将被发送至该邮箱 发生错误 使用 Google 登录 您同意网站政策和使用条款 如果您没有帐号,请注册 可以使用cookies登录MQL5.com网站。 请在您的浏览器中启用必要的设置,否则您将无法登录。 忘记您的登录名/密码? 使用 Google 登录
// Некоторые возможности структур, которых нет у классов.
嗯,有意思,我真的很喜欢用常量字段的想法,常量字段只会被初始化一次。
嗯,有意思,我喜欢用常量字段的想法,常量字段将只被初始化一次。
你现在可以用这种方式进行批量规范化。
你也可以在类中声明常量成员。
你也可以在类中声明常量成员。
嗯,是的,我在这里没有正确地使用所有的修饰语,这就是为什么它引起了我的钦佩,我检查了一下,现在我把代码混淆了,虽然我想只是把它写得很紧凑 ))))
ZS:ME中的折页真的很缺乏!- 在这里和那里滚动鼠标滚轮很累人(())。我通过MQL为每个人 实现了构造。
到目前为止,它只适用于数组:1)常规的mql-arrays;2)自定义数组类,它应该有[](int)操作符的定义和全局ArraySize函数 的重载。
语法。
数组既可以定义为变量,也可以定义为表达式--这就是为什么我们要建园的原因)。该表达式被执行一次,存储一个指向数组的指针,然后访问该指针。
使用实例。
使用的例子。
改写了一点
我通过MQL为每个人 实现了构造。
到目前为止,它只对数组起作用:1)常规的mql-arrays;2)自定义数组类,它应该有[](int)操作符的定义和全局ArraySize函数 重载。
这很好!有可能做出这样的变体吗?
这很好!有可能做一个这样的版本吗?
foreach(Ticks[0], Ticks) ArrayPrint(Ticks[0].bid);
那么,在MQL中不支持用变量初始化数组。你可以 对一个数组元素 进行赋值 。
我还没有想出实现的方法,但我不认为这样做有什么意义。
这并不奏效
这个变体不起作用
起初我以为这是MQL的一个特点,但在C++中也是如此。
起初我以为这是MQL的一个特点,但在C++中也是如此。
因为类型是const int。只是在模板中,你仍然可以将const附加到前面而没有任何问题。
但是如果在C++中你可以通过一些简单的操作从一个类型中移除const,那么在Mql中你就不能这样做。