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