文章 "创建多交易品种、多周期指标" - 页 2

 

进行了一次小型压力测试。我关闭了互联网,通过图表上的面板启动了指标。我已经在上面提供了参数。然后我打开互联网,结果如下:

CL      0       22:29:43.402    TestMSTFMovingAverages (EURUSD,M15)     CMSTFIndicators::AddNewMA: MA(10) indicator (handle 10) added to the collection
OS      0       22:29:43.402    TestMSTFMovingAverages (EURUSD,M15)     CMSTFIndicators::AddNewMA: MA(EURUSD,H1:10) indicator (handle 11) added to the collection
DQ      0       22:29:43.439    TestMSTFMovingAverages (EURUSD,M15)     CIndMSTF::Calculate::MA(10): Waiting for data to sync...
QL      0       22:29:43.439    TestMSTFMovingAverages (EURUSD,M15)     CMSTFIndicators::Calculate::MA(10): Error in indicator calculation: Data is not synchronized
IO      0       22:29:43.439    TestMSTFMovingAverages (EURUSD,M15)     CIndMSTF::Calculate::MA(EURUSD,H1:10): Waiting for data to sync...
PQ      0       22:29:43.439    TestMSTFMovingAverages (EURUSD,M15)     CMSTFIndicators::Calculate::MA(EURUSD,H1:10): Error in indicator calculation: Data is not synchronized
LN      0       22:29:43.439    TestMSTFMovingAverages (EURUSD,M15)     CMSTFIndicators::Calculate: Not all indicators have been calculated successfully. It is necessary to recalculate the buffers of all indicators
KE      0       22:29:43.443    TestMSTFMovingAverages (EURUSD,M15)     CIndMSTF::Calculate::MA(10): Waiting for data to sync...
JH      0       22:29:43.443    TestMSTFMovingAverages (EURUSD,M15)     CMSTFIndicators::Calculate::MA(10): Error in indicator calculation: Data is not synchronized
RK      0       22:29:43.443    TestMSTFMovingAverages (EURUSD,M15)     CIndMSTF::Calculate::MA(EURUSD,H1:10): Waiting for data to sync...
OD      0       22:29:43.443    TestMSTFMovingAverages (EURUSD,M15)     CMSTFIndicators::Calculate::MA(EURUSD,H1:10): Error in indicator calculation: Data is not synchronized
CR      0       22:29:43.443    TestMSTFMovingAverages (EURUSD,M15)     CMSTFIndicators::Calculate: Not all indicators have been calculated successfully. It is necessary to recalculate the buffers of all indicators
GE      0       22:30:04.495    TestMSTFMovingAverages (EURUSD,M15)     CIndMSTF::OnTimer::MA(EURUSD,H1:10): Tick emulation. Attempt 1 of 3 ...
II      0       22:30:34.092    TestMSTFMovingAverages (EURUSD,M15)     CIndMSTF::Calculate::MA(10): Waiting for data to sync...
LD      0       22:30:34.092    TestMSTFMovingAverages (EURUSD,M15)     CMSTFIndicators::Calculate::MA(10): Error in indicator calculation: Data is not synchronized
DH      0       22:30:34.092    TestMSTFMovingAverages (EURUSD,M15)     CIndMSTF::Calculate::MA(EURUSD,H1:10): Waiting for data to sync...
NH      0       22:30:34.093    TestMSTFMovingAverages (EURUSD,M15)     CMSTFIndicators::Calculate::MA(EURUSD,H1:10): Error in indicator calculation: Data is not synchronized
RG      0       22:30:34.093    TestMSTFMovingAverages (EURUSD,M15)     CMSTFIndicators::Calculate: Not all indicators have been calculated successfully. It is necessary to recalculate the buffers of all indicators
JM      0       22:30:35.539    TestMSTFMovingAverages (EURUSD,M15)     CIndMSTF::Calculate::MA(10): Waiting for data to sync...
KP      0       22:30:35.539    TestMSTFMovingAverages (EURUSD,M15)     CMSTFIndicators::Calculate::MA(10): Error in indicator calculation: Data is not synchronized
CD      0       22:30:35.539    TestMSTFMovingAverages (EURUSD,M15)     CIndMSTF::Calculate::MA(EURUSD,H1:10): Waiting for data to sync...
FL      0       22:30:35.539    TestMSTFMovingAverages (EURUSD,M15)     CMSTFIndicators::Calculate::MA(EURUSD,H1:10): Error in indicator calculation: Data is not synchronized
RK      0       22:30:35.539    TestMSTFMovingAverages (EURUSD,M15)     CMSTFIndicators::Calculate: Not all indicators have been calculated successfully. It is necessary to recalculate the buffers of all indicators
OM      0       22:30:37.935    TestMSTFMovingAverages (EURUSD,M15)     CIndMSTF::Calculate::MA(EURUSD,H1:10): Waiting for a new tick and when the indicator will be calculated...
PI      0       22:30:37.935    TestMSTFMovingAverages (EURUSD,M15)     CMSTFIndicators::Calculate::MA(EURUSD,H1:10): Error in indicator calculation: Calculation not completed
ND      0       22:30:37.935    TestMSTFMovingAverages (EURUSD,M15)     CMSTFIndicators::Calculate: Not all indicators have been calculated successfully. It is necessary to recalculate the buffers of all indicators
PN      2       22:30:39.604    TestMSTFMovingAverages (EURUSD,M15)     array out of range in 'TestMSTFMovingAverages.mq5' (211,34)


指标崩溃。

 

我还注意到一些奇怪的事情。美元兑瑞郎的 M15 图表。



如果我们看一下美元兑瑞郎的图表,或者更确切地说,看一下 MA(USDCHF,H1)指标的红色曲线,那么在过去的 7 个小时里,向下一个值的过渡发生在 00 分钟 5 次。我用红色竖线突出显示了这一点。只有最后 2 小时一切正常。蓝色竖线。我认为,这是缓冲区填充的明显错误....。

 
Denis Kirichenko #:

进行了一次小型压力测试。我关闭了互联网,通过图表上的面板启动了指标。我已经在上面提供了参数。然后我打开互联网,结果如下:


指标崩溃。

Denis Kirichenko#:

我还注意到一些奇怪的事情。美元兑瑞郎的 M15 图表。



如果我们看一下美元兑瑞郎的图表,或者更确切地说,看一下 MA(USDCHF,H1)指标的红色曲线,那么在过去的 7 个小时里,有 5 次在 00 分钟过渡到下一个值。我用红色竖线突出显示了这一点。只有最后 2 小时一切正常。蓝色竖线。我认为,这是缓冲区填充的明显错误....。

谢谢,我会调查的
 
Denis Kirichenko #:

进行了一次小型压力测试。我关闭了互联网,通过图表上的面板启动了指标。我已经在上面提供了参数。然后我打开互联网,结果如下:


指标崩溃。

在第 211 行光标位置 34 处,访问了预定义数组 time[]:

DrawData(mouse_bar_index,time[mouse_bar_index]);

结果发现传递给数组的索引不正确

它不可能大于 rates_total-1,很可能等于-1,因为它在 OnChartEvent 处理程序中通过 iBarShift() 函数接收其值,而iBarShift() 函数 可以返回-1:

void OnChartEvent(const int id,
                  const long &lparam,
                  const double &dparam,
                  const string &sparam)
  {
//--- 使用面板
//-- 调用面板事件处理程序
   panel.OnChartEvent(id,lparam,dparam,sparam);

//--- 如果光标移动或点击图形
   if(id==CHARTEVENT_MOUSE_MOVE || id==CHARTEVENT_CLICK)
     {
      //--- 声明变量,在其中存储时间和价格坐标
      datetime time=0;
      double price=0;
      int wnd=0;
      //--- 如果将光标坐标转换为日期和时间
      if(ChartXYToTimePrice(ChartID(),(int)lparam,(int)dparam,wnd,time,price))
        {
         //--- 将光标所在条形图的索引写入全局变量
         mouse_bar_index=iBarShift(Symbol(),PERIOD_CURRENT,time);
         //--- 在面板上光标下显示条形数据
         DrawData(mouse_bar_index,time);
        }
     }

//--- 如果我们接收到用户事件,就会向日志输出相关信息
   if(id>CHARTEVENT_CUSTOM)
     {
      //--- 这里可以处理点击面板上的关闭按钮的情况
      PrintFormat("%s: Event id=%ld, object id (lparam): %lu, event message (sparam): %s",__FUNCTION__,id,lparam,sparam);
     }
  }


在 DrawData() 中,无效的索引值将通过调用 CopyRates() 来处理,如果索引值为负,CopyRates() 将不会获取任何数据,然后退出 DrawData():

//--- 如果无法获取指定索引的条形图数据 - 退出
   if(CopyRates(Symbol(),PERIOD_CURRENT,index,1,rates)!=1)
      return;

因此,在访问 time[] 数组之前,需要检查传递给数组的条形图索引(在第 211 行):

//--- 显示面板上光标下的柱状图数据(如果光标在图表外,则显示当前柱状图数据)
   if(mouse_bar_index>WRONG_VALUE && mouse_bar_index<rates_total)
      DrawData(mouse_bar_index,time[mouse_bar_index]);


一般来说--理论上是这样。我还没有测试过,因为我正忙于开发主题的延续(多指标彩色缓冲区等)。在下一篇关于这个主题的文章发表后,我会进行检查和测试(如果你没有在我之前测试第 211 页的改动)。

 
Artyom Trishkin #:

第 211 行,在光标位置 34访问预定义数组 time[]:

看来数组的索引传递错误

它不可能大于 rates_total-1,很可能等于-1,因为它在 OnChartEvent 处理程序中通过 iBarShift() 函数接收其值,而iBarShift() 函数 可以返回-1:


在 DrawData() 中,无效的指数值将通过调用 CopyRates() 来处理,如果指数为负值,将无法获得任何数据,然后退出 DrawData():

因此,在访问 time[] 数组之前,需要检查传递给数组的条形图索引(第 211 行):


一般来说--理论上是这样。我还没有测试过,因为我正忙于继续开发这个主题(多指标彩色缓冲区等)。在有关此主题的下一篇文章发表后,我将对其进行检查和测试(如果你没有在我之前对第 211 页的改动进行测试的话)。

Artem,条形图指数可以是当前的,iBarShift() 返回 0。这就是为什么我们在任何变量中都 应该写iBarShift()+1,因为条数和条数不相等。

 
Alexey Viktorov #:

Artem,条形图指数可以是当前的,iBarShift() 返回 0。 但CopyRates() 中的 条形图指数 不能小于 1。因此,我们可能应该在任何变量中 写入iBarShift()+1,因为条数和条数不相等。

在这种情况下:指数就是条数

 
Artyom Trishkin #:

在这种情况下:索引就是条形码

Artem,索引 - 是的,可以是零。但复制元素的数量

int  CopyRates( 
   string           symbol_name,       // 字符名 
   ENUM_TIMEFRAMES  timeframe,         // 期间 
   int              start_pos,         // 我们从哪里开始 
   int              count,             //我们复制了多少 
   MqlRates         rates_array[]      // 复制数据的数组 
   );

不能等于零。

就像项目列表中的项目数和索引一样...

 
Alexey Viktorov #:

Artem,索引--是的,可以是零。但复制元素的数量

不能等于零。

就像项目列表中的项目数和索引一样...

就在这里

if(CopyRates(Symbol(),PERIOD_CURRENT,index,1,rates)!=1)

索引指向哪里?

 
Artyom Trishkin #:

就在这里

索引指向何处?

够了,我不说了。我没有看 DrawData(mouse_bar_index,time)函数的代码,所以才弄错了...

 

关于交易、自动交易系统和交易策略测试的论坛

讨论文章 "编制多符号多周期指标"

Artyom Trishkin, 2023.11.01 04:46 AM

......在发表关于这个主题的下一篇文章后,我将进行检查和测试(如果您没有在 第 211 页的改动中对 进行测试的话)。


测试 某些东西,您必须了解正在发生的事情 ))

我意识到,我更容易勾勒出自己的版本,因为我并不接近当前的方法。特别是,在我看来,CIndMSTF 类是某种超类。然后在它的基础上创建一系列指标。令人毛骨悚然的是,IndMSTF.mqh 文件有 4000 行代码))我采用的方法是使用CIndicators 类的实例作为指标集合。这非常方便。你不需要发明一辆自行车。

那为什么 CIndMSTF 类要在缓冲区(SBuffer m_buffers[])中存储数据呢?我们在 OnCalculate() 中计算一次就够了。也就是说,通过引用接受参数,计算并给出....。

一旦我完成了我的版本....,我稍后会写更多我不同意的地方。

是的,我喜欢这种机制:

...При работе с данными не текущего графика для исключения "освобождения" таймсерии, необходимо не реже. чем раз в две минуты обращаться к этой таймсерии. В этом случае будет происходить "удержание" таймсерии, что ускорит к ней обращение (не нужно будет каждый раз дожидаться синхронизации данных)...


Artem,还有一件事。如果文章是作为手册来写的,而人们又有学习的欲望,那么,在我看来,就没有足够的关于这些类的关系的方案,而开发者创造了....。

那么,为什么要把所有指标的代码都放在文章材料中呢?我指的是这一部分--"多符号多周期指标基类的所有继承类的完整列表"看了一下有多少行代码。

这是开头:

这里是结尾:


将近两千行!