新人对MQL4和MQL5的任何问题,对算法和代码的帮助和讨论 - 页 1445

 
Vitaly Muzichenko:

谢谢你!

试了一下,得到一个错误,我做错了什么。

缓冲区[]是分布式的吗?我看到了声明,但我没有看到尺寸设置

 
Artyom Trishkin:

缓冲区[]是分布式的吗?我看到了声明,但我没有看到尺寸设置

设置大小,在其他地方出错,不工作。

 
Vitaly Muzichenko:

设置大小,在其他地方出错,不工作。

你在传输什么

 
Artyom Trishkin:

你在传递什么

   double Array_1[];
   double Array_2[];
   ArraySetAsSeries(close, true);
   int count = rates_total-1;
   if(count < 0)
      return (-1);
   int i = 1;
   int period = (int)MathFloor(MathSqrt(a));
   int val_1 = (int)MathFloor(a / 1.9);
   int counter = Bars(_Symbol,_Period) - count + a + 1;
   if(counter > Bars(_Symbol,_Period))
      counter = Bars(_Symbol,_Period);
  // ArraySetAsSeries(Array_1, true);
   ArrayResize(Array_1, counter);
  // ArraySetAsSeries(Array_2, true);
   ArrayResize(Array_2, counter);
   double d_close = close[1];
   double buff[];
   ArrayResize(buff, counter);
   for(i = 0; i < counter; i++)
      Array_1[i] = 2.0 * ma_1(i, val_1) - ma_1(i, a);
   for(i = 0; i < counter - a; i++) {
      // buf_3[i] = iMAOnArray(Array_1, 0, period, 0, MODE_SMMA, i);
      // buf_3[i] = iMA(NULL, 0, period, 0, MODE_SMMA, PRICE_LOW);
      //  CopyBuffer(10,0,i,1,buff);
      SmoothedMAOnBuffer(counter, prev_calculated, i, period, Array_1, buff);
      buf_3[i] = buff[0];
      }
     .....

//+------------------------------------------------------------------+
int SmoothedMAOnBuffer(const int rates_total,const int prev_calculated,const int begin,const int period,const double& price[],double& buffer[])
{
//--- check period
   if(period<=1 || period>(rates_total-begin))
      return(0);
//--- save as_series flags
   bool as_series_price=ArrayGetAsSeries(price);
   bool as_series_buffer=ArrayGetAsSeries(buffer);
   ArraySetAsSeries(price,false);
   ArraySetAsSeries(buffer,false);
//--- calculate start position
   int start_position;
   if(prev_calculated==0) { // first calculation or number of bars was changed
      //--- set empty value for first bars
      start_position=period+begin;
      for(int i=0; i<start_position-1; i++)
         buffer[i]=0.0;
      //--- calculate first visible value
      double first_value=0;
      for(int i=begin; i<start_position; i++)
         first_value+=price[i];
      buffer[start_position-1]=first_value/period;
   } else
      start_position=prev_calculated-1;
//--- main loop
   for(int i=start_position; i<rates_total; i++)
      buffer[i]=(buffer[i-1]*(period-1)+price[i])/period;
//--- restore as_series flags
   ArraySetAsSeries(price,as_series_price);
   ArraySetAsSeries(buffer,as_series_buffer);
//---
   return(rates_total);
}
 
Vitaly Muzichenko:

维塔利,为什么要把功能复制到输入器上?插入一个图书馆不是更容易吗?

#include <MovingAverages.mqh>
 
Vitaly Muzichenko:

一般来说,从循环中删除对该函数的调用。这个函数中已经有一个完整的循环。在开始时,你需要传递数组中重要数据的开头,在此基础上进行平滑处理。对于某些类型 的平滑,你需要一个预计算。对于SMMA来说,大约是两个计算期。

 
Artyom Trishkin:

一般来说,从循环中删除 对该函数的调用。这个函数中已经有一个完整的循环。在开始时,你需要传递数组中重要数据的开头,在此基础上进行平滑处理。对于某些类型 的平滑,你需要一个预计算。对于SMMA来说,大约是两个计算期。

但是当一个新的条形图被添加时,整个数组不会被重新计算吗?而当数组中的当前值发生变化时,缓冲区也需要重新计算。在这种情况下,我们如何才能避免循环?

在指标开始时一次,通过整个缓冲区,然后只在每个刻度上的最后一个索引?这是个即兴表演。我还没有这样做......我必须要检查一下。

 
Alexey Viktorov:

而在这种情况下,当一个新的柱子被添加时,整个数组不会被重新计算吗?当缓冲区阵列中的当前值发生变化时,重新计算也无妨。在这种情况下,我们如何才能避免循环?

在指标开始时一次,通过整个缓冲区,然后只在每个刻度上的最后一个索引?这是个即兴表演。我还没有这样做......我必须要检查一下。

好吧,看一下代码--维塔利已经直接把它摆出来了

 
Artyom Trishkin:

好吧,看看代码--维塔利直接发布了它

现在我想调试一下mt4中的 "SmoothedMAOnBuffer() "结构。

怎么了,我一点都不明白

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 Array_1[];
   double Array_2[];
   int count = IndicatorCounted();
   if(count < 0)
      return (-1);
   int i = 1;
   int period = (int)MathFloor(MathSqrt(a));
   int val_1 = (int)MathFloor(a / 1.9);
   int counter = Bars - count + a + 1;
   if(counter > Bars)
      counter = Bars;
   ArraySetAsSeries(Array_1, TRUE);
   ArrayResize(Array_1, counter);
   ArraySetAsSeries(Array_2, TRUE);
   ArrayResize(Array_2, counter);
   double d_close = close[1];
   double buff[];
   ArrayResize(buff, counter);
   for(i = 0; i < counter; i++)
      Array_1[i] = 2.0 * ma_1(i, val_1) - ma_1(i, a);
   for(i = 0; i < counter - a; i++) {
     // buf_3[i] = iMAOnArray(Array_1, 0, period, 0, MODE_SMMA, i); // Так индикатор работает
      SmoothedMAOnBuffer(counter, prev_calculated, i, period, Array_1, buff); Совсем не работает, но и ошибок в журнале нет
      buf_3[i] = buff[0]; ???
   }
   for(i = counter - a; i > 0; i--) {
      Array_2[i] = Array_2[i + 1];
      if(buf_3[i] > buf_3[i + 1])
         Array_2[i] = 1;
      if(buf_3[i] < buf_3[i + 1])
         Array_2[i] = -1;
      if(Array_2[i] > 0.0) {
         buf_1[i] = buf_3[i];
         if(Array_2[i + 1] < 0.0)
            buf_1[i + 1] = buf_3[i + 1];
         if(Array_2[i + 1] < 0.0) {
         }
         buf_2[i] = EMPTY_VALUE;
      } else {
         if(Array_2[i] < 0.0) {
            buf_2[i] = buf_3[i];
            if(Array_2[i + 1] > 0.0)
               buf_2[i + 1] = buf_3[i + 1];
            if(Array_2[i + 1] > 0.0) {
            }
            buf_1[i] = EMPTY_VALUE;
         }
      }
   }
   for(i = 0; i < counter-1; i++) {
      if(buf_2[i + 1] == EMPTY_VALUE && buf_2[i] != EMPTY_VALUE)
         buf_4[i] = buf_2[i];
      if(buf_1[i + 1] == EMPTY_VALUE && buf_1[i] != EMPTY_VALUE)
         buf_5[i] = buf_1[i];
   }
   return(rates_total);
}
//+------------------------------------------------------------------+
//+------------------------------------------------------------------+
int SmoothedMAOnBuffer(const int rates_total,const int prev_calculated,const int begin,const int period,const double& price[],double& buffer[])
{
//--- check period
   if(period<=1 || period>(rates_total-begin))
      return(0);
//--- save as_series flags
   bool as_series_price=ArrayGetAsSeries(price);
   bool as_series_buffer=ArrayGetAsSeries(buffer);
   ArraySetAsSeries(price,false);
   ArraySetAsSeries(buffer,false);
//--- calculate start position
   int start_position;
   int i=0;
   if(prev_calculated==0) { // first calculation or number of bars was changed
      //--- set empty value for first bars
      start_position=period+begin;
      for(i=0; i<start_position-1; i++)
         buffer[i]=0.0;
      //--- calculate first visible value
      double first_value=0;
      for(i=begin; i<start_position; i++)
         first_value+=price[i];
      buffer[start_position-1]=first_value/period;
   } else
      start_position=prev_calculated-1;
//--- main loop
   for(i=start_position; i<rates_total; i++)
      buffer[i]=(buffer[i-1]*(period-1)+price[i])/period;
//--- restore as_series flags
   ArraySetAsSeries(price,as_series_price);
   ArraySetAsSeries(buffer,as_series_buffer);
//---
   return(rates_total);
}
 
Vitaly Muzichenko:

现在我来到了调试mt4中的 "SmoothedMAOnBuffer() "结构。

怎么了,我一点都不明白

从循环中删除
原因: