OrderCheck関数の働き・役割
![](https://mqlinvestmentlab.com/wp-content/uploads/2024/07/d3660dac45b83ff4d26a840142b93d36.png)
OrderCheck関数は、取引操作を実行するために充分な資金があるかどうかをチェックするために使用されます。
この関数は、取引リクエストを評価し、その結果をMqlTradeCheckResult構造体に格納します。関数の戻り値は、資金の不足やパラメータの不正を示しますが、リクエストされた取引操作が確実に成功することを保証するものではありません。詳細な結果は、MqlTradeCheckResult構造体のフィールドを分析する必要があります。
OrderCheck関数の引数について
![](https://mqlinvestmentlab.com/wp-content/uploads/2024/07/dab0b345d8c175e94f92b0aab496b230.png)
OrderCheck関数の引数構成は以下の通りです。
第1引数: request
取引操作に関するリクエストを記述するためのMqlTradeRequest構造体への参照です。この構造体には、取引の詳細(例えば、注文の種類、銘柄、ボリューム、価格など)が含まれています。
第2引数: result
チェック結果を格納するためのMqlTradeCheckResult構造体型の構造体への参照です。この構造体には、チェック結果の詳細(例えば、必要な証拠金、利用可能なマージン、エラーコードなど)が含まれます。関数実行後、この構造体のフィールドを分析することで、取引が実行可能かどうかの詳細な情報を得ることができます。
OrderCheck関数を使用することで、取引操作を実行する前に資金が十分であるかを確認し、リスクを管理することができます。
MqlTradeCheckResult構造体について
![](https://mqlinvestmentlab.com/wp-content/uploads/2024/07/710e9c22ee75aa82006e780973901ccd.png)
struct MqlTradeCheckResult
{
uint retcode; // 返信コード
double balance; // 約定実行後の残高
double equity; // 約定実行後の株式
double profit; // 変動利益
double margin; // 証拠金必要条件
double margin_free; // 余剰証拠金
double margin_level; // 証拠金レベル
string comment; // 返信コードコメント(エラーの説明)
};
MqlTradeCheckResult構造体とは、OrderCheck関数のチェック結果を格納するための構造体です。この構造体には、取引操作の実行後に関するさまざまな情報が含まれており、取引が実行可能かどうかを判断するために使用されます。各フィールドには、取引結果に関する詳細なデータが格納されます。
retcode
retcode(リターンコード)は、OrderCheck関数の実行結果を示します。このフィールド(メンバ変数)には、チェックの結果が格納されます。リターンコードは、取引操作の成否やエラーの種類を表し、取引操作が適切に行われたかどうかを判断するために使用されます。
balance
balance(取引操作実行後の残高)は、OrderCheck関数のチェック後に予測される口座の残高を示します。このフィールド(メンバ変数)には、取引操作が実行された場合の残高の値が格納されます。
equity
equity(取引操作実行後の純資産)は、OrderCheck関数のチェック後に予測される口座の純資産を示します。このフィールド(メンバ変数)には、取引操作が実行された場合の純資産の値が格納されます。
純資産は、残高に加えて未決済ポジションの評価損益を含んだ口座全体の資産状況を表します。つまり、balanceが実際の口座の残高のみを表すのに対して、equityは残高と未決済ポジションの評価損益を合算した総資産を示します。これにより、取引操作が口座全体の資産状況に与える影響を事前に評価することができます。
profit
profit(取引操作実行後の変動利益)は、OrderCheck関数のチェック後に予測される未決済ポジションの評価損益を示します。このフィールド(メンバ変数)には、取引操作が実行された場合の評価損益の値が格納されます。
変動利益は、未決済ポジションの現在の市場価格に基づいて計算される利益または損失を反映します。具体的には、未決済の取引が現時点でどれだけの利益または損失を生じているかを示します。これにより、取引操作が口座の評価損益に与える影響を事前に評価することができます。
margin
margin(取引操作に必要な証拠金)は、OrderCheck関数のチェック後に予測される、取引操作を実行するために必要な証拠金の額を示します。このフィールド(メンバ変数)には、取引操作が実行される場合に必要となる証拠金の値が格納されます。
証拠金は、取引を開始するために口座に預け入れなければならない担保金のことです。これにより、取引が実行可能かどうか、またはどの程度のリスクがあるかを事前に評価することができます。証拠金の額は、取引する銘柄や取引量、レバレッジ比率などに依存します。
※証拠金の算出式は以下の通りです:
証拠金 = (取引量 × 銘柄の価格) / レバレッジ比率
この式により、取引操作に必要な証拠金を計算することができます。
margin_free
margin_free(取引操作実行後に残される余剰証拠金)は、OrderCheck関数のチェック後に予測される、取引操作を実行した後に残る余剰証拠金の額を示します。このフィールド(メンバ変数)には、取引操作が実行された場合に残される余剰証拠金の値が格納されます。
余剰証拠金について
余剰証拠金は、口座の総資産(equity)から必要な証拠金(margin)を差し引いた額を表します。これは、新たな取引を行うために使用可能な証拠金の量を示します。
※余剰証拠金の算出式は以下の通りです:
余剰証拠金 = 純資産(equity) - 証拠金(margin)
この式により、取引操作後に新たな取引を行うために使用可能な証拠金を計算することができます。
margin_level
margin_level(取引操作実行後に設定される証拠金レベル)は、OrderCheck関数のチェック後に予測される証拠金レベルを示します。このフィールド(メンバ変数)には、取引操作が実行された場合の証拠金レベルの値が格納されます。
証拠金レベルについて
証拠金レベルは、口座の資産状況を示す重要な指標であり、特に取引の安全性を評価する際に使用されます。具体的には、純資産(equity)を必要証拠金(margin)で割った比率で表されます。この比率が高いほど、口座は健全な状態にあります。
証拠金レベルの算出式は以下の通りです:
証拠金レベル = (純資産(equity) / 証拠金(margin)) × 100
この式により、取引操作後の証拠金レベルをパーセンテージで計算することができます。高い証拠金レベルは、口座が新たな取引や市場の変動に対して十分な余裕を持っていることを示します。
comment
comment(返信コードコメント)は、OrderCheck関数のチェック結果に関する詳細な説明を提供するフィールド(メンバ変数)です。このフィールドには、エラーが発生した場合の説明や、チェック結果に関する追加情報が文字列形式で格納されます。
このコメントは、リターンコード(retcode)の内容を補足し、取引操作が成功したかどうかや、失敗した場合の具体的な理由を理解するために使用されます。これにより、ユーザーは問題の原因を特定し、適切な対応を取ることができます。
OrderCheck関数の戻り値について
![](https://mqlinvestmentlab.com/wp-content/uploads/2024/07/e035061c6354ace64ef7d7232fc7c9a8.png)
OrderCheck関数は、指定された取引操作を実行するための資金が十分にあるかをチェックし、その結果を返します。この関数の戻り値は、基本的なチェックの成否を示しますが、取引操作が実際に成功することを保証するものではありません。詳細な結果は、MqlTradeCheckResult構造体のフィールドを確認する必要があります。
戻り値の詳細
- true: 基本的な構造体チェックが成功した場合。この場合、リクエストされた取引操作が正常に実行される可能性がありますが、必ずしも確実ではありません。結果の詳細はMqlTradeCheckResult構造体のフィールドに格納されます。
- false: 資金が不足している場合、またはパラメータが不正な場合。具体的なエラー情報はGetLastError関数を使用して取得することができます。
OrderCheck関数を使う際の注意点
![](https://mqlinvestmentlab.com/wp-content/uploads/2024/07/7d4449f1abec57bdaf4aa4c2483aca70-1024x585.webp)
まず、OrderCheck関数は、取引操作が実行可能かどうかを事前にチェックするためのものであり、実際の取引が成功することを保証するものではありません。関数の戻り値がtrueであっても、実際の取引時には異なる結果が生じる可能性があります。したがって、必ずMqlTradeCheckResult構造体のフィールドを詳細に確認する必要があります。
次に、資金が十分であるかをチェックするために、OrderCheck関数は取引リクエストを評価しますが、リクエストの内容が不正確であった場合には、正確な結果を得られない可能性があります。MqlTradeRequest構造体が正確に設定されていることを確認することが重要です。
OrderCheck関数がfalseを返した場合には、GetLastError関数を使用してエラーコードを取得し、その内容を確認することが推奨されます。これにより、資金不足やパラメータの不正などの問題を特定し、適切な対策を講じることができます。
サンプルコードに使われた関数や文法要素の簡単な解説
![](https://mqlinvestmentlab.com/wp-content/uploads/2024/07/d120a7df4c8a971f2b01b4711f94e120-1024x585.webp)
OnStart関数
OnStart関数は、スクリプトが実行されるときに最初に呼び出される関数です。この関数内で、取引リクエストの設定、OrderCheck関数の呼び出し、結果の出力を行います。
MqlTradeRequest構造体の設定
// MqlTradeRequest構造体を定義し、取引リクエストを設定します
MqlTradeRequest request;
ZeroMemory(request); // 構造体をゼロで初期化
request.action = TRADE_ACTION_DEAL; // 取引アクション
request.symbol = "EURUSD"; // 銘柄名
request.volume = 1.0; // ボリューム(ロット)
request.type = ORDER_TYPE_BUY; // 注文の種類(買い)
request.price = SymbolInfoDouble(request.symbol, SYMBOL_BID); // 現在のビッド価格
request.sl = 0; // ストップロス価格
request.tp = 0; // テイクプロフィット価格
request.deviation = 10; // 許容スリッページ
ここでは、取引リクエストを記述するためのMqlTradeRequest構造体を定義し、そのフィールドを設定します。ZeroMemory関数を使用して構造体をゼロで初期化し、取引の詳細を設定します。主なフィールドは以下の通りです。
- action: 取引アクションを指定します。ここではTRADE_ACTION_DEALを指定しています。
- symbol: 取引対象の銘柄名を指定します。
- volume: 取引のボリュームを指定します。
- type: 注文の種類を指定します。ここでは成行買い注文を指定しています。
- price: 取引の価格を指定します。ここでは現在のビッド価格を使用しています。
- sl: ストップロス価格を指定します。ここではゼロを指定しています。
- tp: テイクプロフィット価格を指定します。ここではゼロを指定しています。
- deviation: 許容スリッページを指定します。
MqlTradeCheckResult構造体の初期化
// MqlTradeCheckResult構造体を定義し、結果を格納するための変数を初期化します
MqlTradeCheckResult result;
ZeroMemory(result); // 構造体をゼロで初期化
ここでは、OrderCheck関数の結果を格納するためのMqlTradeCheckResult構造体を定義し、ZeroMemory関数を使用してゼロで初期化します。
OrderCheck関数の呼び出し
// OrderCheck関数を使用して取引リクエストをチェックします
bool check = OrderCheck(request, result);
ここでは、OrderCheck関数を呼び出し、取引リクエストをチェックします。requestには取引の詳細が含まれ、resultにはチェック結果が格納されます。関数の戻り値は、基本的なチェックが成功したかどうかを示します。
チェック結果の確認と出力
// チェック結果を確認し、エキスパートログに出力します
if (check)
{
Print("OrderCheck succeeded.");
Print("Balance after trade: ", result.balance);
Print("Equity after trade: ", result.equity);
Print("Profit after trade: ", result.profit);
Print("Required margin: ", result.margin);
Print("Free margin: ", result.margin_free);
Print("Margin level: ", result.margin_level, "%");
}
else
{
Print("OrderCheck failed. Error code: ", GetLastError());
}
ここでは、OrderCheck関数の戻り値であるcheckを確認しています。
- if文は、checkがtrueの場合に実行されるブロックを指定します。この場合、取引リクエストが成功したと判断し、resultフィールドの値をエキスパートログに出力します。
- else文は、checkがfalseの場合に実行されるブロックを指定します。この場合、取引リクエストが失敗したと判断し、GetLastError関数を使用してエラーコードを取得し、エキスパートログに出力します。
Print関数
Print関数は、指定されたメッセージをエキスパートログに出力します。このサンプルコードでは、チェック結果や各フィールドの値を出力するために使用されています。
GetLastError関数
GetLastError関数は、最後に発生したエラーコードを取得するための関数です。OrderCheck関数が失敗した場合に、この関数を使用してエラーの詳細を取得します。