mql5语言的特点、微妙之处以及技巧 - 页 182

 
Konstantin Nikitin:

例如,我删除了我的VDS上的所有对象。我只是不想让图表过载。而且那里也不需要他们。我使用globals。所以这一切都取决于情况。

听着,我不喜欢他们是有原因的。

  1. 这是一个与它们进行原子性操作的问题。文档中没有提到这一点,尽管事实上它是一个对象,对它的操作不是原子性的,而且如果我没记错的话,在x86中读/写双倍本身是两条指令。
  2. 程序外的变量的可访问性。
如果说第1点更多的是对文件质量的抱怨,那么第2点就是认真的。
 
Vladimir Simakov:

听着,我不喜欢他们是有原因的。

  1. 与他们的操作的原子性问题。文档中没有提到这一点,尽管事实上,它是一个对象,而且对它们的操作不是原子的,如果我没记错的话,在x86中读/写双倍数本身就是两条指令。
  2. 程序外变量的可访问性。
如果说第1项更多的是对文件质量的抱怨,那么第2项就很严重了。

好吧,没有必要去读它。你可以使用GlobalVariableCheck 来检查该变量是否存在。你可以对物体做同样的事情。
所以你只需要创建/检查/删除一个变量。

 

Vladimir Simakov:

2.计划外的变量的可用性。

没问题,所有处理全局变量的函数都有一个返回值--操作的结果。

有一个同步工具https://www.mql5.com/ru/docs/globals/globalvariablesetoncondition, 它不多,但使用提供给你的东西。

但最大的不便是数据类型--只有双倍,我不喜欢双倍,即使只能用ulong,而且名字/值-->字符串/双倍的组织方式导致了交换的愿望--用字符串写数据,用双倍写钥匙--更多的是为了一个操作可以被写入/读取。

但在估计了所有这些 "东西 "之后你可以把它们写进二进制文件,也就是说,完全自由,没有不确定因素。

一个人可能需要知道如何与他们合作

@fxsaber 展示了与任何类型的工作的例子https://www.mql5.com/ru/forum/320395/page6#comment_12910394

 
Konstantin Nikitin:

好吧,没有必要阅读。你可以简单地使用GlobalVariableCheck 来检查该变量是否存在。你对物体也是这样做的。
所以,你只需要创建/检查/删除一个变量。

是的,一个微不足道的命名冲突和其他机器人中的字符串

GlobalVariableDel(yourValueName);

将失去你的存款))))

说名字将是唯一的,其他机器人将永远不会出现,孩子/妻子/朋友/酒鬼永远不会靠近战斗终端)))同意,但概率不是零,这意味着代码变得不可靠。

 
Vladimir Simakov:

是的,这是一个微不足道的命名冲突,其他机器人的行

将耗尽你的存款)))

你会说,这个名字将是独一无二的,另一个机器人将永远不会出现,孩子/妻子/朋友/酒鬼本人将永远不会靠近战斗终端)))同意,但概率不是零,这意味着代码变得不可靠。

废话和幻想

赚钱的EA总是从一个单独的终端,在它自己的VDS(甚至是服务器)上运行,没有人去搞它。

 
Maxim Kuznetsov:

废话和幻想

赚钱的EA总是从一个单独的终端,在它自己的VDS(甚至是服务器)上运行,没有人去搞它。

你说永远是什么意思?今天--总是这样,明天你可能会有不同的计算方法。而且似乎不是所有人都同意你的观点。

我指出了使用终端的全局变量 的真正危险。这既不是好事,也不是坏事--这是开发商给我们的,我们只是需要意识到这一点并将其考虑在内。

同样的字符串

GlobalVariablesDeleteAll();

...在任何脚本中做出的,哎呀...

 

关于交易、自动交易系统和交易策略测试的论坛

mql5的特殊性,技巧和窍门

Vladimir Simakov, 2020.05.24 17:02

同样的字符串

GlobalVariablesDeleteAll();

......在任何脚本中做出的,哎呀。

图形对象的情况也是如此。

ObjectsDeleteAll(...


只有EA资源不能被其他程序改变。

 

同事们,如果可能的话,请帮助我做一个宏观。

我需要动态地声明一个二维数组。而第二个层面也必须改变。这是类似这样的循环。

for(int would_be_size2=0;would_be_size2<5;would_be_size2++)
    {
     double d_array[][would_be_size2];
     int size2=ArrayRange(d_array,1);
    }

当然,编译器会对此表示反对。

'[' - invalid index value       t7.mq5  20      22

我希望看到一个类似以下的宏。

#define  CREATE_MARRAY(type,arr_name,size2) (type arr_name[][##size2])

而不是一条线。

double d_array[][would_be_size2];

谢谢你。

 
Denis Kirichenko:

同事们,如果可能的话,请帮助我做一个宏观。

我需要动态地声明一个二维数组。而第二个层面也必须改变。这是类似这样的循环。

当然,编译器会对此表示反对。

我希望看到一个类似以下的宏。

而不是一条线。

谢谢你。

但在循环外创建一个足够大(最大)的数组却受到了政治的阻碍?:-)

上述方法(每次都在循环中重新创建数组)在速度和内存消耗方面没有任何优势。

 
Denis Kirichenko:

我希望看到一个与此类似的宏。

这是不可能的。