MQL4 自动交易代码:带返回值检查的订单管理
MQL4 自动交易代码:带返回值检查的订单管理
这篇文档提供了一份 MQL4 自动交易代码,包含了详细的返回值检查功能,用于订单管理,确保交易策略的顺利执行。
以下是代码:mq4// 定义参数extern int MagicNumber = 92133;extern double InitialLotSize = 0.5;extern double ProfitTarget = 80;extern int MaxRebuyCount = 4;extern int RebuyInterval = 100;extern int Slippage = 4;
// 持仓订单数int GetOpenOrderCount(int magicNumber) { int count = 0; for (int i = OrdersTotal() - 1; i >= 0; i--) { if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES) && OrderMagicNumber() == magicNumber) { count++; } } return count;}
// 挂单数int GetPendingOrderCount(int magicNumber) { int count = 0; for (int i = OrdersTotal() - 1; i >= 0; i--) { if (OrderSelect(i, SELECT_BY_POS, MODE_HISTORY) && OrderMagicNumber() == magicNumber) { break; } if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES) && OrderMagicNumber() == magicNumber) { break; } count++; } return count;}
// 判断是否触发挂单条件bool ShouldPlacePendingOrders(int magicNumber) { double latestPrice = MarketInfo(Symbol(), MODE_BID); if (GetOpenOrderCount(magicNumber) == 0 && GetPendingOrderCount(magicNumber) == 0) { int buyOrderTicket = OrderSend(Symbol(), OP_BUY, InitialLotSize, latestPrice + Slippage, 0, 0, 0, 'Buy Order', MagicNumber, 0, clrBlue); int sellOrderTicket = OrderSend(Symbol(), OP_SELL, InitialLotSize, latestPrice - Slippage, 0, 0, 0, 'Sell Order', MagicNumber, 0, clrRed); if (buyOrderTicket > 0 && sellOrderTicket > 0) { return true; } else { if (buyOrderTicket == -1) { Print('Failed to send buy order. Error Code: ', GetLastError()); } if (sellOrderTicket == -1) { Print('Failed to send sell order. Error Code: ', GetLastError()); } } } return false;}
// 顺势补仓void RebuyOrders(int magicNumber) { double latestPrice = MarketInfo(Symbol(), MODE_BID); for (int i = OrdersTotal() - 1; i >= 0; i--) { if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES) && OrderMagicNumber() == magicNumber) { if (OrderType() == OP_BUY) { int rebuyCount = MathMin(OrderTicket(), MaxRebuyCount); double lotSize = OrderLots(); for (int j = 0; j < rebuyCount; j++) { lotSize *= 2; int buyOrderTicket = OrderSend(Symbol(), OP_BUY, lotSize, latestPrice + Slippage, 0, 0, 0, 'Buy Order', MagicNumber, 0, clrBlue); if (buyOrderTicket == -1) { Print('Failed to send buy order. Error Code: ', GetLastError()); } } } if (OrderType() == OP_SELL) { int rebuyCount = MathMin(OrderTicket(), MaxRebuyCount); double lotSize = OrderLots(); for (int j = 0; j < rebuyCount; j++) { lotSize *= 2; int sellOrderTicket = OrderSend(Symbol(), OP_SELL, lotSize, latestPrice - Slippage, 0, 0, 0, 'Sell Order', MagicNumber, 0, clrRed); if (sellOrderTicket == -1) { Print('Failed to send sell order. Error Code: ', GetLastError()); } } } break; } }}
// 清仓void CloseAllOrders(int magicNumber) { for (int i = OrdersTotal() - 1; i >= 0; i--) { if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES) && OrderMagicNumber() == magicNumber) { bool orderCloseResult = OrderClose(OrderTicket(), OrderLots(), Bid, Slippage, clrNONE); if (!orderCloseResult) { Print('Failed to close order. Error Code: ', GetLastError()); } } } Sleep(60000); // 1分钟后重新开始判断 if (GetOpenOrderCount(magicNumber) == 0 && GetPendingOrderCount(magicNumber) == 0) { ShouldPlacePendingOrders(magicNumber); }}
// 在OnTick()函数中使用以上函数void OnTick(){ int magicNumber = MagicNumber; if (AccountProfit() >= ProfitTarget) { CloseAllOrders(magicNumber); return; } if (ShouldPlacePendingOrders(magicNumber)) { return; } if (GetOpenOrderCount(magicNumber) > 0 || GetPendingOrderCount(magicNumber) > 0) { return; } RebuyOrders(magicNumber);}
代码说明:
- 返回值检查:
OrderSend和OrderClose函数的返回值会被检查,如果返回值为 -1,则表示函数调用失败,此时会打印错误信息到日志中,方便排查问题。* 错误处理: 通过GetLastError()函数获取错误代码,并打印到日志中,帮助你识别和解决问题。* 清晰的注释: 代码中包含了清晰的注释,帮助你理解代码逻辑。
注意:
- 这段代码只是一个示例,你需要根据自己的实际需求进行修改和测试。* 在实际使用之前,请确保你已经充分理解代码的逻辑以及风险。
希望这段代码能帮助你更好地进行 MQL4 自动交易编程。
原文地址: https://www.cveoy.top/t/topic/dvv7 著作权归作者所有。请勿转载和采集!