kevanjj 发表于 2025-6-28 14:54:39

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

指标名称:价格警报
版本:MT4ver. 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_PRESSEDC'200,200,200'#define CONTROLS_BUTTON_COLOR_PRESSEDclrRed// 定义按钮按下时的背景颜色(灰色)。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 "Position"// 输入参数组:"Position"(面板位置设置)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("PA-" + IntegerToString(ChartID()) + "-Flag") > 0)   {      GlobalVariableDel("PA-" + 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);}

jxj600 发表于 2025-6-29 07:06:24

这个没啥用吧

apacha 发表于 3 天前

这个可以邮件预警吗?

18640907987 发表于 3 天前

这个有什么用
页: [1]
查看完整版本: 【价格警报】快捷价格提示!多种方式预警