错误、漏洞、问题 - 页 1124

 
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
{
  struct ARGB
  {
    uchar blue;
    uchar green;
    uchar red;
    uchar alpha;
  };
  
  struct N
  {
    uint num;
  };
  
  N n={100288};
  ARGB c;
  c=n;         //так получаем предупреждение implicit struct cast       sample.mq5      22      4
  c=(ARGB)n;   //а так всё в порядке
}
尽管这两个结构的大小相同,并且相互复制没有损失,但我们仍然得到了一个警告。
 
Fleder:
尽管这两个结构的大小相同,并且相互复制没有损失,但我们仍然得到了一个警告。
嗯,这很好。要做一个明确的演员并不难。但是,当错误发生时,试图弄清楚已经分配的内容并不那么令人愉快。
 
TheXpert:
所以这很好。要做一个明显的种姓并不难。当虫子开始爬进来的时候,弄清楚在哪里分配什么并不是很令人愉快。
看来,编译器的座右铭是:"安全比遗憾好!"
 

从应用程序复制到SR。

能够从RAM中自我卸载时间序列回到*.hc缓存中
错误, MetaTrader 5 MQL, 已打开, 开始: 2014.04.12 06:04, #995430

终端版本和位

910 32位

问题描述

亲爱的开发者们,你们好!

在MQL5中,一些系统函数,如CopyRatesCopyTimeCopyOpen 等,旨在接收时间序列数据。

当你调用这些函数中的任何一个时,所要求的时间序列会在 "图表中的最大条数 "参数内加载到RAM。

然而,各种因素的结合,如:。

1.符号上有足够深的历史,或从服务器上完全加载。

2.图表中的最大条数 "参数为 "无限"。

3.要求提供最小的时间范围M1的数据。

消耗了非常多的内存。

由于运行MQL5的程序逻辑(例如,如果它是一个多货币专家顾问或一个指标),问题就更严重了。

可以为交替访问几个符号的低级时间段的数据而规定(例如,单一搜索)。

因此,RAM的消耗增加了许多倍。

Получение данных нужного таймфрейма из промежуточных данных

HCC格式的服务文件发挥着数据源的作用,按HC格式的要求的时间框架建立价格数据。HC格式的数据是时间序列,它为快速访问做了最大的准备。它们只在图表或mql5程序的要求下创建,数量不超过 "图表中的最大条数 "参数,并被保存在扩展名为hc的文件中供进一步使用。

为了节省资源,时间框架上的数据只有在需要时才会被加载并存储在RAM中。 如果长时间没有请求,数据就会从RAM中卸载,并保存到一个文件中。每个时间段的数据都是独立于其他时间段的现成数据准备的。数据准备和可用性的规则对所有的时间框架都是一样的。也就是说,尽管HCC格式的数据存储单位是分钟条,但HCC格式的数据的可用性并不意味着同体积的M1时间框架的HC格式数据的可用性和可及性。

从服务器接收新的数据会自动更新 所有时间段的HC格式的已用价格数据,并重新计算所有指标,这些指标明确使用它们作为计算的输入数据。

在引用的文件中,用黄色强调的过程的时间相当大:大约半小时(我的观察)。

结果,所有要求的时间序列都毫无理由地 "挤 "在 "RAM "中。

如果 "RAM "不是 "橡胶而 "贪婪的 "专家顾问/指标要求越来越多的时间序列,终端没有其他事情可做。

除了将多余的时间序列紧急 "转储 "回文件(缓存)。因此,在这种紧急复位中,终端可能会将时间序列重置为

一个 "破损的缓存",即它会丢失 "一大半 "的数据。而在下一次访问这个时间序列时,终端会将这个 "破损的缓存 "作为一个正常的缓存加载。

结果,终端图表显示的所需时间序列在历史上有一个巨大的漏洞。

预期的结果

MQL5语言倾向于节省执行环境的资源。这方面的一个例子如下。

1.ArrayFree 函数

2.ResourceFree 函数

3.删除 操作员

4.图表中的最大条数 " 参数

有没有可能在MQL5语言功能中增加一个系统功能,强制终端在不再使用的时间序列下进行操作?

如果没有打开这个时间序列的图表,在时间结束时?

例如,一个函数。

bool SeriesFlush(
   string           symbol_name,       // имя символа
   ENUM_TIMEFRAMES  timeframe,         // период
   );

这将允许。

1.不担心RAM溢出。

2.不要担心 "破损的缓存",你只能通过在终端关闭时手动删除*.hc文件来摆脱它。

3.你不必依赖于你的操作系统的位模式和RAM的大小。

4.开发软件产品时,不要使用试图绕过上述缺点的 "拐杖"。

 
Fleder:

从应用程序复制到SR。

从RAM中自行卸载时间序列回到*.hc缓存的可能性
为什么,这是个好主意。
 
你能告诉我如何从一个有正偏差的指标中获取数据吗? 我对-1条的数据感兴趣?
 
dentraf:
你能告诉我如何获得正偏移的指标数据吗? 我对-1条的数据感兴趣?

要做到这一点,你需要知道感兴趣的指标线的偏移设置。这是一个来自iAlligator 技术指标的例子

//--- зададим смещение для каждой линии
   PlotIndexSetInteger(0,PLOT_SHIFT,jaw_shift);

这是一种抵消,而不是对未来的指标计算。

 

从应用程序复制到SD。

指示器中IsStopped系统功能的操作不正确
错误, MetaTrader 5 MQL, 已打开, 开始: 2014.04.12 07:59, #995480

终端版本和位模式

910 32位

问题描述

亲爱的开发者们,你们好!

在设计有大量迭代的循环时,提高代码质量的建议之一是

是使用系统嵌入对MQL5程序的强制停止的验证

IsStopped() 系统函数。

然而,在实践中,这个检查在指标中不起作用(在脚本和专家顾问中起作用)。

下面是显示问题本质的指标短代码。

#property  indicator_plots 0
//=====================================================================
// Custom indicator initialization function
//=====================================================================
int OnInit()
{
  return(INIT_SUCCEEDED);
}
//=====================================================================
// 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[])
{
  long n=0;
  for(int i=0;i<1 e+10 && !IsStopped();i++) {n++;}
  Print("OnCalculate End");
  return(rates_total);
}

如果你试图从图表中删除这个指标,"计算指标 "的过程不会因此而停止。

尽管它应该如此,因为要检查程序停止 标志。

你可以通过在任务管理器中监控terminal.exe进程来轻松发现这一点。在一个四核处理器上

这大约是CPU负载的25%。此外,终端负载不会随着时间的推移而减少,直到

终端关闭。甚至在终端关闭后,终端.exe进程仍然挂在管理器中。而且,感觉就像。

它被操作系统卸载为 "挂起"。


预期的结果

请解决这个问题。

 
barabashkakvn:

要做到这一点,你需要知道感兴趣的指标线的偏移设置。这是一个来自iAlligator 技术指标的例子

这是一种抵消,而不是对未来指标的计算。

我有一个未来的计算,但我用一个偏移量来渲染它,我如何从专家顾问那里计算-1条?

如果有人需要,请使用CopyBuffer(Handle_original,0,-2,10,Data_Ind )

 
dentraf:
确切地说,我在未来有一个计算,但要画出一个偏移量,我如何从专家顾问那里读出-1条?
没有关于-1酒吧的报价。偏移量是:对一个存在的柱子(如2号柱子)进行计算,然后将这个计算值在2号柱子上减去偏移量后绘制出来。也就是说,如果偏移量是5,那么在第2条上计算出的数值就会画在第"-3 "条上。