双均线交叉EA — 完整MQL4源码
本EA采用快慢均线交叉产生买卖信号,内置固定手数、止损止盈及移动止损功能,适合EA编程入门学习。
完整MQL4源码
mql4
//+------------------------------------------------------------------+
//| DualMA_Crossover_EA.mq4 |
//| Copyright 2026, 自主编译 |
//| 免费EA下载 |
//+------------------------------------------------------------------+
#property copyright "自主编译"
#property version "1.00"
#property strict
//--- 输入参数
input int FastMA_Period = 10; // 快线周期
input int SlowMA_Period = 50; // 慢线周期
input int MA_Method = 0; // 均线类型: 0=SMA, 1=EMA
input double LotSize = 0.01; // 固定手数
input int StopLoss = 50; // 止损(点)
input int TakeProfit = 100; // 止盈(点)
input bool UseTrailing = true; // 启用移动止损
input int TrailingStop = 30; // 移动止损距离
input int TrailingStep = 10; // 移动步长
input int MagicNumber = 123456; // 魔术号
//--- 全局变量
double fastMA, slowMA;
//+------------------------------------------------------------------+
//| 初始化函数 |
//+------------------------------------------------------------------+
int OnInit()
{
Print("双均线EA已加载. 快线=", FastMA_Period, " 慢线=", SlowMA_Period);
return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| 反初始化函数 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{
Print("EA已移除. 原因: ", reason);
}
//+------------------------------------------------------------------+
//| ticks函数 |
//+------------------------------------------------------------------+
void OnTick()
{
fastMA = iMA(NULL, 0, FastMA_Period, 0, MA_Method, PRICE_CLOSE, 0);
slowMA = iMA(NULL, 0, SlowMA_Period, 0, MA_Method, PRICE_CLOSE, 0);
double fastMA_prev = iMA(NULL, 0, FastMA_Period, 0, MA_Method, PRICE_CLOSE, 1);
double slowMA_prev = iMA(NULL, 0, SlowMA_Period, 0, MA_Method, PRICE_CLOSE, 1);
//--- 买入信号:快线上穿慢线
if(fastMA_prev <= slowMA_prev && fastMA > slowMA)
{
if(CountOrders(OP_BUY) == 0) OpenOrder(OP_BUY);
}
//--- 卖出信号:快线下穿慢线
if(fastMA_prev >= slowMA_prev && fastMA < slowMA)
{
if(CountOrders(OP_SELL) == 0) OpenOrder(OP_SELL);
}
if(UseTrailing) TrailStop();
}
//+------------------------------------------------------------------+
//| 下单函数 |
//+------------------------------------------------------------------+
void OpenOrder(int orderType)
{
double price, sl, tp;
if(orderType == OP_BUY)
{
price = Ask;
sl = StopLoss > 0 ? Ask - StopLoss Point 10 : 0;
tp = TakeProfit > 0 ? Ask + TakeProfit Point 10 : 0;
}
else
{
price = Bid;
sl = StopLoss > 0 ? Bid + StopLoss Point 10 : 0;
tp = TakeProfit > 0 ? Bid - TakeProfit Point 10 : 0;
}
int ticket = OrderSend(Symbol(), orderType, LotSize, price, 3, sl, tp, "双均线EA", MagicNumber, 0, orderType == OP_BUY ? clrGreen : clrRed);
if(ticket < 0) Print("下单失败. 错误代码: ", GetLastError());
else Print("订单已开: ", ticket);
}
//+------------------------------------------------------------------+
//| 统计持仓数量 |
//+------------------------------------------------------------------+
int CountOrders(int type)
{
int count = 0;
for(int i = 0; i < OrdersTotal(); i++)
if(OrderSelect(i, SELECT_BY_POS) && OrderSymbol() == Symbol() && OrderMagicNumber() == MagicNumber && OrderType() == type)
count++;
return count;
}
//+------------------------------------------------------------------+
//| 移动止损函数 |
//+------------------------------------------------------------------+
void TrailStop()
{
for(int i = 0; i < OrdersTotal(); i++)
{
if(OrderSelect(i, SELECT_BY_POS) && OrderSymbol() == Symbol() && OrderMagicNumber() == MagicNumber)
{
if(OrderType() == OP_BUY)
{
double newSL = Bid - TrailingStop Point 10;
if(newSL > OrderStopLoss() + TrailingStep Point 10 && newSL < Bid)
OrderModify(OrderTicket(), OrderOpenPrice(), newSL, OrderTakeProfit(), 0, clrGreen);
}
else if(OrderType() == OP_SELL)
{
double newSL = Ask + TrailingStop Point 10;
if((newSL < OrderStopLoss() - TrailingStep Point 10 || OrderStopLoss() == 0) && newSL > Ask)
OrderModify(OrderTicket(), OrderOpenPrice(), newSL, OrderTakeProfit(), 0, clrRed);
}
}
}
}
//+------------------------------------------------------------------+
参数说明
参数 默认值 说明
FastMA_Period 10 快线周期
SlowMA_Period 50 慢线周期
MA_Method 0 0=SMA,1=EMA
LotSize 0.01 每手固定手数
StopLoss 50 止损(点)
TakeProfit 100 止盈(点)
UseTrailing true 是否启用移动止损
TrailingStop 30 移动止损距离
MagicNumber 123456 EA唯一标识
编译使用步骤(MQL4教程)
MT4中按F4打开MetaEditor
文件 → 新建 → 专家顾问 → 粘贴代码
按F7编译,确认零错误
将EA拖入图表,开启自动交易
在输入参数中调整各项数值
参考来源
自主编译MQL4源码(2026)
MQL4官方文档:https://www.mql5.com/zh/docs
如需带RSI背离过滤或多周期逻辑的进阶EA,可订阅我们的付费EA合集,均经过实盘验证并提供完整技术支持。