
很多汇友都有机会得到一部分观察帐号,用来查看一部分平台、机构供应的账户交易情况,眼看着人家的账户赚钱,自己不由得心动。
笔者通过反复试探,琢磨出一套“本地跟单方法”,特制作一个模型分享给大家。
首先了解两个基本概念:
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、假使没有读到指定的文件,则持仓单平仓
- */
- #propertycopyright"CopyrightByLaoyee"
- #propertylink"http://www.docin.com/yiwence"
- stringmyType,myLots,mySymobl;
- intmyHandle;
- intstart()
- {
- if(iReadFile()==1&&OrdersTotal()==0)
- {
- intmycmd1=StrToInteger(myType);
- stringmySymobl1=mySymobl;
- doublemylots1=NormalizeDouble(StrToDouble(myLots),2);
- doublemyOpenPrice;
- 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))
- {
- doublemyClosePrice;
- if(OrderType()==OP_BUY)myClosePrice=Bid;
- if(OrderType()==OP_SELL)myClosePrice=Ask;
- OrderClose(OrderTicket(),OrderLots(),myClosePrice,0);
- }
- return(0);
- }
- intiReadFile()
- {
- myHandle=FileOpen("\myMT4Signal\experts\files\TradeInfo.csv",FILE_BIN|FILE_READ);
- if(myHandle==-1)return(0);
- stringmyValue;
- myValue=FileReadString(myHandle,60);
- intmyDatecnt=StringFind(myValue,",",0);
- stringmyDate=StringSubstr(myValue,0,myDatecnt);
- intmyTicketcnt=StringFind(myValue,",",myDatecnt+1);
- stringmyTicket=StringSubstr(myValue,myDatecnt+1,myTicketcnt-myDatecnt-1);
- intmySymbolcnt=StringFind(myValue,",",myTicketcnt+1);
- mySymobl=StringSubstr(myValue,myTicketcnt+1,mySymbolcnt-myTicketcnt-1);
- intmyTypecnt=StringFind(myValue,",",mySymbolcnt+1);
- myType=StringSubstr(myValue,mySymbolcnt+1,myTypecnt-mySymbolcnt-1);
- intmyLotscnt=StringFind(myValue,",",myTypecnt+1);
- myLots=StringSubstr(myValue,myTypecnt+1,myLotscnt-myTypecnt-1);
- intmyPricecnt=StringFind(myValue,",",myLotscnt+1);
- stringmyPrice=StringSubstr(myValue,myLotscnt+1,myPricecnt-myLotscnt-1);
- FileClose(myHandle);
- return(1);
- }
-
复制代码【第三步】实行跟单试探在信号平台手工开仓,我们会目睹操作平台会自动开出一张同类型的订单。
将信号平台的持仓单平掉,操作平台的持仓单也跟随平仓。
【归纳】信号平台上从发出开仓命令到成交一个新订单并写入到中间文件或许耗时300毫秒,而操作平台从识别中间文件信息更新并发出开仓指令到成交或许耗时500毫秒,那就会显现800毫秒的误差,所以,剥头皮类的EA不适合采取该种方法。
以上两个程序功能单一,意在供应一个方法,供学习试探运用。