外汇EA订单管理功能实现的简明指南
如果当前货币对没有持仓订单,则直接跳过该订单。
if ( OrderSymbol() != Symbol() ) continue;
若MagicNumber参数与设定的_MagicNumber不一致,则忽略该持仓。
if ( OrderMagicNumber() != _MagicNumber ) continue;
根据持仓类型的不同,对相应变量进行赋值处理。
switch ( OrderType() )
{
case OP_BUY: BuyOrder = OrderTicket(); break;
case OP_SELL: SellOrder = OrderTicket(); break;
case OP_BUYSTOP: BuyStopOrder = OrderTicket(); break;
case OP_SELLSTOP: SellStopOrder = OrderTicket(); break;
}
}
如果同时存在两个挂单交易,则退出等待它们触发。
if ( BuyStopOrder 0 && SellStopOrder 0 ) return(0);
在所有订单中进行第二次遍历,并执行后续操作。
_OrdersTotal = OrdersTotal();
for ( z = _OrdersTotDLSMal - 1; z = 0; z -- )
{
如果在订单选择过程中发生错误,则跳转至下一个持仓。
if ( !OrderSelect( z, SELECT_BY_POS ) )
{
_GetLastError = GetLastError();
Print("OrderSelect(", z, ", SELECT_BY_POS) - 错误 #",
_GetLastError );
continue;
}
如果当前货币对没有持仓订单,则直接跳过。
if ( OrderSymbol() != Symbol() ) continue;
若MagicNumber参数不一致,则忽略该持仓。
if ( OrderMagicNumber() != _MagicNumber ) continue;
根据持仓类型的不同,执行相应处理。
switch ( OrderType() )
{
当持仓为买入订单时,执行以下逻辑。
case OP_BUY:
{
若卖出挂单尚未删除,则先删除该挂单。
if ( SellStopOrder 0 )
{
if ( !OrderDelete( SellStopOrder ) )
{
Alert(OrderDelete Error #", GetLastError());
return(-1);
}
}
检查止损是否需要进行移动,若追踪止损值大于市场规定的止损水平。
if(TrailingStop MarketInfo( Symbol(),
MODE_STOPLEVEL ) )
{
若当前盈利点数已超过追踪止损点数,则执行移动操作。
if(NormalizeDouble( Bid - OrderOpenPrice(),
Digits )
NormalizeDouble(TrailingStop*Point,
Digits ) )
{
若新设置的止损水平高于当前止损线(或当前没有止损),则修改订单。
if(NormalizeDouble(Bid -
TrailingStop*Point, Digits )
OrderStopLoss() || OrderStopLoss() <=
0.0 )
{
执行订单修改操作。
if(!OrderModify( OrderTicket(),
OrderOpenPrice(),
NormalizeDouble(Bid -
TrailingStop*Point, Digits ),
OrderTakeProfit(),
OrderExpiration()))
{
Alert("OrderModify 错误 #",
GetLastError());
return(-1);
}
}
}
}
若没有持仓订单,则退出,无需处理。
return(0);
}
对于卖出订单,处理逻辑与买入订单类似。
case OP_SELL:
{
若买入挂单尚未删除,则先删除该挂单。
if ( BuyStopOrder 0 )
{
if ( !OrderDelete( BuyStopOrder ) )
{
Alert("OrderDelete 错误 #",
GetLastError());
return(-1);
}
}
同样地,检查追踪止损条件并执行相应调整。
if(TrailingStop MarketInfo( Symbol(),
MODE_STOPLEVEL ) )
{
if(NormalizeDouble(OrderOpenPrice() - Ask,
Dig
