股票量化軟件:赫茲量化中面向?qū)ο蠓ń⒍鄷r(shí)間表及多貨幣面板
我來介紹一下此圖的組成元素:
CTable。此面板的核心類。它負(fù)責(zé)繪制面板并管理其組件。
SpyAgent。 它是一個(gè)負(fù)責(zé)“監(jiān)視”其它交易品種(工具)的指標(biāo)。創(chuàng)建的每一個(gè)代理都會(huì)發(fā)往不同的交易品種。此代理會(huì)在有新訂單號(hào)抵達(dá)交易品種圖表時(shí)對(duì) OnCalculate 事件做出反應(yīng),并發(fā)送 CHARTEVENT_CUSTOM 事件以通知 CTable 對(duì)象其須更新。此方法背后的整體理念基于 “赫茲量化 中多貨幣模式的實(shí)現(xiàn)"一文。您可以在此文中找到所有技術(shù)詳情。
CRow。用于創(chuàng)建此面板的所有指標(biāo)及條件的基類。通過擴(kuò)展此類,即可能創(chuàng)建出此面板所有必需的組件。
CPriceRow。CRow 的一個(gè)簡(jiǎn)單擴(kuò)展類,用于顯示當(dāng)前買價(jià)。
CPriceChangeRow。CRow 擴(kuò)展類,用于顯示當(dāng)前柱的價(jià)格變化。它可以顯示價(jià)格變化、百分比變化或箭頭。
CRSIRow。CRow 擴(kuò)展類,用于顯示當(dāng)前的 RSI 指標(biāo) 值。
CPriceMARow。CRow 擴(kuò)展類,顯示某種自定義條件:SMA > 時(shí)價(jià)。
CTable、CRow 類以及 SpyAgent 指標(biāo)都是此面板的核心組成部分。而 CPriceRow、CPriceChangeRow、CRSIRow 以及 CPriceMARow 則是此面板的實(shí)際內(nèi)容。CRow 類的設(shè)計(jì)主旨,即在于由眾多的新類擴(kuò)展,從而實(shí)現(xiàn)想要的結(jié)果。所示的 4 個(gè)衍生類只是簡(jiǎn)單的例子,告訴大家能做些什么、怎樣做。
2. SpyAgent
我們從 SpyAgent 指標(biāo)開始。它僅于多貨幣模式下使用,而且如有新訂單號(hào)抵達(dá)其它圖表,必須用它才能妥善更新此面板。對(duì)此概念,我不想過多深入。“赫茲量化 中多貨幣模式的實(shí)現(xiàn)”一文中有所詳述。
SpyAgent 指標(biāo)于指定交易品種的圖表上運(yùn)行,并發(fā)送兩個(gè)事件:初始化事件與新訂單號(hào)事件。兩個(gè)事件均屬 CHARTEVENT_CUSTOM 類型。想要處理上述事件,我們必須使用 OnChartEvent(...) 處理程序(稍后呈現(xiàn))。
我們來看看 SpyAgent 的代碼:
//+------------------------------------------------------------------ //| ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? SpyAgent.mq5 | //| ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? Marcin Konieczny | //| ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?| //+------------------------------------------------------------------ #property copyright "Marcin Konieczny" #property indicator_chart_window #property indicator_plots 0 input long ? chart_id=0; ? ? ? ?// 圖表識(shí)別符 input ushort custom_event_id=0; // 事件識(shí)別符 //+------------------------------------------------------------------ //| 指標(biāo)迭代函數(shù) ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? | //+------------------------------------------------------------------ int OnCalculate(const int rates_total, ? ? ? ? ? ? ? ?const int prev_calculated, ? ? ? ? ? ? ? ?const int begin, ? ? ? ? ? ? ? ?const double &price[]) ?{ ? if(prev_calculated==0) ? ? ?EventChartCustom(chart_id,0,0,0.0,_Symbol); // 發(fā)送初始事件 ? else ? ? ?EventChartCustom(chart_id,(ushort)(custom_event_id+1),0,0.0,_Symbol); // 發(fā)送新即時(shí)價(jià)格事件 ? return(rates_total); ?}
非常簡(jiǎn)單。它只做一件事,那就是接收新數(shù)據(jù)并發(fā)送CHARTEVENT_CUSTOM事件。
3. CTable
CTable 是此面板的核心類。它會(huì)存儲(chǔ)面板設(shè)置的相關(guān)信息并管理其組件。必要時(shí),它會(huì)更新(重繪)面板。
我們看看 CTable 的聲明:
//+------------------------------------------------------------------ //| CTable 類 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? | //+------------------------------------------------------------------ class CTable ?{ private: ? int ? ? ? ? ? ? ? xDistance; ? ?// 圖表右邊框的距離 ? int ? ? ? ? ? ? ? yDistance; ? ?// 圖表頂邊框的距離 ? int ? ? ? ? ? ? ? cellHeight; ? // 表格單元高度 ? int ? ? ? ? ? ? ? cellWidth; ? ?// 表格單元寬度 ? string ? ? ? ? ? ?font; ? ? ? ? // 字體名 ? int ? ? ? ? ? ? ? fontSize; ? color ? ? ? ? ? ? fontColor; ? CList ? ? ? ? ? ?*rowList; ? ? ?// 行對(duì)象列表 ? bool ? ? ? ? ? ? ?tfMode; ? ? ? // 是多時(shí)間幀模式嗎? ? ENUM_TIMEFRAMES ? timeframes[]; // 多時(shí)間幀模式數(shù)組 ? string ? ? ? ? ? ?symbols[]; ? ?// 多貨幣對(duì)模式數(shù)組 ? //--- 私有方法 ? //--- 設(shè)置表格默認(rèn)參數(shù) ? void ? ? ? ? ? ? ?Init(); ? //--- 在指定表格單元內(nèi)畫文本標(biāo)簽 ? void ? ? ? ? ? ? ?DrawLabel(int x,int y,string text,string font,color col); ? //--- 返回給定的時(shí)間幀的文字表述 ? string ? ? ? ? ? ?PeriodToString(ENUM_TIMEFRAMES period); public: ? //--- 多時(shí)間幀模式構(gòu)造函數(shù) ? ? ? ? ? ? ? ? ? ? CTable(ENUM_TIMEFRAMES &tfs[]); ? //--- 多貨幣對(duì)模式構(gòu)造函數(shù) ? ? ? ? ? ? ? ? ? ? CTable(string &symb[]); ? //--- 析構(gòu)函數(shù) ? ? ? ? ? ? ? ? ? ?~CTable(); ? //--- 重畫表格 ? void ? ? ? ? ? ? ?Update(); ? //--- 設(shè)置表格參數(shù)函數(shù) ? void ? ? ? ? ? ? ?SetDistance(int xDist,int yDist); ? void ? ? ? ? ? ? ?SetCellSize(int cellW,int cellH); ? void ? ? ? ? ? ? ?SetFont(string fnt,int size,color clr); ? //--- 附加CRow對(duì)象至表格 ? void ? ? ? ? ? ? ?AddRow(CRow *row); ?};
正如您所見,所有的面板組件(行)均存儲(chǔ)為一個(gè) CRow 指針列表,因此,我們要向面板添加的每個(gè)組件,都必須擴(kuò)展 CRow 類。CRow 可被視為此面板與其組件之間的一個(gè)協(xié)議。CTable 并不包含供其單元格計(jì)算的任何代碼。那是 CRow 擴(kuò)展類的責(zé)任。CTable 只是保留 CRow 組件并于必要時(shí)重繪它們的一種結(jié)構(gòu)。
我們從頭到尾看一看 CTable 的方法。此類擁有兩個(gè)構(gòu)造函數(shù)。第一個(gè)用于多時(shí)間表模式且非常簡(jiǎn)單。我們只需要提供一個(gè)想要顯示的時(shí)間表數(shù)組。
//+------------------------------------------------------------------ //| 多時(shí)間幀模式構(gòu)造函數(shù) ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? | //+------------------------------------------------------------------ CTable::CTable(ENUM_TIMEFRAMES &tfs[]) ?{ //--- 復(fù)制所有時(shí)間幀至數(shù)組 ? ArrayResize(timeframes,ArraySize(tfs),0); ? ArrayCopy(timeframes,tfs); ? tfMode=true; ? //--- 用當(dāng)前圖表交易品種填充數(shù)組 ? ArrayResize(symbols,ArraySize(tfs),0); ? for(int i=0; i<ArraySize(tfs); i++) ? ? ?symbols[i]=Symbol(); //--- 設(shè)置默認(rèn)參數(shù) ? Init(); ?}
第二個(gè)構(gòu)造函數(shù)用于多貨幣模式,并接受交易品種(工具)數(shù)組。此構(gòu)造函數(shù)亦發(fā)送 SpyAgents。它會(huì)將 SpyAgents 一個(gè)一個(gè)地附至適當(dāng)?shù)膱D表。
//+------------------------------------------------------------------ //| 對(duì)貨幣對(duì)模式構(gòu)造函數(shù) ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?| //+------------------------------------------------------------------ CTable::CTable(string &symb[]) ?{ //--- 復(fù)制所有交易品種至自己的數(shù)組 ? ArrayResize(symbols,ArraySize(symb),0); ? ArrayCopy(symbols,symb); ? tfMode=false; ? //--- 用當(dāng)前時(shí)間幀填充數(shù)組 ? ArrayResize(timeframes,ArraySize(symb),0); ? ArrayInitialize(timeframes,Period()); //--- 設(shè)置默認(rèn)參數(shù) ? Init(); //--- 發(fā)送 SpyAgents 至每個(gè)請(qǐng)求交易品種 ? for(int x=0; x<ArraySize(symbols); x++) ? ? ?if(symbols[x]!=Symbol()) // 不要發(fā)送 SpyAgent 至自己的圖表 ? ? ? ? if(iCustom(symbols[x],0,"SpyAgent",ChartID(),0)==INVALID_HANDLE) ? ? ? ? ? { ? ? ? ? ? ?Print("設(shè)置 SpyAgent 錯(cuò)誤于 "+symbols[x]); ? ? ? ? ? ?return; ? ? ? ? ? } ?}
Init 方法會(huì)創(chuàng)建行列表(作為一個(gè) CList 對(duì)象 - CList 是一種 CObject 類型的動(dòng)態(tài)列表)并設(shè)置 CTable 內(nèi)部變量(字體、字號(hào)、顏色、單元格尺寸以及與圖表右上角的距離)的默認(rèn)值。