或者这样:const int X = 1 ;for (int i = 0; i < X+2; i++) {}.
但这绝对不是: int X = 1 ; for (int i = 0; i < X+1; i++) {}因为我不是心灵感应者,我不知道这个X可能发生什么和什么地方 - 它可能在循环内 被修改或 间接地被修改,例如,通过一个链接/指针?它将在每次迭代时做'X+1'的加法。即使你删除了'+1',程序仍然会使用'X'的当前值,除非这个'X'被声明为一个常数。
或者这样:const int X = 1 ;for (int i = 0; i = X+2; i++) {}.
但这绝对不是: int X = 1 ; for (int i = 0; i = X+1; i++) {}因为我不是心灵感应者,我不知道这个X可能发生什么和什么地方 - 它可能在循环内 被修改或 间接地被修改,例如,通过一个链接/指针?它将在每次迭代时做'X+1'的加法。即使你删除了'+1',程序仍然会使用'X'的当前值,除非这个'X'被声明为一个常数。
Dmitry Fedoseev:
每次都重新计算,或者不重新计算
你还没有明白什么。这个世界并没有因为PositionTotal()而出现问题。我只是指出,这样做是错误的。
德米特里-费多塞耶夫:
,但没有带来一个杀手锏的实验
你对我的实验有什么不满意的地方?编译器是否对第一次调用的结果进行了过度优化?
这正是它所优化的:for (int i = 0; i < 1+2 ; i++) {}.
或者这样:const int X = 1 ;for (int i = 0; i < X+2; i++) {}.
但这绝对不是: int X = 1 ; for (int i = 0; i < X+1; i++) {}因为我不是心灵感应者,我不知道这个X可能发生什么和什么地方 - 它可能在循环内 被修改或 间接地被修改,例如,通过一个链接/指针?它将在每次迭代时做'X+1'的加法。即使你删除了'+1',程序仍然会使用'X'的当前值,除非这个'X'被声明为一个常数。
而且它肯定不会缓存函数返回的结果,卡尔!(预料到你的 "但如果对于(int index=f();) 来说,怎么办")。- 这里只有一次调用,在索引 初始化时)。
Dmitry Fedoseev:
而编译器--我的意思是,它优化了代码,直接调用变量,而不是通过函数。
是的,当然,编译器完全知道市场上的情况,并确信一个函数的调用总是返回相同的值,所以为什么要多次调用这个函数呢,你只需要在OnInit()中记住一次结果就OK了
它并不关心即使在执行周期本身,在你的案例中,在PositionsTotal()中,一些订单可能已经消失了--被停止,被手或其他EA关闭--而其余的将不会被处理,因为他们都突然!变少了?
Dmitry Fedoseev:
这一点在ArraySize()函数中清晰可见,你无法分辨调用函数和使用变量之间的区别。 但PositionsTotsl()就不是这样了,唉。
某个数组的大小和当前开仓的数量之间有什么关系?你是通过索引来访问数组元素 的,好吧,比如说,访问数组[999],大小为3个元素。如果这个数组实际上是一个 "智能 "类型,例如一个带有操作符"[]"的类,在那里会进行有效性检查,那么就可以了。但如果不是这样呢?总之,这是一个典型的shithcode的例子。我们为什么要把这个水坑气化,只要承认就可以了,不用管它。
Dmitry Fedoseev:
每次都重新计算,或者不重新计算
你还没有明白什么。这个世界并没有因为PositionTotal()而出现问题。我只是指出,这样做是错误的。
德米特里-费多塞耶夫:
,但没有带来一个杀手锏的实验
你对我的实验有什么不满意的地方?编译器是否对第一次调用的结果进行了过度优化?
这正是它所优化的:对于(int i = 0; i = 1+2; i++){}。
或者这样:const int X = 1 ;for (int i = 0; i = X+2; i++) {}.
但这绝对不是: int X = 1 ; for (int i = 0; i = X+1; i++) {}因为我不是心灵感应者,我不知道这个X可能发生什么和什么地方 - 它可能在循环内 被修改或 间接地被修改,例如,通过一个链接/指针?它将在每次迭代时做'X+1'的加法。即使你删除了'+1',程序仍然会使用'X'的当前值,除非这个'X'被声明为一个常数。
而且它肯定不会缓存函数返回的结果,卡尔!(预料到你的 "但如果对于(int index=f();) 来说,怎么办")。- 这里只有一次调用,在索引 初始化时)。
Dmitry Fedoseev:
而编译器--我的意思是,它优化了代码,直接调用变量,而不是通过函数。
嗯,是的,当然,编译器完全知道市场上的情况,并确信一个函数的调用总是返回相同的值,所以为什么要多次调用这个函数呢,你必须在OnInit()中存储一次结果,就可以了!
它并不关心即使在执行周期本身,在你的案例中,在PositionsTotal()中,一些订单可能已经消失了--被停止,被手或另一个EA关闭--而其余的将不会被处理,因为他们都突然!变少了?
Dmitry Fedoseev:
这一点在ArraySize()函数中清晰可见,你无法分辨调用函数和使用变量之间的区别。 但PositionsTotsl()就不是这样了,唉。
某个数组的大小和当前开仓的数量之间有什么关系?你是通过索引来访问数组元素 的,好吧,比如说,访问数组[999],大小为3个元素。如果这个数组实际上是一个 "智能 "类型,例如一个带有操作符"[]"的类,在那里会进行有效性检查,那么就可以了。但如果不是这样呢?总之,这是一个典型的shithcode的例子。你最好不要试图把情况气化。
如果在PositionTotal()处没有看到终点,你就根本没有达到目标。因为ArraySize()函数可以在每次循环重复时调用,而且速度不会改变。
由于没有,我对你的实验并不满意。
你所有其他的幻想都不有趣,因为它们是幻想(而且,它们是狂野的,离现实非常遥远,甚至是虚假的)。
你应该是在幼儿园。
有了什么知识?如果是自然界中不存在的算法,但你必须自己发明它,而且它定义了一切。
掌握了如何在感兴趣的语言中胜任地写出正确的代码。
我不明白,有没有这样的算法可以做到这一点?
事实上,作者是带着这个问题创建了这个话题。
而其他人则讨论了职能的周期和表现。但他们也是想知道最好的方法或正确的方法的人。
有了如何在感兴趣的语言中胜任地写出正确的代码的知识。
我不明白,有没有什么算法可以做到这一点?
所以作者带着这个问题创建了这个主题。
而关于循环和函数的表现,其他的人也很感兴趣。可以这么说,在实现这种算法方面更加成熟)但他们也是那些想知道如何做得更好或如何做得正确的人。
所以你还是关于如何计算位置?好吧,那么我很抱歉。
有趣的是这些成熟的人,他们仍然想知道......但仍然不知道。这也都是为了计算职位?
再次抱歉,我没有弄错,你说的 "算法实现 "是指位置计数功能吗?也就是说,无论你把PositionsTots()写在一个循环中,还是使用一个变量--你都把这称为一种算法吗?所以你还在讨论如何计算职位?那么,我很抱歉。
有趣的是这些成熟的人,他们仍然想知道......仍然不知道。这也都是为了计算职位?
那么,如果问题已经用尽,你还在争论什么)?大笑。
有一项任务是获取位置数据。
有一个语言函数可以获得未结头寸的数量,这在循环中被使用。
有一个问题,如何在循环中正确使用它:在for循环的第一个参数中,还是在第二个参数中--在这里检查条件。
很奇怪,你不明白自己想要什么)))。
你写道,它的成本很高,因为这个数字不是恒定的。但为什么,你无法解释。
你能解释一下为什么它的成本很高吗?
我个人认为,开发人员确保这个函数不会在每个tick都重新计算未结头寸,而只会在开仓和平仓时 进行计算。
你认为开发商没有想到这一点吗?
你怎么能这么肯定,这个函数是有成本的,而且是重新计算的,而不是直接从终端的内存中取值?
到目前为止,我所看到的不是实质性的回答,而是闲聊。
那么,如果问题已经结束,你还争论什么呢)?大笑。
这就是情况的幽默--在第四版的第二个二十四小时里,一个关于如何计算位置的研讨会。非常有趣。
如果PositionTotal()不是唯一重要的东西,那么你就错过了重点。因为ArraySize()函数可以在每次循环重复时调用,而且速度不会改变。
由于没有,我对你的实验并不满意。
你所有其他的幻想都不有趣,因为它们是幻想(此外,它们是狂野的,与现实非常遥远,甚至是虚假的)。
ArraySize(),如果一个数组不是动态的或者是类的类型,那么在声明数组本身的时候,它已经是一个常数了。但这还不能说明什么,因为ArraySize(array)和sizeof(array)是两个很大的区别。第一个被调用,但你没有看到;第二个是在编译阶段计算的。
因此,请在其他地方讲述你的另类观点。
-----------------
我为什么要解释自己呢?一个人不愿意看到和思考。很好,让他生成代码,其操作取决于月相、平均火星子午线时间和左后脚跟瘙痒。唯一遗憾的是,许多人,尤其是新手,在把*新的代码复制到他们的项目中时,根本就不假思索,然后困惑于哪里出了问题。
ArraySize(),如果数组不是动态的,也不是类的类型,那么在声明数组本身时,它已经是一个常数了。但这也并不意味着什么,因为ArraySize(array)和sizeof(array)是两个很大的区别。第一个被调用,但你没有看到;第二个是在编译阶段计算的。
因此,请在其他地方讲述你的另类观点。
-----------------
我为什么要解释自己呢?一个人不愿意看到和思考。很好,让他生成代码,其操作取决于月相、平均火星子午线时间和左后脚跟瘙痒。唯一遗憾的是,许多人,尤其是新手,在把*新的代码复制到他们的项目中时,根本就不假思索,然后困惑于哪里出了问题。
这是个致命的论点!无话可说...为什么要对非动态数组应用ArraySize()?我无法想象一个人怎么会想出这种办法。而sizeof()与此有什么关系?那里一切正常吗?
而这并不是我的观点,而是早已被论坛参与者验证过的观点。但我不会去搜索这个主题。
但我可以告诉你,这与缓存一点关系都没有。
对我来说,我认为一个人试图理解并深入挖掘是件好事。
由于不注意小事,编码员就会养成以错误方式编写代码的习惯。然后梳理代码意味着双倍的工作,而且往往不仅是对作者,对那些仍然幸运地与代码打交道的人也是如此。
如果你能好好做,并且写得很好,了解细节,为什么还要费心写代码呢?)
你的建议是......嗯......。IMHO
你的建议对一个有经验的程序员来说是很好的(高度自信),然后他或她可以梳理一下,因为他或她知道哪里和什么是必须梳理的。
费多谢耶夫是对的。你不必这样做,而且需要一些时间来按你的意愿梳理代码。但随着时间的推移,你明白你最好写点新东西。因此,每一个新的代码都会在第一时间被梳理。
论坛有趣的现实情况。当有人问你问题时,甚至没有人会写一行代码。但他们一来,就来了,排好队,开始敲打--啊,啊,啊,真是个错误的密码。而有趣的是,它通常涉及到简单到三戈比的代码。每一个空间都在接受审查。至于更复杂的东西,则是沉默,像坦克一样的聋子。