交易大师课程

当前位置:首页>外汇课堂>交易大师课程
全部 26 入门课程 10 中级课程 6 交易大师课程 4 mt4/mt5下载 0 免费mt4指标下载 2 经典策略(仅供参考) 4

简单的mt4EA代码示例

时间:2025-07-09   访问量:1002

以下代码包含了EMA交叉策略、4小时趋势过滤、止盈止损、趋势跟踪、止盈保护等功能。

//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
input int EMA12_Period = 12;            // 12周期EMA
input int EMA36_Period = 36;            // 36周期EMA
input int EMA13_Period = 13;            // 4小时图EMA13
input int EMA30_Period = 30;            // 4小时图EMA30
input int StopLoss_MinDistance = 30;    // 最小止损距离,点数
input double RiskRewardRatio = 3.0;     // 盈亏比,默认3倍
input bool Enable4HTrendFilter = false; // 是否启用4小时趋势过滤(默认关闭)
input double TrendProtectionThreshold = 0.5; // 盈利保护阈值 (默认0.5, 即3+0.5=3.5倍时进行保护)
input double MaxProfitMultiplier = 5.0; // 盈利达到5倍时平仓(可配置)

double EMA12, EMA36, EMA13, EMA30, EMA15; // 当前周期和4小时图的EMA
double OpenPrice = 0;
double StopLoss = 0;
double TakeProfit = 0;
int ticket;

//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit() {
   // 初始化
   Print("Expert Initialized!");
   return(INIT_SUCCEEDED);
}

//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason) {
   Print("Expert Deinitialized!");
}

//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick() {
   // 获取当前周期和4小时图的EMA值
   EMA12 = iMA(Symbol(), 0, EMA12_Period, 0, MODE_EMA, PRICE_CLOSE, 0);
   EMA36 = iMA(Symbol(), 0, EMA36_Period, 0, MODE_EMA, PRICE_CLOSE, 0);
   
   // 获取4小时图上的EMA值
   EMA13 = iMA(Symbol(), PERIOD_H4, EMA13_Period, 0, MODE_EMA, PRICE_CLOSE, 0);
   EMA30 = iMA(Symbol(), PERIOD_H4, EMA30_Period, 0, MODE_EMA, PRICE_CLOSE, 0);
   EMA15 = iMA(Symbol(), 0, 15, 0, MODE_EMA, PRICE_CLOSE, 0); // 当前周期15EMA

   // 4H趋势过滤
   bool is4HTrendUp = EMA13 > EMA30; // 4小时趋势向上
   bool is4HTrendDown = EMA13 < EMA30; // 4小时趋势向下

   // EMA交叉条件
   bool isCrossUp = EMA12 > EMA36 && iMA(Symbol(), 0, EMA12_Period, 0, MODE_EMA, PRICE_CLOSE, 1) <= iMA(Symbol(), 0, EMA36_Period, 0, MODE_EMA, PRICE_CLOSE, 1);
   bool isCrossDown = EMA12 < EMA36 && iMA(Symbol(), 0, EMA12_Period, 0, MODE_EMA, PRICE_CLOSE, 1) >= iMA(Symbol(), 0, EMA36_Period, 0, MODE_EMA, PRICE_CLOSE, 1);

   // 当前是否处于盈利保护范围
   bool isProfitProtection = (OrderProfit() >= StopLoss_MinDistance * RiskRewardRatio + TrendProtectionThreshold);

   // 仅在4H趋势符合时执行交易
   if (Enable4HTrendFilter) {
      if (isCrossUp && is4HTrendUp) {
         OpenBuyOrder();
      } else if (isCrossDown && is4HTrendDown) {
         OpenSellOrder();
      }
   } else {
      if (isCrossUp) {
         OpenBuyOrder();
      } else if (isCrossDown) {
         OpenSellOrder();
      }
   }
   
   // 如果有开仓单,检查是否符合止盈保护条件
   if (OrderSelect(ticket, SELECT_BY_TICKET)) {
      if (OrderType() == OP_BUY) {
         if (OrderProfit() > RiskRewardRatio * StopLoss_MinDistance) {
            ProtectTakeProfitForBuy();
         }
      } else if (OrderType() == OP_SELL) {
         if (OrderProfit() > RiskRewardRatio * StopLoss_MinDistance) {
            ProtectTakeProfitForSell();
         }
      }
   }
}

//+------------------------------------------------------------------+
//| 开仓买单的函数                                                    |
//+------------------------------------------------------------------+
void OpenBuyOrder() {
   double stopLossLevel = NormalizeDouble(EMA36 + StopLoss_MinDistance * Point, MarketInfo(Symbol(), MODE_DIGITS));
   double takeProfitLevel = NormalizeDouble(stopLossLevel + (StopLoss_MinDistance * RiskRewardRatio * Point), MarketInfo(Symbol(), MODE_DIGITS));

   // 下单
   ticket = OrderSend(Symbol(), OP_BUY, 0.1, Ask, 2, stopLossLevel, takeProfitLevel, "EMA Cross Buy", 0, 0, Green);
   if (ticket < 0) {
      Print("Error opening buy order: ", ErrorDescription(GetLastError()));
   }
}

//+------------------------------------------------------------------+
//| 开仓卖单的函数                                                    |
//+------------------------------------------------------------------+
void OpenSellOrder() {
   double stopLossLevel = NormalizeDouble(EMA36 - StopLoss_MinDistance * Point, MarketInfo(Symbol(), MODE_DIGITS));
   double takeProfitLevel = NormalizeDouble(stopLossLevel - (StopLoss_MinDistance * RiskRewardRatio * Point), MarketInfo(Symbol(), MODE_DIGITS));

   // 下单
   ticket = OrderSend(Symbol(), OP_SELL, 0.1, Bid, 2, stopLossLevel, takeProfitLevel, "EMA Cross Sell", 0, 0, Red);
   if (ticket < 0) {
      Print("Error opening sell order: ", ErrorDescription(GetLastError()));
   }
}

//+------------------------------------------------------------------+
//| 买单的止盈保护函数                                                |
//+------------------------------------------------------------------+
void ProtectTakeProfitForBuy() {
   if (OrderProfit() > RiskRewardRatio * StopLoss_MinDistance) {
      double newTakeProfit = NormalizeDouble(OrderOpenPrice() + StopLoss_MinDistance * RiskRewardRatio * Point, MarketInfo(Symbol(), MODE_DIGITS));
      OrderModify(ticket, OrderOpenPrice(), OrderStopLoss(), newTakeProfit, 0, CLR_NONE);
   }
}

//+------------------------------------------------------------------+
//| 卖单的止盈保护函数                                                |
//+------------------------------------------------------------------+
void ProtectTakeProfitForSell() {
   if (OrderProfit() > RiskRewardRatio * StopLoss_MinDistance) {
      double newTakeProfit = NormalizeDouble(OrderOpenPrice() - StopLoss_MinDistance * RiskRewardRatio * Point, MarketInfo(Symbol(), MODE_DIGITS));
      OrderModify(ticket, OrderOpenPrice(), OrderStopLoss(), newTakeProfit, 0, CLR_NONE);
   }
}


上一篇:在外汇交易中POC是什么?如何使用POC

下一篇:没有了!