MetaTradeer 脚本转换为NetTradeX Advisors | IFCM
IFC Markets 網上CFD經紀商

MetaTradeer 脚本转换为NetTradeX Advisors

MT4至NetTradeX的脚本转换

引言

当前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 declared

NTL+语言中本地参数的开头是小写字母,因此将Ture替换为ture,False改为false。

No conversion from '_bars&' to 'int' available

MQL4语言中,变量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语言库。 语言库的优势 — 完整的开发代码, 客户可以自己复制和编辑。 我们也会不停往语言库添加新的函数,并且修改现有函数,以便是的转换更加方便快捷。

Close support
Call to Skype Call to QQ Call Back