CopyTicksRange()在MQL5中不能正确工作。 - 页 3

 
fxsaber #:

单位。

可能是这样,但它仍然是一个基本功能,如果终端本身使用它,至少是输出数据,它也会破坏终端的可信度。

 

承诺的错误例子在附件中。令人惊讶的是,Err_SymbolInfoTick2()有一段时间工作正常,但后来也开始返回空日期。代码里有解释性的评论。

日志。

2021.09.19 06:01:24.674 ErrorCopyTicks (CustomBR,H1)    ---------Err_CopyTicksRange()------------
2021.09.19 06:01:24.754 ErrorCopyTicks (CustomBR,H1)    CopyTicksRange('@BR',Ticks,COPY_TICKS_ALL, 2021.01.29 23:57:00:000, 2021.01.31 23:59:00:000 );  received 109425 ticks
2021.09.19 06:01:24.754 ErrorCopyTicks (CustomBR,H1)    2021.01.29 00:02:14:782 - first tick, 2021.01.29 23:56:43:863 - last tick
2021.09.19 06:01:24.754 ErrorCopyTicks (CustomBR,H1)    ---------------------
2021.09.19 06:01:24.754 ErrorCopyTicks (CustomBR,H1)    ---------Err_CopyTicks()------------
2021.09.19 06:01:24.767 ErrorCopyTicks (CustomBR,H1)    CopyTicks('@BR',Ticks,COPY_TICKS_ALL, 2021.01.29 23:57:00:000, 100 );  received 100 ticks
2021.09.19 06:01:24.767 ErrorCopyTicks (CustomBR,H1)    2021.01.29 00:02:14:782 - first tick, 2021.01.29 10:00:12:292 - last tick
2021.09.19 06:01:24.767 ErrorCopyTicks (CustomBR,H1)    ---------------------
2021.09.19 06:01:24.767 ErrorCopyTicks (CustomBR,H1)    ---------Err_CopyTicks()------------
2021.09.19 06:01:24.906 ErrorCopyTicks (CustomBR,H1)    CopyTicks('@BR',Ticks,COPY_TICKS_ALL, 2021.01.29 23:57:00:000, 1000000 );  received 1000000 ticks
2021.09.19 06:01:24.906 ErrorCopyTicks (CustomBR,H1)    2021.01.29 00:02:14:782 - first tick, 2021.02.08 14:17:58:484 - last tick
2021.09.19 06:01:24.906 ErrorCopyTicks (CustomBR,H1)    ---------------------
2021.09.19 06:01:24.906 ErrorCopyTicks (CustomBR,H1)    ---------Err_SymbolInfoTick1('CustomBR')------------
2021.09.19 06:01:24.969 ErrorCopyTicks (CustomBR,H1)    CopyTicksRange('CustomBR',Ticks,COPY_TICKS_ALL, 2021.09.17 00:00:00:000, 2021.09.17 20:00:00:000 );  received 189530 ticks
2021.09.19 06:01:24.969 ErrorCopyTicks (CustomBR,H1)    2021.09.17 00:02:12:052 - first tick, 2021.09.17 19:59:59:782 - last tick
2021.09.19 06:01:25.029 ErrorCopyTicks (CustomBR,H1)    CustomTicksReplace('CustomBR',2021.09.17 00:00:00:000, 2021.09.17 20:00:00:000, Ticks, 189530  );  replaced 189530 ticks
2021.09.19 06:01:25.029 ErrorCopyTicks (CustomBR,H1)    ret=1, mt.time_msc=1970.01.01 00:00:00:000
2021.09.19 06:01:25.029 ErrorCopyTicks (CustomBR,H1)    ---------------------
2021.09.19 06:01:25.029 ErrorCopyTicks (CustomBR,H1)    ---------Err_SymbolInfoTick2('CustomBR')------------
2021.09.19 06:01:25.091 ErrorCopyTicks (CustomBR,H1)    CopyTicksRange('CustomBR',Ticks,COPY_TICKS_ALL, 2021.09.17 00:00:00:000, 2021.09.17 20:00:00:000 );  received 189530 ticks
2021.09.19 06:01:25.091 ErrorCopyTicks (CustomBR,H1)    2021.09.17 00:02:12:052 - first tick, 2021.09.17 19:59:59:782 - last tick
2021.09.19 06:01:25.153 ErrorCopyTicks (CustomBR,H1)    CustomTicksAdd('CustomBR',Ticks, 189530  );  added 189530 ticks
2021.09.19 06:01:25.153 ErrorCopyTicks (CustomBR,H1)    ret=1, mt.time_msc=1970.01.01 00:00:00:000
2021.09.19 06:01:25.153 ErrorCopyTicks (CustomBR,H1)    ---------------------


零食的乐趣:如果你用终端工具观察蜱虫,你可以得到比记录的更多的蜱虫。(见图片)。而如果将 "之前 "的日期减少到2021.09.18,那么记录的数量就会减少。

附加的文件:
untitled.jpg  605 kb
 
是的,无论它是静态 还是动态数组 都无关紧要。
 
RusPro #:

承诺的错误例子

遗憾的是,没有机会接触到这些人物,无法进行复制。

 
fxsaber #:

不幸的是,没有机会接触到这些符号来进行复制。

好的,我去试试外汇。

 
RusPro #:

好吧,我试试外汇。

1.MICEX上没有"@BR "符号。

你似乎在使用一个自定义符号。

而且在创建时可能会有错误。

我在原始MICEX符号上经常使用CopyTicks和CopyTicksRange函数--没有注意到任何错误。

2.终端并不存储整个tick历史,第一个函数调用可能返回的ticks不是整个要求的时期。

添加

下面是一个指标的例子,我使用CopyTicksRange函数加载ticks。

//+------------------------------------------------------------------+
//|                                                   Ticks_test.mq5 |
//|                                      Copyright 2021 prostotrader |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2021 prostotrader"
#property link      "https://www.mql5.com"
#property version   "1.00"
#property indicator_separate_window
#property indicator_plots   1
#property indicator_buffers 1

enum IND_STAGE
{
  LOAD_TICKS = 0,
  READ_TICKS = 1,
  FILL_DATA = 2
};
struct T_DATA
{
  datetime bar_time;
  int ticks_cnt;
  MqlTick pr_bar_ticks[];
};
struct MARKET_DATA
{
  int time_cnt;
  int cnt;
  IND_STAGE stage;
  T_DATA t_data[];
  MqlTick ticks[];
  int live_cnt;
  int a_cnt;
  datetime time_array[];
};
MARKET_DATA m_data;
datetime start_time, end_time;
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- indicator buffers mapping
   end_time = datetime(SymbolInfoInteger(Symbol(), SYMBOL_EXPIRATION_TIME));
   m_data.stage = LOAD_TICKS;
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Custom indicator Load ticks function                             |
//+------------------------------------------------------------------+
bool LoadTicks(const datetime &a_times[])
{
  int bars = Bars(Symbol(),PERIOD_M1);
  datetime cur_time = TimeTradeServer();
  if(cur_time > end_time)
  {
    cur_time = end_time;
  }
  int result = CopyTime(Symbol(), PERIOD_M1, 0, bars, m_data.time_array);
  if(result > 0)
  {
    start_time = m_data.time_array[0];
    if(m_data.time_array[result - 1] == a_times[ArraySize(a_times) - 1])
    {
      m_data.time_cnt = result;
      result = CopyTicksRange(Symbol(), m_data.ticks, COPY_TICKS_INFO, ulong(start_time) * 1000, ulong(cur_time) * 1000);
      if(result > 0)
      {
        if(m_data.ticks[result-1].time >= m_data.time_array[m_data.time_cnt - 1]) 
        {
          m_data.cnt = result;
          return(true); 
        } else Print(__FUNCTION__, ": Не хватает тиков ", Symbol(), "!"); 
      } else Print(__FUNCTION__, ": Не получены тики по символу ", Symbol(), "!");
    } else Print(__FUNCTION__, ": Не хватает баров по символу ", Symbol(), "!");
  } else Print(__FUNCTION__, ": Не скопировано время баров по символу ", Symbol(), "!");
  return(false);
}  
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int OnCalculate (const int rates_total,  
                 const int prev_calculated, 
                 const datetime& time[], 
                 const double& open[], 
                 const double& high[], 
                 const double& low[], 
                 const double& close[], 
                 const long& tick_volume[], 
                 const long& volume[],
                 const int& spread[] )
  {
  switch (m_data.stage)
  {
    case LOAD_TICKS:
      if(LoadTicks(time) == true)
      {
        Print("All ticks loaded.");
        m_data.stage = READ_TICKS;
        return(rates_total);
      }
      return(0);
    break;
    case READ_TICKS:
    break;
  }
   
//--- return value of prev_calculated for next call
   return(rates_total);
  }
//+------------------------------------------------------------------+
而且一切都加载正常,但并不总是第一次。
 
prostotrader #:

1.MICEX上没有"@BR "符号

下面是一个指标的例子,我使用CopyTicksRange函数加载ticks。

而且一切都加载正常,但并不总是第一次。

这就是石油期货的胶水。经纪人BCS。在不同的经纪公司,它的叫法可能不同。但完全相同的问题会出现在其他符号上。

 
prostotrader #:

在你的例子中,它是有效的,因为调用条件是不同的--开始时间总是等于现有条形的开始(即已知存在ticks),而且你一次性读取了最后一个条形的所有tick历史。

顺便说一句,我的一根拐杖的作用与你类似。我也是一开始就得到现有条形的时间,然后把它们分成最大的连续段,并得到ticks。但另一个问题出现了--如果没有足够的数据接收阵列,剩下的恢复就是手鼓舞了(关于这一点我在上面谈过)。

而使用动态数组的工作要慢得多,你必须考虑可能的内存碎片。

 
prostotrader #:

2.终端并不存储整个tick历史,对该函数的第一次调用可能不会返回所要求的整个时期的ticks。

如果不是整个周期被返回就没有问题,问题是当另一个周期被返回而不是所要求的那个周期。或者,更糟糕的是,当它返回所要求的一个和一些其他刻度,不包括在范围内时


我在我的例子中用 "SILV-12.21 "替换了这个符号我得到了同样的错误,有趣的是,SymbolInfoTick在最后的测试中返回了正确的答案:)但我如何猜测,它什么时候是错的,什么时候是错的?


2021.09.19 15:27:55.089	ErrorCopyTicks (CustomBR,H1)	---------Err_CopyTicksRange()------------
2021.09.19 15:27:55.090	ErrorCopyTicks (CustomBR,H1)	CopyTicksRange('SILV-12.21',Ticks,COPY_TICKS_ALL, 2021.01.29 23:57:00:000, 2021.01.31 23:59:00:000 );  received 1758 ticks
2021.09.19 15:27:55.090	ErrorCopyTicks (CustomBR,H1)	2021.01.29 00:02:14:782 - first tick, 2021.01.29 23:49:01:540 - last tick
2021.09.19 15:27:55.090	ErrorCopyTicks (CustomBR,H1)	---------------------
2021.09.19 15:27:55.090	ErrorCopyTicks (CustomBR,H1)	---------Err_CopyTicks()------------
2021.09.19 15:27:55.091	ErrorCopyTicks (CustomBR,H1)	CopyTicks('SILV-12.21',Ticks,COPY_TICKS_ALL, 2021.01.29 23:57:00:000, 100 );  received 100 ticks
2021.09.19 15:27:55.091	ErrorCopyTicks (CustomBR,H1)	2021.01.29 00:02:14:782 - first tick, 2021.01.29 11:02:44:891 - last tick
2021.09.19 15:27:55.091	ErrorCopyTicks (CustomBR,H1)	---------------------
2021.09.19 15:27:55.091	ErrorCopyTicks (CustomBR,H1)	---------Err_CopyTicks()------------
2021.09.19 15:27:55.170	ErrorCopyTicks (CustomBR,H1)	CopyTicks('SILV-12.21',Ticks,COPY_TICKS_ALL, 2021.01.29 23:57:00:000, 1000000 );  received 763140 ticks
2021.09.19 15:27:55.170	ErrorCopyTicks (CustomBR,H1)	2021.01.29 00:02:14:782 - first tick, 2021.09.17 23:58:41:031 - last tick
2021.09.19 15:27:55.170	ErrorCopyTicks (CustomBR,H1)	---------------------
2021.09.19 15:27:55.170	ErrorCopyTicks (CustomBR,H1)	---------Err_SymbolInfoTick1('CustomBR')------------
2021.09.19 15:27:55.178	ErrorCopyTicks (CustomBR,H1)	CopyTicksRange('SILV-12.21',Ticks,COPY_TICKS_ALL, 2021.09.17 00:00:00:000, 2021.09.17 20:00:00:000 );  received 42793 ticks
2021.09.19 15:27:55.178	ErrorCopyTicks (CustomBR,H1)	2021.09.17 00:03:04:576 - first tick, 2021.09.17 19:59:32:398 - last tick
2021.09.19 15:27:55.190	ErrorCopyTicks (CustomBR,H1)	CustomTicksReplace('CustomBR',2021.09.17 00:00:00:000, 2021.09.17 20:00:00:000, Ticks, 42793  );  replaced 42793 ticks
2021.09.19 15:27:55.190	ErrorCopyTicks (CustomBR,H1)	ret=1, mt.time_msc=1970.01.01 00:00:00:000
2021.09.19 15:27:55.190	ErrorCopyTicks (CustomBR,H1)	---------------------
2021.09.19 15:27:55.190	ErrorCopyTicks (CustomBR,H1)	---------Err_SymbolInfoTick2('CustomBR')------------
2021.09.19 15:27:55.196	ErrorCopyTicks (CustomBR,H1)	CopyTicksRange('SILV-12.21',Ticks,COPY_TICKS_ALL, 2021.09.17 00:00:00:000, 2021.09.17 20:00:00:000 );  received 42793 ticks
2021.09.19 15:27:55.196	ErrorCopyTicks (CustomBR,H1)	2021.09.17 00:03:04:576 - first tick, 2021.09.17 19:59:32:398 - last tick
2021.09.19 15:27:55.210	ErrorCopyTicks (CustomBR,H1)	CustomTicksAdd('CustomBR',Ticks, 42793  );  added 42793 ticks
2021.09.19 15:27:55.210	ErrorCopyTicks (CustomBR,H1)	ret=1, mt.time_msc=2021.09.17 19:59:32:398
2021.09.19 15:27:55.210	ErrorCopyTicks (CustomBR,H1)	--------------------- 

 
fxsaber #:

К сожалению, нет доступа к этим символам, чтобы воспроизвести.


在外汇方面,同样的错误。Alpari经纪人,测试账户。欧元兑美元符号


在欧元兑美元的基础上制作的自定义符号,只是把名字也留下了


2021.09.19 15:36:52.417 tester (EURUSD,H1)      ---------Err_CopyTicksRange()------------
2021.09.19 15:36:52.432 tester (EURUSD,H1)      CopyTicksRange('EURUSD',Ticks,COPY_TICKS_ALL, 2021.01.29 23:57:00:000, 2021.01.31 23:59:00:000 );  received 102934 ticks
2021.09.19 15:36:52.432 tester (EURUSD,H1)      2021.01.29 00:00:00:139 - first tick, 2021.01.29 23:54:59:930 - last tick
2021.09.19 15:36:52.432 tester (EURUSD,H1)      ---------------------
2021.09.19 15:36:52.432 tester (EURUSD,H1)      ---------Err_CopyTicks()------------
2021.09.19 15:36:52.445 tester (EURUSD,H1)      CopyTicks('EURUSD',Ticks,COPY_TICKS_ALL, 2021.01.29 23:57:00:000, 100 );  received 100 ticks
2021.09.19 15:36:52.445 tester (EURUSD,H1)      2021.01.29 00:00:00:139 - first tick, 2021.01.29 00:12:52:513 - last tick
2021.09.19 15:36:52.445 tester (EURUSD,H1)      ---------------------
2021.09.19 15:36:52.445 tester (EURUSD,H1)      ---------Err_CopyTicks()------------
2021.09.19 15:36:52.577 tester (EURUSD,H1)      CopyTicks('EURUSD',Ticks,COPY_TICKS_ALL, 2021.01.29 23:57:00:000, 1000000 );  received 1000000 ticks
2021.09.19 15:36:52.577 tester (EURUSD,H1)      2021.01.29 00:00:00:139 - first tick, 2021.02.15 18:31:34:723 - last tick
2021.09.19 15:36:52.577 tester (EURUSD,H1)      ---------------------
2021.09.19 15:36:52.577 tester (EURUSD,H1)      ---------Err_SymbolInfoTick1('CustomBR')------------
2021.09.19 15:36:52.579 tester (EURUSD,H1)      CopyTicksRange('EURUSD',Ticks,COPY_TICKS_ALL, 2021.09.17 00:00:00:000, 2021.09.17 20:00:00:000 );  received 78831 ticks
2021.09.19 15:36:52.579 tester (EURUSD,H1)      2021.09.17 00:00:00:349 - first tick, 2021.09.17 19:59:59:088 - last tick
2021.09.19 15:36:52.645 tester (EURUSD,H1)      CustomTicksReplace('CustomBR',2021.09.17 00:00:00:000, 2021.09.17 20:00:00:000, Ticks, 78831  );  replaced 78831 ticks
2021.09.19 15:36:52.645 tester (EURUSD,H1)      ret=1, mt.time_msc=1970.01.01 00:00:00:000
2021.09.19 15:36:52.645 tester (EURUSD,H1)      ---------------------
2021.09.19 15:36:52.645 tester (EURUSD,H1)      ---------Err_SymbolInfoTick2('CustomBR')------------
2021.09.19 15:36:52.658 tester (EURUSD,H1)      CopyTicksRange('EURUSD',Ticks,COPY_TICKS_ALL, 2021.09.17 00:00:00:000, 2021.09.17 20:00:00:000 );  received 78831 ticks
2021.09.19 15:36:52.658 tester (EURUSD,H1)      2021.09.17 00:00:00:349 - first tick, 2021.09.17 19:59:59:088 - last tick
2021.09.19 15:36:52.686 tester (EURUSD,H1)      CustomTicksAdd('CustomBR',Ticks, 78831  );  added 78831 ticks
2021.09.19 15:36:52.686 tester (EURUSD,H1)      ret=1, mt.time_msc=2021.09.17 19:59:59:088