NTL+语言基础 | IFCM
IFC Markets 網上CFD經紀商

NTL+语言基础

引言

这篇文章是为那些首次在NTL+语言上编写程序的程序员. 在该语言中包括交易助手创造的一些特性以及知识. 有助于避免很多错误, 并节省编写和调试的时间(NTL+语言脚本的概念有不同的程序样式: 交易助手,指针和应用软件)。


创建交易助手.

创建新的交易助手, 右键点击档 请转入窗口Navigator, 右键点击文件夹Advisors并在下拉菜单中选择Create. 此时您需要输入新交易助手的名称. 命名的规则与操作系统一样, 不能含有下列符号*|\:"<>?/ .


创建新的交易助手文文件之后, 您会看到带有3个函数的初始模版Initialize(), Run(), DeInitialize(). 其中每个函数都是在特定时间启动. 程序员不需要单独调用, 其为自动启动.


运行交易助手之后, 直接执行函数Initialize(), 提供初始参数. 注意, 函数Initialize()不会执行交易操作, 因为其运行时, 交易参数可能是不固定的(例如BidAsk价格, 头寸和订单的信息).


每一次价格变动都会运行函数Run(). 在该代码中可以分析当前的市场状况, 采取必要的交易措施或完成数学计算. 每次价格变动的数据加工不会超过10秒钟, 否则程序将自动停止使用交易助手.


当停止交易助手时调用函数DeInitialize(), 在停止脚本之前结束最后的操作. 在很多脚本中当初始化或取消初始化时一些操作完全没有必要- 这是函数Initialize() 和DeInitialize()将留空或将其从脚本中删除(如果平台不会调用).


编制算法和编写交易助手代码.

第一步是制定算法. 该算法必须具有清晰的结构和详细的解释, 以便简化后续的调试, 修改和优化.


必须确定交易的准则, 比如开立多空头寸, 何时平仓, 如何监控并限制未结头寸的数量. 如果您的交易助手已经放置挂单(包括条件订单和启动订单), 那么需要考虑要删除和修改订单的可能.


交易助手的成功取决于选择正确的交易准则来开立/结清头寸, 放置挂单, 因此创建成功交易助手的第一步是交易规则的制定. 其可以基于技术指标, 价格水平的分析等.


不要忘记, 交易助手工作时间人工干预的可能性: 如果交易助手开立头寸, 而您关闭头寸? 在非计划状态是否造成故障.


要正常工作, 您需要分析每个价格变动开仓和放置挂单的状态. Deals.TotalOrders.Total可以帮助到您, 他们可以提高未接头寸和放置挂单的数量, Deals.Select() 和 Orders.Select()方法也可以选择头寸或订单.


值得关注的还有交易助手在终端重启后的恢复工作: 能否进入到重启前的状态? 考虑到可能的情况, 在重启期间, 头寸可能因为止损或止赢结清, 甚至执行订单开立新的头寸.


需要预见到存在误差的行为, 例如缺乏足够的资金进行建仓, 或放置距离当前价格过近的挂单.


账户状态的访问可以通过Account及其熟悉来查看. 例如, 属性Account.Balance可以获得当前账户的账户余额, 属性Account.MarginFree - 获得自由保证金的值.


int Run() { // 初始化变数volume –交易量(单位基础货币) int volume = 10000; if(Account.MarginFree < volume/Account.Leverage) return -1; }

注意«return -1» - 当完成该操作, 强制停止.


历史牌价.

利用时间序列使您可以获取当前工具的历史价格并分析过去的市场形势. 时间序列是一组数组: Open[] – 开盘价, Close[] – 收盘价, High[] – 最高价, Low[] – 最低价, Time[] – 开盘时间和Volume[] – 价格跳动数量. 时间序列有反向索引: 最后一个(即时间最晚的)将为指数0, 第一个 – 等于Bars.Total(Chart.Symbol,Chart.Interval)-1.


如果你想获得任意工具的数据, 您需要使用对象Bars. 其Open(), High(), Low(), Close(), Volume(), Time()对应的时间序列, 唯一的区别是需要指定工具, 柱体的数量(区间, 时间周期)和柱体号码, 以获得需要的值. 运行脚本之前,您需要订阅脚本有关联的工具. 因此需要打开窗口MarketWatch,右键点击空白区域, 在下拉菜单中选择Subscribe,勾选所有需要的工具并点击"OK".


在交易助手中您可能需要确定何时开立新的柱体或结束前一柱体. 对此, 可以使用全局数组Volume.每个价格跳动, Volume[0]会增大1, 在第一个跳动后, 新的柱体为1. 因此, 确定柱体的开立时间适用下列结构:


int Run() { if(Volume[0]==1) { //开立新的柱体时执行的某个代码. } }

甚至可以是在return的帮助下, 对于除了1以外所有的Volume[0]值执行Run()


int Run() { if(Volume[0]>1) return (0); //开立新的柱体时执行的某个代码. }

另一种方法是分析打开柱体的时间 – 如果这一时间另个相邻的价格跳动重合, 那么在return(0)的帮助下退出. 在形成新的柱体时, 我们获得了当前和前一跳动时不同的Time[0]值- 也就是开立新柱体.


datetime lasttime=0; int Run() { if(lasttime == Time[0]) return(0); //开立新的柱体时执行的某个代码. lasttime = Time[0]; }

测试交易助手

交易助手测试的目的是评估交易助手有效性并检查其运作. 要开始测试, 请在主菜单中选择View -> Advisor Tester. 在窗口的上部有下列标签:


  • Parameters –测试参数
  • Results – 头寸的信息
  • Equity Graph – 余额和资产净值
  • Journal – 文件

Parameters

在标签Parameters中可以确定下列影响测试允许的参数:


  • Advisor下拉列表 –选择测试的交易顾问.
  • Properties – 打开交易助手参数进行编辑. 如果没有extern, 则按钮不会启动.
  • Symbol – 测试的国内国际*.
  • Interval – 测试的时间段.
  • Spread – 选择点差值. Current spread的值对应当前的点差. 在Spread 中可以引入任意的非负值.
  • Method – 测试方法. 可以选择其中的一个值: Control PointsOpen Price Only. 如果选择Control points , 则自动生成每个柱体4个价格跳动. 如果开盘价低于收盘价, 那么对应Open, Low, High, Close; 如果相反, 则对应有- Open, High, Low, Close.
    img
    Open Prices Only方法, 所有交易操作仅按照开盘价执行. 并且时间序列中零值将对应Open[0] = High[0] = Low[0] = Close[0], 而非零值与Control Points的值重合.
  • 标签Limit Dates 用于打开时间周期的限制.
  • FromTo区域为设置测试的时间段. 该值默认为工具加载的历史时间.
  • Initial Deposit – 开始测试的初始存款.
  • Enable visual输出图表, 在图表中显示有开立结清头寸的时刻, 以及放置挂单的时间.
  • Enable expert logs 输出打印标签Journal中的函数System.Print.
  • Start/Stop 开始或结束测试.

打开标签Enable visual modeEnable expert logs 会影响测试的速度,因此建议只在必要的时刻开.


* 当前不提供测试多交易助手. 如果您想测试顾问, 几种工具的头寸和载入的历史牌价区间不吻合, 那么价格bid和ask, 时间序列和值将通过对象Bars返回, 可能为零值.


Results

在标签Results输出所有头寸的信息, 包括测试的开立和结清的头寸. 在上面有未结头寸. 其显示下列信息:


  • 号码# - 结清头寸的号码. 第一个结清头寸为#1, 第二个#2 等等
  • Deal ID – 结清头寸的ID.
  • Symbol – 已开立头寸的工具.
  • Volume1 – 头寸数(单位基础货币)
  • Volume2 -头寸数(单位报价货币)
  • Open rate – 开盘价
  • Open time – 开盘时间
  • Stop loss – 止损水平 (如果不设置, 则不显示)
  • Take profit – 止赢水平 (如果不设置, 则不显示)
  • Last swap – 隔夜利息
  • Rate close – 收盘价
  • Time close – 收盘时间
  • Profit – 盈利
  • Balance – 账户余额*.
  • Equity – 资产净值*.

* 该表格输出为Show extended columns模式. 该模式可以通过表格的下拉菜单打开.


表格下部显示的是结束测试时未结清的头寸. 表格列的名称与对应Closed Positions的名称相同, 除了没有列的结清头寸.


在信息窗口输出结束测试时的信息, 包括账户余额, 资产净值, 自由保证金.


Equity graph

根据每个结清头寸显示帐户余额和资产净值的变化. 双击图表显示对应的头寸Closed positions.


Journal

通过函数System.Print显示测试输出. 如果标签Parameters的Enable expert logs关闭, 那么只有启动命令和停止命令显示报告中.


脚本调试

调试脚本很少不使用打印函数System.Print, 输出信息到窗口Toolbox的标签Journal中(测试中, 在标签Journal). 运行交易助手, 显示的信息将复制到文件夹«用户名\Documents\ NeTTradeX Advisors\logs»中. 檔可以在txt格式下编辑. 并记录事件 发生的时间, 退出代码(0-成功完成, 1- 错误)和正文.


添加属性System.LastError值, 使得在交易助手出错时进行分析. 其属性保存最后一个错误的号码. 并具有重要的特点: 每个随后的交易操作将属性值改为结果值. 因此如果您的脚本发送错误的参数, 之后放置订单的参数是正确的, 那么System.LastError会记录为零值. 获得System.LastError的值需要等待下一个交易操作(在我们的例子中是放置订单), 那时将保存错误的代码. System.ErrorDescription()方法描述错误, 通过System.LastError.返回一个错误代码的字符串.


调试时, 物件SystemIsStopped属性是很有用的功能. 如果程序执行超过7秒, 其将有true值. 根据这一特性, 可以告知程序员脚本不久(3秒)后被强制停止. 因此, 脚本获取时间来采取措施正确完成脚本.


概要

最后,应该指出的是,建立交易助手可以分为两个阶段:算法开发和写代码. 第一步的准确性将决定第二步的易用性和快速性. 本文列出拟定的算法, 以及切实可行的解决方案, 从而可以使您更容易的掌握NTL+和它的功能.


Close support
Call to Skype Call to QQ Call Back