手机版

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

阅读 :
外_汇_邦 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不适合采用这种方法。

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

相关文章

  • MQL4技术指标相关函数(一)

    MQL4不仅可以计算当前图表中任何指标,还可以计算任何有效的货币对/图表时段的数据。如果请求数据(货币对名称/图表时段不同于当前图表)来自其他图表,出现这种情况如果相应的图表没有在客户端内打开,数据需要...

    MQL4编程学习
  • MT4平台的优势在哪里

    我们在外汇交易的时候,选择一个最好的外汇平台就像是在战场上选择最好的武器一样的重要,有了利器,交易者才能在交易当中获得成功,在外汇在线交易的市场当中,交易者有很多的交易平台可以使用,但是在所有的外汇平台当中,MT4...

    MQL4编程学习
  • MT4 dual thrust系统原形源码[MT4公式]

    //dual thrust系统原形源码 Inputs: K1(.5),K2(.5),Mday(1),Nday(1);Vars: BuyRange(0), SellRange(0);Vars: BuyTrig(0),SellTrig(0);Vars: HH(0),LL(0),HC(0),LC(0);If CurrentBar > 1 Then BeginHH = Highest(H...

    MQL4编程学习
  • 小菜鸟教你们写外汇ea

    声明:本人新手+菜逼,接触外汇和ea都时间不长,盈利记录为0,题目写的这么装逼是为了来网络上寻找虚拟自尊。如果不是这个目的,我想不出任何其他投稿的理由。闷头看别人的文章吸取别人经验对自己多有利啊,还不...

    MQL4编程学习
  • MT4编程初级手册(10):一条指标线的实例
    MT4编程初级手册(10):一条指标线的实例

    我们现在以一个简单的实例来给大家讲述如何进行EA的开发。要画指标线,只要在程序中写明以下几点就可以了: 第一、定义指标线所在窗口,是主图还是副图。 第二、创建数组,用以保存指标线在各个位置上的值。 第三、要建立...

    MQL4编程学习
你可能感兴趣