許多匯友都有機會得到一些觀察帳號,用來查看一些平臺、機構提供的賬戶交易狀況,眼看著人家的賬戶賺錢,自己不由得心動。
筆者通過反復測試,琢磨出一套“本地跟單方法”,特制作一個模型分享給大家。
首先了解兩個基本概念:
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("myMT4SignalexpertsfilesTradeInfo.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不適合采用這種方法。
以上兩個程序功能單一,意在提供一個方法,供學習測試使用。 來源:外匯邦
評論前必須登錄!
立即登錄 注冊