MQL5 标准交易类库:CTrade、CAccountInfo 与 CPositionInfo
一、标准交易类库能省多少事
早期 EA 要手写交易请求结构体、填十几个字段、处理异步回执,几百行代码还容易错。MQL5 标准库(MQL5\Include\Trade 与 MQL5\Include\Chart 等)把这些封装成了 CTrade、CAccountInfo、CPositionInfo、COrderInfo、CSymbolInfo 等类。用它们,下单、查持仓、校验账户状态都变成一两行调用。本文聚焦交易类。
二、核心类职责
- CTrade:执行开仓、挂单、改单、平仓,封装了交易请求与回执读取。
- CAccountInfo:账户属性——登录号、杠杆、余额、可用预付款、是否允许交易。
- CSymbolInfo:品种属性——买/卖价、点差、止损水平、合约大小、小数位。
- CPositionInfo:当前持仓字段——开仓时间、类型、手数、开仓价、SL/TP。
- COrderInfo:挂单字段——类型、状态、价格、SL/TP,需 Select(ticket)。
- CDealInfo:历史成交记录。
三、CTrade 关键方法
最常用的是市价单与持仓操作。注意 MQL5 交易是异步的:函数返回 true 只代表请求已发出,最终是否成交要看 ResultDeal()。
- Buy(volume, symbol, price=0, sl=0, tp=0, comment) / Sell(...):市价单,price=0 用当前 Ask/Bid。
- PositionOpen(symbol, ORDER_TYPE_BUY/SELL, volume, price, sl, tp) :更通用的建仓。
- PositionModify(symbol, sl, tp) / PositionClose(symbol, deviation) :改/平持仓。
- OrderOpen / OrderModify / OrderDelete :挂单的增改删。
- ResultRetcode() / ResultRetcodeDescription() / ResultDeal() / PrintRequest() :诊断用。
四、下单前必须做的校验
直接 Buy() 很容易因为“市场关闭”“保证金不足”“止损太近”而失败。标准库提供了下单前的检查点:
CSymbolInfo mysymbol; CAccountInfo myaccount; CTrade mytrade;
mysymbol.Name(_Symbol);
mytrade.SetExpertMagicNumber(EA_Magic);
mytrade.SetDeviationInPoints(dev);
if(!mysymbol.RefreshRates()) { Alert("报价错误"); return; }
if(!(myaccount.TradeAllowed() && myaccount.TradeExpert() && mysymbol.IsSynchronized()))
{ Alert("不可交易"); return; }
double price = NormalizeDouble(mysymbol.Ask(), _Digits);
double sl = NormalizeDouble(mysymbol.Ask() - STP*_Point, _Digits);
if(mytrade.Buy(Lot, _Symbol, price, sl, tp))
Alert("成交单号:", mytrade.ResultDeal());
else
Alert("失败:", mytrade.ResultRetcodeDescription());
五、读持仓与读挂单
平仓或改单前,先用 CPositionInfo::Select(_Symbol) 选中当前品种持仓,再用 Volume()/StopLoss()/TakeProfit()/PriceOpen() 读字段。挂单则用 COrderInfo::Select(ticket) 按单号选中。注意一个品种可能同时有多笔挂单,要遍历 OrderGetTicket(j) 逐个处理。
六、常见错误与排查
七、CTrade / CPosition / COrder 分工
标准交易类库把交易动作拆清楚:CTrade 负责发单(Buy/Sell/PositionModify),CPosition 负责读当前持仓状态,COrder 负责管挂单。分工后你不必手写一大堆 OrderSend 与状态查询。
用类库最大的好处是「少写易错代码」:下单的异步、重试、错误码处理都被封装,你调一个语义清晰的方法即可,出错时类库也会返回可读的错误。
八、异步下单与 OnTrade 确认
CTrade 默认异步(OrderSendAsync),Send 不等于已成。成交要靠 OnTrade 事件核对真实持仓与历史成交,而不是发完就当真。这是标准库强制你养成的正确习惯。
九、实战:一键平仓与部分平仓
用类库写「平掉当前品种全部持仓」「平掉一半」非常简短:遍历 PositionSelect 后调 PositionClose 或 PositionClosePartial。这类常用动作封装成函数,多个 EA 都能直接复用。
注意部分平仓会改变剩余仓位的开仓价(净额制下是加权平均),平仓后读 POSITION_PRICE_OPEN 要用新值,别缓存旧开仓价。