初学者的问题 MQL5 MT5 MetaTrader 5 - 页 1466

 

下午好。在 Mql5 上编写智能交易系统时,我遇到了一个问题。有一个数组,其中包含当年开盘烛台的值。在该数组的每个烛台上,我需要创建一个 n 个烛台数组(例如 30 个),以检查高点和低点。类似于 "之 "字形指标。

我写了这段代码,但却出现了一个错误:"数组超出范围",或者最大值和最小值在整个数组中,但不在所需的 30 个蜡烛周期内。

for(int i=0; i<ArraySize(opens); i++)
  {
    if(i+30<=ArraySize(opens))
      {
       double maximum=0;
       double minimum=9;
       for(int j=0; j<30; j++)
        {
         maximum = ArrayMaximum(opens, i, i+j);
         minimum = ArrayMaximum(opens, i, i+j);
        }
     }
  }

也许我需要创建另一个数组,以便在ArrayMaximum() 和 ArrayMinimum()函数 中进行检查,但我对嵌套循环和数组大小感到困惑。

请给我一点提示。

 
Dmitry Ivanushko #:
if(i+30<=ArraySize(opens))
if(i+30<ArraySize(opens))

以下是 数组外的输出结果

 
if(i+30<ArraySize(opens))

该错误是由于注意力不集中造成的。修复它并不能解决问题。

如何创建一个包含 30 个蜡烛图开盘价的数组,以搜索其中的高点和低点?

 
Dmitry Ivanushko #:
数组最大值
ArrayMaximum

返回 最大值的 最大值的索引,而不是价格。

//+------------------------------------------------------------------+
int indexMax[];
int indexMin[];
int sizeArray = ArraySize(opens);
int size = 0;
int n = 30;

for(int i = n; i < sizeArray; i + n)
  {
   ArrayResize(indexMax, size + 1);
   indexMax[size] = ArrayMaximum(opens, i - n, i);
   indexMin[size] = ArrayMinimum(opens, i - n, i);
   size++;
  }
//+------------------------------------------------------------------+

我没有检查过,但这似乎是获取蜡烛图开盘(opens)最小值和最大值索引 的方法。

虽然也可以一次性获得价格,但不能获得指数。

double PriseMin = opens[ArrayMinimum(opens, i - n, i)];
 
for(int i = n; i < sizeArray; i + n)

我在任何地方都没有找到带步骤的 mql 循环示例。这简化了整个问题。

只有 ChatGPT 建议我这样写:

for(int i = n; i < sizeArray; i += n)

我将进一步尝试。代码可以运行。谢谢。

如果不执行ArrayResize,就会出现 "数组超出范围 "的错误。

 
Dmitry Ivanushko #:

该错误是由于注意力不集中造成的。修复它并不能解决问题。

如何创建一个包含 30 个蜡烛图开盘价的数组,并在其中搜索高点和低点?

问题出在哪里?声明一个数组 temp[],将 30 个元素复制到数组中,然后查找最小值/最大值的索引。如果最后小于 30,就会复制还剩下多少。在这种情况下,我宁愿使用 while() 循环。

 
Alexey Viktorov #:
问题出在哪里?声明一个数组 temp[],将 30 个元素复制到数组中,然后查找最小值/最大值的索引。如果最后小于 30,就会复制还剩下多少。在这种情况下,我宁愿使用 while() 循环。

是的,你可以这么做。我脑子不清楚,所以想请教一下。

 
Dmitry Ivanushko #:

是的,你可以这么做。我脑子不清楚,所以想请教一下。

在静态数组中,数组的大小是恒定的,不能改变;而在动态数组中,数组的大小可以改变,但数组的大小是恒定的!也就是说,数组的大小是已知的,从 0 到末尾的元素索引也是已知的。<= 是超出范围的,因为从 0 开始的元素索引和最后一个元素的索引比数组大小少一个单位。

一切尽在掌握))))

 
Valeriy Yastremskiy #:

在静态数组中,大小是恒定的,不能改变;而在动态数组中,大小可以改变,但数组的大小是固定的! 也就是说,数组的大小是已知的,元素的索引是从 0 到末尾。<= 就因为元素的索引从 0 开始,而最后一个元素的索引小于数组大小的一个单位而超出了范围。

一切尽在掌握))))

这话 是什么意思?你是否认为要从一个数组复制一些元素到另一个数组(某个 temp[]),应该在复制之前设置数组的大小 ArrayResize(temp, new_size); ?????

 
Dmitry Ivanushko #:

是的,你可以这么做。我脑子不清楚,所以想请教一下。

你甚至不需要一个临时数组。

int  ArrayMaximum( 
   const void&   array[],             // массив для поиска 
   int           start=0,             // с какого индекса начинаем поиск 
   int           count=WHOLE_ARRAY    // количество проверяемых 
   );

这段代码

  double open[];
  int copy = CopyOpen(_Symbol, PERIOD_CURRENT, 0, 100, open);
  int arrMaximum = ArrayMaximum(open, 85, 20);

最多只能搜索剩余的 15 个元素,尽管它被设置为搜索 20 个元素。

所以你最好使用 while() 循环,而不要担心数组剩余项的数量。