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

 

1.我有这样一个问题,如何通过内存删除数组中的一个元素,目前我是通过循环对数组进行数学移位来删除一个元素,在mql4中是否可以?如果可以的话,请举例说明在一维数组上是如何做到这一点的。

2.另外,考虑到:如果我通过内存删除,切出一个有不必要元素的段,数组会减少,其数量会因删除项的价值而减少,在接下来使用数组时,我们将不得不把数组恢复到原来的状态;如果我通过数学方法删除,处理的周期,是在不断计算给变量赋值,这又会影响程序的负载?

 
Seric29:

1.我有这样一个问题,如何通过内存删除数组中的一个元素,目前我是通过循环对数组进行数学移位来删除一个元素,在mql4中是否可以?如果可以的话,请举例说明在一维数组上是如何做到这一点的。

2.另外,考虑到如果通过内存删除,切出一个有不必要元素的数组,数组会减少,其数量会因删除的项目的价值而减少,在接下来使用数组时,我们将不得不把数组恢复到原来的状态;如果通过数学方法删除,处理的周期,涉及不断计算给变量赋值,这反过来会影响程序?

只需将数组 "复制 "到自己体内,并通过不需要的元素数量减少数组的大小。

要插入一个单一的元素,只需增加尺寸,再次复制 "到自身",并将所需的值粘贴到自由空间。

 
Alexey Viktorov:

只需将数组 "复制到自身",并通过不必要的元素数量减少数组的大小。

要插入一个单一的元素,只需增加尺寸,再次复制 "到自身",并在自由空间粘贴所需的值。

我试着将一个三维数组插入复制函数中,没有任何错误,所以这个函数可以与不同维度的数组一起工作,或者只是对不同维度的数组有重复。事实证明,这个函数可以代替shift函数,不需要自己写,真希望我早点想到,把一个数组复制到 自己身上有多大的风险,上面写着结果可能不被定义。

 
Seric29:

我试着在复制函数中插入一个三维数组,没有错误,所以这个函数可以与不同维度的数组一起工作,或者只是对不同维度的数组有重复。事实证明,这个函数可以代替shift函数,不需要自己写,真希望早点想到,本身复制一个数组有多大的风险,上面写着结果可能不被定义。

当复制一个多维数组 时,你必须考虑第二维和后续维度的尺寸。这决定了你在复制时要转移多少。简单地说,按照我在实验中的理解,多维数组的所有数值在 "一行 "中排好,然后在 "一列 "中再排好。

总而言之,我现在无法复述这个理论。如果我需要使用它,我必须再次检查。

 
Alexey Viktorov:

当复制一个多维数组 时,必须考虑到第二维和后续维度的尺寸。这决定了复制时需要多少移位。简单地说,按照我在实验中的理解,多维数组的所有数值在 "一行 "中排成一列,然后在 "列由... "中再排成一列。

一般来说,我现在无法复述这个理论。同样,如果有必要使用它,就必须进行检查。

在C++中,这一点没有区别

   вывести в консоль massiv[0][0][0]
   или так
   вывести в консоль massiv[0]

在任何这些情况下,都会有一个输出。因为它们位于一个内存块中,C++直接访问它们,而在我们的shell中,内存访问是封闭的,没有办法正确地将不同维度的数组传递到一个函数中,也没有办法这样寻址,唯一的细微差别是,在C++中多维数组位于动态内存中,甚至可能是分散的,虽然没有人看到电子地图。因此,通过概念本身来复制多维数组是一个非常微妙的问题,否则可能无法正确工作?

 
如何以编程方式确定我是用投资密码还是交易密码登录我的账户?
 

我的指标中有一段代码在MQL5中没有被执行

void KValues(int i)
  {
   vhigh = 0; vlow = High[i];
   int limit = i + (int)kperiod;
   for(int a = i; a < limit; a++)
     {
      vhigh = ((price == STO_LOWHIGH ? High[a] : Close[a]) > vhigh ? (price == STO_LOWHIGH ? High[a] : Close[a]) : vhigh);
      vlow  = ((price == STO_LOWHIGH ? Low[a] : Close[a]) < vlow ? (price == STO_LOWHIGH ? Low[a] : Close[a]) : vlow);
     };
  }

问题是,如果价格= =STO_LOWHIGH ,一切都能正常工作,但如果价格== STO_CLOSECLOSE,该函数只赋值给静态变量

vhigh = 0; vlow = High[i];

...绕过循环

 
Alexandr Sokolov:

我的指标中有一段代码在MQL5中没有被执行

问题是,如果价格= =STO_LOWHIGH ,一切都能正常工作,但如果价格== STO_CLOSECLOSE,该函数只赋值给静态变量

...绕过循环

圆括号有问题。在我看来,它们在这里根本就没有必要。这些都是完全没有必要的。

或者至少把问号前的高亮部分移到左边。

void KValues(int i)
  {
   vhigh = 0; vlow = High[i];
   int limit = i + (int)kperiod;
   for(int a = i; a < limit; a++)
     {
      vhigh = ((price == STO_LOWHIGH ? High[a] : Close[a]) > vhigh ? (price == STO_LOWHIGH ? High[a] : Close[a]) : vhigh);
      vlow  = ((price == STO_LOWHIGH ? Low[a] : Close[a]) < vlow ? (price == STO_LOWHIGH ? Low[a] : Close[a]) : vlow);
     };
  }

一般来说,你只需要理解?: 操作符等同于if else

你有一个条件两次。这样的条件就足够了

vhigh = price == STO_LOWHIGH ? High[a] : Close[a];
vlow  = price == STO_LOWHIGH ? Low[a] : Close[a];
或者说我不明白你想表达的意思。
 
Alexey Viktorov:

支架有问题。在我看来,这里根本就不需要这些东西。他们都不是。

或者至少在问号前把高亮的内容移到左边。

一般来说,你只需要理解?: 操作符等同于if else

你有一个条件两次。这样一个条件就足够了。

或者说我不明白你想表达的意思。

我想通过Low/High和Close/Close得到K周期内正常的maxHigh和minLow随机指标。

在初始化过程中,低/高可以正常工作,但关/闭不能正常工作。

 
Alexey Viktorov:

支架有问题。在我看来,这里根本就不需要这些东西。他们都不是。

或者至少在问号前把高亮的内容移到左边。

一般来说,你只需要理解?: 操作符等同于if else

你有一个条件两次。这样的条件已经足够了。

或者说我不明白你想表达的意思。

我没有马上明白,但如果你是指这个。

void KValues(int i)
  {
   vhigh = 0; vlow = High[i];
   int limit = i + (int)kperiod;
   for(int a = i; a < limit; a++)
     {
      vhigh = ((price == STO_LOWHIGH) ? High[a] : Close[a] > vhigh ? (price == STO_LOWHIGH) ? High[a] : Close[a] : vhigh);
      vlow  = ((price == STO_LOWHIGH) ? Low[a] : Close[a] < vlow ? (price == STO_LOWHIGH) ? Low[a] : Close[a] : vlow);
     };
  }

它并不能解决我的问题。

原因: