外汇EA订单管理解析(三)

2026-04-02 11:55
小编
阅读
投资策略

// 若当前货币对无持仓,则跳过

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 )

点击咨询交易开户相关问题

免责声明:本文内容仅供参考,不构成投资建议。投资有风险,入市需谨慎。