[智能交易系统软件是用来对交易过程全程自动化,免除交易商连续对市场进行日常烦琐的监护。 许多专业交易商利用多层交易系统,对不同的市场和在不同的环境下进行操作。通常他们在著名的分析软件包里对交易战略进行编写和测试,比如,MetaStock 和 TradeStation。
什么是智能交易系统?它是一个用特殊的MetaQuotes 语言 4 (MQL 4)编写的自动交易系统(ATS),和特定的图表联系在一起。智能交易系统不仅能通知交易商交易机会,而且还能自动执行交易账户上的交易,直接发送到交易服务器。和许多的IT系统一样,智能交易系统系统支持历史数据战略测试,图表上表示的登入/登出点。而且,智能交易系统的可执行码分别存储于源文件和加密的执行文件中-这种安排保证了交易商所使用的逻辑隐藏(如有必要的话),而不会泄密。
编写自己的智能交易系统软件也非常容易:尝试一下吧!不需要是专业编程高手,你只需要学会使用非常简单的语言-MQL 4语言。即使用户不能自行编写智能交易系统规则,但是他需要熟悉最近的编程技能,不过很可能不需一个小时他便掌握了这些规则并能编写程序。
无数的交易商为MetaStock 和 TradeStation软件开发了多种多样的交易战略。其中多数均被翻译成MQL 4语言,这就使得用户可以把前期累计的经验并合到里面去。有些即学即用智能交易系统版本可以从本页下载。
<img id=\"aimg_s44V4\" class=\"zoom\" file=\"http://www.qqfx.com/users/uploadfile/200651616233309.JPG\" border=\"0\" alt=\"\" />
MultiBank Trader软件将智能交易系统在程序的根目录/Experts 子目录里保存为*.MQ4(source text) 和 *.EX4 (可执行码)文件。交易商可以无限量地保存智能交易系统数据,这些数据可以通过导航条窗口容易地加以管理。
创建自定义智能交易系统数据的程序以及将数据和交易终端连接在MultiBank Trader用户指南里有详细的描述。
MetaQuotes 4 语言是用来编写自定义智能交易系统软件,以便使交易程序管理自动化以及执行交易商自己的交易策略。MetaQuotes 4 语言易学、易用、易创建。MetaQuotes 4 语言包括相当数量的变量,用来控制当前和前期的报价、主要的算术和逻辑运算和特征,主要的内置指标和用来开启和控制头寸的命令。在语法上,该语言和由TradeStation 技术有限公司开发的简易语言相似,但是它有其自身的一些具体特征。
程序代码是用MetaEditor4编辑器编写的,它能够用不同的色彩集中反映MQL 4语言的不同结构,因此,有助于用户熟悉专家系统的文本。 注解开始于//符号(双斜线)。注解也可以用“斜线-星号”-“星号-斜线”组合(/*[注解]*/, 就像在 \"C\"编程语言一样)。
<img id=\"aimg_xBtpc\" class=\"zoom\" file=\"http://www.qqfx.com/users/uploadfile/20065161636663.JPG\" border=\"0\" alt=\"\" />
设定和控制操作战略,交易商保存一份日志文件,存储产生的信号信息、变量输出和已执行交易的结果。智能交易系统日志保存在MultiBank Trader目录下/logs/YYYYMMDD.log 文件里。当前的日志可以从下方的“终端”窗口(日志标签)直接进入。
<img id=\"aimg_dgC9s\" class=\"zoom\" file=\"http://www.qqfx.com/users/uploadfile/200651616359210.JPG\" border=\"0\" alt=\"\" />
进入MQL 4语言的目录系统,要么按目录按钮或从工具菜单打开MetaQuotes语言词典窗口操作。这个短小的手册包含分类、运算、存储词语等功能,使得用户对该语言所用到的每个元素都有所了解。
<img id=\"aimg_idY31\" class=\"zoom\" file=\"http://www.qqfx.com/users/uploadfile/200651616429199.JPG\" border=\"0\" alt=\"\" />
1. 主要语言结构
像其他任何语言一样,MQL4有一套构成基本结构的主要组成元素。这些组成元素以一种特殊的方式组合排列的,以便代表适当的陈述和表达。
语言的主要对象就是数据,包括三种类型:数字、逻辑和排列。 所有的数值均采用双格式,逻辑数据可能包括真值和假值。排列就是用省略号标注的一系列字符。字符串也叫做文本串。数据可以包含在适当类型的变量之中,或直接由程序的源文本表现出来。
一个MetaQuotes 语言陈述指一个完整的用法说明。陈述可以包括保留字、运算符号、数据、变量、表达式或标点符号,而且总是以分号结尾。
保留字指具有特定或特别意义的预先设定的词语。
运算符号指在数据、变量和(或)表达式中特定的具体运算符号。
变量是用来限制数字、排列或逻辑数据的。
表达式指保留字、变量、数据和运算符号的组合,因为它们具有语言的3中类型(保留字、变量、数据)中的任一价值。
标点符号用来代表表达式,界定参数,区分词语或重新排列计算顺序。
2. 标点符号
字符
名称
描述
;
分号
结束MetaQuotes 4语言指令
( )
圆括号
对表达式的值进行分组,改变计算顺序。 标注函数参数并启动变量描述表达式 标注变量的初始值并在变量描述区排列组合
,
逗号
提取函数值时,对参数进行区分 在变量描述区对变量进行区分 在描述排列长度时对数字进行区分 区分进入排列元素的指标
:
冒号
用在变量描述区,启动变量列表
\" \"
引号
标注一个文本(字)串。
[ ]
方括号
标注数字,确定排列长度 标注进入某个特殊排列元素的数字(指数) 标注进入历史数据的期间数字
{ }
波形括号
充当运算括号。可以用来代替 begin...end。将指令系列隔离成块。
/* */
注解括号
标注注解
//
双斜线
明确说明单串注解的开始
3. 运算符号
运算符号分成5 组:分配符号、字串符号、数学运算符号、相关符号和逻辑符号。
3.1. 分配符号
分配符号\'=\'(等号)是用来将具体数值(数字、排列或逻辑,视变量类型而定)分配到变量中。分配值可以是表达式的结果。比如: 变量: Counter(0); ... Counter = Counter + 1;结果,反向变量取值为1。变量值也可以分配来对元素进行排列。
3.2. 字串符号
操作文本串,只有一个运算符可以用上: \'+\' (加号)。 它是用来连接两个字串的。比如:
变量: 字串(\" \"); ... 字串 = \"some_\" + \"text\"; 结果,字串变量包含“some_text”这样的文本串,允许将字串与数字和逻辑值结合起来。在后面的这个例子里,数字及或逻辑值在结合前,应转化为字串类型。比如: String = \"string\" + 1; 因此,字串变量将包含\"string1\"的文本串。 操作数不仅可以是数值,也可以是相应的含有这样数值类型的变量,以及表达式,经执行后,便产生这样的数值。
3.3. 数学符号
4种主要的数学运算:加法- \'+\' (加号)、减法-\'-\' (减号)、乘法-\'*\' (星号)、除法-\'/\' (斜线),都用在计算数值的数学表达式里。
数学表达式的例子:( Ask + Bid ) / 2 , High[1] + 20 * Point
3.4. 相关符号
相关符号用来对同种类型的两个数值进行比较。 第一个数值和第二个数值进行比较,产生逻辑值“真值”或“假值”, “小于”-\'\' (右小于号);“等于”-\'=\' (等号);“不等于”-\'\'; “小于或等于”-\'=\'。由相关表达式而取得的逻辑值用在MetaQuotes II语言的控制结构里。比如:
if FreeMargin
3.5. 逻辑符号
逻辑符号使用户能够将逻辑值结合起来。逻辑OR - \'|\' (垂直线或竖杠);逻辑AND-\'&\' (“和”符号)。逻辑符号有相应的保留字OR, AND, NOT。 比如: If FreeMargin > 100 and FreeMargin = 1000; If not Condition1 then exit; 下面是逻辑运算符号的结果表:
Value1
Value2
Value1 OR Value2
True
True
True
True
False
True
False
True
True
False
False
False
Value1
Value2
Value1 AND Value2
True
True
True
True
False
False
False
True
False
False
False
False
Value1
NOT Value1
True
False
False
True
4.固定字
MetaQuotes 4 语言使用下面的几组固定字。 1. 逻辑符号。 AND, NOT, OR. 2. MQL 4语言指令。 Array, Begin, Break, Continue, Define, Downto, Else, End, Exit, For, If, Input, Then, To, Variable, While。界定语言指令结构的固定字也叫做关键字。 3. 内置函数。 Abs, AccName, AccountName, Alert, Ceil, CloseOrder, Comment, Cos, CurTime, Day, DayOfWeek, DeleteOrder, Exp, Floor, Highest, Hour, iADX, iATR, iBANDS, iCCI, iMA, iMACD, iMFI, iMOM, iRSI, iSAR, iSTO, iWPR, IsDemo, IsIndirect, LastTradeTime, Log, Lowest, Minute, Mod, ModifyOrder, Month, MoveObject, NumberToStr, Ord, OrderValue, Period, Pow, Print, PrintTrade, Rand, Round, ServerAddress, SetArrow, SetObjectText, SetOrder, SetText, Sin, Sqrt, Srand, Symbol, Tan, TimeToStr, Year. 4. 预先设定用户变量(用户定义变量)。 Lots, StopLoss, TakeProfit, TrailingStop. 5. 预先设定交易终端变量。 AccNum, AccountNumber, Ask, Balance, Bars, Bid, Close, Credit, Equity, FreeMargin, High, Low, Margin, Open, Point, PriceAsk, PriceBid, PriceHigh, PriceLow, PriceTime, Time, TotalProfit, TotalTrades, Volume. 6. 预先设定内置函数参数(宏命令)。 MODE_CLOSE, MODE_EMA, MODE_HIGH, MODE_LOW, MODE_MAIN, MODE_MINUSDI, MODE_OPEN, MODE_PLUSDI, MODE_SIGNAL, MODE_SMA, MODE_STOPLOSS, MODE_TAKEPROFIT, MODE_VOLUME, MODE_WMA, OBJ_HLINE, OBJ_SYMBOL, OBJ_TEXT, OBJ_TRENDLINE, OBJ_VLINE, OP_BUY, OP_BUYLIMIT, OP_BUYSTOP, OP_SELL, OP_SELLLIMIT, OP_SELLSTOP, SYMBOL_ARROWDOWN, SYMBOL_ARROWUP, SYMBOL_CHECKSIGN, SYMBOL_STOPSIGN, SYMBOL_THUMBSDOWN, SYMBOL_THUMBSUP, VAL_CLOSEPRICE, VAL_CLOSETIME, VAL_COMISSION, VAL_COMMENT, VAL_LOTS, VAL_OPENPRICE, VAL_OPENTIME, VAL_PROFIT, VAL_STOPLOSS, VAL_SWAP, VAL_SYMBOL, VAL_TAKEPROFIT, VAL_TICKET, VAL_TYPE. 实际上,上述固定字为宏记录器,即语法分析程序用数值取而代之。宏记录器的引入简化了编写用户功能要求的程序:更加方便、无关联的重要词语可以用来替代一些函数参数值。同样可以用于色彩名称。 7. 色彩。 AliceBlue, AntiqueWhite, Aqua, Aquamarine, Azure, Beige, Bisque, Black, BlanchedAlmond, Blue, BlueViolet, Brown, BurlyWood, CadetBlue, Chartreuse, Chocolate, Coral, CornflowerBlue, Cornsilk, Crimson, Cyan, DarkBlue, DarkCyan, DarkGoldenrod, DarkGray, DarkGreen, DarkKhaki, DarkMagenta, DarkOliveGreen, DarkOrange, DarkOrchid, DarkRed, DarkSalmon, DarkSeaGreen, DarkSlateBlue, DarkSlateGray, DarkTurquoise, DarkViolet, DeepPink, DeepSkyBlue, DimGray, DodgerBlue, FireBrick, FloralWhite, ForestGreen, Fuchsia, Gainsboro, GhostWhite, Gold, Goldenrod, Gray, Green, GreenYellow, Honeydew, HotPink, IndianRed, Indigo, Ivory, Khaki, Lavender, LavenderBlush, LawnGreen, LemonChiffon, LightBlue, LightCoral, LightCyan, LightGoldenrod, LightGreen, LightGrey, LightPink, LightSalmon, LightSeaGreen, LightSkyBlue, LightSlateGray, LightSteelBlue, LightYellow, Lime, LimeGreen, Linen, Magenta, Maroon, MediumAquamarine, MediumBlue, MediumOrchid, MediumPurple, MediumSeaGreen, MediumSlateBlue, MediumSpringGreen, MediumTurquoise, MediumVioletRed, MidnightBlue, MintCream, MistyRose, Moccasin, NavajoWhite, Navy, OldLace, Olive, OliveDrab, Orange, OrangeRed, Orchid, PaleGoldenrod, PaleGreen, PaleTurquoise, PaleVioletRed, PapayaWhip, PeachPuff, Peru, Pink, Plum, PowderBlue, Purple, Red, RosyBrown, RoyalBlue, SaddleBrown, Salmon, SandyBrown, SeaGreen, Seashell, Sienna, Silver, SkyBlue, SlateBlue, SlateGray, Snow, SpringGreen, SteelBlue, Tan, Teal, Thistle, Tomato, Turquoise, Violet, Wheat, White, WhiteSmoke, Yellow, YellowGreen. 所有的固定字均是非敏感字号,即它们可以小写也可以大写。
4.1. 智能交易系统向导
智能交易系统向导提示MQL 4允许编写智能交易系统、自编指标、自编脚本和从模板中进行编辑
<img id=\"aimg_OtGR7\" class=\"zoom\" file=\"http://www.qqfx.com/users/uploadfile/20065161650746.JPG\" border=\"0\" alt=\"\" />
预先设定参数或变量的名称,将会自动在文本编辑栏中出现参数框架:
<img id=\"aimg_TQFSa\" class=\"zoom\" file=\"http://www.qqfx.com/users/uploadfile/200651616513338.JPG\" border=\"0\" alt=\"\" />
4.2. MetaQuotes 4 语言的指令结构
4.2.1. 变量宣告和语句
在计算过程中保存临时数据要求使用变量。变量在本程序的开头部分就用保留字、变量、排列和定义进行了叙述。他允许使用这些词语的负数形式,即 “ Variables, Arrays and Defines”。 这些词中间总有一个开始变量的宣告叙述。这些词语的差别如下: \"variable\" 语句简单变量,\"array\"语句排列, \"define\" 语句附加用户定义的变量,类似于预先界定的用户变量,均可以通过设置对话框进行修改,即从外部修改。然而,又不像预先界定的变量,用户变量可以在程序内部的计算过程中进行更改。 变量宣告语法: 变量:名称(初期值);这里名称就是变量的名字;“初期值”就是变量的起初值。初期值对变量的类型-数字、字串或逻辑值进行界定。 一个数字变量宣告的例子: Variable : Counter( 0 ); 一个字串变量宣告的例子: Variable : String1( \"任意字串\" ); 一个逻辑变量宣告的例子: Variable : MyCondition( false ); 数组声明语法: Array : ArrayName[Array length]( 初始值 );其中,数组长度有一个或若干(多达4)个数字-数字 - number[, number [, number [, number]]]. 在MetaQuotes 4语言里, 数组可能是1-,2-,3-,4-个元素长度,一般情况下,数组就是一组可以用同一个名称查找到的、并按照相继成行定位数组且给定了数组元素的序列号(数)的变量。数组方便于对同样类型的数据排序。数组的一个典型例子就是交易终端的历史数据,比如,收盘、开盘、高点位、低点位、交易量。这些数据作为单一元素数组的。比如, Close[ 5 ] 指后退5个交易期间的收盘值。两个元素的数组可能是一个简单表格,其中第一个分量为行而第二个分量则为列。 Array: MyTable[ 10, 5 ]( 0 ); // 一个10行5列的表格。 ... print( MyTable[ 2, 4 ] ); // 打印第二行的第4个元素 数组可能包括任何类型的数值-数字、字串或逻辑值,但是应该为同一类型,其中的初期值在数组被宣告时为特定的。 附加用户定义变量宣告语法: 定义:名称(初期数);其中名称为变量名称;初期数为变量起初的数字值。 应该注意,附加用户定义变量可能只为数字类型。如上所述,用户定义变量可以在程序的计算过程中进行修改。这些修改只能运用到智能交易系统的当前时段,直到特殊的智能交易系统从图表中删除或客户终端的操作结束。当新的智能交易系统时段启动时,用户定义变量值将重新初始化。
4.2.2. 退出语句
退出报告中断智能系统软件的操作。也就是所谓的预先设定的程序终止。
4.2.3. IF-THEN条件语句
If-Then条件语句使得控制智能交易系统指令的执行顺序得以可能。该语句可能有不同的方式编写: if Condition then Statement;or if Condition then begin Statement; Statement; ... end;其中,条件为一个逻辑表达式,取值为True 或 False; \"Statement\" 指MetaQuotes II语言中的任何指令。符号括号Begin End可能被波形括号{ }所替代。 条件语句可能被用在对程序进行分支。为达到此目的,另一个关键字Else要用上。语法: if Condition then Statement1 else Statement2;or if Condition then begin Statement; Statement; ... end else Statement; Statement; ... end;or if Condition then begin Statement; Statement; ... end else Statement2;or if Condition then Statement1 else Statement; Statement; ... end;可以使用嵌套式的条件语句。一般说来,语句可能由MetaQuotes II语言的任何合法指令表示,除非变量宣告,因为严格来说, 变量宣告并不是一个可执行语句。
4.2.4. WHILE循环
WHILE循环确保在循环条件有效时,包含在循环主体中的语句的多次执行。一个循环可以用Break 语句提前终止。迭代可以通过使用Continue语句停止。这个语句造成循环的下一个迭代开始,即Continue后面的语句直到循环主体结束在本迭代中不得执行。在条件语句中用Break 和 Continue是合理的。语法: while Condition begin Statement; [break;][continue;] ... end;其中,条件是循环执行条件-在每个循环迭代之前计算出的一个逻辑表达式,取值为True 或 False; 语句是MetaQuotes 4语言的任何指令。 符号括号Begin End表示循环主体,可以被波形括号{ }替代。 “Break and Continue”描述也不是强制性的。 Example: Counter = 1; while Counter
4.2.5. For 循环
For循环确保在循环主体中所包含的具体次数的语句执行。语法: for NumberVariable = InitialValue to|downto LimitValue begin Statement; [break;][continue;] ... end; 其中数字变量就是在每次迭代之后循环要么增加或者减少到1的循环变量 (视使用关键字To 或 Down to而定); 初期值指循环变量的起初数值。 语句指MetaQuotes 4 语言的任何指令。 To or Downto 确定循环变量增加到1(To)或者减少到1(Downto); 限值是循环变量的边际数值。 操作符brackets Begin End表示循环主体,可以被波形括号{}取而代之。 Break 和Continue语句并非是强制性的。 Example: 比如: for Counter = 1 to 10 begin if Counter > Bars then break; print( Close[ Counter ] ); end; 这个例子说明一个可能被执行10次的环。但是,若基准值小于10, 循环就会提前终止,也就是说循环执行BARS次。
4.2.6. BREAK中断语句
中断语句确保一个For 循环或一个While循环早点终止。前例不仅说明循环执行,也说明了中断语句的使用。“Break”语句不仅用于循环主体之外。循环是嵌套式的,中断语句中离其最近的循环。换言之,中断内部循环的语句并没中断外部循环。
4.2.7. CONTINUE继续语句
CONTINUE继续语句提前终止循环的迭代,并从循环主体开始下一个迭代。换句话说,在Continue之后语句被忽略。比如: for Counter = 1 to 10 begin ... if Counter > Bars then continue; print( Close[ Counter ] ); ... end;这个例子说明一个将被执行了差不多10次的循环。但收盘值(counter)被打印不会比基准次数多。\"...\"代表MetaQuotes 4 语言的其他语句。
4.3.交易中断的预选界定变量
为了最大的方便用户,交易中断的一些变量可以从智能系统输入。
AccountNumber-账号(同义词:AccNum) Ask 卖价(买方出价) Balance 交易账户的余额值 Bars 图表上条形的数目-说明用数据填充图表程度的非常重要的一个变量。 Bid -买入价(卖方要价) Close 收盘价格 Credit 信用优先 Equity 账户状况,包括未实现利润 FreeMargin 交易账户的自由保证金值-也用来核查账户资金的可用性; High 期间最高价位 Low -期间最低价位 Margin 用来支撑开仓部位的资金(保证金) Open 开盘价 Point 当前金融工具单点上的价值(此点此时智能交易系统系统运行),比如, USD/JPY - 0.01, USD/CHF - 0.0001 等。 PriceAsk 在市场观测窗口上显示的当前卖价。 PriceBid -在市场观测窗口上显示的当前买价。 PriceHigh 当前24小时期间的最高买价。 PriceLow -当前24小时期间的最高卖价。 PriceTime -在市场观测窗口上显示的当前时间。 Time 价格图表上的条形时间的基准时间; TotalProfit 所有开仓部位的总未实现利润; TotalTrades 开仓部位的总数和交易中断上的延迟订单; Volume 交易量(期间交易的数目) 应注意到,Close, Open, High, Low, Volume, Time为历史数据数组(seriesarrays),在上个交易期间允许进入这些数据。
4.4. 内置函数
MetaQuotes 4语言提供许多功能,可用于多种多样的场合。这些包括技术指标、交易功能、时间功能、数学和三角函数功能、数据转换和输出函数,等。 Abs 返回这个数值的绝对值(模块) 语法:Abs函数 (n个表达式) 参数: 数值 AccountName 返回包含用户名的文本串 (同义词:AccName ) Alert 产生包含用户定义数据的对话屏 语法: Alert(...) 参数的任何非零数都可能。 Ceil 返回代表最小接近整数的一个数字,它等于或大于特定的数值。 语法:Ceil( n个表达式 )
参数:数值 CloseOrder 收盘头寸(部位) 语法:收盘头寸(订单、单位、价格、滑动量、色彩) Parameters: 参数: order -开仓部位的订单数 lots 单位数 price 优先收盘价 slippage 最大价格滑动值 color 图表上交叉点的色彩 Comment 在图表的左上角产生的用户定义数据 语法: Comment(...)
参数的任何非零数都可能。 Cos 计算和返回数值的余弦值,代表用弧度表示的角度。 语法: Cos( n分表达式 ) 参数:数值 CurTime 返回从1970年元月1日起所经过的秒数。 Day 返回当月当前日序列号 DayOfWeek 返回当周当前日序列号。1 星期日, 2 星期一, ... , 7 星期六 DeleteOrder 删除前期提交的延迟订单 语法:DeleteOrder( 订单 ) 参数: 订单-延迟部位的订单数 Exp 返回代表特定数值指数的一个数目 语法: Exp( n个表达式) 参数:数值 Floor 返回代表最大接近整数的一个数字,它等于或小于特定的数值。 语法: Floor( n个表达式) 参数:数值
Highest 返回期间特定数间的 Open, Low, High, Close or Volume (取决于“类型”参数)的最大值。 语法: Highest( 类型、beginbar、期间 ) Parameters: 参数: Type 类型 一个返回变量,可能去下列数值: MODE_OPEN, MODE_LOW, MODE_HIGH, MODE_CLOSE, MODE_VOLUMEbeginbar 表示条形的转换,与当前条形有关,并从中取值。 periods期间 计算执行依据的期间数
Hour 返回在24小时期间内当前小时的序列数。 iADX -平均指导动作目录
语法:iADX( 期间、模式、转换) 参数: period 计算的期间数; mode 数据类型,可以取下列数值:MODE_MAIN(主要指标)、MODE_PLUSDI(line +DI), MODE_MINUSDI(line -DI). shift 与当前条形有关的转换 (后退期间数),为数据待取值的依据。 iATR - 平均间距的指标 语法:iATR( 期间、转换) 参数: period 计算期间数; shift 与当前条形(后退期间数)相关的转换,为数据待取值的依据。
平均移动收敛/发散指标(iBANDS 布林带指数 语法: iBANDS(期间,误差,模式,转换) 参数: period 计算的期间数; deviation -误差; mode 可以取下列值: MODE_MAIN(主线、滑移)、 MODE_LOW(下边线), MODE_HIGH(上边线). shift 与当前条形(后退期间数)相关的转换,为数据待取值的依据。
iCCI 交易通道指标 语法: iCCI(期间、转换) 参数: period 计算的期间数
shift 与当前条形(后退期间数)相关的转换,为数据待取值的依据。
iMA 移动平均指标 语法: iMA( 期间、模式、转换) 参数: period 计算的期间数
mode 计算模式,可以取下列值: MODE_SMA, MODE_EMA, MODE_WMA. shift 与当前条形(后退期间数)相关的转换,为数据待取值的依据。 iMACD -平均移动收敛/发散指标
语法: iMACD( fast_ema_period, slow_ema_period, signal_period, mode, shift ) 参数: fast_ema_period -计算\'快\' 平均移动期间(通常12); slow_ema_period - number of periods for calculation of the \'slow\' moving average (usually 26); signal_period计算\'慢\' 平均移动期间(通常12); mode 数据源,可以取下列值:MODE_MAIN (主要指标)、MODE_SIGNAL (信号列); shift -与当前条形(后退期间数)相关的转换,为数据待取值的依据。 iMFI 现金流量指标 语法: iMFI( 期间、转换) 参数: period 计算期间数; shift 与当前条形(后退期间数)相关的转换,为数据待取值的依据。
iMOM 动量指标 语法:iMOM( 期间、转换) 参数: period 计算期间数; shift 与当前条形(后退期间数)相关的转换,为数据待取值的依据。
iRSI 相对强弱指标 语法:iRSI(期间、转换) 参数: 期间 计算期间数;
iSAR -抛物线
语法: iSAR(步骤,最大值,转换)
参数:
步骤-增量,通常是0.02;
最大值 最大值, 通常是0.02; iSTO - \"随机振荡\"指标
语法: iSTO( %K期间、 %D期间、 慢、方法、模式、转换) 参数: %Kperiod - %K线期间; %Dperiod - %D线期间; slowing 慢值; method 计算方法,取下列值: MODE_SMA (简单平均)、MODE_EMA (指数值)、 MODE_WMA (权重值); mode 数据源,可以取下列值: MODE_MAIN (主指标线), MODE_SIGNAL (信号指标线); shift -与当前条形(后退期间数)相关的转换,为数据待取值的依据。
iWPR -威廉氏百分数范围指标 语法:iWPR( 期间、转换) 参数: 期间 计算期间数; shift 与当前条形(后退期间数)相关的转换,为数据待取值的依据。
IsDemo 如果智能交易系统系统在试用帐户运行,返回逻辑值,否则会返回错误值. IsIndirect 如果使用反向方式对特定工具进行计算,会返回正确的逻辑值,否则会返回错误值。
LastTradeTime 返回代表最近交易执行时间的一个数字(SetOrder, DelOrder, CloseOrder, ModifyOrder),计算从1970年元月1日0点经过的秒钟数。
Log (-特定正数值的对数
语法:日志( n个表达式)
参数: 正数值 Lowest - 特定期间返回开仓,低,高,收盘或交易量最小值(依据\"类型\"参数而定) ...returns 语法:最低点(类型、beginbar、 期间) 参数: type 可以取下列值: MODE_OPEN, MODE_LOW, MODE_HIGH, MODE_CLOSE, MODE_VOLUME
beginbar 表示条形的转换,与当前条形有关,并从中取值。 periods期间 计算执行依据的期间数
Minute 返回当前小时的分钟序列数。 Mod -返回代表着一个接着一个的数值的整数 语法:Mod( n个表达式1, n个表达式2)
参数: 数值1、数值2 ModifyOrder 前期开仓部位或延迟订单修改的特征 语法:ModifyOrder( 订单、价格、止损、获利、色彩) 参数: order 开仓或延迟部位的数目或订单; price 新的价格 (仅适用于延迟部位!); stoploss 新的止损水平线; takeprofit 新的获利水平线; color 图表上象形图 的色彩
Month 返回当前月的续列号 MoveObject 移动或建立命名对象 语法:MoveObject( 名称、类型、时间、价格、 时间2、时间2) 参数: name 文本串形式的名称; type 对象类型,可以取下列值:OBJ_HLINE (水平线)、 OBJ_VLINE (垂直线), OBJ_TRENDLINE (趋势线)、 OBJ_SYMBOL (设定象形图)、 OBJ_TEXT (文本串); time 参照图表第一时间; price -参照图表第一价格; time2 -参照图表第二时间; price2 -参照图表第二时间 NumberToStr 返回特定数值转换成特定准确格式的文本串。通过在十进位点数之后的其他4个数产生的数值的函数。 语法: NumberToStr(数字、准确性) 参数: number 特定数值; precision 准确格式、十进位点数的数字
OrderValue 返回订单特定价值的之一 语法:OrderValue(部位、模式) 参数: position 交易终端列表的订单头寸部位,从1开始; mode 返回数据类型,可以取下列值:VAL_TICKET (订单数), VAL_OPENTIME (定定开仓时间), VAL_TYPE (订单类型), VAL_LOTS (要求单位数目), VAL_SYMBOL (工具名称,以文本串的形式), VAL_OPENPRICE (开盘价), VAL_STOPLOSS (止损水平线), VAL_TAKEPROFIT (获利水平线), VAL_CLOSEPRICE (收盘价), VAL_COMISSION (委托交易量), VAL_SWAP (部位展期的展期费用数额), VAL_PROFIT (交易利润数), VAL_COMMENT (以文本串形式对特殊部位的注解), VAL_CLOSETIME (订单收盘时间)。
Ord 和OrderValue完全相同。 Period 返回界定的已用期间分钟数 Pow 返回由nBaseExpression数值提高到nExponentExpression 倍数而产生的数值,参见参数。 语法:Pow( nBaseExpression, nExponentExpression ) 参数:数值1、数值2。 Print 打印由用户在系统日志里界定的数据。
语法: Print(...)
参数的任何非零数均可能。 PrintTrade 存储日志中特殊部位的细节 语法: PrintTrade( 部位 ) 参数:部位 在交易终端里已开仓部位数字 Rand 返回一个产生的伪随机数字。在使用此函数之前,伪随机数字发生器应用Srand函数调整到初始状态。 如果伪随机数字发生器不用,就在启动程序时一次调整到初始状态。 Round 返回代表最接近整数的特定数值 语法: Round( n个表达式) 参数: 一个数值 ServerAddress 以文本串的形式返回服务器IP地址 SetArrow 设定图表绘图标志 语法: SetArrow( 时间、价格、标志和色彩) 参数: time -参照图表第一时间; price -参照图表第一价格; symbol -从Wingdings字体设定标志 的数值; color -图表颜色
SetObjectText -指定文本串到特定的对象 语法: SetObjectText(称,文本,字体, 尺寸,颜色) 参数: name 对象名称; text 特定文本; font 字体命; size 字体大小; color 文本色彩. SetOrder 用于开仓或设定延迟订单的主函数。 语法:SetOrder( 操作、单位、价格、滑动、止损、获利、色彩) 参数: operation 操作类型,可以取下列值:OP_BUY (开始购买部位), OP_SELL (开始出售部位), OP_BUYLIMIT, OP_SELLLIMIT, OP_BUYSTOP, OP_SELLSTOP (提交延迟订单); lots 单位数; price 交易优先收盘价; slippage - OP_BUY 和OP_SELL操作的最大价格滑动; stoploss 止损水平线; takeprofit 获利水平线; color 当提取函数时,图表上箭头的色彩 SetText 把图表种的文本创放到特定的位置 语法:SetText( 时间、价格、字符串、色彩 ) 参数: time -参照图表第一时间; price -参照图表第一价格; string 文本串; color 文本色彩
Sin -计算并返回代表弧度角度的数值 语法:Sin( n个表达式) 参数: 数值 Sqrt -计算和返回特定正数值的平方根 语法: Sqrt( n个表达式 ) 参数: 正数值 Srand 设定伪随机数字发生器到初始状态。如果使用发生器,将其在启动程序时一次性设置到初始状态。 初始设置所用的最佳值就是时间函数回归的数字-在此情况下,产生顺序的随机性就增大。 语法:Srand( 时间) 参数: 正数值 Symbol 返回智能交易系统运行的金融工具名称的文本串。
Tan -计算并返回代表角度弧度的正切数值。
语法: Tan( n个表达式) 参数: 数值
TimeToStr 返回带有\"yyyy.mm.dd hh:mi\" 类型的文本串,由代表经过1970元月1日起的秒钟数的特定数值。
语法: TimeToStr( 时间) 参数: 正数值 Year 返回当年数。
逐步创建简单顾问软件
我们现在就创建智能交易系统,并在运行标准的平滑异同移动平均线指标,该系统具有较强的获利能力,支持追踪止损和最大的保障安全操作。 下面所给的例子,交易通过对单一的部位进行开仓和控制。
交易原则:
多头进场 MACD指标在零点之下, 向上走,或由下行信号线穿过。
<img id=\"aimg_cuMcz\" class=\"zoom\" file=\"http://www.qqfx.com/users/uploadfile/200651616628274.JPG\" border=\"0\" alt=\"\" />
空头进场 MACD指标在零点以上, 向下走,或由上行信号线穿过。
<img id=\"aimg_NtMet\" class=\"zoom\" file=\"http://www.qqfx.com/users/uploadfile/200651616656963.JPG\" border=\"0\" alt=\"\" />
多头出场-通过执行获利限额,移动止损或当MACD指标穿过信号线(MACD指标在零点以上, 向下走,或由上行信号线穿过)
空头出场-通过执行获利限额,移动止损或当MACD指标穿过信号线(MACD指标在零点以下, 向上走,或由下行信号线穿过)
重要提示: 为了排除MACD指针于我们的分析出现的微不足道的变化(图表上的“小山丘”),我们引入另外一种控制绘图中的“小山丘的大小”的方法如下: 指针大小应至少为最低价格的5个单位(5*Point,表示USD/CHF = 0.0005和USD/JPY = 0.05)。
步骤 I : 编写智能交易系统描述
<img id=\"aimg_YpIia\" class=\"zoom\" file=\"http://www.qqfx.com/users/uploadfile/200651616715499.JPG\" border=\"0\" alt=\"\" />
将鼠标指针点到导航窗口的智能交易系统区,按鼠标右键,在出现的菜单里选中“创建”指令。智能交易系统的启动向导要求你进入某些数据。在出现的窗口,我们写入智能交易系统名称(Name)-MACD 样本,作者(Author)-指示你的名字,连接(Link)-连接到网站,在注解(Notes)里写入-以MACD为基础的智能交易系统测试样本。
<img id=\"aimg_AtTKK\" class=\"zoom\" file=\"http://www.qqfx.com/users/uploadfile/200651616833536.JPG\" border=\"0\" alt=\"\" />
<img id=\"aimg_S55f5\" class=\"zoom\" file=\"http://www.qqfx.com/users/uploadfile/200651616723468.JPG\" border=\"0\" alt=\"\" />
第二步: 创建程序的主结构
智能交易系统代码只有几页,即便是这几页代码也挺难掌握,特别是考虑这个事实:我们不是专业的程序开发商,另外,我们根本不需要专业性的描述,对吗? 为了对标准智能交易系统的结构有些了解,我们现在就看看下面的这个描述吧:
1. 原始数据检查
检查图表、图表上的条形数
核查外部变量值:单位、Lots, S/L, T/P, T/S。
2. 设定快速数据存取内部变量;
3. 检查交易终端-是否可用?若是的话,那么:
检查账户资金的可用性,等。
是否可能来做多头买卖(买单)?
开仓(买)并离开
是否能做空仓(卖出)?
空仓(卖)并离开
退出智能交易系统
4. 控制循环周期中前期的开仓部位
如果是做多头
是否应出仓?
是否应该设置追踪止损单?
如果是做多头
是否应该出仓?
是否应该设置追踪止损单?
结果相当简单,只有4个主区块。 现在,请跟随着每个结构的步骤来创建代码:
1. 原始数据的检索 这条代码通常从智能交易系统移到另一个稍微更改的另一个代码-实际上为检索的标准区块:
若Bars
若获利
2. 为了加快数据存取,设置内部变量 在程序代码中,很有必要存取指标值或处理计算值。为了简化代码和加速存储,初始状态下,数据嵌套在内部变量里。
MacdCurrent=iMACD(12,26,9,MODE_MAIN,0); // MACD value on the current bar
MacdPrevious=iMACD(12,26,9,MODE_MAIN,1); // MACD value on the previous bar
SignalCurrent=iMACD(12,26,9,MODE_SIGNAL,0); // Signal Line value on the current bar
SignalPrevious=iMACD(12,26,9,MODE_SIGNAL,1);// Signal Line value on the previous bar
MaCurrent=iMA(MATrendPeriod,MODE_EMA,0); // moving average value on the current bar
MaPrevious=iMA(MATrendPeriod,MODE_EMA,1); // moving average value on the previous bar
现在,不用晦涩难懂的iMACD(12,26,9,MODE_MAIN,0) 符号,我们在程序中用简单的写入字符 MacdCurrent程序文本取而代之。所有的智能交易系统中的变量都依据MQL II语言进行基本的解释。所以,我们在程序的开头加入这段说明。
var: MacdCurrent(0), MacdPrevious(0), SignalCurrent(0), SignalPrevious(0);
var: MaCurrent(0), MaPrevious(0);
MQL 4语言还另外推出了另外一个用户自定义变量概念,它可以在程序外设定,而不会对任何系统程序下的源程序文本造成干扰。这个特点使程序更具灵活性。 MATrendPeriod变量就是这种类型的一个用户自定义变量,所以,我们在程序的开头加入这段说明。
defines: MATrendPeriod(56);
3. 检查交易终端-是否可用? 若是,那么:
在智能交易系统里,我们只能使用当前头寸而不能操作延迟的订单。然而,为了安全起见,我们介绍如何利用交易终端建检查前期提交的订单。
If TotalTrades
{
检查: 账户的可用资金等。在分析市场状况之前,最好先检查一下你的账户的资金情况, 以确保账户中有充足的开仓头寸的资金。
如果净保证金
可否做多头(买入)? 多头买入的条件:MACD指标在0轴以下,为向上趋势且与向下趋势的信号线相交。这和我们在MQL II语言中所描述的一样(注意:我们可以按照原已保存在变量中的这个指标值进行操作。)
If MacdCurrentSignalCurrent and
MacdPrevious
Abs(MacdCurrent)>(MACDOpenLevel*Point) and // the indicator plotted a decent \'hillock\'
MaCurrent>MaPrevious then // \'bull\' trend
{
SetOrder(OP_BUY,Lots,Ask,3,0,Ask+TakeProfit*Point,RED); // executing
Exit; // exiting, since after the execution of a trade
// there is a 10-second trading timeout
};
前面我们提到了一种监控图表中所要显示“小丘”的大小的一种方法。MACDOpenLevel 变量是一个用户定义变量,可以在不影响程序文本的情况下,进行更改,以确保更多的灵活性。在程序的开始部分,我们加入一段这个变量的描述(以及下面所用到的变量描述)。
defines: MACDOpenLevel(3), MACDCloseLevel(2);
是否可以做空头(卖出)?空头卖出的条件:MACD指标在0轴以上,为向下趋势且与向上趋势的信号线相交。符号表示如下:
If MacdCurrent>0 and MacdCurrent
MacdPrevious>SignalPrevious and MacdCurrent>(MACDOpenLevel*Point) and
MaCurrent
{
SetOrder(OP_SELL,Lots,Bid,3,0,Bid-TakeProfit*Point,RED); // executing
Exit; // exiting
};
Exit; // no new positions opened - just exit
};
4. 控制循环周期中前期已开仓的头寸
for cnt=1 to TotalTrades
{
if OrderValue(cnt,VAL_TYPE)
OrderValue(cnt,VAL_SYMBOL)=Symbol then // position from \"our\" chart?
{
CNT是周期变量,是在程序的开始部分加以描述的,具体如下: var: Cnt(0);
若是多头买入
If OrderValue(cnt,VAL_TYPE)=OP_BUY then // long position opened
{
是否需要平仓?存在平仓的条件:MACD指针与信号线相交,MACD指针在0轴以上,为向下趋势且与向上趋势的信号线相交。
If MacdCurrent>0 and MacdCurrent
MacdPrevious>SignalPrevious and MacdCurrent>(MACDCloseLevel*Point) then
{
CloseOrder(OrderValue(cnt,VAL_TICKET),OrderValue(cnt,VAL_LOTS),Bid,3,Violet);
Exit; // exit
};
是否应该需要重新设定移动止损点?仅在持仓并已超过移动止损点数点并获利的情况下,而且新的移动止损点比前期的要更有理一些,我们才重新设置移动止损点。
If TrailingStop>0 then // if trailing stops are used
{
If (Bid-OrderValue(cnt,VAL_OPENPRICE))>(Point*TrailingStop) then
{
If OrderValue(cnt,VAL_STOPLOSS)
{
ModifyOrder(OrderValue(cnt,VAL_TICKET),OrderValue(cnt,VAL_OPENPRICE),
Bid-Point*TrailingStop,OrderValue(cnt,VAL_TAKEPROFIT),Red);
Exit;
};
};
};
}
若是处在空头部位
else // otherwise it is a short position
{
是否应该平仓?出现空头的条件: MACD指针与信号线相交,MACD指针在0轴以下,为向上趋势且与向下趋势的信号线相交。
If MacdCurrentSignalCurrent and
MacdPrevious(MACDCloseLevel*Point) then
{
CloseOrder(OrderValue(cnt,VAL_TICKET),OrderValue(cnt,VAL_LOTS),Ask,3,Violet);
Exit; // exit
};
是否应该重新设定移动止损点?仅在持仓并已超过移动止损点数点并获利的情况下,而且新的移动止损点比前期的要更有理一些,我们才重新设置移动止损点。
If TrailingStop>0 then // the user has put a trailing stop in his settings
{ // so, we set out to check it
If (OrderValue(cnt,VAL_OPENPRICE)-Ask)>(Point*TrailingStop) then
{
If OrderValue(cnt,VAL_STOPLOSS)=0 or
OrderValue(cnt,VAL_STOPLOSS)>(Ask+Point*TrailingStop) then
{
ModifyOrder(OrderValue(cnt,VAL_TICKET),OrderValue(cnt,VAL_OPENPRICE),
Ask+Point*TrailingStop,OrderValue(cnt,VAL_TAKEPROFIT),Red);
Exit;
};
};
};
// end. 结束所有的花括号,但仍然有效。
};
};
};
所以,按照步骤,循序渐进地学习,我们已经学会了编写智能交易系统。
第三步:将所有程序代码集合起来
我们将前面章节的所有的代码集合起来:
defines: MACDOpenLevel(3),MACDCloseLevel(2);
defines: MATrendPeriod(56);
var: MacdCurrent(0),MacdPrevious(0),SignalCurrent(0),SignalPrevious(0);
var: MaCurrent(0),MaPrevious(0);
var: cnt(0);
// 原始数据检查
//确保智能交易系统在正常图表上运行,这很重要。
// 用户正确设置外部变量 (单位数, 止损,
// 获利、移动止损)
// 在我们看来,我们只需检查获利就行了
若Bars
//简化和加速操作程序,我们需要作必要的保存
//临时变量中的指标数据
MacdCurrent=iMACD(12,26,9,0,MODE_MAIN);
MacdPrevious=iMACD(12,26,9,1,MODE_MAIN);
SignalCurrent=iMACD(12,26,9,0,MODE_SIGNAL);
SignalPrevious=iMACD(12,26,9,1,MODE_SIGNAL);
MaCurrent=iMA(MATrendPeriod,MODE_EMA,0);
MaPrevious=iMA(MATrendPeriod,MODE_EMA,1);
//现在我们必须检查交易终端的状况
// 我们要看一看是否还有任何前期开仓部位或订单。
如果总交易
{//没有已开仓订单
// 为了安全期间,我们要确保账户有充足的资金。.
//比如说,取值为“1000”,通常可能就是提交1个单位
如果净保证金
//检查做多头(买入)的可能性
If MacdCurrentSignalCurrent and
MacdPrevious(MACDOpenLevel*Point) and
MaCurrent>MaPrevious then
{
SetOrder(OP_BUY,Lots,Ask,3,0,Ask+TakeProfit*Point,RED); // 执行
Exit; // 既然交易已经执行,退出
// 有10秒钟的交易暂停时间
};
//检查空头(卖出)的可能性
If MacdCurrent>0 and MacdCurrent
MacdPrevious>SignalPrevious and MacdCurrent>(MACDOpenLevel*Point) and
MaCurrent
{
SetOrder(OP_SELL,Lots,Bid,3,0,Bid-TakeProfit*Point,RED); // executing
Exit; // exiting
};
//这里我们完成了对新的开仓部位可行性检查
//没有新的开仓部位,我们就用退出命令退出程序
//没有要分析的任何东西
Exit;
};
//我们进入到智能交易系统的重要部分-控制开仓部位
// 正确进入市场很重要,但是退出市场更重要。
for cnt=1 to TotalTrades
{
if OrderValue(cnt,VAL_TYPE)
OrderValue(cnt,VAL_SYMBOL)=Symbol then // 工具匹配吗?
{
If OrderValue(cnt,VAL_TYPE)=OP_BUY then // 多头开仓
{
// 我们检查-可能,尚有时间平仓吗?
If MacdCurrent>0 and MacdCurrent
MacdPrevious>SignalPrevious and MacdCurrent>(MACDCloseLevel*Point) then
{
CloseOrder(OrderValue(cnt,VAL_TICKET),OrderValue(cnt,VAL_LOTS),Bid,3,Violet);
Exit; // 退出
};
// 我们检查-可能,我可能已经或该是设置移动止损的时候了吗?
If TrailingStop>0 then //用户已经将移动止损进行了设置
{ // 所以,我们开始着手检查
If (Bid-OrderValue(cnt,VAL_OPENPRICE))>(Point*TrailingStop) then
{
If OrderValue(cnt,VAL_STOPLOSS)
{
ModifyOrder(OrderValue(cnt,VAL_TICKET),OrderValue(cnt,VAL_OPENPRICE),
Bid-Point*TrailingStop,OrderValue(cnt,VAL_TAKEPROFIT),Red);
Exit;
};
};
};
}
else // 否则,就是多头。
{
// 我们检查-可能,尚有时间平仓吗?
If MacdCurrentSignalCurrent and
MacdPrevious(MACDCloseLevel*Point) then
{
CloseOrder(OrderValue(cnt,VAL_TICKET),OrderValue(cnt,VAL_LOTS),Ask,3,Violet);
Exit; // 退出
};
//我们检查-可能,我可能已经或该是设置移动止损的时候了吗?
If TrailingStop>0 then // 用户已经把移动止损进行了设置
{ // 所以,我开始着手检查。
If (OrderValue(cnt,VAL_OPENPRICE)-Ask)>(Point*TrailingStop) then
{
If OrderValue(cnt,VAL_STOPLOSS)=0 or
OrderValue(cnt,VAL_STOPLOSS)>(Ask+Point*TrailingStop) then
{
ModifyOrder(OrderValue(cnt,VAL_TICKET),OrderValue(cnt,VAL_OPENPRICE),
Ask+Point*TrailingStop,OrderValue(cnt,VAL_TAKEPROFIT),Red);
Exit;
};
};
};
};
};
};
// 结束 。
要完成对智能交易系统的设置,我只需要对外部变量进行设定,Lots = 1, Stop Loss (S/L) = 0 (未使用), Take Profit (T/P) = 120 (适用于一个小时的间隔),Trailing Stop (T/S) = 30。当然,你还可以设置自己的数值。 按Compile按钮,如果没有错误信息,就按SAVE按钮保存智能交易系统(顺便说,你还可以将上述程序的灰色背景打印文本保存到MetaEditor)。
现在,我们来编辑智能交易系统, 在MQL编辑器点击顶端的Compile图示(像一张有检查标记的纸)。
<img id=\"aimg_ASNbF\" class=\"zoom\" file=\"http://www.qqfx.com/users/uploadfile/200651616943823.JPG\" border=\"0\" alt=\"\" />
步骤 IV: 测试智能交易系统的历史数据
我们已经编写了智能交易系统,我们通过对测试历史数据,现在急于要对其进行评估。 我们就以15分钟间隔的EUR/USD为例,大约为4000基准值。
打开智能交易系统测试器:
<img id=\"aimg_LO576\" class=\"zoom\" file=\"http://www.qqfx.com/users/uploadfile/200651616108854.JPG\" border=\"0\" alt=\"\" />
在软件下部会出现智能交易系统测试器:
<img id=\"aimg_Wi9Ii\" class=\"zoom\" file=\"http://www.qqfx.com/users/uploadfile/2006516161021259.JPG\" border=\"0\" alt=\"\" />
在智能交易系统测试器中选择EUR/USD,M15,设置测试历史数据的起始日期和结束日期,开始测试
测试完成后,可查看测试记录、净值图,在报告栏中可查看统计报表,并可将完整的包括净值图、交易记录、分析报表完整地保存下来。
<img id=\"aimg_S1OOY\" class=\"zoom\" file=\"http://www.qqfx.com/users/uploadfile/2006516161051474.JPG\" border=\"0\" alt=\"\" />
智能交易系统不仅提供建议和信号,而且允许交易账户上进行自动交易,用附加到图表指令(通过在导航窗口用鼠标指针选中MACD样本,按鼠标右键选中出现的菜单命令)将MACD 样本智能交易系统附加到图表中,然后点击“启用智能交易系统”按钮。
<img id=\"aimg_TlCuz\" class=\"zoom\" file=\"http://www.qqfx.com/users/uploadfile/2006516161137623.JPG\" border=\"0\" alt=\"\" />
或点击该智能交易系统,在对话框中选择“允许实时自动交易”并点确定。智能交易系统就会工作了
<img id=\"aimg_W8kxX\" class=\"zoom\" file=\"http://www.qqfx.com/users/uploadfile/200651616122774.JPG\" border=\"0\" alt=\"\" />
智能交易系统所有代码在 Ready Expert Advisors页都可找到
当你对智能交易系统做出编写时,必须谨记:
编写和测试交易平台的智能交易系统具有许多细节特征:
在开仓之前,必须检查你账户上可用保证金的有效性。假如可用保证金不足时,则开仓部位交易将失败。必须注意的是,为了达到测试的目的,可用保证金最少应在1000,因为一个单位的测试价格为1000。
If FreeMargin
在开仓、平仓或者修改已有部位或删除延迟订单(一经执行以下任何的操作:SetOrder, CloseOrder, ModifyOrder or DeleteOrder)之后,建议使用Exit语句完成智能交易系统的这部分的操作,这将有10秒钟的限定时间间隔来执行该项操作。还应注意,10秒钟的限定时间不适用于测试模式(你可以连续做几次交易)。另外,假如不是用Exit语句来完成智能交易系统的上述交易操作,智能交易系统的测试结果将和真实交易不同。
SetOrder(OP_SELL,Lots,Bid,3,0,Bid-TakeProfit*Point,RED); // 执行
Exit; //退出
为了防止在测试模式中用少于10秒的间隔来执行几项交易,你只需确保从上一次交易到下一次的交易已经超过10秒。
//确保当前的时值离上次交易的执行大于10秒。
If CurTime > LastTradeTime + 10 Then Begin
SetOrder(OP_SELL,Lots,Bid,3,0,Bid-TakeProfit*Point,RED); // 执行
Exit;
End;
历史数据可以用已引索的预设变量OPEN、 CLOSE、 HIGH、 LOW、 VOLUME来存取。在这种情况下,指数是指必须回头计算的期间数。
// 如果上个BAR柱状线的收缩小于倒数第二个BAR柱状线的收缩少
If Close[1]
交易平台中的智能交易系统支持4种模式:
OHLC 点(Open/High/Low/Close)模式。 因为系统在此的测试目的仅限于开盘价、收盘价、最高价、最低价,所以这个测试系统是最快的。 但是, 这个测试结果与智能交易系统执行的实际交易的结果可能会不同。
每3点一次模式:在测试智能交易系统时,每增加三点就会模拟产生一个烛台图示。
每2点一次模式: 在测试智能交易系统时,每增加二点就会模拟产生一个烛台图示。
每1点一次模式:在测试智能交易系统时,每增加一点就会模拟产生一个烛台图,这种模式是最慢的但是测试结果是最接近智能交易系统的实际交易的结果的。(交易中间每间隔10秒钟,观察结果)
在编写和检验智能交易系统过程中,以及在对任何其他程序测试过程中,有时, 需要输出一些额外的调试信息。MQL II语言还提供这类信息输出的若干可能性。
将ALERT函数以及包含用户自定义的数据发送到屏幕对话框。 Alert(\"Free margin is \", FreeMargin);
COMMENT函数将由用户定义的数据放置在图表的左上角。“n” 字符用于结束一行。 Comment(\"Free margin is \", FreeMargin, \"nEquity is \", Equity);
Print 函数是将由用户定义的数据输至系统日志。 Print(\"Total trades are \", TotalTrades, \"; Equity is \", Equity, \"; Credit is \", Credit);
PrintTrade函数是将指定的未平仓合约的具体细节输出到系统日志中。 PrintTrade(1);
当 智能交易系统 已测试完毕,测试结果会以扩展名为.log的文件形式储藏在你安装该交易平台所在的日志的子目录中。如果你经常性地测试你的智能交易系统,别忘了定期删除log档,因为它们可能累计达到数兆字节。 |