指标名称:价格警报 [color=rgba(0, 0, 0, 0.9)]
版本: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 "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); }
复制代码