我每天花好几个小时研究算法交易系统(决定你应该买入还是卖出的规则集)
500)this.width=500' hspace=10 vspace=10/>很多交易者都想要在外汇市场建议自己的交易策略,但国际金融局势动荡不安,外汇世界有时也会让人不知所措,EBC希望这篇文章为正在做交易的您,提供了一些关于如何开始自己的外汇交易策略的思路。
本文的分享者是Rogelio,一位积极进取的全栈工程师,在多种语言、框架和平台方面拥有13年以上的工作经验。
一开始,你可能知道国际注册外汇交易师,外汇市场是货币对之间的交易。但你可能没有意识到它是世界上流动性最强的市场。几年前,在我的好奇心的驱使下,我创建了一个模拟账户并在Meta Trader 4交易平台上进行模拟交易,这是我在外汇算法交易世界踏出的第一步。
500)this.width=500' hspace=10 vspace=10/>经过一周的模拟交易,我的钱几乎翻了一番。在我自己小有成就的交易激励下,我进行了更深入的研究,也注册了一些外汇论坛。我每天花好几个小时研究算法交易系统(决定你应该买入还是卖出的规则集)、自定义指标、市场情绪等等。
我的第一个客户
巧合的是,在我研究算法交易的时候,听说有人想找一个软件开发人员来自动化一个简单的交易系统。当时我正在学习Java中的并发编程(线程、信号量和所有垃圾收集)。我认为这个自动化系统不会比高级数据科学课程工作复杂得多,所以我接下来了这份工作。
客户想要使用MQL4构建的算法交易软件,MQL4是MetaTrader 4平台用于执行交易相关操作的函数式编程语言。MQL5目前也已经发布了。正如你所料,它解决了MQL4的一些问题并带有更多内置函数,这让交易更简单。
交易平台(本例中为MetaTrader 4)的作用是提供与外汇经纪商的连接。然后,经纪商提供一个平台,提供有关市场的实时信息并执行买/卖订单。对于外汇交易新手,以下是是基本交易界面信息:
500)this.width=500' hspace=10 vspace=10/>通过MetaTrader 4,你可以使用内部函数访问所有这些数据,可访问各种时间范围:每分钟(M1)、每五分钟(M5)、M15、M30、每小时(H1)、H4、D1、W1、MN。
当前价格的变动称为tick。换句话说,一个tick变动是一个货币对买入价或卖出价的变化。在活跃的市场中,每秒可能有许多ticks。在平稳的市场中,可能有几分钟没有一个tick。
当你通过这样的平台下订单时,你买入或卖出一定数量的某种货币。还可以设置止损和止盈限额。止损限额是指在结束交易之前,你能承受的最大点数(价格变化)的损失。获利限制是指在兑现之前,你将积累获利的点数。
客户的算法交易规范很简单:他们想要一个基于两个指标的外汇机器人。这两个指标需要在尝试定义市场状态和做出交易决策时非常有用,因为它们基于过去的数据(例如,过去n天的最高价格)。MetaTrader 4内置了许多指标,但是,我客户感兴趣的指标来自自定义交易系统。
他们希望每次这些自定义指标中的两个相交时进行交易,并且仅在某个角度时进行交易。
500)this.width=500' hspace=10 vspace=10/>着手开始做
当我着手开始做时,我了解到MQL4程序具有以下结构:
【预处理器指令】
【外部参数】
【全局变量】
【初始化函数】
【去初始化函数】
【启动功能】
【自定义功能】
start函数是每个MQL4程序的核心,因为它会在每次市场变动时执行(因此,该函数将在每个价格变动时执行一次)。无论你使用的时间范围如何,都是如此。例如,你可以在H1(一小时)时间范围内操作,但start函数将在每个时间范围内执行数千次。
为了解决这个问题,我强制函数在每个周期单位执行一次:
500)this.width=500' hspace=10 vspace=10/>获取指标的值:
500)this.width=500' hspace=10 vspace=10/>决策逻辑,包括指标及其角度的交集:
500)this.width=500' hspace=10 vspace=10/>发送订单:
500)this.width=500' hspace=10 vspace=10/>回测
一旦我建立了我的算法交易系统,我就想知道:1)它的执行是否适当2)它使用的外汇交易策略是否有用
回溯测试是在过去的事件下测试特定(自动化或非自动化)系统的过程。换句话说,你使用过去数据代替现在来测试你的系统。
MT4自带一个用于回测外汇交易策略的工具(如今,有更多专业工具提供更强大的功能)。首先,你设置时间表并在模拟环境下运行你的程序;该工具将模拟每个分时,知道对于每个单位,它应该以特定价格开盘,以特定价格收盘,并达到指定的高点和低点。
将程序的操作与历史价格进行比较后国际注册外汇交易师,你将对它是否正确执行有一个很好的了解。
通过回溯测试,我检查了外汇机器人在一些随机时间间隔内的回报率;毫无疑问,我知道我的客户不会赚钱——他选择的指标以及决策逻辑都没有盈利。作为示例,以下是在M15窗口上运行程序进行164次操作的结果:
500)this.width=500' hspace=10 vspace=10/>请注意,我们的余额(蓝线)在其起点以下视为结束。
提示:说一个系统“有利可图”或“无利可图”并不总是正确的。通常,系统会根据市场的“情绪”在一段时间内有利/无利可图,这可以遵循许多不同的图表模式:
500)this.width=500' hspace=10 vspace=10/>参数优化
尽管回溯测试让我对这个FX机器人的实用性产生了怀疑,但当我开始尝试使用它的外部参数并注意到和整体回报率产生巨大差异时,我就产生好奇。这门特殊的科学被称为参数优化。
我做了一些粗略的测试,试图推断外部参数对回报率的重要性,并得出了这样的结论:
500)this.width=500' hspace=10 vspace=10/>或者,清理数据后:
500)this.width=500' hspace=10 vspace=10/>你可能认为(正如我所做的那样)你应该使用参数A。但是这个决定并不像看起来那么简单。具体来说,请注意参数A的不可预测性:对于小错误值,其返回值会发生巨大变化。换句话说,参数A很可能会高估未来的结果,因为任何不确定性、任何变化都会导致更差的性能。
但确实,未来是不可控的,所以参数A的返回也是不确定的。事实上,最好的选择是依靠不可预测性。通常,最大回报较低但可预测性较好(波动较小)的参数比具有高回报但可预测性较差的参数更可取。
唯一可以确定的是,你不知道市场的未来,并且根据过去的数据认为你知道市场的表现,这种判定是错误的。反过来,你必须在外汇交易中承认这种不可预测性。
这并不一定意味着我们应该使用参数B,因为即使参数A具有较低回报,但也比参数B表现更好;这只是为了向你展示优化参数可能会导致测试夸大未来可能的结果。
外汇算法交易注意事项
自从有了第一次算法外汇交易经验以来,我已经为客户构建了几个自动交易系统,我可以告诉你,总有探索的空间和进一步的优化分析要做。例如,我最近建立了一个基于寻找所谓“Big fish”运动的系统;也就是说,在微小的时间单位内,巨大的点数变化。这是一个让我着迷的研究。
构建你自己的外汇模拟系统是了解更多外汇市场交易的最佳选择,而且可能性是无穷尽的。例如,你可以尝试将价格变化的概率分布解读为一个市场(例如欧元/美元)中波动率的函数,并且可能使用每个波动率状态的分布创建蒙特卡罗模拟模型,使用任何你想要的精确程度。
进一步阅读
如今,有大量工具可用于构建、测试和改进交易系统自动化:用于测试的Trading Blox、用于交易的NinjaTrader、用于编程的OCaml,仅举几例。
以下是我向程序员和热心交易者推荐的一些文章:
BabyPips:如果你不了解外汇交易,这就是起点。
海龟之道,由Curtis Faith撰写:在我看来,这就是外汇圣经。一旦你有一些交易经验并了解一些外汇策略,那就可以阅读它。
Technical Analysis for the Trading Professional — Strategies and Techniques for Today’s Turbulent Global Financial Markets作者:Constance M. Brown
智能交易编程系统–在MQL中为MetaTrader 4创建自动交易系统,作者:Andrew R. Young
交易系统–系统开发和投资组合优化的新方法,Trading Systems – A New Approach to System Development and Portfolio Optimisation
作者Urban Jeckle和Emilio Tomasini:技术性很强,非常专注于外汇测试。
A Step-By-Step Implementation of a Multi-Agent Currency Trading System作者:Rui Pedro Barbosa和Orlando Belo:这个非常专业,描述了您可以如何创建交易系统和测试平台。