外汇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