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

【CCI热力图】一键开启多品种多周期 CCI 热力图面板

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

CCI热力图是一个 MetaTrader 4 (MT4) 指标,基于 CCI(Commodity Channel Index)指标,在图表上显示不同交易品种和时间框架的CCI热力图。该指标通过颜色直观地显示市场的 强势上升、弱势区域和强势下降,并提供交互按钮,方便用户开启/关闭热力图。

image.png
多品种、多时间框架支持:用户可指定多个交易品种和时间框架,热力图会显示对应的 CCI 信号。
✅ CCI 热力图颜色区分:
绿色(Strong Up) → CCI 超过 +200,表示强势上升。
灰色(Neutral) → CCI 在 -200 到 +200 之间,市场中性。
红色(Strong Down) → CCI 低于 -200,表示强势下降。
✅ 可调节参数:允许用户修改 CCI 计算方式、颜色、按钮位置、窗口位置等。
✅ 交互式按钮:图表上有一个 CCI 按钮,用户可点击按钮开启或关闭 CCI 热图。
使用方法
安装指标
  • 下载 CCI热力图.ex4 文件。
  • 打开 MT4 → 点击 "文件" → "打开数据文件夹"。
  • 进入 MQL4/Indicators/ 目录,将 CCI热力图.ex4 复制到该目录下。
  • 重启 MT4 或在 导航窗口(Ctrl+N) 的 指标列表 右键点击 刷新。


添加到图表
  • 打开 MT4 图表,选择任意交易品种。
  • 在 MT4 导航窗口找到 "CCI热力图" 指标。
  • 双击指标或拖动到图表上。
  • 设置参数(如交易品种、时间框架等)。
  • 点击“确定”,指标会加载在图表上。


使用 CCI 热图
  • 默认情况下,热图会自动显示。
  • 点击左上角 "CCI" 按钮 可切换热图的显示/隐藏状态。


适用交易策略
✅ 趋势交易者:可以用来识别市场趋势,当多个时间框架的 CCI 都呈现 绿色(多头)或红色(空头) 时,寻找顺势交易机会。
✅ 均值回归交易者:如果 CCI 过度超买或超卖(即绿色变红色或红色变绿色),可以考虑反转交易策略。
✅ 多时间框架分析:不同时间框架上的 CCI 信号一致时,可以提高交易信号的可靠性。
参数:
image.jpg
部分代码展示:
  1. //+------------------------------------------------------------------+//|                                                    CCI热力图.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"#property strict//------------------------------------------------------------------#property indicator_chart_window#property strict
  2. extern string Symbols           = "GBPJPY;AUDJPY;NZDJPY;EURJPY;USDJPY;CHFJPY;";  // 交易品种列表(用 ";" 分隔)extern string TimeFrames        = "M5;M15;M30;H1;H4";        // 时间周期列表(用 ";" 分隔)
  3. //extern string TimeFrames        = "M1;M5;M15;M30;H1;H4;D1;W1;MN";        // 备用时间周期列表(用 ";" 分隔)extern int    CciPeriod         = 14;                                    // CCI 指标的周期extern ENUM_APPLIED_PRICE Price = PRICE_TYPICAL;                         // CCI 计算价格类型extern double lStrongUp         =  200;                                  // CCI 强上升信号阈值extern double lStrongDown       = -200;                                  // CCI 强下降信号阈值extern int    BarToTest         = 0;                                     // 计算的K线索引(0 表示当前K线)extern color  StrongUp          = clrLimeGreen;                          // CCI 强上升时的颜色(绿色)extern color  Neutral           = clrDarkGray;                           // CCI 中性区域的颜色(灰色)extern color  StrongDown        = clrOrangeRed;                          // CCI 强下降时的颜色(红色)extern int    ColorSteps        = 41;                                    // 颜色渐变级数extern color  TextColor         = clrBlack;                              // 按钮文本颜色extern color  BorderColor       = clrBlack;                              // 按钮边框颜色extern color  FillColor         = clrSilver;                             // 按钮背景颜色extern int    Window            = 0;                                     // 指标显示窗口(0 代表主图窗口)extern ENUM_BASE_CORNER  Corner = CORNER_LEFT_LOWER;                     // 指标显示位置(左下角)extern int    XShift            = 0;                                     // 水平偏移量extern int    YShift            = 0;                                     // 垂直偏移量extern string UniqueID          = "CCIHeatmap1";                         // 指标唯一标识符
  4. // 按钮相关参数extern string             button_note1          = "------------------------------";  // 按钮分隔线extern ENUM_BASE_CORNER   btn_corner            = CORNER_LEFT_UPPER; // 按钮固定在图表的左上角extern string             btn_text              = "CCI";              // 按钮文本extern string             btn_Font              = "Arial";            // 按钮字体extern int                btn_FontSize          = 10;                 // 按钮字体大小extern color              btn_text_ON_color     = clrWhite;           // 按钮激活时的文本颜色(白色)extern color              btn_text_OFF_color    = clrRed;             // 按钮关闭时的文本颜色(红色)extern color              btn_background_color  = clrDimGray;         // 按钮背景颜色(深灰色)extern color              btn_border_color      = clrBlack;           // 按钮边框颜色(黑色)extern int                button_x              = 20;                 // 按钮的 X 轴偏移量extern int                button_y              = 13;                 // 按钮的 Y 轴偏移量extern int                btn_Width             = 60;                 // 按钮宽度extern int                btn_Height            = 20;                 // 按钮高度extern string             button_note2          = "------------------------------";  // 按钮分隔线
  5. bool                      show_data             = true;string IndicatorName, IndicatorObjPrefix;//template code end1int    cpairsLen,ctimesLen, aTimes[];string cpairs[];color  colors[];//+------------------------------------------------------------------------------------------------------------------+string GenerateIndicatorName(const string target) //don't change anything here  {   string name = target;   int try         = 2;   while(WindowFind(name) != -1)     {      name = target + " #" + IntegerToString(try                                                ++);     }   return name;  }//+------------------------------------------------------------------------------------------------------------------+string buttonId;
  6. //+------------------------------------------------------------------+//|                                                                  |//+------------------------------------------------------------------+int OnInit()  {   IndicatorName = GenerateIndicatorName(btn_text);   IndicatorObjPrefix = "__" + IndicatorName + "__";   IndicatorShortName(IndicatorName);   IndicatorDigits(Digits);
  7.    double val;   if(GlobalVariableGet(IndicatorName + "_visibility", val))      show_data = val != 0;
  8. // put init() here   Symbols = StringTrimLeft(StringTrimRight(Symbols));   if(StringSubstr(Symbols,StringLen(Symbols)-1,1) != ";")      Symbols = StringConcatenate(Symbols,";");
  9.    TimeFrames = StringTrimLeft(StringTrimRight(TimeFrames));   if(StringSubstr(TimeFrames,StringLen(TimeFrames)-1,1) != ";")      TimeFrames = StringConcatenate(TimeFrames,";");
  10.    int s = 0, i = StringFind(Symbols,";",s);   while(i > 0)     {      string current = StringSubstr(Symbols,s,i-s);      ArrayResize(cpairs,ArraySize(cpairs)+1);      cpairs[ArraySize(cpairs)-1] = current;      s = i + 1;      i = StringFind(Symbols,";",s);     }   if(Corner==CORNER_LEFT_LOWER  || Corner==CORNER_RIGHT_LOWER)      invertArray(cpairs);   cpairsLen = ArraySize(cpairs);   s = 0;   i = StringFind(TimeFrames,";",s);   while(i > 0)     {      string current = StringSubstr(TimeFrames,s,i-s);      int time = stringToTimeFrame(current);      if(time > 0)        {         ArrayResize(aTimes,ArraySize(aTimes)+1);         aTimes[ArraySize(aTimes)-1] = time;        }      s = i + 1;      i = StringFind(TimeFrames,";",s);     }   if(Corner==CORNER_RIGHT_UPPER || Corner==CORNER_RIGHT_LOWER)      invertiArray(aTimes);   ctimesLen = ArraySize(aTimes);
  11. //////////
  12.    if(ColorSteps%2==0)      ColorSteps++;   ArrayResize(colors,ColorSteps);   int half = ColorSteps/2;   for(i=0; i<half; i++)     {      colors[i             ] = gradientColor(i+1,half,StrongUp,Neutral);      colors[ColorSteps-i-1] = gradientColor(i+1,half,StrongDown,Neutral);     }   colors = Neutral;
  13.    ChartSetInteger(ChartID(), CHART_EVENT_MOUSE_MOVE, 1);   buttonId = IndicatorObjPrefix + "CCI面板2024";   createButton(buttonId, btn_text, btn_Width, btn_Height, btn_Font, btn_FontSize, btn_background_color, btn_border_color, btn_text_ON_color);   ObjectSetInteger(ChartID(), buttonId, OBJPROP_YDISTANCE, button_y);   ObjectSetInteger(ChartID(), buttonId, OBJPROP_XDISTANCE, button_x);
  14.    return(INIT_SUCCEEDED);  }//+------------------------------------------------------------------------------------------------------------------+//don't change anything herevoid createButton(string buttonID,string buttonText,int width,int height,string font,int fontSize,color bgColor,color borderColor,color txtColor)  {   ObjectDelete(ChartID(),buttonID);   ObjectCreate(ChartID(),buttonID,OBJ_BUTTON,0,0,0);   ObjectSetInteger(ChartID(),buttonID,OBJPROP_COLOR,txtColor);   ObjectSetInteger(ChartID(),buttonID,OBJPROP_BGCOLOR,bgColor);   ObjectSetInteger(ChartID(),buttonID,OBJPROP_BORDER_COLOR,borderColor);   ObjectSetInteger(ChartID(),buttonID,OBJPROP_XSIZE,width);   ObjectSetInteger(ChartID(),buttonID,OBJPROP_YSIZE,height);   ObjectSetString(ChartID(),buttonID,OBJPROP_FONT,font);   ObjectSetString(ChartID(),buttonID,OBJPROP_TEXT,buttonText);   ObjectSetInteger(ChartID(),buttonID,OBJPROP_FONTSIZE,fontSize);   ObjectSetInteger(ChartID(),buttonID,OBJPROP_SELECTABLE,0);   ObjectSetInteger(ChartID(),buttonID,OBJPROP_CORNER,btn_corner);   ObjectSetInteger(ChartID(),buttonID,OBJPROP_HIDDEN,1);   ObjectSetInteger(ChartID(),buttonID,OBJPROP_XDISTANCE,9999);   ObjectSetInteger(ChartID(),buttonID,OBJPROP_YDISTANCE,9999);  }//+------------------------------------------------------------------------------------------------------------------+int deinit()  {   ObjectsDeleteAll(ChartID(), IndicatorObjPrefix);
  15. //put deinit() here   int idLength = StringLen(UniqueID);   for(int i = ObjectsTotal(); i>=0; i--)     { string name = ObjectName(i); if(StringSubstr(name,0,idLength) == UniqueID) ObjectDelete(name); }
  16.    return(0);  }//+------------------------------------------------------------------------------------------------------------------+//don't change anything herebool recalc = true;
  17. //+------------------------------------------------------------------+//|                                                                  |//+------------------------------------------------------------------+void handleButtonClicks()  {   if(ObjectGetInteger(ChartID(), buttonId, OBJPROP_STATE))     {      ObjectSetInteger(ChartID(), buttonId, OBJPROP_STATE, false);      show_data = !show_data;      GlobalVariableSet(IndicatorName + "_visibility", show_data ? 1.0 : 0.0);      recalc = true;      start();     }  }//+------------------------------------------------------------------------------------------------------------------+void OnChartEvent(const int id, //don't change anything here                  const long &lparam,                  const double &dparam,                  const string &sparam)  {   handleButtonClicks();  }//+------------------------------------------------------------------------------------------------------------------+string GetButtonState(string whichbutton)  {   bool selected = ObjectGetInteger(ChartID(),whichbutton,OBJPROP_STATE);   if(selected)     { return ("on"); }   else     {      return ("off");     }  }//+------------------------------------------------------------------------------------------------------------------+int start()  {   handleButtonClicks();   recalc = false;   int xshift=0, nxshift=0;   if(Corner==CORNER_RIGHT_LOWER || Corner==CORNER_RIGHT_UPPER)     {      xshift=49;      nxshift=66;     }   for(int i = 0; i < cpairsLen; i++)      ButtonCreate2(ChartID(),UniqueID+"t"+(string)i,Window,XShift+nxshift+2,YShift+30+i*15,66,14,Corner,cpairs,"Arial",9,TextColor,BorderColor,FillColor);   for(int i = 0; i < ctimesLen; i++)      ButtonCreate2(ChartID(),UniqueID+"h"+(string)i,Window,XShift+xshift+i*50+69,YShift+15,49,14,Corner,timeFrameToString(aTimes),"Arial",9,TextColor,BorderColor,FillColor);   for(int i = 0; i < cpairsLen; i++)      if(iClose(cpairs,0,0)!=0)         for(int t = 0; t < ctimesLen; t++)           {            double value    = iCCI(cpairs,aTimes[t],CciPeriod,Price,BarToTest);            int    step     = (int)((ColorSteps-1)*(MathMax(MathMin(value,lStrongUp),lStrongDown)-lStrongDown)/(lStrongUp-lStrongDown));            color  theColor = colors[ColorSteps-step-1];            ButtonCreate2(ChartID(),UniqueID+(string)t+(string)i,Window,XShift+xshift+t*50+69,YShift+30+i*15,49,14,Corner," ","arial",10,theColor,BorderColor,theColor);           }   if(Corner==CORNER_RIGHT_UPPER || Corner==CORNER_RIGHT_LOWER)      ButtonCreate2(ChartID(),UniqueID+"title",Window,XShift+xshift+ctimesLen*50+19,YShift+30+cpairsLen*15,ctimesLen*50-1,14,Corner," CCI ("+(string)CciPeriod+")","arial",10,TextColor,BorderColor,FillColor);   else      ButtonCreate2(ChartID(),UniqueID+"title",Window,XShift+xshift+69,YShift+30+cpairsLen*15,ctimesLen*50-1,14,Corner," CCI ("+(string)CciPeriod+")","arial",10,TextColor,BorderColor,FillColor);//         ButtonCreate2(ChartID(),UniqueID+"title",Window,XShift+xshift+ctimesLen*50+19,YShift+30+cpairsLen*15,ctimesLen*50-1,14,Corner," Stochastic ("+(string)StoPeriod+","+(string)StoSmoothing+")","arial",10,TextColor,BorderColor,FillColor);//   else  ButtonCreate2(ChartID(),UniqueID+"title",Window,XShift+xshift+69             ,YShift+30+cpairsLen*15,ctimesLen*50-1,14,Corner," Stochastic ("+(string)StoPeriod+","+(string)StoSmoothing+")","arial",10,TextColor,BorderColor,FillColor);
  18.    if(!show_data)     {      ObjectSetInteger(ChartID(),buttonId,OBJPROP_COLOR,btn_text_OFF_color);      int idLength = StringLen(UniqueID);      for(int i = ObjectsTotal(); i>=0; i--)        { string name = ObjectName(i); if(StringSubstr(name,0,idLength) == UniqueID) ObjectDelete(name); }     }   else      ObjectSetInteger(ChartID(),buttonId,OBJPROP_COLOR,btn_text_ON_color);
  19.    return(0);  }
复制代码
filetype

CCI热力图.ex4

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

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

评论 使用道具

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

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