2018年5月13日日曜日

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

2018年5月12日土曜日

[MT4] 気配値表示ウィンドウにスプレッドを表示する方法

気配値表示ウィンドウ内で右クリック

スプレッドを選択

! がスプレッドになります

その他、「高値」・「安値」・「時間1」の表示も出来ます。

このスプレッドの単位は point なので注意しましょう。

参考

[MT4] pips とpoint の使い分け

  1. 最後の tick 時間 
?
2018年5月11日金曜日

[MT4] pips とpoint の使い分け

2018年5月10日木曜日

[MQL4] SELECT_BY_POS のソート順は保証されていない

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回はループを回さないといけないわけですね。

そりゃ、「口座履歴」タブで取得期間を絞っておく必要があるわけだ。

参考

[MQL4] OrderHistoryTotal() は口座履歴タブで設定した期間しか取得できない

[MQL4] OrderHistoryTotal() は口座履歴タブで設定した期間しか取得できない

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"(口座履歴)タブの設定によって取得できるリストの期間が異なるとのこと。

2018年5月9日水曜日

[MQL4] オーダー約定時刻からの足の本数を求める方法

オーダー約定時刻からの時間を求める

オーダー約定時刻からの時間は 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() が正確ではない可能性があるので注意が必要です。

参考

[MQL4] TimeCurrent() は土日の間は更新されない | Strategy of C

2018年5月8日火曜日

[MQL4] TimeCurrent() は土日の間は更新されない

TimeCurrent() のドキュメントに以下のような記述があります。

Returns the last known server time,

last known ということは、実際のサーバータイムとは異なっている可能性もあるということです。

2018年5月7日月曜日

[MQL4] string と datetime 型の相互変換方法5種

2018年5月6日日曜日

[MQL4] string と datetime の加算演算は strict モードかどうかで動作が変わる

MQL4 のコンパイラは strict モードか否かで微妙に動作を変えます。

strict モードは、変数のスコープ等が厳格になっており、特別な理由が無い場合は使用すべきかと思います。 ただ、string と datetime の加算は混乱を招く仕様となっているので、注意が必要です。

参考

Updated MQL4 - MQL4 Reference

2018年5月5日土曜日

MT4 で Mail: not enough space for "Subject" と表示されてしまう場合の原因と対策

原因

エラーの理由は単純で、64個の mail queue がいっぱいになったということです。

参考

Queue というのは窓口の列みたいなものです。 (マ○ドナルドのレジが1つしかない状況を想像してください)

MT4 のメール用 Queue は 64通しか保持することができないので、それ以上のメール送信リクエストがくると、このエラーが起こります。

[MQL4] printf は PrintFormat のエイリアスだった

MetaEditor がサジェストしてきた関数の中に PrintFormat() というのがあって、リファレンスを読んでみたら、printf と同等との記述が。

printf のリファレンスがないことから、PrintFormat() の方が本家で printf はエイリアスのようです。

知らなかった。 けど、今まで printf をずっと使ってきてしまったから、もう変えないけど。

2018年5月4日金曜日

[MQL4] datetime を long にキャストすると 1970/1/1 からの秒になる

2018/6/12 追記
負数の扱いと最大値について加筆・修正しました。

参考

Datetime Type - Integer Types - Data Types - Language Basics - MQL4 Reference

公式ドキュメントによると、datetime は 1970/1/1 からの秒を格納する 8 bytes の型だそうです。 これは long と同じサイズで、相互変換が可能です。

どちらを使っていても動作上問題はないのですが、以下のような特徴があるので使い分けると良いでしょう。

  • datetime
    日付文字列との相互変換が容易。実際の日付を表す場合に使用。
  • long
    純粋な秒を表す場合に使用。
2018年5月3日木曜日

MQL 内で日本語は使わない方が良い

MQL4 のコンパイラ自体は UTF-8 や UTF-16 のマルチバイト文字を問題なく扱えているように見えます。

printf 内の文字列も出力できています。 コメントも日本語で大丈夫のようです。

1
2
// コメントも OK
printf("テスト");

動作確認環境は

  • Windows 10
  • Metatrader 4.00 build 1090
  • Shift-JIS と UTF-16