【FX581原创】MT4开发技巧历史记录的“坑”

MT4指标、EA讨论群
fx58

我们会经常遇到这样的需求:统计历史交易记录的手数,或者得到最后一笔历史交易订单的信息。这样的功能对于我们来说并不困难,下面是一个简单的代码示例:

double lot = 0;

for(int i=0;i < OrdersHistoryTotal();i++)

{

 if(OrderSelect(i,SELECT_BY_POS,MODE_HISTORY) == false) continue;

   lot += OrderLots();

}

Print("总手数:",lot);

这段代码就是通过循环统计出所有历史的手数,其实这段代码就是把循环遍历所有在场单的代码改动下即可。把OrdersTotal()函数改成OrdersHistoryTotal(),把OrderSelect函数里增加一个参数:MODE_HISTORY。那么这么一个简单的程序也有问题吗?答案是肯定的。

我们来运行下这个EA程序,在终端中显示的结果是:

总手数居然是0!太不可思议了,明明我有很多的交易记录啊。

现在跟小编一起来做一些操作,再运行下程序看看最后的结果是什么

在账户历史中点击右键,选择所有交易记录,现在账户历史中就出现了之前交易的所有历史记录

那么我们在运行下EA程序试下结果就会显示正常:

这就是通过程序得到历史记录的一个“坑”了,在MT4中,软件默认会只显示当月的历史记录,而程序在得到历史记录时只根据软件当前的历史记录进行查找,由于这个月我没有做任何的交易,所以在统计总手数的时候得到的是0,而如果在软件里把所有的交易记录都显示出来后,程序终于可以正常工作了。

之所以我们很少发现这个问题的原因在于一般的MT4平台模拟账户时效性都很短,注册了一个模拟户后很快就过期了,导致很少有人能发现这个问题。所以拥有一个能开长效模拟户的平台尤为重要了,我们推荐使用xxx平台它可以提供长达xx天的模拟账户。

长效模拟户本身对于我们开发和测试EA程序是有很大帮助,众所周知开发完成一款新的EA程序后只是用历史模拟是不够的,还需要挂机测试,如果测试没几天就过期了这样对于开发EA来说是非常烦恼的事情。

关于这个历史记录的第二个“坑”是,我们要想得到历史记录只能用EA程序来获取,如果我们写一个脚本程序,同样是得不到历史记录的,即使我们已经在账户历史中显示了所有的记录。

那么我们如何才能避免这个问题呢?因为客户在使用我们的EA程序时是不知道这个问题的,如果客户不知道或根本不会去这样操作,我们在程序中如何避免这个问题呢?一个比较简单的办法是在您的EA程序运行中,把所有下单的记录都存在文件中,这样即使客户没有任何操作也可以拿到这些历史记录信息,下面是一个简单的存文件的代码示例:

//content为要存储的内容

void setfile(string content)

{

   string filename = "要存储的文件名";

   int filehandle = FileOpen(filename,FILE_WRITE|FILE_TXT);//也可以存成CSV文件把FILE_TXT替换成FILE_CSV,这样可以存储多条信息

   if(filehandle == INVALID_HANDLE)//判断读取文件是否出现错误

   {

      FileClose(filehandle);

      Print("存储文件发生错误");

   }

   else//正常打开,可以写入内容了

   {

      FileWriteString(filehandle, content);

      FileClose(filehandle);

   }

}

通过以上的方法,想必各位已经有所了解,在以后的开发中我们的程序将更加的完善和健壮。

著作权归作者所有

最后编辑于 2023/08/24 08:10

18 赞同
33 评论
收藏
相关推荐
关于我们 用户协议隐私政策风险披露认证协议社区准则 帮助中心 意见反馈
App Store Android

风险披露

金融工具交易属于高风险投资活动,有导致部分或全部投资本金损失的风险,可能不适合所有投资者。本网站所包含的任何观点、聊天信息、通知、新闻资讯、研究调查、分析、价格或其他信息都是作为一般市场信息提供的,仅供教育和娱乐之用,并不构成投资建议。 所有的观点、市场行情、推荐或任何其他内容可能随时会改变,恕不另行通知。Trading.live对因使用或根据这些信息而直接或间接造成的任何损失或损害概不负责。

© 2024 Tradinglive Limited. All Rights Reserved.