量化軟件:在赫茲量化中基于 CChartObject 類設(shè)計(jì)和實(shí)施新 GUI 組件
過快速瀏覽,我們可以得出基于其他類編寫新的圖形對(duì)象類時(shí)適用的基本規(guī)則:
更改對(duì)象創(chuàng)建的 Create() 方法
更改返回對(duì)象類型的 Type() 方法
添加屬性訪問修飾符
不是所有的規(guī)則都必須應(yīng)用,可以只添加新的訪問修飾符或在類中添加新的變量和/或?qū)ο蟆?/p>
在我們繼續(xù)前,我來(lái)介紹一下如何在圖形對(duì)象上使用 CChartObject 方法。
使用對(duì)象屬性而非 ObjectSet 和 ObjectGet 方法系列足以聲明 CChartObject 或后代對(duì)象以及調(diào)用更改其所需屬性的方法。為使其更加簡(jiǎn)單,我提供了一個(gè)普通標(biāo)簽的示例。
我們無(wú)需編寫:
void OnStart() ?{ //--- ? string label_name="my_OBJ_LABEL_object"; ? if(ObjectFind(0,label_name)<0) ? ? { ? ? ?Print("對(duì)象 ",label_name," 沒有找到. 錯(cuò)誤代碼 = ",GetLastError()); ? ? ?ObjectCreate(0,label_name,OBJ_LABEL,0,0,0); ? ? ? ? ? ? ? ?ObjectSetInteger(0,label_name,OBJPROP_XDISTANCE,200); ? ? ?ObjectSetInteger(0,label_name,OBJPROP_YDISTANCE,300); ? ? ?ObjectSetInteger(0,label_name,OBJPROP_COLOR,White); ? ? ?ObjectSetString(0,label_name,OBJPROP_TEXT,UP); ? ? ?ObjectSetString(0,label_name,OBJPROP_FONT,"Wingdings"); ? ? ?ObjectSetInteger(0,label_name,OBJPROP_FONTSIZE,10); ? ? ?ObjectSetDouble(0,label_name,OBJPROP_ANGLE,-45); ? ? ?ObjectSetInteger(0,label_name,OBJPROP_SELECTABLE,false); ? ? ?ChartRedraw(0); ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? } ?}
我們可以使用 OOP 范式來(lái)實(shí)施它:
1. 聲明 CChartObjectLabel 對(duì)象:
CChartObjectLabel label;
2. 對(duì)象上的操作:
int OnInit() ?{ //--- ? label.Create(0, label_name, 0, 0); ? label.X_Distance(200); ? label.Y_Distance(300); ? label.Color(White); ? label.Description(UP); ? label.Font("Wingdings"); ? label.FontSize(10); ? label.Angle(-45); ? label.Selectable(false); //--- ? return(0); ?}
如您所見,主要區(qū)別在于我們不再對(duì)字符串 label_ name 進(jìn)行操作:
string label_name="my_OBJ_LABEL_object";
并使用 label_name 作為一個(gè)參數(shù)調(diào)用 ObjectSetInteger()、ObjectGetInteger()、ObjectSetDouble()、ObjectGetDouble() 函數(shù),但我們聲明 CChartObjectLabel 對(duì)象并使用其方法。這不僅更容易記憶、在實(shí)施上更符合邏輯,而且編寫也更為快速。
當(dāng)將點(diǎn) (.) 放置在對(duì)象實(shí)例后時(shí),MQL5 代碼編輯器為我們提供了代碼完成功能。沒有必要反復(fù)遍歷 MQL5 文檔以查看要放置的 OBJPROP 屬性以設(shè)置或獲取指定屬性。
與上文中介紹的 CChartObjectTrend 類相似,獲取或設(shè)置半直線向左或向右足以聲明 CChartObjectTrend 對(duì)象和調(diào)用 RayRight() 或 RayLeft() 方法:
CChartObjectTrend trendline; trendline.RayRight(true);
2. ProgressBar
我們將要實(shí)施的首個(gè)組件是 ProgressBar。進(jìn)度條顯示部分操作的進(jìn)度,范圍從 0 到 x%。
為使其更加可靠,讓我們將最大值限制為任何正整數(shù)值,而不是 100。我們需要一個(gè)根據(jù)進(jìn)度值改變其大小的彩條。我首先想到的是使用兩個(gè)矩形,但我采用了另一種方式:使用兩個(gè) CChartObjectEdit 對(duì)象,其中一個(gè)位于另一個(gè)的內(nèi)部,并具有不同的背景顏色。
如此一來(lái)就簡(jiǎn)化了編碼和可放入進(jìn)度條以顯示其值的文本的添加。如果我們的進(jìn)度條可根據(jù)需要呈水平或垂直就好了。
2.1. ProgressBar 實(shí)施
CChartObjectProgress 類派生自 CChartObjectEdit 類。 我添加了私有內(nèi)部變量以保存值和值的限制:m_value、m_min、m_max。 進(jìn)度條的方向設(shè)置為整數(shù)值并由 m_direction 變量保存。顏色由 m_color 變量保存。Type() 方法返回 OBJ_EDIT 值,因?yàn)闊o(wú)論如何,沒有識(shí)別到符合我們目的的值。讀者可能注意到 CChartObjectEdit m_bar 變量位于類定義的內(nèi)部 - 這是基于 m_value 改變其大小的內(nèi)部條。其他變量 m_name 和 m_chart 在內(nèi)部為 m_bar 變量保存值。 class CChartObjectProgressBar : public CChartObjectEdit ? { private: ? ?int ? ? ? ? ? ? ? m_value; ? ?int ? ? ? ? ? ? ? m_min; ? ?int ? ? ? ? ? ? ? m_max; ? ?int ? ? ? ? ? ? ? m_direction; ? ?color ? ? ? ? ? ? m_color; ? ?CChartObjectEdit ?m_bar; ? ?string ? ? ? ? ? ?m_name; ? ?long ? ? ? ? ? ? ?m_chart_id; ?public: ? ?int ? ? ? ? ? ? ? GetValue(); ? ?int ? ? ? ? ? ? ? GetMin(); ? ?int ? ? ? ? ? ? ? GetMax(); ? ? void ? ? ? ? ? ? ?SetValue(int val); ? ?void ? ? ? ? ? ? ?SetMin(int val); ? ?void ? ? ? ? ? ? ?SetMax(int val); ? ? void ? ? ? ? ? ? ?SetColor(color bgcol,color fgcol); ? ?bool ? ? ? ? ? ? ?Create(long chart_id,string name,int window,int X,int Y, ? ? ? ? ? ? ? ? ? ? ? ? ? ?int sizeX,int sizeY,int direction); ? ? //--- 識(shí)別對(duì)象方法 virtual int ? ? ? Type() const { return(OBJ_EDIT); }