1.1 名词定义

1.1 名词定义

在外汇操作中,新建一张卖出类型订单,有的人叫作"买入一张卖出单",也有人称作"买入一张渣单" 。鉴于各种称呼的不确定性,为了精确表达概念,在本书中均采用统一的名词定义(表1 - 1) 。

MQL4程序设计中最烦琐的莫过于对持仓单的控制了,例如EURUSD 现持有4 张买入单和2张卖出单,根据交易策略要求,现在需要将买入组盈利最小的订单平仓,卖出组亏损最大的订单平仓,编码工作量巨大而且容易出错,再加上EA同时挂在另一仓的CBPUSD需要区别对待持仓单,不能错误操作,此时的你是不是会感觉到无所适从呢?

上述控单策略在EA中屡见不鲜,笔者根据积累多年的程序设计经验,总结出一套模板,你只需要在新建一个EA的时候将这段程序直接复制粘贴到编辑器,就能又快又好、专心致志地考虑自己的策略流程,不必再为计算"哪张单是第一单"“哪张单是盈利最小的单”等要求而大伤脑筋了。

这是一段标准程序,预定义一组公共变量,随着新价格(tick) 实时更新,供你在各类控单模块中随时方便调用(表1 - 2) 。

表1 - 2 列出了22个公共变量,将当前货币对图表中的持仓单分为了买入组、卖出组,并对其进一步细分,包括组利润、组成交待仓单数量、组开仓量等基本控单操作需要用到的数据。

例如,买入单为3张时不再建仓, 代码书写就简单到如下程度:

许多时候,用户会使用不同的EA操作或者手工开仓,我们可以利用MQL4提供的订单特征码( OrderMagicNumber) 和订单注释( OrderCommenl )准确识别本EA 开出的订单。每一张建仓单都可以附加这两个标识符,值得注意的是,订单特征码只能在EA建仓时写入,订单注释则可以在手工建仓或者EA 建仓时写入。因此,当策略要求人工建仓后交还给EA管控,那就只能利用"订单注释"来分辨特定的持仓单了。如果成交持仓单因止盈/止损平仓,那么历史订单中该单的注释将在原有注释前增加" [tp ]"/" [ sl ] ”字样,例如订单注释为"test" ,止盈平仓后订单注释为" [tp]test"。

这段标准程序由两个主要自定义函数构成,其中iShowlnfo ( )用来实时更新22个公共变量, iOrderSortTicket ( )用来计算特定条件下排序(对数组实施冒泡排序法)后的变量,如计算"最值"详细用法参见源码中的注释。

细心的读者会发现,在start ( )模块调用自定义函数iMain() , iMain() 函数中再调用iShowlnfo ( ) ,为什么不在start ( )模块中直接使用由iShowlnfo ( ) 呢?原因很简单,为了防止被破解。

众所周知,网上针对MQL4有一个破解工具,能够反编译ex4程序,不过演示版只显示start ( )、init( )、deinit ( )中的内容,程序中其他自定义函数则仅仅列出函数名称,该破解工具正式版的收费500美元,而MelaTrader公司为了防止EA被破解,经常会通过升级MT4版本方式改变ex4程序加密算法,他们彼此无休止地斗法至今。出于对自己知识产权的保护意识,笔者建议程序设计人员应该养成好习惯,最大限度地杜绝恶意破解。当然,最佳的加密方法是编写dll ,这里就不赘述了。