皆さん、こんにちは!今日は、MetaTrader 5向けの新しいインジケーター「DSSBressertSignAlert」についてお話しします。このインジケーターは、DSSBressertインジケーターのアルゴリズムに基づいており、アラート機能や、モバイルデバイスへのメールおよびプッシュ通知をサポートしています。
このインジケーターにアラート、メール、プッシュ通知を実装するために、コードにいくつかの変更が加えられました。以下にその変更点を紹介します。
- 新しい入力パラメータを導入しました。
input uint Bar数=1;//シグナル用のバー数 input bool 音声ON=true; //アラートを有効にする input uint アラート数=2;//アラートの数 input bool メールON=false; //シグナルのメールを有効にする input bool プッシュON=false; //モバイルデバイスへの送信を有効にする
- インジケーターのコードの末尾に、BuySignal()、SellSignal()、GetStringTimeframe()という3つの新しい関数を追加しました。
//+------------------------------------------------------------------+ //| Buyシグナル関数 | //+------------------------------------------------------------------+ void BuySignal(string シグナル名, //メールやプッシュメッセージ用のインジケーター名 double &買い矢印[], //買いシグナルのインジケーターバッファ const int 現在のバー数, //現在のバー数 const int 前回計算数,//前回のティックのバー数 const double &終値[], //終値 const int &スプレッド[]) //スプレッド { u//--- static uint カウンター=0; if(現在のバー数!=前回計算数) カウンター=0; bool シグナル発生=false; bool シリーズテスト=ArrayGetAsSeries(買い矢印); int インデックス; if(シリーズテスト) インデックス=int(Bar数); else インデックス=現在のバー数-int(Bar数)-1; if(NormalizeDouble(買い矢印[インデックス],_Digits) && 買い矢印[インデックス]!=EMPTY_VALUE) シグナル発生=true; if(シグナル発生 && カウンター<=アラート数) { カウンター++; MqlDateTime tm; TimeToStruct(TimeCurrent(),tm); string text=TimeToString(TimeCurrent(),TIME_DATE)+" "+string(tm.hour)+":"+string(tm.min); シリーズテスト=ArrayGetAsSeries(終値); if(シリーズテスト) インデックス=int(Bar数); else インデックス=現在のバー数-int(Bar数)-1; double Ask=終値[インデックス]; double Bid=終値[インデックス]; シリーズテスト=ArrayGetAsSeries(スプレッド); if(シリーズテスト) インデックス=int(Bar数); else インデックス=現在のバー数-int(Bar数)-1; Bid+=スプレッド[インデックス]; string sAsk=DoubleToString(Ask,_Digits); string sBid=DoubleToString(Bid,_Digits); string sPeriod=GetStringTimeframe(ChartPeriod()); if(音声ON) Alert("BUY signal Ask=",Ask," Bid=",Bid," currtime=",text," Symbol=",Symbol()," Period=",sPeriod); if(メールON) SendMail(シグナル名+": BUY signal alert","BUY signal at Ask="+sAsk+", Bid="+sBid+", Date="+text+" Symbol="+Symbol()+" Period="+sPeriod); if(プッシュON) SendNotification(シグナル名+": BUY signal at Ask="+sAsk+", Bid="+sBid+", Date="+text+" Symbol="+Symbol()+" Period="+sPeriod); } u//--- } //+------------------------------------------------------------------+ //| Sellシグナル関数 | //+------------------------------------------------------------------+ void SellSignal(string シグナル名, //メールやプッシュメッセージ用のインジケーター名 double &売り矢印[], //売りシグナルのインジケーターバッファ const int 現在のバー数, //現在のバー数 const int 前回計算数, //前回のティックのバー数 const double &終値[], //終値 const int &スプレッド[]) //スプレッド { u//--- static uint カウンター=0; if(現在のバー数!=前回計算数) カウンター=0; bool シグナル発生=false; bool シリーズテスト=ArrayGetAsSeries(売り矢印); int インデックス; if(シリーズテスト) インデックス=int(Bar数); else インデックス=現在のバー数-int(Bar数)-1; if(NormalizeDouble(売り矢印[インデックス],_Digits) && 売り矢印[インデックス]!=EMPTY_VALUE) シグナル発生=true; if(シグナル発生 && カウンター<=アラート数) { カウンター++; MqlDateTime tm; TimeToStruct(TimeCurrent(),tm); string text=TimeToString(TimeCurrent(),TIME_DATE)+" "+string(tm.hour)+":"+string(tm.min); シリーズテスト=ArrayGetAsSeries(終値); if(シリーズテスト) インデックス=int(Bar数); else インデックス=現在のバー数-int(Bar数)-1; double Ask=終値[インデックス]; double Bid=終値[インデックス]; シリーズテスト=ArrayGetAsSeries(スプレッド); if(シリーズテスト) インデックス=int(Bar数); else インデックス=現在のバー数-int(Bar数)-1; Bid+=スプレッド[インデックス]; string sAsk=DoubleToString(Ask,_Digits); string sBid=DoubleToString(Bid,_Digits); string sPeriod=GetStringTimeframe(ChartPeriod()); if(音声ON) Alert("SELL signal Ask=",Ask," Bid=",Bid," currtime=",text," Symbol=",Symbol()," Period=",sPeriod); if(メールON) SendMail(シグナル名+": SELL signal alert","SELL signal at Ask="+sAsk+", Bid="+sBid+", Date="+text+" Symbol="+Symbol()+" Period="+sPeriod); if(プッシュON) SendNotification(シグナル名+": 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",買いバッファ,現在のバー数,前回計算数,終値,スプレッド); SellSignal("DSSBressertSignAlert",売りバッファ,現在のバー数,前回計算数,終値,スプレッド); u//---
ここで、買いバッファと売りバッファは、買いシグナルと売りシグナルを格納するためのインジケーターバッファの名前です。インジケーターバッファ内の空の値は、0またはEMPTY_VALUEに設定する必要があります。
BuySignal()とSellSignal()関数は、インジケーターコードのOnCalculate()ブロック内で1回だけ呼び出されることが想定されています。
このインジケーターは、「追加バッファを使用せずに中間計算のための価格系列の平均化」という記事で詳しく説明されたSmoothAlgorithms.mqhライブラリのクラスを使用しています。ライブラリを<terminal_data_folder>\MQL5\Includeにコピーしてください。

Fig.1. DSSBressertSignAlertインジケーターのチャート上の表示
Fig.2. DSSBressertSignAlertインジケーターのアラート生成
