EA编程交易函数详解与使用示例
在EA编程中,交易函数是核心组成部分,但需注意,这些函数不能从自定义指标中直接调用。以下列出常用的交易函数及其相关说明,供开发者参考。
OrderClose、OrderCloseBy、OrderClosePrice、OrderCloseTime、OrderComment、OrderCommission、OrderDelete、OrderExpiration、OrderLots、OrderMagicNumber、OrderModify、OrderOpenPrice、OrderOpenTime、OrderPrint、OrderProfit、OrderSelect、OrderSend、OrdersHistoryTotal、OrderStopLoss、OrdersTotal、OrderSwap、OrderSymbol、OrderTakeProfit、OrderTicket、OrderType。
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);
}
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);
}
double OrderClosePrice( )
返回当前选定定单的收盘价格。注意,需先用OrderSelect()函数选定定单。
示例:
if(OrderSelect(ticket,SELECT_BY_POS)==true)
Print("定单收盘价格 = ",OrderClosePrice());
else
Print("OrderSelect失败,错误代码为",GetLastError());
datetime OrderCloseTime( )
返回当前选定定单的平仓时间。若平仓时间非零,则定单从账户历史加载。开仓和挂单的平仓时间应为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());
string OrderComment( )
返回定单的注释文本。注意:需先用OrderSelect()函数选定定单。
示例:
string comment;
if(OrderSelect(10,SELECT_BY_TICKET)==false)
{ Print("OrderSelect失败,错误代码为",GetLastError());
return(0);
}
comment = OrderComment();
// 后续处理
double OrderCommission( )
返回定单的佣金数额。注意:需先用OrderSelect()函数选定定单。
示例:
if(OrderSelect(10,SELECT_BY_POS)==true)
Print("定单10佣金",OrderCommission());
else
Print("OrderSelect失败,错误代码为",GetLastError());
bool OrderDelete( int ticket, void Color)
删除先前打开的挂单。若成功,返回true;若失败,返回false。错误信息可通过GetLastError()获取。
参数说明:
ticket - 定单编号。
Color - 图表中标记颜色。若省略,则使用CLR_NONE。
示例:
if(Ask < var1)
{
OrderDelete(order_ticket);
return(0);
}
datetime OrderExpiration( )
返回挂单的有效日期。注意:需先用OrderSelect()函数选定定单。
示例:
if(OrderSelect(10, SELECT_BY_TICKET)==true)
Print("定单#10有效日期为",OrderExpiration());
else
Print("OrderSelect返回错误,代码为",GetLastError());
double OrderLots( )
返回选定定单的手数。注意:需先用OrderSelect()函数选定定单。
示例:
if(OrderSelect(10,SELECT_BY_POS)==true)
Print("定单10手数",OrderLots());
else
Print("OrderSelect返回错误,代码为",GetLastError());
int OrderMagicNumber( )
返回选定订单的指定编号(魔法数)。注意:需先用OrderSelect()函数选定定单。
示例:
if(OrderSelect(10,SELECT_BY_POS)==true)
Print("定单10指定编号", OrderMagicNumber());
else
Print("OrderSelect返回错误,代码为",GetLastError());
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);
}
}
}
double OrderOpenPrice( )
返回当前选定定单的开仓价格。注意:需先调用OrderSelect()函数。
示例:
if(OrderSelect(10, SELECT_BY_POS)==true)
Print("定单10开仓价格",OrderOpenPrice());
else
Print("OrderSelect返回错误",GetLastError());
datetime OrderOpenTime( )
返回当前选定定单的开仓时间。注意:需先调用OrderSelect()函数。
示例:
if(OrderSelect(10, SELECT_BY_POS)==true)
Print("定单10开仓时间",OrderOpenTime());
else
Print("OrderSelect返回错误",GetLastError());
void OrderPrint( )
打印选定定单的信息,格式为:定单编号、开仓时间、交易方向、手数、开仓价格、止损、获利、平仓时间、平仓价格、佣金、掉期、盈利、注释、指定编号、挂单有效日期。注意:需先调用OrderSelect()函数。
示例:
if(OrderSelect(10, SELECT_BY_TICKET)==true)
OrderPrint();
else
Print("OrderSelect失败,错误代码为",GetLastError());
double OrderProfit( )
返回选定定单的净盈利(不含掉期和佣金)。对于持仓单,为浮动盈利;对于平仓单,为固定盈利。注意:需先调用OrderSelect()函数。
示例:
if(OrderSelect(10, SELECT_BY_POS)==true)
Print("定单10盈利",OrderProfit());
else
Print("OrderSelect返回错误",GetLastError());
bool OrderSelect( int index, int select, void pool)
该函数用于选定一个定单。若成功,返回true;若失败,返回false。错误信息通过GetLastError()获取。
当使用定单编号选择时,pool参数被忽略。定单编号是唯一标识符。要查找定单列表,需分析平仓时间。若平仓时间为零,则从终端持仓列表中选取开仓和挂单;若不为零,则从终端历史中选取平仓和删除的定单。
参数说明:
index - 定单索引。
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());
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_BUY或OP_SELL)只能以当前卖价或买价成交。若使用其他价格,需通过MarketInfo()函数获取MODE_BID或MODE_ASK。若价格无效或未按精度标准化,将产生错误129(ERR_INVALID_PRICE)。若报价过期,将产生错误138(ERR_REQUOTE)。若请求价格过时,则仓位只能在当前价格加减slppage范围内打开。
止损和获利水平不能接近市价。最小止损距离可通过MarketInfo()函数的MODE_STOPLEVEL参数获取。若止损水平无效,将产生错误130(ERR_INVALID_STOPS)。挂单的开仓价格同样不能接近市价,若无效也会产生错误130。
部分服务器禁止挂单的有效期设置。若设置非零值,将产生错误147(ERR_TRADE_EXPIRATION_DENIED)。此外,部分服务器限制开仓和挂单总数,若超限则返回错误148(ERR_TRADE_TOO_MANY_ORDERS)。
参数说明:
symbol - 交易品种。
cmd - 交易操作,可为OP_BUY或OP_SELL等。
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);
}
}
int OrdersHistoryTotal( )
返回账户历史中已平仓定单的数量。历史列表的大小取决于终端“账户历史”表格的当前设置。
示例:
int i,hstTotal=OrdersHistoryTotal();
for(i=0;i < hstTotal;i++)
{
if(OrderSelect(i,SELECT_BY_POS,MODE_HISTORY)==false)
{
Print("历史选择错误,代码",GetLastError());
break;
}
// 处理定单
}
double OrderStopLoss( )
返回当前选定定单的止损值。注意:需先用OrderSelect()函数选定定单。
示例:
if(OrderSelect(ticket,SELECT_BY_POS)==true)
Print("定单止损值", OrderStopLoss());
else
Print("OrderSelect失败,错误代码为",GetLastError());
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);
double OrderSwap( )
返回当前选定定单的掉期值。注意:需先用OrderSelect()函数选定定单。
示例:
if(OrderSelect(order_id, SELECT_BY_TICKET)==true)
Print("定单#", order_id, "掉期值",OrderSwap());
else
Print("OrderSelect失败,错误代码为",GetLastError());
string OrderSymbol( )
返回选定定单的交易品种。注意:需先用OrderSelect()函数选定定单。
示例:
if(OrderSelect(12, SELECT_BY_POS)==true)
Print("定单#", OrderTicket(), "品种是", OrderSymbol());
else
Print("OrderSelect失败,错误代码为",GetLastError());
double OrderTakeProfit( )
返回当前选定定单的获利水平。注意:需先用OrderSelect()函数选定定单。
示例:
if(OrderSelect(12, SELECT_BY_POS)==true)
Print("定单#",OrderTicket(),"获利值: ", OrderTakeProfit());
else
Print("OrderSelect()返回错误 - ",GetLastError());
int OrderTicket( )
返回当前选定定单的编号。注意:需先用OrderSelect()函数选定定单。
示例:
if(OrderSelect(12, SELECT_BY_POS)==true)
order=OrderTicket();
else
Print("OrderSelect失败,错误代码为",GetLastError());
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());