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;        // 补仓间距

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

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

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

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

   // 检查挂单是否存在
   if (!hasPendingOrders)
   {
      // 挂单做多
      double buyStopPrice = NormalizeDouble(currentPrice + 200 * Point, Digits);
      int buyStopOrder = OrderSend(Symbol(), OP_BUYSTOP, InitialLotSize, buyStopPrice, 0, buyStopPrice - MartingaleDistance * Point, 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, sellStopPrice + MartingaleDistance * Point, 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(OrderSymbol(), MODE_BID), 0, White);
               totalOrders--;
            }
         }
      }

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

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

代码解释:

  • 外部变量: 定义了魔术码、初始手数、止盈金额、补仓倍数、最大补仓次数和补仓间距等参数。
  • 全局变量: 声明了总订单数和是否有挂单的变量。
  • OnTick() 函数: 在每个价格变动时被调用,包含了EA的主要逻辑。
    • 平仓逻辑: 遍历所有订单,平掉属于该EA的订单。
    • 删除挂单逻辑: 遍历所有挂单,删除属于该EA的挂单。
    • 检查挂单是否存在: 如果没有挂单,则分别挂出多单和空单。
    • 补仓逻辑: 遍历所有订单,根据当前价格和订单类型进行顺势补仓。
    • 检查总盈利: 计算所有订单的总盈利,达到止盈金额时平仓所有订单并重置挂单状态。

参数设置:

  • MagicNumber: EA的唯一标识符,用于区分不同的EA。
  • InitialLotSize: 初始交易手数。
  • TakeProfitAmount: 止盈金额,单位为货币。
  • MartingaleMultiplier: 每次补仓时的倍数。
  • MaxMartingaleAttempts: 最大补仓次数。
  • MartingaleDistance: 补仓间距,单位为点。

风险提示:

马丁策略是一种高风险的交易策略,使用时需谨慎。在市场趋势不明显或出现剧烈波动时,该策略可能会导致重大损失。建议您在模拟账户上充分测试该策略,并根据自己的风险承受能力进行调整。

MQL4 顺势马丁策略EA交易代码

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

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