错误、漏洞、问题 - 页 590

 
Swan:

对于所有的条形图来说,该指标是计算一次的--也就是说,在农业历史上启动时可能会有点慢。

随后,一对数值被重新计算--一切都必须工作:)

不要忘记,程序员是喜欢在编程的业余时间手动跳过时限的人。而每一个新的时间框架都是对指标解剖的又一次去初始化和初始化,所有的计算将重新进行。因此,ArrayInitialize() 将在每次从一个TF跳转到另一个TF时被触发。如果指标很复杂,有几个需要重新初始化的缓冲区,延迟就会累积起来,我甚至不说内存溢出的问题,内存是自动分配的。

我是多么的天真啊!我总是发现自己很自信,认为OnInit() 中的初始化已经足够了,我可以在这个阶段用它来消磨时间,沉下心来完成OnCalculate() 中更紧迫的任务。但不,我没有。顺便说一下,或多或少的成功编写复杂的指标并没有让我清楚地理解为什么ArrayInitialize() 必须完全包含在OnCalculate() 中,在每个tick上检查它,而不是在OnInit() 中进行主要和唯一的初始化。通过我的经验,我只发现了在拒绝这种变体时立即引起问题的情况,但关于这一点我将在后面讨论。现在我想指出,从简单和明显的人类逻辑(而不是代码逻辑)的角度来看,OnCalculate() 中的ArrayInitialize() 看起来是非常应受谴责的,考虑到我从未遇到过以下情况

if(prev_calculated<7) // или < чего-то там...
该程序第一次会被触发不止一次--在初始启动时。也就是说,新的分形出现了,而条件是沉默的。那么它在OnCalculate()中到底在做什么?

我更天真地认为

handle=iFractals(_Symbol,_Period);

据称,我有义务自动继承那些清理的数组 和原Fractals.mq5的经济算法的效果,它也在那里,但形式略有不同。我不得不三思而后行,通过复制指标来创建自己的代码,我使用的是其手柄。我记得我第一次分析指标的代码时,在比较Fractals.mq5和帮助中的iFractals的例子时大吃一惊,发现第二个代码比第一个代码要大(即使缩写了非常多)。我不知道。抛出我所有的帽子,但程序员实际上期望在他们的代码中插入一些东西,在一行中提到整个库、类或其他浩瀚的东西在那里,但在这里...

现在我将揭示我前面提到的问题的本质。我把iFractals指标的代码附在上分形的简化版上。在最初的例子中,缓冲区被填满了整个历史。让我们改变这种情况,只复制一部分历史。让我们注释掉第一个计算的复制值的分配,并设置我们自己的较小值。

values_to_copy=100; // то же, что amount
现在让我们在时间框架上跳一跳,对出现的分形神器感到惊恐。我想不出有什么比从Fractals.mq5中自动复制未继承的代码块清理数组更好的了,以便清理那部分不需要分形的历史。
   if(bars_calculated<7)
   {
      ArrayInitialize(FractalUpBuffer,EMPTY_VALUE);
      Print("the condition is true; ArraySize(FractalUpBuffer)=",ArraySize(FractalUpBuffer));
   }
现在所有的东西(有很多冗余!!)都被完美地清理了,同时Print() 显示了重新初始化的时间和次数,并显示了缓冲区的大小。我们可以看到,这不是100,而是更多。如果我需要擦拭桌子上的灰尘,我会擦拭桌子上的灰尘,而不是清洁整个单位。还是不惜一切代价让我放心,内存和时间超限不算什么,你可以想办法间接解决问题,而忽略公然吞噬我无法控制的资源的行为?


斯旺

一个fx,一些尺寸将不得不被设置...为什么要做一个边界不同的弧形循环,而你可以做一个边界相同的直接循环)

否则,该指标将以拐杖为基础。

说实话,我不想成为一个负担,但我事先明白,同情者会把整个代码挖出来。就像在查派和佩特卡的轶事中,当瓦西里-伊万诺维奇回来时,向他要了一把铲子--结果铲子坏了--马被埋了--查派不在时,村子被白军袭击了。意识到,那些想深入了解别人代码细节的人很可能不会出现,我只能参考指标的输出,(除了刹车和其他缺点)最终会是:https://www.mql5.com/ru/forum/1111/page577#comment_119227。 现在想一想说,认为那里的一切都很简单,并提出看似明显的解决方案,这合理吗?

我在询问任何特定部分的事情之前,先简化和限制代码,这不是没有道理的。这就是为什么我要求你只限于此,而不是把整匹马挖出来,除非有一个业余的...

实际上,第四个--特殊的--缓冲区原则上比前三个要长(长度相等),而且由于SetIndexBuffer() 的存在,它可以延伸到整个历史如果我们将循环边界扩大到第四个缓冲区,同时将前三个数组的大小调整到它,那么至少循环中的元素数量会增加,这将增加读取完全左侧缓冲区元素段的估计时间。这只是问题的冰山一角,这种算法的变体将出现。除此之外,重新初始化其他缓冲区将需要更多的时间,因为它们的大小现在更大了。第四个特殊数组不能明确地用EMPTY_VALUE在其他方面进行填充,因为该指标根据某种算法对其他时间段的分形进行了严重的转置,前三个缓冲区的指数和第四个缓冲区的指数之间没有对应关系...

斯旺

//和EMPTY_VALUE值被分配给数组的0和1元素,mm......和最后三条上)

怎么说呢?为什么不是所有的人?我不明白这个问题。你能解释一下吗?实际上,我指的不是只分配实际的(有效的)数值,而是不可避免的对整个缓冲区进行扫荡。ArrayInitialize(),以及许多其他的数组函数,都是基于一个循环,对终端MQL程序员来说是隐含的。

关于的问题 内存超限 仍然有效,开发者应该考虑在ArrayInitialize() 中引入一个额外的参数,指定缓冲区重新初始化的数量,甚至更好的限制

P.S.: 我想我可以猜到为什么OnInit() 中的ArrayInitialize() 在这里没有效率。缓冲区是动态的,它们会改变大小,在OnInit() 中,它们只初始化一次数值,而且是当前长度的数值,还不知道OnCalculate() 中缓冲区的实际大小。

附加的文件:
cleanup.mq5  2 kb
 
papaklass:

可视化器中的指示灯不工作。

在在线终端中,它工作得很好。

你能提供任何细节吗?该指标是如何出现在视频展示台图表上的?
 
papaklass:

我在专家顾问的代码中插入以下几行

我把这三个指标放在一个干净的图表上,并把模板保存为专家顾问。图片在我之前的帖子中在线。

我在可视化系统中运行专家顾问。

1.显示保存的模板

2.尝试在没有模板的情况下运行可视化(即事先删除相关的tpl文件)。在最新的555版本中,自动添加的自定义指标应能正确显示。

 
papaklass:

一切正常。谢谢你。

删除了模板。在专家的OnInit()规定中。

展示你的模板。该指标也应在模板中正常显示(即有问题,应该解决)。
 
papaklass:

发送*.tpl文件

现在用模板又试了一次--不工作。移除模板--它是有效的。

谢谢你。我们会研究的。
 

x100intraday:

现在想一想,告诉我,是否值得相信那里的一切都很简单,并提出看似明显的解决方案?

所有的天才都是简单的。

我不能做其他事情。关于论坛上的问题,如何切除扁桃体的轶事让我想起了:)

我不知道该怎么做......我不知道该怎么做。

//+------------------------------------------------------------------+
//|                                                     Fractals.mq5 |
//+------------------------------------------------------------------+
//---- indicator settings
#property indicator_chart_window
#property indicator_buffers 2
#property indicator_plots   2
#property indicator_type1   DRAW_ARROW
#property indicator_type2   DRAW_ARROW
#property indicator_color1  clrGray
#property indicator_color2  clrGray
#property indicator_label1  "Fractal Up"
#property indicator_label2  "Fractal Down"
//--- input parameters
input int BarsCount=100;
//---- indicator buffers
double ExtUpperBuffer[];
double ExtLowerBuffer[];
//--- 10 pixels upper from high price
int    ExtArrowShift=-10;
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
void OnInit()
  {
//---- indicator buffers mapping
   SetIndexBuffer(0,ExtUpperBuffer,INDICATOR_DATA);
   SetIndexBuffer(1,ExtLowerBuffer,INDICATOR_DATA);
   IndicatorSetInteger(INDICATOR_DIGITS,_Digits);
//---- sets first bar from what index will be drawn
   PlotIndexSetInteger(0,PLOT_ARROW,217);
   PlotIndexSetInteger(1,PLOT_ARROW,218);
//---- arrow shifts when drawing
   PlotIndexSetInteger(0,PLOT_ARROW_SHIFT,ExtArrowShift);
   PlotIndexSetInteger(1,PLOT_ARROW_SHIFT,-ExtArrowShift);
//---- sets drawing line empty value--
   PlotIndexSetDouble(0,PLOT_EMPTY_VALUE,EMPTY_VALUE);
   PlotIndexSetDouble(1,PLOT_EMPTY_VALUE,EMPTY_VALUE);
//---- initialization done
  }
//+------------------------------------------------------------------+
//|  Fractals                                                        |
//+------------------------------------------------------------------+
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 &TickVolume[],
                const long &Volume[],
                const int &Spread[])
  {
   int i,limit;
//---
   if(rates_total<5) return(0);
//---
   if(prev_calculated<7)
     {
      limit=2;
      if(rates_total-2>BarsCount) limit=rates_total-BarsCount;
      PlotIndexSetInteger(0,PLOT_DRAW_BEGIN,limit);//отрисовываются и расчитываются только значения на последних BarsCount барах
      PlotIndexSetInteger(1,PLOT_DRAW_BEGIN,limit);

      for(i=rates_total-2;i<rates_total;i++)//Последним двум барам присваивается EMPTY_VALUE. Исправил циферку в соответствии с iFractal(там фрактал может быть на 2ом баре)
         {
         ExtUpperBuffer[i]=EMPTY_VALUE;
         ExtLowerBuffer[i]=EMPTY_VALUE;
         }
     }
   else
      {
      limit=prev_calculated-3;//Здесь от prev_calculated правильнее считать..
      
      //---Добавленным с появлением нового бара элементам массивов присваиваем значение EMPTY_VALUE//Возможно всё будет нормально и без этого.
      if(rates_total>prev_calculated)
         {
         for(i=prev_calculated;i<rates_total;i++)
            {
            ExtUpperBuffer[i]=EMPTY_VALUE;
            ExtLowerBuffer[i]=EMPTY_VALUE;
            }
         }
      //---
      }
//---
   for(i=limit;i<rates_total-2 && !IsStopped();i++)//Исправил циферку
     {
      //---- Upper Fractal
      if(High[i]>High[i+1] && High[i]>High[i+2] && High[i]>=High[i-1] && High[i]>=High[i-2])
         ExtUpperBuffer[i]=High[i];
      else ExtUpperBuffer[i]=EMPTY_VALUE;
      //---- Lower Fractal
      if(Low[i]<Low[i+1] && Low[i]<Low[i+2] && Low[i]<=Low[i-1] && Low[i]<=Low[i-2])
         ExtLowerBuffer[i]=Low[i];
      else ExtLowerBuffer[i]=EMPTY_VALUE;
     }
//--- OnCalculate done. Return new prev_calculated.
   return(rates_total);
  }
//+------------------------------------------------------------------+
Fractals
Fractals
  • 投票: 8
  • 2010.01.26
  • MetaQuotes Software Corp.
  • www.mql5.com
Фракталы (Fractals) — это один из пяти индикаторов торговой системы Билла Вильямса, позволяющий обнаруживать дно или вершину.
 
Swan:

所有的天才都是简单的。

我不能做其他事情。关于论坛上的问题,如何切除扁桃体的轶事让我想起了:)

imho正统指标分 形有限的例子。也许会有帮助......

实际上,我是通过一个手柄来写指标的...但我喜欢拒绝ArrayInitialize() 的想法,赞成明确地手动填充EMPTY_VALUE值。谢谢,我会试着在上面做一个新的混乱,我希望以后不用再清理了。虽然会有一些细微的问题和不便,但我提前预见到了......。但不管怎样。
 

下一个代码。

struct Pos
{
   int x;
   int y;
};

class Test
{
public:
   Test(const Pos& other)
      : pos(other)
   {
      Print("other = {", other.x, ", ", other.y, "}");
      Print("pos = {", pos.x, ", ", pos.y, "}");
   }
   
public:
   Pos pos;
};

int OnInit()
{
   Pos pos = {123, 456};
   Test test(pos);
   
   return(0);
}

输出。

2011.12.05 22:01:28 RectLabel (EURUSD,H1) pos = {12, 176314750}。
2011.12.05 22:01:28 RectLabel (EURUSD,H1) other = {123, 456}。

所以,初始化列表没有工作,结构中存在垃圾。这到底是不是一个错误?

 

断开了两个代理与云的连接,它们仍然每30秒连接到云服务器。

MO 0 网络 00:00:17 连接到2.agent.mql5.com(通过代理服务器192.168.0.)
LK 0 网络 00:00:47 连接到2.agent.mql5.com(通过代理服务器192.168.0.)
RG 0 网络 00:01:17 连接到2.agent.mql5.com(通过代理服务器192.168.0.)
NS 0 网络 00:01:48 连接到2.agent.mql5.com(通过代理服务器192.168.0.)
RO 0 网络 00:02:18 连接到2.agent.mql5.com(通过代理服务器192.168.0.)
OK 0 网络 00:02:48 连接到2.agent.mql5.com(通过代理服务器192.168.0.)
MG 0 网络 00:03:18 连接到2.agent.mql5.com(通过代理服务器192.168.0.)
DR 0 网络 00:03:48 连接到2.agent.mql5.com(通过代理服务器192.168.0.)
DN 0 网络 00:04:18 连接到2.agent.mql5.com(通过代理服务器192.168.0.)
EJ 0网络00:04:48连接到2.agent.mql5.com(通过代理服务器192.168.0.)
GF 0 网络 00:05:18 连接到2.agent.mql5.com(通过代理服务器192.168.0.)
RR 0 网络 00:05:48 连接到2.agent.mql5.com(通过代理服务器192.168.0.)
NN 0 网络 00:06:18 连接到2.agent.mql5.com(通过代理服务器192.168.0.)
KJ 0 网络 00:06:48 连接到2.agent.mql5.com(通过代理服务器192.168.0.)
QF 0 网络 00:07:18 连接到2.agent.mql5.com(通过代理服务器192.168.0.)
HQ 0 网络 00:07:48 连接到2.agent.mql5.com(通过代理服务器192.168.0.)
PM 0 网络 00:08:18 连接到2.agent.mql5.com(通过代理服务器192.168.0.)
QI 0 网络 00:08:48 连接到2.agent.mql5.com(通过代理服务器192.168.0.)
KE 0 网络 00:09:18 连接到2.agent.mql5.com(通过代理服务器192.168.0.)
NQ 0 网络 00:09:51 连接到2.agent.mql5.com(通过代理服务器192.168.0.)
OM 0 网络 00:10:18 连接到2.agent.mql5.com(通过代理服务器192.168.0.)
RI 0 网络 00:10:48 连接到2.agent.mql5.com(通过代理服务器192.168.0.)
LE 0 网络 00:11:18 连接到2.agent.mql5.com(通过代理服务器192.168.0.)
EP 0 网络 00:11:48 连接到2.agent.mql5.com(通过代理服务器192.168.0.)
IL 0 网络 00:12:18 连接到2.agent.mql5.com(通过代理服务器192.168.0.)
HH 0网络00:12:48连接到2.agent.mql5.com(通过代理服务器192.168.0.)
FD 0 Network 00:13:18 连接到2.agent.mql5.com(通过一个代理服务器)。

 
Konstantin83:

断开了两个代理与云的连接,它们仍然每30秒连接到云服务器。

我们去服务台吧。

请具体说明你到底是如何断开的?你是否删除(冻结)了这些服务?请附上问题代理商的日志。

你日志中的代理设置 有些奇怪。你在你的代理配置中写了代理设置吗?请将你的代理管理器的common.ini附在申请中。