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);
}
}
}
