在MT4的各种快捷工具中,一键平仓脚本是非常有用的一个小脚本程序。
在面对账户有几十个甚至几百个单子的时候,一个一个去手动平仓将会是非常痛苦麻烦的事情,使用MT4自带的MQL4语言,编写一个小程序,只需要几十行代码,就可以轻松解决平仓难的问题。
但是在实际应用中,有些程序员编写的程序,总是无法一次性将所有单子平仓,需要运行好几次一键平仓脚本,才能真正实现全部平仓,怎么解决这个问题呢?继续往下看:
1.首先创建脚本

2.给脚本起个名字"一键平仓”
3.点“完成”,得到默认的程序代码
4.在第16行加入如下代码
while(total())
{
for(int i=0; i<OrdersTotal(); i++)
{
if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
{
if(OrderType()==OP_BUY || OrderType()==OP_SELL)
{
RefreshRates();
bool res=OrderClose(OrderTicket(),OrderLots(),OrderClosePrice(),0);
if(res)
{
Print("平仓成功。#"+IntegerToString(OrderTicket()));
}
else
{
Print("平仓失败。#"+IntegerToString(OrderTicket())+",出错:"+IntegerToString(GetLastError()));
}
}
}
}
}
注意,核心代码就在此处,使用while循环语句,当单子没有平仓时,就不断去平仓,直到平完为止。
5.以上代码中用到了一个自定义函数,这个函数的功能是计算还有几个持仓单子需要平仓,在程序最后面加上:
int total()
{
int result=0,cmd=0;
for(int i=0; i<OrdersTotal(); i++)
{
if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
{
cmd=OrderType();
if(cmd<=1)
result++;
}
}
return result;
}
6.将脚本从导航里面拖动到任意K线图表上,可看到账户所有单子依次被全部平仓。
此代码在2021年6月7日下午测试通过。
下面附上全部源码,一共54行,供大家下载下去研究使用。
//+------------------------------------------------------------------+
//| 一键平仓.mq4 |
//| Copyright 2021, MetaQuotes Software Corp. |
//| http://www.study-ea.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2021, MetaQuotes Software Corp."
#property link "http://www.study-ea.com"
#property version "1.00"
#property strict
//+------------------------------------------------------------------+
//| Script program start function |
//+------------------------------------------------------------------+
void OnStart()
{
//---
while(total())
{
for(int i=0; i<OrdersTotal(); i++)
{
if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
{
if(OrderType()==OP_BUY || OrderType()==OP_SELL)
{
RefreshRates();
bool res=OrderClose(OrderTicket(),OrderLots(),OrderClosePrice(),0);
if(res)
{
Print("平仓成功。#"+IntegerToString(OrderTicket()));
}
else
{
Print("平仓失败。#"+IntegerToString(OrderTicket())+",出错:"+IntegerToString(GetLastError()));
}
}
}
}
}
}
//+------------------------------------------------------------------+
int total()
{
int result=0,cmd=0;
for(int i=0; i<OrdersTotal(); i++)
{
if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
{
cmd=OrderType();
if(cmd<=1)
result++;
}
}
return result;
}
//+------------------------------------------------------------------+
举一反三:
一、以上程序只是将账户上面所有的多单和空单全部平仓了,没有区分交易品种,用户可以在此代码基础上,增加区分交易品种,还可以限制只平仓多单,只平仓空单,只平盈利单,只平亏损单,等等细分功能。这样就可以衍生出很多个脚本了。
二、随着MT4的升级,图表按钮的出现,脚本的单一功能,可以使用按钮来实现了,真正实现一键平仓。如下图所示,下次分享。
使用按钮做的功能面板还有一个好处就是可以在历史复盘测试的时候,可以在历史数据里面手动下单,从而就成了一个复盘演示工具,用来周末练习交易,对训练盘感很有帮助。