MT4自动交易策略:基于魔术码的多空双向网格交易系统

本策略是一个基于魔术码的多空双向网格交易系统,适用于MetaTrader 4(MT4)平台。

策略逻辑

1. 初始化

  • 定义可更改参数:
    • magicNumber:魔术码,用于区分不同策略的订单
    • initialLots:初始手数
    • interval:网格间距
    • replenishmentMultiplier:补仓倍数
    • maxReplenishmentCount:最大补仓次数
    • takeProfitAmount:止盈金额

2. 入场逻辑

  • 无持仓时:
    • 以最新价加 interval 点挂单一次多单,手数为 initialLots
    • 以最新价减 interval 点挂单一次空单,手数为 initialLots
  • 多单成交:
    • 删除挂单的空单。
    • 在持仓价的基础上,每间隔 interval 点,开仓一次多单,开仓手数为上一个多单手数的 replenishmentMultiplier 倍,最多补仓 maxReplenishmentCount 次。
  • 空单成交:
    • 删除挂单的多单。
    • 在持仓价的基础上,每间隔 interval 点,开仓一次空单,开仓手数为上一个空单手数的 replenishmentMultiplier 倍,最多补仓 maxReplenishmentCount 次。

3. 加仓逻辑

  • 持有多单无空单,且最新价小于第一个多单持仓价 interval 点时,以 initialLots 手数做空。
  • 持有空单无多单,且最新价大于第一个空单持仓价 interval 点时,以 initialLots 手数做多。

4. 平仓逻辑

  • 当所有订单总盈利达到 takeProfitAmount 时,平掉所有订单。

代码实现

extern int magicNumber = 92133; 
extern double initialLots = 0.5; 
extern int interval = 100; 
extern double replenishmentMultiplier = 0.6; 
extern int maxReplenishmentCount = 5; 
extern double takeProfitAmount = 80; 

int totalOrders = 0; 
int buyOrders = 0; 
int sellOrders = 0; 
double lastBuyOrderPrice = 0; 
double lastSellOrderPrice = 0; 

void OpenOrder(double lots, int type) {
   double price = Ask; 
   if (type == OP_BUY) {
      lastBuyOrderPrice = price;
      buyOrders++;
   } else if (type == OP_SELL) {
      lastSellOrderPrice = price;
      sellOrders++;
   }
   totalOrders++;
   
   OrderSend(Symbol(), type, lots, price, 3, 0, 0, 'MagicNumber', magicNumber, 0, Green);
}

void CloseOrder(int ticket) {
   OrderClose(ticket, OrderLots(), OrderClosePrice(), 3, Red);
   totalOrders--;
   if (OrderType() == OP_BUY)
      buyOrders--;
   else if (OrderType() == OP_SELL)
      sellOrders--;
}

void ReplenishOrder(int type) {
   double lots = OrderLots() * replenishmentMultiplier;
   if (type == OP_BUY && buyOrders < maxReplenishmentCount)
      OpenOrder(lots, OP_BUY);
   else if (type == OP_SELL && sellOrders < maxReplenishmentCount)
      OpenOrder(lots, OP_SELL);
}

void OnTick() {
   double price = Ask; 
   int orders = OrdersTotal(); 
   
   if (buyOrders > 0 && sellOrders == 0 && price < lastBuyOrderPrice - interval) {
      CloseAllOrders();
      OpenOrder(initialLots, OP_SELL);
   }
   
   if (buyOrders > 0 && sellOrders == 0 && price > lastSellOrderPrice + interval) {
      CloseAllOrders();
      OpenOrder(initialLots, OP_BUY);
   }
   
   double totalProfit = 0;
   for (int i = 0; i < orders; i++) {
      if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
         if (OrderMagicNumber() == magicNumber)
            totalProfit += OrderProfit();
      }
   }
   if (totalProfit >= takeProfitAmount)
      CloseAllOrders();
}

void CloseAllOrders() {
   int orders = OrdersTotal();
   for (int i = orders - 1; i >= 0; i--) {
      if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
         if (OrderMagicNumber() == magicNumber)
            CloseOrder(OrderTicket());
      }
   }
}

void OnInit() {
   totalOrders = 0;
   buyOrders = 0;
   sellOrders = 0;
   lastBuyOrderPrice = 0;
   lastSellOrderPrice = 0;
}

void start() {
   OnTick();
}

免责声明

本策略仅供学习和参考,不构成任何投资建议。在实际交易中,您需要根据自己的风险承受能力和市场情况进行调整和优化。使用本策略造成的任何损失,作者概不负责。

MT4自动交易策略:基于魔术码的多空双向网格交易系统

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

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