EAが決済や含み損の急変を知らせてくれても、画面を見ていなければ気づけません。

ポップアップのAlert()は便利ですが、

別のウィンドウで作業しているときは見逃しがちです。

この記事では、音でEAの状態を知らせるPlaySound()の書式と、

ストラテジーテスターの中では鳴らないという注意点、

Alert()との使い分けについて解説します。

この記事で分かること
・PlaySound()の書式とWAVファイルの配置場所
・ストラテジーテスターでは音が鳴らない注意点
・連続再生を防ぐ設計の考え方
・Alert()/Comment()/SendMail()との使い分け

なぜPlaySound()が必要なのか

まず、音による通知が必要になる場面を整理します。

Alert()のポップアップだけでは気づけない場面

複数のチャートを同時に動かしていると、

Alert()のポップアップは他のウィンドウの裏に隠れます。

音が鳴れば、画面を見ていなくても気づけます。

既刊Sleep/MessageBox記事との接続

既刊記事では、Sleep/MessageBoxが、

カスタムインジケーターで使用不可という制限を扱いました。

PlaySound()はこの2関数とは制限範囲が異なります。

この記事で扱う範囲

この記事では、PlaySound()の基本的な使い方と、

ストラテジーテスター内での挙動を中心に扱います。

PlaySound()の基本的な使い方

関数の書式と、音声ファイルの準備方法を確認します。

関数の書式と戻り値

bool PlaySound(string filename);

引数は再生するファイル名、

戻り値はファイルが見つかればtrue、見つからなければfalseを返します。

音声ファイルの配置場所

ファイルの配置ルール
・端末フォルダのSoundsフォルダに配置する
・サブフォルダに置いてもパス指定で呼べる・対応フォーマットはWAVファイルのみ

NULLを渡すと再生停止になる仕様

PlaySound(NULL)を呼び出すと、

再生中の音を停止させる効果があります。

ファイル名ではなくNULLという特殊な使い方として覚えておくと便利です。

実際に動くコード全体(含み損アラートEA)

含み損が一定額を超えたら音で知らせるEAです。

設計のポイント(連続再生を防ぐ)

条件を満たすたびに毎Tickで再生すると、

同じ音が連続で鳴り続けてしまいます。

一度鳴らしたら一定時間は再び鳴らさない工夫を入れます。

コード全文

//+------------------------------------------------------------------+
//|                                        FloatingLossSoundAlertEA.mq4 |
//|                     Copyright 2026, FX-EA System Project Creator |
//|                        https://creator.fx-ea-system-project.com/ |
//+------------------------------------------------------------------+
#property copyright "Copyright 2026, FX-EA System Project Creator"
#property link      "https://creator.fx-ea-system-project.com/"
#property version   "1.00"
#property strict

input double LossAlertAmount = 3000;    // 含み損の警告ライン(円換算等)
input int    AlertIntervalMs = 60000;   // 再アラートまでの最小間隔(ミリ秒)

uint lastAlertTick = 0;

double GetFloatingLoss()
  {
   double total = 0;
   for(int i = 0; i < OrdersTotal(); i++)
     {
      if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
        {
         total += OrderProfit() + OrderSwap() + OrderCommission();
        }
     }
   return(total);
  }

void OnTick()
  {
   double floatingLoss = GetFloatingLoss();

   if(floatingLoss < -LossAlertAmount)
     {
      uint nowTick = GetTickCount();
      if(nowTick - lastAlertTick >= (uint)AlertIntervalMs)
        {
         PlaySound("alert2.wav");
         Comment("含み損が警告ラインを超えています: ", DoubleToString(floatingLoss, 2));
         lastAlertTick = nowTick;
        }
     }
   else
     {
      Comment("");
     }
  }

GetTickCount()で再生間隔を制限する理由

GetTickCount()は端末起動後の経過ミリ秒を返します。

前回アラートからの経過時間を測ることで、

一定時間は再アラートを出さない設計にできます。

ストラテジーテスターで無効になる注意点

バックテストでの挙動を確認します。

公式リファレンスの記載

公式リファレンスの記載
・ストラテジーテスターでは動作しないと明記
・ストラテジーテスター内では音が鳴らない
・テスト自体は正常に進行する(エラーにはならない)

バックテストでは音が鳴らないことに気づきにくい

バックテストでPlaySound()の行が何事もなく実行されてしまうため、

実運用で初めて音が鳴ることに気づくケースがあります。

デモ・実運用チャートで別途確認する

音声アラートが正しく機能するかどうかは、

デモ口座のチャートに実際に適用して、

目と耳の両方で確認する必要があります。

Alert()・Comment()・SendMail()との使い分け

既刊記事で扱った通知手段と役割を整理します。

視覚か音か通知先の違い

関数 通知の形 画面を見ていない時
Alert() ポップアップ 気づきにくい
Comment() チャート上の文字 気づきにくい
PlaySound() 音 気づきやすい
SendMail() メール 別の端末でも届く

組み合わせて使う設計

PlaySound()は、画面の外にいても気づける点が強みですが、

詳しい内容は音だけでは伝わりません。

Comment()やAlert()と組み合わせ、

音で気づかせて文字で詳細を確認する設計が実用的です。

既刊記事への接続

外出先でも気づきたい場合は、

既刊のSendMail()記事やLINE通知EAの記事が参考になります。

よくある注意点

実装時につまずきやすい点をまとめます。

ファイルパスのタイプミスに気づきにくい

ファイル名を間違えても、戻り値のfalseを見ていなければ、

単に無音のまま処理が進んでしまいます。

カスタムインジケーターでの動作は未保証

公式リファレンスには、カスタムインジケーターでの制限が明記されていません。

既刊のSleep/MessageBoxのような明確な使用不可の記載が無い分、

インジケーターで使う場合は実機での動作確認を優先してください。

連続再生でユーザー体験を損なわない

条件を満たすたびに無制限で再生すると、

同じ音が連続で鳴り、不快な体験になりかねません。

3節のようにGetTickCount()で間隔を制限するのが安全です。

よくある質問

PlaySound()について、よくある疑問に回答します。

MP3ファイルは再生できますか?

公式リファレンスの記載では対応フォーマットはWAVのみです。

MP3を再生したい場合は、

事前にWAV形式へ変換しておく必要があります。

音量の大きさはコードで調整できますか?

PlaySound()自体に音量を指定する引数はありません。

音量はOSやMT4端末側の設定、

または音声ファイル自体の録音レベルで調整します。

バックテストで音が鳴らないのは不具合ですか?

不具合ではなく、公式リファレンスに明記された仕様です。

音声アラートの動作確認は、

デモ・実運用のチャートで行う必要があります。

【MQL4】PlaySound()で音声アラートを出す方法について解説してみた(ストラテジーテスターで無効になる注意点とAlert()との使い分け):まとめ

PlaySound()は、画面を見ていなくても気づける、数少ない通知手段です。

ただしストラテジーテスターの中では鳴らないため、

バックテストが正常に終わっても、

実運用で初めて挙動を確認することになる点に注意が必要です。

連続再生を防ぐ設計と、

Alert()・Comment()・SendMail()との組み合わせを、

あわせて検討するとよいでしょう。

関連記事