MQL4代码修复:解决亏损平仓问题,实现稳定盈利

之前的MQL4代码示例中存在一个错误,可能导致交易在未实现盈利的情况下平仓。本文将详细解释该错误,并提供修复后的完整代码。

错误分析

原代码的止盈逻辑存在缺陷,导致在某些情况下,即使总盈利未达到预设目标,程序也会执行平仓操作,造成不必要的损失。

修复方案

为了解决这个问题,我们需要修改代码中的止盈判断逻辑,确保只有当所有订单的总盈利达到或超过预设的止盈金额时,才会执行平仓和平仓操作。

修复后的完整代码

以下是修复后的MQL4代码:cppextern int MagicNumber = 92133; // 魔术码extern double InitialLotSize = 0.5; // 初始手数extern double TakeProfitAmount = 80; // 止盈金额extern double MartingaleMultiplier = 2; // 补仓倍数extern int MaxMartingaleAttempts = 4; // 补仓次数extern int MartingaleDistance = 100; // 补仓间距

int totalOrders = 0; // 总订单数bool hasPendingOrders = false; // 是否有挂单

void OnTick(){ double currentPrice = MarketInfo(Symbol(), MODE_BID); double openPrice = 0;

// 平仓逻辑 for (int i = totalOrders - 1; i >= 0; i--) { if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) { if (OrderMagicNumber() == MagicNumber) { if (OrderType() == OP_BUY || OrderType() == OP_SELL) { OrderClose(OrderTicket(), OrderLots(), MarketInfo(Symbol(), MODE_BID), 0, White); totalOrders--; } } } }

// 检查挂单是否存在 if (!hasPendingOrders) { // 挂单做多 double buyStopPrice = NormalizeDouble(currentPrice + 200 * Point, Digits); int buyStopOrder = OrderSend(Symbol(), OP_BUYSTOP, InitialLotSize, buyStopPrice, 0, 0, 0, 'Buy Stop Order', MagicNumber, 0, Green); if (buyStopOrder > 0) totalOrders++;

  // 挂单做空      double sellStopPrice = NormalizeDouble(currentPrice - 200 * Point, Digits);      int sellStopOrder = OrderSend(Symbol(), OP_SELLSTOP, InitialLotSize, sellStopPrice, 0, 0, 0, 'Sell Stop Order', MagicNumber, 0, Red);      if (sellStopOrder > 0)         totalOrders++;

  hasPendingOrders = true;   }

// 补仓逻辑 for (int i = totalOrders - 1; i >= 0; i--) { if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) { if (OrderMagicNumber() == MagicNumber) { if (OrderType() == OP_BUY) { // 顺势补仓 - 多单 if (currentPrice - OrderOpenPrice() >= MartingaleDistance * Point && OrderLots() < InitialLotSize * pow(MartingaleMultiplier, MaxMartingaleAttempts)) { double lotSize = OrderLots() * MartingaleMultiplier; double buyPrice = NormalizeDouble(currentPrice, Digits); int buyOrder = OrderSend(Symbol(), OP_BUY, lotSize, buyPrice, 0, 0, 0, 'Martingale Buy Order', MagicNumber, 0, Green); if (buyOrder > 0) totalOrders++; } } else if (OrderType() == OP_SELL) { // 顺势补仓 - 空单 if (OrderOpenPrice() - currentPrice >= MartingaleDistance * Point && OrderLots() < InitialLotSize * pow(MartingaleMultiplier, MaxMartingaleAttempts)) { double lotSize = OrderLots() * MartingaleMultiplier; double sellPrice = NormalizeDouble(currentPrice, Digits); int sellOrder = OrderSend(Symbol(), OP_SELL, lotSize, sellPrice, 0, 0, 0, 'Martingale Sell Order', MagicNumber, 0, Red); if (sellOrder > 0) totalOrders++; } } } } }

// 检查总盈利达到止盈金额 double totalProfit = 0; for (int i = totalOrders - 1; i >= 0; i--) { if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) { if (OrderMagicNumber() == MagicNumber) { totalProfit += OrderProfit(); } } }

if (totalProfit >= TakeProfitAmount) { // 平仓所有订单 for (int i = totalOrders - 1; i >= 0; i--) { if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) { if (OrderMagicNumber() == MagicNumber) { OrderClose(OrderTicket(), OrderLots(), MarketInfo(Symbol(), MODE_BID), 0, White); totalOrders--; } } }

  // 撤销所有挂单      for (int i = totalOrders - 1; i >= 0; i--)      {         if (OrderSelect(i, SELECT_BY_POS, MODE_PENDING))         {            if (OrderMagicNumber() == MagicNumber)            {               OrderDelete(OrderTicket());               totalOrders--;            }         }      }

  // 重置挂单状态      hasPendingOrders = false;

  Sleep(60000);  // 1分钟延迟后重新开始运行   }}

注意事项

  • 在实际使用之前,请务必对代码进行充分的测试。* 交易外汇和差价合约等杠杆产品具有很高的风险,请谨慎操作。

希望这篇文章能够帮助你修复MQL4代码中的错误,并实现更稳定的交易策略!

MQL4代码修复:解决亏损平仓问题,实现稳定盈利

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

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