如何使用MQL4检查未结订单

使用MQL4进行构建时,检查MQL4的未结订单是必要的步骤 专家顾问指标.

专家顾问的设计可能非常棘手,在计划EA时,您需要考虑它仅遵循您的规则,因此请谨慎编写代码。

为什么要使用MQL4检查未结订单

运行专家顾问时的重要步骤是检查现有订单。在这里,我们将看到如何使用MQL4编码语言扫描未结订单。

假设您正在编写一个专家顾问,如果价格高于 简单移动平均线 第25期。请记住您从中学到的知识 structure of an EA and the 代码流.

专家顾问将执行 技术分析 如果价格高于MA(25),它将下订单。然后它将在下一个收到的报价时重新开始,检查先决条件,管理订单,然后再次进行技术分析:如果价格再次高于MA(25),它将再次下订单。在下一个报价时也是如此,冒着打开订单直到您达到保证金限制的风险。

这是所有编码人员开始构建其第一个EA时遇到的一个非常常见且愚蠢的错误。

如何使用MQL4检查未结订单

解决这个问题的方法非常简单。您可以轻松地检查是否有针对该货币的订单已打开并设置了条件:如果有针对该货币对的订单已打开,则可以告诉EA不要执行技术分析或下新订单。

MetaTrader和MetaQuotes语言具有一些本机功能可以帮助您完成此任务,特别是您可以使用:

  • OrdersTotal() 返回未结订单和挂单数量。
  • OrderSelect() 选择一个订单并收集其信息。
  • OrderSymbol() 返回所选订单的货币对。
  • Symbol() 返回运行脚本/指标/ EA的当前图表的货币对。

Putting together the above functions with some if conditions 和 a for loop you can scan all open 和 pending orders 和 check if there is any order already open for the currency pair where the EA is running.

这是代码:

#property copyright "EarnForex.com"
#property link      "//www.hzweicheng.com/"
#property version   "1.00"
#property strict 

// We declare a function CheckOpenOrders of type boolean 和 we want to return 
// true if there are open orders for the currency pair, false if these isn't any.

bool CheckOpenOrders(){ 
        // We need to scan all the open 和 pending orders to see if there are any.
        // OrdersTotal returns the total number of market 和 pending orders.
        // What we do is scan all orders 和 check if they are of the same symbol as the one where the EA is running.
        for( int i = 0 ; i < OrdersTotal() ; i++ ) { 
                // We select the order of index i selecting by position 和 from the pool of market/pending trades.
                OrderSelect( i, SELECT_BY_POS, MODE_TRADES ); 
                // If the pair of the order (OrderSymbol() is equal to the pair where the EA is running (Symbol()), then return true.
                if( OrderSymbol() == Symbol() ) return(true); 
        } 
        // If the loop finishes it mean there were no open orders for that pair.
        return(false); 
} 
        
int OnInit() { 
        return(INIT_SUCCEEDED); 
} 

void OnDeinit(const int reason) {

} 

void OnTick() { 
        Print("Are there open orders for this currency? ",CheckOpenOrders()); 
}
 

If we run the EA 和re are no open orders the result is:

MQL4 EA检查未结订单-当前符号未找到未结订单

如果有未结订单:

MQL4 EA检查未结订单-找到当前交易品种的未结订单

未结订单的可能检查

一旦专家顾问能够了解是否有未完成的订单,就很容易添加支票并告诉EA不要继续进行技术分析和新订单。

我们刚刚看到的支票类型是非常基本的。可以通过考虑其他因素进行改进。例如:

  • 检查幻数 —它是分隔EA提交的订单的特殊标识符。
  • 检查订单是买还是卖。
  • 检查订单是否在损益中。

关于学习MQL4的注意事项

了解有关订单的更多信息将允许添加其他检查,并使您的EA功能更强大。

我记得当我刚开始学习MQL编码时,尽管我有一些编码知识,但是许多概念仍然不清楚。

学习MQL4编码的最佳方法是查看现有专家顾问或指标的好评代码,然后尝试根据自己的喜好对其进行修改。

您可以通过下载我们的网站来节省研究和编码时间 MT4 EA交易模板,其中包含一些专业代码。您可以使用它来构建自己的EA!


如果您想获取有关我们指南的最新更新或与外汇交易有关的其他信息,可以订阅我们的 每月通讯.