4.3 使用链接库(Library)
链接库为符合功能的集合。而包含文件是源代码文件,其内容是“包含”在可执行文件案中,链接库是包含汇入功能的独立可执行文件。因此,你必须同时拥有expert advisor可执行文件与链接库可执行文件来执行你的EA。
链接库储存在\experts\libraries文件夹中。源代码文件有.mqh扩展名,而可执行文件有.ex4扩展名。链接库没有init()、Start()或deinit()功能。欲声明档案为链接库,你必须把#property libraiy(#预定义参量链接库)预处理器指令放在档案的开头。
链接库的优势是已编译过,如需分配功能链接库就可进行,无须像分配包含文件那样暴露知识产权。你也可以进行链接库的错误修复程序,只要不变更功能声明(例如增删参数或功能),无须重新编译expert advisor。
链接库也有若干缺点。既然已经编译过,编译程序就不可能检查参数是否正确。在链接库功能中,你无法指定参数默认值。也就是说,在功能调用中,你需要为每个参数指定一个值。你无法在链接库中使用外部变量,或建立你的expert advisor可存取的全局范围变量。
你必须以#import指令将链接库功能汇入expert advisor。如链接库内含大量功能,最好是建立有#import语句的包含文件。这会增加你工作的档案量。除非有很好的理由才使用链接库,不然建议你还是继续用包含文件来储存功能。
你还可从Windows DLL中用#import指令汇入功能。在\experts\includes内的WinUser32.mqh包含文件中,用于MessageBox()功能的例子不胜枚举(我们在第八章会讨论MessageBox()功能)。使用DLL功能是进阶的用法,我们在这里不讨论,MQL4网站上有关于使用DLL的文章供有兴趣者参考。
简单的Expert Advisor(附功能)
以下为expert advisor的源代码,如在源代码文件中所呈现的。我们假设在本章建立的功能已在包含文件IncludeExample.mqh中声明,内容列在本书附录D中。



在本例中,我们从内有功能的包含文件开始,在此例中为IncludeExample.mqh。变量声明以及init()功能的内容还是和以前一样。在start()功能的开头,我们以CalCLotSize()和VerifyLotSize()计算并验证仓位的大小。
在买单和卖单区块中,我们以CloseBuyOrder()和CloseSellOrder()为相反的交易单平仓。新单以OpenBuyOrder()或OpenSellOrder()开仓。计算停损与获利之前,检查开仓交易单以及停损或获利是否设好了。
我们以OrderSelect()和OrderOpenprice()获取交易单的入单价。然后用CalcBuyStopLoss()或CalcSellStopLoss()计算停损,以CalcBuyTakeProfit()或CalcSellTakeProfit()计算获利。
我们查看停损或获利是否大于“0”,并以AdjustAboveStopLevel()和AdjustBelowStopLevel()功能验证停损与获利价格。最后,我们把这些价格传送至AddOrderProfit()功能,它会增设交易单的停损与获利。
上面的EA和先前章节“验证仓位大小”开始的代码完全一样,只是更容易阅读。透过破坏进入功能的代码,我们已经减少了源代码的混乱,使EA更易于管理。本书结束前,我们还会为此expert advisor再加些功能,可在附录C中检视完整代码。
一开始建立这些功能需要些时间,然而长期来看却能帮你节省时间,因为你会越来越轻松地拿捏交易构思,并在短时间内熟谙expert advisor的使用。