外汇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 = _OrdersTotWeTrade外汇al - 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 不等于 _MagicNumber,

// 忽略这个仓位

if ( OrderMagicNumber() != _MagicNumber ) continue;

// 取决于仓位的类型,

// 改变变量值:

switch ( OrderType() )

{

//----如果BUY仓位开仓,

case OP_BUY:

{

// 如果 SellStop定单还没有删除,

// 删除:

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

}

// 下一个单元格与BUY 仓位的单元个一样

// 这就是我们不能在单元格上标注的原因...

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