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

ColorJFatl_Digit_Alert - MetaTrader 5用アラートインジケーターのご紹介

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

ColorJFatl_Digitは、アラート機能を搭載したインジケーターで、メールやプッシュ通知をスマートフォンに送信することができます。

このインジケーターにアラート、メールメッセージ、プッシュ通知の機能を実装するために、以下の変更がコードに加えられました:

  1. アラート用の新しい入力パラメータを導入しました。
    //---- アラート用の入力変数 
    input uint NumberofBar=1;//信号のためのバー数
    input bool SoundON=true;//アラートを有効にする
    input uint NumberofAlerts=2;//アラートの数
    input bool EMailON=false;//信号のメール送信を有効にする
    input bool PushON=false;//モバイルデバイスへの信号送信を有効にする
    
  2. インジケーターコードの最後に3つの新しい関数を追加しました:BuySignal()、SellSignal()、GetStringTimeframe()。
    //+------------------------------------------------------------------+
    //| 買い信号関数 
    //+------------------------------------------------------------------+
    void BuySignal(string SignalSirname,// メールやプッシュメッセージ用のインジケーター名テキスト
        double &ColorArray[],// カラーインデックスバッファ
        int ColorIndex,// 信号を生成するための色インデックス
        const int Rates_total,// 現在のバー数
        const int Prev_calculated,// 前のティックでのバー数
        const double &Close[],// 終値
        const int &Spread[])// スプレッド
      {
    //---
       static uint counter=0;
       if(Rates_total!=Prev_calculated) counter=0;
    
       bool BuySignal=false;
       bool SeriesTest=ArrayGetAsSeries(ColorArray);
       int index,index1;
       if(SeriesTest)
         {
          index=int(NumberofBar);
          index1=index+1;
         }
       else
         {
          index=Rates_total-int(NumberofBar)-1;
          index1=index-1;
         }
       if(ColorArray[index1]!=ColorIndex && ColorArray[index]==ColorIndex) 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信号 \n Ask=",Ask,"\n Bid=",Bid,"\n currtime=",text,"\n Symbol=",Symbol()," Period=",sPeriod);
          if(EMailON) SendMail(SignalSirname+": BUY信号アラート","BUY信号 at Ask="+sAsk+", Bid="+sBid+", Date="+text+" Symbol="+Symbol()+" Period="+sPeriod);
          if(PushON) SendNotification(SignalSirname+": BUY信号 at Ask="+sAsk+", Bid="+sBid+", Date="+text+" Symbol="+Symbol()+" Period="+sPeriod);
         }
    //---
      }
    //+------------------------------------------------------------------+
    //| 売り信号関数 
    //+------------------------------------------------------------------+
    void SellSignal(string SignalSirname,// メールやプッシュメッセージ用のインジケーター名テキスト
        double &ColorArray[],// カラーインデックスバッファ
        int ColorIndex,// 信号を生成するための色インデックス
        const int Rates_total,// 現在のバー数
        const int Prev_calculated,// 前のティックでのバー数
        const double &Close[],// 終値
        const int &Spread[])// スプレッド
      {
    //---
       static uint counter=0;
       if(Rates_total!=Prev_calculated) counter=0;
    
       bool SellSignal=false;
       bool SeriesTest=ArrayGetAsSeries(ColorArray);
       int index,index1;
       if(SeriesTest)
         {
          index=int(NumberofBar);
          index1=index+1;
         }
       else
         {
          index=Rates_total-int(NumberofBar)-1;
          index1=index-1;
         }
       if(ColorArray[index1]!=ColorIndex && ColorArray[index]==ColorIndex) 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信号 \n Ask=",Ask,"\n Bid=",Bid,"\n currtime=",text,"\n Symbol=",Symbol()," Period=",sPeriod);
          if(EMailON) SendMail(SignalSirname+": SELL信号アラート","SELL信号 at Ask="+sAsk+", Bid="+sBid+", Date="+text+" Symbol="+Symbol()+" Period="+sPeriod);
          if(PushON) SendNotification(SignalSirname+": SELL信号 at Ask="+sAsk+", Bid="+sBid+", Date="+text+" Symbol="+Symbol()+" Period="+sPeriod);
         }
    //---
      }
    //+------------------------------------------------------------------+
    //| タイムフレームを文字列として取得する |
    //+------------------------------------------------------------------+
    string GetStringTimeframe(ENUM_TIMEFRAMES timeframe)
      {
    //----
       return(StringSubstr(EnumToString(timeframe),7,-1));
    //----
      }
  3. インジケーター計算サイクルの後にBuySignal()およびSellSignal()関数を呼び出すようにしました。
    //---
       BuySignal("ColorJFatl_Digit_Alert",ColorExtLineBuffer,2,rates_total,prev_calculated,close,spread);
       SellSignal("ColorJFatl_Digit_Alert",ColorExtLineBuffer,0,rates_total,prev_calculated,close,spread);
    //---
    

ここで、ColorExtLineBufferは、インデックスの形でラインカラーを保存するためのカラーインデックスバッファの名前です。

インジケーターコードのOnCalculate()ブロックでは、BuySignal()およびSellSignal()関数が1回だけ呼び出されることが想定されています。

このインジケーターは、SmoothAlgorithms.mqhライブラリのクラスを使用しています(\MQL5\Includeにコピーしてください)。このクラスの使い方については、「追加バッファを使用せずに中間計算のための価格系列の平均化」という記事で詳しく説明されています。

Fig1. ColorJFatl_Digit_Alertインジケーターのチャート

Fig1. ColorJFatl_Digit_Alertインジケーターのチャート

Fig.2. ColorJFatl_Digit_Alertインジケーターがアラートを生成

Fig.2. ColorJFatl_Digit_Alertインジケーターがアラートを生成

関連記事

コメント (0)