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()との組み合わせを、
あわせて検討するとよいでしょう。
コメント