English
中文
日本語
ID
Vietnam
한국어
Filipino
 
   学院导航

外汇MQL4中如何统计当前交易账户的所有订单

MQL4 Order Counting Functions

了解我们的 EA 有多少订单以及这些未结订单的类型(例如买入或卖出)非常有用。 因此,创建一个订单计数函数非常有用,该函数可以根据订单类型计算当前未结订单的数量。 在这篇 MQL4 订单计数函数文章中了解如何操作。

MT4代码段

int OrdersTotalMagicOpen() {
int OrderCount = 0;
for (int l_pos_4 = OrdersTotal() – 1; l_pos_4 >= 0; l_pos_4–) {
OrderSelect(l_pos_4, SELECT_BY_POS, MODE_TRADES);
if (OrderSymbol() != Symbol() || OrderMagicNumber() != MagicNumber) continue;
if (OrderSymbol() == Symbol() && OrderMagicNumber() == MagicNumber)
if (OrderType() == OP_SELL || OrderType() == OP_BUY) OrderCount++;
}
return (OrderCount);
}

解释

我们将订单计数函数命名为 OrdersTotalMagicOpen()。 它将返回一个整数值,表示当前在与我们作为函数参数传递的幻数匹配的指定图表符号上打开的订单数量。


我们首先声明 OrderCount 变量,其初始值为 0。我们使用 for 运算符循环代码块,并使用 OrderSelect() 函数检查当前未平仓头寸池,检查与我们匹配的 订单符号和幻数。


如果 OrderMagicNumber() 与我们的 MagicNumber 匹配,我们可以确信此订单是由我们的 EA 下达的。 注意:只有当用户在具有相同幻数的相同货币符号上运行两个 EA 时,才会出现关于 EA 识别的不确定性。


如果 OrderMagicNumber() 不匹配,我们使用 != 符号,意思是“不等于”,程序可以继续,也就是说,它会丢弃不相关的交易并继续进行匹配的交易。


我们接下来查看订单是否匹配订单类型 OP_BUY 或 (||) OP_SELL。 OP_BUY 是一个常量,表示买入市价单。 要计算其他类型,只需将 OP_BUY 或 OP_SELL 替换为适当的订单类型常量。


如果订单与我们的幻数和图表符号以及订单类型都匹配,OrderCount 的值将增加 1。 在我们遍历订单池中的所有订单后,我们将 OrderCount 的值返回给调用函数。

MT4使用

if (OrdersTotalMagicOpen() > 0 && CloseOrders == true){ // Close all orders }

If there are orders opened by this EA, and the value of CloseOrders is true, then the code inside the braces will run, which will close all the open orders.

仅计算买入或卖出订单

有时需要只统计未平仓买单或未平仓卖单,在这种情况下,我们必须将上述功能拆分为两个。

计算买单

int BuyTotalMagicOpen() {
int OrderCount = 0;
for (int l_pos_4 = OrdersTotal() – 1; l_pos_4 >= 0; l_pos_4–) {
OrderSelect(l_pos_4, SELECT_BY_POS, MODE_TRADES);
if (OrderSymbol() != Symbol() || OrderMagicNumber() != MagicNumber) continue;
if (OrderSymbol() == Symbol() && OrderMagicNumber() == MagicNumber)
if (OrderType() == OP_BUY) OrderCount++;
}
return (OrderCount);
}

 

计算卖单

int SellTotalMagicOpen() {
int OrderCount = 0;
for (int l_pos_4 = OrdersTotal() – 1; l_pos_4 >= 0; l_pos_4–) {
OrderSelect(l_pos_4, SELECT_BY_POS, MODE_TRADES);
if (OrderSymbol() != Symbol() || OrderMagicNumber() != MagicNumber) continue;
if (OrderSymbol() == Symbol() && OrderMagicNumber() == MagicNumber)
if (OrderType() == OP_SELL) OrderCount++;
}
return (OrderCount);
}

您可以看到以上两段代码与我们之前的代码几乎相同,只是我们将检查订单类型为 OP_BUY 或 (||) OP_SELL 的条件替换为仅检查订单类型的条件 一种。


为每种订单类型创建订单计数函数非常容易,例如,将常量 OP_BUY 替换为 OP_BUYLIMIT 或 OP_BUYSTOP,并重命名函数以区分订单类型。