スマホPUSH通知とは

自分で作成したEAやインジケーターからスマホにPUSH通知を行う方法を説明します。

常時稼働させているEAやインジケーターから、シグナル発生やエントリークローズなど、様々な場面でスマホにインストールしているMT4に通知を行います。

これはMT4に標準装備されている便利な機能なので、実装も簡単なので常時稼働させている人はお使い下さい。

PUSH通知を行うための設定

PUSH通知を実装したEAやインジケーターから通知処理が行われたタイミングで、スマホのMT4に通知が行われます。

まず、スマホのMT4をリンクさせるために、通知先のMT4IDを取得します。

下記画像はiPhone版のMT4ですが、Androidも同じような感じだと思います。

左画像のように、スマホ版MT4の「設定タブ」の「チャットとメッセージ」をクリックすると、右画像の画面に変わります。

右画面の下に「MetaQuotes ID」が記載されており、このIDがシステムとリンクさせるIDとなります。

次に、スマホとPCをリンクさせるた、PC版MT4のメニューバーから「ツール」→「オプション」で画面を開き、「通知機能」タブをクリックしMetaQuotes IDを入力して下さい。

MT4の設定は以上です。

PUSH通知機能の実装

MT4に上記の設定をしておくだけでプログラム的には簡単に通知を行えます。

通知処理を行う処理は下記コードです。

SendNotification(string msg);

実装方法は色々とありますが、実用例としてはこんな感じになります。
例としてEMA-Crossover_Signalを少し変更したコードをサンプルに使います。

パラメーターで通知をON/OFF出来るようにしています。

これをコンパイルすると、シグナルが発生した時点で通知する組みになっています。

//+------------------------------------------------------------------+
//|                                         EMA-Crossover_Signal.mq4 |
//|         Copyright ゥ 2005, Jason Robinson (jnrtrading)            |
//|                   http://www.jnrtading.co.uk                     |
//+------------------------------------------------------------------+

/*
  +------------------------------------------------------------------+
  | Allows you to enter two ema periods and it will then show you at |
  | Which point they crossed over. It is more usful on the shorter   |
	| periods that get obscured by the bars / candlesticks and when    |
  | the zoom level is out. Also allows you then to remove the emas   |
  | from the chart. (emas are initially set at 5 and 6)              |
  +------------------------------------------------------------------+
*/   
#property copyright "Copyright ゥ 2005, Jason Robinson (jnrtrading)"
#property link      "http://www.jnrtrading.co.uk"

#property indicator_chart_window
#property indicator_buffers 2
#property indicator_color1 SeaGreen
#property indicator_color2 Red

double CrossUp[];
double CrossDown[];
extern int FasterEMA = 4;
extern int SlowerEMA = 8;
extern bool SoundON=true;
double alertTag;
double control=2147483647;

extern bool EnablePushNotification=true;
extern bool EnableMailNotification=true;
int MaMethodId;
enum maMethod_List{SMA=MODE_SMA,EMA=MODE_EMA,SMMA=MODE_SMMA,LWMA=MODE_LWMA};
input maMethod_List MaMethods = EMA;
input string MetaQuotesID ="FF7EE8B";

//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int init()
  {
//---- indicators
   SetIndexStyle(0, DRAW_ARROW, EMPTY,3);
   SetIndexArrow(0, 233);
   SetIndexBuffer(0, CrossUp);
   SetIndexStyle(1, DRAW_ARROW, EMPTY,3);
   SetIndexArrow(1, 234);
   SetIndexBuffer(1, CrossDown);
   MaMethodId=MaMethods;
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| Custom indicator deinitialization function                       |
//+------------------------------------------------------------------+
int deinit()
  {
//---- 

//----
   return(0);
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int start() {
  int limit, i, counter;
  double fasterEMAnow, slowerEMAnow, fasterEMAprevious, slowerEMAprevious, fasterEMAafter, slowerEMAafter;
  double Range, AvgRange;
  int counted_bars=IndicatorCounted();
//---- check for possible errors
  if(counted_bars<0) return(-1);
//---- last counted bar will be recounted
  if(counted_bars>0) counted_bars--;

  limit=Bars-counted_bars;
   
  for(i = 0; i <= limit; i++) {
   
    counter=i;
    Range=0;
    AvgRange=0;
    for (counter=i ;counter<=i+9;counter++)
    {
      AvgRange=AvgRange+MathAbs(High[counter]-Low[counter]);
    }
    Range=AvgRange/10;
      
    fasterEMAnow = iMA(NULL, 0, FasterEMA, 0, MaMethodId, PRICE_CLOSE, i);
    fasterEMAprevious = iMA(NULL, 0, FasterEMA, 0, MaMethodId, PRICE_CLOSE, i+1);
    fasterEMAafter = iMA(NULL, 0, FasterEMA, 0, MaMethodId, PRICE_CLOSE, i-1);
    
    slowerEMAnow = iMA(NULL, 0, SlowerEMA, 0, MaMethodId, PRICE_CLOSE, i);
    slowerEMAprevious = iMA(NULL, 0, SlowerEMA, 0, MaMethodId, PRICE_CLOSE, i+1);
    slowerEMAafter = iMA(NULL, 0, SlowerEMA, 0, MaMethodId, PRICE_CLOSE, i-1);
    
    if ((fasterEMAnow > slowerEMAnow) && (fasterEMAprevious < slowerEMAprevious) && (fasterEMAafter > slowerEMAafter)) {
      CrossUp[i] = Low[i] - Range*0.5;  
    }  
    else if ((fasterEMAnow < slowerEMAnow) && (fasterEMAprevious > slowerEMAprevious) && (fasterEMAafter < slowerEMAafter)) {
      CrossDown[i] = High[i] + Range*0.5;
    }
    
    string msg="";
    if (i==1 && CrossUp[i] > CrossDown[i] && alertTag!=Time[0])
    {
      switch(MaMethodId)
      {
        case MODE_SMA:msg= "SMA "; break;
        case MODE_EMA:msg= "EMA "; break;
        case MODE_SMMA:msg="SMMA ";break;
        case MODE_LWMA:msg="LWMA ";break;
      }
      msg+="Cross Trend going Down on ";
      if(SoundON==true)
      {
        Alert(msg,Symbol()," ",Period());
        alertTag = Time[0];
      }
      if(EnableMailNotification==true)
      {
        MailNotification(msg,msg+Symbol()+Period());
        alertTag = Time[0];
      }
      if(EnablePushNotification==true)
      {
        PushNotification(msg+Symbol()+Period());
        alertTag = Time[0];
      }    }
    if (i==1 && CrossUp[i] < CrossDown[i] && alertTag!=Time[0])
    {
      switch(MaMethodId)
      {
        case MODE_SMA:msg= "SMA "; break;
        case MODE_EMA:msg= "EMA "; break;
        case MODE_SMMA:msg="SMMA ";break;
        case MODE_LWMA:msg="LWMA ";break;
      }
      msg+="Cross Trend going Up on ";
      if(SoundON==true)
      {
        Alert(msg,Symbol()," ",Period());
        alertTag = Time[0];
      }
      if(EnableMailNotification==true)
      {
        MailNotification(msg,msg+Symbol()+Period());
        alertTag = Time[0];
      }
      if(EnablePushNotification==true)
      {
        PushNotification(msg+Symbol()+Period());
        alertTag = Time[0];
      }
    }
  }
  return(0);
}

bool PushNotification(string msg)
{
  return SendNotification(msg);
}

bool MailNotification(string subject,string body)
{
  return SendMail(subject,body);
}