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

 
trader781:

那么请回答我之前的问题

1) 编写一个结构数组

2) 转移到其他职能部门

3) 检索和比较一个数组 结构的元素

4) 打印一个结构阵列

对我来说,以代码的形式写出来是很重要的,这样我就能理解它必须是什么样子的。

这一切都取决于手头的任务。既然任务可以随心所欲,那么应该显示什么?

好吧,我写吧,我浪费我的时间,我写的东西是方的。而这个洞是三角形的。那我该把方形的放在哪里呢?

 
Artyom Trishkin:

这一切都取决于手头的任务。既然任务可以随心所欲,那么应该显示什么?

好吧,我写吧,浪费我的时间,但我所写的是正方形。而这个洞是三角形的。那我该把方形的放在哪里呢?

让我们来看看699号帖子和关于

如何将其传递给其他函数并将结构中的一个元素与前一个元素进行比较

所以我可以按顺序采取任何顺序,并将所有的值输出到印刷品中。

不同的是,它不是一个数字,有不同的记录规则。

 
trader781:

让我们来看看699号帖子和关于

如何将其传递给其他函数,并将结构元素与前者进行比较

因此,我可以按顺序取任何订单并打印所有的值

不同的是,它不是一个数字,适用不同的写作规则。

你需要循环浏览所有必要的订单。

在确定了下一个必要的订单后,你将数组增加1,并将这个订单的所有数据记录在其新单元格中。数组单元格本身充满了订单的开仓时间(如果你搜索的是已关闭的订单,那么就是关闭时间)。其余的数据应该被写入结构的字段中。

循环结束后,按照数值的升序对数组进行排序。

你应该先做这个。其余的可以进一步讨论。

 
Vitalie Postolache:

这不是一个可以在一个周期内解决的问题。

谢谢你。

 
Artyom Trishkin:
//+------------------------------------------------------------------+
//|                                                         test.mq4 |
//|                        Copyright 2014, MetaQuotes Software Corp. |
//|                                              http://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2014, MetaQuotes Software Corp."
#property link      "http://www.mql5.com"
#property version   "1.00"
#property strict
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
struct myorder
  {
   int               Ticket;
   double            orderopenprice;
   int               ordertype;
   double            profit;
   double            stoploss;
   double            lot;
  };
myorder orders[][5];

int    i;
int    Magic=444;
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//---

//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---

  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
   CalcOrders();

  }
//+------------------------------------------------------------------+
void CalcOrders()
  {
   int count1=-1;
   ArrayResize(orders,AccountInfoInteger(ACCOUNT_LIMIT_ORDERS),10);
   for(i=OrdersTotal()-1; i>=0; i--)
     {
      if((OrderSelect(i,SELECT_BY_POS,MODE_TRADES)) && (OrderSymbol()==Symbol())
         && (OrderMagicNumber()==Magic) && (OrderType()<2))
        {
         count1++;
         orders[count1][0].Ticket=OrderTicket();
         orders[count1][1].lot=OrderLots();
         orders[count1][2].orderopenprice=OrderOpenPrice();
         orders[count1][3].ordertype=OrderType();
         orders[count1][4].profit=OrderProfit();
         orders[count1][5].stoploss=OrderStopLoss();
        }

     }
   ArraySort(orders,WHOLE_ARRAY,0,MODE_ASCEND);

  }
//+------------------------------------------------------------------+
附加的文件:
test.mq4  3 kb
 
trader781:

我把你的代码放在你的帖子里。

现在,如果你开始理清它

  1. 你为什么要把结构数组做成多维数组?
  2. 为什么你把函数CalcOrders()中结构数组的大小改为"允许的最大挂单数"?如果你打开你的帮助(你应该总是这样做),你会看到这个标识符(ACCOUNT_LIMIT_ORDERS)可以返回0,这意味着对挂单的 数量没有限制。在循环之前,数组的大小应该为零。
  3. 为什么你不在循环中增加数组的大小?
 
Artyom Trishkin:

我把你的代码放在你的帖子里。

现在,如果你开始理清它

  1. 你为什么要把结构数组变成多维数组?
  2. 为什么在CalcOrders()函数中把结构数组的大小改为"允许的最大有效挂单数"?如果你打开你的帮助(你应该总是这样做),你会看到这个标识符(ACCOUNT_LIMIT_ORDERS)可以返回0,这意味着对挂单的 数量没有限制。在循环之前,数组的大小应该为零。
  3. 为什么你不在循环中增加数组的大小?

1)认为X顺序Y参数数更适合于给定的任务

2)根据账户类型,我把它设为50或100,其他的都没有。

3) 所以,如果count1++;每次都会增加,并且数组会获得其值

 
trader781:

1)认为X阶Y参数数更适合这项任务

2)根据账户类型,它等于50或100,没有其他含义。

3) 所以,如果count1++;每次都会增加,并且数组会获得其值

1.那么结构是什么?

2.你需要这个参数来获得 "什么去了,什么又去了 "的市场位置阵列...循环之前的数组必须有一个零 的大小。

3.这就对了。该数组在开始时的大小为零。每找到一个新的订单,数组的大小就会与你所需要的订单数量相等。

 
Artyom Trishkin:

1)那么结构是什么?

2.你需要这个参数用于市场头寸阵列 "什么去了,什么来了"。循环之前的数组必须有一个零 的大小。

3.这就对了。该数组在开始时的大小为零。每找到一个新的订单,数组的大小就会与你所需要的订单数量相等。

1)如果不放第二个维度,编译器会抱怨,"指定类类型,未知参数 "会立即弹出

2)机器人会在发射时立即死亡,说 "关键错误阵列超出范围"。

3)设置int count1=-1;然后进行循环这里有什么问题吗?

 
trader781:

1)如果没有设置第二个维度,编译器会抱怨。

2)那么机器人将在启动时立即死亡,提示 "关键错误阵列超出范围"

3) 立即设置int count1=-1; 这里有什么问题?

它只是告诉你,其中一个尺寸应该被删除。你正在声明一个一维数组,想把它写成一个二维数组。你最后会得到什么?当然,你会从编译器那里得到一个错误。

2.你必须在循环中正确地填充数组,而不是只给它一些随机大小的变量,然后把一些随机大小的东西塞进它。

3.是你把变量设置为-1。而且在循环之前,数组的大小必须为零。这里有什么不清楚的?

我们来玩一个联想游戏。

  • 想象一下,你有一个放气的气球(空数组),其内部体积为零(数组大小为零)。在这个气球里面(在数组中),你要把硬币(你想要的订单)。在这里,每一枚硬币,一旦你决定它适合存放在气球里(每找到一个想要的订单),就会增加气球的内部体积(只有硬币本身会拉伸气球,你需要自己去做--增加数组大小1,然后把一个订单塞进去)。
    最后,当你找到所有的硬币并把它们塞进球里时,它不会被放气--它的内部体积已经被硬币拉大了(在搜索周期结束时,数组的大小将等于找到的必要订单的数量,因为你每找到一个必要订单,数组的大小就增加1)。

    现在想象一下,你最初不是把你的硬币放进一个球里,这个球是橡胶的,可以改变它的大小,而是放进一个小钱箱里,这个钱箱的大小是有限制的(你最初设定了数组的大小,没有进一步增加)。将会发生什么?不是所有的硬币都能放进储蓄罐。气球将。

这里有一个协会给你。
原因: