MT5EA / 策略编译通过 · EX5 32KB 自动发布 64 5

1分钟双均线剥头皮EA

18634722928·8 天前发布

快慢EMA交叉立即开仓,固定止盈止损,适合M1周期高频交易

1分钟双均线剥头皮EA

效果示意图 · AI 根据源码绘制,仅示意画了哪些元素,细节以实际运行为准

ScalpingEA_M1.mq5197 行
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
#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,快线穿慢线立即开仓,固定止盈止损,适合频繁进出,每天可产生多次交易信号。

使用说明

安装步骤

  1. 将代码保存为 ScalpingEA_M1.mq5,放到 MT5 的 MQL5\Experts 目录
  2. 在MetaEditor中编译(F7)
  3. 在MT5图表上加载EA,时间周期必须设为M1(1分钟)
  4. 在"通用"选项卡勾选"允许自动交易"

参数调节

  • 快慢周期:默认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线重复开仓
  • 到达止盈或止损后自动平仓

注意事项

  1. 剥头皮对点差敏感:请在点差低的时段(欧美盘重叠)使用,或选择ECN账户
  2. 回测与实盘差异:回测用的是历史点差,实盘点差波动大,盈利会打折扣
  3. 资金管理:建议先在模拟盘跑1-2周,观察胜率和最大回撤,再用小手数实盘
  4. 滑点控制:参数里的滑点设为3点,如果成交失败过多可适当放宽到5-10点
  5. 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低于此值不开仓。

怎么用

  1. 把代码保存为 ScalpingEA_M1.mq5,放到MT5的 MQL5\Experts 文件夹。
  2. 在MetaEditor里编译(按F7),没报错就成功。
  3. 打开MT5任意品种图表,时间周期必须切到M1,把EA拖到图上。
  4. 弹出的设置窗口里,"通用"选项卡勾选"允许自动交易"和"允许DLL导入"(如果有的话)。
  5. 调整参数,点确定,右上角出现笑脸图标说明EA已启动。
  6. EA没有画指标线,看信号要自己加EMA(5)和EMA(20)到图上对照。开仓后能在"交易"面板看到持仓和止盈止损价格。

适用场景

适合:

  • 品种:点差低、流动性好的主流品种,如欧美(EURUSD)、镑美(GBPUSD)、黄金(XAUUSD)。黄金注意把止盈止损改大(30-50点)。
  • 周期:必须用M1,这是剥头皮EA的设计前提。其他周期信号逻辑不适用。
  • 时段:欧美盘重叠时段(北京时间下午3点到晚上12点),此时点差小、成交快。亚洲盘波动小不建议挂。
  • 行情:小幅震荡或刚启动的趋势。大单边行情交叉信号少,大幅震荡假信号多。

不适合:

  • 点差超过2点的品种或时段,剥头皮止盈才10点,点差吃掉一大半。
  • 重大新闻发布前后,滑点和点差暴涨,容易亏损。
  • 周末或假期,流动性差,成交困难。

风险提示

  1. 点差敏感:剥头皮EA的止盈很小,点差占比大。如果点差超过1.5-2点,盈利空间被严重压缩。选ECN账户或点差浮动小的时段交易。
  2. 高频交易成本:每天可能开仓几十次,手续费累积不少。计算实际盈利时要扣除手续费。
  3. 固定止损无保护:代码里止盈止损都是固定点数,不跟踪价格。遇到跳空或剧烈波动,可能滑点成交在更差价格。
  4. 回测与实盘差异:回测用的历史点差是静态的,实盘点差会波动。回测盈利不代表实盘能复制,建议先模拟盘跑1-2周验证。
  5. 无资金管理:代码里手数是固定的,不根据账户余额或风险调整。连续亏损时仓位不会减小,需要人工监控或修改代码加动态仓位。
  6. 延迟影响:剥头皮对网络延迟敏感,挂在家用电脑上可能错过最佳成交价。建议用VPS且选靠近交易商服务器的机房。
  7. 无重绘,但信号滞后: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.

评论

后可以留言,比如反馈用着怎么样、想加什么功能。

还没有人评论,来抢个沙发。