期货量化软件:赫兹量化中为用户开发定义
计划
通常,当我们开始实现一个新系统时,我们并不真正知道我们如何对其进行改进;故此,我们应该始终启动一个新项目,并着眼于未来进行改进。 这对那些刚开始的人来说非常重要:持续地规划一些事情,想象未来的扩展和改进。
核心代码根本没有改变,这在某种意义上是意料之中的。 但是对象类的代码已经发生了巨大的变化。 随着代码重用性变得越加重要(这是面向对象编程的基本思想之一:始终重用,仅在必要时创建新代码),我们进行了这些修改,以实现新功能,并能够以更灵活的方式创建新的改进。 如此,我们来看看新的对象类。 我会高亮示意这些变化,令其更容易理解。
我们从类的私密变量新定义开始。
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;
请注意,所变量数量显著增加。 这是因为我们需要更多数据来正确管理新功能。 现在我们的变量系统有了一个结构。 这种结构非常适合将相关变量组合在一起 — 它们确保我们在处理数据时能够快速、轻松地访问。
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 };
我们很快将看到的主要变化是,我们正在使用一个结构来存储资产名称、对象名称及其宽度。 现在我们还可以指定指标在子窗口中的宽度。 我们来做些注释,方便在类的其它部分使用它们。 下面是变化最大的函数。