MT4的iMAOnArray和iBandsOnArray元素数量对计算的影响 - 页 2

 
Sergey Efimenko:
你的意思是,我期待什么?我在上面写到,我需要300个最后(当前)的实际值,而不是300个最初(初始)的值,此外,我在偏移量299-0处访问一个数组,但我得到的数据偏移量是从 "数组结束 "到 "数组结束-300 "的值(在我的例子中是从4999到4700),也就是说,在偏移量299是一个值,它应该在偏移量4999,同样在偏移量0是一个值,它应该是在偏移量4700。问题是,在不计算当前价值的情况下,计算旧价值的目的是什么?

如果你写的很清楚,就不会有问题了。

double  iMAOnArray(
   double       array[],          // массив               // С этим понятно...
   int          total,            // количество элементов // Это у тебя 300
   int          ma_period,        // период               // Это ???
   int          ma_shift,         // сдвиг средней        // понятно
   int          ma_method,        // метод усреднения     // понятно
   int          shift             // сдвиг                // А здесь чему равна i???
   );

你被要求展示一个代码样本,但你只展示了一个例子的片段。关于其他方面,你只能猜测,这一切都在循环之中。你想在i的哪个值上得到最后的、当前的数值?在i=4700或哪里?

 
Alexey Viktorov:

如果你写的很清楚,那就不会有问题了。

你被要求展示一个代码例子,而你只展示了一块例子。关于其他的,你只能猜测,这都是一个循环。你想在i的哪个值上得到最后的、当前的数值?在i=4700或哪里?

如果你在实践中使用过这些有计算数组长度限制的函数,你就会明白我的意思,否则理论上的推理有什么意义......?我的代码有什么不清楚的? 我引用了完全相同的部分,唯一的区别是在第一种情况下我没有使用长度限制来计算阵列。在这种情况下,哪一个计算周期,即移位平均法或平均法根本不重要,因为它们在两种情况下是一样的?正如我在上面写的那样,shift的值也是类似的,使用起来完全一样。在循环中用你的移位变量替换 "i",用至少Open[i]替换GetValue(i)函数,使上述三个数组成为指标的3个显示缓冲区,看看第一个和第二个是如何工作的。然而,这里有一个例子,是该指标的简单变体在两个变体中的完整代码,以便更好地理解这个问题。

//这个工作很好。
#property strict
#property indicator_separate_window
#property indicator_buffers 3
#property  indicator_color1 clrYellow
#property  indicator_color2 clrGreen
#property  indicator_color3 clrRed
double Buffer[],BufferMA[],BufferBMA[]; bool firstrun=true;
int init() { firstrun=true; SetIndexBuffer(0,Buffer); SetIndexBuffer(1,BufferMA); SetIndexBuffer(2,BufferBMA); return(0); }
int start() { int i,limit; int counted_bars=IndicatorCounted(); if(counted_bars<0) return(-1); if(counted_bars>0) counted_bars--; limit=Bars-counted_bars-1;
   if(firstrun) {ArrayInitialize(Buffer,Open[Bars-1]); ArrayInitialize(BufferMA,Open[Bars-1]); ArrayInitialize(BufferBMA,Open[Bars-1]); firstrun=false; }
   for(i=limit; i>=0; i--) { Buffer[i]=Open[i]; BufferMA[i]=iMAOnArray(Buffer,0,12,0,0,i); BufferBMA[i]=iBandsOnArray(Buffer,0,12,2,0,MODE_MAIN,i); }
return(0); }

//它不能正常工作。

#property strict
#property indicator_separate_window
#property indicator_buffers 3
#property  indicator_color1 clrYellow
#property  indicator_color2 clrGreen
#property  indicator_color3 clrRed
double Buffer[],BufferMA[],BufferBMA[]; bool firstrun=true;
int init() { firstrun=true; SetIndexBuffer(0,Buffer); SetIndexBuffer(1,BufferMA); SetIndexBuffer(2,BufferBMA); return(0); }
int start() { int i,limit; int counted_bars=IndicatorCounted(); if(counted_bars<0) return(-1); if(counted_bars>0) counted_bars--; limit=Bars-counted_bars-1;
   if(firstrun) {ArrayInitialize(Buffer,Open[Bars-1]); ArrayInitialize(BufferMA,Open[Bars-1]); ArrayInitialize(BufferBMA,Open[Bars-1]); firstrun=false; }
   for(i=limit; i>=0; i--) { Buffer[i]=Open[i]; BufferMA[i]=iMAOnArray(Buffer,300,12,0,0,i); BufferBMA[i]=iBandsOnArray(Buffer,300,12,2,0,MODE_MAIN,i);  }
return(0); }

图表上画指标 后,到图表的开头(左边),从12个小节开始看1个指标,它是阵列中2和3的 "非空 "填充的开始,大约记住与0不同的前几个数值,然后将图表移到当前的报价,从300个小节开始看数值,因此2(底部)指标的数值将等于你在图表开头看到的1个指标的数值,而在想法中,数值应该与当前一致。我希望我解释得很清楚。另外,如果你把图表放在一个在线图表上,第一个图表可以正常工作,而第二个图表会 "挂在自己身上"。

 
Sergey Efimenko:


不仅代码没有风格,而且你把代码 作为纯文本插入。请正确插入代码。
 

我将以更可读的形式和新的符号来介绍你的代码(真的,我们还能在指标中使用这种不合时宜的int start()多久?)

指标1。

//+------------------------------------------------------------------+
//|                                                         Test.mq4 |
//|                        Copyright 2015, MetaQuotes Software Corp. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2015, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"
#property strict
#property indicator_separate_window
#property indicator_buffers 3
#property  indicator_color1 clrYellow
#property  indicator_color2 clrGreen
#property  indicator_color3 clrRed
double Buffer[];
double BufferMA[];
double BufferBMA[];
bool firstrun=true;
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- indicator buffers mapping
   firstrun=true;
   SetIndexBuffer(0,Buffer,INDICATOR_DATA);
   SetIndexBuffer(1,BufferMA,INDICATOR_DATA);
   SetIndexBuffer(2,BufferBMA,INDICATOR_DATA);
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
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[])
  {
//---
   int i,limit;
   limit=rates_total-prev_calculated-1;
   if(prev_calculated==0)
     {
      ArrayInitialize(Buffer,open[rates_total-1]);
      ArrayInitialize(BufferMA,open[rates_total-1]);
      ArrayInitialize(BufferBMA,open[rates_total-1]);
     }
   for(i=limit; i>=0; i--)
     {
      Buffer[i]=open[i];
      BufferMA[i]=iMAOnArray(Buffer,0,12,0,MODE_SMA,i);
      BufferBMA[i]=iBandsOnArray(Buffer,0,12,2,0,MODE_MAIN,i);
     }
   return(rates_total);
  }
//+------------------------------------------------------------------+

指标2。

//+------------------------------------------------------------------+
//|                                                         Test.mq4 |
//|                        Copyright 2015, MetaQuotes Software Corp. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2015, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"
#property strict
#property indicator_separate_window
#property indicator_buffers 3
#property  indicator_color1 clrYellow
#property  indicator_color2 clrGreen
#property  indicator_color3 clrRed
double Buffer[];
double BufferMA[];
double BufferBMA[];
bool firstrun=true;
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- indicator buffers mapping
   firstrun=true;
   SetIndexBuffer(0,Buffer,INDICATOR_DATA);
   SetIndexBuffer(1,BufferMA,INDICATOR_DATA);
   SetIndexBuffer(2,BufferBMA,INDICATOR_DATA);
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
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[])
  {
//---
   int i,limit;
   limit=rates_total-prev_calculated-1;
   if(prev_calculated==0)
     {
      ArrayInitialize(Buffer,open[rates_total-1]);
      ArrayInitialize(BufferMA,open[rates_total-1]);
      ArrayInitialize(BufferBMA,open[rates_total-1]);
     }
   for(i=limit; i>=0; i--)
     {
      Buffer[i]=open[i];
      BufferMA[i]=iMAOnArray(Buffer,300,12,0,MODE_SMA,i);
      BufferBMA[i]=iBandsOnArray(Buffer,300,12,2,0,MODE_MAIN,i);
     }
   return(rates_total);
  }
//+------------------------------------------------------------------+

以及执行的结果。

结果

о

附加的文件:
Test.mq4  3 kb
Test300.mq4  3 kb
 
Sergey Efimenko:

如果你已经使用了这些功能

如果我没有,我就不会为了提出正确的解决方案而提出问题。

如果你需要计算12个周期,取300个柱子有什么意义呢?即使你需要它 "因为",你也应该明白在计算平均数的时候会有哪12个元素。而关于数组索引 方向的提示也非常正确。

为了理解,在纸上或计算器上做人工计算的实验,或在Excel中做实验。

 

当我看到这些答案时,我意识到我在这里只是在浪费时间,试图展示问题的本质,而得到的回应是代码的 "美丽"(当然要感谢,但提议的代码是在两分钟内写出来的,只是为了展示问题的本质,不需要任何可读性或其他转换)...

而且特别高兴的是,在我的帖子之前的答案......什么计算器,什么人工计算,什么指数化?尊敬的用户,请了解情况的实质,以免不仅浪费自己的时间,也浪费别人的时间。请重新仔细阅读我的帖子,如果有困难,我将简要回答:两种情况下数组的索引 方向都是正确的,必要的计算和其他可改变的参数的大小,正如它在主要代码中显示的那样,是用外部变量设置的,创建自己的函数的变体在上面讨论过(它实际上是唯一正确的解决方案),但我想重复,我想从内置的MT4获得它。

总的来说,感谢大家,我总结一下:要么是servicedesk,要么是我自己的类似功能。

 

而我的帖子前的答案让我很气馁......

如果你这么固执,=>服务台,他们只是出于无聊才回答这样的问题,而且他们很少感到无聊。

让我再试一次...

iMAOnArray(),在你的例子中,需要300个柱子,并计算出300个柱子中最后12个柱子的平均值。要对前12个柱子进行平均,你应该反转数组的索引,ArraySetAsSeries(BufferMA, false);或者只取12个柱子。

BufferMA[i]=iMAOnArray(Buffer,12,12,0,MODE_SMA,i);

因此,事实证明,你没有试图了解它是如何工作的,如何使用它,而是简单地说,它不工作或工作不正确。而在你看来,这是不对的。

关于代码之美的下一步是什么。当你的代码都是用一行写的时候,你认为别人读你的代码会把眼睛弄坏,这很有趣吗?错了。我个人并没有读过它。感谢小鼓手每天数次耐心地指挥大家...到错误的地方。

 

我本想非常 "详细 "地回答,但后来再次重读帖子后,我删除了我的答案,最后意识到我在这里只是在浪费时间,用不同的话解释了几次同样的事情......。

PS所有的感谢,真的感谢 "Barabashke"(Vladimir),他做得很好,但这整个情况不值得他的劳动,我会更加感激,如果它不会是困难的,在一个关键以前的截图,添加第三个选项,并显示会发生什么,如果你按照建议,改变索引的方向。为了结束关于该功能如何工作的问题。

 
Sergey Efimenko:

我本想非常 "详细 "地回答,但后来再次重读帖子后,我删除了我的答案,最后意识到我在这里只是在浪费时间,用不同的话解释了几次同样的事情......。

PS所有的感谢,真的感谢 "Barabashke"(Vladimir),他做得很好,但这整个情况不值得他的劳动,我会更加感激,如果它不会是困难的,在一个关键以前的截图,添加第三个选项,并显示会发生什么,如果你按照建议,改变索引的方向。为了结束关于该功能如何工作的问题。

选择3。

//+------------------------------------------------------------------+
//|                                         Test300AsSeriesFalse.mq4 |
//|                        Copyright 2015, MetaQuotes Software Corp. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2015, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"
#property strict
#property indicator_separate_window
#property indicator_buffers 3
#property  indicator_color1 clrYellow
#property  indicator_color2 clrGreen
#property  indicator_color3 clrRed
double Buffer[];
double BufferMA[];
double BufferBMA[];
bool firstrun=true;
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- indicator buffers mapping
   firstrun=true;
   SetIndexBuffer(0,Buffer,INDICATOR_DATA);
   SetIndexBuffer(1,BufferMA,INDICATOR_DATA);
   SetIndexBuffer(2,BufferBMA,INDICATOR_DATA);
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
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[])
  {
//---
   ArraySetAsSeries(open,false);
//---
   int i,limit;
   limit=rates_total-prev_calculated-1;
   if(prev_calculated==0)
     {
      ArrayInitialize(Buffer,open[rates_total-1]);
      ArrayInitialize(BufferMA,open[rates_total-1]);
      ArrayInitialize(BufferBMA,open[rates_total-1]);
     }
   for(i=limit; i>=0; i--)
     {
      Buffer[i]=open[i];
      BufferMA[i]=iMAOnArray(Buffer,300,12,0,MODE_SMA,i);
      BufferBMA[i]=iBandsOnArray(Buffer,300,12,2,0,MODE_MAIN,i);
     }
   return(rates_total);
  }
//+------------------------------------------------------------------+

而整体的结果。

选项1、2和3

附加的文件:
 

不,弗拉基米尔。这有点不对。

在这种情况下,你应该将ArraySetAsSeries(array, false);应用于一个有三百个元素的数组,其中iMAOnArray()被认为是。但我们最好使用CopyOpen() 而不是数组的填充循环。

根据我的理解,在这个变体中,最好是将

   for(i=limit; i>=0; i--)
     {
      Buffer[i]=open[i];
      BufferMA[i]=iMAOnArray(Buffer,12,12,0,MODE_SMA,i);
      BufferBMA[i]=iBandsOnArray(Buffer,12,12,2,0,MODE_MAIN,i);
     }