其实,MT4编程中的时间数值类型datetime,就是一个int整数类型,其单位是秒,包括TimeCurrent、TimeLocal等函数获取的数值都是以秒为单位的,所以进行算术运算的时候,记得以秒为标准进行处理就行了。
日志分类:指标
打开MT4的帮助文档,我们可以看到有一组叫做”Trading functions”的函数,这里面所有的函数都是Orderxxx这样的格式,顾名思义,这组函数的作用就是对Order进行操作。那么,这组函数的运作机制是怎样的呢?下面,我们来一窥究竟。
当一个EA、指标或脚本开始运行时,MT4会自动为它分配一个电脑内存中的空间,我们可以把这个空间想象成一个公用的储物柜,这个储物柜的大小恰好能放入一张Order;然后,当我们使用Order系列函数时,这些函数就会来到这个“储物柜”获取指定的Order,进行操作。比如,OrderSymbol函数是获取Order的货币对名称、OrderLots是获取Order的仓量、OrderClose是关闭指定的Order,那么,假如同时存在很多张Order,这些函数是怎么知道获取哪张Order的信息或对哪张Order进行操作呢?答案就是放在“储物柜”里面的那张Order。那是谁把Order放入这个“储物柜”内?这是,OrderSelect函数就出场了!我们在看很多MT4源代码时,都会发现使用Order系列的函数对Order进行操作前,都会先用OrderSelect函数,其作用就是把符合条件的某张Order放入这个“储物柜”中去,让其它函数对其进行操作。所以,大家以后在使用Order系列的函数时,记得要先利用OrderSelect函数把Order取出来放入“储物柜”去,不然其它函数来到这个“储物柜”找不到Order,自然就无功而返了!
相信很多朋友都知道,在MT4的图表中有个“成交量”指标(快捷键Ctrl+L)。发现很多朋友都会把这个指标误认为是股票或期货当中的成交量,甚而围绕这个指标开发相应的指标或EA,所以这里想简单说一下:MT4中的这个“成交量”(Volume),其实我认为应当是官方翻译的错误,按照官方的文档,这个“成交量”指的是该时间周期内Tick的次数!比如在M5图表上,则每根K线下的Volume数值,指的是该5分钟内,价格跳动的次数(Tick的次数)。这点希望大家要注意了。
有不少朋友在QQ和msn上问我类似的问题,从官方目前公布的资料来看,MT5中还是可以继续使用MT4语法的(这得益于C++对C的良好兼容),区别只是MT4中提供的系统函数在MT5中可能发生变动深圳被替换了,另外还添加了部分新的系统函数。所以,我的看法是:可以学。因为MQL4相对面向对象的MQL5来说,我想对从未接触过程序开发的朋友来说,还是相对较为容易掌握的。毕竟从开始学习到入门是需要一定时间的,现在开始学习MT4开发,到MT5出来之后再学习一下MT5中提供的系统函数,对非专业程序开发者来说是一个不错的选择。
我把MQLib开发专家的第一个试用版本发布出来了,有兴趣的朋友可以试用一下。由于时间关系,文档还在编写之中,同时因为MQLib尚未完善,所以目前限制了只能用于模拟帐号上。有兴趣的朋友请到MQLib官方网站下载:http://www.mqlib.com/chs/。
自从发布海豚小弟EA之后,很久没有和大家分享新的、原创性的东西了。其实这段时间,除了进行EA开发入门班的教学外,一直在做一个东西,这个就是MQLib,也就是我准备在近期发布出来的新产品。
开发MQLib,源于在两期EA开发入门班之后的,发觉对更多EA开发的初学者,特别是之前毫无编程方面的概念的初学者来说,MT4编程太过于专业了,简化其开发EA的工作量、降低门槛才是更为迫切的需要。因为大多数人学习这个,是为了更好地进行交易,而不是为了成为软件开发的专家,否则就有点舍本逐末了。基于这个观点,我萌发了开发MQLib这么个东西的念头。
那么,MQLib到底是个什么东西呢?简单来说,MQLib是一套由精通MT4编程的专业人士,利用MQL语言编写而成的函数包,这个函数包内置了大量的函数可供调用,其功能覆盖了MT4编程的各个方面,用户只需通过简洁明了的方式进行调用,即可轻松快捷地实现很多原本需要编写大量专业代码才能实现的复杂功能。通过站在巨人的肩膀上,用户不用再耗费太多精力在MT4编程的细节上,只需关注于交易模型的设计即可,MQLib函数库的高质量、精心设计,确保了用户交易模型的每个细节都能得到高效可靠的实现。
我把MQLib的首要目标定位为简单易用、从未接触过MT4编程的人也能很快上手,为此,MQLib将所有复杂的细节都封装起来,用户只需在代码文件中添加一句代码引用MQLib即可使用MQLib的所有功能。举个例子,下面的代码是一段很经典的判断两条均线是否交叉的代码:
... double ma1, ma2, ma3, ma4; ma1 = iMA(NULL, 0, 5, 0, MODE_SMA, PRICE_CLOSE, 1); ma2 = iMA(NULL, 0, 10, 0, MODE_SMA, PRICE_CLOSE, 1); ma3 = iMA(NULL, 0, 5, 0, MODE_SMA, PRICE_CLOSE, 2); ma4 = iMA(NULL, 0, 10, 0, MODE_SMA, PRICE_CLOSE, 2); if (ma1>ma2 && ma3<=ma4) { //发生金叉,进行相应操作.. } ...
对初学者来说,这段代码真的太繁琐,不好理解。那么,在使用了MQLib之后,代码会是怎样的呢?我们看一下:
... include "MQLib.mqh" if (SMACRoss(5, 10, PRICE_CLOSE, 1)==UP_CROSS) { //发生金叉,进行相应操作... } ...
很简单,对不?这就是MQLib的作用,把大部分常见的操作实现出来,一、两句代码就可以调用,不用再去操心那些让人头疼的实现细节了。
MQLib的第一个版本已经开发完成,目前正在编写使用手册,很快就会和大家见面了。
MT4编程中,有几个函数非常重要,而MarketInfo就是其中的一个。
大家都知道,瑞士军刀以其功能繁多而著称于世,同样,MarketInfo在MT4编程中也担当着类似的角色。通过使用MarketInfo函数,可以获得很多非常有用的信息。我们先来看看MarketInfo函数的原型定义:
double MarketInfo(string symbol, int type);
我们可以看到,MarketInfo有两个参数,第一个顾名思义,就是货币对名称,指我们希望获得信息的货币对名称;第二个是一个叫做type的int类型参数,这个 参数就是关键了。举个例子,假如我们想获取GBPUSD的点差,可以这样获取:
MarketInfo(“GBPUSD”, MODE_SPREAD);
又如我们想确定某个货币对在MT4中是否允许被交易,可以这样写:
MarketInfo(“NZDJPY”, MODE_TRADEALLOWED);
假如返回值是1,表示允许,返回0则表示禁止交易此货币对。
前两天有个朋友在QQ群里问了个问题:如何在指标中连续使用两次PlaySound函数。感觉有点意思,遂结合帮助文档提供了一个解决方法,现在把这个方法和有需要的朋友一起分享一下。
可能很多朋友都知道,Sleep函数是不能在指标中使用的,而只能在ea和脚本中使用,这可能是MT4本身的设计问题,但问题就在这里:PlaySound函数是不能连续不间断的使用两次或多次的,这样就只能播放最后一次调用时指定的声音文件了,例如:
PlaySound("connect.wav"); PlaySound("ok.wav");
这样就只会播放ok.wav了。因此,我们可以转换一下思路,这样来写:
int cnt = GetTickCount(); PlaySound("connect.wav"); while (GetTickCount()<cnt+1000){}; PlaySound("ok.wav");

