5.1 交易单循环
5.1.1 for 运算符
for 运算符是用来进行预定次数的回路通过代码区块。我们声明以整数变量作为计数器,并给它指定开始值。我们指出条件,若成立就执行回路。我们还指出递增计数器变量的表达式。
这里有for 循环的例子:

第一个表达式, int counter = 1 ,以1 值初始化Counter( 计数器)变数。
第二个表达式, Counter < = 3 ,即为条件: 如为真(true) ,就执行括号内的代码:如为假(false) ,回路结束,并在大括号(})结束后继续执行。
第三个表达式, Counter + + ,意思是"以1 递增计数器的值" 。表达式Counter 一会将值减" 1 " ,而Counter + 2 会以2 递增。每次回路结束时,计数器变量会递增或递减。下次回路迭代,第二个自变量,即此例中的Counter < = 3 ,会重新被评估。请注意:第三个表达式之后没有分号。
上面的例子会执行回路三次。每次迭代后,计数器都会加1; 第三次迭代后,回路会终止。
注: 迭代是重复反馈过程的活动,其目的通常是为了逼近所需的目标或结果。每次重复过程就称为一次"迭代",而每次迭代得到的结果会被用来作为下次迭代的初始值。
5.1.2 while 运算待
while 运算符在MQL 中是较简单的回路方法。如确实知道要执行回路多少次,用for 回路最好。然而,若不确定迭代次数, while 回路会更合适。
这里有while 回路的例子:

此例子使用了名为Something 的布尔变量。如Something 为真(true)的,就会执行回路。当然,如果Something 的值从不改变,回路就会无止境地执行。因此,在回路过程中必须在某处改变Somethíng 值的条件。此条件一旦成立, Something 会变成false ,回路就会停止执行。
你还可递增变量,如同使用for 操作员那样:

此代码执行起来与5.1.2 中的for 回路完全一样。
5.1.3 交易单回路
此为我们用来进行回路通过未平仓交易单库源代码:

我们会把Counter( 计数器)的值设为"0" 并迭代回路,只要Counter 小于等于Order百Total( )的值减"1" 。每次迭代回路后, Counter 就会加"1" 。
OrdersTotal( )是返回目前开仓单数的功能。我们为何要把OrdersTotal ( )的值减" 1 " ,让我们从交易单库是如何运作中了解。
交易单库内含终端机中目前所有未平仓的交易单,包括手动以及expert advisor所下的单。交易单指数从零开始编号。如有一张单未平,指数为"0" 。第二张单未平时,指数为"1" 。如有第三张单未平,指数为"2" ,以此类推。指数"0" 是最旧的单,指数"2" 是最新的单。
OrdersTotal ( )会返回目前未平的单数。在上述的例子中,我们有三张单未平仓。但由于交易单指数从"0" 开始,我们希望计数器变量最多算到" 2"。Counter的值必须对应我们的交易单指数,这就是为什么我们必须把OrdesTotal ( )减"1" 。
交易单库中的单平仓时,库中任何较新的单的指数都会递减。例如,如指数为"0" 的交易单平仓了,那么指数"1" 的交易单会成为指数"0" 的交易单,而指数"2"的交易单会成为指数"1" 的交易单。这在交易单平仓时是相当重要的,我们下面会介绍更多的详情。
返回交易单回路: OrderSelect ( )语句使用Counter 变量作为交易单部位的指数。如上面所解释的,我们透过交易单库方式,从最旧的到最新的单依序递增。SELECT_BY_POS 参数指出,在交易单库中,我们将依部位而非依单号选择交易单的。
对于这个回路的首次迭代, Counter 会等于"0" ,且我们会以OrderSelect ( )选择交易单库中最旧的单。然后,可以OrderTicket ( )或OrderStopLoss ( )等功能检查交易单信息,进行必要的修改或平仓。