量化交易軟件:赫茲股票期貨量化軟件概念上的飛躍
在該規(guī)劃過(guò)程中,還有最后一個(gè)階段。 雖然這一部分對(duì)于現(xiàn)代計(jì)算機(jī)來(lái)說(shuō)并不那么尖銳,但它仍然需要加以考慮:處理時(shí)間的優(yōu)化。 該問(wèn)題與處理器必須執(zhí)行的操作數(shù)量有關(guān),而非與處理信息所需的時(shí)間有關(guān)。 擬議中的浮動(dòng)窗口系統(tǒng)包含四個(gè)對(duì)象,它們應(yīng)該能夠響應(yīng)您的動(dòng)作從而四處移動(dòng)。 相應(yīng)地,在觀察窗口中的任何信息都將會(huì)受到窗口自身修改的影響。 至少圖表交易會(huì)增加對(duì)象的數(shù)目。 雖然沒(méi)有相應(yīng)的計(jì)算成本,但代碼變得令人不快,似乎優(yōu)化得很差勁。 我們可以簡(jiǎn)單地添加一個(gè)控制系統(tǒng),如此來(lái)解決問(wèn)題。 但有一個(gè)更優(yōu)雅的建議。 雖然它看起來(lái)更耗時(shí)、更費(fèi)力,但實(shí)際上減少了所需維護(hù)和操控的對(duì)象數(shù)量。
實(shí)現(xiàn)
首先,我們把浮動(dòng)窗口的創(chuàng)建過(guò)程分為幾個(gè)步驟,以便支持代碼重用。 接下來(lái),我們將在 C_ChartFloating 對(duì)象類(lèi)中創(chuàng)建兩個(gè)新函數(shù):
//+------------------------------------------------------------------+ bool StageLocal01(string sz0, ENUM_TIMEFRAMES TimeFrame = PERIOD_CURRENT, int Scale = -1) { ? ? ? ?m_LimitX = (int)ChartGetInteger(Terminal.Get_ID(), CHART_WIDTH_IN_PIXELS); ? ? ? ?m_LimitY = (int)ChartGetInteger(Terminal.Get_ID(), CHART_HEIGHT_IN_PIXELS); ? ? ? ?if (m_MaxCounter >= def_MaxFloating) return false; ? ? ? ?CreateBarTitle(); ? ? ? ?CreateCaption(sz0); ? ? ? ?CreateBtnMaxMin(); ? ? ? ?CreateRegion(TimeFrame, Scale); m_Win[m_MaxCounter].handle = ObjectGetInteger(Terminal.Get_ID(), m_Win[m_MaxCounter].szRegionChart, OBJPROP_CHART_ID); ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?return true; } //+------------------------------------------------------------------+ void StageLocal02(int x, int y, int w, int h) { ? ? ? ?y = (y < 0 ? m_MaxCounter * def_SizeBarCaption : y); ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?m_Win[m_MaxCounter].PosX ? ? ? ?= -1; ? ? ? ?m_Win[m_MaxCounter].PosY ? ? ? ?= -1; ? ? ? ?m_Win[m_MaxCounter].PosX_Minimized = m_Win[m_MaxCounter].PosX_Maximized = x; ? ? ? ?m_Win[m_MaxCounter].PosY_Minimized = m_Win[m_MaxCounter].PosY_Maximized = y; ? ? ? ?SetDimension(w, h, true, m_MaxCounter); ? ? ? ?SetPosition(x, y, m_MaxCounter); ? ? ? ?ChartRedraw(m_Win[m_MaxCounter].handle); ? ? ? ?m_MaxCounter++; } //+------------------------------------------------------------------+
添加浮動(dòng)窗口的新代碼如下所示:
bool AddIndicator(string sz0, int x = 0, int y = -1, int w = 300, int h = 200, ENUM_TIMEFRAMES TimeFrame = PERIOD_CURRENT, int Scale = -1) { if (!StageLocal01(sz0, TimeFrame, Scale)) return false; ? ? ? ?ChartApplyTemplate(m_Win[m_MaxCounter].handle, sz0 + ".tpl"); ? ? ? ? ?m_Win[m_MaxCounter].szVLine = (string)ObjectsTotal(Terminal.Get_ID(), -1, -1) + (string)MathRand(); ? ? ? ?ObjectCreate(m_Win[m_MaxCounter].handle, m_Win[m_MaxCounter].szVLine, OBJ_VLINE, 0, 0, 0); ? ? ? ?ObjectSetInteger(m_Win[m_MaxCounter].handle, m_Win[m_MaxCounter].szVLine, OBJPROP_COLOR, clrBlack); ? ? ? ?StageLocal02(x, y, w, h); ? ? ? ?return true; }
這不會(huì)影響已組裝完畢的系統(tǒng),但提供了更佳功能。 注意高亮顯示的行:現(xiàn)在我們將創(chuàng)建一個(gè)函數(shù)來(lái)使用我們的 IDE。 開(kāi)頭如下圖所示:
bool Add_RAD_IDE(string sz0, int x, int y, int w, int h) { ? ? ? ?if (!StageLocal01(sz0, PERIOD_CURRENT, -1)) return false; ? ? ? ?StageLocal02(x, y, w, h); ? ? ? ?return true;