2018年10月18日木曜日

[MQL4] GetLastError() で取得したエラーコードをエラーメッセージに変換する方法

MQL4 の関数の中には、失敗した場合、[GetLastError()](https://docs.mql4.com/check/getlasterror) でエラーコードを取得できるものがあります。

しかし、このエラーコードは [Trade Server Return Codes](https://docs.mql4.com/constants/errorswarnings/enum_trade_return_codes) に載ってないものが多く、そのままでは役に立ちません。

そのため、`ErrorDescription()` という標準関数が用意されています公式のサンプルの中でもよく使われています
2018/10/19 追記
「載ってないものが多く」と書いたのですが、[Runtime Errors](https://docs.mql4.com/constants/errorswarnings/errorcodes) の方には 4000番台のエラーも載っていましたどこかで見た気はしていた。 [Trade Server Return Codes](https://docs.mql4.com/constants/errorswarnings/enum_trade_return_codes) は [Runtime Errors](https://docs.mql4.com/constants/errorswarnings/errorcodes) から若い番号のものを抜粋した表のようです。
[OrderModify()](https://docs.mql4.com/trading/ordermodify) 等は 4000番台のエラーも返すのに、リンクされているドキュメントが不十分というのは不親切だなぁ。
### `ErrorDescription()` の使用方法 まず `stdlib.mqh` を include します。 ```mq4 #include <stdlib.mqh> ``` あとは以下のように `GetLastError()` で取得したエラーコードを与えると、対応したエラーメッセージが返されます。 ```mq4 if (!OrderModify(ticket, price, stoploss, takeprofit, expiration)) { int error = GetLastError(); printf("OrderModify error \"%s\"(%d)", ErrorDescription(error), error); } // 結果 // OrderModify error "invalid ticket"(4108) ``` なお、`GetLastError()` は2度呼ぶと値が変わってしまうので、上記のように変数で一度受けて使用しましょう。 > 参考 > > [[MQL4] GetLastError() は2度呼んではいけない](https://strategyofc.blogspot.com/2018/10/mql4-getlasterror-2.html)