2018年5月13日日曜日

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

@ MetaTrader 4 Version 4.00 build 1090

[MetaTrader 4](https://www.metatrader4.com) には config ファイルを指定して起動する機能がありますこの機能を使うと、自動で Strategy Tester を走らせたりできる。

> 参考
>
> [Configuration at Startup - Tools - MetaTrader 4 Help](https://www.metatrader4.com/en/trading-platform/help/service/start_conf_file)

2018年5月12日土曜日

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

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

スプレッドを選択
`!` がスプレッドになります
その他、「高値」・「安値」・「時間最後の tick 時間」の表示も出来ます。 このスプレッドの単位は point なので注意しましょう。 > 参考 > > [[MT4] pips とpoint の使い分け](https://strategyofc.blogspot.com/2018/05/mt4-pips-point.html)
2018年5月11日金曜日

[MT4] pips とpoint の使い分け

Metatrader の point(s) と pip(s) の使い分け方について私見ですが書いてみようと思います。

まずは簡単に違いから。

> 詳しい違いについては以下を参考にしてください
>
> [MT4のpoint(ポイント)とpips(ピップス)の違い | MT4ラボ|メタトレーダーの使い方/EA・インジケーター検証](http://mt4.click/chart_sosa/point_pips_chigai/)

2018年5月10日木曜日

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

[OrdersHistoryTotal()](https://docs.mql4.com/trading/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() は口座履歴タブで設定した期間しか取得できない](https://strategyofc.blogspot.com/2018/05/mql4-orderhistorytotal.html)

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

[OrdersHistoryTotal()](https://docs.mql4.com/trading/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()](https://docs.mql4.com/trading/orderopentime) と [TimeCurrent()](https://docs.mql4.com/dateandtime/timecurrent) の差分で求められます。
なお、OrderOpenTime() を実行する前には [OrderSelect()](https://docs.mql4.com/trading/orderselect) で対象の Order を指定しておく必要があります。

```mq4
// OrderSelect() は実行済みとする
long diff = TimeCurrent() - OrderOpenTime();
printf("%lld", diff); // 約定時刻からの秒
```

この値は**秒**で求められます。

> 参考
>
> [[MQL4] datetime を long にキャストすると 1970/1/1 からの秒になる | Strategy of C](https://strategyofc.blogspot.com/2018/05/mql4-datetime-long-197011.html)

この時、土日に入っている場合は [TimeCurrent()](https://docs.mql4.com/dateandtime/timecurrent) が正確ではない可能性があるので注意が必要です。

> 参考
> 
> [[MQL4] TimeCurrent() は土日の間は更新されない | Strategy of C](https://strategyofc.blogspot.com/2018/05/mql4-timecurrent.html)

2018年5月8日火曜日

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

[TimeCurrent()](https://docs.mql4.com/dateandtime/timecurrent) のドキュメントに以下のような記述があります。

> Returns the last known server time,

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

2018年5月7日月曜日

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

[string と datetime の加算演算は strict モードかどうかで動作が変わる](https://strategyofc.blogspot.com/2018/05/mql4-string-datetime-strict.html) に書いたように datetime の string への変換は明示的に行ったほうが良いと思います。

基本的には、MQL4 の固定フォーマット "yyyy.mm.dd hh:mi" を使うのが簡単ですが、独自のフォーマットで出力することも可能です後述するように、独自フォーマットの string を datetime に変換する際は注意が必要
2018年5月6日日曜日

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

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

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

> 参考
>
> [Updated MQL4 - MQL4 Reference](https://docs.mql4.com/mql4changes#compiler_difference)

2018年5月5日土曜日

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

### 原因 エラーの理由は単純で、64個の mail queue がいっぱいになったということです。 > 参考 > - [Mail: not enough space for "............. subject.........." - General - MQL5 programming forum](https://www.mql5.com/en/forum/46410) Queue というのは窓口の列みたいなものです。 (マ○ドナルドのレジが1つしかない状況を想像してください) MT4 のメール用 Queue は 64通しか保持することができないので、それ以上のメール送信リクエストがくると、このエラーが起こります。

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

MetaEditor がサジェストしてきた関数の中に [PrintFormat()](https://docs.mql4.com/common/printformat) というのがあって、リファレンスを読んでみたら、printf と同等との記述が。

printf のリファレンスがないことから、[PrintFormat()](https://docs.mql4.com/common/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](https://docs.mql4.com/basis/types/integer/datetime) 公式ドキュメントによると、`datetime` は 1970/1/1 からの秒を格納する 8 bytes の型だそうです。 これは `long` と同じサイズで、相互変換が可能です。 どちらを使っていても動作上問題はないのですが、以下のような特徴があるので使い分けると良いでしょう。 - `datetime`
日付文字列との相互変換が容易。実際の日付を表す場合に使用。 - `long`
純粋な秒を表す場合に使用。
2018年5月3日木曜日

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

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

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

```mq4
// コメントも OK
printf("テスト");
```

動作確認環境は - Windows 10 - Metatrader 4.00 build 1090 - Shift-JIS と UTF-16