大家好!今天我们来聊聊DSSBressertSignAlert指标,这是一款基于DSSBressert算法的信号提醒工具,适用于MetaTrader 5平台。它不仅能发出信号提醒,还可以通过电子邮件和手机推送通知来告知你买卖信号。
功能介绍
为了实现这些提醒功能,开发者对指标代码进行了如下修改:
- 新增输入参数:
input uint NumberofBar=1;//信号的柱数 input bool SoundON=true;//启用声音提醒 input uint NumberofAlerts=2;//提醒次数 input bool EMailON=false;//启用邮件提醒 input bool PushON=false;//启用手机推送
- 新增三个函数:BuySignal()、SellSignal()和GetStringTimeframe()
//+------------------------------------------------------------------+ //| 买入信号函数 | //+------------------------------------------------------------------+ void BuySignal(string SignalSirname, // 指标名称,用于邮件和推送通知 double &BuyArrow[], // 买入信号的指标缓冲区 const int Rates_total, // 当前柱数 const int Prev_calculated, // 上一个柱数 const double &Close[], // 收盘价 const int &Spread[]) // 点差 { u//--- static uint counter=0; if(Rates_total!=Prev_calculated) counter=0; bool BuySignal=false; bool SeriesTest=ArrayGetAsSeries(BuyArrow); int index; if(SeriesTest) index=int(NumberofBar); else index=Rates_total-int(NumberofBar)-1; if(NormalizeDouble(BuyArrow[index],_Digits) && BuyArrow[index]!=EMPTY_VALUE) BuySignal=true; if(BuySignal && counter<=NumberofAlerts) { counter++; MqlDateTime tm; TimeToStruct(TimeCurrent(),tm); string text=TimeToString(TimeCurrent(),TIME_DATE)+" "+string(tm.hour)+":"+string(tm.min); SeriesTest=ArrayGetAsSeries(Close); if(SeriesTest) index=int(NumberofBar); else index=Rates_total-int(NumberofBar)-1; double Ask=Close[index]; double Bid=Close[index]; SeriesTest=ArrayGetAsSeries(Spread); if(SeriesTest) index=int(NumberofBar); else index=Rates_total-int(NumberofBar)-1; Bid+=Spread[index]; string sAsk=DoubleToString(Ask,_Digits); string sBid=DoubleToString(Bid,_Digits); string sPeriod=GetStringTimeframe(ChartPeriod()); if(SoundON) Alert("BUY signal \n Ask=",Ask,"\n Bid=",Bid,"\n currtime=",text,"\n Symbol=",Symbol()," Period=",sPeriod); if(EMailON) SendMail(SignalSirname+": BUY signal alert","BUY signal at Ask="+sAsk+", Bid="+sBid+", Date="+text+" Symbol="+Symbol()+" Period="+sPeriod); if(PushON) SendNotification(SignalSirname+": BUY signal at Ask="+sAsk+", Bid="+sBid+", Date="+text+" Symbol="+Symbol()+" Period="+sPeriod); } u//--- } //+------------------------------------------------------------------+ //| 卖出信号函数 | //+------------------------------------------------------------------+ void SellSignal(string SignalSirname, // 指标名称,用于邮件和推送通知 double &SellArrow[], // 卖出信号的指标缓冲区 const int Rates_total, // 当前柱数 const int Prev_calculated, // 上一个柱数 const double &Close[], // 收盘价 const int &Spread[]) // 点差 { u//--- static uint counter=0; if(Rates_total!=Prev_calculated) counter=0; bool SellSignal=false; bool SeriesTest=ArrayGetAsSeries(SellArrow); int index; if(SeriesTest) index=int(NumberofBar); else index=Rates_total-int(NumberofBar)-1; if(NormalizeDouble(SellArrow[index],_Digits) && SellArrow[index]!=EMPTY_VALUE) SellSignal=true; if(SellSignal && counter<=NumberofAlerts) { counter++; MqlDateTime tm; TimeToStruct(TimeCurrent(),tm); string text=TimeToString(TimeCurrent(),TIME_DATE)+" "+string(tm.hour)+":"+string(tm.min); SeriesTest=ArrayGetAsSeries(Close); if(SeriesTest) index=int(NumberofBar); else index=Rates_total-int(NumberofBar)-1; double Ask=Close[index]; double Bid=Close[index]; SeriesTest=ArrayGetAsSeries(Spread); if(SeriesTest) index=int(NumberofBar); else index=Rates_total-int(NumberofBar)-1; Bid+=Spread[index]; string sAsk=DoubleToString(Ask,_Digits); string sBid=DoubleToString(Bid,_Digits); string sPeriod=GetStringTimeframe(ChartPeriod()); if(SoundON) Alert("SELL signal \n Ask=",Ask,"\n Bid=",Bid,"\n currtime=",text,"\n Symbol=",Symbol()," Period=",sPeriod); if(EMailON) SendMail(SignalSirname+": SELL signal alert","SELL signal at Ask="+sAsk+", Bid="+sBid+", Date="+text+" Symbol="+Symbol()+" Period="+sPeriod); if(PushON) SendNotification(SignalSirname+": SELL signal at Ask="+sAsk+", Bid="+sBid+", Date="+text+" Symbol="+Symbol()+" Period="+sPeriod); } u//--- } //+------------------------------------------------------------------+ //| 获取时间框架字符串 | //+------------------------------------------------------------------+ string GetStringTimeframe(ENUM_TIMEFRAMES timeframe) { //---- return(StringSubstr(EnumToString(timeframe),7,-1)); //---- }
- 在OnCalculate()块中调用BuySignal()和SellSignal()函数:
u//--- BuySignal("DSSBressertSignAlert",BuyBuffer,rates_total,prev_calculated,close,spread); SellSignal("DSSBressertSignAlert",SellBuffer,rates_total,prev_calculated,close,spread); u//---
在这里,BuyBuffer和SellBuffer是用来存储买卖信号的指标缓冲区。需要注意的是,指标缓冲区中的空值可以设为零或EMPTY_VALUE。
通常情况下,在指标代码的OnCalculate()块中只会调用一次BuySignal()和SellSignal()函数。
该指标使用了SmoothAlgorithms.mqh库类(请将其复制到<terminal_data_folder>\MQL5\Include目录下)。关于类的使用,可以参考这篇文章:《中间计算平均价格序列而不使用额外缓冲区》。

图1. DSSBressertSignAlert指标在图表上的表现
图2. DSSBressertSignAlert指标生成提醒

评论 0