文章 "MQL5 编程基础:数组" - 页 3

 
Ernie Gunning:

好吧,让我们试试英语版的 MQL。


感谢您发布的代码。它节省了我的时间。我试过使用 MQL 数组,但它们让人困惑。但后来我发现了你的代码,它节省了我研究数组以及如何使数组动态增长/增加的时间。非常感谢。

我希望我能回报你!下面的代码适用于所有数据类型。它也适用于对象,但 Contains(搜索)方法可能不起作用。我只在 double、int 和 bool 类型上进行了测试。字符串可能也会有问题,代码可能需要扩展。



那么你可以像这样为你需要的所有类型声明它:




希望对大家有所帮助


请不要理会我在上面提出的将动态数组用于任何数据类型的建议。已经声明了一个通用的 CArrayList,请使用它。我在使用对象时遇到了一个问题,该问题已在此主题中得到解决:https://www.mql5.com/en/forum/358432

Using CArrayList gives error
Using CArrayList gives error
  • 2020.12.20
  • www.mql5.com
Hi Guys, Thanks for your time. I'm struggling to use the CArrayList in the generics folder. Are these interfaces and classes complete...
 
我已经读过你写的一些好文章。这篇也不例外。
 

函数 arrayResize() 中似乎有一个错误,在示例中,数组的内容在正常索引中是 1、1、3,而不是 1、2、3。请参见此示例:

//+------------------------------------------------------------------+
//|false.mq5
//|版权所有 2024 年,MetaQuotes 有限公司。|
//|https://www.mql5.com ||
//+------------------------------------------------------------------+
#property copyright "Copyright 2024, MetaQuotes Ltd."
#property link      "https://www.mql5.com"
#property version   "1.00"
#property indicator_chart_window
//+------------------------------------------------------------------+
//| 自定义指示器初始化函数
//+------------------------------------------------------------------+
int OnInit()
  {
//--- 指示器缓冲区映射
   
//---
   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 ar[]; // 数组
ArrayResize(ar,2); // 准备数组
ar[0]=1; // 设置数值
ar[1]=2; 
ArraySetAsSeries(ar,true); // 更改索引顺序
ArrayResize(ar,3); // 增加数组大小
ar[0]=3; // 设置新数组元素的值
Alert(ar[0]," ",ar[1]," ",ar[2]); // 打印数组值
ArraySetAsSeries(ar,false);
Alert("Normal indexing: ", ar[0]," ",ar[1]," ",ar[2]); // 打印数组值
//--- 为下一次调用返回 prev_calculated 的值
   return(rates_total);
  }
//+------------------------------------------------------------------+
在添加的arraySetAsSeries()函数中,似乎受到了arrayresieze函数的影响,请看这个例子:
//+------------------------------------------------------------------+
//|errorindex.mq5
//|版权所有 2024 年,MetaQuotes 有限公司。|
//|https://www.mql5.com ||
//+------------------------------------------------------------------+
#property copyright "Copyright 2024, MetaQuotes Ltd."
#property link      "https://www.mql5.com"
#property version   "1.00"
#property indicator_chart_window
//+------------------------------------------------------------------+
//| 自定义指示器初始化函数
//+------------------------------------------------------------------+
int OnInit()
  {
//--- 指示器缓冲区映射
   
//---
   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 ar[]; // 数组
ArrayResize(ar,2); // 准备数组
ar[0]=9; // 设置数值
ar[1]=8; 
ArrayResize(ar,6); // 增加数组大小
Alert("Normal resize: ", ar[0]," ",ar[1]," ",ar[2]," ", ar[3], " ", ar[4], " ", ar[5]);
ArraySetAsSeries(ar,true); // 更改索引顺序
ArrayResize(ar,4); // 增加数组大小
ArraySetAsSeries(ar, false);
Alert("See the random element added: ", ar[0]," ",ar[1]," ",ar[2]," ", ar[3]);
ArraySetAsSeries(ar,true); // 更改索引顺序 0
ar[0]=8; // 设置新数组元素的值
Alert("Modify the first as serlies: ", ar[0]," ",ar[1]," ",ar[2]," ", ar[3]); // 打印数组值
//--- 为下一次调用返回 prev_calculated 的值
   return(rates_total);
  }
//+------------------------------------------------------------------+

步骤

1. ar = {}
2. ar = {9, 8}

3. AR = {9, 8, 0, 8, 0, 0}

4.设置为系列 true:

ar = {0, 0, 8, 0, 8, 9}

5.调整为 4

ar = {0, 0, 8, 0}

6.设置为系列 false:

ar = {0, 8, 0, 0}

7.设为数列为 true:

ar = {0, 0, 8, 0}

8.修改第一个元素 a[0]

ar = {8, 0, 8, 0}


我不知道调整数组大小(3-5)会获取数值并复制到新的位置,我想前向的 6 会获取随机数值。我更喜欢先 resize(),然后像这样 setasseries():

//+------------------------------------------------------------------+
//|indexingarraytest.mq5
//|版权所有 2024 年,MetaQuotes 有限公司。|
//|https://www.mql5.com ||
//+------------------------------------------------------------------+
#property copyright "Copyright 2024, MetaQuotes Ltd."
#property link      "https://www.mql5.com"
#property version   "1.00"
#property indicator_chart_window
//+------------------------------------------------------------------+
//| 自定义指示器初始化函数
//+------------------------------------------------------------------+
int OnInit()
  {
//--- 指示器缓冲区映射
   
//---
   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 ar[]; // 数组
ArrayResize(ar,2); // 准备数组
ar[0]=1; // 设置数值
ar[1]=2;
ArrayResize(ar,3); // 增加数组大小
Alert("Redimension to 3 normal: ", ar[0], " ", ar[1], " ", ar[2]); 
ArraySetAsSeries(ar,true); // 更改索引顺序
Alert("Redimension to 3 series: ", ar[0], " ", ar[1], " ", ar[2]); 
ar[0]=8; // 设置新数组元素的值
Alert("Change the first element: ", ar[0]," ",ar[1]," ",ar[2]); // 打印数组值
ArraySetAsSeries(ar, false);
Alert("Normal renew: ", ar[0]," ",ar[1]," ",ar[2]); // 打印数组值
//--- 为下一次调用返回 prev_calculated 的值
   return(rates_total);
  }
//+------------------------------------------------------------------+