全局初始化失败!!!!!!! - 页 5

 
deysmacro:
大多数时候,Comment()并不影响图表。

  if(ObjectFind(Symbol()+"Lot_Size_Label")==0)
   {         
  int x_check=ObjectGet(Symbol()+"Lot_Size_Label",OBJPROP_XDISTANCE);
  int y_check=ObjectGet(Symbol()+"Lot_Size_Label",OBJPROP_YDISTANCE);
  Comment(x_check+ " , "+y_check); 
   }

Comment()来检查 coords数据是什么。

当标签向右移动时,它们应该改变,但它们没有。

也就是说,坐标是它们应该有的样子。

标签向右消失了。

 

坐标是XDISTANCE=225;YDISTANCE=27;CORNER=3。

首先,在图表上加载indi,标签到位。

第二,关闭MT4并重新启动,标签向右移动。

第三,转移Tf后,标签跳回。

这是与角计算相关的锚点有关的问题,一定是B646的一个错误。

 
这与全局初始化失败有什么关系?
 
SDC:
这与全局初始化失败有什么关系?

那个B646的问题很严重!
 
Dadas:


谢谢,我也有同样的问题,对象在deinit时没有被删除。

我在开发一些indi,得到了这些奇怪的结果,然后我看到在对象列表中,它们仍然存在。

我解决了这个问题,可能是用最简单的方法,在start()中使用ObjectDelete()。

是的,把init()改成OnInit(),把deinit()改成OnDeinit(),标签就恢复正常了!谢谢!

然后过了一会儿,就不对了!!。它们仍然在做同样的动作。


不客气,Dadas。不过我不会在启动方法中使用ObjectDelete()。这最好在OnDeInit()中完成。原因是这样的:如果你把代码放在OnStart()或OnCalculate()中,那么每次嘀嗒声响起时都会被执行。这很糟糕,有两个原因。1)它增加了很多操作,占用了你在实时应用程序中不能浪费的时间;2)在大多数情况下这样做是没有意义的--通常只有在图表被取消初始化时才会有意义。只有在价格变化会以某种方式影响你的对象时,你才应该在 "启动 "方法中这样做。作为一个例子,考虑一下这个(这是我打算出售的应用程序的一部分,但分享这个是很酷的 :-) )。

// If no trade is progress, there is no Position Value to display
      if (ObjectFind("PositionValue") > 0)
                ObjectDelete("PositionValue");
                
      if (ObjectFind("PipsProfitLoss") > 0)
                ObjectDelete("PipsProfitLoss");
                
      if (ObjectFind("CurrentStop") > 0)
                ObjectDelete("CurrentStop");
                
      if (ObjectFind("PipsLockedIn") > 0)
                ObjectDelete("PipsLockedIn");
                
      if (ObjectFind("ProfitLockedIn") > 0)
                ObjectDelete("ProfitLockedIn");
                
      if (GlobalVariableCheck(CurrentPairPercentageRisk))
         GlobalVariableDel(CurrentPairPercentageRisk);

这段代码可以捕捉到从关闭的交易中遗留下来的对象,如果它们存在的话。

顺便说一句--不要这样做。

string AcctCurrency = AccountCurrency();
       
      if (AcctCurrency == "")
          return(rates_total);

你误解了这段代码的本意。它的设计是在服务器 "稳定下来 "之前不运行独立的程序。这就是为什么我返回0。这样,在所有需要的信息可用之前,独立代码不会执行。老实说,我还没有使用OnCalculate(),因为我还不需要,但我可以说,你所做的是对灾难的一种邀请。你没有告诉你的程序,"在你有有效的数据之前不要运行这段代码",你只是把东西扔给了风,希望得到最好的结果。说实话,我不知道如果你的代码没有从服务器上获得可靠的信息,它会做什么。经过大量的阅读,他们新的OnCalculate()方法对我来说毫无意义。在我看来,它是在不必要地计算和传递一个负载信息,如果你需要的话,你会自己去做,并且通过不理会你不需要的东西来节省你的计算时间。我不知道他们这样做的目的是什么。

编码愉快!

 
ProfessorMetal:


不客气,Dadas。不过我不会在启动方法中使用ObjectDelete()。这最好在OnDeInit()中完成。原因是这样的:如果你把代码放在OnStart()或OnCalculate()中,那么每次嘀嗒声响起时都会被执行。这很糟糕,有两个原因。1)它增加了很多操作,占用了你在实时应用程序中不能浪费的时间;2)在大多数情况下这样做是没有意义的--通常只有在图表被取消初始化时才会有意义。只有在价格变化会以某种方式影响你的对象时,你才应该在 "启动 "方法中这样做。作为一个例子,考虑一下这个(这是我打算出售的应用程序的一部分,但分享这个是很酷的 :-) )。

这段代码可以捕捉到已关闭的交易中留下的对象,如果它们存在的话。

顺便说一下 - 不要这样做。

你误解了这段代码的本意。它的设计是在服务器 "稳定下来 "之前不运行独立的程序。这就是为什么我返回0。这样,在所有需要的信息可用之前,独立代码不会执行。老实说,我还没有使用OnCalculate(),因为我还不需要,但我可以说,你所做的是对灾难的一种邀请。你没有告诉你的程序,"在你有有效的数据之前不要运行这段代码",你只是把东西扔给了风,希望得到最好的结果。说实话,我不知道如果你的代码没有从服务器上获得可靠的信息,它会做什么。经过大量的阅读,他们新的OnCalculate()方法对我来说毫无意义。在我看来,它是在不必要地计算和传递一个负载信息,如果你需要的话,你会自己去做,并且通过不理会你不需要的东西来节省你的计算时间。我不知道他们这样做的目的是什么。

编码愉快!


再次感谢!

我已经找到了浮动标签的答案。

看起来现在我们必须在代码本身中绑定对象锚点。

https://docs.mql4.com/en/constants/objectconstants/enum_anchorpoint

所以,我必须添加类似以下的东西。

if(Corner==0) Anchor=ANCHOR_LEFT;
if(Corner==1) Anchor=ANCHOR_RIGHT;
if(Corner==2) Anchor=ANCHOR_LEFT;
if(Corner==3) Anchor=ANCHOR_RIGHT; 

然后用另一行来设置对象。

    ObjectSet(objname,OBJPROP_ANCHOR,Anchor);

生活肯定不会变得简单

而这毕竟无济于事!!。

BTW。我告诉你他们想达到什么目的。

他们想阻止尽可能多的人乱用代码。

这必须是尽可能的商业化。

直到最近,几乎任何人都可以用简单的mql4来捣乱。

现在,他们的目标是使一切都商业化!

 
Dadas:

这个B646是个严重的错误!
可能是这样,但全局初始化失败是一个特定的错误,与这次关于对象锚点 的讨论无关。
 
ProfessorMetal:


他们新的OnCalculate()方法对我来说毫无意义。在我看来,它是在不必要地计算和传递一个负载信息,如果你需要的话,你会自己做,并且通过不理会你不需要的东西来节省你的计算时间。我不知道他们这样做的目的是什么。

编码愉快!

OnCalculate提供了计算指标已经处理了多少条的结果。它取代了旧的IndicatorCounted函数。它还实现了与mql5的兼容,因为系列数组是通过引用传递给它的,而不是老的mql4使用全局系列数组的方式。从编码的角度来看,差别很小。

 

再次欢迎你,Dadas。我已经忘记了使用ANCHOR属性,尽管我在我的一些作品中使用了它。

SDC,谢谢你的信息。文档并没有真正阐明其目的。我怀疑它的含义可能在从俄语到英语的翻译中丢失了。现在它更有意义了。我假设它不是用来代替OnStart(),而是用来代替IndicatorCounted()。如果能提供一个例子,展示用OnCalculate()替换IndicatorCounted()的 "前 "和 "后 "的情况,这将是对文档的一个很好的补充。我必须回去根据你的解释回顾一下文档,看看这些部分是如何组合起来的。再次感谢。

教授

 

你用int OnCalculate()来代替int start()。它像start()一样在每个tick 上运行。之前和之后会是这样的。

int start()
  {
   int i=0, limit=0;
   int counted_bars=IndicatorCounted();
//---- check for possible errors
   if(counted_bars < 0) return(-1);
//----
   limit = Bars-counted_bars-1;
   for (i = limit; i >= 0; i--)
   {
//---- indicator calculations
   }
   return(0);
  }

//--------------------------------------------------
//--------------------------------------------------

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[])
  {
   int i=0, limit=0;
//--- check for possible errors
   if(prev_calculated < 0) return(-1);
//---
   limit = rates_total-prev_calculated;
   for(i = limit; i >= 0; i--)
   {
//--- indicator calculations
   }
   return(rates_total);
  }

OnCalculate的正式参数使其更加自成一体,代码员不必依靠调用各种globals,这在OOP圈子里显然是不好的坏代码员,是要被打的。在实践中,使用它们中的任何一个真的没有什么区别。而且OnCalculate和mql5是一样的,所以你可以选择编写兼容的代码。