// 若当前货币对无持仓,则跳过
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 = _OrdersTotal - 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() )
{
//---- 处理已开立的BUY订单
case OP_BUY:
{
// 若SellStop挂单尚未删除,
// 则执行删除操作:
if ( SellStopOrder 0 )
{
if ( !OrderDelete( SellStopOrder ) )
{
Alert("OrderDelete 错误 #", 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);
}
// SELL订单的处理逻辑与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,
Digits )
免责声明:本文内容仅供参考,不构成投资建议。投资有风险,入市需谨慎。