设为首页 收藏本站 切换语言 切换语言

【EMA距离】24 EMA均线距离

| 发表于 2025-7-11 21:52:56 | 显示全部楼层 |复制链接
指标名称:EMA距离[color=rgba(0, 0, 0, 0.9)]
版本:MT4 ver. 2.01(指标)

EMA距离是一个简单而有效的交易系统,旨在通过价格与 24 EMA(指数移动平均线)的交互捕捉交易机会。该系统适用于主流货币对,支持多时间周期(1小时、4小时和日线图)。它既可以用作短线剥头皮交易,也可以用于长期趋势交易。

image.jpg
这里提供的是多品种多周期信号展示,可自定义品种。

交易规则
该系统的核心在于两条简单规则:
回调反弹规则:
  • 当价格位于 24 EMA 以上且距离超过 20 点时,价格开始回调接近 24 EMA。
  • 在价格回调至 24 EMA 时设置买入限价单,预期价格会从 24 EMA 反弹向上。同理,若价格低于 24 EMA,设置卖出限价单。
  • 目标收益:10 点或以上。


突破回测规则:
当价格位于 24 EMA 以下并向上移动,若价格突破 24 EMA 且收盘在其上方,再次回测 24 EMA 时设置买入限价单。同理,若价格突破 24 EMA 向下,则设置卖出限价单。
止损设置
止损规则基于突破回测规则:
  • 多单止损:当价格再次跌破 24 EMA,且连续两根蜡烛完全收在 EMA 下方时,平仓止损。
  • 空单止损:当价格再次突破 24 EMA,且连续两根蜡烛完全收在 EMA 上方时,平仓止损。

注意事项
  • 避免新闻时间交易:重大新闻可能引发剧烈波动,建议在新闻发布前后避免交易。
  • 适应市场环境:该系统在趋势性市场中表现最佳,在震荡市场中可能会频繁止损。


参数:
image.jpg
部分代码展示:
  1. //+------------------------------------------------------------------+//|                                                      EMA距离.mq4 |//|                                Copyright © 2009-2024, www.QChaos.com |//|                                          https://www.qchaos.com/ |//+------------------------------------------------------------------+#property copyright "Copyright © 量化混沌, www.qchaos.com"#property link      "https://www.qchaos.com"#property version   "2.01"#define DATE    "2025.01.19"#property indicator_chart_window
  2. extern bool    ShowCurrentPairOnly  = false; // 是否只显示当前货币对extern string  PairsToTrade = "AUDCAD,AUDCHF,AUDJPY,AUDNZD,AUDUSD,CADCHF,CADJPY,CHFJPY,EURAUD,EURCAD,EURGBP,EURJPY,EURUSD,EURNZD,GBPAUD,GBPCAD,GBPJPY,GBPUSD,NZDUSD,NZDJPY,USDCAD,USDCHF,USDJPY,XAGUSD,XAUUSD"; // 交易的货币对列表extern string  PeriodsToTrade = "H1,H4,D1";//,W1,MN"; // 可交易的时间框架(H1:1小时,H4:4小时,D1:日线)extern int     MaPeriod=24; // 均线周期(默认24)int     BufferPips =10; // 设置缓冲点数
  3. extern int     MaMethod=MODE_EMA; // 均线类型,默认EMA(指数移动平均)extern string  mame="Method: 0=sma; 1=ema; 2=smma;  3=lwma"; // 可选的均线类型说明extern int     MaShift=0; // 均线的偏移量extern int     MaAppliedPrice=0; // 应用价格的类型extern string  maap="Applied price: 0=Close; 1=Open; 2=High"; // 均线应用的价格类型:收盘价、开盘价、最高价extern string  maap1="3=Low; 4=Median; 5=Typical; 6=Weighted"; // 其他应用价格类型
  4. extern color   colorCodeAboveBand=DodgerBlue; // 当价格高于带状线时的颜色(默认DodgerBlue)extern color   colorCodeBelowBand=Red; // 当价格低于带状线时的颜色(默认Red)extern color   colorCodeAboveMA=Aqua; // 当价格高于均线时的颜色(默认Aqua)extern color   colorCodeBelowMA=Gold; // 当价格低于均线时的颜色(默认Gold)extern color   colorCodeNoSignal=Gray; // 没有信号时的颜色(默认Gray)
  5. extern string  pdi="----Pair display inputs----"; // 货币对显示的输入提示extern int     FontSize=14; // 字体大小(默认14)extern color   FontColour=Yellow; // 字体颜色(默认Yellow)extern string  Font_Font = "Arial"; // 字体类型(默认Arial)extern string  Font_Bold = "Arial Black"; // 加粗字体类型(默认Arial Black)extern double  DisplayStarts_X=5;   // 显示位置,距离右上角的横向距离(默认5)extern double  DisplayStarts_Y=15;  // 显示位置,距离右上角的纵向距离(默认15)extern string  UniqueID="qchaos001"; // 唯一标识符
  6. // 货币对提取相关变量int      NoOfPairs;           // 用户输入的货币对数量int      NoOfPeriods;         // 用户输入的时间周期数量string   TradePair[];         // 存储用户选择的交易货币对string   TradePeriod[];       // 存储用户选择的交易时间周期int      TradePeriodTF[];     // 存储用户选择的交易时间周期对应的整数值double TradeTrendDiffs[][5];  // 存储货币对与均线的差值color    Trend[][5]; // 存储货币对趋势颜色color    TrendColor[5]; // 存储趋势颜色bool     AlertSent[]; // 用于标记是否已发送警报
  7. #define NOSIGNAL  0  // 没有信号#define ABOVEMA   1  // 价格高于均线#define BELOWMA   2  // 价格低于均线#define ABOVEBAND 3  // 价格高于带状线#define BELOWBAND 4  // 价格低于带状线int WindowNo = 0; // 窗口编号string objPrefix ;   // 本指标绘制的所有对象前缀string buff_str ; // 存储绘制对象的缓冲字符串// 定义了一个数组用于不同市场的点值乘数int pipMult,pipMultTab[]= {1,10,1,10,1,10,100}; // 用于将点数转换为点的倍数// 定义均线的类型数组,分别为SMA、EMA、SMMA、LWMAstring _type[]= {"SMA","EMA","SMMA","LWMA"};//+------------------------------------------------------------------+// 初始化函数int init()//+------------------------------------------------------------------+  {   int i, j;   objPrefix = UniqueID+":"+WindowExpertName(); // 设置对象前缀
  8. //  pipMult = pipMultTab[Digits];//  pip = Point * pipMult;   // 设置不同趋势状态的颜色   TrendColor[NOSIGNAL] = colorCodeNoSignal;   TrendColor[ABOVEBAND]= colorCodeAboveBand;   TrendColor[BELOWBAND]= colorCodeBelowBand;   TrendColor[ABOVEMA]  = colorCodeAboveMA;   TrendColor[BELOWMA]  = colorCodeBelowMA;
  9.    // 如果不只显示当前货币对   if(!ShowCurrentPairOnly)     {      // 提取用户交易的货币对      NoOfPairs = StringFindCount(PairsToTrade,",")+1; // 计算货币对的数量      ArrayResize(TradePair, NoOfPairs); // 调整数组大小      string AddChar = StringSubstr(Symbol(),6,4); // 获取货币对的后四个字符      StrPairToStringArray(PairsToTrade, TradePair, AddChar); // 将货币对字符串转为数组     }   else     {      // 只填充当前图表的货币对      NoOfPairs = 1;      ArrayResize(TradePair, NoOfPairs);       TradePair[0] = Symbol(); // 当前图表的货币对     }
  10.    // 提取用户选择的时间周期   NoOfPeriods = StringFindCount(PeriodsToTrade, ",")+1;    ArrayResize(TradePeriod, NoOfPeriods); // 调整数组大小   ArrayResize(TradePeriodTF, NoOfPeriods); // 调整周期类型数组大小   StrToStringArray(PeriodsToTrade, TradePeriod); // 将时间周期字符串转换为数组
  11.    // 转换时间周期为数字格式   for(j=0; j<NoOfPeriods; j++)     {      TradePeriodTF[j] = StrToTF(TradePeriod[j]); // 将时间周期转换为MT4支持的数值     }
  12.    // 初始化趋势和差异数组   ArrayResize(Trend, NoOfPairs);   ArrayInitialize(Trend, NOSIGNAL);   ArrayResize(TradeTrendDiffs, NoOfPairs);   ArrayInitialize(TradeTrendDiffs, 0);
  13.    return(0); // 返回初始化成功  }// End init()
  14. //+------------------------------------------------------------------+// 去初始化函数int deinit()//+------------------------------------------------------------------+  {   Comment(""); // 清除当前屏幕上的评论   RemoveObjects(objPrefix); // 删除所有绘制的对象   return(0); // 返回去初始化成功  }
  15. //+------------------------------------------------------------------+// 每个周期开始时执行的函数int start()//+------------------------------------------------------------------+  {   GetPairTrends(TradeTrendDiffs, Trend); // 获取每个货币对的趋势   PrintPairTrends(); // 打印货币对的趋势信息  }
  16. //+------------------------------------------------------------------+// 删除指定前缀的所有对象void RemoveObjects(string Pref)//+------------------------------------------------------------------+  {   int i;   string objname = "";
  17.    // 遍历所有对象并删除具有指定前缀的对象   for(i = ObjectsTotal(); i >= 0; i--)     {      objname = ObjectName(i);      if(StringFind(objname, Pref, 0) > -1)         ObjectDelete(objname); // 删除对象     }   return(0); // 删除完成  } // End void RemoveObjects(string Pref)
  18. //+------------------------------------------------------------------+// 计算子串出现次数int StringFindCount(string str, string str2)//+------------------------------------------------------------------+  {   int c = 0;   // 遍历字符串,计算子串出现的次数   for(int i=0; i<StringLen(str); i++)      if(StringSubstr(str,i,StringLen(str2)) == str2)         c++;   return(c); // 返回子串出现的次数  } // End int StringFindCount(string str, string str2)
  19. //+------------------------------------------------------------------+// 将货币对字符串转换为数组void StrPairToStringArray(string str, string &a[], string p_suffix, string delim=",")//+------------------------------------------------------------------+  {   int z1=-1, z2=0;   // 遍历并分割字符串,将每个货币对存入数组   for(int i=0; i<ArraySize(a); i++)     {      z2 = StringFind(str,delim,z1+1); // 查找分隔符的位置      a = StringSubstr(str,z1+1,z2-z1-1) + p_suffix; // 将每个货币对与后缀拼接      if(z2 >= StringLen(str)-1)         break;      z1 = z2;     }   return(0); // 完成转换  }
  20. //+------------------------------------------------------------------+// 将字符串按分隔符分割为数组void StrToStringArray(string str, string &a[], string delim=",")//+------------------------------------------------------------------+  {   int z1=-1, z2=0;   // 遍历并分割字符串,将每个部分存入数组   for(int i=0; i<ArraySize(a); i++)     {      z2 = StringFind(str,delim,z1+1); // 查找分隔符的位置      a = StringSubstr(str,z1+1,z2-z1-1); // 存入数组      if(z2 >= StringLen(str)-1)         break;      z1 = z2;     }   return(0); // 完成转换  }
  21. //+------------------------------------------------------------------+// 将时间周期字符串转换为MT4的数值int StrToTF(string str)//+------------------------------------------------------------------+  {   str = StringUpper(str); // 转换为大写   str = StringTrimLeft(str); // 去掉左侧空格   str = StringTrimRight(str); // 去掉右侧空格
  22.    // 根据不同时间周期返回对应的数字值   if(str == "M1")      return(1);   if(str == "M5")      return(5);   if(str == "M15")      return(15);   if(str == "M30")      return(30);   if(str == "H1")      return(60);   if(str == "H4")      return(240);   if(str == "D1")      return(1440);   if(str == "W1")      return(10080);   if(str == "MN")      return(43200);   return(0); // 返回0表示无效周期  }
  23. //+------------------------------------------------------------------+// 将字符串中的小写字母转换为大写字母string StringUpper(string str)//+------------------------------------------------------------------+  {   string outstr = "";   string lower  = "abcdefghijklmnopqrstuvwxyz";   string upper  = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";   // 遍历字符串中的每个字符   for(int i=0; i<StringLen(str); i++)     {      int t1 = StringFind(lower,StringSubstr(str,i,1),0); // 查找小写字母的位置      if(t1 >=0)         outstr = outstr + StringSubstr(upper,t1,1); // 转换为大写      else         outstr = outstr + StringSubstr(str,i,1); // 保留原字符     }   return(outstr); // 返回转换后的字符串  }
  24. //+------------------------------------------------------------------+// 获取每个货币对的趋势数据//+------------------------------------------------------------------+void GetPairTrends(double &diffs[][], int &trend[][])//+------------------------------------------------------------------+  {   int i, j;   double diff;
  25.    for(i=0; i<NoOfPairs; i++)     {      for(j=0; j<NoOfPeriods; j++)        {         trend[j] = NOSIGNAL;
  26.          int digits=MarketInfo(TradePair,MODE_DIGITS);         double point = MarketInfo(TradePair,MODE_POINT);         double pip = point * pipMultTab[digits];         diff = (iClose(TradePair, TradePeriodTF[j], 0) - iMA(TradePair, TradePeriodTF[j], MaPeriod, MaShift, MaMethod, MaAppliedPrice, 0))/pip;         diffs[j] = diff;
  27.          if(diff > 0)           {            if(diff > BufferPips)              {               trend[j] = ABOVEBAND;              }            else              {               trend[j] = ABOVEMA;              }           }         else           {            if(diff < -BufferPips)              {               trend[j] = BELOWBAND;              }            else              {               trend[j] = BELOWMA;              }           }        } //End for(j=0; j<NoOfPeriods; j++)     } //End for(i=0; i<NoOfPairs; i++)   return(0);
  28.   }
复制代码
filetype

EMA距离.ex4

31.78 KB, 下载次数: 0, 下载积分: 活跃度 -5 售价: 1 H币  [记录]  [购买]

评分
  • 1
  • 2
  • 3
  • 4
  • 5
平均分:NAN    参与人数:0    我的评分:未评 下载时遇到问题?
举报

评论 使用道具

精彩评论4

peterzhu2004
DDD
| 发表于 2025-7-12 14:48:49 | 显示全部楼层
这个看起来很实用
举报

点赞 评论 使用道具

yangxiao
DD
| 发表于 2025-7-14 12:53:31 | 显示全部楼层
挺有意义。
举报

点赞 评论 使用道具

ll4040
D
| 发表于 2025-7-15 21:29:06 | 显示全部楼层
小白看不懂
举报

点赞 评论 使用道具

BBC
D
| 发表于 2025-9-6 15:55:27 | 显示全部楼层
thank you for share.
举报

点赞 评论 使用道具

发新帖
EA交易
您需要登录后才可以评论 登录 | 立即注册

 简体中文国旗 简体中文
 繁體中文国旗 繁體中文
 English国旗 English(英语)
 日本語国旗 日本語(日语)
 Deutsch国旗 Deutsch(德语)
 Русский язык国旗 Русский язык(俄语)
 بالعربية国旗 بالعربية(阿拉伯语)
 Türkçe国旗 Türkçe(土耳其语)
 Português国旗 Português(葡萄牙语)
 ภาษาไทย国旗 ภาษาไทย(泰国语)
 한어国旗 한어(朝鲜语/韩语)
 Français国旗 Français(法语)
翻译