for(int cc = 0; cc < OrdersTotal(); cc++)
{
if (!OrderSelect(cc, SELECT_BY_POS, MODE_TRADES) ) continue;
if (OrderSymbol() != Symbol() ) continue;
if (OrderType() > 1) continue; //--ignore pending trades
OpenTradecnt++; //--counts up for every live position of that symbol that existsPrint("count of the open trades of this symbol is: ", OpenTradecnt);
for(int cc = OrdersTotal() - 1; cc >= 0; cc--)
{
if (!OrderSelect(cc, SELECT_BY_POS, MODE_TRADES) ) continue;
if (OrderSymbol() != Symbol() ) continue;
if (OrderType() > 1) continue; //--ignore pending trades
OpenTradecnt++; //--counts up for every live position of that symbol that existsPrint("count of the open trades of this symbol is: ", OpenTradecnt);
请使用</>按钮来插入你的代码。
我很抱歉......这里是正确的格式。
OrdersTotal()不正确...
我对使用OrdersTotal() 的循环代码序列没有给出正确的结果感到惊讶(在两个不同的经纪商那里观察到)。
我在Linux Ubuntu-MATE 16.04桌面上使用MT4 1090版本,运行WINE 3.0。
这是我一直在使用的东西...
这里是。
我注意到在两个不同的经纪商那里,OrdersTotal()的值并不总是与MT4经纪商的'Trade'标签中显示的一致。 最初,我认为是经纪商导致OrdersTotal()不能正常工作。当我在第二个经纪商那里注意到时,我开始怀疑MT4是否有一个内部'问题',或者我的代码是错误的,或者这是否是一个与服务器同步的问题 ....?
在阅读了这个论坛主题后,我想知道我是否可以通过改变for...循环来获得更好的结果。
或者,是否有一个标志或一行代码可以确保OrdersTotal()在OnTick()事件中被正确同步?任何关于这个问题的澄清都将是非常有帮助的,我们将非常感激!
这是我看到的最常见的错误之一,部分原因可能是由于像Expert Advisor Builder这样的垃圾。 因此,我认为现在是时候为这个问题建立一个专门的主题,以便将来可以链接到它,供人们参考。
问题
让我们举个简单的例子;我们想要一个函数来关闭我们EA的所有未结订单,有很多例子,但让我们从头开始创建一个。
我们需要一个循环,因为我们想关闭特定EA的所有订单,在 这个循环中,我们将有代码来选择订单,代码来检查它是正确的符号和魔法数字,最后代码来关闭订单。
这段代码是坏的.. . 不要使用它.. . 我将在下一节中解释原因 .
解释
让我们通过上面的代码......一行一行的,一个一个的订单......来工作。
让我们假设我们有以下要关闭的订单,他们都有相同的魔法号码和符号,所以我们希望我们的代码能将他们全部关闭。
循环的第一次运行。
PositionIndex的初始值是0,所以位置0的订单被选中,票号是111,这个订单被成功删除,其余订单的位置变化如下。
循环的第二次运行。
现在PositionIndex 的值是1,所以位置1的订单被选中,票号333, 这个订单被 成功 删除,其余订单的位置变化 如下。
循环的第三次运行。
现在 PositionIndex的值 是2,所以位置2的订单被选中,票号是555, 这个订单被 成功 删除,其余订单的位置变化 如下。
循环的第四次运行。
现在 PositionIndex的值 是3 OrderSelect()试图选择位置3的订单,但失败了,继续执行代码到循环中的下一个值。
循环的第5次和最后一次运行。
现在 PositionIndex 的值 是4,OrderSelect()试图选择位置4的订单, , 但失败了,Continue将代码执行到循环中的下一个值。 ...循环已经结束。
我们现在只剩下2个订单,即222和444号票,它们本应被关闭,但却没有。
解决方案
下面的代码是在关闭未结订单或删除待定 订单时的正确做法 ......
关键的区别是,该循环从(TotalNumberOfOrders - 1 ) 递减到0
让我们再一次通过上面的代码 ...... 一行一行地,一个一个订单地 ......
我们有和之前一样的订单。
循环的第一次运行。
PositionIndex的初始值是TotalNumberOfOrders-1,等于5-1=4, 所以位置4的订单被选中,票号555,这个订单被成功删除,其余订单的位置变化如下。
循环的第二次运行。
现在PositionIndex 的值是3,所以位置3的订单被选中,票号444, 这个订单被 成功 删除,其余订单的位置变化 如下。
循环的第三次运行。
现在 PositionIndex的值 是2,所以位置2的订单被选中,票号333, 这个订单被 成功 删除,其余订单的位置变化 如下。
循环的第4次运行。
现在 PositionIndex的值 是1,所以位置1的订单被选中,票号222, 这个订单被 成功 删除,其余订单的位置变化 如下。
第五次也是最后一次运行循环。
现在 PositionIndex 的值 是0 ,所以位置0的订单被选中,票号111, 这个订单被 成功 删除,值0是循环的最后一个有效值 . . . 循环已经结束。
我们已经成功删除了所有匹配的订单 . .
链接到这个主题。 循环和关闭或删除订单
事实上,我有一个代码,我相信我已经做对了,但选择对我来说不起作用,因为我无法读取所选订单的OpenPrice。其他一切都很好,只是提供了这部分代码。我不知道为什么。
整个代码有4个部分,我需要在订单发送后立即调用OrderOpenPrice...。OrderSend工作良好,OrderSelect不会得到我需要的结果。如果你能帮助,请参考代码的1个部分。
谢谢你。
感谢亲爱的Simon Gniadkowski。
你的帖子真的节省了我的时间。
这是我建议的关闭市场订单的代码
我建议,如果使用前向循环,这是正确的方法(遵守美国经纪商的先进先出规则)。
在前向循环中。
循环和关闭或删除订单 - MQL4编程论坛
对于 先进先出(美国经纪商,)和 你(可能)处理每个符号的多个订单,你必须 找到最早的订单,关闭它,在操作成功 后,重新处理所有剩余的位置。
按先进先出规则关闭订单 - Strategy Tester - MQL4编程论坛 - Page 2 #16
什么是函数的返回值?我如何使用它们?- MQL4编程论坛
MQL4程序中的常见错误以及如何避免这些错误 - MQL4文章
你会知道这对我有多大帮助。不仅仅是我正在研究的代码,而是我完全的理解。它现在工作得很完美,而且我有了以不同方式实现它的理解。
真的非常感谢这些信息。