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

 
andrey46:
我不知道为什么策略测试器中的专家顾问工作正常,下了订单,等等,但在真实账户 中,虽然机器人是活跃的,但订单却没有下。

你必须阅读该杂志,可能有一个答案

 

你能告诉我如何得到这个吗?

double w = 18.2

得到这个--

int w = 18
 
TrederMT5:

你能告诉我如何得到这个吗?

得到这个--

int w1;
double w = 18.2;
w1=(int)w;
w=round (w);

一个明确的类型转换。

你也可以从一个非整数四舍五入一个整数,但双数将是18.0

 
scomoroh:

然后,我将重复这个问题。

表达方式

if (izmb>b ||izmb<b || izms>s || izms<s)

与此相同。

if (izmb!=b || izms!=s)

如果你想存储一些东西,就把它放在全局变量 中。

这是在函数主体之外声明的。

int izmb=0, izms=0;


void OnTick()
   {
   .........
 
Valeriy Yastremskiy:


谢谢你
 

祝大家今天愉快

关于MQL4的问题。下面是一个简单的代码

double LoY[31][31],LoU,LoU1;
int S,S1,S2;
void OnTick()
{
if (Minute()==20&&Minute()!=S1)
{
ArrayFill(LoY,0,31,0.5555);
S1=Minute();
}
//***************************************************************
if (Minute()!=S)
{
LoY[0][0]=Bid;
ArraySort(LoY,WHOLE_ARRAY,0,MODE_ASCEND);
Print("----LoY[0][1]-- Горизонтально ---  [0}  ",  LoY[0][0],"  [1] ",   LoY[0][1],"  [2] ",   LoY[0][2],"  [3] ",   LoY[0][3],"  [4] ",   LoY[0][4],"  [26] ",   LoY[0][26],"  [27] ",   LoY[0][27],"  [28] ",   LoY[0][28],"  [29] ",   LoY[0][29],"  [30] ",   LoY[0][30]);
Print("----LoY[1][0]-- Вертикалььно ---  [0}  ",  LoY[0][0],"  [1] ",   LoY[1][0],"  [2] ",   LoY[2][0],"  [3] ",   LoY[3][0],"  [4] ",   LoY[4][0],"  [26] ",   LoY[26][0],"  [27] ",   LoY[27][0],"  [28] ",   LoY[28][0],"  [29] ",   LoY[29][0],"  [30] ",   LoY[30][0]);
S=Minute();
}
}

它创建了一个二维数组,并将数值填入其中。代码中有两个函数让我感兴趣--ArrayFill(LoY,0,31,0.5555);和ArraySort(LoY,WHOLE_ARRAY,0,MODE_ASCEND);根据参考手册,这两个函数都适用于二维数组。ArrayFill()严格地对水平 填充的数组工作 参考书中规定它严格地从左到右(而不是从上到下或从下到上) 填充数组 的值 ArraySort()对二维数组按第一维排序。参考文献没有说它是对水平填充或垂直填充的数组进行排序。从我的代码的执行情况来看,ArraySort() 对垂直填充的数组进行排序。似乎这两个函数不能在一个程序中处理一个相同的数组。

问:对我来说,ArraySort()函数能正确工作是很重要的。 那么,ArraySort() 能否被配置为 对水平填充的数组进行排序,ArrayFill() 就能 工作?或者MQL5中的排序功能,在MQL4中也可以使用,可以帮助我代替吗?或者是否有一个函数可以将一个水平填充的数组及其所有的值转换为一个垂直的数组,简而言之,如何使我的程序对一个数组进行水平 排序

请注意。使用一个循环 而不是ArrayFill()对我来说不起作用

谢谢你的帮助。

 
ANDREY:

祝大家今天愉快

关于MQL4的问题。下面是一个简单的代码

它创建了一个二维数组,并将数值填入其中。代码中有两个函数让我感兴趣--ArrayFill(LoY,0,31,0.5555);和ArraySort(LoY,WHOLE_ARRAY,0,MODE_ASCEND);根据参考手册,这两个函数都适用于二维数组。ArrayFill()严格地对水平 填充的数组工作 参考书中规定它严格地从左到右 填充数组 中的值(不是从上到下或从下到上)。 ArraySort()对二维数组按第一维排序。参考文献没有说它是对水平填充或垂直填充的数组进行排序。从我的代码的执行情况来看,ArraySort() 对垂直填充的数组进行排序。似乎这两个函数不能在一个程序中处理一个相同的数组。

问:对我来说,ArraySort()函数能正确工作是很重要的。 那么,ArraySort() 能否被配置为 对水平填充的数组进行排序,ArrayFill() 就能 工作?或者MQL5中的排序功能,在MQL4中也可以使用,可以帮助我代替吗?或者是否有一个函数可以将一个水平填充的数组及其所有的值转换为一个垂直的数组,简而言之,如何使我的程序对一个数组进行水平 排序

请注意。使用一个循环 而不是ArrayFill()对我来说不起作用

谢谢你的帮助。

你是否注意到

备注

阵列填充

多维数组 在用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(LoY,0,31,0.5555);

将准确地用一行来填充数组。

至于垂直度/水平度,这是你如何抱着你的头看入口。看一下Excell表,一切都会变得清晰。如果 "A "列被填满了数值,你会得到一个一维数组。它是如何安排的?对......水平的,因为我是躺在沙发上看的.........。

 
Alexey Viktorov:

你是否注意到

备注

这条线

将准确地用一行来填充数组。

至于垂直度/水平度,这是你如何抱着你的头看入口。看一下Excell表,一切都会变得清晰。如果 "A "列被填满了数值,你会得到一个一维数组。它是如何安排的?对......水平的,因为我是躺在沙发上看的.........。

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

我的代码中所说的水平二维数组是指当索引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()函数 在这种情况下不起作用?毕竟,我要求它在第20分钟时用相同的数值0.5555来填充数组的第一维(31项)。
谢谢你的帮助。

 
MakarFX:

我想试试这个。

谢谢你的帮助。我会试一试的。

 
Aleksei Stepanenko:

表示

与此相同。

如果你想存储一些东西,就把它放在全局变量 中。

这是在函数主体之外声明的。

我们想检查进入EA的搜索条件,而不是每一个tick,而是只有当另一个订单被另一个EA或手动打开或关闭时(为了避免处理器上不必要的负载)。这就是为什么我们需要检查订单的数量是否与每个tick对应。

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

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