ZigZagの山や谷ができたときに通知するインジケーター「320_ZigZagNotice」


ZigZagの山や谷が作成または更新されたときに音やメールで通知します。
また、通知する時にディスプレイのスリープ解除も行えます。
山と山、谷と谷を線で結ぶこともできます。
格言「頭と尻尾はくれてやれ」から発想した「遅延機能」もおすすめです。(詳細はこちら)

なお、ディスプレイのスリープ解除はWindowsのみが対象です。
また、インジケーターの修正と「DLLの使用を許可する」にチェックを入れる必要があります。
詳細は後述のディスプレイのスリープ解除についてを参照してください。

2021/12/22:追記
MT5向けに「320_ZigZagNotice.mq5」を追加しました。拡張子は「mq5」なのでそのまま使用できます。
また、おまけで
・1つのインジケーターで最大5つのZigZagを表示する「320_ZigZagFive」
・2つのZigZagを使用して順張りや逆張りのタイミングを通知する「320_ZigZagNoticeDouble」
を追加しました。MT4用は拡張子が「.mq4」、MT5用は「.mq5」です。
おまけなので使い方での説明は簡略化してます。

ファイルはMT4用のトップページからダウンロードできます。

画面イメージ
320_ZigZagNotice.mq4を使用した時のイメージ
山と山を赤色線で、谷と谷を青色線で結んだ時の表示例です。


導入方法(インストール)

ダウンロードしたZIPファイルを適当なフォルダに展開(解凍)後、通常のインジケーターと同様にMT4に導入してください。

  1. MT4のメニュー「ファイル」から「データフォルダを開く」をクリックする。
  2. エクスプローラーが表示されたら「MQL4」フォルダ内にある「Indicators」フォルダに当インジケーター「320_ZigZagNotice.mq4」をコピーする。
  3. MT4のナビゲーターウィンドウで右クリックして「更新」をクリックする。またはMT4を再起動する。
  4. ナビゲーターウィンドウに当インジケーターが表示されたらチャートに挿入する。
  5. 必要に応じてパラメーターを変更する。

補足:ZIPファイルはMT4用のトップページからダウンロードできます。

補足:MT5の場合は「MQL5」フォルダの「Indicators」フォルダにコピーしますが、その後、「更新」してもMT5を再起動しても自動的にコンパイルされない場合があるようです。その場合はMetaEditorで開いてからコンパイルしてください。


削除方法(アンインストール)

通常のインジケーターと同様にMT4から削除してください。

  1. チャートから当インジケーターを削除する。
  2. MT4のメニュー「ファイル」から「データフォルダを開く」をクリックする。
  3. エクスプローラーが表示されたら「MQL4」フォルダ→「Indicators」フォルダ内の「320_ZigZagNotice.ex4」や「320_ZigZagNotice.mq4」を削除する。
  4. MT4のナビゲーターウィンドウで右クリックして「更新」をクリックする。またはMT4を再起動する。

パラメーターの説明

Custom Indicatorの「パラメーターの入力」の画面イメージ
パラメーターの入力画面

補足:「■」で始まる項目について

当サイトのインジケーターではパラメーターの仕切りとして使用したり、コメント(注記など)を記載するために使用しています。なので値を変更しても何も変わりません。
当インジケーターはパラメーターが多いので見やすくするための仕切りとして使用しています。

ZigZag基本設定(Depth、Deviation、Backstep)

ZigZag.mq4の3つのパラメーターについては詳しくないので説明ができません。
検索サイトで「zigzag パラメータ 意味」などで検索して調べてください。

山(谷)を線で結ぶ(=true)

ZigZag線の山と山、谷と谷を線で結ぶかを指定します。「true」にすると線で結びます。

メールを送信する(=true)

メール通知するかを指定します。「true」にするとメール通知します。

注意:メール通知を行う場合は、あらかじめMT4のオプションにてメールの設定(SMTPサーバーなど)およびメール送信テストを行ってください。

山(谷)作成時のみメール送信する(=true)

山(谷)が作成された時だけメール通知するかを指定します。「true」にすると作成時のみメール通知します。

ZigZagの山や谷は新しく作成されたあと何度か更新されるケースがほとんどです。
更新されるたびにメール通知すると大量にメールが送信される可能性があります。
(正しくは更新されるたびではなく、パラメーター「間隔設定(秒)」と「通知遅延時間(秒)」に従って通知するたびです)

このパラメーターが「true」の場合は、メール通知は最初に山(高値)または谷(安値)が作成された時に1回だけ通知します。山(高値)または谷(安値)が更新されてもメール通知しません。

更新されたときもメール通知したい場合は、このパラメーターを「false」にしてください。

間隔設定(秒)

音やメールで通知してから次の通知までの間隔を指定します。

注意:通貨ペアの価格が変わるたびに山(谷)が更新されていないか確認するので、間隔が短すぎると音声ファイルが短時間に何度も再生されることになります。
パラメーターの「山(谷)作成時のみメール送信する(=true)」が「false」の場合はメールもそれだけ送信されます。

通知遅延時間(秒)

山(谷)が作成または更新されてから音やメールで通知するまでの時間を指定します。

上昇(下降)傾向にある場合、短時間(数分~十数分)で山(高値)や谷(安値)が更新され続ける場合があります。
その場合、例えばパラメーター「間隔設定(秒)」に「60(秒)」を設定している場合、短時間の間に何回も通知を受けます。(60秒おきに音が鳴るなど)

このパラメーターを設定すると「価格の上昇(下降)がある程度落ち着いてから通知」させることができます。
詳細は後述の遅延機能についてを参照してください。

山(高値)がこの価格以上の場合に通知する

山(高値)が作成または更新されてもある価格に満たないときは通知したくない場合にその価格を指定します。

例えば、現在のドル円が109円で、110円以上になったら通知してほしい場合は「110.0」を指定します。
この場合、110円未満で山(高値)が作成または更新されても通知しないので余計な通知を防げます。
また「999.0」などの大きな値を指定すると山(高値)での通知は行われません。(高値非通知モード)

谷(安値)がこの価格以下の場合に通知する

谷(安値)が作成または更新されてもある価格を超えるときは通知したくない場合にその価格を指定します。

例えば、現在のドル円が110円で、109円以下になったら通知してほしい場合は「109.0」を指定します。
この場合、109円超で谷(安値)が作成または更新されても通知しないので余計な通知を防げます。
また「0.0」などの小さい値を指定すると谷(安値)での通知は行われません。(安値非通知モード)

山(谷)を作成時に通知する(=true)

通知遅延時間を設定している場合でも山(谷)が作成されたタイミングで通知したい場合に指定します。

通知遅延もいいけど、作成時にも通知がないと心許ない場合に指定すると良いでしょう。

遅延通知後の更新時に通知する(=true)

山(谷)の更新を何度も通知したい場合に指定します。

山(谷)が作成されてから通知遅延時間が経過すると通知しますが、この設定が「false」の場合は1回しか通知しません。
「true」の場合は通知後、通知遅延時間が経過する再度通知するようになります。

各音声ファイル名

MT4の「Sounds」フォルダに存在するWAVファイル名を指定します。
ファイル名を指定しない、またはファイルが存在しない場合は音による通知は行いません。

補足:「Sounds」フォルダはMT4をインストールしたフォルダ内にあります。
自作のWAVファイルなど、MT4で予め用意されたWAVファイル以外を使用したい場合は、そのWAVファイルを「Sounds」フォルダに格納してから指定してください。


ディスプレイのスリープ解除について

ディスプレイのスリープ解除は、Windowsの「KERNEL32.dll」にある「SetThreadExecutionState」というAPIを呼び出す方法を採用しているので、Windows以外で使用している方や「DLLの使用を許可する」にチェックを入れたくない方を考慮してスリープ解除に関する処理はコメントアウト無効にしています。
よって、スリープ解除の機能を使用したい場合はインジケーターの修正が必要です。

修正方法は簡単で、インジケーター内の「この行を削除してディスプレイスリープ解除機能を有効にする」というコメント行を探して削除するだけです。
コメントの開始行(/*で始まる行)と終了行(*/で終わる行)が計8行あるのでそれを削除してください。

Ver 3.00から修正方法が変更されました。
1行目の
//#define DispResume
の先頭の「//」を削除して
#define DispResume
にするだけで良いです。
修正したらコンパイルしてエラーが発生していないか確認してください。

インジケーターをチャートに挿入する際には「DLLの使用を許可する」にチェックを入れることを忘れないでください。

補足:ディスプレイのスリープとは、例えば以下のようなWindowsの設定画面で「次の時間が経過後、ディスプレイの電源を切る」で指定した時間パソコンを操作しなかったことで自動的にディスプレイの電源が切れたときのことです。

Windowsのスリープを設定する画面

「普段は他の作業をしているのでチャートを見てないが、通知があれば取引するか判断するためにチャートを見る」といった場合、ディスプレイをつけっぱなしだと電気代がもったいないしディスプレイの寿命も縮む、だからといって通知があるたびに電源を入れるとかスリープ解除のためにキーボードやマウスを操作するのは面倒、という方には便利な機能だと思います。

注意:上記画面の「次の時間が経過後、PCをスリープ状態にする」でパソコンがスリープした場合のスリープ解除(つまりパソコンの電源を入れること)はできませんのでご注意ください。
(パソコンがスリープ状態だとMT4も止まっているのでどうしようもありません)

追記:ディスプレイのスリープ解除は別のインジケーターでも使用できます。
「この行を削除してディスプレイスリープ解除機能を有効にする」で囲まれた部分だけを別のインジケーターに組み込むだけです。
「SetThreadExecutionState(2);」の行はスリープ解除したい場所(例えばインジケーター内で音を鳴らしたり、チャートにマークを付ける処理があるところなど)に、それ以外は当インジケーターと同様な場所に記述してください。


MT4 DDE Serverと組み合わせについて

当サイトで公開してる「MT4 DDE Server」と組み合わせることによってDDE送信が可能になります。

ExcelへのDDE送信では使い道が無いかもしれませんが、アプリケーションを開発できる方であればアイデア次第でなにか良いものが作れるかもしれません。


遅延機能について

格言に「頭と尻尾はくれてやれ」というものがあります。

ZigZagは最終的には頭(山)と尻尾(谷)を表示してくれますが、最新の(更新中の)山や谷はいつ頭や尻尾になるかわかりません。
それなら「最高値(頭)と最安値(尻尾)は逃してもいいから、しばらくZigZagの山や谷が更新されなくなってから通知してもらうほうが良いかも」と考え、パラメーター「通知遅延時間(秒)」を追加しました。

通知遅延時間(秒)に値(秒数)を指定することで音やメールでの通知タイミングを遅らせることができます。
通知を遅らせている間に山や谷が更新された場合はそこから遅延時間を数え直します。

例えば、価格が継続的に下落しているとき、間隔設定(秒)に「60」、通知遅延時間(秒)に「0」を指定した場合は最短60秒ごとに通知されますが、通知遅延時間(秒)を「300」にすると300秒(5分間)は通知されません。
また、その間に価格が下落した場合はそこから数え直すので、仮に1時間かけて継続的にゆっくりと下落している(300秒に1回はZigZagの谷を更新している)場合は約1時間後に1回目の通知を受けることになります。

そうすれば、「谷ができた瞬間に通知を受けて手を出せば『高値で買う』可能性があるが、しばらくしてから通知を受ければ最安値より少し高く買うことになるが『高値で買う』ことは回避できる」かもしれません。

もちろん、欠点もあります。
例えば、ある指標を受けて瞬間的に急落、2~3分後には買い戻され元の価格付近に戻るような場合、通知を受けた時(5分後とか)にはもう手の出しようがありません。
他のインジケーター同様、万能ではないということです。

最後に通知遅延時間(秒)に「0」と「300」を設定した場合の動作例を以下に記載します。

間隔設定(秒)に「60」、通知遅延時間(秒)に「0」を指定した場合の動作例
価格更新日時 価格 説明
2018.03.01
10:00:00
100.123 この時点では山も谷も作成されていないものとする。
2018.03.01
10:00:20
100.200 ここで山(高値)が作成されたとする。
山(高値)が作成されたので通知を行う。
(通知遅延時間(秒)が「0(秒)」なので遅延無しで即通知を行う)
2018.03.01
10:00:50
100.250 ここで山(高値)が更新されたとする。
ただし、間隔設定(秒)には「60(秒)」が指定されており、前回の通知から30秒しか経過していないため通知は行わない。
2018.03.01
10:01:20
100.260 ここで山(高値)が更新されたとする。
前回の通知から間隔設定(秒)の「60(秒)」が経過しているので山(高値)が更新されると同時に通知を行う。
2018.03.01
10:02:20
例1
100.250
前回の通知から間隔設定(秒)の「60(秒)」は経過したが、山(高値)が更新された「10:01:20」の価格より安いため通知は行わない。
例2
100.270
前回の通知から間隔設定(秒)の「60(秒)」が経過し、山(高値)が更新された「10:01:20」の価格より高いので山(高値)が更新されると同時に通知を行う。

このように、間隔設定(秒)を経過していればZigZagの山が作成または更新されるたびに即通知が行われる。


間隔設定(秒)に「60」、通知遅延時間(秒)に「300」を指定した場合の動作例
価格更新日時 価格 説明
2018.03.01
10:00:00
100.123 この時点では山も谷も作成されていないものとする。
2018.03.01
10:00:20
100.200 ここで山(高値)が作成されたとする。
山(高値)が作成されたが通知遅延時間(秒)が「300(秒)」なのでここでは通知は行わない。指定の300秒からカウントダウンを始める。(通知予定は10:05:20)
2018.03.01
10:00:50
100.250 ここで山(高値)が更新されたとする。
ただし、通知遅延時間(秒)の「300(秒)」を経過していないのでまだ通知が行われておらず、その場合は再度、カウントダウンをやり直す。(通知予定は10:05:50)
2018.03.01
10:01:20
100.260 ここで山(高値)が更新されたとする。
再度、カウントダウンをやり直す。(通知予定は10:06:20)
2018.03.01
10:06:20
100.250 この時間(通知予定時間)まで山(高値)が更新されなかったので、このタイミングで通知を行う。結果的に通知遅延時間(秒)の「300(秒)」より遅い360秒後になった。
2018.03.01
10:06:50
100.270 ここで山(高値)が更新されたとする。
ただし、間隔設定(秒)には「60(秒)」が指定されており、前回の通知から30秒しか経過していないため何もしない。
2018.03.01
10:07:20
例1
100.260
前回の通知から間隔設定(秒)の「60(秒)」は経過したが、山(高値)が更新された「10:06:50」の価格より安いため何もしない。
例2
100.280
前回の通知から間隔設定(秒)の「60(秒)」が経過し、山(高値)が更新された「10:06:50」の価格より高いので山(高値)が更新されると同時に指定の300秒からカウントダウンを始める。(通知予定は10:12:20)

このように、通知するまでの間にZigZagの山が更新されると通知予定を後ろにずらして通知を遅らせている。


おまけの使い方

簡単ですが使い方の説明です。

1つのインジケーターで最大5つのZigZagを表示する「320_ZigZagFive」
1つのチャートに複数のZigZagを挿入している人向けのインジケーターです。

1つ目のZigZagは通常のZigZagと同じで、挿入したチャートとパラメーター「最小期間1(Depth)~反転判断期間1(Backstep)」に従って表示します。
2つ目以降は挿入したチャートの時間足より大きい時間足のZigZagを表示します。
時間足の指定はパラメーター「〇〇足のZigZagを追加」から選択してください。(挿入したチャートの時間足以下は選択できません)
パラメーター「最小期間2」~「反転判断期間5」は「0」の場合は「最小期間1」~「反転判断期間1」の値から自動算出されます。「0」以外の場合はその値に従って表示します。


2つのZigZagを使用して順張りや逆張りのタイミングを通知する「320_ZigZagNoticeDouble」
「1つ目のZigZagが下降しているときに2つ目のZigZagが上昇したら逆張り」みたいなことができないかな?と思って作ってみました。
これが使い物になるか否かは使う人次第ということで…笑

パラメーターは見れば何となくわかると思いますが、いくつか。
・通知不要のものは「音声ファイル名(番号)」を空文字にしてください。(例:順張りの通知は不要など)
・通知回数を1回にしたい場合は「最短間隔(秒)」にマイナス値(-1など)を指定してください。


あくまでも「おまけ」なので変なところがあるかもしれません。(ZigZagを使って遊んでみたレベルなので…笑)
掲示板(MT4専用)でご指摘いただければ対応するかもしれません。(しないかもしれません…笑)


更新履歴

リリース日 バージョン 内容
2018/03/26 1.00 初リリース
2018/11/04 2.00 1.流用元を現時点のMT4に付属するZigZag.mq4に変更しました。
2.通知遅延の場合でも作成時に通知する機能を追加しました。
3.遅延通知後の最初の更新時に通知する機能を追加しました。
4.メール通知の価格が正しくなかったので修正しました。
2021/12/22 3.00 1.MT5向けに「320_ZigZagNotice.mq5」を追加しました。
2.おまけで
・1つのインジケーターで最大5つのZigZagを表示する「320_ZigZagFive」
・2つのZigZagを使用して順張りや逆張りのタイミングを通知する「320_ZigZagNoticeDouble」
を追加しました。
あと、Ver 3.00から全ソースのバージョンを統一するようにしました。