【MQL5】銘柄仕様の「初期(証拠金)」に関する備忘録

FX
スポンサーリンク
スポンサーリンク

はじめに

自作EAでお金を稼ぐ事を目標に、試行錯誤しながらMQL5をコツコツと勉強してます。今回はトラブル系の記事になります。備忘録的要素が強いですが、同じ問題で悩んでいる方の一助になれば幸いです。

やりたかったことのイメージ

20pipsのマイナスで損切りする事を条件に、余剰証拠金に対して20pipsの変動内にロスカットされない最大レバレッジのロット数を算出し、注文する。

使用した関数

AccountInfoInteger(ACCOUNT_LEVERAGE)

必要証拠金の算出等に使用するため、上記関数によりMT5に設定されている最大レバレッジを取得。
国内業者なので「25」のリテラル値を使用しても良かったのですが、なるべく汎用的に作りたかったので関数にて取得するように作りました。テスト環境でも25を取得できたので問題無いと思っていましたが、これが後のトラブルを誘発します。

本稼働で注文処理が実行されない

自分の資産の増減に直結するのでEAのテストは入念に行います。
今回のEAも一通りテストし、5年分のバックテストで好成績を出したので本稼働させました。
しばらくチャートを眺めてましたが、ロジック的に注文するはずのレートになっても一向に注文されず、操作ログのタブを開くとエラーの嵐でした・・・・。

エラーの内容

エラーコードは10019。注文数に対して余剰証拠金が足りない時に起こるエラーです。
ログに記載されているロット数で手計算してみると確かに余剰証拠金が足りません。
なんでそんなロット数が算出されたのか不明でしたが、現状を受け止めて早急にテスト環境で確認したところ、エラーにならないロット数が算出されました。
ここから2日間、原因究明に時間を取られます。

原因

原因は下記赤枠の設定値でした。デモ環境のMT5だとここは「1」が設定されています。どうやらMT5のレバレッジは「AccountInfoInteger(ACCOUNT_LEVERAGE)」関数で得た値を、赤枠の数値で割った値で算出しているようです。

わかりやすい日本語で明確に記載している文献が見つからなかったので「どうやら」と表現してますが、実際に本番環境で「AccountInfoInteger(ACCOUNT_LEVERAGE)」の値をログに出力したところ「400」が出力されました。つまり、400÷16=25が最大レバレッジということです。
また、レバレッジ400で手計算すると上記エラーにあったロット数になったので、おそらくそういう仕様で間違いないと思います。

対策

上記赤枠の値は「SymbolInfoMarginRate」関数で取得できるので、取得した値で割り算してあげることで解決しました。

その他気を付ける事

本番環境のストラテジーテスターを使用する場合は、下記赤枠の設定に注意が必要です。

今回の例で言うと、ここは「1:400」にしてあげる必要があります。1:25だとレバレッジは25÷16≒1.56となってしまいます。(この仕組みを知らず今回の調査で深みにはまりました)

最後に

今回のトラブルを通してまた一つMQL5への理解を深める事ができましたが、リファレンスの文言はいつ見てもわかりにくいですね・・・。翻訳だと思うので仕方ないのかもしれませんが、独特な表現を理解するのにはいつも苦労します。

そんな訳で、以上になりますが今回の記事がどなたかのお役に立てば幸いです。

FX
スポンサーリンク
スポンサーリンク
カッテラをフォローする
スポンサーリンク
タイトルとURLをコピーしました