期貨量化軟件:赫茲量化中為用戶開發(fā)定義
計劃
通常,當(dāng)我們開始實現(xiàn)一個新系統(tǒng)時,我們并不真正知道我們?nèi)绾螌ζ溥M(jìn)行改進(jìn);故此,我們應(yīng)該始終啟動一個新項目,并著眼于未來進(jìn)行改進(jìn)。 這對那些剛開始的人來說非常重要:持續(xù)地規(guī)劃一些事情,想象未來的擴(kuò)展和改進(jìn)。
核心代碼根本沒有改變,這在某種意義上是意料之中的。 但是對象類的代碼已經(jīng)發(fā)生了巨大的變化。 隨著代碼重用性變得越加重要(這是面向?qū)ο缶幊痰幕舅枷胫唬菏冀K重用,僅在必要時創(chuàng)建新代碼),我們進(jìn)行了這些修改,以實現(xiàn)新功能,并能夠以更靈活的方式創(chuàng)建新的改進(jìn)。 如此,我們來看看新的對象類。 我會高亮示意這些變化,令其更容易理解。
我們從類的私密變量新定義開始。
struct st { ? ? ? ?string ?szObjName, ? ? ? ? ? ? ? ?szSymbol; ? ? ? ?int ? ? width; }m_Info[def_MaxTemplates]; int ? ? ? ? ? ? m_IdSubWin, ? ? ? ? ? ? ? ?m_Counter, ? ? ? ? ? ? ? ?m_CPre, ? ? ? ? ? ? ? ?m_Aggregate; long ? ? ? ? ? ?m_Id, ? ? ? ? ? ? ? ?m_handle; ENUM_TIMEFRAMES m_Period;
請注意,所變量數(shù)量顯著增加。 這是因為我們需要更多數(shù)據(jù)來正確管理新功能。 現(xiàn)在我們的變量系統(tǒng)有了一個結(jié)構(gòu)。 這種結(jié)構(gòu)非常適合將相關(guān)變量組合在一起 — 它們確保我們在處理數(shù)據(jù)時能夠快速、輕松地訪問。
void SetBase(const string szSymbol, int iScale, int iSize) { #define macro_SetInteger(A, B) ObjectSetInteger(m_Id, m_Info[m_Counter].szObjName, A, B) ? ? ? ?if (m_IdSubWin < 0) ? ? ? ?{ ? ? ? ? ? ? ? ?m_Id = ChartID(); ? ? ? ? ? ? ? ?m_IdSubWin = (int)ChartGetInteger(m_Id, CHART_WINDOWS_TOTAL) - 1; ? ? ? ? ? ? ? ?m_Aggregate = 0; ? ? ? ?} ? ? ? ?m_Info[m_Counter].szObjName = __FILE__ + (string) MathRand() + (string) ObjectsTotal(m_Id, -1, OBJ_CHART); ? ? ? ?ObjectCreate(m_Id, m_Info[m_Counter].szObjName, OBJ_CHART, m_IdSubWin, 0, 0); ? ? ? ?ObjectSetString(m_Id, m_Info[m_Counter].szObjName, OBJPROP_SYMBOL, (m_Info[m_Counter].szSymbol = szSymbol)); // .... ? ? ? ?macro_SetInteger(OBJPROP_PERIOD, m_Period); ? ? ? ?m_handle = ObjectGetInteger(m_Id, m_Info[m_Counter].szObjName, OBJPROP_CHART_ID); ? ? ? ?m_Aggregate += iSize; ? ? ? ?m_Info[m_Counter].width = iSize; ? ? ? ?m_CPre += (iSize > 0 ? 1 : 0); ? ? ? ?m_Counter++; #undef macro_SetInteger };
我們很快將看到的主要變化是,我們正在使用一個結(jié)構(gòu)來存儲資產(chǎn)名稱、對象名稱及其寬度。 現(xiàn)在我們還可以指定指標(biāo)在子窗口中的寬度。 我們來做些注釋,方便在類的其它部分使用它們。 下面是變化最大的函數(shù)。