1分钟双均线剥头皮EA
快慢EMA交叉立即开仓,固定止盈止损,适合M1周期高频交易
效果示意图 · AI 根据源码绘制,仅示意画了哪些元素,细节以实际运行为准
#property copyright "XAUOF指标工坊"
#property version "1.00"
#property strict
#include <Trade\Trade.mqh>
//--- 输入参数
input group "=== 均线参数 ==="
input int FastPeriod = 5; // 快线周期
input int SlowPeriod = 20; // 慢线周期
input group "=== 交易参数 ==="
input double LotSize = 0.01; // 固定手数
input int TakeProfitPips = 10; // 止盈点数
input int StopLossPips = 10; // 止损点数
input int MagicNumber = 20261010; // 魔术号
input int Slippage = 3; // 允许滑点(点)
input int MaxPositions = 1; // 最大同时持仓数
input group "=== 过滤参数 ==="
input bool UseRSIFilter = true; // 是否启用RSI过滤
input int RSIPeriod = 14; // RSI周期
input int RSIOverbought = 70; // RSI超买线
input int RSIOversold = 30; // RSI超卖线
//--- 全局变量
int fastHandle, slowHandle, rsiHandle;
double fastBuffer[], slowBuffer[], rsiBuffer[];
CTrade trade;
datetime lastBarTime = 0; // 记录上一根K线时间,避免同一根K线重复开仓
//+------------------------------------------------------------------+
//| 初始化函数 |
//+------------------------------------------------------------------+
int OnInit()
{
// 创建快线句柄
fastHandle = iMA(_Symbol, PERIOD_M1, FastPeriod, 0, MODE_EMA, PRICE_CLOSE);
if(fastHandle == INVALID_HANDLE)
{
Print("快线创建失败");
return INIT_FAILED;
}
// 创建慢线句柄
slowHandle = iMA(_Symbol, PERIOD_M1, SlowPeriod, 0, MODE_EMA, PRICE_CLOSE);
if(slowHandle == INVALID_HANDLE)
{
Print("慢线创建失败");
return INIT_FAILED;
}
// 创建RSI句柄(如果启用)
if(UseRSIFilter)
{
rsiHandle = iRSI(_Symbol, PERIOD_M1, RSIPeriod, PRICE_CLOSE);
if(rsiHandle == INVALID_HANDLE)
{
Print("RSI创建失败");
return INIT_FAILED;
}
}
// 设置交易参数
trade.SetExpertMagicNumber(MagicNumber);
trade.SetDeviationInPoints(Slippage);
trade.SetTypeFilling(ORDER_FILLING_FOK);
// 设置数组为动态
ArraySetAsSeries(fastBuffer, false);
ArraySetAsSeries(slowBuffer, false);
ArraySetAsSeries(rsiBuffer, false);
Print("剥头皮EA初始化成功");
return INIT_SUCCEEDED;
}
//+------------------------------------------------------------------+
//| 清理函数 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{
if(fastHandle != INVALID_HANDLE) IndicatorRelease(fastHandle);
if(slowHandle != INVALID_HANDLE) IndicatorRelease(slowHandle);
if(rsiHandle != INVALID_HANDLE) IndicatorRelease(rsiHandle);
}
//+------------------------------------------------------------------+
//| 每个tick执行 |
//+------------------------------------------------------------------+
void OnTick()
{
// 检查是否有新K线形成
datetime currentBarTime = iTime(_Symbol, PERIOD_M1, 0);
if(currentBarTime == lastBarTime)
return; // 同一根K线不重复判断
lastBarTime = currentBarTime;
// 检查当前持仓数量
if(CountPositions() >= MaxPositions)
return;
// 等待指标数据准备好
if(BarsCalculated(fastHandle) < SlowPeriod + 2)
return;
if(BarsCalculated(slowHandle) < SlowPeriod + 2)
return;
if(UseRSIFilter && BarsCalculated(rsiHandle) < RSIPeriod + 2)
return;
// 复制指标数据(最近3根K线:当前、前1、前2)
if(CopyBuffer(fastHandle, 0, 0, 3, fastBuffer) < 3)
return;
if(CopyBuffer(slowHandle, 0, 0, 3, slowBuffer) < 3)
return;
if(UseRSIFilter && CopyBuffer(rsiHandle, 0, 0, 3, rsiBuffer) < 3)
return;
// 获取当前价格
double ask = SymbolInfoDouble(_Symbol, SYMBOL_ASK);
double bid = SymbolInfoDouble(_Symbol, SYMBOL_BID);
// 计算止盈止损价格
double point = SymbolInfoDouble(_Symbol, SYMBOL_POINT);
int digits = (int)SymbolInfoInteger(_Symbol, SYMBOL_DIGITS);
double tpDistanceBuy = TakeProfitPips * point * 10;
double slDistanceBuy = StopLossPips * point * 10;
double tpDistanceSell = TakeProfitPips * point * 10;
double slDistanceSell = StopLossPips * point * 10;
// 判断做多信号:快线上穿慢线
// 当前K线(索引1)快线>慢线 且 前一根K线(索引0)快线<=慢线
if(fastBuffer[1] > slowBuffer[1] && fastBuffer[0] <= slowBuffer[0])
{
// RSI过滤:如果启用,RSI必须低于超买线
if(UseRSIFilter && rsiBuffer[1] >= RSIOverbought)
return;
double tp = NormalizeDouble(ask + tpDistanceBuy, digits);
double sl = NormalizeDouble(ask - slDistanceBuy, digits);
if(trade.Buy(LotSize, _Symbol, ask, sl, tp, "剥头皮做多"))
{
Print("做多开仓成功:", ask, " SL:", sl, " TP:", tp);
}
else
{
Print("做多开仓失败,错误代码:", GetLastError());
}
return;
}
// 判断做空信号:快线下穿慢线
// 当前K线(索引1)快线<慢线 且 前一根K线(索引0)快线>=慢线
if(fastBuffer[1] < slowBuffer[1] && fastBuffer[0] >= slowBuffer[0])
{
// RSI过滤:如果启用,RSI必须高于超卖线
if(UseRSIFilter && rsiBuffer[1] <= RSIOversold)
return;
double tp = NormalizeDouble(bid - tpDistanceSell, digits);
double sl = NormalizeDouble(bid + slDistanceSell, digits);
if(trade.Sell(LotSize, _Symbol, bid, sl, tp, "剥头皮做空"))
{
Print("做空开仓成功:", bid, " SL:", sl, " TP:", tp);
}
else
{
Print("做空开仓失败,错误代码:", GetLastError());
}
return;
}
}
//+------------------------------------------------------------------+
//| 统计当前EA的持仓数量 |
//+------------------------------------------------------------------+
int CountPositions()
{
int count = 0;
for(int i = PositionsTotal() - 1; i >= 0; i--)
{
ulong ticket = PositionGetTicket(i);
if(ticket > 0)
{
if(PositionGetString(POSITION_SYMBOL) == _Symbol &&
PositionGetInteger(POSITION_MAGIC) == MagicNumber)
{
count++;
}
}
}
return count;
}作品说明
这是一个基于双均线交叉的1分钟剥头皮EA,快线穿慢线立即开仓,固定止盈止损,适合频繁进出,每天可产生多次交易信号。
使用说明
安装步骤
- 将代码保存为
ScalpingEA_M1.mq5,放到 MT5 的MQL5\Experts目录 - 在MetaEditor中编译(F7)
- 在MT5图表上加载EA,时间周期必须设为M1(1分钟)
- 在"通用"选项卡勾选"允许自动交易"
参数调节
- 快慢周期:默认5/20,交叉频繁;想减少交易可改为10/30
- 止盈止损:默认各10点,黄金可改为30-50点,外汇主要货币对可保持10-20点
- 固定手数:0.01是最小手,实盘请根据账户余额调整(建议不超过余额的1-2%风险)
- 最大持仓数:默认1,避免同时扛多单;激进可改为2-3
- RSI过滤:勾选后,做多时RSI<70、做空时RSI>30才开仓,可减少假信号
信号逻辑
- 做多:快线EMA(5)从下方穿过慢线EMA(20),立即市价买入
- 做空:快线EMA(5)从上方穿破慢线EMA(20),立即市价卖出
- 每根新K线只判断一次,避免同一根K线重复开仓
- 到达止盈或止损后自动平仓
注意事项
- 剥头皮对点差敏感:请在点差低的时段(欧美盘重叠)使用,或选择ECN账户
- 回测与实盘差异:回测用的是历史点差,实盘点差波动大,盈利会打折扣
- 资金管理:建议先在模拟盘跑1-2周,观察胜率和最大回撤,再用小手数实盘
- 滑点控制:参数里的滑点设为3点,如果成交失败过多可适当放宽到5-10点
- VPS推荐:剥头皮EA对延迟敏感,建议挂在靠近交易商服务器的VPS上
AI 解读根据源码逐行分析写成,供参考,以实际运行为准
这是什么
这是一个在MT5上跑1分钟图的自动交易EA,靠快慢两根EMA均线交叉开仓。快线(默认5周期)穿过慢线(默认20周期)就立即进场,止盈止损都固定点数,适合想频繁进出、赚小波动的剥头皮交易。每根新K线只判断一次,避免重复开仓。
逻辑原理
信号生成:每根M1新K线形成时,EA检查当前K线和前一根K线的EMA位置关系。
- 做多:当前K线快线高于慢线,且前一根K线快线低于或等于慢线(上穿),市价买入。
- 做空:当前K线快线低于慢线,且前一根K线快线高于或等于慢线(下穿),市价卖出。
过滤机制:如果启用RSI过滤,做多时RSI必须低于超买线(默认70),做空时RSI必须高于超卖线(默认30),否则不开仓。
出场:到达固定止盈点数或止损点数后自动平仓,不做加仓或移动止损。每次开仓时就把止盈止损价格算好挂上去。
参数说明
- FastPeriod(默认5):快线EMA周期。越小越灵敏,交叉越频繁。
- SlowPeriod(默认20):慢线EMA周期。越大趋势越平滑,信号越少。
- LotSize(默认0.01):固定开仓手数。0.01是最小手,实盘按账户余额调整,建议单笔风险不超过余额1-2%。
- TakeProfitPips(默认10):止盈点数。黄金可改为30-50,外汇主要货币对10-20即可。
- StopLossPips(默认10):止损点数。同止盈,根据品种波动调整。
- MagicNumber(默认20261010):EA的魔术号,用来识别自己开的单。不同EA用不同魔术号避免冲突。
- Slippage(默认3):允许滑点,单位点。如果成交失败频繁可放宽到5-10。
- MaxPositions(默认1):最大同时持仓数。默认1单,激进可改2-3,但风险也成倍增加。
- UseRSIFilter(默认true):是否启用RSI过滤。勾选后可减少震荡市假信号,但也会漏掉部分真信号。
- RSIPeriod(默认14):RSI计算周期。标准值,一般不改。
- RSIOverbought(默认70):RSI超买线。做多时RSI高于此值不开仓。
- RSIOversold(默认30):RSI超卖线。做空时RSI低于此值不开仓。
怎么用
- 把代码保存为
ScalpingEA_M1.mq5,放到MT5的MQL5\Experts文件夹。 - 在MetaEditor里编译(按F7),没报错就成功。
- 打开MT5任意品种图表,时间周期必须切到M1,把EA拖到图上。
- 弹出的设置窗口里,"通用"选项卡勾选"允许自动交易"和"允许DLL导入"(如果有的话)。
- 调整参数,点确定,右上角出现笑脸图标说明EA已启动。
- EA没有画指标线,看信号要自己加EMA(5)和EMA(20)到图上对照。开仓后能在"交易"面板看到持仓和止盈止损价格。
适用场景
适合:
- 品种:点差低、流动性好的主流品种,如欧美(EURUSD)、镑美(GBPUSD)、黄金(XAUUSD)。黄金注意把止盈止损改大(30-50点)。
- 周期:必须用M1,这是剥头皮EA的设计前提。其他周期信号逻辑不适用。
- 时段:欧美盘重叠时段(北京时间下午3点到晚上12点),此时点差小、成交快。亚洲盘波动小不建议挂。
- 行情:小幅震荡或刚启动的趋势。大单边行情交叉信号少,大幅震荡假信号多。
不适合:
- 点差超过2点的品种或时段,剥头皮止盈才10点,点差吃掉一大半。
- 重大新闻发布前后,滑点和点差暴涨,容易亏损。
- 周末或假期,流动性差,成交困难。
风险提示
- 点差敏感:剥头皮EA的止盈很小,点差占比大。如果点差超过1.5-2点,盈利空间被严重压缩。选ECN账户或点差浮动小的时段交易。
- 高频交易成本:每天可能开仓几十次,手续费累积不少。计算实际盈利时要扣除手续费。
- 固定止损无保护:代码里止盈止损都是固定点数,不跟踪价格。遇到跳空或剧烈波动,可能滑点成交在更差价格。
- 回测与实盘差异:回测用的历史点差是静态的,实盘点差会波动。回测盈利不代表实盘能复制,建议先模拟盘跑1-2周验证。
- 无资金管理:代码里手数是固定的,不根据账户余额或风险调整。连续亏损时仓位不会减小,需要人工监控或修改代码加动态仓位。
- 延迟影响:剥头皮对网络延迟敏感,挂在家用电脑上可能错过最佳成交价。建议用VPS且选靠近交易商服务器的机房。
- 无重绘,但信号滞后:EMA本身不重绘,但交叉信号是滞后的——穿过之后才确认,此时价格可能已经跑了几个点。这是均线EA的通病。
常见问题
Q: 这个EA会重绘吗? A: 不会。代码用的是EMA指标,历史数据不变,信号确认后不会消失。但交叉信号本身有滞后,穿过之后才开仓,可能错过最优价格。
Q: 可以用在黄金以外的品种吗? A: 可以。代码没有限制品种,但建议选点差低、波动适中的主流品种。黄金(XAUUSD)要把止盈止损改大(30-50点),外汇货币对(如EURUSD)用默认10-20点即可。小众品种或点差超过2点的不建议用。
Q: MT4能用吗? A: 不能直接用。这是MQL5代码,只能在MT5上跑。MT4需要用MQL4重写,Trade类库和部分函数不兼容。
Q: 参数默认值适合什么周期? A: 默认参数(快线5、慢线20、止盈止损各10点)是为M1周期设计的。如果用在更大周期(如M5、M15),交叉频率会降低,止盈止损点数也要相应增加。但这个EA的核心逻辑就是剥头皮,不建议改周期。
Q: 为什么回测盈利但实盘亏损? A: 剥头皮EA最常见的问题。回测时点差是固定的历史数据,实盘点差会浮动且经常比回测大。加上滑点、手续费、延迟,实盘成交价往往比回测差几个点,而剥头皮的利润本来就小,这几个点够吃掉大部分盈利。建议先在模拟盘跑一段时间,观察实际胜率和盈亏比。
常见问题
- 这个EA会重绘吗?
- 不会。代码用的是EMA指标,历史数据不变,信号确认后不会消失。但交叉信号本身有滞后,穿过之后才开仓,可能错过最优价格。
- 可以用在黄金以外的品种吗?
- 可以。代码没有限制品种,但建议选点差低、波动适中的主流品种。黄金(XAUUSD)要把止盈止损改大(30-50点),外汇货币对(如EURUSD)用默认10-20点即可。小众品种或点差超过2点的不建议用。
- MT4能用吗?
- 不能直接用。这是MQL5代码,只能在MT5上跑。MT4需要用MQL4重写,Trade类库和部分函数不兼容。
- 参数默认值适合什么周期?
- 默认参数(快线5、慢线20、止盈止损各10点)是为M1周期设计的。如果用在更大周期(如M5、M15),交叉频率会降低,止盈止损点数也要相应增加。但这个EA的核心逻辑就是剥头皮,不建议改周期。
- 为什么回测盈利但实盘亏损?
- 剥头皮EA最常见的问题。回测时点差是固定的历史数据,实盘点差会浮动且经常比回测大。加上滑点、手续费、延迟,实盘成交价往往比回测差几个点,而剥头皮的利润本来就小,这几个点够吃掉大部分盈利。建议先在模拟盘跑一段时间,观察实际胜率和盈亏比。
MT5 EMA Crossover Scalping EA for M1
A 1-minute scalping EA based on fast/slow EMA crossover (default 5/20). Opens market orders immediately on crossover signals with fixed TP/SL. Optional RSI filter to reduce false signals. Designed for high-frequency M1 trading.
Source code is shown above. Compiled EX5 files are available to VIP members.
评论
还没有人评论,来抢个沙发。