欢迎光临散文网 会员登陆 & 注册

股票量化软件:赫兹量化中峰谷指标和 ATR 指标作为类来实施指标

2023-07-26 15:52 作者:大牛啊呢  | 我要投稿

历史数据同步的算法

对于我自己而言,我已经选择并实施了历史副本(本地历史)与客户端中的历史进行同步的三种算法模式:

  • CPCHSM_NotSynch – 对于已经形成的柱,不执行本地历史的同步(风险和责任由您承担)。实际上,此模式可任意用于较小的价格偏差对计算的精确度没有严重影响的指标(MA、ADX 等)。然而,举例而言,此模式对峰谷指标是致命的,其中一个峰值超过另一个峰值很多。

  • CPCHSM_Normal – 每次新的柱出现时,都通过以下说明的算法同步本地历史数据。

  • CPCHSM_Paranoid – 在每次调用以下说明的数据同步函数时同步本地历史数据。

同步机制本身取决于程序员设置的另一个参数 - HSMinute(存储为 HistorySynchSecond)。我们假定 Dealer Center(交易中心)只能纠正最后 HSMinute 分钟的历史。如果在该时间范围内的同步期间没有找到差异,则将历史数据视为是相同的并停止比较。如果找到差异,则检查并纠正整个历史数据。

此外,该算法允许在初始化时从指定的结构 MqlRates 仅检查价格/点差/量。例如,要绘制峰谷指标,我们只需要最高价和最低价。


CCustPrevCalculated 类的实际使用

要对 CCustPrevCalculated 类进行初始化,我们需要调用函数 InitData(),该函数在成功时返回 'true':

CCustPrevCalculated CustPrevCalculated; CustPrevCalculated.InitData(_Symbol, _Period, 150, CPCHSM_Normal, CPCH_high|CPCH_low, 15);

要同步历史数据,我们需要调用函数 PrepareData():

CPCPrepareDataResultCode resData; resData = CustPrevCalculated.PrepareData();

函数 PrepareData() 能够返回的值的类型:

enum CPCPrepareDataResultCode  {   CPCPDRC_NoData,                     // Returned when there is no data for calculation (not prepared by the server)   CPCPDRC_FullInitialization,         // Full initialization of the array has been performed   CPCPDRC_Synch,                      // Synchronization with adding new bars has been performed   CPCPDRC_SynchOnlyLastBar,           // Synchronization of only the last bar has been performed (possible cutting of the history)   CPCPDRC_NoRecountNotRequired        // Recalculation has not been performed, since the data was not changed  };

用于数据存取的 CCustPrevCalculated 类的函数

注:为了加快计算,不包括对数组溢出的检查。为了更加精确,如果索引不正确,则会返回错误的值。

名称

用途

uint GetDataBarsCount()

返回可用柱的数量

uint GetDataBarsCalculated()

返回未改变的柱的数量

uint GetDataStartInd()

返回用于环绕存取的索引(对于自定义指标)

bool GetDataBarsCuttingLeft()

返回从左侧裁切柱的结果

double GetDataOpen(int shift, bool AsSeries)

为偏移柱返回 'Open'(开盘价)

double GetDataHigh(int shift, bool AsSeries)

为偏移柱返回 'High'(最高价)

double GetDataLow(int shift, bool AsSeries)

为偏移柱返回 "Low"(最低价)

double GetDataClose(int shift, bool AsSeries)

为偏移柱返回 'Close'(收盘价)

datetime GetDataTime(int shift, bool AsSeries)

为偏移柱返回 'Time'(时间)

long GetDataTick_volume(int shift, bool AsSeries)

为偏移柱返回 'Tick_volume'(交易量)

long GetDataReal_volume(int shift, bool AsSeries)

为偏移柱返回 'Real_volume'(实际交易量)

int GetDataSpread(int shift, bool AsSeries)

为偏移柱返回 'Spread'(点差)


进一步优化 CCustPrevCalculated 类的例子

  • 通过切换到(根据某种目的所确定)几个数组来拒绝 MqlRates,并(降低内存要求,但是增大在数组复制的调用次数方面的载入)。

  • 将每个存取函数分为两个独立的函数,以便明确的使用某类数组索引(拒绝 «bool AsSeries» 参数)。优点在于仅在逻辑条件 «if (AsSeries)» 中。

依据 CCustPrevCalculated 类的数据创建用于计算自定义峰谷指标的 CCustZigZagPPC

此算法依据自定义指标专业峰谷指标。类的源代码位于 ZigZags.mqh 文件中;此外,库 OutsideBar.mqh 用于处理额外的柱。

为了说明我们的指标的一个柱,让我们创建一个单独的结构:

struct ZZBar  {   double UP, DN;                      // Buffers of the ZigZag indicator   OrderFormationBarHighLow OB;       // Buffer for caching of an external bar  };

也让我们确定类的计算返回的结果:

enum CPCZZResultCode  {   CPCZZRC_NotInitialized,             // Class is no initialized   CPCZZRC_NoData,                     // Faield to receive data (including the external bar)   CPCZZRC_NotChanged,                 // No changes of ZZ rays   CPCZZRC_Changed                     // ZZ rays changed  };

要对 CCustZigZagPPC 类进行初始化,我们需要调用一次 Init() 函数;该函数在成功时返回 'true':

CCustZigZagPPC ZZ1; ZZ1.Init(CustPrevCalculated, _Symbol, _Period, 150, CPCHSM_Normal, CPCH_high|CPCH_low, 15, 0, true, 12, 10);

要计算指标,我们需要依据先前计算出来的 CCustPrevCalculated 类的数据开始更新数据:

CPCPrepareDataResultCode resZZ1; resZZ1 = ZZ1.PrepareData(resData);

然后调用程序 Calculate():

if ( (resZZ1 != CPCPDRC_NoData) && (resZZ1 != CPCPDRC_NoRecountNotRequired) )   ZZ1.Calculate();

在文件 ScriptSample_CustZigZagPPC.mq5 中提供了一起使用一个 CCustPrevCalculated 类和几个 CCustZigZagPPC 类的完整例子。


CCustZigZagPPC 类的数据存取函数

名称

用途

uint GetBarsCount()

返回可用柱的数量

uint GetBarsCalculated()

返回计算出来的柱的数量

double GetUP(uint shift, bool AsSeries)

返回柱的峰谷指标的峰值

double GetDN(uint shift, bool AsSeries)

返回柱的峰谷指标的谷值

OrderFormationBarHighLow GetOB(uint shift, bool AsSeries)

返回柱的 'Outside'(外部)值


图形和程序检查

为了进行图形检查,让我们将原来的指标附加到一个图表,并且在其上附加专门编写的具有相同输入参数的测试指标 Indicator_CustZigZag.mq5(但是您应选择其他颜色以查看两个指标);以下是运行结果:


编辑


红色 - 原来的指标,蓝色 - 我们自己的指标,使用最后 100 根柱计算。

我们可以在 EA 交易中以同样的方式比较它们;这样会有区别吗?在测试 EA 交易 Expert_CustZigZagPPC_test.mq5 中,每一次价格变动都会比较从 iCustom("AlexSTAL_ZigZagProf") 获得的结果以及从 CCustZigZagPPC 类获得的结果。计算信息显示在日志中(在第一根柱上可能没有计算,因此缺乏算法需要的历史数据):

(EURUSD,M1)                1.35797; 1.35644; 1.35844; 1.35761; 1.35901; 1.35760; 1.35959; 1.35791; 1.36038; 1.35806; 1.36042; 1.35976; 1.36116; 1.35971; // it is normal (EURUSD,M1) Tick processed: 1.35797; 1.35644; 1.35844; 1.35761; 1.35901; 1.35760; 1.35959; 1.35791; 1.36038; 1.35806; 1.36042; 1.35976; 1.36116; (EURUSD,M1) Divergence on the bar: 7


股票量化软件:赫兹量化中峰谷指标和 ATR 指标作为类来实施指标的评论 (共 条)

分享到微博请遵守国家法律