double MACDBuffer[]; int x=20; // если известен размер буфера то
ArrayResize( MACDBuffer,x); // то можно и просто MACDBuffer[20], но MACDBuffer[] нельзя.
double min,max;
int start(){
for(int i=0; i<20; i++)
MACDBuffer[i]=iMA(NULL,0,12,0,MODE_EMA,PRICE_CLOSE,i)-iMA(NULL,0,26,0,MODE_EMA,PRICE_CLOSE,i);
min=ArrayMinimum(MACDBuffer);
max=ArrayMaximum(MACDBuffer);
Print(min,"____",max);
}
int Mas[]。
然后填入循环,如有必要,用
ArrayResize(Mas,size)。
ArrayInitialize(Mas,0)。
如果不是太麻烦的话,请举个小例子吧?
"然后循环填充" 如果不是太麻烦,可以举个小例子吗?
有人告诉你,要填充一个动态数组 MACDBuffer[],你应该用ArrayResize()把它变成静态的(否则赋值的结果一直是零)。
而且,为了保证计算的稳定性和充分性,最好用ArrayInitialize()来初始化数组。
有人告诉你,要填充一个动态数组MACDBuffer[],你应该用ArrayResize()把它变成静态的(否则赋值的结果将总是零)。
而且,为了确保计算的稳定性和充分性,最好用ArrayInitialize()来初始化数组。
谢谢你!
问题是,有一个工作的专家顾问。
int CD=0; //平仓交易的订单号
double Balance=0; // 平仓交易的结果
double Mas[]; // 平仓交易结果的数值阵列
如何在int Start()中用已关闭交易的结果填充Mas[]?
也许需要在init()和deinit()中写些什么?一个初始化器或其他东西?
正确的代码会是什么样子?
问题的实质是,有一个正在运行的专家顾问。
int CD=0; // 一个已关闭的交易的顺序号
double Balance=0; // 平仓交易的结果
double Mas[]; // 平仓交易结果的数值阵列
在int Start()中,如何在Mas[]中填写平仓交易的结果?
也许,我需要在init()和deinit()中添加一些东西?一个初始化器或其他东西?
正确的代码会是什么样子?
每个人对 "权利 "都有不同的概念。
也许你希望在初始化时Mas[CD]=Balance,当你改变CD值时,在开始时分配给Mas[CD]=Balance?
或者你想有一个二维数组,所有必要的数据(余额、时间、点数、最大资产、最小资产....)将被存储在每个交易中。
有人告诉你,要填充一个动态数组MACDBuffer[],你应该用ArrayResize()把它变成静态的(否则赋值的结果将总是零)。
而且,为了确保计算的稳定性和充分性,最好用ArrayInitialize()来初始化数组。
ArrayResize()改变数组的大小。在mql4中,所有数组默认为静态。
我错了。该教程证实了这一点。
如果没有指定要初始化的一维数组的大小,它将由编译器根据初始化序列的大小来决定。阵列的初始化也可以用标准的ArrayInitialize()函数来完成。 所有的数组都是静态的,即有一个静态的形式,即使在初始化时没有明确指定。这意味着数组中的所有元素在调用函数的间隔时间内保持它们的值,在该函数中,数组被声明。
但是,为什么这样一个 "静态 "数组不会赋值呢?由于编译器的ArrayResize(buffer,0),结果如预期的那样为空?
我错了。教科书证实了这一点。
但是,为什么这样一个 "静态 "数组不赋值呢?由于编译器的ArrayResize(buffer,0),结果如预期般为空?
因为该阵列是动态的。它在第一维的大小可以用ArraySize()查看--用于一维数组,ArrayRange()--用于多维数组的指定维度。
静态并不意味着 "默认尺寸"。不要混淆 "静态 "和 "动态 "这两个概念。它们不是反义词。他们来自这里的不同应用领域。类比:静态数组是一个"静态变量"。动态数组是 "以编程方式定义和改变的大小"。
谢谢你!问题是,有一个工作的专家顾问。int CD=0; // 平仓交易的序号 double Balance=0; // 平仓交易的结果 double Mas[]; // 平仓交易结果的数值阵列
如何在int Start()中用已关闭交易的结果填充Mas[]?
也许需要在init()和deinit()中写些什么?一个初始化器或其他东西?
正确的代码会是什么样子?
我错了。教科书证实了这一点。
但是,为什么这样一个 "静态 "数组不赋值呢?由于编译器的ArrayResize(buffer,0),结果如预期般为空?
因为准确地说,它不是一个数组。如果你想了解更多的细节--请看C语言的描述。 我之所以提到它,是因为从一开始,开发人员就说,凡是不清楚的或不完全解释的--请看C标准。
当你声明变量double buffer[]; 时,内存被分配给一个变量,在C语言中被称为 "指针",具有整数类型,并存储着数组开始的内存单元的地址。如果你在MCL中检查变量的维度,你会得到0的值。这意味着数组本身没有被分配内存,当你试图分配一个值时,没有地方可以写:在MCL中没有地址运算,也不能处理指针。在C语言中,你可以写,但用 "未分配 "的内存,通常会导致系统崩溃。当你应用AreiResize(array,N),(N>0)时,这将为数组分配内存(至少一个元素)并为写值创造空间。然后,当检查时,数组的尺寸将与0不同。
就C语言而言,静态数组的概念有几种含义。
1.静态数组(以及静态变量/类型)是这样的变量/数组,其维度在编译阶段(MKL4的预编译)就已经知道。例如,当描述double buff[10000];时,编译器被告知变量的大小,并可以立即分配内存。与这个概念相比,还有一个 "动态数组 "的概念,即这样的数组,其大小在编译时是未知的,只有在运行时才会知道;这些都是可变大小的数组。当访问这种数组时,必须事先分配内存。内存是在静态程序内存之外分配的。
在C/C++中,如果一个数组被描述在一个块中,那么它的可见性就会受到该块的限制--无论是静态数组还是动态数组。程序中的错误如 "内存泄漏 "与本地定义的动态数组有关,即当一个内存指针因为离开可见区而被破坏,但分配给它的内存仍然被占用。
2 "静态 "数组的概念是用静态修饰符 描述的变量--这种变量在离开块的范围时不会被销毁--它们位于一个单独的内存区域--因此它们的值被保留下来。内存泄漏的风险降低了。在p.1的意义上声明为动态的数组(即在编译阶段不知道数组的大小),在p.2的意义上也可以是静态的,即用修饰词 "static "声明。
终止程序时,必须释放动态分配的内存,以避免内存泄漏。我不知道MKL的开发者是否遵循这一点,但在我的程序中,我总是释放内存--来自C语言的习惯--ArreyResize(array,0)。
在MKL中,所有的数组在第2点的意义上是静态的。
现在关于你的问题。"为什么静态数组double buffer[]; 不能被赋值?"。因为没有为它分配内存(事实上,它是一个带有静态修改器的动态数组)。在赋值之前,应该分配内存,也就是说,应该对这个数组应用大小大于0的ArrayResize。对于数组,你需要控制内存超限(在数组之外)。
SZ 我希望我已经说得很清楚了。我试图让它尽可能简单。