arrays - 如何在 MQL4 中将项目添加到数组中?
问题描述
我正在尝试在 MQL4 中创建一个数组,并且在每个刻度上我想向数组 [0] 添加一个新值并将其余项目推回,因此旧数组 [0] 变为数组 [1] 和数组[1] 变为数组 [2] 等等。我希望能够无限次地执行此操作,每次滴答一次。然后我可以使用 array[1] 访问上一个刻度的值,但我也可以访问它的当前值 array[0]。谢谢!
解决方案
在 MQL4 中可以有一组原语,这里的问题是您必须在每个报价时都复制它们,这是浪费时间和资源。如果您想保存一些更高级的数据(比如说MqlTick
),您必须将其存储为结构或创建一个类并保存类。复制所有对象应该是没有意义的,这就是为什么您应该考虑在末尾应用CList
或CArrayObj
添加对象。简单的魔法将有助于调用索引为 0 的元素:
#include <Arrays\ArrayObj.mqh>
class CTick : public CObject{
public: double m_bid, m_ask;
CTick(const double bid,const double ask):m_bid(bid),m_ask(ask){}
};
CArrayObj *listOfTicks;
CTick *getTickByShift(const int shift=0)
{
return listOfTicks.At(listOfTicks.Total()-1-shift));
}
int OnInit(){
listOfTicks=new CArrayObj();
return(1);
}
void OnTick(){
listOfTicks.Add(new CTick(Bid,Ask));
//example of accessing ticks 0 and 3, keep in mind you do not have 3 at start!
double bid0=getTickByShift(0).m_bid;
double ask3=getTickByShift(3).m_bid;
}
void OnDeinit(const int reason){delete listOfTicks;}
如果您确实需要无限数量的操作 - 可能 2^31-1 对您来说就足够了,为了加快速度,您可能会想到listOfTicks.Step(1000);
有 1000 个空槽并且不要在每个滴答声中调整数组的大小(=全部复制到新位置) .
推荐阅读
- node.js - 进行 DocuSign Admin API 调用时获得未经授权的响应
- vba - 通过 VBA 从 SSIS 清除多个工作表中的单元格
- python - 在dash app中启动app.py时如何使用__init__循环错误
- php - 什么是 coinbase webhook api 中的 X-Cc-Webhook-Signature?
- android - ARCore:相机帧中所有点的 3DCoordinates
- javascript - FCM Web 推送消息:仅在网站关闭时显示通知(不在后台)
- xml - 使用 XSLT 根据时间更改日期
- javascript - 如何留在选定的选项卡上
- r - 如何使用 cumsum 但条件如果 <0 然后使用 0
- r - 将包含文本映射的列中的值转换为整数并将它们聚合