MQLプログラミング言語を使いMT4の各種通知機能を実装する方法
サウンド通知
この記事では、MT4の各種通知機能を実装する方法について、説明していきます。標準的な通知方法としてはサウンド、アラート、メール、スマホへのプッシュ通知があります。
今回は「MQLプログラミン言語で移動平均線の売買サインを表示する方法」で作ったファイルに、通知に関するプログラムを追加していきます。
参考記事:MQLプログラミン言語で移動平均線の売買サインを表示する方法
まずはサインがどこで出たのか指定できるように、「bar=0」という整数型を定義しておきます。そしてif文を使って条件式を作ります。
int bar = 0;
if ((UP[bar] != EMPTY_VALUE || DN[bar] != EMPTY_VALUE)
このif文は、「bar」で指定したサインの配列の値が「EMPTY_VALUE」(空の値)ではない、すなわちサインが出ていることを意味します。これで上昇サイン、または下降サインが出ているという式ができました。
この中にサウンド通知としてPlaySoundという関数を使い、音源ファイルの名前を入れます。こうすることで、矢印が出たときにサウンドが鳴る設定ができました。
PlaySound("alert2.wav");
ただし、このままでは条件を満たして以降、ティック配信される度にサウンドが鳴る回路になっています。これを1本の足で、1回だけ鳴るように改修しましょう。
そのためには、時間の記憶を使います。記憶するために「static」と先に宣言した後、時間の型で「datetime」と宣言して「timeMem」を作ります。そして1回サウンドが鳴ったあと、その時に時間を記憶するようにします。
「Time」という配列は始めからMT4で提示されており、現在進行形で表示されているチャートの各足の時間を意味します。タイムの「0」というのは、最新の足の時間(始値)で、その時間を記憶として残します。その条件式にサインが出て、かつ「Time[0]」が記憶よりも大きい時(足が切り替わった時)という条件を加えます。
これで1回の足で通知は1回だけという回路ができました。
static datetime timeMem;
if ((UP[bar] != EMPTY_VALUE || DN[bar] != EMPTY_VALUE) && Time[0] > timeMem) {
PlaySound("alert2.wav");
timeMem = Time[0];
}
ちなみに、例として用いた「alert2.wav」は、元々MT4に入っているものです。他にどんな音があるのかというのは、MT4のメニューバーの「ツール」→「オプション」の音声設定タブにて確認できます。
さらに、wavの名前をダブルクリックして「Choose other」を選ぶとエクスプローラーが展開し、搭載されているその他の音源を確認することができます。デフォルト以外のwav音源を入手して使いたい場合は、このフォルダの中に入れることで使えるようになります。
アラート
次に、アラート通知の機能を作ってみましょう。Alert関数を使うと、そこに入れた文字がアラートとして表示されます。
Alert("Alert test¥nアラートテスト");
ただし注意点があり、履歴の部分には日本語表記が文字化けして表示されてしまいます。その対策は「\n」を使って2行に分けることで、1行目はアルファベット、2行目以降で日本語を使うということで文字化けを防げます。ちなみに「\n」が改行を意味します。
なお、サウンドとアラートを同時に鳴らした場合には、アラートの音が優先されるので注意が必要です。
メール
メールについては、SendMail関数を使います。既に解説したアラートとは異なり、2種類の文字列を指定します。カンマで区切られた前がメールのタイトル、その後が本文です。テストが送られると、下画像のようになります(例はGmail)。
話は前後しますが、メールを送信するにはMT4のオプションでEメールの登録をしていなければなりません。メニューバーの「ツール」→「オプション」のE-メールタブで情報を登録の上、有効にするにチェックを入れる必要があります。
プッシュ通知
最後に、スマホへのプッシュ通知の機能も作ってみましょう。
このプッシュ通知は、あらかじめiPhoneかAndroidにMT4アプリを入れておく必要があります。MT4アプリには、固有の「MetaQuotes ID」が与えられており、このIDをMT4のオプションで登録することでプッシュ通知が可能となります。
メニューバーの「ツール」→「オプション」の通知機能タブにて、MetaQuotes IDを入力し、プッシュ通知機能を有効にするチェックを入れれば完了です。
プログラムでは、SendNotification関数を使います。
SendNotification(“通知テスト”);
通知されると、MT4アプリの「チャットとメッセージ」に、下のようなメッセージが届きます。
ソースコード
今回、作成したソースコードは下記の通りです。
//+------------------------------------------------------------------+
//| MA_Cross_Sign_demo.mq4 |
//| Copyright 2020, MetaQuotes Software Corp. |
//| https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2020, MetaQuotes Software Corp."
#property link "https://www.mql5.com"
#property version "1.00"
#property strict
#property indicator_chart_window
#property indicator_buffers 4
#property indicator_plots 4
//--- parameters
input string _00 = ""; // [ MA1 ]
input int PERIOD0 = 5; // 期間
input int SHIFT0 = 0; // シフト
input ENUM_MA_METHOD METHOD0 = MODE_SMA; // MA種別
input ENUM_APPLIED_PRICE PRICE0 = PRICE_CLOSE; // 適用価格
input color CLR0 = clrWhite; // 色
input ENUM_LINE_STYLE STYLE0 = STYLE_SOLID; // 線種
input int WIDTH0 = 1; // 太さ
input string _10 = ""; //
input string _11 = ""; // [ MA2 ]
input int PERIOD1 = 20; // 期間
input int SHIFT1 = 0; // シフト
input ENUM_MA_METHOD METHOD1 = MODE_SMA; // MA種別
input ENUM_APPLIED_PRICE PRICE1 = PRICE_CLOSE; // 適用価格
input color CLR1 = clrYellow; // 色
input ENUM_LINE_STYLE STYLE1 = STYLE_SOLID; // 線種
input int WIDTH1 = 1; // 太さ
//--- indicator buffers
double MABuffer0[], MABuffer1[];
double UP[], DN[];
//+------------------------------------------------------------------+
//| Custom indicator initialization function |
//+------------------------------------------------------------------+
int OnInit()
{
//--- indicator buffers mapping
SetIndexBuffer(0,MABuffer0);
SetIndexBuffer(1,MABuffer1);
SetIndexBuffer(2,UP);
SetIndexBuffer(3,DN);
SetIndexStyle (0, DRAW_LINE, STYLE0, WIDTH0, CLR0);
SetIndexStyle (1, DRAW_LINE, STYLE1, WIDTH1, CLR1);
SetIndexStyle (2, DRAW_ARROW, STYLE_SOLID, 2, clrRed);
SetIndexStyle (3, DRAW_ARROW, STYLE_SOLID, 2, clrDodgerBlue);
SetIndexLabel(0, "MA1");
SetIndexLabel(1, "MA2");
SetIndexLabel(2, "Buy");
SetIndexLabel(3, "Sell");
SetIndexArrow(2, 233);
SetIndexArrow(3, 234);
//---
return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| Custom indicator iteration function |
//+------------------------------------------------------------------+
int OnCalculate(const int rates_total,
const int prev_calculated,
const datetime &time[],
const double &open[],
const double &high[],
const double &low[],
const double &close[],
const long &tick_volume[],
const long &volume[],
const int &spread[])
{
//---
int limit = Bars - IndicatorCounted() - 1;
if (limit < 1) limit = 1;
for (int i = limit; i >= 0; i--) {
MABuffer0[i] = iMA(NULL, 0, PERIOD0, SHIFT0, METHOD0, PRICE0, i );
MABuffer1[i] = iMA(NULL, 0, PERIOD1, SHIFT1, METHOD1, PRICE1, i );
if (MABuffer0[i] > MABuffer1[i] && MABuffer0[i + 1] <= MABuffer1[i + 1]){
UP[i] = Low[i];
} else {
UP[i] = EMPTY_VALUE;
}
if (MABuffer0[i] < MABuffer1[i] && MABuffer0[i + 1] >= MABuffer1[i + 1]){
DN[i] = High[i];
} else {
DN[i] = EMPTY_VALUE;
}
}
//通知
int bar = 0;
static datetime timeMem;
if ((UP[bar] != EMPTY_VALUE || DN[bar] != EMPTY_VALUE) && Time[0] > timeMem) {
Alert("Alert test¥nアラートテスト");
PlaySound("alert2.wav");
SendMail("テスト","send test");
SendNotification("通知テスト");
timeMem = Time[0];
}
//--- return value of prev_calculated for next call
return(rates_total);
}
//+------------------------------------------------------------------+
本記事の監修者・HT FX
2013年にFXを開始し、その後専業トレーダーへ。2014年からMT4/MT5のカスタムインジケーターの開発に取り組む。ブログでは100本を超えるインジケーターを無料公開。投資スタイルは自作の秒足インジケーターを利用したスキャルピング。
本ホームページに掲載されている事項は、投資判断の参考となる情報の提供を目的としたものであり、投資の勧誘を目的としたものではありません。投資方針、投資タイミング等は、ご自身の責任において判断してください。本サービスの情報に基づいて行った取引のいかなる損失についても、当社は一切の責を負いかねますのでご了承ください。また、当社は、当該情報の正確性および完全性を保証または約束するものでなく、今後、予告なしに内容を変更または廃止する場合があります。なお、当該情報の欠落・誤謬等につきましてもその責を負いかねますのでご了承ください。