初学者的问题 MQL4 MT4 MetaTrader 4 - 页 124

 
Игорь:
你好!
你能告诉我如何在不使用模板的情况下在mt4中重新绘制条形图吗!?
或者如何应用一个颜色方案!?
上下文菜单 图表、属性、颜色--你试过吗?
 
Ihor Herasko:

为了避免混淆,我将把答案简化一下。(&)号表示一个函数参数可以在运行时改变其值,并将以不同的值返回到函数被调用的地方。在这个案例中,SaveOrder函数可以改变g_arrstBuyOrderInfo和g_arrstSellOrderInfo数组的内容,以及g_nBuyOrdersCnt和g_nSellOrdersCnt变量。

谢谢你。它变得更清晰了一些。只是不知道在不参考论坛的情况下如何能发现这一切。我在教程中没有找到这样的解释。

请再给我一些建议。

1) 编译器写道 -'g_nBuyOrdersCnt' - 没有类型的声明; 'g_nSellOrdersCnt' - 没有类型的声明。我认为g_nBuyOrdersCnt和g_nSellOrdersCnt 应该全局声明,以避免编译器出错,这样的假设是否正确?

2) 编译器:'for' - 表达式在全局范围内是不允许的。这里并不清楚。

3) 在void SaveOrderInfo(OrderInfo &arrstOrderInfo[], int &nOrdersCnt) 函数中,编译器写道:'arrstOrderInfo'的声明隐藏了全局声明。见之前的'arrstOrderInfo'的声明。这一点也不是很清楚。

4)'nOrderCnt'是一个未声明的标识符。为什么没有在任何地方宣布呢?

最后一件事:我仍然不明白.n.f 从何而来,它们是什么。




 
Игорь:

你好!

你能告诉我如何在不使用模板 的情况下在mt4中重新绘制条形图吗!?

或者如何应用一个颜色方案!?

如果以编程方式,请参阅ChartSetInteger()和ChartGetInteger()函数。

 
novichok2018:

谢谢你。这开始有点意义了。只是不知道如果不参考论坛,你如何能发现这一切。我在教科书中找不到这样的解释。

请再给我一些建议。

1) 编译器写道 -'g_nBuyOrdersCnt' - 没有类型的声明; 'g_nSellOrdersCnt' - 没有类型的声明。我认为g_nBuyOrdersCnt和g_nSellOrdersCnt 应该全局声明,以避免编译器出错,这样的假设是否正确?

2) 编译器:'for' - 表达式在全局范围内是不允许的。这里并不清楚。

3) 在void SaveOrderInfo(OrderInfo &arrstOrderInfo[], int &nOrdersCnt) 函数中,编译器写道:'arrstOrderInfo'的声明隐藏了全局声明。见之前的'arrstOrderInfo'的声明。这一点也不是很清楚。

4)'nOrderCnt'是一个未声明的标识符。为什么没有在任何地方宣布呢?

如果你把代码看成是一个整体,下面是它在代码中应该有的样子。

#property strict

input       int i_nMagicNumber = 12876;

#define  MAX_ORDERS_CNT   int(500)
struct OrderInfo
{
   int      nTicket;
   int      nType;
   double   fOpenPrice;
   double   fSL;
   double   fTP;
   datetime dtOpenTime;
};

int         g_nBuyOrdersCnt, 
            g_nSellOrdersCnt;

OrderInfo   g_arrstBuyOrderInfo[MAX_ORDERS_CNT], 
            g_arrstSellOrderInfo[MAX_ORDERS_CNT];

//+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
//| Expert initialization function                                                                                                                                                                    |
//+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
int OnInit()
{
   return INIT_SUCCEEDED;
}
//+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
//| Expert deinitialization function                                                                                                                                                                  |
//+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
void OnDeinit(const int reason)
{
}
//+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
//| Expert tick function                                                                                                                                                                              |
//+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
void OnTick()
{
    FindOrders();
}
//+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
//| Fills the orders arrays                                                                                                                                                                           |
//+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
void FindOrders()
{
   g_nBuyOrdersCnt = 0;
   g_nSellOrdersCnt = 0;
   for (int i = OrdersTotal() - 1; i >= 0; --i)
   {
      if (!OrderSelect(i, SELECT_BY_POS))
         continue;
   
      if (OrderSymbol() != Symbol())   // Если нужны ордера только по текущему символу, к графику которого прикреплен советник
         continue;
   
      if (OrderMagicNumber() != i_nMagicNumber)  // Если имеется входной параметр советника i_nMagicNumber, в котором указан ID ордеров советника
         continue;
   
      if (OrderType() == OP_BUY)
         SaveOrderInfo(g_arrstBuyOrderInfo, g_nBuyOrdersCnt);
      if (OrderType() == OP_SELL)
         SaveOrderInfo(g_arrstSellOrderInfo, g_nSellOrdersCnt);
   }
}
//+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
//| Saves one selected order in the specified array                                                                                                                                                   |
//+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
void SaveOrderInfo(OrderInfo &arrstOrderInfo[], int &nOrdersCnt)
{
   if (nOrdersCnt >= MAX_ORDERS_CNT)
      return;

   arrstOrderInfo[nOrdersCnt].nTicket = OrderTicket();
   arrstOrderInfo[nOrdersCnt].nType = OrderType();
   arrstOrderInfo[nOrdersCnt].fOpenPrice = OrderOpenPrice();
   arrstOrderInfo[nOrdersCnt].fSL = OrderStopLoss();
   arrstOrderInfo[nOrdersCnt].fTP = OrderTakeProfit();

   ++nOrdersCnt;
}
 
novichok2018:

最后一件事:我仍然不明白.n.f 从何而来,它们是什么。

"点 "运算符表示对结构或类的成员的访问。在这种情况下,它是一个结构。

字母n和f是指定存储在变量中的数据类型的一种方式。毕竟,面对大量的变量,不可能记住每个变量的类型。如果在一个变量的名字里有它的类型指示,记忆的必要性就会消失。n是一个整数的符号(来自Numeric),f是一个实数(来自float - 浮点数)。这种书写变量名的方式被称为匈牙利 符号。

 
Ihor Herasko:

点运算符表示对一个结构或类的成员的访问。在这种情况下,一个结构。

字母n和f是指定存储在变量中的数据类型的一种方式。毕竟,面对大量的变量,不可能记住每个变量的类型。如果在一个变量的名字里有它的类型指示,记忆的必要性就会消失。n是一个整数的符号(来自Numeric),f是一个实数(来自float - 浮点数)。这种变量名的记号方式被称为匈牙利记号

原来g_g_n 并不只是一些缩写,而是表示它们是全局和全局整数变量的前缀!!。呃...我也搞不清楚为什么这些破折号会出现在变量名称中...对于一个不熟悉这些细微之处的初学者来说,怎么可能使用数组、结构等编写代码呢?我认为我的简单策略可以用简单的语言写出来,而不必潜入荒野。

你能给我一个关于mcl4的详细(扩展)教程的链接,让我在学习你的建议的同时学习吗?

那你能不能在不使用匈牙利符号进行比较的情况下编写上述代码?你确定MT4平台能清楚地理解它吗?


还有一个关于代码的问题:continue;的作用 是什么

for (int i = OrdersTotal() - 1; i >= 0; --i)
   {
      if (!OrderSelect(i, SELECT_BY_POS))
         continue;
如果一个订单在第一次迭代中没有被选中,那么它就不会在随后的迭代中被选中,循环将无限期地继续下去?因为订单的数量并没有变化。用错误信息中断 不是更正确吗?
 
STARIJ:
上下文菜单图形、属性、颜色--你试过吗?

谢谢你,我已经找到了它!!。

 
Ihor Herasko:

如果以编程方式,请参阅ChartSetInteger()和ChartGetInteger()函数。

谢谢你已经在你的帮助下找到了它!!。

 
novichok2018:

原来g_g_n 并不只是一些缩写,而是前缀,表示它们是全局和全局的整数变量!!!。呃...我也搞不清楚为什么这些破折号会出现在变量名称中...对于一个不熟悉这些细微之处的初学者来说,怎么可能使用数组、结构等编写代码呢?我认为我的简单策略可以用简单的语言写出来,而不必潜入荒野。

为了做一些事情,我们必须深入研究其中的奥妙。没有其他办法。

你能给我一个关于mcl4的详细(扩展)教程的链接,让我在学习你的建议的同时学习吗?

我只知道一本关于MQL4的教科书--谢尔盖-科瓦廖夫 的那本。

那你能不能在不使用匈牙利符号进行比较的情况下编写上述代码?你确定MT4平台能清楚地理解它吗?

马上就能习惯正确的代码格式了))匈牙利语记号是由相当有经验的程序员发明的。

还有一个关于代码的问题:continue;的作用 是什么

那么,如果一个订单在第一次迭代中没有被选中,那么它在接下来的迭代中也不会被选中,循环会一直持续到无穷大?因为订单的数量并没有变化。用错误信息中断 不是更正确吗?

如果我们未能选择一个订单,这并不意味着我们将无法选择下一个订单。因此,继续循环是合理的。

Учебник по MQL4
Учебник по MQL4
  • book.mql4.com
В настоящее время персональный компьютер стал незаменимым помощником в жизни каждого человека. Благодаря развитию Интернета и увеличению мощности современных компьютеров открылись новые возможности во многих областях деятельности. Ещё десять лет назад торговля на финансовых рынках была доступна только банкам и узкому кругу специалистов. Сегодня...
 
Ihor Herasko:

未能选择一个订单并不意味着不能选择下一个订单。因此,继续循环是合理的。

而且没有必要显示错误信息?也许知道为什么找不到订单以及如何避免会有帮助?