找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
首页论坛EAHub 外汇论坛
查看: 5|回复: 0

【价格警报】快捷价格提示!多种方式预警

[复制链接]

4万

主题

54

回帖

4万

积分

管理员

积分
45954
发表于 2026-8-26 10:58:00 | 显示全部楼层 |阅读模式
指标名称:价格警报

版本:MT4  ver. 1.06

价格警报,快捷方便价格提示,不管是手动交易还是程序化交易,都适合!





价格触发有三种类型:NormalAskBid(正常Ask/Bid价)、AskOnly(仅Ask价)和BidOnly(仅Bid价)。它们的逻辑和区别如下:NormalAskBid(正常Ask/Bid价)

这是默认的触发方式。它会根据市场上的Ask价格(买入价格)和Bid价格(卖出价格)来判断。触发条件是当Ask或Bid价格超过或低于设定的警报价格时,警报会触发。用途:适用于大多数交易场景,因为它考虑了市场的买卖价格。

AskOnly(仅Ask价)

仅在Ask价格超过或低于设定的警报价格时,才会触发警报。用途:这种模式通常用于关注买入价格的情况,比如在进行多头交易时关注市场的买入价格,或希望只对买入价格敏感的用户。

BidOnly(仅Bid价)

仅在Bid价格超过或低于设定的警报价格时,才会触发警报。用途:这种模式通常用于关注卖出价格的情况,比如在进行空头交易时关注市场的卖出价格,或希望只对卖出价格敏感的用户。

NormalAskBid:触发条件是基于市场上的Ask或Bid价格。AskOnly:触发条件仅基于Ask价格。BidOnly:触发条件仅基于Bid价格。

这三种触发方式根据交易者的需求和策略不同,适合不同的场景。例如,进行多头交易时,可能更关注Ask价格,而进行空头交易时,可能更关注Bid价格。这三个按钮分别对应的是三种不同的价格触发类型,具体的逻辑和区别如下:上方价格(Above price)

这个按钮设置的触发条件是当市场的价格高于设定的价格时,触发警报。例如,设定一个价格PriceAbove,当当前市场价格(可以是Ask或Bid价格)高于这个价格时,就会触发警报,提醒交易者价格突破了设定的上方警戒线。用途:适用于想要在价格突破某一上方阻力位时获得通知的场景。

下方价格(Below price)

这个按钮设置的触发条件是当市场的价格低于设定的价格时,触发警报。例如,设定一个价格PriceBelow,当当前市场价格低于这个价格时,就会触发警报,提醒交易者价格跌破了设定的下方支撑位。用途:适用于想要在价格突破某一下方支撑位时获得通知的场景。

精确价格(Exactly price)

这个按钮设置的触发条件是当市场的价格精确匹配设定的价格时,触发警报。例如,设定一个价格PriceExactly,当当前市场价格(可以是Ask或Bid价格)正好等于这个设定的价格时,就会触发警报,提醒交易者价格达到了设定的精确水平。用途:适用于想要在价格到达某一精确点位时获得通知的场景。

上方价格:当市场价格超过设定价格时触发警报。下方价格:当市场价格低于设定价格时触发警报。精确价格:当市场价格等于设定价格时触发警报。

这三种触发方式可以帮助用户根据不同的市场情形设置不同的警报,以便更好地掌控交易时机。本地警报:当价格达到设定时,会触发本地警报并禁用该警报设置。邮件警报:当价格达到设定时,会发送邮件提醒并禁用该警报设置。推送通知警报:当价格达到设定时,会发送推送手机通知提醒并禁用该警报设置。

参数:设置展示颜色和宽度等设置部分代码展示:

//+------------------------------------------------------------------+//|                                                    价格警报.mq4 |//|                                Copyright © 2009-2024, www.QChaos.com |//|                                          https://www.qchaos.com/ |//+------------------------------------------------------------------+#property version   "1.06"string    Version = "1.06";#property strict#property indicator_plots 0#property description "根据价格变动发出多种警报。"#property description "需要在平台中配置电子邮件SMTP服务器设置。"#property description "需要通过MetaTrader设置MetaQuotes ID以接收推送通知。"
#property indicator_chart_window// 指标显示在图表窗口中。#include <Controls\Dialog.mqh>// 引入对话框控件库。#include <Controls\CheckBox.mqh>// 引入复选框控件库。#include <Controls\Label.mqh>// 引入标签控件库。#include <Controls\Button.mqh>// 引入按钮控件库。
//#define CONTROLS_BUTTON_COLOR_PRESSED  C'200,200,200'#define CONTROLS_BUTTON_COLOR_PRESSED  clrRed// 定义按钮按下时的背景颜色(灰色)。enum ENUM_ALERT_ON_PRICE// 枚举:定义警报触发的价格基准类型。  {   NormalAskBid, // 正常Ask/Bid价   AskOnly,      // 仅Ask价   BidOnly,      // 仅Bid价   PreviousClose // 前一根K线收盘价  };
//input group "Main"// 输入参数组:"Main"(主要设置)double PriceGoesAbove = 0;// 输入参数:上方触发价格,默认值为0。double PriceGoesBelow = 0;// 输入参数:下方触发价格,默认值为0。double PriceIsExactly = 0;// 输入参数:精确触发价格,默认值为0。bool NativeAlert = false;// 输入参数:是否启用原生弹窗警报,默认值为false。bool SendEmail = false;// 输入参数:是否发送电子邮件通知,默认值为false。bool SendPush = false;// 输入参数:是否发送推送通知,默认值为false。ENUM_ALERT_ON_PRICE AlertOnPrice = NormalAskBid;// 输入参数:警报触发的价格基准类型,默认值为NormalAskBid。bool PanelOnTopOfChart = true;// 输入参数:是否将面板绘制在图表上方,默认值为true。
//input group "Lines"// 输入参数组:"Lines"(线条设置)input color above_line_color = clrGreen;// 输入参数:上方触发线的颜色,默认值为绿色。input color below_line_color = clrRed;// 输入参数:下方触发线的颜色,默认值为红色。input color exactly_line_color = clrYellow;// 输入参数:精确触发线的颜色,默认值为黄色。input ENUM_LINE_STYLE above_line_style = STYLE_SOLID;// 输入参数:上方触发线的样式,默认值为实线。input ENUM_LINE_STYLE below_line_style = STYLE_SOLID;// 输入参数:下方触发线的样式,默认值为实线。input ENUM_LINE_STYLE exactly_line_style = STYLE_SOLID;// 输入参数:精确触发线的样式,默认值为实线。input uint above_line_width = 3;// 输入参数:上方触发线的宽度,默认值为3。input uint below_line_width = 3;// 输入参数:下方触发线的宽度,默认值为3。input uint exactly_line_width = 3;// 输入参数:精确触发线的宽度,默认值为3。
//input group "osition"// 输入参数组:"osition"(面板位置设置)int DefaultPanelPositionX = 0;// 输入参数:面板的X坐标,默认值为0。int DefaultPanelPositionY = 15;// 输入参数:面板的Y坐标,默认值为15。ENUM_BASE_CORNER DefaultPanelPositionCorner = CORNER_LEFT_UPPER;// 输入参数:面板的定位角,默认值为左上角。
struct Settings// 结构体:用于存储用户设置。  {   double            PriceAbove;       // 上方触发价格   double            PriceBelow;       // 下方触发价格   double            PriceExactly;     // 精确触发价格   bool              AlertNative;      // 是否启用原生弹窗警报   bool              AlertEmail;       // 是否发送电子邮件通知   bool              AlertPush;        // 是否发送推送通知   ENUM_ALERT_ON_PRICE AlertOnPrice;   // 警报触发的价格基准类型  } sets;
//+------------------------------------------------------------------+//|                                                                  |//+------------------------------------------------------------------+class CPriceAlertPanel : public CAppDialog// 类:价格警报面板,继承自CAppDialog。  {private:   CCheckBox         m_ChkEmail, m_ChkPush, m_ChkNative, m_ChkUseCandleClose;   // 复选框控件:电子邮件、推送、原生警报、使用收盘价。   CEdit             m_EdtAbove, m_EdtBelow, m_EdtExactly;   // 编辑框控件:上方、下方、精确价格。   CButton           m_BtnAlertOnPrice, m_BtnAbove, m_BtnBelow, m_BtnExactly;   // 按钮控件:价格基准类型、上方、下方、精确价格。   CLabel            m_LblAlertOnPrice, m_LblURL;   // 标签控件:价格基准类型标签、URL标签。   string            m_FileName;   // 文件名:用于保存设置的文件名。   double            m_DPIScale;   // DPI缩放比例:用于适配不同分辨率的屏幕。   bool              NoPanelMaximization;   // 防止面板在初始化时最大化。
public:                     CPriceAlertPanel(void);   // 构造函数。                    ~CPriceAlertPanel(void) {};   // 析构函数。
   virtual bool      Create(const long chart, const string name, const int subwin, const int x1, const int y1);   // 创建面板。   virtual bool      OnEvent(const int id, const long& lparam, const double& dparam, const string& sparam);   // 事件处理函数。   virtual void      RefreshValues();   // 刷新面板中的值。   virtual bool      SaveSettingsOnDisk();   // 将设置保存到磁盘。   virtual bool      LoadSettingsFromDisk();   // 从磁盘加载设置。   virtual bool      DeleteSettingsFile();   // 删除设置文件。   virtual bool      Run()     {      SeekAndDestroyDuplicatePanels();      // 查找并销毁重复的面板。      return(CAppDialog::Run());     }   virtual void      IniFileLoad()     {      CAppDialog::IniFileLoad();      // 加载INI文件设置。      InitObjects();      // 初始化面板控件。     }   virtual void      HideShowMaximize(bool max);   // 隐藏/显示/最大化面板。   string            IniFileName(void) const;   // 获取INI文件名。   virtual void      FixatePanelPosition()     {      if(!m_minimized)         m_norm_rect.SetBound(m_rect);      // 固定面板位置。      else         m_min_rect.SetBound(m_rect);     }
   // 记住面板的位置,以便在最小化和最大化时保持一致。   int               remember_top, remember_left;
private:   virtual bool      InitObjects();   // 初始化面板控件。   virtual bool      CreateObjects();   // 创建面板控件。   virtual bool      DisplayValues();   // 显示面板中的值。   virtual void      SeekAndDestroyDuplicatePanels();   // 查找并销毁重复的面板。
   virtual bool      ButtonCreate(CButton&    Btn, int X1, int Y1, int X2, int Y2, string Name, string Text);   // 创建按钮控件。   virtual bool      CheckBoxCreate(CCheckBox&  Chk, int X1, int Y1, int X2, int Y2, string Name, string Text);   // 创建复选框控件。   virtual bool      EditCreate(CEdit&      Edt, int X1, int Y1, int X2, int Y2, string Name, string Text);   // 创建编辑框控件。   virtual bool      LabelCreate(CLabel&     Lbl, int X1, int Y1, int X2, int Y2, string Name, string Text);   // 创建标签控件。   virtual void      Maximize();   // 最大化面板。   virtual void      Minimize();   // 最小化面板。
   // 事件处理函数   void              OnClickBtnAlertOnPrice();   // 点击价格基准类型按钮。   void              OnClickBtnAbove();   // 点击上方价格按钮。   void              OnClickBtnBelow();   // 点击下方价格按钮。   void              OnClickBtnExactly();   // 点击精确价格按钮。   void              OnEndEditEdtAbove();   // 编辑上方价格编辑框完成。   void              OnEndEditEdtBelow();   // 编辑下方价格编辑框完成。   void              OnEndEditEdtExactly();   // 编辑精确价格编辑框完成。   void              OnChangeChkEmail();   // 更改电子邮件复选框状态。   void              OnChangeChkPush();   // 更改推送复选框状态。   void              OnChangeChkNative();   // 更改原生警报复选框状态。  };
CPriceAlertPanel Panel;// 全局变量:价格警报面板实例。
// 全局变量:string PanelCaption = "";// 面板标题。bool Dont_Move_the_Panel_to_Default_Corner_X_Y;// 是否将面板移动到默认位置。bool Uninitialized = true;// 是否未初始化。//+------------------------------------------------------------------+//| Custom indicator initialization function                         |//+------------------------------------------------------------------+int OnInit()  {   MathSrand(GetTickCount() + 937029); // Used by CreateInstanceId() in Dialog.mqh (standard library). Keep the second number unique across other panel indicators/EAs.
   Dont_Move_the_Panel_to_Default_Corner_X_Y = true;
// Prevent attachment of second panel if it is not a timeframe/parameters change.   if(GlobalVariableGet("A-" + IntegerToString(ChartID()) + "-Flag") > 0)     {      GlobalVariableDel("A-" + IntegerToString(ChartID()) + "-Flag");     }   else     {      int indicators_total = ChartIndicatorsTotal(0, 0);      for(int i = 0; i < indicators_total; i++)        {         if(ChartIndicatorName(0, 0, i) == "价格警报" + IntegerToString(ChartID()))           {            Print("价格警报 panel is already attached.");            return(INIT_FAILED);           }        }     }
   IndicatorSetString(INDICATOR_SHORTNAME, "价格警报" + IntegerToString(ChartID()));   PanelCaption = "价格警报 (ver. " + Version + ")";
   if(!Panel.LoadSettingsFromDisk())     {      sets.PriceAbove = PriceGoesAbove;      sets.PriceBelow = PriceGoesBelow;      sets.PriceExactly = PriceIsExactly;      sets.AlertNative = NativeAlert;      sets.AlertEmail = SendEmail;      sets.AlertPush = SendPush;      sets.AlertOnPrice = AlertOnPrice;     }
   if(!Panel.Create(0, PanelCaption, 0, DefaultPanelPositionX, DefaultPanelPositionY))      return(-1);
   string filename = Panel.IniFileName() + Panel.IniFileExt();// No ini file - move the panel according to the inputs.   if(!FileIsExist(filename))      Dont_Move_the_Panel_to_Default_Corner_X_Y = false;
   Panel.IniFileLoad();
   Panel.Run();
   Initialization();
// Brings panel on top of other objects without actual maximization of the panel.   Panel.HideShowMaximize(false);
   if(!Dont_Move_the_Panel_to_Default_Corner_X_Y)     {      int new_x = DefaultPanelPositionX, new_y = DefaultPanelPositionY;      int chart_width = (int)ChartGetInteger(0, CHART_WIDTH_IN_PIXELS);      int chart_height = (int)ChartGetInteger(0, CHART_HEIGHT_IN_PIXELS);      int panel_width = Panel.Width();      int panel_height = Panel.Height();
      // Invert coordinate if necessary.      if(DefaultPanelPositionCorner == CORNER_LEFT_LOWER)        {         new_y = chart_height - panel_height - new_y;        }      else         if(DefaultPanelPositionCorner == CORNER_RIGHT_UPPER)           {            new_x = chart_width - panel_width - new_x;           }         else            if(DefaultPanelPositionCorner == CORNER_RIGHT_LOWER)              {               new_x = chart_width - panel_width - new_x;               new_y = chart_height - panel_height - new_y;              }      Panel.remember_left = new_x;      Panel.remember_top = new_y;      Panel.Move(new_x, new_y);      Panel.FixatePanelPosition(); // Remember the panel's new position for the INI file.     }
   return(INIT_SUCCEEDED);  }

复制代码
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|小黑屋|EAHub外汇论坛

GMT+8, 2026-10-11 05:48 , Processed in 0.105397 second(s), 19 queries .

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

快速回复 返回顶部 返回列表