错误、漏洞、问题 - 页 3031

 
Igor Makanu:

我的代码将 "在每一个tick 上敲击",只有你的指标#1,在那里你写了:

它将允许终端独立建立 "更高的时间框架"。

对我来说,这比对指标1进行完全的重新计算要 "便宜",因为在你的代码中,在 "较高的TF "上同步历史时,会发生这种情况。

是的,但为什么故障前的复位是在较低的TF上?

 
Andrey Dik:

是的,但是为什么前次粉笔在低层TF上被重置?

因为返回0。
 
Andrey Dik:

是的,但是为什么前次的粉煤灰会被重置在低TF上?

许多变体,我们不知道如何实施


去年有一个关于MT4的类似讨论,其中一个开发者(我想是Slava)说,每次访问 "旧TF "都会启动数据同步,如果需要....。

我想,在MT5中,如果有必要,终端也会自己建立TF,但如果有网络延迟或.....,就不得而知了。然后,终端在给高级TF上的指标提供数据之前,将历史数据与服务器同步,当它即时发生时,而当它可能需要很长的时间时,这时它可能会被预先计算=0。

 
Igor Makanu:

有很多选择,我们不知道如何实施。

如果下载改变了低位TF的历史数据,低位TF的计数器就会被终端强制归零,所以不要无中生有。

 
Andrey Dik:

你证明了我的观点,同志。

我不是......编码员的同志。这不是一个确认,是一个提示,不要返回0,这就是你所有的问题。你自己正在造成指标的完全重新计算。

 

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

虫子,虫子,问题

Andrey Dik, 2021.05.28 17:26

预先计算不会在下一栏中增加1。


prev_calculated实际上并没有增加;它将始终与计算结束时相同。

return(rates_total);


也就是说,我们在OnCalculated()退出时得到的东西将在prev_calculated的下一个tick中返回(除非prev_calculated == 0,终端在启动指标或同步TF......时这样做)。


Andrei Trukhanovich:

如果下载改变了低位TF的历史数据,低位TF的计数器就会被终端强制清零,不要凭空制造麻烦。

我已经给他写了第二天的信--从Mladen那里拿了指标并研究它们--它们起作用了,而且没有任何复杂的TFs之间的同步,在这里...我们要节省资源,不要让终端形成被调用的TFs。

 
Andrei Trukhanovich:

替换

并测试它。

不要提示......反正他不会相信的。

 
Alexey Viktorov:

我......并不是编码员的朋友。这不是一个确认,而是一个提示,不要返回0,这就是导致你所有问题的原因。你自己正在造成指标的完全重新计算。

你可能是个白痴,无法给出提示,但不是每个人都能帮你理解和解释。

 
Andrei Trukhanovich:

替换

并测试它。

谢谢你,安德烈。你是唯一一个完全深入研究这个问题的人。

2021.05.28 21:22:54.394 LitTF (EURUSD,M2) 第3期的指标尚未计算。

2021.05.28 21:22:54.396 LitTF (EURUSD,M2) 第3期的指标还没有计算。

2021.05.28 21:22:54.397 OldTF (EURUSD,M3) 0.000262 sec, 50046 bars calculated, total 50046 bars

2021.05.28 21:22:55.796 LitTF (EURUSD,M2) 0.007693 sec, 50000 bars calculated, 50000 total bars

2021.05.28 21:24:02.286 LitTF (EURUSD,M2) 第三期的指标尚未计算。

2021.05.28 21:24:02.286 OldTF (EURUSD,M3) 0.000000 sec, 1 bars calculated, 50047 bars total

2021.05.28 21:24:03.017 LitTF (EURUSD,M2) 0.000015 sec, calculated 1 bars, total bars 50001

2021.05.28 21:26:03.898 LitTF (EURUSD,M2) 0.000007 sec, calculated 1 bars, total bars 50002

现在一切都在按计划进行,指标在第一次运行时只计算了一次,以后每一个新条形都只计算一次。


第二个指标的最终代码,我希望它对某人有用。

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[])
{
   ulong t = GetMicrosecondCount ();
   if (rates_total == prev_calculated) return rates_total;

   
   if (SeriesInfoInteger (Symbol (), OldTF, SERIES_SYNCHRONIZED))
   {
      if (iBars (Symbol (), OldTF) != BarsCalculated (Handle))
      {
        Print ("Индикатор на периоде ", OldTF, " ещё не рассчитан");
        return prev_calculated;
      }
   }
   else 
   {
     Print ("Период ", OldTF, " не синхронизирован.");
     return prev_calculated;
   }

   ArraySetAsSeries (high, true);
   ArraySetAsSeries (time, true);

   int limit = rates_total - prev_calculated - 1;

   double buff [];
   int ind = 0;
   for (int i = limit; i >= 0; i--)
   {
      ind = iBarShift (Symbol (), OldTF, time [i], false);
      if (CopyBuffer (Handle, 0, ind, 1, buff) != -1)
      {
        IBuffer [i] = buff [0];
      }
      else
      {
        Print ("Ошибка копирования буфера ", GetLastError ());
        return 0;
      }
   }

   //----------------------------------------------------------------
   double e = (GetMicrosecondCount () - t) / 1000000.0;
   Print (DoubleToString (e, 6), " sec, расcчитано ", rates_total - prev_calculated, " баров, всего баров ", rates_total);
   return(rates_total);
}
 
Andrey Dik:

任何傻瓜都能给你提示,但不是每个人都能帮助你理解和详细地帮助你。

数一数有多少傻瓜在建议你......只有一个聪明人听不进任何人的意见,并固执地...............

你创造了你自己的问题,并试图将你的...代码作为一个mql的bug提出来。