任何菜鸟问题,为了不给论坛添乱。专业人士,不要路过。没有你就无处可去 - 6. - 页 600

 

问候!:)

我有大致相同的指标代码。

bool busy=false;

int start()
{
   int counted_bars=IndicatorCounted();
   if(counted_bars<0) return(-1);
   limit=Bars-counted_bars+1;
   limit=MathMin(bBars-1, limit);
   if(IndicatorCounted()>0) limit=1;
   
   FileWrite(han, TimeToStr(TimeCurrent(), TIME_MINUTES|TIME_SECONDS), Bars, IndicatorCounted());
   FileFlush(han);
   //if(busy=false) return(0);
   for (i=0; i<limit; i++)
   { 
      busy=true;
      FileWrite(han, TimeToStr(TimeCurrent(), TIME_MINUTES|TIME_SECONDS), DoubleToStr(i, 0), DoubleToStr(IndicatorCounted(), 0));
      FileFlush(han);
      Здесь идут сложные вычисления которые занимают минуты 3
   }

   busy=false;
}

我把它放在M1图上。该指示器与终端一起悬挂,据称是在进行计算。
我在15分钟内强行关闭它,并打开其日志。

图1

事实证明,在计算第一次之前,该指标对新到的点位没有反应(这是符合逻辑的)。但它在评估过程中忘了告诉终端,IndicatorConted()必须已经被分配了一个 不同于0的
所以,事实证明,为评估而订购的传入点会记住IndicatorCounted()的当前值?

我试着通过繁忙的变量来控制它(注释出的字符串--同样的结果)。

我也试过这种方式。

int start()
{
   FileWrite(han, TimeToStr(TimeCurrent(), TIME_MINUTES|TIME_SECONDS), Bars, IndicatorCounted());
   FileFlush(han);
   return(0);
   .
   .
   .
}

自然,这一次一切都运作正常。

图2

我们这里有什么?系统没有时间向IndicatorCounted()写入新的数值?换句话说,我需要做类似sleep()的事情?我知道这在指标中是不可能的)
或者,当一个新的tick到来时,因为旧的tick还没有完成计算,它记住了IndicatorCounte()仍然等于0,当它的时间到来时,它从旧值IndicatourCounted()=0开始计算?

该怎么做?)

 
Expert:

问候!:)

我有和指标差不多的代码


它说明了一切。对关于这个代码,关于这个反应...来写
 
peace1984:
这是我的第一次经验,不要太苛刻地评判:)
说实话,在我看来,测试人员记住的是变量的过去值--从上一次测试开始。如何--我不知道,我没有太多的时间来调试。也许这是一个终端错误。我只是在代码中加了一个注释,并将数值 输出到日志中。因此,事实证明,每次我运行一个新的测试时,前一个测试的值都会存储在sys变量中。真是一团糟。也许别人会看到,也许我的眼睛是湿的......。
附加的文件:
11_1.mq4  8 kb
 
AlexeyVik:
这说明了一切。要想了解这个代码,大约需要这个答案...


关键是,代码的其余部分是不相关的。这篇稿件中描述了错误的本质。一般来说,我害怕用一个大帖子把人吓跑。所以我把它胀破了。

简而言之,它可以表述为:如果一个指标 的计算时间很长(超过一分钟),IndicatorCounted()总是返回0。

 
artmedia70:
说实话,在我看来,测试人员记住的是变量的过去值--从上一次测试开始。如何--我不知道,没有太多的时间来汇报。也许是终端的一个错误。我只是在代码中插入了一个注释,并将数值输出到日志中。因此,事实证明,每次我运行一个新的测试时,前一个测试的值都会存储在sys变量中。真是一团糟。也许别人会看到,也许我的眼睛是湿的......。

只是你忘了,这句话

int       sys=(Sys<0)?0:Sys;

当指标的属性被召回时,它们将不会被执行。

我还没有彻底研究过,但也许这能达到预期的效果?

extern int Sys=0;
int       sys;    // изменено
double    opb;
double    ops;
double    cb;
double    cs;
double    lot;
double    next_order;
int       i=0;
int       x;
double    max;
double    min;
int       ticket;
int       tip;
int       count;
bool      res;
double    bal;
double    sl;
datetime  d;
double    N;
//+------------------------------------------------------------------+
//| expert initialization function                                   |
//+------------------------------------------------------------------+
int init()
  {
   sys=(Sys<0)?0:Sys;  // добавлено
   bal=AccountBalance();
   return(0);
  }
 
AlexeyVik:

你只是忘记了字符串

当指标的属性被召回时,它们将不会被执行。

我还没有彻底研究过,但也许这能达到预期的效果?



一般来说,是一个顾问。但HZ,没有时间去实验。我让所有的EA按照我写的方式工作。我将不得不在测试器中追踪这个狗屎。当我有足够的时间。
 
Expert:


关键是,代码的其余部分是不相关的。这篇稿件中描述了错误的本质。一般来说,我害怕用一个大帖子把人吓跑。所以我把它胀破了。

简而言之,它可以表述为:如果一个指标的计算时间很长(超过一分钟),IndicatorCounted()总是返回0。


这不是问题的关键。没有人需要你的全部秘密代码。就用这种误解写一个完整的测试片断的代码。还有这种方式。

bool busy=false;

int start()
{
   int counted_bars=IndicatorCounted();
   if(counted_bars<0) return(-1);
   limit=Bars-counted_bars+1;
   limit=MathMin(bBars-1, limit);
   if(IndicatorCounted()>0) limit=1;
   
   FileWrite(han, TimeToStr(TimeCurrent(), TIME_MINUTES|TIME_SECONDS), Bars, IndicatorCounted());
   FileFlush(han);
   //if(busy=false) return(0);
   for (i=0; i<limit; i++)
   { 
      busy=true;
      FileWrite(han, TimeToStr(TimeCurrent(), TIME_MINUTES|TIME_SECONDS), DoubleToStr(i, 0), DoubleToStr(IndicatorCounted(), 0));
      FileFlush(han);
      Здесь идут сложные вычисления которые занимают минуты 3
   }

   busy=false;
}

你是什么时候清除了高亮线的?心灵感应者无济于事,凡人就更不用说了......。

然后是这一部分。

   int counted_bars=IndicatorCounted();
   if(counted_bars<0) return(-1);
   limit=Bars-counted_bars+1;
   limit=MathMin(bBars-1, limit);
   if(IndicatorCounted()>0) limit=1;

我不知道它来自哪个程序员,但有一些东西写得不够好......这不是你的错。你和其他许多人一样,只是拿着代码并试图修复它......。

如果counted_bars变量等于自上一次指标调用(第一行)以来保持不变的条数

如果(counted_bars < 0)被检查,它怎么会变得小于零,我永远无法理解......。

其余的也是废话,但我懒得去分析......

 
AlexeyVik:

你只是忘记了字符串

当指标的属性被召回时,它们将不会被执行。

我还没有彻底研究过,但也许这能达到预期的效果?




我试过了......不起作用......
 
artmedia70:
一般来说,是一个顾问。但HZ,没有时间去实验。我让所有的EA按照我写的方式工作。我将不得不在测试器中追踪这个狗屎。当我有足够的时间。

嗯,是的,当然,专家顾问。那么另一个问题就来了,为什么EA被放在图表上作为一个地下室指标?但这并不能改变问题,当重新启动指标和EA时,全局级别的变量没有被重新初始化,int sys=(Sys<0)?0:Sys;一行没有被执行。
 
peace1984:

我试过了......不起作用......
这可能不完全是我尝试的方式。
我只是在EA中重新编译了代码并运行了它。当我改变注释中的Sys参数时,这个值会发生变化。