voidOnTrade()
{
... // сюда код, который будет работать только по изменению ситуации по счёту: открытие/закрытие позиций, установка/удаление ордеров
}
static _OTotal = -1;
static _HTotal = -1;
int OT=OrdersTotal();
int HT=OrdersHistoryTotal();
if(OT!=_OTotal || HT!=_HTotal) // если изменилось - выполняем
{
OnTrade(); // здесь дёргаем текущую ситуацию на счёте и заполняем структуры
_OTotal=OrdersTotal(); // запомним текущее количество
_HTotal=OrdersHistoryTotal(); // запомним количество в истории
}
那么你是否尝试过将变量变成全局变量?
我们想检查寻找EA的条件,不是每一个tick,而是只有当另一个订单被另一个EA或手动打开或关闭时(这样处理器才不会过载)。这就是为什么我们需要检查订单的数量是否与每个tick对应。
我们可以使用静态变量吗? 程序在这样的形式下能工作吗?
另外,最简单、最容易的条件是
OnTrade() 是mt4与mt5的一个类似物。
谢谢你的答复。我理解你写的一切。但我没有理解你写的东西在我的问题上的含义。
我的代码中所说的水平二维数组是指当索引0或1下有2行,索引0至30下有列。第一个维度表示为[0][0],[0][1],[0][2],...。[0][30] 第二个维度表示为[1][0],[1][1],[1][2],......。[1][30]
我的代码中所说的垂直二维数组是指当有31行索引为0到30,2列索引为0和1 时。第一个维度表示为[0][0],[1[0],[2][0],...。[30][0] 第二个维度表示为[0][1],[1][1],[2][1], ...。[30][1]
如果你执行我的代码,数组将垂直填充。而ArraySort() 函数将对 数组进行 应有的排序。
问题 为什么ArrayFill()函数 在这种情况下不起作用?毕竟,我要求它用相同的数值0.5555来填充数组的第一个维度(31项)。
谢谢你的帮助。
MQL4可以处理不超过4维的数组。因此arr[31][31]是一个错误。一个数组的大小不能超过arr[][4]。而第一个维度不是由MQL限制的,而是由什么限制的,我不太清楚。也许有人可以解释一下。
ArrayFill() 函数可以工作,但我们需要理解,数组arr[3][2]中的元素数将是6,我们需要把6写进这个函数,而不是按第一维的大小写3。
四维维度:arr[][][]或arr[,,]。
后面三个维度的尺寸必须在声明中指定并固定下来,而第一个维度可以不指定,以后再更改。
在一个二维数组的例子中,数组中的数据排列如下。
排序通过对第一个维度进行排序来移动整个水平面。
和ArrayFill()从一个元素填充到另一个元素,例如从3填充到8。这就造成了混乱。
如果你想通过第一个维度在水平方向上填充一些数值,你必须控制填充的开始和结束,知道数据是如何排列的。
例如,第一维度的零元素的整个尺子。
如果只有一个零元素,那么就这样。
如果有许多零元素,那么通过循环和简单的赋值。
我一定没有解释得很清楚......。使用打印机,在循环中打印所有的东西,这样做,那样做,你就会掌握它了。这样你会学得更快。
printf是我的朋友!
MQL4可以处理不超过4维的数组。因此,arr[31][31]是一个错误。一个数组的大小不能超过arr[][4]。而第一个维度 不是由MQL限制 的,而是由什么限制的,我不太清楚。也许有人可以解释一下。
而第一个维度(即字符串的数量)是由多少个限制的?MQL4 允许多维数组 中的行数不超过多少?
我认为四个维度都有一个限制:INT_MAX
关于结构。
二维的。
该结构表示一个一维数组,其中元素的排列方式如下:首先是第一行,然后是第二行,然后是第三行。
三维的。
在三维方面,也是如此。它是一个一维数组,第一行是一个接一个,然后是第二,.....
为什么是一维的? 因为在计算机内存中,一排的几个单元格被分配给了数组,所以他们把所有的东西都按顺序写入其中:row00+row01+row02+row10+row11....
而且还可以增加第四个维度--堆叠的三维阵列片。
在程序过程中,只有行数可以改变。所有的行、列、表和堆栈都只是理解结构的一种惯例。这些尺寸实际上不在我们的空间里,它们只是测量。
正如阿列克谢所说。
...列...是...水平的,因为我是躺在沙发上看的.........。
你是否注意到以下说明
多维 数组在用ArrayFill()处理时显示为一维,例如array[2][4]被处理为array[8],所以当处理这个数组时,可以接受指定初始元素的索引为5。所以,对array[2][4]调用ArrayFill(array, 5, 2, 3.14)将为array[1][1]和array[1][2]元素填充值3.14。
除了ArrayFill()之外,其他都弄清楚了。
1.当我声明一个数组double LoY[31][31]时;我基本上是在创建一个31行31列的表格。我已经创建了一个二维(而不是四维)数组,但还没有填满它。
2.接下来在代码中,我给每个单独的数组元素 填充一个Bid值。我可以用2个选项来填充
a) LoY[31][0]=Bid; - 我将第31行和数组的第一列填充为Bid 值。第二维度(索引1下的列,默认为0,因为我没有填充它。所以在这个变体中,我的第一 维度有31个填充元素,第二维度有1个。
b) LoY[0][31]=Bid - 我用Bid值填充31列和数组的第一行。 而第二维度(索引1下的行,默认情况下填充为0,因为我没有填充它。因此,在这个变体中,第二维度由31个填充元素组成,第二维度由1组成。
ArraySort()只对二维数组的第一维进行排序。因此,它将对选项a)进行排序其中第一维有31行,不会对选项b)进行排序,其中第一维只有1行,因为1行不能被排序。
现在ArrayFill() 它在给二维数组的元素分配所需的值之前,将二维数组拉成一行。也就是说,它要把我的数组LoY[31][31] 拉成一个大小为961个元素的单行。这是一个非常长的字符串,大部分的元素将是不必要的。
所以让我们做一个数组LoY[31][2](变体a))或LoY[2][31](变体b))。
很明显,ArrayFill() 将在变量b中绘制一条线。第二行将简单地连接第一行,在第一行的最后一个元素LoY[0][31] 之后,ArrayFill() 中数组的第一行将继续是LoY[0][32],并将以LoY[0][62] 而ArrayFill() 中的数组元素的值将按以下顺序进行,从索引0到31的数组元素将被填入价格值,从索引32到最后将被填入0 。
问题:ArrayFill() 如何将选项a)画成1行?毕竟,在这个变体中,有28行。如果是一行,它将以何种顺序包含数组元素的值?还有,在 ArrayFill()将 二维数组 转换为一维数组 后,我是否可以用Print()来打印二维数组的元素 ?这个函数本身并不返回任何值,所以 Print()如果插入其中,也不会打印。
谢谢你的帮助。
我在这里搞砸了一点......我为自己感到羞愧。
数组元素 填充一个Bid值。我可以用2个选项来填充
a) LoY[31][0]=Bid; - 我将第31行和数组的第一列填充为Bid 值。第二维度(索引1下的列,默认为0,因为我没有填充它。所以在这个变体中,我的第一 维度有31个填充元素,第二维度有1个。
b) LoY[0][31]=Bid - 我用Bid值填充31列和数组的第一行。 而第二维度(索引1下的行,默认情况下填充为0,因为我没有填充它。因此,在这个变体中,第二维度由31个填充元素组成,第二维度由1组成。
ArraySort()只对二维数组的第一维进行排序。因此,它将对选项a)进行排序其中第一维有31行,不会对选项b)进行排序,其中第一维只有1行,因为1行不能被排序。
现在ArrayFill() 它在给二维数组的元素赋值之前,将二维数组拉成一行。也就是说,它要把我的数组LoY[31][31] 拉成一个大小为961个元素的单行。这是一个非常长的字符串,大部分的元素将是不必要的。
所以让我们做一个数组LoY[31][2](变体a))或LoY[2][31](变体b))。
很明显,ArrayFill() 将在变量b中绘制一条线。第二行将简单地连接第一行,在第一行的最后一个元素LoY[0][31] 之后,ArrayFill() 中数组的第一行将继续是LoY[0][32],并将以LoY[0][62] 而ArrayFill() 中的数组元素的值将按以下顺序进行,从索引0到31的数组元素将被填入价格值,从索引32到最后将被填入0 。
问题:ArrayFill() 如何将选项a)画成1行?毕竟,在这个变体中,有28行。如果是一行,它将以何种顺序包含数组元素的值?还有,在 ArrayFill()将 二维数组 转换为一维数组 后,我是否可以用Print()来打印二维数组的元素 ?这个函数本身并不返回任何值,所以 Print()如果插入其中,也不会打印。
谢谢你的帮助。
我很难理解你。也许这就是我不能正确理解它的原因。用LoY[5][3]阵列重复问题,即5行3列。
ArrayFill不会以任何方式转换初始数组。只对数组进行处理,就像一个一维数组被放在那里一样。该函数对数组进行了必要的操作,并在不影响维度的情况下回落。
根据文档,ArrayFill(LoY, 3, 6, 12) 函数将只为数组LoY 中索引为1和2的行填充值12。
LoY[1][0]将被填充为12。
LoY[1][1]将有值 12。
LoY[1][2]的 值将是12。
LoY[2][0]的值将是 12。
LoY[2][1]的值将是 12 。
LoY[2][2]将被设置为 12 。
其他所有的人都将不被触及。
用一个小数组和容易理解的数字进行实验。例如,12和8,你会很容易注意到哪个更大。而1.123654和1.123583则更为复杂。
ArrayFill不会 以任何方式转换原始数组。它只像处理一维数组那样处理数组。该函数对数组进行了必要的操作,并在不影响维度的情况下将其转储。
这大大减少了我的误解,增加了我的理解。现在我将在考虑到新发现的情况下重新分析我所写的一切....。
根据文档,函数ArrayFill(LoY, 3, 6, 12) 只会将LoY 数组中索引为1和2的行填充为数值12。
LoY[1][0]将有一个12的值。
LoY[1][1]将有值 12。
LoY[1][2]的 值将是12。
LoY[2][0]的值将是 12。
LoY[2][1]将有一个 12 的值。
LoY[2][2]将被设置为 12 。
问题
如果我需要将同一个数组的黄色元素填充为数值12,我应该如何在ArrayFill()中输入什么数值?
方案N 1
方案N 2