不少刚接触MT4量化的朋友,写代码时最头疼的不是开仓条件,而是订单管理。
平仓、查持仓、区分多空单、避免重复开仓,这些基础功能看似简单,却是所有EA的骨架。
很多网上流传的简易EA缺失订单判断逻辑,行情波动时会疯狂重复下单,直接造成不必要亏损。
今天纯技术教学,分享一套完整订单管理模板代码,无任何加仓、马丁等高风险逻辑,适合零基础学习,复制就能编译运行。
一、这套代码能实现哪些功能
1. 自动查询当前品种持仓,区分多单、空单
2. 无持仓时才满足条件开仓,杜绝重复挂单
3. 一键平掉全部对应EA订单
4. 固定止损止盈,基础风控自带
5. 独立魔术数字,不和其他EA订单冲突
二、完整MQL4源码
mq4
//+------------------------------------------------------------------+
//| OrderManageDemo.mq4 订单管理教学EA 第二期
//| 量化技术分享 仅供学习交流
//+------------------------------------------------------------------+
#property copyright "量化技术分享"
#property version "1.00"
#property strict
//外部可调参数
input double TradeLot = 0.01; //交易手数
input int StopLossPoint = 25; //止损点数
input int TakeProfitPoint = 50; //止盈点数
input int MagicNum = 6688; //魔术数字,区分订单
//1. 查询是否存在本EA持仓
bool CheckHavePosition()
{
for(int i = 0; i < OrdersTotal(); i++)
{
if(!OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) continue;
if(OrderSymbol() == _Symbol && OrderMagicNumber() == MagicNum)
{
return true;
}
}
return false;
}
//2. 判断当前是否持有多单
bool IsLongOrder()
{
for(int i = 0; i < OrdersTotal(); i++)
{
if(!OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) continue;
if(OrderSymbol() == _Symbol && OrderMagicNumber() == MagicNum && OrderType() == OP_BUY)
{
return true;
}
}
return false;
}
//3. 判断当前是否持有空单
bool IsShortOrder()
{
for(int i = 0; i < OrdersTotal(); i++)
{
if(!OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) continue;
if(OrderSymbol() == _Symbol && OrderMagicNumber() == MagicNum && OrderType() == OP_SELL)
{
return true;
}
}
return false;
}
//4. 平掉本EA所有持仓
void CloseAllOrder()
{
for(int i = OrdersTotal()-1; i >= 0; i--)
{
if(!OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) continue;
if(OrderSymbol() == _Symbol && OrderMagicNumber() == MagicNum)
{
double closePrice = (OrderType() == OP_BUY) ? Bid : Ask;
OrderClose(OrderTicket(), OrderLots(), closePrice, 3, clrNone);
}
}
}
//5. 开多单函数
void OpenLong()
{
double sl = Ask - StopLossPoint * Point;
double tp = Ask + TakeProfitPoint * Point;
OrderSend(_Symbol, OP_BUY, TradeLot, Ask, 3, sl, tp, "教学多单", MagicNum, 0, clrGreen);
}
//6. 开空单函数
void OpenShort()
{
double sl = Bid + StopLossPoint * Point;
double tp = Bid - TakeProfitPoint * Point;
OrderSend(_Symbol, OP_SELL, TradeLot, Bid, 3, sl, tp, "教学空单", MagicNum, 0, clrRed);
}
//主循环
void OnTick()
{
//已有持仓直接跳过,不再新开仓
if(CheckHavePosition()) return;
//简易示例条件:5均线上穿20均线做多
double ma5 = iMA(_Symbol, PERIOD_M15, 5, 0, MODE_SMA, PRICE_CLOSE, 0);
double ma20 = iMA(_Symbol, PERIOD_M15, 20, 0, MODE_SMA, PRICE_CLOSE, 0);
double ma5_pre = iMA(_Symbol, PERIOD_M15, 5, 0, MODE_SMA, PRICE_CLOSE, 1);
double ma20_pre = iMA(_Symbol, PERIOD_M15, 20, 0, MODE_SMA, PRICE_CLOSE, 1);
if(ma5 > ma20 && ma5_pre < ma20_pre)
{
OpenLong();
}
if(ma5 < ma20 && ma5_pre > ma20_pre)
{
OpenShort();
}
}
//+------------------------------------------------------------------+
三、代码分步拆解讲解
1. 魔术数字MagicNum
每一套EA设置专属数字,多EA同时运行时不会互相平仓、混淆订单,是量化基础规范。
2. 持仓判断函数
循环读取软件全部订单,筛选当前品种、对应魔术号订单,精准判断有无持仓,避免重复开仓。
3. 分多空识别
单独区分多单、空单,后续拓展反转策略、对冲策略都要用到这个逻辑。
4. 一键全平仓函数
极端行情、数据公布前可调用,一键清仓避险,实用性极强。
5. 开仓内置固定止损止盈,杜绝裸单运行。
四、新手使用步骤
1. 打开MT4,工具→MetaQuotes语言编辑器
2. 新建EA文件,粘贴全部代码,保存命名
3. 点击顶部编译按钮,无报错即可使用
4. 拖拽至黄金、外汇图表,自行调整手数、止损参数
五、学习延伸方向
掌握这套订单管理底层代码后,后续可以自主拓展:
1. 增加移动止损功能
2. 增加盈利到达指定金额自动全部平仓
3. 增加单日最大亏损风控,亏损达标停止交易
4. 叠加多指标过滤,降低无效开仓频率
文末寄语
量化交易的核心不是花里胡哨的指标,而是严谨的订单管理与风控。
大部分散户EA亏损,根源都是订单逻辑漏洞,重复开仓、无法止损、不能及时离场。
后续第三期会分享移动止损进阶源码,持续更新零基础量化教学代码,关注本号不错过。
免责声明:所有源码仅用于编程学习,不构成任何交易指导,市场存在风险,实操务必小资金模拟盘测试。
夜雨聆风