5.2 交易单计数

5.2 交易单计数


5.2.1 未平仓单数量

找出EA 开了多少交易单及其类型往往非常有用。我们会根据交易单类型,建立几个交易单计数功能,以计算目前未平仓单数。下面的功能用来计算未平仓单的总数:

我们已将交易单计数功能命名为TotalOrderCount ( ) 。它会返回一个整数值,指出目前指定的图表符号上,符合以功能自变量传递的自定义数字的未平仓单有多少。

我们从声明OrderCount (交易单计数)变量开始。由于我们未指定初始值,OrderCount会以"0" 初始化,你会认出上节的for 运算符和OrderSelect ( )功能吗?

交易单库既然有所有未平的交易单,包括其他EA 下的那些单,我们有必要确定哪些交易单是我们的EA 下的。我们先检查选定的交易单的OrderSymbol ( ) ,确保其符合argSymbol 自变量,然后检查交易单的自定义数字。

如果OrderMagicNumber( )符合argMagicNumber 自变量,我们就可以相当肯定,它是此EA 所下的交易单。只要用户没在有相同自定义数字的相同货币符号上操作两个EA ,就能青定它是此EA 所下的交易单。在同台机器上操作多个expert advisor 时,请小心确保你的每个EA 都使用独特的自定义数字。

如交易单同时符合我们的自定义数字与图表符号, OrderCount (交易单计数)的值就加1 。在回路通过交易单库中的所有交易单后,我们把OrderCount 的值返回给调用功能。

这里提供如何在代码中使用此操作的例子:

如有此EA 开仓的交易单,且CloseOrders 的值为真(我们会假设程序某处已将此值设好) ,在大括号内的代码会执行将所有开仓的交易单平仓。

我们将交易单计数程序修改成只计算市价买单:

代码和之前的一模一样,除了加上了OrderType ( )功能来检查目前选定的交易单类型。OP_BUY 是表示市价买单的常数。要计算其他类型的交易单,只需以适当的交易单类型常数替代OP_BUY ,并将此功能重新命名以反映交易单类型。

建议你就每种交易单类型建立交易单计数功能。你可在附录D 中检视所有交易单计数功能的代码。

5.2.2 多张交易单平仓

更多时候,我们需要把同类型的多张交易单平仓。我们结合交易单回路和平仓程序,一次平仓多张交易单。此功能是将expert advisor 的所有市价买单平仓:

请注意: 我们是以void (无效)作为功能数据类型的。我们已确定此功能无有用数据可返回,因此在功能中不要求return 操作。

你会认出交易单回路代码的for 回路和OrderSelect ( )功能。我们会进行回路通过交易单库,并查看每张单是否需要平仓。如果目前的交易单是以OP_BUY 表示的市价买单,并符合图表符号和自定义数字自变量,我们就会把交易单平仓。

我们调用OrderTicket ( )功能来获取目前的交易单单号。从这里开始,我们的代码与前面各章所讲的市场买单平仓代码是相同的。请注意:最后那个语句"Counter 一(计数器) " ,如果交易单顺利平仓, Counter 变数则会减"1" 。我们之前有解释过,交易单平仓时,所有后续交易单的指数都会减1 。交易单平仓后,若没有减去计数器变量,随后的交易单就会被跳过。

交易单从旧到新依序进行回路通过,背后有很好的理由:依据2009 年夏天起生效的NFA 规定,美国经纪商必须依下单顺序将同个货币符号的多张交易单平仓。此即所谓的FIFO( 先进先出法) 。交易单从旧到新依序进行回路通过,确保我们在平仓交易单时遵守FIFO 。

使用上面的代码平仓市价卖单,只需把交易单类型变更为OP_SELL 和ClosePrice至符号的卖价。附录D 中可检视卖单平仓功能源代码。

我们来检查平仓多张挂单的代码。此例会将所有停损买单平仓。此代码和上述平仓市价买单代码的区别在于,我们指定OP_BUYSTOP 作为交易单类型,并以OrderDelete ( )平仓此单。

此代码适用于所有挂单类型,只要将交易单类型比对改成你想平仓的交易单类型即可。附录D 中可检视所有挂单的平仓功能源代码。