PlaySound関数の働き・役割
PlaySound関数は、指定したサウンドファイルを再生するための関数です。この関数は、取引結果や重要なイベントに対して音声でフィードバックを行う際に使用されます。
サウンドファイルとして再生できるのはWAV形式に限られており、再生するファイルはMQL5のターミナルディレクトリ内の”Sounds”フォルダ、もしくはそのサブフォルダに配置する必要があります。
PlaySound関数をNULLパラメータで呼び出すと、現在再生中のサウンドが停止します。
PlaySound関数の引数について
bool PlaySound(
string filename // ファイル名
);
PlaySound関数は1つの引数を取ります。
filename
- サウンドファイルのパスを指定します。ファイルは”Sounds”フォルダ内に配置する必要があります。
- NULLを指定すると、再生が停止します。
PlaySound関数の戻り値について
PlaySound関数は、サウンドファイルが見つかり再生できた場合にtrueを返します。
一方、ファイルが存在しないか再生に失敗した場合はfalseを返します。
PlaySound関数を使う際の注意点
PlaySound関数で再生できるのはWAV形式のファイルのみです。ファイルは、MQL5ターミナルの”Sounds”フォルダか、そのサブフォルダに置かれている必要があります。
また、PlaySound関数はストラテジーテスターでは機能しないため、バックテストやシミュレーションでは使用できません。
NULLを引数に指定すると、再生中のサウンドを停止します。
PlaySound関数を使ったサンプルコード
#include <Trade\Trade.mqh> // 取引関連の機能を使用するためのヘッダーファイルをインクルード
#define MAGIC (123) // マジックナンバーを定義(この数値はEAの識別に使われます)
//--- 入力パラメータ
input string InpFileNameOK = "ok.wav"; // 注文成功時に再生する音声ファイルの名前
input string InpFileNameErr = "timeout.wav"; // 注文失敗時に再生する音声ファイルの名前
input ENUM_ORDER_TYPE InpOrderType = ORDER_TYPE_BUY_LIMIT; // 注文の種類(ここでは買いの指値注文)
input double InpLots = 0.1; // 注文するロット数
//--- グローバル変数
CTrade ExtTrade; // CTradeクラスのインスタンスを作成、これにより取引関連のメソッドを利用可能
//+------------------------------------------------------------------+
//| スクリプトの開始関数 |
//+------------------------------------------------------------------+
void OnStart()
{
//--- マジックナンバーと取引タイプの設定
ExtTrade.SetExpertMagicNumber(MAGIC); // 設定したマジックナンバーをEAに適用
ExtTrade.SetTypeFillingBySymbol(Symbol()); // 銘柄に応じた注文埋め方式を設定
//--- 注文を出し、サウンドを再生する関数を呼び出し
OrderSendWithAudio();
}
//+------------------------------------------------------------------+
//| 注文を発注し、結果に応じて音声を再生する関数 |
//+------------------------------------------------------------------+
void OrderSendWithAudio(void)
{
bool res = true; // 成否を確認するための変数
MqlTick tick = {}; // MqlTick構造体を初期化(現在の価格情報を格納)
ResetLastError(); // エラーコードをリセット
if(!SymbolInfoTick(Symbol(), tick)) // 現在の価格情報を取得、失敗した場合
{
Print("SymbolInfoTick() failed. Error code: ", GetLastError()); // エラー内容をエキスパートログに表示
PlaySound(InpFileNameErr); // エラー時のサウンドを再生
return;
}
//--- 入力パラメータに従って注文を発注
switch(InpOrderType)
{
case ORDER_TYPE_BUY : // 成行買い注文の場合
res = ExtTrade.Buy(InpLots); // 成行買い注文を実行
break;
case ORDER_TYPE_BUY_LIMIT : // 指値買い注文の場合
res = ExtTrade.BuyLimit(InpLots, NormalizeDouble(tick.ask - 100 * Point(), Digits())); // 現在の価格から100ポイント下に指値を設定して発注
break;
case ORDER_TYPE_BUY_STOP : // 逆指値買い注文の場合
res = ExtTrade.BuyStop(InpLots, NormalizeDouble(tick.ask + 100 * Point(), Digits())); // 現在の価格から100ポイント上に逆指値を設定して発注
break;
case ORDER_TYPE_SELL : // 成行売り注文の場合
res = ExtTrade.Sell(InpLots); // 成行売り注文を実行
break;
case ORDER_TYPE_SELL_LIMIT : // 指値売り注文の場合
res = ExtTrade.SellLimit(InpLots, NormalizeDouble(tick.bid + 100 * Point(), Digits())); // 現在の価格から100ポイント上に指値を設定して発注
break;
case ORDER_TYPE_SELL_STOP : // 逆指値売り注文の場合
res = ExtTrade.SellStop(InpLots, NormalizeDouble(tick.bid - 100 * Point(), Digits())); // 現在の価格から100ポイント下に逆指値を設定して発注
break;
default :
res = false; // それ以外の注文タイプは無効
}
//--- 注文の発注結果に応じてログを出力
if(!res) // 注文に失敗した場合
Print("Error ", GetLastError()); // エラーメッセージをエキスパートログに出力
Print(ExtTrade.ResultRetcodeDescription()); // サーバーからの応答コードの説明を出力
//--- 注文が成功したかどうかでサウンドを再生
if(ExtTrade.ResultRetcode() == TRADE_RETCODE_DONE) // 成功時の応答コードを確認
PlaySound(InpFileNameOK); // 成功音を再生
else
PlaySound(InpFileNameErr); // 失敗時の音を再生
}
```
### 解説:
- **`ExtTrade.SetExpertMagicNumber(MAGIC)`**
マジックナンバーを設定します。マジックナンバーはエキスパートアドバイザー(EA)が発注した注文を識別するために使われます。
- **`SymbolInfoTick(Symbol(), tick)`**
現在の価格(ティック)情報を取得します。取得に失敗した場合は、エラーメッセージを表示してエラー音を再生します。
- **`NormalizeDouble()`**
値を指定した小数点桁数に丸める関数です。価格を適切に丸めるために使われています。
- **`PlaySound()`**
成功または失敗に応じてサウンドを再生します。
サンプルコード解説1:グローバル領域部分
#include <Trade\Trade.mqh> // 取引関連の機能を使用するためのヘッダーファイルをインクルード
#define MAGIC (123) // マジックナンバーを定義(この数値はEAの識別に使われます)
//--- 入力パラメータ
input string InpFileNameOK = "ok.wav"; // 注文成功時に再生する音声ファイルの名前
input string InpFileNameErr = "timeout.wav"; // 注文失敗時に再生する音声ファイルの名前
input ENUM_ORDER_TYPE InpOrderType = ORDER_TYPE_BUY_LIMIT; // 注文の種類(ここでは買いの指値注文)
input double InpLots = 0.1; // 注文するロット数
//--- グローバル変数
CTrade ExtTrade; // CTradeクラスのインスタンスを作成、これにより取引関連のメソッドを利用可能
このセクションでは、グローバル領域に宣言されたコードについて解説します。
Trade.mqhのインクルード
Trade.mqhは、MQL5で取引操作を簡便に行うためのヘッダーファイルです。このファイルにはCTradeクラスが含まれており、このクラスを使うことで売買注文やロットサイズの設定など、取引に関連する操作を簡単に実行できます。
MAGICの定義
MAGICは、エキスパートアドバイザー(EA)によって発注された注文を識別するためのマジックナンバーを設定する定数です。この数値を設定することで、他のEAや手動取引との混同を避けることができます。例えば、EAによる注文と手動で発注された注文を区別するために使用されます。
成功時の音声ファイルの入力パラメータ
InpFileNameOKは、注文が成功した際に再生する音声ファイルのパスを指定する入力パラメータです。サウンドファイルは、MQL5ターミナルのSoundsフォルダに配置されたWAV形式のファイルでなければなりません。
失敗時の音声ファイルの入力パラメータ
InpFileNameErrは、注文が失敗した際に再生される音声ファイルのパスを指定する入力パラメータです。InpFileNameOKと同様に、Soundsフォルダに配置されたWAV形式のファイルを指定します。
注文タイプの入力パラメータ
InpOrderTypeは、注文のタイプを指定する入力パラメータです。ENUM_ORDER_TYPEは、MQL5で定義されている注文タイプを表す列挙型です。ここでは、ORDER_TYPE_BUY_LIMITが初期値として指定されており、これは買いの指値注文(指定価格以下で購入する注文)を意味します。その他、成行注文や逆指値注文なども指定可能です。
ロット数の入力パラメータ
InpLotsは、発注するロット数を指定する入力パラメータです。この値は、注文を発注する際の取引量を表し、0.1ロット(1,000通貨単位など)を取引することを意味します。このパラメータを変更することで、注文するロット数を動的に変更することが可能です。
CTradeクラスのインスタンス作成
CTradeクラスのインスタンスであるExtTradeを宣言しています。CTradeクラスは、売買注文やポジションの管理を簡単に行うためのクラスです。このインスタンスを通じて、売買注文やロット数の指定、結果の取得などを行うことができます。
サンプルコード解説2:OnStart関数部分
//+------------------------------------------------------------------+
//| スクリプトの開始関数 |
//+------------------------------------------------------------------+
void OnStart()
{
//--- マジックナンバーと取引タイプの設定
ExtTrade.SetExpertMagicNumber(MAGIC); // 設定したマジックナンバーをEAに適用
ExtTrade.SetTypeFillingBySymbol(Symbol()); // 銘柄に応じた注文埋め方式を設定
//--- 注文を出し、サウンドを再生する関数を呼び出し
OrderSendWithAudio();
}
このセクションでは、スクリプトが開始された際に実行されるOnStart関数について解説します。
OnStart関数とは
OnStart関数は、MQL5のスクリプトが実行されたときに自動的に呼び出される関数です。ここで定義された処理が、スクリプトの開始時に実行されます。
マジックナンバーの設定
マジックナンバーの設定では、エキスパートアドバイザー(EA)に使用するマジックナンバーを設定しています。このマジックナンバーは、EAが発注する注文を識別するための重要な要素です。複数のEAが同時に稼働している場合や手動での注文との区別をするために使われます。
注文のフィルポリシーの設定
注文のフィルポリシーの設定では、現在の銘柄に応じた注文の埋め方式(フィルポリシー)を設定しています。銘柄によって、注文が市場でどのように処理されるかが異なる場合があり、このメソッドによって適切なフィルポリシーが自動的に適用されます。
注文とサウンド再生を行う関数の呼び出し
注文とサウンド再生を行う関数の呼び出しは、実際に注文を発注し、その結果に応じてサウンドを再生するカスタム関数です。この関数が呼び出されることで、取引が行われ、成功した場合は成功音、失敗した場合はエラー音が再生されます。
OnStart関数の中で、この関数が実行されるため、スクリプトの開始と同時に取引操作とサウンド再生が行われる流れになります。
サンプルコード解説3:OrderSendWithAudio関数部分その1
//+------------------------------------------------------------------+
//| 注文を発注し、結果に応じて音声を再生する関数 |
//+------------------------------------------------------------------+
void OrderSendWithAudio(void)
{
bool res = true; // 成否を確認するための変数
MqlTick tick = {}; // MqlTick構造体を初期化(現在の価格情報を格納)
ResetLastError(); // エラーコードをリセット
if(!SymbolInfoTick(Symbol(), tick)) // 現在の価格情報を取得、失敗した場合
{
Print("SymbolInfoTick() failed. Error code: ", GetLastError()); // エラー内容をエキスパートログに表示
PlaySound(InpFileNameErr); // エラー時のサウンドを再生
return;
}
このセクションでは、注文を発注し、結果に応じてサウンドを再生するOrderSendWithAudio関数の最初の部分を解説します。
関数の目的
OrderSendWithAudio関数は、注文を発注し、その結果に応じてサウンドを再生するための関数です。注文が成功した場合は成功音、失敗した場合はエラー音を再生する機能を持っています。
成否確認のための変数
関数内で最初に宣言されているresという変数は、注文が成功したかどうかを確認するためのbool型の変数です。初期値としてtrueが設定されていますが、注文の結果によってこの値が変更されます。
現在の価格情報を格納するための構造体
MqlTick構造体は、ティック情報(現在の価格情報)を格納するために使用されます。tickという変数を初期化して、この構造体に現在の価格情報を取得する準備をしています。ティック情報は、注文を正確に発注するために必要なデータを提供します。
エラーコードのリセット
関数が実行される際に、まずResetLastError関数を呼び出してエラーコードをリセットしています。これは、関数が正常に動作しているかを確認するために必要で、エラーが発生しても正確なエラーメッセージを取得できるようにするためです。
現在の価格情報の取得
SymbolInfoTick関数は、指定された銘柄の現在のティック情報を取得します。この関数が成功すれば、最新の価格情報がtick変数に格納されます。しかし、何らかの理由でティック情報が取得できなかった場合には、エラーメッセージをエキスパートログに出力し、エラー音を再生します。この時点で関数の処理は終了します。
この部分では、価格情報が取得できるかどうかを確認し、エラーが発生した場合にはすぐに処理を停止して、適切なサウンドフィードバックを提供しています。
サンプルコード解説4:OrderSendWithAudio関数部分その2
//--- 入力パラメータに従って注文を発注
switch(InpOrderType)
{
case ORDER_TYPE_BUY : // 成行買い注文の場合
res = ExtTrade.Buy(InpLots); // 成行買い注文を実行
break;
case ORDER_TYPE_BUY_LIMIT : // 指値買い注文の場合
res = ExtTrade.BuyLimit(InpLots, NormalizeDouble(tick.ask - 100 * Point(), Digits())); // 現在の価格から100ポイント下に指値を設定して発注
break;
case ORDER_TYPE_BUY_STOP : // 逆指値買い注文の場合
res = ExtTrade.BuyStop(InpLots, NormalizeDouble(tick.ask + 100 * Point(), Digits())); // 現在の価格から100ポイント上に逆指値を設定して発注
break;
case ORDER_TYPE_SELL : // 成行売り注文の場合
res = ExtTrade.Sell(InpLots); // 成行売り注文を実行
break;
case ORDER_TYPE_SELL_LIMIT : // 指値売り注文の場合
res = ExtTrade.SellLimit(InpLots, NormalizeDouble(tick.bid + 100 * Point(), Digits())); // 現在の価格から100ポイント上に指値を設定して発注
break;
case ORDER_TYPE_SELL_STOP : // 逆指値売り注文の場合
res = ExtTrade.SellStop(InpLots, NormalizeDouble(tick.bid - 100 * Point(), Digits())); // 現在の価格から100ポイント下に逆指値を設定して発注
break;
default :
res = false; // それ以外の注文タイプは無効
}
このセクションでは、OrderSendWithAudio関数の注文発注ロジックについて解説します。注文の種類に応じて、成行注文や指値注文、逆指値注文を発注するためのコードです。
switch文の目的
switch文は、指定された条件(この場合は注文タイプ)に応じて異なる処理を行う制御構文です。ここでは、InpOrderTypeという入力パラメータに基づき、どの種類の注文を発注するかを決定しています。注文タイプには、成行注文や指値注文、逆指値注文が含まれています。
注文の種類に応じた処理
- 成行買い注文 ORDER_TYPE_BUYが指定されている場合、成行買い注文を発注します。ExtTrade.Buy(InpLots)メソッドを使い、指定されたロット数で成行買いを実行します。成行注文は、現在の市場価格で即座に取引を成立させる注文です。
- 指値買い注文 ORDER_TYPE_BUY_LIMITが指定されている場合、指値買い注文を発注します。この注文は、現在の価格より低い価格で買いたいときに使用します。NormalizeDouble(tick.ask – 100 * Point(), Digits())は、現在の価格から100ポイント下の値を計算し、その価格で注文を発注します。NormalizeDouble関数は、指定した桁数に値を丸める関数で、ここでは価格を適切に処理するために使われています。
- 逆指値買い注文 ORDER_TYPE_BUY_STOPが指定されている場合、逆指値買い注文を発注します。これは、現在の価格より高い価格で買いたいときに使用します。NormalizeDouble(tick.ask + 100 * Point(), Digits())を使い、現在の価格より100ポイント上に逆指値を設定して発注します。
- 成行売り注文 ORDER_TYPE_SELLが指定されている場合、成行売り注文を発注します。ExtTrade.Sell(InpLots)メソッドを使い、指定されたロット数で成行売りを実行します。成行売り注文は、現在の市場価格で即座に売りを成立させる注文です。
- 指値売り注文 ORDER_TYPE_SELL_LIMITが指定されている場合、指値売り注文を発注します。これは、現在の価格より高い価格で売りたいときに使用します。NormalizeDouble(tick.bid + 100 * Point(), Digits())を使い、現在の価格より100ポイント上に指値を設定して発注します。
- 逆指値売り注文 ORDER_TYPE_SELL_STOPが指定されている場合、逆指値売り注文を発注します。これは、現在の価格より低い価格で売りたいときに使用します。NormalizeDouble(tick.bid – 100 * Point(), Digits())を使い、現在の価格より100ポイント下に逆指値を設定して発注します。
- 無効な注文タイプ defaultケースでは、InpOrderTypeに有効な注文タイプが指定されていない場合の処理です。無効な注文タイプが指定された場合、res変数にfalseを設定し、注文が発注されなかったことを示します。
関連するメソッドと関数
- ExtTrade.Buy(InpLots) / ExtTrade.Sell(InpLots)
これは、成行買い注文および成行売り注文を発注するためのCTradeクラスのメソッドです。引数には発注するロット数を指定します。 - ExtTrade.BuyLimit(InpLots, Price) / ExtTrade.SellLimit(InpLots, Price)
指値買い・指値売り注文を発注するためのメソッドです。第1引数にロット数、第2引数に発注する価格を指定します。 - ExtTrade.BuyStop(InpLots, Price) / ExtTrade.SellStop(InpLots, Price)
逆指値買い・逆指値売り注文を発注するためのメソッドです。第1引数にロット数、第2引数に発注する価格を指定します。 - NormalizeDouble(Value, Digits)
値を指定した小数点以下の桁数に丸める関数です。Valueには丸める対象の値を、Digitsには丸める桁数を指定します。NormalizeDoubleは、価格の小数点以下の桁数を正確に処理するために使用されます。 - Point()
Point関数は銘柄の最小価格単位(ポイント)を返す関数です。これを使って価格の計算を行います。 - tick.ask / tick.bid
MqlTick構造体のメンバで、それぞれ現在の買い(ask)と売り(bid)の価格を示します。これらの値を基に注文の価格を設定します。
この部分では、入力された注文タイプに応じて適切な注文を発注し、それぞれのケースで正確な価格計算を行っています。
サンプルコード解説5:OrderSendWithAudio関数部分その3
//--- 注文の発注結果に応じてログを出力
if(!res) // 注文に失敗した場合
Print("Error ", GetLastError()); // エラーメッセージをエキスパートログに出力
Print(ExtTrade.ResultRetcodeDescription()); // サーバーからの応答コードの説明を出力
//--- 注文が成功したかどうかでサウンドを再生
if(ExtTrade.ResultRetcode() == TRADE_RETCODE_DONE) // 成功時の応答コードを確認
PlaySound(InpFileNameOK); // 成功音を再生
else
PlaySound(InpFileNameErr); // 失敗時の音を再生
}
このセクションでは、OrderSendWithAudio関数の最後の部分について解説します。ここでは、注文の発注結果に応じてログを出力し、結果に基づいてサウンドを再生する処理が行われています。
注文発注結果に応じたログの出力
まず、注文の成否を確認します。resという変数に注文の結果が格納されています。注文が失敗した場合、if(!res)でエラーが検知されます。このとき、Print関数を使用してエラーコードをエキスパートログに出力します。GetLastError関数は、直前に発生したエラーの詳細なコードを返すため、エラーの原因を確認するのに役立ちます。
その後、注文に関するサーバーからの応答コードの説明を、ExtTrade.ResultRetcodeDescriptionを使って出力します。このメソッドは、注文が成功したか失敗したかに関する詳細な説明を返します。これにより、発注処理の結果をさらに詳細に確認できます。
成功したかどうかに応じたサウンドの再生
次に、注文が成功したかどうかを確認します。ExtTrade.ResultRetcodeはサーバーからの応答コードを返します。TRADE_RETCODE_DONEというコードは、注文が正常に処理されたことを示すコードです。
もし注文が成功していれば、PlaySound(InpFileNameOK)を使って成功時の音声ファイル(ok.wavなど)を再生します。注文が失敗した場合には、PlaySound(InpFileNameErr)を使用して失敗時の音声ファイル(timeout.wavなど)を再生します。これにより、音声フィードバックでトレーダーに結果を通知することができます。
全体の流れ
- 注文が失敗した場合、エラーコードをログに出力し、サーバーからの応答をログに出力します。
- 注文の成否に応じて、成功音または失敗音を再生することで、トレーダーに結果を知らせます。
この部分では、トレード結果のフィードバックとして音声とログの両方を使用して、ユーザーが取引の結果を把握しやすくする処理が行われています。