MQL4交易处理函数解析与使用指南

在MQL4编程中,交易处理函数是实现自动化交易的核心工具。需要明确的是,从自定义指标中无法直接调用OrderSend()、OrderClose()、OrderCloseBy()、OrderDelete()和OrderModify()等交易函数。

这类交易函数主要应用于智能交易系统(EA)和脚本中。只有智能交易设置中的“允许实时交易”属性被勾选时,才能正常调用这些交易函数。

为了在智能交易和脚本中顺利进行交易操作,程序交易环境(即智能交易和脚本的自动交易环境)只能提供一个独立的线程。因此,如果该交易环境已被某个智能交易或脚本占用,其他智能交易或脚本在此时便无法成功调用交易函数,这就会导致146错误(ERR_TRADE_CONTEXT_BUSY)。开发者可以使用IsTradeAllowed()函数来检测当前是否有交易正在执行。为了减少交易环境中的访问冲突,我们还可以借助基于全局变量的交易信号,其值可以通过GlobalVariableSetOnCondition()函数进行修改。

MQL4交易函数常见错误代码及处理建议

OrderSelect() – 用于选择订单

OrderClose() – 用于平仓操作

OrderCloseBy() – 用于相反头寸平仓

OrderClosePrice() – 用于获取订单的平仓价格

OrderCloseTime() – 用于获取订单的平仓时间

OrderComment() – 用于获取订单的注释信息

OrderCommission() – 用于获取订单的佣金数额

OrderDelete() – 用于删除挂单

OrderExpiration() – 用于获取挂单的有效时间

OrderLots() – 用于获取订单的交易手数

OrderMagicNumber() – 用于获取订单的魔术编号

OrderModify() – 用于修改订单参数

OrderOpenPrice() – 用于获取订单的开仓价格

OrderOpenTime() – 用于获取订单的开仓时间

OrderPrint() – 用于打印订单信息

OrderProfit() – 用于获取订单的盈利金额

OrderSend() – 用于发出订单

OrdersHistoryTotal() – 用于获取历史订单总数

OrderStopLoss() – 用于获取订单的止损值

OrdersTotal() – 用于获取订单总数

OrderSwap() – 用于获取订单的掉期值

OrderSymbol() – 用于获取订单的交易品种

OrderTakeProfit() – 用于获取订单的止盈值

OrderTicket() – 用于获取订单的订单编号

OrderType() – 用于获取订单的交易类型

OrderOpenPrice() – 获取订单开仓价格

double OrderOpenPrice()函数用于返回当前订单的开仓价格。需要注意的是,CWG Markets订单必须先用OrderSelect()函数选中,才能获取到正确的数据。

示例代码:

if(OrderSelect(10, SELECT_BY_POS)==true) Print("对于定单10的开仓价格",OrderOpenPrice()); else Print("OrderSelect返回错误",GetLastError());

OrderOpenTime() – 获取订单开仓时间

datetime OrderOpenTime()函数用于返回当前订单的开仓时间。使用此函数前,同样需要先用OrderSelect()函数选中目标订单。

示例代码:

if(OrderSelect(10, SELECT_BY_POS)==true) Print("定单10 开仓时间",OrderOpenTime()); else Print("OrderSelect 返回的错误 ",GetLastError());OrderPrint() – 打印订单信息

void OrderPrint()函数用于按以下格式在日志中打印当前订单的信息:

订单编号; 买入时间; 交易业务; 手数总数; 开仓价格; 止损价格; 止盈价格; 平仓时间; 平仓价格; 佣金; 掉期; 盈利; 注释; 魔术编码; 挂单有效日期

使用此函数前,需要先用OrderSelect()函数选中订单。

示例代码:

if(OrderSelect(10, SELECT_BY_TICKET)==true) OrderPrint(); else Print("OrderSelect 失败错误代码是",GetLastError());OrderProfit() – 获取订单盈利金额

double OrderProfit()函数用于返回当前订单的盈利金额(不含掉期和佣金)。对于开仓订单,返回的是浮动盈利;对于已平仓订单,返回的是固定盈利。

使用此函数前,需要先用OrderSelect()函数选中订单。

示例代码:

if(OrderSelect(10, SELECT_BY_POS)==true) Print("定单 10 盈利",OrderProfit()); else Print("OrderSelect返回的错误",GetLastError());OrderSend() – 发出订单

int OrderSend(string symbol, int cmd, double volume, double price, int slippage, double stoploss, double takeprofit, void comment, void magic, void expiration, void arrow_color)该函数的主要功能是用于开仓头寸和挂单交易。如果成功,交易服务器会返回订单编号;如果失败,则返回-1。要获取更详细的错误信息,可以调用GetLastError()函数。

需要注意的是,市价订单开始交易时(OP_SELL或OP_BUY),只有最新的卖价或买价可以作为开仓价。如果执行的是与当前货币对不同的交易,必须使用带有MODE_BID或MODE_ASK参数的MarketInfo()函数获取目标货币对的最新报价。无法使用预测价格或未标准化的价格。

如果在市场报价中没有所需的开仓价,或者价格没有按照小数点后位数的要求进行标准化,就会导致129错误(ERR_INVALID_PRICE)。如果要求的开仓价日期已过期,则会导致138错误(ERR_REQUOTE)。如果请求的价格已过期但仍处于市价范围内,系统会以现价或仍处于price正负slippage(现价正负滑点)范围内的价格开仓。

止损价和止盈价不能过于接近市价。最小的止损点数可以通过使用带MODE_STOPLEVEL参数的MarketInfo()函数获取。如果设置出错或止损位不正确,就会导致130错误(ERR_INVALID_STOPS)。

在发出挂单时,开盘价也不能过于接近市价。挂单价和当前市价之间的最小点数可以使用带MODE_STOPLEVEL参数的MarketInfo()函数获取。如果挂单开盘价错误,同样会导致130错误(ERR_INVALID_STOPS)。

挂单交易的过期时间在某些交易服务器上可能被禁用。在这种情况下,如果指定了非零的expiration(过期)参数,反而会导致147错误(ERR_TRADE_EXPIRATION_DENIED)。

在某些交易服务器上,开仓单和挂单的总数可能有限制。如果超出限额,就无法再开仓或挂单。此时交易服务器会返回148错误(ERR_TRADE_TOO_MANY_ORDERS)。

参数说明:

symbol - 交易货币对。 cmd - 交易类型,可以是交易类型列举中的任意值。 volume - 交易手数。 price - 交易价格。 slippage - 最大允许滑点数。 stoploss - 止损价格。 takeprofit - 止盈价格。 comment - 注释文本,注释的最后部分可能由服务器修改。 magic - 订单魔术编号,可作为用户指定识别码。 expiration - 订单有效时间(仅限挂单)。 arrow_color - 图表上箭头颜色。如果参数丢失或使用CLR_NONE,价格值将不会在图表中画出。

示例代码:

int ticket; if(iRSI(NULL,0,14,PRICE_CLOSE,0)<25) { ticket=OrderSend(Symbol(),OP_BUY,1,Ask,3,Ask-25*Point,Ask+25*Point,"My order #2",16384,0,Green); if(ticket<0) { Print("OrderSend 失败错误 #",GetLastError()); return(0); } }OrdersHistoryTotal() – 获取历史订单总数

int OrdersHistoryTotal()函数用于返回载入到终端账户历史表中已平仓订单的数量。历史表的范围大小取决于终端“Accounthistory(账户历史)”标签中的当前设置。

示例代码:

// 来自交易历史的订单信息 int i,hstTotal=OrdersHistoryTotal(); for(i=0;iOrderStopLoss() – 获取订单止损值

double OrderStopLoss()函数用于返回当前订单的止损值。使用前需先用OrderSelect()函数选中订单。

示例代码:

if(OrderSelect(ticket,SELECT_BY_POS)==true) Print("对于10 止损值", OrderStopLoss()); else Print("OrderSelect 失败错误代码是",GetLastError());OrdersTotal() – 获取订单总数

int OrdersTotal()函数用于返回市场单和挂单的总数。

示例代码:

int handle=FileOpen("OrdersReport.csv",FILE_WRITE|FILE_CSV,"/t"); if(handle<0) return(0); // 写标题 FileWrite(handle,"#","开价格","买入时间","货币对","手数"); int total=OrdersTotal(); // 编写定单命令 for(int pos=0;posOrderTicket(),OrderOpenPrice(),OrderOpenTime(),OrderSymbol(),OrderLots()); } FileClose(handle);OrderSwap() – 获取订单掉期值

double OrderSwap()函数用于返回当前订单的掉期值。使用前需先用OrderSelect()函数选中订单。

示例代码:

if(OrderSelect(order_id, SELECT_BY_TICKET)==true) Print("对于定单 #", order_id, "掉期", OrderSwap()); else Print("OrderSelect 失败错误代码是",GetLastError());OrderSymbol() – 获取订单交易品种

string OrderSymbol()函数用于返回当前订单的交易品种名称。使用前需先用OrderSelect()函数选中订单。

示例代码:

if(OrderSelect(12, SELECT_BY_POS)==true) Print("定单 #", OrderTicket(), " 货币对是", OrderSymbol()); else Print("OrderSelect 失败错误代码是",GetLastError());OrderTakeProfit() – 获取订单止盈值

double OrderTakeProfit()函数用于返回当前订单的止盈值。使用前需先用OrderSelect()函数选中订单。

示例代码:

if(OrderSelect(12, SELECT_BY_POS)==true) Print("定单 #",OrderTicket()," 盈利: ", OrderTakeProfit()); else Print("OrderSelect() 返回错误 - ",GetLastError());OrderTicket() – 获取订单编号

int OrderTicket()函数用于返回当前订单的订单编号。使用前需先用OrderSelect()函数选中订单。

示例代码:

if(OrderSelect(12, SELECT_BY_POS)==true) order=OrderTicket(); else Print("OrderSelect 失败错误代码",GetLastError());OrderType() – 获取订单交易类型

int OrderType()函数用于返回当前订单的交易类型,可以是交易类型列表中的任意值。使用前需先用OrderSelect()函数选中订单。

示例代码:

int order_type; if(OrderSelect(12, SELECT_BY_POS)==true) { order_type=OrderType(); // ... } else Print("OrderSelect() 返回错误 - ",GetLastError());