文章目录 [显示]
交易管理的一组函数。
从自定义指标中不能调用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());