错误、漏洞、问题 - 页 12

 

在晚上,我注意到一件非常奇怪的事情,酒吧的开始时间反映了一个错误--这个错误超过了1分钟。现在我想检查它,我做了一个测试指标

#property indicator_chart_window
datetime old_time=0;
int      MaxBars=10;    // ограничение 
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()  {return(0);}
//+------------------------------------------------------------------+
//| 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[])
  {
   if(rates_total<10) return(0);  // ничего не считаем и ничего не рисуем на графике         
   
   int      start_pos,   // точка старта
            count_tick;
   MqlDateTime str1,str2;
   

   if(prev_calculated==0) 
      {
      old_time=0;
      count_tick=0;
      start_pos=rates_total-3;
      }
   else start_pos=prev_calculated-1;
//--- расчет 
   for(int i=start_pos;i<rates_total;i++)
     {
      TimeToStruct(TimeCurrent(),str1); // время сервера
      TimeToStruct(time[i],      str2); // время бара  
      if(str1.min!=str2.min) {
      // Сбой - тик принадлежит не своему бару
         count_tick++;
         Print("тик №=",count_tick," i=", i," c=",close[i]," time[i]=",time[i]," time=",TimeCurrent()," delta=",str1.sec);
      }   
      } // end for(...
   return(rates_total);
  }
纪录

2010.06.18 10:42:03 prov_tick (EURUSD,M1) tick #=6 i=50558 c=1.23797 time[i]=2010.06.18 08:41:00 time=2010.06.18 08:42:05 delta=5

2010.06.18 10:40:59 prov_tick (EURUSD,M1) tick #=5 i=50557 c=1.23848 time[i]=2010.06.18 08:40:00 time=2010.06.18 08:41:01 delta=1

2010.06.18 10:40:01 prov_tick (EURUSD,M1) tick #=4 i=50556 c=1.23862 time[i]=2010.06.18 08:39:00 time=2010.06.18 08:40:04 delta=4

2010.06.18 10:39:03 prov_tick (EURUSD,M1) tick #=3 i=50555 c=1.23881 time[i]=2010.06.18 08:38:00 time=2010.06.18 08:39:05 delta=5

2010.06.18 10:38:30 prov_tick (EURUSD,M1) tick#2 i=50554 c=1.23859 time[i]=2010.06.18 08:37:00 time=2010.06.18 08:38:31 delta=31

2010.06.18 10:38:30 prov_tick (EURUSD,M1) tick#1 i=50553 c=1.23858 time[i]=2010.06.18 08:36:00 time=2010.06.18 08:38:31 delta=31

前两个点是清楚的,这是一个指标性的开始。但接下来的....事实证明,根据服务器时间有一个新的条形图,而这个刻度属于旧条形图。在晚上,这个三角洲是一个噩梦......。

向开发者提出的问题是一个错误吗? 或者说,它是被构想出来的?

Z.I.在写作时,这就是日志中出现的内容

2010.06.18 10:45:09 prov_tick (EURUSD,M1) tick #=9 i=50561 c=1.23787 time[i]=2010.06.18 08:44:00 time=2010.06.18 08:45:12delta=12

附加的文件:
prov_tick.mq5  2 kb
 
Prival:

在晚上,我注意到一件非常奇怪的事情,酒吧的开始时间反映了一个错误--这个错误超过了1分钟。现在我决定检查一下,并创建了一个测试指标


如果你把rate_total的值加到输出中,你会发现当你把当前条形图的分钟数与前一个条形图的分钟数进行比较时,会出现错误。

2010.06.18 11:53:18     prov_tick_src (EURUSD,M1)       тик №=4 i=51420 rates_total=51422 c=1.23997 time[i]=2010.06.18 09:51:00 time=2010.06.18 09:52:06 delta=6
2010.06.18 11:52:12     prov_tick_src (EURUSD,M1)       тик №=3 i=51419 rates_total=51421 c=1.24061 time[i]=2010.06.18 09:50:00 time=2010.06.18 09:51:00 delta=0

也就是说,时间[rate_total-2]。

另外,delta的输出并不完全清楚。

https://www.mql5.com/ru/docs/basis/function/events#oncalculate 说。

参数open[]、high[]、low[]和close[]包含当前时间框架的开盘价、最高价、最低价和收盘价的数组。参数time[]包含一个开放时间值的数组,参数spread[]包含一个包含点差历史的数组(如果为一个交易工具指定了点差)。参数volume[]和tick_volume[]分别包含交易量和tick量的历史。

Документация по MQL5: Основы языка / Функции / Функции обработки событий
Документация по MQL5: Основы языка / Функции / Функции обработки событий
  • www.mql5.com
Основы языка / Функции / Функции обработки событий - Документация по MQL5
 
Prival:

在晚上,我注意到一件非常奇怪的事情,酒吧的开始时间反映了一个错误--这个错误超过了1分钟。我决定现在检查一下,并做了一个测试指标

纪录

2010.06.18 10:42:03 prov_tick (EURUSD,M1) tick #=6 i=50558 c=1.23797 time[i]=2010.06.18 08:41:00 time=2010.06.18 08:42:05 delta=5

2010.06.18 10:40:59 prov_tick (EURUSD,M1) tick #=5 i=50557 c=1.23848 time[i]=2010.06.18 08:40:00 time=2010.06.18 08:41:01 delta=1

2010.06.18 10:40:01 prov_tick (EURUSD,M1) tick #=4 i=50556 c=1.23862 time[i] =2010.06.18 08:39:00 time=2010.06.18 08:40:04 delta=4

2010.06.18 10:39:03 prov_tick (EURUSD,M1) tick #=3 i=50555 c=1.23881 time[i]=2010.06.18 08:38:00 time=2010.06.18 08:39:05 delta=5

2010.06.18 10:38:30 prov_tick (EURUSD,M1) tick #=2 i=50554 c=1.23859 time[i] =2010.06.18 08:37:00 time=2010.06.18 08:38:31 delta=31

2010.06.18 10:38:30 prov_tick (EURUSD,M1) tick #1 i=50553 c=1.23858 time[i]=2010.06.18 08:36:00 time=2010.06.18 08:38:31 delta=31

前两个点是清楚的,这是一个指标性的开始。但接下来的....事实证明,根据服务器时间有一个新的条形图,而这个刻度属于旧条形图。在晚上,这个三角洲是一个噩梦......。

向开发人员提问,这是一个错误还是设计成这样的?

Z.I.在写作时,这就是日志中出现的内容

2010.06.18 10:45:09 prov_tick (EURUSD,M1) tick #=9 i=50561 c=1.23787 time[i]=2010.06.18 08:44:00 time=2010.06.18 08:45:12delta=12

试着做如下测试。无循环。

      TimeToStruct(TimeCurrent(),      str1); // время сервера
      TimeToStruct(time[rates_total-1],str2); // время последнего бара  

更多关于该文本的内容。

 
stringo:

试着按以下方法检查。无循环。

文中的下一步。

哦,知道了,谢谢。我做了一个循环内部的检查。

   if(old_time<time[i]) 
         {
         Print("НОВЫЙ бар");
         old_time=time[i];
         //...
         }  
// а нужно вот так
   if(old_time<time[rates_total-1]) // работаем только по завершенным барам
         {
         Print("НОВЫЙ бар");
         old_time=time[rates_total-1];
         //...
         } 

在新酒吧的时候,我没有改变。不经济,同样的数据被反复计算。虽然...

这种情况https://book.mql4.com/ru/samples/icustom fig.119排除在MQL5中,如果没有的话?这个指标模板会一直输出正确的收盘吗?或者有什么隐患吗?

input int   MaxBars=240;
datetime old_time=0;
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()  {return(0);}
//+------------------------------------------------------------------+
//| 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[])
  {
//---
   if(prev_calculated==0) 
      {
      //... расчитать историю
      //...
      old_time=time[rates_total-1];
      }
// работаем только по завершенным барам
   if(old_time<time[rates_total-1]) 
      {
      old_time=time[rates_total-1];
      Print("НОВЫЙ бар close[1]=", close[rates_total-2]);
      }  
//--- return value of prev_calculated for next call
   return(rates_total);
  }
P.S. 谢谢你的科学
Создание пользовательских индикаторов - Простые программы на MQL4 - Учебник по MQL4
  • book.mql4.com
Создание пользовательских индикаторов - Простые программы на MQL4 - Учебник по MQL4
 
sergey1294:
当我开始运行我的EA时,整个终端在测试器中崩溃,但如果我把它放在一个图表上,一切都很好。

经验证明,大约有110个参数可以被消化(而且还有问题)。在120,如果在测试器中指定了专家顾问,终端就会崩溃。


我已经在私下里给出了一些解决方案,但如果发生了什么事情,你也可以询问开发者。我想他们也许能帮助解决这个限制......

 
Interesting:

经验证明,大约有110个参数可以被消化(而且还有问题)。在120的时候,如果在测试器中指定专家顾问,终端就会崩溃。


我已经在私下里给出了一些解决方案,但如果有什么问题,你可以问开发人员。我想他们也许能够帮助解决这个限制......

当然,奇怪的是,这样的限制会影响到测试者。例如,在夸德,就没有这样的问题
 

现在,周末的报价没有出现。 运行脚本

Print(TimeCurrent())。

结果

2010.06.20 00:26:06 00 (USDJPY,M1) 2010.06.18 22:35:52

虽然最后一栏的时间是2010.06.18 23:00:00

这似乎很奇怪,非常不方便测试一些函数的正确性。

 

指标设置窗口中的 "应用 "按钮丢失。


 
Interesting:

经验证明,大约有110个参数可以被消化(而且还有问题)。在120的时候,如果在测试器中指定专家顾问,终端就会崩溃。

我已经在私下里给出了一些解决方案,但如果有什么问题,你可以问开发人员。我想他们也许能够帮助解决这个限制......

你最多可以对64个参数进行优化。
 
stringo:
最多可以对64个参数进行优化。
优化为64,在测试器中使用约110(不优化)。虽然110,当然,对于专家顾问来说已经是一个 "噩梦 "般的参数数量(但它发生了)...
原因: