帮助我学习如何编程。 - 页 3

 
Tio Nisla:
我想在前面补充一下,如果somebodyfunc()函数除了返回一些金额或其他东西外,还做了一些其他的操作,例如计算交易参数,这种用法会导致难以捕捉的工件,并可能导致代码的作者陷入昏迷:"Ht?怎么会有4次?O_o F$#@!!!它不是应该在那里出现三次吗?为什么我的EA对我撒谎?"。这就是我所说的 "shithcod",一位专家对其愤怒到发根。我没有提出来,因为这很明显,但你为我做到了。但是你没有考虑到,通过动态计算的索引寻址而不需要对数组进行重新初始化是另一回事。在裸露的系统中,这通常会导致GPF,在有智能指针和数组的PLUS中,会导致异常及其处理程序。在mql中,并不清楚它导致了什么。

什么是 "难以捉摸的人工制品"? 它是一种宗教的东西吗?你编造的,你相信吗?

 
Aleksandr Slavskii:

先生们,个性,但让我们找出真相。

我在例子中看到,PositionsTotal() 在每个循环迭代中被调用。

但迪米特里,恰恰相反,你是说编译器以不同的方式来做--我不明白。解释一下。

如果你想说PositionsTotal()函数每次都不重新计算头寸,而只是返回一个包含未平仓头寸数量的变量值,那么是的,你是对的,多声明一个变量是没有意义的,但那样的话,编译器又有什么用呢?

而如果这个函数每次都重新计算开放位置,那么事实证明,编译器必须了解这个函数的值是否会影响到进一步的计算,并使用一个函数或一个变量。

我似乎没有搞清楚。

它每次都会重新计算,或者不重新计算,但调用PositionTotal()肯定是有代价的。而这一点很容易被一个简单的实验所证明。但他们没有给出一个能把我砸得稀巴烂的杀手锏实验,而是用 "难以找到的文物 "提出了华丽的论据。你可以从你知道的第一页找到那个例子代码,看看它在那里的样子)))在插入论坛之前,它被故意改变了(热烈的掌声)。而且这样做只是为了防止给初学者带来不必要的负担。

而编译器,我的意思是,它优化了代码,直接调用变量,而不是通过函数。

int x;

for(;i<x;)

и

for(;i<F();)

int F(){return(x);}

这一点在ArraySize()函数中很明显;你无法分辨调用一个函数和使用一个变量之间的区别。但在PositionsTotsl()中,情况并非如此,唉。

顺便说一下,你也可以在循环内声明变量,这也会降低速度。什么是没有得到根?你不知道这件事?虽然我们在这里也可以争论,但4和5之间是有区别的。

 

当然,PositionsTotal()每次都会询问未结头寸 的数量?或者,也许它是经过优化的,并将数值保存在一个带有更新标记的常数中,如果不改变,则只返回相同的数字)?

这个函数一定有一些内部优化。开发人员不是傻瓜,不会为了 "反正都会做 "而去做这么重要的、有可能是昂贵的功能。

那些愤愤不平的人,请看看执行同一个循环的两个变体需要多少时间和资源。

没有必要扔大便。


我想看看PositionsTotal()的源代码,纯粹是为了学术兴趣。


好吧,当你考虑到这一点时,最简单的事情就是让终端的一个全局变量来存储这个值。并只返回这个值。并在开仓或平仓时更新它--使变量安全,并使其同步化,这样,上帝不会让它被写在那里。

我认为,这就是它的做法。

好吧,也许,关于位置本身的数据被存储在一些数据结构中,这样就有可能得到它们而不需要不必要地转向服务器。总的来说,我认为在任何变种的呼唤/中,生产力都是正常的。


而代码风格是否美观,每个人自己决定)

 
Nikolay Mitrofanov:

谁反感它,请检查一下运行同一周期的两个变体需要多少时间和资源。

没有必要扔大便。

我希望这不是针对我的,因为我并不怀疑德米特里的权威。蒂奥-尼斯拉似乎也已经编码了很长时间,但


我正在学习,这就是我问的原因。

 

PositionsTotal()很棘手,它必须总是返回正确的数字,并且 位置数 发生变化时立即改变其值因此,它不可能像一个简单的变量或ArraySize()那样快。

 
Aleksandr Slavskii:

...


我正在学习,这就是我问的原因。

如果你正在学习,完全不要被这些小事所困扰。专注于将你的想法转化为代码的能力(或将一些不明确的过程转化为一连串的行动)。然后可以随心所欲地对代码进行调整。

 
Dmitry Fedoseev:

如果你正在学习,根本不用担心这些细节。专注于能够将你的想法转化为代码(或将一些不明确的过程转化为一连串的行动)。然后可以随心所欲地对代码进行调整。

我认为一个人试图了解它并深入挖掘是好事。

由于不注意小事,编码员就会养成按自己的想法写代码的习惯。然后梳理代码意味着双倍的工作,而且往往不仅是对作者,对那些仍然幸运地与代码打交道的人也是如此。

如果你能好好做,并且写得很好,了解细节,为什么还要费心写代码呢?)

你的建议是......嗯......。IMHO


你的建议对一个有经验的程序员来说是很好的(强烈的自信心),然后他可以清理,因为他或她知道哪里和什么必须清理。

 
Nikolay Mitrofanov:

对我来说,我认为一个人试图理解并深入挖掘是件好事。

由于不注意小事,编码员就会养成以错误方式编写代码的习惯。然后梳理代码意味着双倍的工作,而且往往不仅是对作者,对那些仍然幸运地与代码打交道的人也是如此。

如果你能好好做,并且写得很好,了解细节,为什么还要费心写代码呢?)

你的建议是......嗯......。IMHO


你的建议对一个有经验的程序员来说是很好的(高度自信),然后他可以进行梳理,因为他知道哪里和什么是必须要梳理的。

对于初学者来说更是如此--至少在某种程度上,最好是解决一个问题,而不是停留在论坛争吵的层面上,比如 "你怎么能在这里写没有const,在这里写没有static,等等,等等,或者--哦,伙计,如果你问这个问题,那么你最好根本就不要接近编程。"

没有一个星期没有人给我发送一个指标来修复一些像这样的代码:for(int i=0;i<Bars;i++)。而你在这里摩擦问题,这可能会给你带来速度...嗯,30%。

即使是高效的EA(从测试速度的角度来看)也是其算法的问题,每次都是为每个特定的策略重生,而不是语法的错综复杂问题。

 
Dmitry Fedoseev:

对于初学者来说,最好是至少以某种方式解决问题,而不是停留在论坛争吵的层面上,比如 "你怎么能在这里写没有const,在这里写没有static,等等,等等,或者--哦,伙计,如果你问这个问题,那么你最好根本就不要接近编程"。

没有一个星期没有人给我发送一个指标来修复一些像这样的代码:for(int i=0;i<Bars;i++)。而你在这里摩擦问题,这可能会给你带来速度...嗯,30%。

如果一个程序员新手 在论坛上问什么,这意味着他想知道答案,这意味着他有兴趣并需要它。甚至还创建了一个主题来征求意见。

如果我没有弄错主题的意思,实施他的想法的问题不是 "只是做得对,但要让它发挥作用",而是尽可能最好、尽可能正确。这很好。这是对的。

对于任何活动来说,"只是莫名其妙 "是一种可怕的做法。

首先要弄清楚,然后用知识去做,这是最好的方法。

 
Nikolay Mitrofanov:

如果一个程序员新手 在论坛上问什么,这意味着他想知道答案,这意味着他有兴趣并需要它。他甚至创建了这个主题来获取建议。

如果我对该主题的作者理解正确的话,那么他的想法的实施问题就不再是 "随心所欲只是为了让它发挥作用",而是立即尽可能地、正确地实施。这很好。这是对的。

对于任何活动来说,"只是莫名其妙 "是一种可怕的做法。

首先要理解,然后用知识去做是最好的。

有了对什么的了解?如果这种算法不存在于自然界,而必须自己发明,而且是定义一切的算法。