新人对MQL4和MQL5的任何问题,对算法和代码的帮助和讨论 - 页 1423

 

那么你是否尝试过将变量变成全局变量?

int izmb=0, izms=0;

void OnTick()
   {
   double LB=0,LS=0;
   int b=0,s=0;
   
   for(int i=0; i<OrdersTotal(); i++)
      {    
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
         { 
         if(OrderSymbol()==Symbol())
            { 
            if(OrderType()==OP_BUY)             
               {  
               LB+=OrderLots();
               b++; 
               }                                         
            else if(OrderType()==OP_SELL)        
               {
               LS+=OrderLots();
               s++;
               } 
            }
         }     
      }
   if(izmb!=b || izms!=s)
      { 
      izmb=b;
      izms=s 
           // далее идут условия для открытия ордера.
      }
 
scomoroh:

我们想检查寻找EA的条件,不是每一个tick,而是只有当另一个订单被另一个EA或手动打开或关闭时(这样处理器才不会过载)。这就是为什么我们需要检查订单的数量是否与每个tick对应。

我们可以使用静态变量吗? 程序在这样的形式下能工作吗?

另外,最简单、最容易的条件是

OnTrade() 是mt4与mt5的一个类似物。

void OnTrade()
 {
  ... // сюда код, который будет работать только по изменению ситуации по счёту: открытие/закрытие позиций, установка/удаление ордеров
 }

static _OTotal = -1;
static _HTotal = -1;
int OT=OrdersTotal();
int HT=OrdersHistoryTotal();
  if(OT!=_OTotal || HT!=_HTotal) // если изменилось - выполняем
   {
     OnTrade(); // здесь дёргаем текущую ситуацию на счёте и заполняем структуры
     _OTotal=OrdersTotal(); // запомним текущее количество
     _HTotal=OrdersHistoryTotal(); // запомним количество в истории
   }
 
ANDREY:

谢谢你的答复。我理解你写的一切。但我没有理解你写的东西在我的问题上的含义。

我的代码中所说的水平二维数组是指当索引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[,,]。

后面三个维度的尺寸必须在声明中指定并固定下来,而第一个维度可以不指定,以后再更改。

int arr[,100,200,500];

在一个二维数组的例子中,数组中的数据排列如下。

int arr[2,5]={0,1,2,3,4,  - в нулевом элементе первого измерения 
              5,6,7,8,9}; - в первом элементе первого измерения

排序通过对第一个维度进行排序来移动整个水平面。

ArrayFill()从一个元素填充到另一个元素,例如从3填充到8这就造成了混乱。

如果你想通过第一个维度在水平方向上填充一些数值,你必须控制填充的开始和结束,知道数据是如何排列的。

例如,第一维度的零元素的整个尺子。

int value=5;
int index=0;
ArrayFill(arr, index*ArrayRange(arr,1), ArrayRange(arr,1), value); 

如果只有一个零元素,那么就这样。

ArrayFill(arr, index*ArrayRange(arr,1), 1, value); 

如果有许多零元素,那么通过循环和简单的赋值。


我一定没有解释得很清楚......。使用打印机,在循环中打印所有的东西,这样做,那样做,你就会掌握它了。这样你会学得更快。

printf是我的朋友!

 
Alexey Viktorov:

MQL4可以处理不超过4维的数组。因此,arr[31][31]是一个错误。一个数组的大小不能超过arr[][4]。而第一个维度 不是由MQL限制 的,而是由什么限制的,我不太清楚。也许有人可以解释一下。


而第一个维度(即字符串的数量)是由多少个限制的?MQL4 允许多维数组 中的行数不超过多少

 

我认为四个维度都有一个限制:INT_MAX

关于结构。

二维的。

该结构表示一个一维数组,其中元素的排列方式如下:首先是第一行,然后是第二行,然后是第三行。

三维的。

在三维方面,也是如此。它是一个一维数组,第一行是一个接一个,然后是第二,.....

为什么是一维的? 因为在计算机内存中,一排的几个单元格被分配给了数组,所以他们把所有的东西都按顺序写入其中:row00+row01+row02+row10+row11....


而且还可以增加第四个维度--堆叠的三维阵列片。

在程序过程中,只有行数可以改变。所有的行、列、表和堆栈都只是理解结构的一种惯例。这些尺寸实际上不在我们的空间里,它们只是测量。

正如阿列克谢所说。

Alexey Viktorov:

...列...是...水平的,因为我是躺在沙发上看的.........。

 
Alexey Viktorov:

你是否注意到以下说明

阵列填充

多维 数组在用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则更为复杂。

 
Alexey Viktorov:

ArrayFill不会 以任何方式转换原始数组。它只像处理一维数组那样处理数组。该函数对数组进行了必要的操作,并在不影响维度的情况下将其转储。


这大大减少了我的误解,增加了我的理解。现在我将在考虑到新发现的情况下重新分析我所写的一切....。

 
Alexey Viktorov:


根据文档,函数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


谢谢你的帮助。
原因: