ホーム テクニカル指標 投稿

DSSBressertSignAlert - MetaTrader 5用のシグナルインジケーター

添付ファイル
16115.zip (21.84 KB, ダウンロード 0回)

皆さん、こんにちは!今日は、MetaTrader 5向けの新しいインジケーター「DSSBressertSignAlert」についてお話しします。このインジケーターは、DSSBressertインジケーターのアルゴリズムに基づいており、アラート機能や、モバイルデバイスへのメールおよびプッシュ通知をサポートしています。

このインジケーターにアラート、メール、プッシュ通知を実装するために、コードにいくつかの変更が加えられました。以下にその変更点を紹介します。

  1. 新しい入力パラメータを導入しました。
    input uint Bar数=1;//シグナル用のバー数
    input bool 音声ON=true; //アラートを有効にする
    input uint アラート数=2;//アラートの数
    input bool メールON=false; //シグナルのメールを有効にする
    input bool プッシュON=false; //モバイルデバイスへの送信を有効にする
    
  2. インジケーターのコードの末尾に、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));
    //----
      }
  3. 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. The DSSBressertSignAlert indicator on the chart

Fig.1. DSSBressertSignAlertインジケーターのチャート上の表示

Fig.2. The DSSBressertSignAlert indicator. Generating alerts.

Fig.2. DSSBressertSignAlertインジケーターのアラート生成

関連記事

コメント (0)