错误、漏洞、问题 - 页 1390

 

不要在指标init中等待,以完全创建指标

创建指标 和返回控制,所有的环境和历史将在以后准备好,你的重新计算代码将被调用。

 
Renat Fatkhullin:

不要在初始阶段就等待指标 的完全创建

创建指标和返回控制,所有的环境和历史将在以后准备好,你的重新计算代码将被调用。

谢谢,也就是说,在OnInit()返回后,每次收到数据时都要对4806进行检查?
 
在每个数据读取点
 

这是指标被调用的地方,其数值在OnCalculate 中被计算。你可以无限期地等待,不会发生重新计算的情况。要在周期图上运行,D1

int i_ich=INVALID_HANDLE;
double ind_buf[];

int OnInit(){
   i_ich=iIchimoku(Symbol(), PERIOD_H4, 9, 26, 52);
   if(i_ich==INVALID_HANDLE){
      Print("Невозможно создать индиктор Ишимоку!");
      return(INIT_FAILED);
   }
   SetIndexBuffer(0, ind_buf, INDICATOR_DATA);
   ArraySetAsSeries(ind_buf, true);
   return(INIT_SUCCEEDED);
}


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[]){
   double temp[];
   int copied=CopyBuffer(i_ich,0,0,1,temp);
   if(copied<=0){
      datetime now=TimeLocal();
      while(BarsCalculated(i_ich)<=0 && !IsStopped()){  
         Comment("Ждем пересчета индикатора Ишимоку... ",int(TimeLocal()-now));
      }
      if(BarsCalculated(i_ich)>0){
         Print("Расчитано ", BarsCalculated(i_ich), " баров за ",int(TimeLocal()-now)," секунд");
      }
      Comment("");
   } 

   return(rates_total);
}

请解释为什么不计算石木读数。

 
Ilya Malev:

这是指标被调用的地方,其数值在OnCalculate中被计算。你可以无限期地等待,不会发生重新计算的情况。要在周期图上运行,D1

请解释为什么不计算石木读数。

这样吧。

//+------------------------------------------------------------------+
//|                                                      ProjectName |
//|                                      Copyright 2012, CompanyName |
//|                                       http://www.companyname.net |
//+------------------------------------------------------------------+
#property indicator_chart_window
#property indicator_buffers 1
#property indicator_plots   0
int i_ich=INVALID_HANDLE;
double ind_buf[];
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int OnInit()
  {
   i_ich=iIchimoku(Symbol(),PERIOD_H4,9,26,52);
   if(i_ich==INVALID_HANDLE)
     {
      Print("Невозможно создать индиктор Ишимоку!");
      return(INIT_FAILED);
     }
   SetIndexBuffer(0,ind_buf,INDICATOR_DATA);
   ArraySetAsSeries(ind_buf,true);
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
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 int count;
   Print(count);
   double temp[];
   datetime now=TimeLocal();
   int copied=CopyBuffer(i_ich,0,0,1,temp);
   if(copied>0)
      Print("Расчитано ",BarsCalculated(i_ich)," баров за ",int(TimeLocal()-now)," секунд");
   count++;
   return(rates_total);
  }
//+------------------------------------------------------------------+
?
 

你永远不应该在指标代码中循环期望值。在脚本和专家顾问中,你可以,但在指标中你绝对不能。

指标中计算和请求外部数据的策略应该是这样的:如果数据请求不成功,那么我们立即退出,推迟到下一个tick进行计算。在下一次勾选/调用中,我们将再次尝试要求提供必要的数据。

 
Karputov Vladimir:

如果是的话。

?
输出 "0"(因为今天是周日,没有重启OnCalculate)。
 
Renat Fatkhullin:

你永远不应该在指标代码中循环期望值。在脚本和专家顾问中,你可以,但在指标中你绝对不能。

在指标中计算和请求外国数据的策略应该如下:如果数据请求不成功,那么我们立即退出,将计算推迟到下一个 tick。在下一次勾选/调用中,我们将再次尝试要求提供必要的数据。

好的,但如果指标读数 应该在一次运行中计算,而不需要等待下一个tick,怎么办?例如,如果有一个周末或只是一个低流动性的时期,当滴答声超出一分钟?使用OnTimer而不是OnCalculate?
 
Ilya Malev:
输出 "0"(因为今天是周日,所以没有重新运行OnCalculate。)
在测试器中,在测试器中!而在周末,你需要右键点击图表并 "刷新"。
 

在按下 "刷新 "键后,一切都被计算出来了。如果在inite中创建的指标数据在第一次调用OnCalculate/OnTimer 等之前被计算出来,那就更方便了。

如果有可能在指标内部的循环中初始化后等待它们的计算,那就很有用了。

为了计算该指标,用户应该在图表上按几次 "刷新"。他是否需要它。尽管MT5有一些优势,但他会记得老式的MT4,并将继续使用它。