'MODE_PENDING' - undeclared identifier 7777.mq4 109 44 抱歉,在 MetaTrader 4(MT4)中,没有名为'MODE_PENDING'的预定义常量。如果您想访问挂单的信息,您需要使用ORDER_TYPE_PENDING作为参数来调用OrderSelect()函数。

下面是修复后的完整代码:

extern int MagicNumber = 92133;           // 魔术码
extern double InitialLotSize = 0.5;       // 初始手数
extern double TakeProfitAmount = 80;      // 止盈金额
extern double MartingaleMultiplier = 2;   // 补仓倍数
extern int MaxMartingaleAttempts = 4;     // 补仓次数
extern int MartingaleDistance = 100;      // 补仓间距

void OnTick()
{
   double currentPrice = MarketInfo(Symbol(), MODE_BID);
   double openPrice = 0;
   double lotSize = InitialLotSize;
   int ordersCount = OrdersTotal();

   // 持仓检查
   if (ordersCount == 0)
   {
      // 挂单做多
      double buyStopPrice = NormalizeDouble(currentPrice + 200, Digits);
      int buyStopOrder = OrderSend(Symbol(), OP_BUYSTOP, lotSize, buyStopPrice, 0, 0, buyStopPrice + MartingaleDistance, 'Buy Stop Order', MagicNumber, 0, Green);

      // 挂单做空
      double sellStopPrice = NormalizeDouble(currentPrice - 200, Digits);
      int sellStopOrder = OrderSend(Symbol(), OP_SELLSTOP, lotSize, sellStopPrice, 0, 0, sellStopPrice - MartingaleDistance, 'Sell Stop Order', MagicNumber, 0, Red);
   }

   // 平仓逻辑
   for (int i = ordersCount - 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);
         }
      }
   }

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

   // 总盈利达到止盈金额,触发全部平仓并撤销所有挂单
   double totalProfit = 0;
   for (int i = ordersCount - 1; i >= 0; i--)
   {
      if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
      {
         if (OrderMagicNumber() == MagicNumber)
         {
            totalProfit += OrderProfit();
         }
      }
   }

   if (totalProfit >= TakeProfitAmount)
   {
      for (int i = ordersCount - 1; i >= 0; i--)
      {
         if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
         {
            if (OrderMagicNumber() == MagicNumber)
               OrderClose(OrderTicket(), OrderLots(), MarketInfo(Symbol(), MODE_BID), 0, White);
         }
      }

      for (int i = ordersCount - 1; i >= 0; i--)
      {
         if (OrderSelect(i, SELECT_BY_POS, ORDER_TYPE_PENDING))
         {
            if (OrderMagicNumber() == MagicNumber)
               OrderDelete(OrderTicket());
         }
      }

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

这是修复后的代码,应该可以在您的 MetaTrader 4(MT4)平台上运行。请记得进行充分的测试和验证,以确保代码的正确性和稳定性。

'MODE_PENDING' 错误:MetaTrader 4 中未定义的标识符 - 修复指南

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

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