外_匯_邦 WaiHuiBang.com
許多匯友都有機會得到一些觀察帳號,用來查看一些平台、機構提供的賬戶交易狀況,眼看著人家的賬戶賺錢,自己不由得心動。www.emoneybtc.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”,編譯後運行在信號平台中,詳細說明及源代碼如下:
-
- /*
- 程序名: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不適合采用這種方法。
以上兩個程序功能單一,意在提供一個方法,供學習測試使用。
外_匯_邦 WaiHuiBang.com