从零开始学MT4编程(六)

avatar
· 阅读量 6,578

    程序化系统是指设计人员将交易策略的逻辑与参数在电脑程序运算后,并将交易策略系统化。程序化交易起源于美国1975年出现的“股票组合转让与交易”,即经纪人和专业投资经理可以通过计算机与证券交易所直接联机来实现股票组合的一次性买卖交易,股票市场的订单实现了电脑化。同时,电子信息网络(ECN)在20世纪70年代迅速兴起,极大地提高了交易速度。一方面,科学技术进步推动金融市场发展;另一方面,金融市场发展反过来要求进行金融市场基础制度变革,规范技术在金融市场的运用。

    程序化交易及程序化交易其实是这几十年来交易电子化的必然过程。2000年国际证券交易所(ISE)建立了第一个完全电子化的美国期权交易所。到2008年中期,已有7个交易所提供完全的电子化,或者是电子化与交易大厅相结合的期权交易平台。截至2014年,全球许多交易所实现了电子化交易。

    目前华尔街大型投行绝大部分的利润和交易量都是由程序化交易完成的,程序化交易相对于手动交易有着极大的优点,有逐渐取代手动交易的趋势,是未来金融市场的发展方向。未来的交易员之间的竞争,将会是程序代码之间的竞争,是智能交易系统之间的竞争,谁的程序技高一筹,谁就可以战胜市场,获得额外的盈利。

    截止至2016年,全球已有超过81%的金融经纪公司和全世界四十多个国家的银行选择了迈达克软件作为网络化交易平台;全球超过90%的零售交易量是通过迈达克软件成交的,而这其中大部分又是由 EA 成交。

EA 编程,可以从现在开始:

3.3 历史数据回测

    历史数据回测是自动化交易验证 EA 程序逻辑的一个很重要的环节。

    MT4 提供了一个功能强大的系统测试模块,利用历史数据测试 EA 策略的结果并提交一份详细的测试报告,你可以根据报告调整 EA 的策略和参数,反复进行,以期达到最佳的模式。

    开盘价、收盘价、最高价、最低价、成交量、时间等 6 项指标,分为M1、M5、M15、M30、H1 、H4、D1、W1、MN 等9个周期。

3.3.1 开始一个 EA 测试

    1、选择一个 EA 加载到图表

    2、点击工具栏的“智能交易”停止智能交易

    3、按 F6,打开测试窗口

从零开始学MT4编程(六)

测试窗口各项说明如下:

从零开始学MT4编程(六)

完成所有设置后,按“开始”,系统即开始测试:

从零开始学MT4编程(六)

测试完毕后,我们可以注意查看测试报告标签:

从零开始学MT4编程(六)

从零开始学MT4编程(六)

从零开始学MT4编程(六)

3.3.2 测试报告中各项指标说明

从零开始学MT4编程(六)

从零开始学MT4编程(六)

从零开始学MT4编程(六)

3.3.3 报告中色彩的含义

从零开始学MT4编程(六)

3.4 常用自定义函数

    MQL4 提供了大量的基本函数和语句,然而我们在编程中发现很多的对行情的判断与操作都是重复的,比如判断指标快慢线是否交叉,这就需要用到自定义函数来简化主程序。

    自定义函数通常放在程序的后面,函数格式与说明如下:

从零开始学MT4编程(六)

在程序中调用该自定义函数的例子如下:

    If (myIndicators(“金叉”,Close0))=”Sell”

    将自定义函数参数写进去,就会得到按预定算法返回一个结果。

3.4.1最大开仓量计算

    保证金的合理使用是风险控制的重要手段,因此计算最大开仓量就显得非常重要。在许多风险控制论述中都会有这么一段类似的文字描述:“开仓量为余额的 5%”。其实这种说法极其的不准确,甚至会导致因开仓量控制不严格而带来无谓的亏损。

    不同货币对的1标准手自由保证金是不同的,而且如果你有持仓订单,由于价格变化导致账户净值也在变化,那么开仓量(手)也会发生变化。

    以下代码计算了在当前货币对、当前价格的前提下,使用全部自由保证金(本币元)的最大开仓量(手):

double myLots=(AccountEquity()/MarketInfo(Symbol(),MODE_MARGINREQUIRED));

    其中 myBuyLots 为买入订单的最大开仓量(手),mySellLots 为卖出订单的最大开仓量(手)。计算方法是:

从零开始学MT4编程(六)

    所以,正确的5%开仓量应该为:myLots×5%。

    我们来看看通过程序计算显示的结果:

从零开始学MT4编程(六)

    从上图可以看出,最大开仓量计算到了小数点后面8位,而实际操盘时的开仓量最小为0.01手,如果你直接使用这个数据,程序会报错,因此还需要通过内置函数将开仓量截止(不用四舍五入)到小数点后面2位:

    myLots =NormalizeDouble(myLots,2)

    OrderSend(Symbol(),OP_SELL, myLots ,Bid,0,0,0);//开一张卖出订单

以上观点仅供参考。祝福大家程序化交易顺利。

风险提示:本文所述仅代表作者个人观点,不代表 Followme 的官方立场。Followme 不对内容的准确性、完整性或可靠性作出任何保证,对于基于该内容所采取的任何行为,不承担任何责任,除非另有书面明确说明。

喜欢的话,赞赏支持一下
回复 6

暂无评论,立马抢沙发

  • tradingContest