让我们举一个更复杂的例子 . . .
假设我们有以下要关闭的订单,它们都有相同的数字,但有些订单的符号与我们的EA不同,我们希望我们的代码能关闭与我们的EA相同符号的订单,EURUSD。
头寸 | 票号 | 符号 |
---|---|---|
0 | 111 | 欧元兑美元 |
1 | 222 | 欧元兑美元 |
2 | 333 | 英镑兑美元 |
3 | 444 | 欧元兑美元 |
4 | 555 | 欧元兑美元 |
循环的第一次运行。
PositionIndex的初始值是TotalNumberOfOrders - 1,等于5 - 1 = 4,所以位置4的订单被选中,票号555,这个订单与神奇的数字和符号相匹配,所以被成功删除,其余订单的位置变化如下。
位置 | 票号 | 符号 |
---|---|---|
0 | 111 | 欧元兑美元 |
1 | 222 | 欧元兑美元 |
2 | 333 | 英镑兑美元 |
3 | 444 | 欧元兑美元 |
循环的第二次运行。
现在PositionIndex 的值是3,所以位置3的订单被选中,票号444, ,这个订单与神奇的数字和符号相匹配,所以 被 成功 删除,其余订单的位置变化 如下。
位置 | 票号 | 符号 |
---|---|---|
0 | 111 | 欧元兑美元 |
1 | 222 | 欧元兑美元 |
2 | 333 | 英镑兑美元 |
循环的第三次运行。
现在 PositionIndex的值 是2,所以位置2的订单被选中,票号333, ,这个订单与神奇的数字匹配,但不是 符号,所以它 ,没有被删除,其余的订单没有变化。
位置 | 票号 | 符号 |
---|---|---|
0 | 111 | 欧元兑美元 |
1 | 222 | 欧元兑美元 |
2 | 333 | 英镑兑美元 |
循环的第四次运行。
现在 PositionIndex的值 是1,所以位置1的订单被选中,票号222, ,这个订单与魔法号码和符号相匹配,所以 ,成功 删除,其余订单的位置变化 如下。
位置 | 票号 | 符号 |
---|---|---|
0 | 111 | 欧元兑美元 |
1 | 333 | 英镑兑美元 |
第五次也是最后一次循环。
现在 PositionIndex 的值 是0 ,所以0位置的订单被选中,票号是111, 这个订单被 成功 删除,0值是循环的最后一个有效值 . . . 循环已经结束。
我们已经成功地删除了所有匹配的订单,只剩下一个不匹配我们符号的订单,票号333现在在0位置 ......
位置 | 票号 | 符号 |
---|---|---|
0 | 333 | 英镑兑美元 |
此主题的链接。 循环和关闭或删除订单
哇。 所有这些信息都是为了关闭一个订单。
我想知道需要多少信息才能每天持续获得50多个点,每天(平均)--在过去的137次交易中没有失败。
告诉我如何做这样的事情,我会认为这是非常有用的信息,大师,将是你的称号,直到永远,阿门。
哇。 所有这些信息都是为了关闭一个订单。
我想知道需要多少信息才能每天持续地获得50多个点,每天(平均)--在过去137次交易中没有失败。
Raptor,I do know at 1st glance of ur post that u r quite n expert in mql4.this thread again helps clear my doubts!keep up the good works.tnx
只是另一个想法。
for(PositionIndex = 0; PositionIndex < OrdersTotal() ; PositionIndex ++) // <-- for loop to loop through all Orders . . COUNT DOWN TO ZERO ! { if( ! OrderSelect(PositionIndex, SELECT_BY_POS, MODE_TRADES) ) continue; // <-- if the OrderSelect fails advance the loop to the next PositionIndex if( OrderMagicNumber() == MagicNo // <-- does the Order's Magic Number match our EA's magic number ? && OrderSymbol() == Symbol() // <-- does the Order's Symbol match the Symbol our EA is working on ? && ( OrderType() == OP_BUY // <-- is the Order a Buy Order ? || OrderType() == OP_SELL ) ) // <-- or is it a Sell Order ? add_trade_to_close_queue( OrderTicket()); // <-- You need to model the queue mechanism ... } // end of For loop
请注意。
只是另一个想法。
请注意。
这是我看到的最常见的错误之一,部分原因可能是由于像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是循环的最后一个有效值 . . . 循环已经结束。
我们已经成功删除了所有匹配的订单 . .
链接到这个主题。 循环和关闭或删除订单