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() – 获取订单的交易类型

接下来,我们逐一了解这些函数的具体用法。

OrderSelect()函数详解

bool OrderSelect(int index, int select, void pool) 该函数用于选择一个订单,以便进行后续操作。如果函数执行成功,返回TRUE;如果失败,则返回FALSE。如需获取详细的错误信息,可调用GetLastError()函数。

当通过订单编号来选定订单时,pool参数可以忽略,因为订单编号是唯一的识别符。为了找到所选订单的列表,需要对订单时间进行分析。如果订单的开仓时间不为零,说明该订单是已建仓位或挂单,可从终端的开仓部位列表中选出。通过订单类型可以区分是开仓还是挂单。若订单的平仓时间不等于0,则表示该订单已经平仓或已被删除的挂单,也可能是从终端历史记录中选出的,同样可以根据订单类型来辨别。

参数说明:

index - 订单索引或订单号,具体取决于第二个参数 select。select - 选定模式,可以是以下值:SELECT_BY_POS(按订单表中的位置索引)或 SELECT_BY_TICKET(按订单号)。pool - 可选参数,用于指定从哪个订单池中选取。当select为SELECT_BY_POS时使用,可以是MODE_TRADES(默认,代表来自交易中的订单,包括开仓和挂单)或 MODE_HISTORY(代表来自历史记录的订单,即已平仓或取消的订单)。

示例代码:

if(OrderSelect(12470, SELECT_BY_TICKET)==true)
{
Print("订单 #12470 开仓价格", OrderOpenPrice());
Print("订单 #12470 平仓价格 ", OrderClosePrice());
}
else
Print("OrderSelect 返回错误 ",GetLastError());

OrderClose()函数详解

bool OrderClose(int ticket, double lots, double price, int slippage, void Color) 用于平掉指定订单。若执行成功,返回TRUE;若失败,则返回FALSE。详细错误信息可通过GetLastError()获取。

参数说明:

ticket - 订单号。lots - 平仓的手数。price - 平仓的价格。slippage - 允许的最大滑点数。Color - 图表中平仓箭头的颜色。如果该参数缺失或设置为CLR_NONE,则不会在图表中显示平仓箭头。

示例:

if(iRSI(NULL,0,14,PRICE_CLOSE,0) > 75)
{
OrderClose(order_id, 1, Ask, 3, Red);
return(0);
}

OrderCloseBy()函数详解

bool OrderCloseBy(int ticket, int opposite, void Color) 通过使用相反方向的订单来对当前仓位进行平仓。若成功,返回TRUE;若失败,返回FALSE。错误信息可通过GetLastError()获取。

参数说明:

ticket - 要平仓的订单号。opposite - 相反订单的订单号。Color - 平仓箭头颜色,若省略或为CLR_NONE,则不显示。

示例:

if(iRSI(NULL,0,14,PRICE_CLOSE,0) > 75)
{
OrderCloseBy(order_id, opposite_id);
return(0);
}

OrderClosePrice()函数详解

double OrderClosePrice() 返回当前选中订单的平仓价格。对于已平仓的订单,返回实际的平仓价格;对于未平仓的订单,则返回该订单货币对的实时市场价格。

注:使用此函数前,必须先用OrderSelect()选定订单。

示例:

if(OrderSelect(ticket, SELECT_BY_POS)==true)
Print("订单平仓价格", OrderClosePrice());
else
Print("OrderSelect 失败,错误代码", GetLastError());

OrderCloseTime()函数详解

datetime OrderCloseTime() 返回当前订单的平仓时间。如果订单的平仓时间不为0,那么该订单会被视为从账户历史中重新选取。未平仓的订单和挂单交易的平仓时间则等于0。

注:同样需要先用OrderSelect()选定订单。

示例:

if(OrderSelect(10, SELECT_BY_POS, MODE_HISTORY)==true)
{
datetime ctm=OrderOpenTime();
if(ctm>0) Print("订单10 开仓时间", ctm);
ctm=OrderCloseTime();
if(ctm>0) Print("订单10 平仓时间", ctm);
}
else
Print("OrderSelect 失败,错误代码", GetLastError());

OrderComment()函数详解

string OrderComment() 返回当前选中订单的注释文本。

注:需先调用OrderSelect()选定订单。

示例:

string comment;
if(OrderSelect(10, SELECT_BY_TICKET)==false)
{
Print("OrderSelect 失败,错误代码", GetLastError());
return(0);
}
comment = OrderComment();
// 后续处理

OrderCommission()函数详解

double OrderCommission() 返回当前订单的佣金数额。

注:需先选定订单。

示例:

if(OrderSelect(10, SELECT_BY_POS)==true)
Print("订单10 佣金", OrderCommission());
else
Print("OrderSelect 失败,错误代码", GetLastError());

OrderDelete()函数详解

bool OrderDelete(int ticket, void Color) 用于删除指定的挂单。若成功,返回TRUE;否则,返回FALSE。错误信息可通过GetLastError()获取。

参数说明:

ticket - 要删除的挂单号。Color - 图表中删除操作的标记颜色,若省略或为CLR_NONE,则不显示。

示例:

if(Ask < var1)
{
OrderDelete(order_ticket);
return(0);
}

OrderExpiration()函数详解

datetime OrderExpiration() 返回当前挂单的有效时间。

注:需先选定订单。

示例:

if(OrderSelect(10, SELECT_BY_TICKET)==true)
Print("订单 #10 有效日期为", OrderExpiration());
else
Print("OrderSelect 返回错误", GetLastError());

OrderLots()函数详解

double OrderLots() 返回当前订单的交易手数。

注:需先选定订单。

示例:

if(OrderSelect(10, SELECT_BY_POS)==true)
Print("订单10 交易手数", OrderLots());
else
Print("OrderSelect 返回错误", GetLastError());

OrderMagicNumber()函数详解

int OrderMagicNumber() 返回当前订单的魔术编号,用于区分不同的交易策略。

注:需先选定订单。

示例:

if(OrderSelect(10, SELECT_BY_POS)==true)
Print("订单10 的魔术编号", OrderMagicNumber());
else
Print("OrderSelect 返回错误", GetLastError());

OrderModify()函数详解

bool OrderModify(int ticket, double price, double stoploss, double takeprofit, datetime expiration, void arrow_color) 用于修改已存在的持仓订单或挂单的参数。若成功,返回TRUE;否则返回FALSE。具体错误信息可参考GetLastError()函数。

注意:只有挂单才能修改开仓价格和过期时间。如果将原值作为参数传递,系统将返回错误代码1(ERR_NO_RESULT)。在某些交易服务器上,挂单的过期时间可能被禁用,此时若在expiration参数中指定非零值,将产生147错误(ERR_TRADE_EXPIRATION_DENIED)。

参数说明:

ticket - 要修改的订单(或挂单)号。price - 新的开仓价格(仅对挂单有效)。stoploss - 新的止损价位。takeprofit - 新的止盈价位。expiration - 挂单的有效时间(仅对挂单有效)。Color - 图表中修改操作的标记颜色,若省略或为CLR_NONE,则不显示。

示例:

if(TrailingStop > 0)
{
OrderSelect(12345, SELECT_BY_TICKET);
if(Bid - OrderOpenPrice() > Point * TrailingStop)
{
if(OrderStopLoss() < Bid - Point * TrailingStop)
{
OrderModify(OrderTicket(), OrderOpenPrice(), Bid - Point * TrailingStop, OrderTakeProfit(), 0, Blue);
return(0);
}
}
}