错误、漏洞、问题 - 页 1679

 
fxsaber:
如果在后代中也能做到不公开,那就更好了。为了更好地理解。简而言之,这不是问题所在。
它应该在后裔中调用。)
 
Sergei Vladimirov:
它必须在后代中被召唤出来。)
整个问题的关键正是在于你不必这样做。请看我的例子。
 
fxsaber:
整个问题的关键正是在于你不必这样做。请看我的例子。
你的例子只是不同,但重点是一样的--后裔重写了基类的一个虚拟方法。好吧,大家都很清楚。
 

指示器缓冲区 中的错误

#property indicator_chart_window
#property indicator_buffers 1
#property indicator_plots   1

class BUFFER
{
public:
  double Buffer[];
  
  BUFFER()
  {
    ::SetIndexBuffer(0, this.Buffer);
  }
};

BUFFER* Buf;

void OnInit()
{
  Buf = new BUFFER;
}

void OnDeinit( const int Reason )
{
  delete(Buf);
}

void Restart()
{
  OnDeinit(REASON_PARAMETERS);
  OnInit();
}

#define  PRINT(A) Print(#A + " = " + (string)A);

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[] )
{
  static bool Flag = false;
  
  if (Flag)
    Restart();
  
  Flag = true;
  
  PRINT(ArraySize(Buf.Buffer));
  
  Buf.Buffer[0] = 0; // array out of range
  
  return(rates_total);
}

结果记录在案

2016.09.12 17:21:54.851 Test (RTS-9.16,H1)      array out of range in 'Test.mq5' (56,13)
2016.09.12 17:21:54.851 Test (RTS-9.16,H1)      ArraySize(Buf.Buffer) = 0
2016.09.12 17:21:54.828 Test (RTS-9.16,H1)      ArraySize(Buf.Buffer) = 2067

调试器顽固地说Buf.Buffer始终是动态数组[0],I.即是一个指标性的缓冲区。但事实证明,其规模为零。

结果发现,调试器写到日志中的内容比发布版要多。发布会上没有报告这样的事情

2016.09.12 17:25:08.706 Test (RTS-9.16,M1)      Indicator buffer #0  detached
在MT5中是否可以只设置一次指标缓冲区?
 

如果这不是一个秘密,为什么这么复杂?当然,除了研究的兴趣之外。

而不是这样(顺便说一下,这在原则上是错误的,因为在运行过程中可能需要重新初始化,而不仅仅是在启动时)。

  static bool Flag = false;
  
  if (Flag)
    Restart();
  
  Flag = true;

就像这样。

if(prev_calculated == 0)
   ArrayInitialize(Buf.Buffer, 0.0);
 
Sergei Vladimirov:

如果这不是一个秘密,为什么这么复杂?当然,除了研究的兴趣之外。

我有这样的情况:一个固定为指标缓冲区的动态数组被删除。然后你必须再次创建一个动态数组,并将其指定为一个指标缓冲区。调试器显示它已被分配。但只有其大小为零。这是一个错误。

事实证明,这个问题是老问题了。

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

如何隐藏 "指标缓冲区#x已分离 "信息

Konstantin Ivanov, 2015.02.17 21:18

在我的指标中,我将数组-缓冲区存储在对象的实例中。
当在OnDeinit()中删除一个对象时,对于所有与缓冲区相连的数组都会显示一个信息(SetIndexBuffer())。

"指示器缓冲区#x被分离"

如何从缓冲区中分离出一个数组而不出现这种信息?
或者如何隐藏这个信息?

找到了该分支http://forum.mql4.com/63975,但建议的在全局范围内保存缓冲区的选项对我来说不起作用


在全局范围内保存缓冲区的选项对我也不起作用。有趣的是,它在MT4中也能发挥作用。

 

文章 在MQL5中为初学者编写EA的一步步指南 有代码。


难道没有必要在三位数上进行除法吗?

 
Aleksey Rodionov:

文章 在MQL5中为初学者编写EA的一步步指南 有代码。


难道没有必要在三位数上进行除法吗?

这是欧元兑美元(5位数)和美元兑日元(3位数)留下的一个雏形。没有错误,但最好不要这样做,特别是对于初学者。
 
我需要为所有继承的类定义一个单一的接口。它应该总是有Init方法。但Init就像一个构造函数的复制品,所以输入参数的变体不能提前定义。如何指定这样的接口?
 
MK,为什么不把下面的语法用于导入的函数 呢?
#import ...
 int send(SOCKET s, void &buf[], int len, int flags);
 int send(SOCKET s, void &buf, int len, int flags);
#import

现在我们必须做出丑陋的东西。

#import ...
 int send(SOCKET s, char &buf[], int len, int flags);
 int send(SOCKET s, int &buf, int len, int flags);
 int send(SOCKET s, char &buf, int len, int flags);
 int send(SOCKET s, Cpoint &buf[], int len, int flags);
 ...
#import

我不建议对内部内联函数使用这种方法,但对导入的函数应该是安全的。

原因: