[MT4] ExpertsEnable は機能していない?

Metatrader の point(s) と pip(s) の使い分け方について私見ですが書いてみようと思います。
まずは簡単に違いから。
詳しい違いについては以下を参考にしてください
MT4のpoint(ポイント)とpips(ピップス)の違い | MT4ラボ|メタトレーダーの使い方/EA・インジケーター検証
OrdersHistoryTotal() のドキュメントに以下のような記述があります。
Consecutive selection of orders using the SELECT_BY_POS parameter returns information in the sequence in which it was received from the trading server. Sorting of the resulting list of orders cannot be guaranteed.
最後にさらりと、「ソート順は保証されていません」と書いてあるではないですか。
つまり、直近の履歴だけを見たい場合でも、最低1回はループを回さないといけないわけですね。
そりゃ、「口座履歴」タブで取得期間を絞っておく必要があるわけだ。
参考
OrdersHistoryTotal() のドキュメントに以下のような記述があります。
The number of closed orders in the account history loaded into the terminal. The history list size depends on the current settings of the "Account history" tab of the terminal.
つまり、"Account history"(口座履歴)タブの設定によって取得できるリストの期間が異なるとのこと。
オーダー約定時刻からの時間は OrderOpenTime() と TimeCurrent() の差分で求められます。 なお、OrderOpenTime() を実行する前には OrderSelect() で対象の Order を指定しておく必要があります。
1 2 3 | // OrderSelect() は実行済みとする long diff = TimeCurrent () - OrderOpenTime (); printf ( "%lld" , diff); // 約定時刻からの秒 |
この値は秒で求められます。
参考
[MQL4] datetime を long にキャストすると 1970/1/1 からの秒になる | Strategy of C
この時、土日に入っている場合は TimeCurrent() が正確ではない可能性があるので注意が必要です。
参考
TimeCurrent() のドキュメントに以下のような記述があります。
Returns the last known server time,
last known
ということは、実際のサーバータイムとは異なっている可能性もあるということです。
string と datetime の加算演算は strict モードかどうかで動作が変わる に書いたように datetime の string への変換は明示的に行ったほうが良いと思います。
基本的には、MQL4 の固定フォーマット "yyyy.mm.dd hh:mi" を使うのが簡単ですが、独自のフォーマットで出力することも可能です1。
MQL4 のコンパイラは strict モードか否かで微妙に動作を変えます。
strict モードは、変数のスコープ等が厳格になっており、特別な理由が無い場合は使用すべきかと思います。 ただ、string と datetime の加算は混乱を招く仕様となっているので、注意が必要です。
参考
エラーの理由は単純で、64個の mail queue がいっぱいになったということです。
参考
Queue というのは窓口の列みたいなものです。 (マ○ドナルドのレジが1つしかない状況を想像してください)
MT4 のメール用 Queue は 64通しか保持することができないので、それ以上のメール送信リクエストがくると、このエラーが起こります。
MetaEditor がサジェストしてきた関数の中に PrintFormat() というのがあって、リファレンスを読んでみたら、printf と同等との記述が。
printf のリファレンスがないことから、PrintFormat() の方が本家で printf はエイリアスのようです。
知らなかった。 けど、今まで printf をずっと使ってきてしまったから、もう変えないけど。
参考
Datetime Type - Integer Types - Data Types - Language Basics - MQL4 Reference
公式ドキュメントによると、datetime
は 1970/1/1 からの秒を格納する 8 bytes の型だそうです。
これは long
と同じサイズで、相互変換が可能です。
どちらを使っていても動作上問題はないのですが、以下のような特徴があるので使い分けると良いでしょう。
datetime
long
MQL4 のコンパイラ自体は UTF-8 や UTF-16 のマルチバイト文字を問題なく扱えているように見えます。
printf
内の文字列も出力できています。
コメントも日本語で大丈夫のようです。
1 2 | // コメントも OK printf ( "テスト" ); |
動作確認環境は
アプリケーション開発から組み込みまで手を出しているフリーランスのエンジニア
投資経験は10年以上
現在、完全自動売買を目指して研究中
当ブログ内の情報は環境等により動作が異なる場合があります。 情報は正確になるよう努めていますが、もし間違いを見つけた方はご一報いただけると幸いです。 なお、当ブログの情報によって損害が生じたとしても管理人は一切の責任を負いません。 全て自己責任でお願い致します。