MT4软件本地跟单方法的实现
笔者通过反复测试,琢磨出一套“本地跟单方法”,特制作一个模型分享给大家。
首先了解两个基本概念:
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”,编译后运行在信号平台中,详细说明及源代码如下:
- /*
- 程序名:myMT4Signal
- 程序任务:监控帐户持仓单变化情况
- 1、将新开仓订单信息写到"TradeInfo"文件当中,包括开仓时间、订单号、货币对、订单类型、开仓量、开仓价、订单注释、订单特征码。
- 2、如果没有持仓订单,则删除文件。
- */
- #property copyright "Copyright By Laoyee"
- #property link "http://www.docin.com/yiwence"
- int start()
- {
- if (OrdersTotal()==1 && OrderSelect(0, SELECT_BY_POS, MODE_TRADES))
- {
- int myHandle = FileOpen("TradeInfo.csv", FILE_CSV | FILE_WRITE, ",");
- FileWrite(myHandle, OrderOpenTime(), OrderTicket(), OrderSymbol(), OrderType(), OrderLots(), OrderOpenPrice(), OrderComment(), OrderMagicNumber());
- FileClose(myHandle);
- }
- if (OrdersTotal()==0) FileDelete("TradeInfo.csv");
- return(0);
- }
复制代码
第二个程序,命名为“myMT4Trade.mq4”,编译后运行在操作平台中,详细说明及源代码如下:
- /*
- 程序名:myMT4Trade
- 程序任务:监控帐户持仓单变化情况
- 1、读取"myMT4Trade"文档中的订单号、货币对、开仓类型、开仓量
- 2、如果没有持仓订单,根据获取的货币对、开仓类型、开仓量市价开仓
- 3、如果没有读到指定的文件,则持仓单平仓
- */
- #property copyright "Copyright By Laoyee"
- #property link "http://www.docin.com/yiwence"
- string myType, myLots, mySymobl;
- int myHandle;
- int start()
- {
- if (iReadFile() == 1 && OrdersTotal()==0)
- {
- int mycmd1 = StrToInteger(myType);
- string mySymobl1 = mySymobl;
- double mylots1 = NormalizeDouble(StrToDouble(myLots),2);
- double myOpenPrice;
- if (mycmd1 == 0) myOpenPrice = MarketInfo(mySymobl1, MODE_ASK);
- if (mycmd1 == 1) myOpenPrice = MarketInfo(mySymobl1, MODE_BID);
- OrderSend(mySymobl, mycmd1, mylots1, myOpenPrice, 0, 0, 0);
- }
- if (iReadFile() == 0 && OrderSelect(0, SELECT_BY_POS, MODE_TRADES))
- {
- double myClosePrice;
- if (OrderType()==OP_BUY) myClosePrice=Bid;
- if (OrderType()==OP_SELL) myClosePrice=Ask;
- OrderClose(OrderTicket(), OrderLots(), myClosePrice, 0);
- }
- return(0);
- }
- int iReadFile()
- {
- myHandle = FileOpen("\myMT4Signal\experts\files\TradeInfo.csv", FILE_BIN | FILE_READ);
- if (myHandle == -1) return(0);
- string myValue;
- myValue = FileReadString(myHandle, 60);
- int myDatecnt = StringFind(myValue, ",", 0);
- string myDate = StringSubstr(myValue, 0 ,myDatecnt);
- int myTicketcnt = StringFind(myValue, ",", myDatecnt+1);
- string myTicket = StringSubstr(myValue, myDatecnt+1, myTicketcnt-myDatecnt-1);
- int mySymbolcnt = StringFind(myValue, ",", myTicketcnt+1);
- mySymobl = StringSubstr(myValue, myTicketcnt+1, mySymbolcnt-myTicketcnt-1);
- int myTypecnt = StringFind(myValue, ",", mySymbolcnt+1);
- myType = StringSubstr(myValue, mySymbolcnt+1, myTypecnt-mySymbolcnt-1);
- int myLotscnt = StringFind(myValue, ",", myTypecnt+1);
- myLots = StringSubstr(myValue, myTypecnt+1, myLotscnt-myTypecnt-1);
- int myPricecnt = StringFind(myValue, ",", myLotscnt+1);
- string myPrice = StringSubstr(myValue, myLotscnt+1, myPricecnt-myLotscnt-1);
- FileClose(myHandle);
- return(1);
- }
复制代码
【第三步】 实施跟单测试
在信号平台手工开仓,我们会看到操作平台会自动开出一张同类型的订单。
将信号平台的持仓单平掉,操作平台的持仓单也随之平仓。
【总结】
信号平台上从发出开仓命令到成交一个新订单并写入到中间文件可能耗时300毫秒,而操作平台从识别中间文件信息更新并发出开仓指令到成交可能耗时500毫秒,那么就会出现800毫秒的误差,所以,剥头皮类的EA不适合采用这种方法。
以上两个程序功能单一,意在提供一个方法,供学习测试使用。
本文地址:http://www.ea666.cn/fxschool/autotrading/mql4/41470.html