MQL4交易策略:修复重复挂单和顺势补仓逻辑

本文提供了一个经过修正的MQL4交易策略代码,解决了以下问题:

  • 重复挂单: 原始代码在每次价格变动时都会重复挂单,导致订单堆积。* 顺势补仓逻辑错误: 原始代码的顺势补仓逻辑计算有误。

以下是修正后的代码:mq4extern int magicNumber = 92133;extern double initialLots = 0.5;extern double profitTarget = 80.0;extern int maxReplenishCount = 4;extern int replenishInterval = 100;extern int slippage = 4;

int countBuyStop = 0;int countSellStop = 0;

void OnTick(){ // 检查是否存在未平仓订单 if (!CheckOpenPositions()) { double currentPrice = MarketInfo(Symbol(), MODE_ASK); double buyStopPrice = currentPrice + (200 * Point); double sellStopPrice = currentPrice - (200 * Point); // 只挂一次买入止损订单 if (countBuyStop < 1) { PlaceOrder(OP_BUYSTOP, buyStopPrice, initialLots); countBuyStop++; } // 只挂一次卖出止损订单 if (countSellStop < 1) { PlaceOrder(OP_SELLSTOP, sellStopPrice, initialLots); countSellStop++; } } CheckPendingOrders(); CheckProfitTarget();}

// 检查是否存在未平仓的交易订单bool CheckOpenPositions(){ for (int i = OrdersTotal() - 1; i >= 0; i--) { if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) { if (OrderMagicNumber() == magicNumber && OrderSymbol() == Symbol() && OrderType() <= OP_SELL) { return true; } } } return false;}

// 下单函数int PlaceOrder(int orderType, double price, double lots){ int ticket = OrderSend(Symbol(), orderType, lots, price, slippage, 0, 0, 'GPT Order', magicNumber, 0, Blue); if (ticket > 0) { Print('Order placed successfully: ', ticket); } else { Print('Failed to place order. Error code: ', GetLastError()); } return ticket;}

// 检查挂单状态并进行顺势补仓void CheckPendingOrders(){ for (int i = OrdersTotal() - 1; i >= 0; i--) { if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) { // 检查买入止损订单是否被触发 if (OrderMagicNumber() == magicNumber && OrderSymbol() == Symbol() && OrderType() == OP_BUYSTOP) { if (OrderOpenPrice() <= (Ask - (slippage * Point))) { int buyTicket = PlaceOrder(OP_BUY, 0, OrderLots() * MathPow(2, countBuyStop)); // 修正后的仓位计算 if (buyTicket > 0) { countBuyStop++; // 增加计数器以进行下一次补仓 } else { Print('Failed to place buy order. Error code: ', GetLastError()); } } } // 检查卖出止损订单是否被触发 else if (OrderMagicNumber() == magicNumber && OrderSymbol() == Symbol() && OrderType() == OP_SELLSTOP) { if (OrderOpenPrice() >= (Bid + (slippage * Point))) { int sellTicket = PlaceOrder(OP_SELL, 0, OrderLots() * MathPow(2, countSellStop)); // 修正后的仓位计算 if (sellTicket > 0) { countSellStop++; // 增加计数器以进行下一次补仓 } else { Print('Failed to place sell order. Error code: ', GetLastError()); } } } } }}

// 检查总盈利是否达到目标void CheckProfitTarget(){ double totalProfit = 0; for (int i = OrdersTotal() - 1; i >= 0; i--) { if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) { if (OrderMagicNumber() == magicNumber && OrderSymbol() == Symbol()) { totalProfit += OrderProfit(); } } } if (totalProfit >= profitTarget) { CloseAllOrders(); DeleteAllPendingOrders(); Sleep(60000); // 1 minute delay }}

// 平掉所有订单void CloseAllOrders(){ for (int i = OrdersTotal() - 1; i >= 0; i--) { if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) { if (OrderMagicNumber() == magicNumber && OrderSymbol() == Symbol()) { bool closed = OrderClose(OrderTicket(), OrderLots(), OrderClosePrice(), slippage, Red); if (!closed) { Print('Failed to close order. Error code: ', GetLastError()); } } } }}

// 删除所有挂单void DeleteAllPendingOrders(){ for (int i = OrdersTotal() - 1; i >= 0; i--) { if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) { if (OrderMagicNumber() == magicNumber && OrderSymbol() == Symbol() && (OrderType() == OP_BUYSTOP || OrderType() == OP_SELLSTOP)) { bool deleted = OrderDelete(OrderTicket()); if (!deleted) { Print('Failed to delete order. Error code: ', GetLastError()); } } } }}

代码说明:

  • 代码中添加了注释,方便理解。* CheckOpenPositions 函数用于检查是否存在未平仓订单,避免重复挂单。* CheckPendingOrders 函数在挂单被触发时进行顺势补仓,并修正了仓位计算的逻辑。

注意: 在使用此代码之前,请进行充分的测试和验证。交易外汇和差价合约具有高风险,请谨慎操作。

MQL4交易策略:修复重复挂单和顺势补仓逻辑

原文地址: https://www.cveoy.top/t/topic/dq68 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录