- 交易
- 智能交易
- NetTradeX 智能交易系统 (简称EA)
- MetaTradeer 脚本转换为NetTradeX Advisors
MetaTradeer 脚本转换为NetTradeX Advisors
引言
当前Meta Trader 4交易平台拥有数量巨大的智能交易脚本。 交易者希望将这些脚本应用于NetTradeX平台,此前需要全部重新编写脚本,非常耗时。 为了这一工作,我们创建了MQL4 和 NTL+兼容的语言库。 语言库大大简化了转化NTL+语言的过程。 由于MetaTrader 和 NetTradex平台的不同 (对应MQL4 和 NTL+语言),您需要在脚本中完成一些修改。 大部分的工作就是将MQL4语言库提供给NetTradeX Advisors,但是程序员仍旧需要修改脚本来保证运行。 本文将介绍如何使用这一语言库的功能和需要做的修改。
MQL4.ntl语言库工作的基本原则
在进行实质性的工作前,您需要在MQL4语言中调试脚本。转换为NTL+脚本需要哪些步骤?
第一步 – 开始,您需要在NetTradeX Advisors平台的Navigator窗口中,在Scripts下建立新的脚本文件。该文件根据用途位于Advisors 或 Utilities文件夹中。 之后将整个MQL4的脚本复制到文件中。
第二步 - 连接MQL4语言库。 对此需要在文件的开始添加 #include "Libraries\MQL4.ntl" 一行。 需要指出的是,MQL4语言库的功能不需要执行文件,需要进行编辑。语言库不是自动运行并完成辅助的工作。
第三步 – 尝试编辑生成的脚本。对此在代码编辑器中点击按钮Compile 或者点击键盘的F7。编辑器会列出错误和警告项,我们需要一步一步的更正。 当前我们关心两个部分:编辑器是否发现了语言库,以及脚本中是否具有全部的特殊函数。
如果编辑器没有发现语言库文件,会出现"Failed to open script file"的信息。这样的情况下,需要确定MQL4.ntl文件中指令 #include的路径和名字是否正确。
在MQL4语言中,3个预命令函数init(), start(), deinit()是特殊函数。 在NetTradeX Advisors平台中需要定义这3个函数。 但是在几个脚本中可能没有init() 和 deinit()函数其中的1个或2个。 这种情况下编辑器会告知您"No matching signatures to 'init()'" 或者 "No matching signatures to 'deinit()'"。这是您需要添加函数init() 和 deinit(),返回单一的符号0;
int init() { return 0; } int deinit() { return 0; }
如果没有下面的信息出现:"Failed to open script file" 和 "No matching signatures to 'init()'" / "No matching signatures to 'deinit()'",那么可以认为第一步已经完成。当前可以进入解决本地问题。
最常见的是编辑器错误信息,原因和消除错误方法
该部分介绍了在自动运行脚本时最常见的编辑器错误信息,并且给出了具体的解决办法。
No matching signatures to Print这个错误是因为在NTL+语言中无法使用带有参数的函数。 这种情况下需要修改函数,使得参数的数量与Print()函数确定的数相一致。函数Print()只能有一个参数输出。 因此使用 Print(参数1 +参数2+参数3)来代替 Print(参数1, 参数2, 参数3)。
Unexpected token 'unrecognized token'该错误出现的原因之一:通过MQL4语言库的命令#include来尝试连接。NTL+语言无法使用该语言库,因此无法使用这些文件命令,需要将该命令行从程序中删除。
'True'/'False' is not declaredNTL+语言中本地参数的开头是小写字母,因此将Ture替换为ture,False改为false。
No conversion from '_bars&' to 'int' availableMQL4语言中,变量Bars是确定当前图表条的数量。 在NTL+语言中存在同名的Bars,因此在MQL4.ntl语言库添加变量bars(带有小写字母b),使得返回的值是当前图表中条的数量,就是说来代替Bars。
Must return a value该错误是调用《return》时无返回值。 因此使用该操作符的函数,应声明,区别于 void 的返回值。因此当出现该错误时需要要么调整函数,或者给出return的值。
使用幻数(Magic number)当前版本的NTL+语言不支持幻数的使用。 对于所有的已开立头寸,幻数的返回值为零。在MQL4语言脚本中,建议关注特别是条件语句的幻数。 如果您不需要确定交易助手建立的头寸,往往只需要删除或者注释掉函数OrderMagicNumber()。
使用静态变量在NTL+语言中不使用关键词«static»。如果需要保持函数之间的变量值,使用全局变量(无关键词static),并放置在函数外。如果在运行交易助手时打算修改参数,如果愿意,可以添加extern。
手数的定义在当前版本中,每个工具的手的数量为100 000单位。因此,如果您使用的工具手数不是100000,而是其他的数量,需要单独的修改相应的参数。
DLL文件的不同在NetTradeX Advisors 和MetaTrader4平台中,DLL文件的运行是不同的。在MQL4语言中需要在DLL模块中完整的描述函数,而在NTL+语言中则不需要。 取消指定。
#import "文件_或_模块_名字" 函数描述 function1; 函数描述 function2; 函数描述 functionN; #import
只需要简单的创建对象dll 任意标示符 ("文件_或_模块_名字");并且通过
标示符.Call("函数_名字", 函数的参数用逗号分开);
或
标示符.CallProc("函数_名字", 函数的参数用逗号分开);来调用您需要的函数。
在MQL4和NTL+语言中,存在不同的保留字。 MQL4语言中可以使用的变量名或函数,在NTL+语言中没有或是相反。例如,编辑器调用信息Expected'(' 不使用括号。 重要的原因之一是因为在程序代码中变量名与保留字名重复。因此在这样的情况下,需要修改变量为其他名字。编辑中快速调用窗口Replace请按组合键Ctrl+H。
Float value truncated in implicit convertion to integer该警告是在试图给int分配float或是double类型的值时出现的。 对于运行脚本来说,修正错误不是必须,但是最好修改过来。 从double到int ,从float到int的转换需要是明确的。 例如变量d类型是double,形式如下 int(d)。
不存在bool和int的相互自动转换在NTL+语言中,int i; bool b = true; i=b;类型无法自动转换。并且会给出Can't implicitly convert from 'bool' to 'int'的错误信息。 因此,当您需要转换时,需要用到下列的帮助:
int Run() { // convertion from bool to int; bool a=false; int b = a?1:0; // convertion from int to bool int c=1; bool d = c==0?false:true; }Can't implicitly convert from 'datetime' to 'int'
在NTL+语言中对datetime需要明确转换为int。 按照下面的样式 int i; datetime d; i=int(d);
颜色常量在MQL4可以使用众多的常量,来针对图表的颜色对象。 这些常量在代码中会代表16个基本颜色,例如White或Black。 唯一例外的是 – 在图表显示中使用这些颜色。 如果使用颜色,NTL+中没有,那么需要通过RGB来确定颜色,例如,对于颜色Tomato定义如下:color Tomato = 0xFF6347
数组的使用在MQL4和NTL+语言有不同的数组。 在NTL+语言中,类型名称[]的样式仅针对数组。 所有的数组保存为array 类型 名称; 或 array 类型 名称(大小) 。因此需要使用array "string" symb= {"EURUSD", "GBPUSD", "AUDCAD"}; 来代替string symb[3] = {"EURUSD", "GBPUSD", "AUDCAD"};。
不支持的函数在NTL+语言中不支持几种函数。这几种函数需要删除或者修改代码的逻辑。在使用这些函数时,会输出这样的错误'The function is not supported' 或 'No matching signatures to function_name'。
不支持函数列表:
- SendMail()
- 函数组onArray
- 函数FileOpenHistory, FileIsLineEnding
- 函数组objects和对象性质
- 针对MarketInfo函数下列状态返回零值:
- MODE_SWAPLONG
- MODE_SWAPSHORT
- MODE_STARTING
- MODE_EXPIRATION
- MODE_MINLOT
- MODE_LOTSTEP
- MODE_SWAPTYPE
- MODE_PROFITCALCMODE
- MODE_MARGINCALCMODE
- MODE_MARGININIT
- MODE_MARGINHEDGED
- MODE_FREEZELEVEL
- 操作符 goto
- 自定义指标iCustom的计算函数
- (Window functions), MessageBox 窗口的函数组
- TerminalCompany(), TerminalName(), TerminalPath()
- 参数#property
概述
在本文中,我们讲述了MetaTrader平台代码转换为NetTradeX代码中遇到的困难。 这一过程大大简化了MQL4.ntl语言库。 语言库的优势 — 完整的开发代码, 客户可以自己复制和编辑。 我们也会不停往语言库添加新的函数,并且修改现有函数,以便是的转换更加方便快捷。