错误、漏洞、问题 - 页 3028

 
fxsaber:
带有单一字段的联盟是一个奇怪的东西。

这与结构相同--只是错误更明显。文件中甚至写到:"否则, union 行为与结构一样"。

Unionchar\char也很奇怪,也是为了清晰,但它可以被改写。

union X3 { //(3) Error: 'X2' - struct is too large
        char x31[INT_MAX/2+1];
        int  x32[INT_MAX/8+1];
};
所以对任何人来说,这也并不奇怪。
 
Andrey Dik:

再想想吧。

你需要思考,安德烈。蟑螂就在你的代码中。

好吧,我今天这么想......我会努力向正确的方向推动。

一个新的柱子 已经打开......iBars()增加了一个......,但计算的柱子数量没有变化。而且它不会改变,直到它重新计算这个新栏...

下一步是什么?

 
Igor Makanu:

这不应该在指标中正确工作。

如果我没有弄错的话,在帮助中,有一个关于所有TFs的分页数据的脚本明细,应该有一个警告,即不能以这种方式从指标中请求历史数据,因为指标是异步工作的。

建议在你绑定句柄后使用BarsCalculated()一次。


UPD: 历史分页的脚本和解释为什么它在指标中不起作用:https://www.mql5.com/ru/docs/series/timeseries_access

你确定你理解代码的含义吗?

 
Alexey Viktorov:

你需要思考,安德烈。就是在你的代码中,有蟑螂的存在。

好吧,我今天这么想......我会努力向正确的方向推动。

一个新的柱子 打开了......iBars()增加了一个......,但计算的柱子数量没有变化。而且它不会改变,直到它重新计算这个新栏...

下一步是什么?

我的好兄弟,请不要给我写信,你不在圈子里。

或者用代码来证明它。

 
Andrey Dik:

你确定你理解代码的含义吗?

有很大的可能性--肯定和理解

你想让指标在调用另一个指标之前同步 "较高的TF"。

我的指标有效,对吗?- 你可以将BarsCalculated()添加到其中--但正如在交付的指标示例中,例如MACD.mql5


如果我需要记住做什么和怎么做,我通常会搜索Mladen Rakic的指标并查看他的指标,编码风格很特别(更正确的说是格式),但它们是100%的功能。

https://www.mql5.com/ru/users/mladen

 
Andrey Dik:

亲爱的。请不要给我写信,你不在圈子里。

或者用密码来证明它。

那么,对你来说,呼...

开发人员不要回应这样的废话,伊戈尔很快就会感到厌烦......而留下来自言自语......

就请鼓手把你的倾诉移到一个单独的主题里......以避免弄乱适当的主题......

 

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

虫子,虫子,问题

Andrey Dik, 2021.05.28 05:16

我试图检查所要求的时间框架(M5)上的数据同步 和指标的准备情况,如果它没有准备好,我将退出。

因此,该指标只在M1栏开盘时工作一次,而不是在每个tick上工作。


//проверка готовности данных и индикатора на другом TF
if (SeriesInfoInteger (Symbol (), tf, SERIES_SYNCHRONIZED))
{
  if (iBars (Symbol (), tf) != BarsCalculated (handleFr)) return 0;
}
else return 0;

//проверка на наличие нового бара
if (rates_total == prev_calculated) return rates_total;

我希望开发商能听从我的请求。

我不太理解你的代码。在下一次调用OnCalculate时,"return 0; "之后应该发生什么?
 
Alexey Viktorov:

伊戈尔很快也会感到厌烦......

我只是有一个想了解的愿望

在MT5中,有很多关于同步的隐患,现在的问题也是关于这个问题。

我认为,如果该指标在每个条形上使用结构(线,而不是箭头)

这个周期对经济计算来说是足够的。

for(int i = prev_calculated; i < rates_total; i++)
   {
      Buffer[i] = close[i];
   }

如果是第一次调用,那么prev_calculated将=0,在随后的调用中,新条形将被重新计算。


如果两个指标都写得正确,你不需要额外同步任何东西,一切都会正常,唯一剩下的是将CopyBuffer()与被调用指标的所需数值数量进行比较。

 
Igor Makanu:

我只是想搞清楚。

在MT5中,有很多关于同步的隐患,现在的问题也是关于这个问题。

我认为,如果该指标在每个条形上使用一个结构(线,而不是箭头)

这个周期对经济计算来说是足够的。

如果是第一次调用,那么prev_calculated将=0,在随后的调用中,新条形将被重新计算。


如果两个指标都写得正确,你不需要额外同步任何东西,一切都会正常,唯一剩下的是将CopyBuffer()与被调用指标的所需数值数量进行比较。

这就是我的意思。在第一次运行前尝试同步是可以的,但这样............。

 
Igor Makanu:

我只是想搞清楚。

在MT5中,有很多关于同步的隐患,现在的问题也是关于这个问题。

我认为,如果该指标在每个条形上使用一个结构(线,而不是箭头)

这个周期对经济计算来说是足够的。

如果是第一次调用,那么prev_calculated将=0,在随后的调用中,新条形将被重新计算。


如果两个指标都写得正确,你不需要额外同步任何东西,一切都会正常,唯一剩下的是将CopyBuffer()与被调用指标的所需数值数量进行比较。

如果你想理解而不是反对,你应该写一些类似下面的代码。

#property indicator_chart_window
#property indicator_buffers 1
#property indicator_plots   1

#property indicator_label1  "I"
#property indicator_type1   DRAW_LINE
#property indicator_color1  clrRed
#property indicator_style1  STYLE_SOLID
#property indicator_width1  1

double         IBuffer[];

int OnInit()
{
   SetIndexBuffer   (0,IBuffer,INDICATOR_DATA);
   ArraySetAsSeries (IBuffer, true);

   return(INIT_SUCCEEDED);
}

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 == prev_calculated) return rates_total;
   
   ulong t = GetMicrosecondCount ();
   
   ArraySetAsSeries (high,        true);

   int limit = rates_total - prev_calculated - 1;

   for (int i = limit; i >= 0; i--)
   {
      IBuffer [i] = high [i];
   }

   //----------------------------------------------------------------
   double e = (GetMicrosecondCount () - t) / 1000000.0;
   Print (DoubleToString (e, 6), " sec, рассчитано ", rates_total - prev_calculated, " баров, всего баров ", rates_total);
   return(rates_total);
}
#property indicator_chart_window
#property indicator_buffers 1
#property indicator_plots   1

//--- plot I
#property indicator_label1  "I"
#property indicator_type1   DRAW_LINE
#property indicator_color1  clrRed
#property indicator_style1  STYLE_SOLID
#property indicator_width1  1

input ENUM_TIMEFRAMES  OldTF = PERIOD_M5;

double IBuffer[];
int    Handle = 0;

int OnInit()
{
   SetIndexBuffer   (0,IBuffer,INDICATOR_DATA);
   ArraySetAsSeries (IBuffer, true);

   Handle = iCustom (Symbol (), OldTF, "OldTF.ex5");
   if (Handle == INVALID_HANDLE)
   {
      Print ("Не удалось получить хендл индикатора OldTF.ex5");
      return INIT_FAILED;
   }

   return INIT_SUCCEEDED;
}

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 == prev_calculated) return rates_total;

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

   ulong t = GetMicrosecondCount ();

   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);
}

在高级指标的M1和M3上运行时,在日志中得到类似这样的信息。

2021.05.28 19:05:01.408 OldTF (EURUSD,M3) 0.000234 sec, 50000 bars calculated, 50000 bars total

2021.05.28 19:05:03.860 LitTF (EURUSD,M1) 0.007452 sec, 50023 bars calculated, 50023 bars total

2021.05.28 19:06:00.670 OldTF (EURUSD,M3) 0.000001 sec, calculated 1 bars, total bars 50001

2021.05.28 19:06:02.211 LitTF (EURUSD,M1) 0.008180 sec, 50024 bars calculated, 50024 bars total

2021.05.28 19:07:00.780 LitTF (EURUSD,M1) 0.000004 sec, calculated 1 bars, total bars 50025

2021.05.28 19:08:01.246 LitTF (EURUSD,M1) 0.000014 sec, settled 1 bars, total bars 50026

2021.05.28 19:09:00.959 OldTF (EURUSD,M3) 0.00000014 sec, calculated 1 bars, total bars 50002

2021.05.28 19:09:01.775 LitTF (EURUSD,M1) 0.006898 sec, 50027 bars calculated, 50027 total bars

2021.05.28 19:10:00.830 LitTF (EURUSD,M1) 0.000004 sec, calculated 1 bars, total bars 50028

即使用肉眼也能看到,首先,这是建立快速指标的最快方法,其次,预计算被清零了。

在这个例子中,指标被强制在每个新的条形图M3中完全重新计算。

Alexey Viktorov:

好吧,你不一定非要这么做。

开发人员不要回应这样的废话,伊戈尔很快也会感到厌烦......而留下来自言自语......

只是需要请drubashka把你的倾诉移到一个单独的主题中,以便不要把正确的主题弄得乱七八糟......

看看上面的代码,吃掉你的护照,把灰烬洒在你的头上,把你的傲慢推到没有人可以看到的地方。