错误、漏洞、问题 - 页 1391

 
Ilya Malev:

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

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

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

指标中的任何计算都必须 只在OnCalculate()中完成。
 
Karputov Vladimir:
指标中的任何计算都必须 只在OnCalculate()中完成。
在这种情况下,我说的是石牧指标的读数。我说的是在当前使用 的指标读数,即在OnCalculate中。所以它们在调用OnCalculate 之前就被计算了,就像在MT4中那样。或者可以在OnCalculate中等待他们的计算。否则,用户将不得不多次按更新键来建立一个指标。因为不是所有的指标都是建立在1秒内的整个历史上,有一些复杂的指标需要更长的时间来计算。所有这些时间,用户将不得不在 "刷新 "按钮上等待,而在MT4中,你只需等待它被绘制。
 
Ilya Malev:
在这种情况下,我说的是石牧指标的读数。我说的是在当前使用 的指标读数,即OnCalculate。所以它们在调用OnCalculate 之前就被计算了,就像在MT4中那样。
在OnInit()中,为指标的交易环境进行准备。而只有在OnCalculate()中你才能使用指标数据。
 
Ilya Malev:
在这种情况下,我说的是石牧指标的读数。我说的是在当前使用的 指标读数,即在OnCalculate中。所以它们在调用OnCalculate 之前就被计算了,就像在MT4中那样。或者可以在OnCalculate中等待他们的计算。否则,用户将不得不多次按更新键来建立一个指标。因为不是所有的指标都是建立在1秒内的整个历史上,有一些复杂的指标需要更长的时间来计算。所有这些时间,用户将不得不在 "刷新 "按钮上等待,而在MT4中,你只需等待它被绘制。

这个问题在论坛上时常出现。不幸的是,在OnTimer()中调用OnCalculate()并不能解决这个问题。

但你可以试试。在这篇文章中可以找到一个例子:MQL5配方--在MQL5中开发多货币波动指标

之后,你就可以写出它是否有效。

 
Karputov Vladimir:
OnInit()为指标的交易环境做准备。而只有在OnCalculate()中你才能使用 指标数据。
事实证明,如果该指标使用其他符号和/或tf的其他指标,你不能在不按下图表上的 "更新 "按钮的情况下一次或多次(或通过等待1/nicks的时间)。
 
Anatoli Kazharski:

这个问题在论坛上时常出现。不幸的是,在OnTimer()中调用OnCalculate()并不能解决这个问题。

但你可以试试。在这篇文章中可以找到一个例子:MQL5配方--在MQL5中开发多货币波动指标

事后写出是否成功,如果不是太麻烦的话。

谢谢你的链接。我将试一试并告诉你。
 
Ilya Malev:
事实证明,如果该指标使用其他符号和/或tf的其他指标,你不能不在图表上按一次或几次 "更新 "按钮(或等待1/few ticks)。

而如果你更仔细地看一下我给出的代码的工作原理?特别是对专家?在周末重新启动终端后。

2015.10.11 14:44:01.672 test (USDCAD,M5)        0
2015.10.11 14:44:01.681 test (USDCAD,M5)        1
2015.10.11 14:44:01.682 test (USDCAD,M5)        Расчитано 16518 баров за 0 секунд
2015.10.11 14:44:01.705 test (USDCAD,M5)        2
2015.10.11 14:44:01.705 test (USDCAD,M5)        Расчитано 16518 баров за 0 секунд

你完全可以看到,只有在第二次调用OnCaalculate()时才会进行计算。所以没有人取消程序员的检查责任:在OncalCulate()中检查CopyBuffer()的结果--如果该函数没有返回任何东西,必须在OnCalculate()的下一个输入中检查。

 
Anatoli Kazharski:

这个问题在论坛上时常出现。不幸的是,在OnTimer()中调用OnCalculate()并不能解决这个问题。

但你可以试试。在这篇文章中可以找到一个例子:MQL5配方--在MQL5中开发多货币波动指标

如果不是太麻烦的话,请以后再写,是否成功。

我还没有读过这篇文章,但它在OnTimer上运行良好

//+------------------------------------------------------------------+
//|                                                      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()
  {
   EventSetTimer(1);
   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);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+

void OnTimer(){
   datetime Arr1[];
   double Arr2[];
   long Arr3[];
   int Arr4[];
   OnCalculate(0, 0, Arr1, Arr2, Arr2, Arr2, Arr2, Arr3, Arr3, Arr4);
}

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=0;
   static datetime now=0;
   if(now==0)  now=TimeLocal();
   if(count>=0){
      Print(count);
      double temp[];
      int copied=CopyBuffer(i_ich,0,0,1,temp);
      if(copied>0){
         Print("Расчитано ",BarsCalculated(i_ich)," баров за ",int(TimeLocal()-now)," секунд");
         EventKillTimer(); // Индикаторы рассчитались, далее работаем только с OnCalculate
         count=-1;
      }else
         count++;
   }
   if(rates_total==0)   return(0); // Если это вызов из OnTimer, то возврат
   
   // ...
   return(rates_total);
}

我有一张奇怪的图片,显示从OnTimer调用OnCalculate的工作)我需要在时间序列中添加正确的值

 
Ilya Malev:

还没看文章,但用OnTimer的接收效果不错

在简单的指标中,它工作得很好。但在更复杂的情况下,由于某种原因,有时会粘住。)
 
Ilya Malev:

还没看文章,但用OnTimer的接收效果不错

使用 "造型器"--它更有利于识别错误。

   if(count>=0)
     {
      Print(count);
      double temp[];
      int copied=CopyBuffer(i_ich,0,0,1,temp);
      if(copied>0)
        {
         Print("Расчитано ",BarsCalculated(i_ich)," баров за ",int(TimeLocal()-now)," секунд");
         EventKillTimer(); // Индикаторы рассчитались, далее работаем только с OnCalculate
         count=-1;
        }
      else
         count++;
     }
在退出OnCalculate()之前增加计数变量--在这种情况下,这个变量将正确计算OnCalculate中的所有运行。