2019年9月10日火曜日

[MT4] WebInstall フォルダは一度更新&削除するとしばらく更新されない

Build 1170 (20 Dec 2018) -> Build 1210 (06 Sep 2019) のアップデートで確認

MetaTrader 4 のアップデートは `%APPDATA%\MetaQuotes\WebInstall` 以下にダウンロードされ、複数の MetaTrader 間でシェアされます。 > 参考 > > [MetaTrader 4 は勝手に再起動してアップデートすることがある | Strategy of C](https://strategyofc.blogspot.com/2018/12/metatrader-4.html) この `WebInstall` フォルダ、最新版をダウンロードした後にこれを削除すると、しばらくの間は再ダウンロードが行われないようです。 ただし、異なるアカウントでアクセスした場合はダウンロードされます。 これらのことより、サーバー側にダウンロードした情報が残っており、しばらくの間は無駄にダウンロードし直さないようになっているのだと思われます。 とはいえ、これを削除するケースは滅多にないと思われるので、あまり気にする必要はないでしょう。 > 参考 > > 私の場合は、`/skipupdate` オプションの動作を調べるためにやってみました > > [[MT4] /skipupdate は機能していない? | Strategy of C](https://strategyofc.blogspot.com/2019/06/mt4-skipupdate.html)
2019年6月11日火曜日

[MT4] /skipupdate は機能していない?

MetaTrader 4 は `terminal.exe /skipupdate` で起動すると自動アップデートを抑制できるはずです。

> 参考
>
> [MT4 自動アップデート阻止方法 | FXmt](https://fxmt.co/archives/7194)

ところが、最近の挙動を見ていると、このオプションが効いてない様子。
ちょうど手元に Build 1090 (19 May 2017) 版があったので確認してみました。

2019年6月8日土曜日

MetaTrader を複数起動してストラテジーテスターを行う方法

MetaTrader は `/portable` オプションを付けることで、フォルダ単位に起動することができます。
つまり、フォルダをコピーすれば複数の MetaTrader を同時起動することができるということです。

しかし、都度フォルダをコピーするのは大変そして、history が大きくなると時間がかかる。
そこで、MetaTrader を簡単に複数起動することができるスクリプトを作ってみました。

Windows のジャンクション機能を使っているので、普通にコピーするより速く起動します。

2019年6月6日木曜日

[MQL4] カスタムインジケーターを更新する際、最新値だけでは足りない

以前、[カスタムインジケーターを最新値で更新する方法2種](https://strategyofc.blogspot.com/2018/06/mql4-2.html) を書きました。
その中で、「`Buffer[0]` を常に更新すれば良い」と書いたのですが、この方法には問題があることがわかりました元記事は修正済み
2019年5月8日水曜日

[MQL4] StringToCharArray() を使うと最後に '\0' が入るので注意

公式リファレンスにちゃんと書いてあるのですが、
[StringToCharArray()](https://docs.mql4.com/convert/stringtochararray) を使うと最後に '\0'いわゆる [ヌル文字](https://ja.wikipedia.org/wiki/%E3%83%8C%E3%83%AB%E6%96%87%E5%AD%97) が入ります。

```mq4
string hoge = "abc";
uchar arr_hoge[];
StringToCharArray(hoge, arr_hoge);
// arr_hoge は ['a', 'b', 'c', '\0']
Print(ArraySize(arr_hoge));
// 4
```

[ArraySize()](https://docs.mql4.com/array/arraysize) を [StringLen()](https://docs.mql4.com/strings/stringlen) のように使ったりすると不具合の原因になるので気をつけましょうやらかした人がここに
2019年4月12日金曜日

MQL4 で配列用メモリを動的確保する方法

プログラムの動作中に配列長が決まるということはよくありますMQL だとそう多くはないかもしれないですが。

そういった場合、C++ では `new` 演算子で動的にメモリを確保するわけですが、MQL4 では `new` 演算子で配列用のメモリを確保することは出来ません。

その代わり、[ArrayResize()](https://docs.mql4.com/array/arrayresize) を利用することでメモリを動的確保することができます。

2019年4月11日木曜日

MT4 Android 版で Notification の音を変更する方法

@Android版 MetaTrader 4 Build 1174 (05 Apr 2019)

[MT4 Android 版で Notification の音が変更できない](https://strategyofc.blogspot.com/2018/08/mt4-android-notification.html) で書いたように [MT4 Android 版](https://play.google.com/store/apps/details?id=net.metaquotes.metatrader4) では Notification の音を変更することが出来なくなっていました少なくとも Android 9 Pie では。

アプリの更新が出るたびに、修正されているか確認しているのですが、未だに直っていないようです。

…と思ったら、アプリ内からは変更できないけど Android の設定からは変更できるようになっていましたもしかしたら 2018 Jun バージョンから出来たのかも。
Android 9 Pie で Notification の仕様が少し変わり、MetaTrader 4 アプリはそれに正しく対応出来ていないようですね。

なので、公式にはまだ直っているとは言い難いですが、Android の機能を使えば Notification の音を変更することが可能です。

2019年4月4日木曜日

[MT4] tester cannot calculate prices が出てしまった場合の対処方法

昨日まで使えていた EA でテストをしようとしたところ、"tester cannot calculate prices" というエラーが出て、動かなくなってしまいました。
エラーの前に "margin exchange rate cannot be calculated" という警告が出ているのも気になります。

調べてみたところ、以下のような条件下でおこるようです条件が AND か OR か不確定。 - "Expert properties"(エキスパート設定)の "Initial deposit currency"(初期証拠金通貨)がブローカーのものと異なる - テストの "Symbol" (通貨ペア)が直接計算できない例えば、証拠金を「USD」にしていて、「EURJPY」で計算しようとしている場合など - サーバーと通信出来ていない
2019年3月9日土曜日

[MQL4] MarketInfo で値が取れない時は気配値表示ウィンドウを確認する

気配値表示ウィンドウに対象の通貨ペアを表示していない場合、基本的に [MarketInfo()](https://docs.mql4.com/marketinformation/marketinfo) の値は取得できません値が0になってしまう。

`MarketInfo()` の値が取れない時は、気配値表示ウィンドウを確認してみましょう。

2019年3月8日金曜日

[MQL4] ストラテジーテスターの中では SymbolInfo や MarketInfo が取得できない時がある

@MetaTrader 4.00 Build 1170 (20 Dec 2018)

[SymbolInfoDouble()](https://docs.mql4.com/marketinformation/symbolinfodouble), [SymbolInfoInteger()](https://docs.mql4.com/marketinformation/symbolinfointeger), [SymbolInfoString()](https://docs.mql4.com/marketinformation/symbolinfostring) 等の関数はストラテジーテスターの中では動作しない時があるので注意が必要です。

2019年3月4日月曜日

[MQL4] SYMBOL_TRADE_TICK_VALUE は過去の値がとれない

[値幅を基準通貨の金額に換算する](https://strategyofc.blogspot.com/2018/07/mql4.html) 際に使う [SymbolInfoDouble(null, SYMBOL_TRADE_TICK_VALUE)](https://docs.mql4.com/marketinformation/symbolinfodouble) ですが、過去の値はとれないので注意が必要です。

つまり、Strategy Tester 内で使用することが出来ません。

[MarketInfo(null, MODE_TICKVALUE)](https://docs.mql4.com/marketinformation/marketinfo) も同様です。

> 参考
> 
> [How to calculate pip value in currency account (USD, EUR etc) some bars ago or some time ago? - Currency Pairs - Expert Advisors and Automated Trading - MQL5 programming forum](https://www.mql5.com/en/forum/40812)

2019年1月17日木曜日

[MQL4] ObjectDelete() をループ内で実行するときには decrement にする

特定の Object をまとめて消したい時、以下のようにループで各オブジェクトを消したくなります。

しかし、以下は Object が2個以上あるとうまくいきません。

```mq4
// NG
for (int i = 0; i < ObjectsTotal(EMPTY); i++) {
    string objectName = ObjectName(i);
    ObjectDelete(objectName);
}
```

2019年1月5日土曜日

[MQL4] OnTick() 内で Bid, Ask を更新する方法

EA の `OnTick()` 処理中に Bid, Ask が更新されたとしても `Bid`, `Ask` 変数にこれらの値は反映されません。

注文の実行時など、最新の値を使用したい時は [RefreshRates()](https://docs.mql4.com/series/refreshrates) を使用すると `Bid`, `Ask` 変数等を更新する事が出来ます。

2019年1月4日金曜日

[MQL4] 他通貨の Bid, Ask を取得する方法2種

他通貨のバー情報を取得するには [iHigh()](https://docs.mql4.com/series/ihigh) 等の関数が使えます。
通常はこれで十分なのですが、リアルタイムで Bid, Ask の情報を取得したいことも時としてあります。

その場合、以下のようにして取得することが可能です。

2019年1月3日木曜日

OANDA Japan で v20 口座を作ったら新規注文できなくなった【解決済】

昨年末に「【重要】OANDA Japan NYサーバーにおける新取引システム【v20】への移行および口座移管のお知らせ」というメールが届きました。

2019年1月中旬以降、順次取引システムが `v20` に更新されるらしい。
両建て口座は自動で更新されないとのことなので、手動で `v20` 口座を作成し、移管してみました。

ところが、新規の `v20` 口座では通貨ペアがグレーアウトされてしまい、
新規注文が出せません新規注文画面に通貨ペアが表示されない。
そして、USDJPY のスプレッドが 14 と広がっています。ボラティリティの低い安定時です。
原則 8 point Oanda Japan の USDJPY では 8 point = 0.8 pip 固定じゃなかったのか!?