初学者的问题 MQL5 MT5 MetaTrader 5 - 页 987

 

你好,非常尊重所有帮助我了解MT5功能的人。没有你,就很难做到这一点......。昏昏沉沉,吊儿郎当,跑来跑去。因此,请尊重和赞美你。


问题。什么是连接rate_total和history bar limits的 最佳方式?我在代码中的链接正确吗? 谢谢你的答复,提示,提示。

//--- Проверка количества доступных баров
   if(rates_total<24) return 0;
//--- Проверка и расчёт количества просчитываемых баров
   int limit=rates_total-prev_calculated;
   if(limit>1)
     
      limit=rates_total-1;

//Показать историю за CountPeriods недель барах по Н1

int bars=PeriodSeconds(PERIOD_W1)/PeriodSeconds(PERIOD_H1)*CountPeriods;  //  CountPeriods=4; В глобальных переменных

//РЕШИЛ ТАК НО ПО-МОЕМУ ЧУШЬ...

int lm=iBarShift(NULL,PERIOD_H1,iTime(NULL,PERIOD_CURRENT,limit));      //rates_total-1 в днях
int start=lm-(lm-bars);

Comment(start,"    bars    ",bars);  //Равенство значений есть

我刚刚在看新的一小时。一切似乎都在正常工作。

那么一个问题:我对rate_total时刻的编码是否正确?

 

仔细阅读Bars函数的帮助。

"

如果指定了start_time和stop_time参数,该函数返回日期范围内的条数。如果没有指定这些参数,该函数将返回总条数。

"

帮助中没有说是否应该包括开始日期或停止日期,因此你不知道应该从这个函数中期待什么。

令人惊讶的是这个功能是如何运作的。

   datetime         StartDt=StringToTime("2018.01.04 10:00");
   datetime         StopDt=StringToTime("2018.01.03 23:49");
//datetime         StopDt=StringToTime("2018.01.04 10:00");
//datetime         StopDt=StringToTime("2018.01.04 10:01");
   int              BarsGo=Bars(Symbol(),PERIOD_CURRENT,StartDt,StopDt);
   Print("BarsGo=",BarsGo);

在任何一个选项中,包括被评论的选项,StopDt的值都是2!

特别令人惊讶的是,当开始日期(2018.01.04 10:00)在时间上晚于第二个表达式中的结束日期(2018.01.03 23:49)时的选项--为什么没有错误或至少没有产生1?

如果开始日期和结束日期是相同的,那么再给出一个1而不是2是有意义的

我在FORTS上检查Si仪器,一分钟的图表。

 

请帮助,一块指标

//+------------------------------------------------------------------+
//|  OnCalculate 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[])
  {

   ArraySetAsSeries(time,true);

   datetime Fp=0,Ep=0,pFp=0,pEp=0,Arr[];
   int Count=0,bars=0,dt=0;

   int limit;
   if(prev_calculated==0 || prev_calculated<0 || prev_calculated>rates_total)
      limit=Nbar;
   else
      limit=rates_total-prev_calculated;

   for(int i=limit;i>=0;i--)
     {

      if(CopyTime(NULL,TimeFrame,time[i],1,Arr)>0)Ep=Arr[0]-1*PeriodSeconds(PERIOD_CURRENT);
      else return(0);

有时时间[i]数组会溢出,例如在晚上市场关闭 时。

2019.01.25 00:06:35.191 i-Regr4_05i (Si Splice,H1)      array out of range in 'i-Regr4_05i.mq5' (134,38)

如何解决这个问题?

 

在这样的声明之后,有一条线索。

double Price[]; 

数组的大小 总是0吗?

 
pivomoe:

在这样的声明之后,有一条线索。

数组的大小总是0吗?

是的。

 
Artyom Trishkin ,作为一个专业和负责任的版主,我非常希望听到你的意见,特别是参考手册,证明Bars功能的行为是合理的,而不是猜测!
 
Aleksey Vyazmikin:

请帮助,一块指标

有时时间[i]数组会溢出,例如在晚上市场关闭 时。

如何解决这个问题?

例如,为了正确 计算Nbar参数

   if(prev_calculated==0 || prev_calculated<0 || prev_calculated>rates_total)
      limit=Nbar;
 
Aleksey Vyazmikin:

仔细阅读Bars函数的帮助。

"

如果指定了start_time和stop_time参数,该函数返回日期范围内的条数。如果没有指定这些参数,该函数将返回总条数。

"

帮助中没有说是否应该包括开始日期或停止日期,因此你不知道应该从这个函数中期待什么。

令人惊讶的是这个功能是如何运作的。

在任何一个选项中,包括被评论的选项,StopDt的值都是2!

特别令人惊讶的是,当开始日期(2018.01.04 10:00)在时间上晚于第二个表达式中的结束日期(2018.01.03 23:49)时的选项--为什么没有错误或至少没有产生1?

如果开始日期和结束日期是相同的,那么再给出一个1而不是2是有意义的

我在FORTS上检查Si仪器,它是一个分钟图。

在讨论不一致的问题之前,我们应该表明,图表上的条形图比函数返回的条形图要多。

我经常使用这个功能,没有遇到任何问题。我非常惊讶为什么iBarShift和其他类似的功能会被包含在mql5中。

如果程序员突然弄错了,该函数会交换 "从 "和 "到 "的时间,这一事实被纳入 "傻瓜 "的概念。

还有一个建议:为了使函数工作得更快,在其中放入一个条形启动时间。额外的几行将确保速度。这对一个测试员来说尤其重要。

 
Vladimir Karputov:

例如,正确计算Nbar参数

我已经为自己做了一个检查,但这个检查是为了绕过这个函数的错误,帮助中完全没有说需要检查,这意味着它应该是内置的。

然后,你说的是指标检查,而我用Bars来计算正确的柱状体开始时间,因为iBarShift有自己的思想,只适合于外汇,在外汇市场上,由于清算和交易时段 不是一整天,历史记录不会经常出现故障。

 
Alexey Viktorov:

在你谈论不一致之前,你应该表明图表上的条形图比函数返回的更多。

我经常使用这个功能,我没有得到任何问题。我非常惊讶他们为什么把iBarShift和类似的功能放在mql5中。

如果程序员突然把时间搞混了,该函数会在一些地方改变 "从 "和 "到 "的时间,这也是 "防骗 "概念的一部分。

我还想建议:为了使该功能工作得更快,把酒吧的启动时间放在里面。额外的几条线可以提供速度。这对一个测试员来说尤其重要。

这不是保护,而是检测代码中的错误的障碍!

此外,如果日期重合,返回2号是完全不符合逻辑的--这里的道理是什么?

FORTS上酒吧的开始时间可能不一致,这导致了计算的错误,例如,一个酒吧不是在14:00开盘,而是在14:05开盘--我也遭遇过这种情况。