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

 
Alexey Viktorov #:

有人把你教坏了。_LastError 变量将存储该值,直到下一个错误发生


好吧,看,在主代码的开头,出现了以下错误

错误的日期时间

4010

日期和/或时间值不正确


然后一个对象被代码创建,_LastError被改写为

误差对象未被发现

4202

未找到图形对象


如果_LastError 检查是在代码的末尾,就像我通常做的那样,我会得到4202,然后直接忽略它也就是说,错误4010将保持不被注意。我哪里错了?

Alexey Viktorov#:


这是市场的要求,即没有从经纪人的server/dc收到执行错误。

谢谢,我不知道,我以为所有的错误都是被禁止的。

 
leon_17 #:

好吧,看,在主代码的开头,比如说,出现了以下错误。

错误的日期时间

4010

日期和/或时间值不正确


然后一个对象被代码创建,_LastError被改写为

误差对象未被发现

4202

未找到图形对象


如果_LastError 检查是在代码的末尾,就像我通常做的那样,我会得到4202,然后直接忽略它也就是说,错误4010将保持不 被注意。我哪里做错了?

谢谢,不知道,以为所有的错误都是禁止的。

正是如此。你没有错...

 

你好,谁能给我一个提示。

我把每个条形图的时间值具体写进一个数组。图表上有3000条的限制。

该任务。

- 要在每个新的条形图上移动数值阵列。

void CNewBar::PriceHL2()
  {
   int start= 0;
   ArrayResize(this.m_tim_pr_hl2,this.m_rt);
  
   if(this.m_pc!=0)
     {
      start= this.m_pc;
      ArrayCopy(this.m_tim_pr_hl2, this.m_tim_pr_hl2, 0, this.m_rt-this.m_pc);
     }  
   for(int b= start; b < this.m_rt; b++)
     {
      this.m_tim_pr_hl2[b]= iTime(this.m_symbol, this.m_timeframe, this.m_rt-b);
     }
  }

我无法调整它,使其正常工作。

如果(this.m_rt-this.m_pc)=1,我是否正确地在一个新条形上移位阵列?

ArrayCopy(this.m_tim_pr_hl2, this.m_tim_pr_hl2, 0, this.m_rt-this.m_pc); // this.m_rt-this.m_pc=1
 
Mikhail Toptunov #:

你好,谁能给我一个提示。

我把每个条形图的时间值具体写进一个数组。图表上有3000条的限制。

该任务。

- 要在每个新的条形图上移动数值阵列。

我无法调整它,使其正常工作。

如果(this.m_rt-this.m_pc)=1,我在新条形上移动数组的做法是否正确?

也就是说,数组的大小必须正好是3000,在形成一个新的条形图时,应该先覆盖零指数.........,最后再写入新的值?

如果我理解正确的话,这个循环的意义是什么?只需将数组本身从第一个索引开始复制到空索引中,然后将新值写入最后一个索引中。

 
Alexey Viktorov #:

如果没有找到对象,这就是对象搜索错误...

误差对象未被发现

4202

未找到图形对象


没有必要提醒它...

做了几个测试...以下是我的想法。在MQL5中,创建对象时没有必要使用ObjectFind()。
即使在OnTick里面,这样的代码也不会引起任何_LastError错误。

我不知道在MQL5系统代码的深处是如何实现的,也许那里已经上传了一些检查,只有在对象还不存在时才会创建。但事实证明,至少在MQL5内部创建一个对象时,不需要ObjectFind()而且,它的所有属性在每次勾选时都会不变地更新

对MQL4不能这样说。在现有对象上创建一个对象将导致4200("该对象已经存在")错误。这意味着使用ObjectFind()是 创建它的强制性条件。这给我留下了一个简单的可能性,即在不产生_LastError错误的情况下,从持续更新中关闭其属性。

请确认我的结论。

 
Alexey Viktorov #:

也就是说,数组的大小应该正好是3000,当一个新的条形图形成时,应该先覆盖零指数.........,然后将新的值加到最后?

如果我理解正确的话,为什么我需要一个循环?简单地说,数组本身应该从第一个索引开始复制到空索引中,然后将新值添加到最后一个索引中。

嗯,是的,很清楚,但如果有一个中断,例如,一个延迟,出现了两个小节,我把它们写下来。

非常感谢,我明白了,我将通过CopyTime进行尝试。

 
leon_17 #:

做了几个测试...情况是这样的。在MQL5中,创建对象时没有必要使用ObjectFind()。
该对象可以不经任何初步检查就被创建(只需使用ObjectCreate)。 即使在OnTick代码内,该代码也不会引起任何_LastError错误。

我不知道在MQL5系统代码的深处是如何实现的,也许那里已经上传了一些检查,只有在对象还不存在时才会创建。但事实证明,至少在MQL5内部创建一个对象时,不需要ObjectFind()而且,它的所有属性在每次勾选时都会不变地更新

对MQL4不能这样说。在现有对象上创建一个对象将导致4200("该对象已经存在")错误。这意味着使用ObjectFind()是 创建它的强制性条件。这给我留下了一个简单的可能性,即从不断的更新中关闭其属性而不产生_LastError错误。

请确认我的结论。

这根本不是错误的问题。重点是,当一个对象被创建时,某些属性被分配给它,为什么要浪费机器时间和资源来重新定义属性而不进行修改。检查对象是否存在,然后只给那些需要改变的对象分配新的属性,这要便宜得多。例如,一个文本标签或Lable,往往只有这些对象中的文本应该被改变。所有其他房产都保持原样...
 
Mikhail Toptunov #:

嗯,是的,它似乎很清楚,但如果有一个中断,例如延迟,出现了两个小节,我就把它们写下来。

谢谢你,我明白了,我会通过CopyTime试试。

好吧,如果你通过CopyTime来做,根本就没有问题。只要从当前的3000条中复制,就可以了。

 

在下挂单 或从市场开仓时,我如何在程序代码中设置常规跟踪止损的水平?

这一点如何手动完成是很清楚的。非标准尾随止损的程序并不有趣。

预先感谢你。

 
   for (int symbols; symbols < SymbolsTotal(true); symbols++) 
      {
        Print(SymbolName(symbols ,true));
      }

这样的设计为什么不可行?错在哪里...(该日志为空)


还有日元,也是空的。

enum c_mode
  {
   Auto,
   Manual,    
  };

input c_mode MODE         = Auto;

if (MODE==Auto) 
      {
      Print("MODE=Auto");
      }