目录
金融交易发展至今,几乎所有交易软件都支持自动化交易。要实现自动化交易就需要编写程序,而现实情况是,每个交易软件都有属于自己的一套语言语法体系,相互之间不通用。这就意味着在A平台编写好的程序,想要到B平台执行,必须重写代码。
“有趣”的是,用户最多的外汇交易软件公司迈达克公司目前的MT4和MT5两套交易软件居然也会“语言不通”。
在工作中我经常面对这种尴尬局面,在为客户编写好MT4程序之后,又被要求“转换”为MT5。语言不通,不是简单转换就能完成的,而是意味着要重写代码,各种逻辑也要重新测试。
深度了解MT4/5语言语法之后,我决定编写一套“MT4/5融合编程模版”。希望能实现:在MT4中编写好的程序,拷贝到MT5中,不需要改一个字母就能使用,反过来也是一样。今天,这个目标实现了。
框架设计
MT4和MT5语言在订单操作(建仓、平仓、止盈止损)、读取技术指标两个方面的语法有很大区别,这就导致了在MT4中编写的代码放到MT5中无法编译。
我采用部署头文件(include)方式,自定义一套统一的订单操作和指标读取命令,将MT4/5二者融合起来。代码如下:
//--- 声明通用变量
#include "egGV.mqh"
//--- 声明通用订单函数库
#include "egOC.mqh"
//--- 声明通用界面函数库
#include "egUI.mqh"
//--- 识别MT4/5编译器,声明指定函数库
#ifdef __MQL4__
#define MQLlanguage "MQL4"
//--- 声明通用订单控制OC4(Orders Control)函数库
#include "MT4\egOC4.mqh"
//--- 声明技术指标函数库
#include "MT4\egIdc4.mqh"
//--- 声明界面函数库
#include "MT4\egUI4.mqh"
#endif
#ifdef __MQL5__
#define MQLlanguage "MQL5"
//---声明指定订单控制OC5(Orders Control)函数库
#include "MT5\egOC5.mqh"
//---声明技术指标函数库
#include "MT5\egIdc5.mqh"
//---声明界面函数库
#include "MT5\egUI5.mqh"
#endif
程序设计
金融交易流程分为信号、建仓、加仓、止盈止损、减仓平仓等五个模块,编程模版配套了一个EA模版(MT45FUSE[2.0]),在编辑器中打开后就可以按模块开始编码。
一个完整的EA程序除了五个基本模块,还应该包括操作面板(UI)和授权验证等辅助模块,为此提供了一个无需修改就能够执行自动化交易的MT45融合范例程序(MT45_Demo[2.0])。
函数库设计
MT45融合EA编程系统提供了丰富的自定义函数库,包含持仓单、历史单多条件检索函数、订单操作函数、技术指标函数、图形界面函数以及常规函数。
配套手册
为了快速上手MT45融合EA编程系统,编程过程中快速查找命令语法,配套了《MT45融合EA编程手册[2.0]》分为高清PDF和chm两个版本:
关于学习
从2009年开始接触迈达克公司的MT3到现在的MT4/5,我经历了自动化交易的技术变革,接触过各种包括股票、期货、外汇的程序语言,见证了迈达克公司从小到大的变化。我认为在学习编写交易程序时,MT4/5是首选,因为MT4/5语言遵循C、C++语言规范,可以很好地应对各种交易策略的逻辑。
我把学习程序的人群分为程序员和新手两类:
第一类,程序员。无论你擅长哪种计算机语言,用“MT4/5融合编程模版”都可以快速上手。
第二类,新手。在这里要多说几句。
虽然这本书的目的是让读者能够高级别快速入门,但实际上不可能对每个人都有效。多年的工作经验告诉我,编程这门技能并不适合所有人学习,它要求学习者具备较强的逻辑思维能力和逻辑表达能力,如果要成为高手,更需要一些天生禀赋。
“不试试,怎么知道我不行?”——没错,我鼓励所有想学编程的的人投入时间和精力来尝试。但请记住,时间和精力是人生的成本,是金钱买不到的资源,是不可再生的资源。所以,如果你意识到自己“不够行”,我希望你能尽快完成“从入门到放弃”的过程,尽快找到适合自己的角色。因为,不会编程并不能阻碍你成长为金融界翘楚。
我建议,不妨限定一个不长的时间做尝试。在尝试期间向身边有经验的程序员咨询讨教,以尽快确认自己是否具备学好编程的各种基础条件,比如上面提到的,逻辑思维及表达能力。
根据以往的经验,推荐做一个连续20天,每天1小时的学习计划。
不会编程的新手是否有高起点入门的途径?答案是肯定的。卖油翁曾经说过:“我亦无他,唯手熟尔。”学习编程就是一个勤动手、多思考的过程。所有人都会历经,从照葫芦画瓢开始,通过反复练手,反复思考,最终到能够独立创作。
本书提供了若干个“高级葫芦”,无论你对语句是否理解,都可以先从一个具体的案例出发,在反复编写练习的过程中,逐步延伸阅读例如C语言规则之类的基础性知识。需要强调的是,只有在学习实践中出现了不懂的或者需要进一步理解的问题的时候,才特别需要去找资料学习,而不需要入门就先学那些枯燥的基础编程知识,“苦练基本功”完全可以在照葫芦画瓢阶段中完成。
真正的高起点,第一条是“兴趣”,能够一直保持兴致勃勃的状态,才能保持成长的高效率,这是快速成为精通编程高手的必要条件。
高起点第二条则是“坚持”,既然选择了就不要放弃。作为新手自然有很多不解、疑惑、甚至摸不着头脑的时候,这很正常。“读书百遍,其义自见”说的就是这个道理,反复动手做,做着做着,有些东西就会在无数的亲身体验和思考中豁然开朗了。反而,不停地查书找资料,死磕一个知识点,并不见得有很好的效果。
在完成了练手任务后,你就可以开始尝试着编写与范例不一样的程序,进入到创作阶段,独立实现一些小功能模块。
如果你是一名操盘手,学习编程的目的也只是为了能够简单编写一些自己想要的功能,那么就请切记不要忘记初心,避免在学习编程过程中走火入魔,避免变成一名蹩脚的程序员,还把交易给荒废了。
如果你是一名程序员,并且想在自动化交易编程方面有所作为,那么务必要熟悉甚至精通交易技术和交易规则,因为一个不懂交易的程序员不是好程序员。然而,交易显然存在巨大的诱惑,所以切记不要忘记初心,避免在研究交易方法与策略时走火入魔,避免变成一名蹩脚的操盘手,还把编程给荒废了。
无论是操盘手还是程序员,想要做好自己的角色,都需要多年的积累和沉淀。成功绝没有捷径可走,成为双料冠军更是需要无比坚韧的耐力和绝对清晰的头脑。
获取方式
仔细阅读以下代码
#property strict
//--- EA封面
#property version "2.0"
#property description "【联系方式】老易 QQ:921795 手机微信:13974863868"
//--- 加载预设变量与函数
#include <egMT45\MT45.mqh> //加载变量与函数
//=============================外部可预设参数【开始】====================================
input string npt_Note01="===仓位参数==="; //【仓位】
enum ordermode{buy=0,sell=1,双向=2,不执行=3}; //建仓类型
input ordermode npt_01_1_0=2; //选择建仓类型
input double npt_01_1=0.1; //初始建仓量
input string npt_Note95="===其他参数==="; //【其他】
input int npt_95_1=20220803; //EA订单识别码(-1=接管其他订单)
//=============================外部可预设参数【结束】====================================
//=============================内部全程变量【开始】====================================
//--- 订单与环境变量,如果订单需要进行多组分类,则需要定义多个不同名称
AccountInfo AI; //账户信息变量
SymbolInfo SI; //商品信息变量
TradesOrders TO[]; //持仓单信息变量
TradesStatistical TS; //持仓单统计变量
HistoryOrders HO[]; //历史单信息变量
HistoryStatistical HS; //历史单统计变量
//--- 程序变量
string MyOrderComment="EasyGo"; //订单注释变量
int MagicNumber=0; //EA订单识别码
bool PrintToLog=true; //输出到日志变量,true-显示,false-不显示
int prvHistoryOrders=0; //上一个历史单数量
//--- 预设历史单
bool npt_99_1=false; //启用历史数据(false=不启用)
bool npt_99_2=false; //选用建仓价(true=平仓价)
string npt_99_3=""; //截取历史数据开始时间(空值=最早,日期 格式:"2021.1.1 00:00:00")
string npt_99_4=""; //截取历史数据结束时间(空值=当前时间)
//=============================内部全程变量【结束】====================================