MT4/MT5 版“关闭所有订单/头寸”
使用交易工具及智能交易系统时,订单管理是一项基本任务。在某些情况下,特别是在触发某项风险管理规则时,您可能想要关闭所有未平仓订单。在本文中,我们将关注两项相关的函数:一项采用 MQL4 代码,另一项采用 MQL5 代码。此外,您还可以下载一项免费的 MT4 版关闭所有订单脚本——该脚本可以自动关闭所有未平仓订单。MetaTrader 5 中也有一款类似的脚本,即关闭所有头寸脚本。
MQL4 版“关闭所有订单”
编写智能交易系统时,我们都应该采取一些安全措施,以免遭受巨大的亏损。风险管理是智能交易系统的基石。因此,有必要设置规则,使您的智能交易系统在满足某些条件时可以关闭所有订单。
一些可能会触发“关闭所有订单”的示例包括:
- 一组订单触及止盈位。
- 未平仓订单的累计亏损导致资产净值或保证金低于特定阈值。
- 即将发布的报告可能会对价格产生重大影响。
- 意外事件导致汇率突然变动。
以上只是一部分可能会促使您立即关闭所有未结订单的情况。您可以通过一段简单的 MQL4 代码来实现这一点。
您可能已经读过我们的 OrderClose 函数指南;该函数可以关闭 MT4 中的单笔订单。接下来,您可以看到如何用自定义函数关闭所有订单。
以下 MQL4 版“关闭所有订单”函数可以在同一次运行中关闭所有未平仓的市价订单。
void CloseOrders() { int total = OrdersTotal(); // 在终端录入订单总数。 Print(total); // 开启一个用于扫描所有订单的循环。 // 循环从最后一个订单开始,否则可能会跳过订单。 for (int i = total - 1; i >= 0; i--) { // 如果无法选择订单,则抛出并记录错误。 if (OrderSelect(i, SELECT_BY_POS) == false) { Print("ERROR - 无法选择订单 - ", GetLastError()); break; } // 结果变量 - 用于检查操作是否成功。 bool result = false; // 在关闭订单之前更新汇率。 RefreshRates(); // 订单交易品种的买入及卖出价。 double BidPrice = MarketInfo(OrderSymbol(), MODE_BID); double AskPrice = MarketInfo(OrderSymbol(), MODE_ASK); // 根据订单类型用正确的价格关闭订单。 if (OrderType() == OP_BUY) { result = OrderClose(OrderTicket(), OrderLots(), BidPrice, Slippage); } else if (OrderType() == OP_SELL) { result = OrderClose(OrderTicket(), OrderLots(), AskPrice, Slippage); } // 如果有错误,则记录它。 if (!result) Print("ERROR - 无法关闭订单 - ", OrderTicket(), " - Error ", GetLastError()); } }
MQL4 版“关闭所有订单”函数的逻辑
函数逻辑如下:
- 使用循环扫描所有订单。
- 更新价格。
- 如果订单类型为市价买入或卖出订单,请使用正确的价格关闭订单。
- 检查每笔订单的操作是否成功,若不成功则返回错误。
潜在的提升
这项函数并不复杂,可以通过添加额外的过滤器来改进。例如,您可能希望应用以下过滤器:
- 仅关闭盈利订单。
- 仅关闭亏损订单。
- 仅关闭特定货币对的订单。
- 仅关闭设有特定幻数的订单。
- 其他过滤器
以上函数(以修改过的形式)在我们的多款智能交易系统中均有使用。
“关闭所有订单”脚本
如果您想关闭 MT4 中的所有订单,除非您使用外部工具,否则您需要手动操作。
不过,MT4 不允许选择所有未结头寸并对它们一次性平仓。
但您有一个解决方案!您可以使用上述函数作为模板来编写自己的脚本,也可以使用现成的工具。
您可以将下文中的脚本复制到您的 MT4 平台上,并且仅需几次点击即可关闭所有订单。
有多项输入参数可根据您的偏好设置脚本:
除了过滤参数外,还有一个选项可以在按特定顺序关闭订单之前对它们进行排序。它允许您选择先关闭优先级较高的订单。
有一项重要的功能是在试图平仓的操作之间设置延迟时间(以毫秒为单位),以避免交易服务器过载,因为有些外汇经纪商不允许这种行为,并可能会阻止您账户上的自动交易。
您也可以控制脚本尝试关闭每笔订单的次数。这样的话,即使发送至服务器的指令在波动剧烈的时段由于某些错误而执行失败,也能确保交易被正确地关闭。
下载 MT4 版“关闭所有订单”脚本
下载 MT4 版“关闭所有订单”MT4 版“关闭所有订单”脚本的安装
如要安装这款脚本,请按照以下说明操作:
- 下载脚本的存档文件。
- 打开 MetaTrader 4 的数据文件夹(通过文件→打开数据文件夹)。
- 打开 MQL4 文件夹。
- 将存档中的所有文件夹直接复制到 MQL4 文件夹。
- 重启 MetaTrader 4 或用右键点击平台上的导航子窗口并选择刷新,以刷新脚本列表。
您也可以查阅一份更详细的说明,以了解如何完成安装操作。
在执行此脚本时,请确保在常规选项卡中启用了允许实盘交易,并且还要在平台的菜单工具→选项→智能交易系统中进行设置。否则,它将无法关闭任何订单。
预先输入的输入参数
您可以预先输入“关闭所有订单”脚本的输入参数值,然后保存一份重命名的副本,以便在需要时使用预配置的脚本,而无需花费时间修改输入参数。
通过这种方式,您将有多个可以根据具体情况随时准备执行的脚本(例如使用键盘快捷键)。
例如,我们来观察一个仅关闭所有亏损交易的版本。
首先,您需要打开 CloseAllOrders.mq4 文件并找到 OnlyInLoss 输入参数:
接下来,将默认值从 false 改为 true:
在这种预配置版本中,也可以完全删除 show_inputs
属性。这会防止在启动脚本时出现确认窗口:
该行可以被注释掉(在它前面添加两条斜杠)或完全删除:
您可以将文件保存为另一份重命名的文件,以便将它与标准的“关闭所有订单”脚本区分开来。例如,您可以将它命名为 CloseAllOrders_Losing.mq4:
接下来需要编译源代码:
现在,您可以像往常一样在 MetaTrader 4 中执行新的脚本,或者用右键单击它并设置一个热键:
然后,您可以立即运行这项脚本,并根据您的特定要求快速平仓。
您可以重复类似的过程,以创建仅关闭买入订单或卖出订单的脚本,或者仅关闭具有特定幻数的订单(如果您只需要关闭由某些智能交易系统开立的交易)的脚本。
MQL5 版“关闭所有头寸”
在 MetaTrader 5 中,关闭所有交易的函数概念与 MetaTrader 4 中的区别不大。主要的不同之处在于,市价订单在 MT5 中被称为头寸。
这项头寸平仓功能的应用场景与 MetaTrader 4中的订单关闭功能相同。
以下 MQL5 版“关闭所有头寸”代码旨在一次性关闭全部现有头寸。
void ClosePositions() { Trade = new CTrade; // 用于关闭头寸的 CTrade 对象。 int total = PositionsTotal(); // 在终端录入头寸总数。 Print(total); // 开启一个用于扫描所有头寸的循环。 // 循环从最后一笔头寸开始,否则可能会跳过头寸。 for (int i = total - 1; i >= 0; i--) { // 如果无法选择头寸,则抛出并记录错误。 if (PositionGetSymbol(i) == "") { Print("ERROR - 无法选择头寸 - ", GetLastError()); break; } // 结果变量 - 用于检查操作是否成功。 bool result = Trade.PositionClose(PositionGetInteger(POSITION_TICKET), Slippage); // 如果有错误,则记录错误。 if (!result) Print("错误 - 无法关闭该头寸 - ", PositionGetInteger(POSITION_TICKET), " - 错误 ", GetLastError()); } }
MQL5 版“关闭所有头寸”函数的逻辑
这项函数的逻辑如下:
- 使用循环扫描所有头寸。
- 关闭头寸。
- 检查每笔头寸的操作是否成功,若不成功则返回错误。
如您所见,在 MT5 中的操作比 MT4 中的简单。
潜在的提升
与 MQL4 的订单关闭功能一样,这项功能也可以通过添加不同的过滤器及排序选项来做进一步的提升。
“关闭所有头寸”脚本
与 MT4 不同,MetaTrader 5 拥有内置的批量平仓功能——批量操作(Bulk Operations)。然而,如您所见,它也有一定的限制:
它可以关闭所有头寸、所有盈利头寸、所有亏损头寸、所有买入头寸、所有卖出头寸、所有<
当前交易品种>
头寸或所有 <
当前方向>
的 <
当前交易品种>
头寸。此外,您还可以使用关闭方式(Close by)的方法通过反向头寸来关闭当前头寸(仅适用于对冲模式)。
与 MT4 的即开即用相比,这也不算糟糕,并且至少可以通过额外的过滤器及排序选项进行大幅的提升。
以下脚本可以安装到您的 MT5 平台上,让您根据自己的偏好关闭全部头寸:
与上述 MT4 脚本相同,这项 MT5 脚本可以让您对头寸进行过滤、排序、添加延迟,并设置平仓失败后的重试次数。
下载 MT5 版“关闭所有头寸”脚本
下载 MT5 版“关闭所有头寸”MT5 版“关闭所有头寸”脚本的安装
如要安装这款脚本,请按照以下说明操作:
- 下载脚本的存档文件。
- 打开 MetaTrader 5 的数据文件夹(通过文件→打开数据文件夹)。
- 导航至 MQL5 文件夹。
- 将存档中的所有文件夹直接复制到 MQL5 文件夹。
- 重启 MetaTrader 5 或用右键点击平台上的导航子窗口并选择刷新,以刷新脚本列表。
您也可以查阅一份更详细的说明,以了解如何完成安装操作。
在执行此脚本时,请确保在常规选项卡中启用了允许算法交易,并且还要在平台的菜单工具→选项→智能交易系统中进行设置。否则,它将无法关闭任何订单。
预先输入的输入参数
与 MT4 版本的脚本一样,一项有用的操作是预先输入参数值并将副本重命名后保存下来,使用户可以使用这些预配置的脚本,而无需将时间浪费在输入上。
您可以准备多项这种用于关闭头寸的脚本,并根据您交易账户的当前情况来启动它们。
例如,我们可以制作一个按从最大利润到最大亏损的方式来排序的平仓版本,为它设置特定注释,将最多重试次数设为 1 次,且每次平仓尝试之间延迟 0.1秒。
首先,您需要打开 CloseAllPositions.mq5 文件并找到相应的输入参数:
现在,您需要设置新的默认值:
通过这种方式,脚本只会关闭带有“SuperEA”注释的头寸。当您在账户上运行不同的智能交易系统并希望能够分开关闭它们的头寸时,这种方式特别有用。
与 MT4 版本一样,可以删除预配置版本中的 script_show_inputs
属性。
您可以删除或注释掉该行(在它前面添加两条斜杠):
然后,您可以重命名并保存文件副本。例如,文件可以命名为 CloseAllPositions_Comment.mq5:
接下来,您需要编译新的 MQL5 脚本:
新脚本已准备就绪——您可以通过在 MetaTrader 5 中双击它以启动它,或者用右键单击它并设置热键:
现在,脚本可以按照您的要求快速运行,以快速关闭经过筛选及排序的头寸。
您可以重复上述过程来创建其他用于关闭所有头寸的脚本版本。例如,您可以创建一个仅关闭具有特定幻数的头寸的脚本(如果您需要控制特定智能交易系统的交易)。
MT5 批量操作与“关闭所有头寸”脚本
尽管 MetaTrader 5 提供批量平仓功能,但这项功能不如专门的“关闭所有头寸”脚本强大。与 MT5 的“批量操作”相比,后者具有以下优势:
- 可按头寸注释过滤。
- 可按头寸幻数过滤。
- 在平仓前排序。
- 滑点控制。
- 对失败的平仓操作进行重试。
- 可设置每次平仓之间的延迟。
- 访问速度快——可通过键盘快捷键或简单的双击运行脚本。
- 支持进一步的自定义,包括详细日志记录等。
结语
以上代码通过一个基础示例解释了“关闭订单/头寸”脚本是如何运行的。我们免费的 MT4 版“关闭所有订单”脚本以及 MT5 版“关闭所有头寸”脚本提供了一项现成的工具,可用于关闭经过筛选的交易。此外,它还提供了有关 MQL4/MQL5 源代码的更高级示例,可用于学习、修改、升级以及在其他程序中使用。有了它,您可以轻松创建自己的脚本,并在 MetaTrader 中根据自定义条件及过滤器关闭订单及头寸。
探讨
您对这款脚本有什么建议或问题吗?您随时可以去我们的论坛上与其他外汇交易者及 MQL4/MQL5 程序员讨论关于“关闭所有订单”及“关闭所有头寸”的问题。
更新日志
1.01 — 2023/12/26
- 增加了 MT5 版脚本 - “关闭所有头寸”。
- 为脚本增加了重试次数参数,可连续尝试关闭交易。
- 增加了可按特定顺序平仓的排序选项。
- 更改了脚本的行为,使它不再处理挂单。