22 MQL4交易函数

交易管理的一组函数。

从自定义指标中不能调用OrderSend(), OrderClose(), OrderCloseBy(), OrderDelete()OrderModify() 交易函数。

交易函数应用于智能交易和脚本中。如果检验智能交易的”允许实事交易”属性,交易函数不能调用。

来自智能交易和脚本的交易在程序中只能有一个开启。这就是为什么如果交易业务忙,其他交易或脚本在此时不能调用的原因,由于错误 146 (ERR_TRADE_CONTEXT_BUSY)。 使用IsTradeAllowed()函数检测交易或没有交易。 弄清交易访问模式,可以使用改变GlobalVariableSetOnCondition()函数整体变量值。

22.1 运行错误代码

任何交易业务(OrderSend(), OrderClose(), OrderCloseBy(), OrderDelete()OrderModify() )都会因为一些原因导致失败,并且返回负值或FALSE。 您可以查看GetLastError() 函数得知错误的问题所在。 每一个错误必须以不同的方式加以处理。最常见的建议列举如下:

从交易服务器返回的错误代码

常数        描述

ERR_NO_ERROR    0    交易业务成功。

ERR_NO_RESULT    1    OrderModify
尝试去还原已经设定好的相同值。一个或多个值必须改变,然后修改尝试重复.

ERR_COMMON_ERROR    2    常规错误。直到错误清晰为止,所有交易必须停止运行。
如果需要客户端的交易系统必须重启。

ERR_INVALID_TRADE_参量    3    无效参量,
例如, 货币对错误,未知
交易业务, 不存在票数等等。程序逻辑必须修改。

ERR_SERVER_BUSY    4    交易服务器忙。稍后请重新尝试。

ERR_OLD_VERSION    5    客户端的旧版本。客户端的最新版本必须初始化。

ERR_NO_CONNECTION    6    交易服务器没有联接。需要确认连接没有断开(例如,应用
IsConnected
函数) 5秒之后重试。

ERR_TOO_FREQUENT_REQUESTS    8    请求过于频繁。过于频繁的请求必须减少,程序逻辑需要改变。

ERR_ACCOUNT_DISABLED    64    账户被禁止。所有运行交易必须停止。

ERR_INVALID_ACCOUNT    65    账号无效。所有运行交易必须停止。

ERR_TRADE_TIMEOUT    128    交易超时。在重试前必须确认交易业务确实没有成功(存在未修改或未删除的定单)

ERR_INVALID_PRICE    129    无效开价格或报价格。稍后必须刷新
数据应用
RefreshRates
函数重试。
如果错误没有消失,尝试停止所有运行交易,改变程序逻辑。

ERR_INVALID_STOPS    130    Stops 太近或是价格计算错误。
需要刷新RefreshRates 函数重试
如果错误没有消失,尝试停止所有运行交易,改变程序逻辑。

ERR_INVALID_TRADE_VOLUME    131    无效交易值。
尝试停止所有运行交易,改变程序逻辑。

ERR_MARKET_CLOSED    132    市场关闭。稍后重新尝试。

ERR_TRADE_DISABLED    133    交易被禁止。所有运行交易必须停止。

ERR_NOT_ENOUGH_MONEY    134    没有足够的资金。带有相同参量的交易必须重复。稍后用小额的资金重试,
确定没有足够的资金完成交易。

ERR_PRICE_CHANGED    13    5数据应用RefreshRates
函数重试。

ERR_OFF_QUOTES    136    没有报价格
数据
应用
RefreshRates 函数重试。

ERR_REQUOTE    138    重新请求报价格。刷新数据
可以应用
RefreshRates函数重试。
如果错误没有消失,尝试停止所有运行交易,改变程序逻辑。

ERR_ORDER_LOCKED    139    交易定单被锁住。尝试停止所有运行交易,改变程序逻辑。

ERR_LONG_POSITIONS_ONLY_ALLOWED    140    只允许买进。SELL不再重复。

ERR_TOO_MANY_REQUESTS    141    请求过多。
过多的请求必须减少,程序逻辑需要改变。

     142    定单按次序排列。它不是一个错误,而是客户端和服务器交易之间一个代码。当断开或重新连接执行交易时,
这种代码的出现次数非常少。此代码与误差128 一样处理。

     143    定单已经被执行交易商接受。它不是一个错误,而是客户端和服务器交易之间一个代码。当断开或重新连接执行交易时,
这种代码的出现次数非常少。此代码与误差128 一样处理。

     144    在手动确认期间定单已经被客户放弃。它不是一个错误,而是客户端和服务器交易之间一个代码。

ERR_TRADE_MODIFY_DENIED    145    修改被否定。由于太近或被锁定。
数据
应用
RefreshRates 函数重试。

ERR_TRADE_CONTEXT_BUSY    146    交易繁忙。只有在IsTradeContextBusy函数错误返回后重试。

ERR_TRADE_EXPIRATION_DENIED    147    否定挂单交易期限。如果期限为零可以重试。

ERR_TRADE_TOO_MANY_ORDERS    148    开仓和挂单交易总数已经达到经纪人设定。
只有在现有仓位关闭或删除之后才可以开新仓位或挂单。

22.2 OrderClose(平仓)

bool OrderClose(    int ticket, double lots, double price, int slippage, void Color)

对定单进行平仓操作。如果函数成功,返回的值是真实的。如果函数失败,返回的值是假的。获得详细错误信息,请查看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);

}

22.3 OrderCloseBy(平仓并反向开仓)

bool OrderCloseBy(    int ticket, int opposite, void Color)

用相反定单对打开仓位进行平仓操作。如果函数成功,返回的值是真实的。如果函数失败,返回的值是假的。获得详细错误信息,请查看GetLastError() 函数。

参量:

ticket      –      定单编号。

opposite      –      相对定单编号

Color      –      图表中标记颜色。如果参量丢失,CLR_NONE值将不会在图表中画出

示例:

if(iRSI(NULL,0,14,PRICE_CLOSE,0)>75)

{

OrderCloseBy(order_id,opposite_id);

return(0);

}

22.4 OrderClosePrice(平仓价)

double OrderClosePrice(    )

对于当前选择定单返回收盘价格。
注解:定单必须用OrderSelect()函数提前选定。

示例:

if(OrderSelect(ticket,SELECT_BY_POS)==true)

Print(“对于定单 “,定单编号” = “,OrderClosePrice()的收盘价格);

else

Print(“OrderSelect 失败错误代码是”,GetLastError());

22.5 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());

22.6 OrderComment(订单注释)

string OrderComment(    )

返回定单的注释。
注解:定单必须用OrderSelect()函数提前选定。

示例:

string comment;

if(OrderSelect(10,SELECT_BY_TICKET)==false)

{ Print(“OrderSelect 失败错误代码是”,GetLastError());

return(0);

}

comment = OrderComment();

// …

22.7 OrderCommission(手续费)

double OrderCommission(    )

返回定单的佣金数(手续费)。
注解:定单必须用OrderSelect()函数提前选定。

示例:

if(OrderSelect(10,SELECT_BY_POS)==true)

Print(“定单10 “佣金,OrderCommission());

else

Print(“OrderSelect 失败错误代码是”,GetLastError());

22.8 OrderDelete(删除挂单)

bool OrderDelete(    int ticket, void Color)

删除先前打开挂单。如果函数成功,返回的值是真实的。如果函数失败,返回的值是假的。获得详细错误信息,请查看GetLastError() 函数。

参量:

ticket      –      定单编号。

Color      –      图表中标记颜色。如果参量丢失,CLR_NONE值将不会在图表中画出。

示例:

if(Ask>var1)

{

OrderDelete(order_ticket);

return(0);

}

22.9 OrderExpiration(挂单有效期)

datetime OrderExpiration(    )

返回挂单的有效日期。
注解:定单必须用OrderSelect()函数提前选定。

示例:

if(OrderSelect(10, SELECT_BY_TICKET)==true)

Print(“定单 #10 有效日期为”,OrderExpiration());

else

Print(“OrderSelect 返回的”,GetLastError()错误);

22.10 OrderLots(订单手数)

double OrderLots(    )

返回选定定单的手数。
注解:定单必须用OrderSelect()函数提前选定。

示例:

if(OrderSelect(10,SELECT_BY_POS)==true)

Print(“定单 10 “手数,OrderLots());

else

Print(“OrderSelect 返回的 “,GetLastError()错误);

22.11 OrderMagicNumber(订单指定号码)

int OrderMagicNumber(    )

返回选定订单的指定编号
注解:定单必须用OrderSelect()函数提前选定。

示例:

if(OrderSelect(10,SELECT_BY_POS)==true)

Print(“定单 10 “指定编号, OrderMagicNumber());

else

Print(“OrderSelect 返回的 “,GetLastError()错误);

22.12 OrderModify(修改订单)

bool OrderModify(    int ticket, double price, double stoploss, double takeprofit, datetime expiration, void arrow_color)

对于先前的开仓或挂单进行特性修改。如果函数成功,返回的值为 TRUE。如果函数失败,返回的值为FALSE。 获得详细的错误信息,查看GetLastError() 函数。
注解: 开价格和有效时间的改变只对挂单而言。
如果未改变的值作为函数参量通过,将会生成错误 1 (ERR_NO_RESULT)。
在一些服务器中挂单的有效时间会被隐藏。这种情况下,当一个非零值在 有效参量被指定时,将生成错误 147 (ERR_TRADE_EXPIRATION_DENIED)。

参量:

ticket      –      定单编号。

price      –      收盘价格

stoploss      –      新止损水平。

takeprofit      –      新赢利水平。

expiration      –      挂单有效时间。

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

}

}

}

22.13 OrderOpenPrice(开仓价)

double OrderOpenPrice(    )

对于当前选择定单返回开价格。
定单必须由OrderSelect() 函数首先选定。

示例:

if(OrderSelect(10, SELECT_BY_POS)==true)

Print(“对于定单10 开价格”,OrderOpenPrice());

else

Print(“OrderSelect返回错误”,GetLastError());

22.14 OrderOpenTime(开仓时间)

datetime OrderOpenTime(    )

对于当前选择定单返回买入时间。
注解:定单必须用OrderSelect()函数提前选定。

示例:

if(OrderSelect(10, SELECT_BY_POS)==true)

Print(“定单10 买入时间”,OrderOpenTime());

else

Print(“OrderSelect 返回的错误 “,GetLastError());

22.15 OrderPrint(打印订单)

void OrderPrint(    )

按照以下形式打印选择定单信息:
定单编号;
开仓时间;
订单类型;
手数总数;
开仓价格;
止损;
止盈;
平仓时间;
平仓价格;
佣金(手续费);
掉期(隔夜利息);
盈利;
注释;
订单魔数;
挂单有效日期(仅用于挂单)
定单必须用OrderSelect()函数提前选定。

示例:

if(OrderSelect(10, SELECT_BY_TICKET)==true)

OrderPrint();

else

Print(“OrderSelect 失败错误代码是”,GetLastError());

22.16 OrderProfit(订单浮盈)

double OrderProfit(    )

对于选择定单返回净盈利值 (包含掉期和佣金在内,也就是说该函数得到的不是净盈利)。对于开仓位当前不真实盈利。对于平仓为固定盈利。
对于当前选择定单返回盈利。
注解:定单必须用OrderSelect()函数提前选定。

示例:

if(OrderSelect(10, SELECT_BY_POS)==true)

Print(“定单 10 盈利”,OrderProfit());

else

Print(“OrderSelect返回的错误”,GetLastError());

22.17 OrderSelect(选择订单)

bool OrderSelect(    int index, int select, void pool)

函数选择定单。如果函数成功,返回的值为TRUE。如果函数失败,返回的值为FALSE。获得详细错误信息,请查看GetLastError() 函数。
如果定单编号被选定,此pool参量被认知。此定单编号为唯一识别符。找出所选定单的列表,它的平仓时间必须进行分析。如果定单卖出时间为零, 开单和挂单将从终端位置列表打开。可以从订单类型区别开挂单和开单。 如果定单的平仓时间不等于0, 平仓和删除定单是在终端历史中被选择。他们同样可以区分删除定单是在终端历史中被选择。他们同样可以区分订单类型。

参量:

index      –      定单索引。

select      –      选定模式。可以为以下的任意值:
SELECT_BY_POS 索引号在订单池中(订单池是什么,举个例子:现在手上有10个订单,那么这个订单池就是这是个订单,编号依次为0-9)
SELECT_BY_TICKET 索引号是订单号(订单号就是每个订单的唯一识别号)

pool      –      可选择定单索引。当选择SELECT_BY_POS参量时使用。可以为以下的任意值:
MODE_TRADES (default)- 从交易池中选择的订单(开仓和挂单),
MODE_HISTORY – 从历史池中选择的订单(平仓和取消定单)。

示例:

if(OrderSelect(12470, SELECT_BY_TICKET)==true)

{

Print(“定单 #12470 开价格”, OrderOpenPrice());

Print(“定单 #12470 收盘价格 “, OrderClosePrice());

}

else

Print(“OrderSelect 返回的错误 “,GetLastError());

22.18 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 or OP_BUY), 只有最后的卖价格或买价格可以应用到开价格中. 如果执行当前带有不同证券的业务,必须使用带有MODE_BID 或 MODE_ASK参量的MarketInfo()函数获得. 预测或是不标准的价格不可用. 如果没有要求重新开价格或者没有按照小数点后的数字正常化,错误129 (ERR_INVALID_PRICE)将会生成. 如果请求开价格的日期完全过期,错误138 (ERR_REQUOTE)将会生成. 如果请求的价格是过时的,仓位只能够在当前价格位打开/只有当前价格位在price+-slippage范围内.

止损和赢利水平线不能够关闭市场. 最小距离的终止水平点可以使用MarketInfo ()函数得到MODE_STOPLEVEL参量。 在错误或水平位不正常停止情况下,错误130 (ERR_INVALID_STOPS)将会生成.

在挂单的位置,开价格不能够终止市场活动. 最小距离的终止水平点可以使用MarketInfo ()函数得到MODE_STOPLEVEL参量。 在错误或水平位不正常停止情况下,错误130 (ERR_INVALID_STOPS)将会生成.

挂单交易的期限在一些服务器上禁止应用。这种情况下,一个特殊的非零值的参量将会产生,错误 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);

}

}

22.19 OrdersHistoryTotal(历史订单数)

int OrdersHistoryTotal(    )

在账户历史返回关闭定单数加载进入终端。历史列表的大小取决于终端的”帐户历史” 表格的当前的设置.

示例:

// 来自交易历史的恢复信息

int i,hstTotal=OrdersHistoryTotal();

for(i=0;i<hstTotal;i++)

{

//—- 检查选择结果

if(OrderSelect(i,SELECT_BY_POS,MODE_HISTORY)==false)

{

Print(“带有 (“,GetLastError(),”)错误的历史失败通道”);

break;

}

// 定单的一些工作

22.20 OrderStopLoss(止损)

double OrderStopLoss(    )

对于当前选择定单返回止损值。
注解:定单必须用OrderSelect()函数提前选定。

示例:

if(OrderSelect(ticket,SELECT_BY_POS)==true)

Print(“对于10 止损值”, OrderStopLoss());

else

Print(“OrderSelect 失败错误代码是”,GetLastError());

22.21 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;pos<total;pos++)

{

if(OrderSelect(pos,SELECT_BY_POS)==false) continue;

FileWrite(handle,OrderTicket(),OrderOpenPrice(),OrderOpenTime(),OrderSymbol(),OrderLots());

}

FileClose(handle);

22.22 OrderSwap(隔夜利息)

double OrderSwap(    )

对于当前选择定单返回掉期值。
注解:定单必须用OrderSelect()函数提前选定。

示例:

if(OrderSelect(order_id, SELECT_BY_TICKET)==true)

Print(“对于定单 #掉期”, order_id, ” “,OrderSwap());

else

Print(“OrderSelect 失败错误代码是”,GetLastError());

22.23 OrderSymbol(订单货币对)

string OrderSymbol(    )

对于选择定单返回定单货币对值。
注解:定单必须用OrderSelect()函数提前选定。

示例:

if(OrderSelect(12, SELECT_BY_POS)==true)

Print(“定单 #货币对”, OrderTicket(), ” is “, OrderSymbol());

else

Print(“OrderSelect 失败错误代码是”,GetLastError());

22.24 OrderTakeProfit(止盈)

double OrderTakeProfit(    )

对于当前选择定单返回赢利值。
注解:定单必须用OrderSelect()函数提前选定。

示例:

if(OrderSelect(12, SELECT_BY_POS)==true)

Print(“定单 #”,OrderTicket(),” 盈利: “, OrderTakeProfit());

else

Print(“OrderSelect() 返回错误 – “,GetLastError());

22.25 OrderTicket(订单编号)

int OrderTicket(    )

对于当前选择定单返回定单编号。
注解:定单必须用OrderSelect()函数提前选定。

示例:

if(OrderSelect(12, SELECT_BY_POS)==true)

order=OrderTicket();

else

Print(“OrderSelect 失败错误代码”,GetLastError());

22.26 OrderType(订单类型)

int OrderType(    )

对于当前选择定单返回定单类型。可以是以下的任意值:
OP_BUY -买进,
OP_SELL – 卖出,
OP_BUYLIMIT – 挂单买入限定,
OP_BUYSTOP – 挂单停止限定,
OP_SELLLIMIT – 挂单卖出限定,
OP_SELLSTOP – 挂单停止限定。
注解: 定单必须由OrderSelect()函数选择。

示例:


int order_type;

if(OrderSelect(12, SELECT_BY_POS)==true)

{

order_type=OrderType();

// …

}

else

Print(“OrderSelect() 返回错误 – “,GetLastError());