MT4软件本地跟单方法的实现

阅读 :
欢迎访问 外 汇 邦 WWW.WaiHuiBang.com
许多汇友都有机会得到一些观察帐号,用来查看一些平台、机构提供的账户交易状况,眼看着人家的账户赚钱,自己不由得心动。

笔者通过反复测试,琢磨出一套“本地跟单方法”,特制作一个模型分享给大家。

首先了解两个基本概念:
1、MQL4规定文件读写只允许在expertsfiles文件夹或者它的子文件夹里面进行读写,这就给我们实现本地跟单提供了机会。  
2、MT4终端软件安装完毕后,你可以将安装好的文件直接复制粘贴到硬盘的任何地方,甚至是U盘,只要双击“terminal.exe”就可以运行。通过这种方法,你可以在一台电脑中同时运行若干个MT4软件。

基于以上两个概念,本地跟单的工作原理描述如下:

 

我们把做单的平台定义为“信号平台”,在这个平台上运行观察账户,并加载“信号EA”程序,一旦有开仓或者平仓等动作,程序就会自动记录到指定的中间文件当中,如上图所示的“交易信息”文件。  

我们把跟单操作的平台定义为“操作平台”,加载“跟单EA”,该程序会随时读取“交易信息”文件,识别最新的交易行为,自动按照更新的信息执行开仓、平仓操作。

通过这种方法实现跟单,理论上只有毫秒级的延时,可谓是“秒杀”。 如果你有兴趣,那么Follow Me!

【第一步】  准备两个平台

到MetaTrade公司网站(http://www.metatrader4.com/cn)下载客户端,并安装。

在D盘新建一个文件夹:myMT4,把MT4安装文件夹中(C:Program FilesMetaTrader 4)的所有文件复制粘贴到myMT4文件夹中,此时建好了操作平台。

在“D:myMT4expertsfiles”文件夹中新建一个文件夹“myMT4Signal”,把MT4安装文件夹中(C:Program FilesMetaTrader 4)的所有文件复制粘贴到myMT4Signal文件夹中,此时建好了信号平台。

分别双击myMT4和myMT4Signal文件夹下面的terminal.exe,系统就会运行两个MT4终端,申请模拟帐号,就可以分别操作了。

【第二步】  编写两个程序

第一个程序,命名为“myMT4Signal.mq4”,编译后运行在信号平台中,详细说明及源代码如下:
 
  1.  
  2. /*
  3. 程序名:myMT4Signal
  4. 程序任务:监控帐户持仓单变化情况
  5. 1、将新开仓订单信息写到"TradeInfo"文件当中,包括开仓时间、订单号、货币对、订单类型、开仓量、开仓价、订单注释、订单特征码。
  6. 2、如果没有持仓订单,则删除文件。
  7. */ 
  8. #property copyright "Copyright By Laoyee"
  9. #property link      "http://www.docin.com/yiwence"
  10. int start()
  11.     {
  12.         if (OrdersTotal()==1 && OrderSelect(0, SELECT_BY_POS, MODE_TRADES))
  13.           {
  14.               int myHandle = FileOpen("TradeInfo.csv", FILE_CSV | FILE_WRITE, ",");
  15.               FileWrite(myHandle, OrderOpenTime(), OrderTicket(), OrderSymbol(), OrderType(), OrderLots(), OrderOpenPrice(), OrderComment(), OrderMagicNumber());
  16.               FileClose(myHandle);
  17.            }
  18.         if (OrdersTotal()==0) FileDelete("TradeInfo.csv"); 
  19.         return(0);
  20.     } 
  21.  

复制代码

第二个程序,命名为“myMT4Trade.mq4”,编译后运行在操作平台中,详细说明及源代码如下:
 
  1.  
  2. /* 
  3. 程序名:myMT4Trade 
  4. 程序任务:监控帐户持仓单变化情况 
  5. 1、读取"myMT4Trade"文档中的订单号、货币对、开仓类型、开仓量
  6. 2、如果没有持仓订单,根据获取的货币对、开仓类型、开仓量市价开仓
  7. 3、如果没有读到指定的文件,则持仓单平仓
  8. */ 
  9. #property copyright "Copyright By Laoyee" 
  10. #property link      "http://www.docin.com/yiwence" 
  11. string myType, myLots, mySymobl; 
  12. int myHandle; 
  13. int start()
  14.     { 
  15.       if (iReadFile() == 1 && OrdersTotal()==0)
  16.           { 
  17.             int mycmd1 = StrToInteger(myType);
  18.             string mySymobl1 = mySymobl; 
  19.             double mylots1 = NormalizeDouble(StrToDouble(myLots),2);
  20.             double myOpenPrice; 
  21.             if (mycmd1 == 0) myOpenPrice = MarketInfo(mySymobl1, MODE_ASK);
  22.             if (mycmd1 == 1) myOpenPrice = MarketInfo(mySymobl1, MODE_BID);
  23.             OrderSend(mySymobl, mycmd1, mylots1, myOpenPrice, 0, 0, 0);
  24.           } 
  25.       if (iReadFile() == 0 && OrderSelect(0, SELECT_BY_POS, MODE_TRADES))
  26.           { 
  27.             double myClosePrice; 
  28.             if (OrderType()==OP_BUY) myClosePrice=Bid;
  29.             if (OrderType()==OP_SELL) myClosePrice=Ask; 
  30.             OrderClose(OrderTicket(), OrderLots(), myClosePrice, 0);
  31.           }
  32.       return(0);
  33.     } 
  34. int iReadFile()
  35.     { 
  36.       myHandle = FileOpen("\myMT4Signal\experts\files\TradeInfo.csv", FILE_BIN | FILE_READ);
  37.       if (myHandle == -1) return(0);
  38.       string myValue; 
  39.       myValue = FileReadString(myHandle, 60);
  40.       int myDatecnt = StringFind(myValue, ",", 0); 
  41.       string myDate = StringSubstr(myValue, 0 ,myDatecnt);        
  42.       int myTicketcnt = StringFind(myValue, ",", myDatecnt+1); 
  43.       string myTicket = StringSubstr(myValue, myDatecnt+1, myTicketcnt-myDatecnt-1);        
  44.       int mySymbolcnt = StringFind(myValue, ",", myTicketcnt+1); 
  45.       mySymobl = StringSubstr(myValue, myTicketcnt+1, mySymbolcnt-myTicketcnt-1);  
  46.       int myTypecnt = StringFind(myValue, ",", mySymbolcnt+1); 
  47.       myType = StringSubstr(myValue, mySymbolcnt+1, myTypecnt-mySymbolcnt-1);  
  48.       int myLotscnt = StringFind(myValue, ",", myTypecnt+1); 
  49.       myLots = StringSubstr(myValue, myTypecnt+1, myLotscnt-myTypecnt-1);  
  50.       int myPricecnt = StringFind(myValue, ",", myLotscnt+1); 
  51.       string myPrice = StringSubstr(myValue, myLotscnt+1, myPricecnt-myLotscnt-1);
  52.       FileClose(myHandle);
  53.       return(1);
  54.     } 
  55.  

复制代码

【第三步】  实施跟单测试

在信号平台手工开仓,我们会看到操作平台会自动开出一张同类型的订单。 

将信号平台的持仓单平掉,操作平台的持仓单也随之平仓。

【总结】

信号平台上从发出开仓命令到成交一个新订单并写入到中间文件可能耗时300毫秒,而操作平台从识别中间文件信息更新并发出开仓指令到成交可能耗时500毫秒,那么就会出现800毫秒的误差,所以,剥头皮类的EA不适合采用这种方法。

以上两个程序功能单一,意在提供一个方法,供学习测试使用。
欢迎访问 外 汇 邦 WWW.WaiHuiBang.com
本文标题:MT4软件本地跟单方法的实现 - MT4平台MQL4编程学习
本文地址:http://www.ea666.cn/fxschool/autotrading/mql4/41470.html

相关文章

  • MQL4交易函数常见错误代码及处理意见

    任何交易相关操作(OrderSend(), OrderClose(), OrderCloseBy(), OrderDelete()和OrderModify()函数)都会因为些原因导致失败,返回负的订单号或FALSE,我们通过调用GetLastError()函数能找出失败的原因。每一...

    MQL4编程学习
  • EA复盘非常漂亮,一旦挂了实盘就完蛋的原因是什么?

    很多EA复盘非常漂亮,一旦挂了实盘就完蛋了,其最主要的有几点原因:1.复盘时间不够长,或者有选择性。      大家知道外汇行情放大来说是按年来分析行情的,可能某年或某几年是单边,某年或某几年是震荡,但却不会连续十年以上都是单边或都是震荡。...

    MQL4编程学习
  • MT4软件应用入门

      MT4外汇交易软件是外汇保证金中最常用的交易软件之一,其便利的操作,对网速要求不高,软件开放程度高所以一直是散户群体最受欢迎的看盘利器。但是掌握好这个平台需要在看盘之余进行模拟的实操,以及学习相关运用知识...

    MQL4编程学习
  • 外汇EA的分类

    由于这几年EA技术有了极大发展,各种新型EA不断涌现,我仅对其进行大概的分类,不够完善和严谨,敬请原谅。 1. 趋势类 最常见也是最成熟的类型,趋势类。最为主流的EA类型,一般根据各种指标和策略来进行出入场操作。 2....

    MQL4编程学习
  • EA编程教程大全之常用函数

    对于每个执行的MQL4程序,一定数量的变量设定可以轻松应对图表中的价格状态:智能交易,脚本或者是客户指标。. 资料应用到可变量的模型中来。 可以由预定义的变量分开处理。 这些数据会在开启后应用 RefreshRate...

    MQL4编程学习
你可能感兴趣