<?xml version="1.0" encoding="UTF-8" standalone="no"?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns="http://www.w3.org/2005/Atom" xmlns:blogger="http://schemas.google.com/blogger/2008" xmlns:gd="http://schemas.google.com/g/2005" xmlns:georss="http://www.georss.org/georss" xmlns:openSearch="http://a9.com/-/spec/opensearchrss/1.0/" xmlns:thr="http://purl.org/syndication/thread/1.0"><id>tag:blogger.com,1999:blog-2050150641290358499</id><updated>2024-10-24T18:30:27.018+09:00</updated><category term="MQL4"/><category term="MetaTrader"/><category term="Expert Advisor"/><category term="Standard Library"/><category term="Array"/><category term="Custom Indicator"/><category term="Android"/><category term="MetaEditor"/><category term="Update"/><category term="List"/><category term="OANDA Japan"/><category term="Python"/><category term="Strategy Tester"/><category term="WSH"/><category term="iOS"/><title type="text">Strategy of C</title><subtitle type="html"/><link href="https://strategyofc.blogspot.com/feeds/posts/default" rel="http://schemas.google.com/g/2005#feed" type="application/atom+xml"/><link href="https://www.blogger.com/feeds/2050150641290358499/posts/default?redirect=false" rel="self" type="application/atom+xml"/><link href="https://strategyofc.blogspot.com/" rel="alternate" type="text/html"/><link href="http://pubsubhubbub.appspot.com/" rel="hub"/><link href="https://www.blogger.com/feeds/2050150641290358499/posts/default?start-index=26&amp;max-results=25&amp;redirect=false" rel="next" type="application/atom+xml"/><author><name>Yusuke</name><uri>http://www.blogger.com/profile/01684623000819625562</uri><email>noreply@blogger.com</email><gd:image height="32" rel="http://schemas.google.com/g/2005#thumbnail" src="//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiquu1685bSenxd0V6J4yvcDUazx1i_-RXZ3mHILzptpdAadwhXL6RpRbkJhVr-VrP7UHwR1C7mRJI9SOtd0MVLuJUrViIjX3yx1naUiblUPwk_ipnm72-mmGf7QELWnl0/s1600/ACg8ocKlDAVFDimnAUyl7Ji05wSkUNwgbwPLydcKfPbsqMxx20o%253Ds500-c" width="32"/></author><generator uri="http://www.blogger.com" version="7.00">Blogger</generator><openSearch:totalResults>61</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>25</openSearch:itemsPerPage><xhtml:meta content="noindex" name="robots" xmlns:xhtml="http://www.w3.org/1999/xhtml"/><entry><id>tag:blogger.com,1999:blog-2050150641290358499.post-1348643446631005426</id><published>2019-09-10T08:14:00.000+09:00</published><updated>2019-09-10T08:14:02.223+09:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="MetaTrader"/><category scheme="http://www.blogger.com/atom/ns#" term="Update"/><title type="text">[MT4] WebInstall フォルダは一度更新&amp;削除するとしばらく更新されない</title><content type="html">&lt;pre class="marked"&gt;
Build 1170 (20 Dec 2018) -&gt; Build 1210 (06 Sep 2019) のアップデートで確認

&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg66jmelly4lFwo9F5R-GxuGoQeFCUthwZlFKoQ5cGtCnZrYIJVk1EqaSGPPIoqYWXfVAFG_i7ePwWZecAcE-M-Yj_AnZxGfhGp6trzEekuUR1f4dTuHASQnJdJdScTwAaY-CLP451qY5w/s1600/2019-09-09_12h05_10.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg66jmelly4lFwo9F5R-GxuGoQeFCUthwZlFKoQ5cGtCnZrYIJVk1EqaSGPPIoqYWXfVAFG_i7ePwWZecAcE-M-Yj_AnZxGfhGp6trzEekuUR1f4dTuHASQnJdJdScTwAaY-CLP451qY5w/s1600/2019-09-09_12h05_10.png" data-original-width="155" data-original-height="267" /&gt;&lt;/a&gt;&lt;/div&gt;

MetaTrader 4 のアップデートは `%APPDATA%\MetaQuotes\WebInstall` 以下にダウンロードされ、複数の MetaTrader 間でシェアされます。

&gt; 参考
&gt;
&gt; [MetaTrader 4 は勝手に再起動してアップデートすることがある | Strategy of C](https://strategyofc.blogspot.com/2018/12/metatrader-4.html)

この `WebInstall` フォルダ、最新版をダウンロードした後にこれを削除すると、しばらくの間は再ダウンロードが行われないようです。

ただし、異なるアカウントでアクセスした場合はダウンロードされます。

これらのことより、サーバー側にダウンロードした情報が残っており、しばらくの間は無駄にダウンロードし直さないようになっているのだと思われます。

とはいえ、これを削除するケースは滅多にないと思われるので、あまり気にする必要はないでしょう。


&gt; 参考
&gt;
&gt; 私の場合は、`/skipupdate` オプションの動作を調べるためにやってみました
&gt;
&gt; [[MT4] /skipupdate は機能していない？ | Strategy of C](https://strategyofc.blogspot.com/2019/06/mt4-skipupdate.html)

&lt;/pre&gt;
</content><link href="https://www.blogger.com/feeds/2050150641290358499/posts/default/1348643446631005426" rel="edit" type="application/atom+xml"/><link href="https://www.blogger.com/feeds/2050150641290358499/posts/default/1348643446631005426" rel="self" type="application/atom+xml"/><link href="https://strategyofc.blogspot.com/2019/09/mt4-webinstall.html" rel="alternate" title="[MT4] WebInstall フォルダは一度更新&amp;削除するとしばらく更新されない" type="text/html"/><author><name>Yusuke</name><uri>http://www.blogger.com/profile/01684623000819625562</uri><email>noreply@blogger.com</email><gd:image height="32" rel="http://schemas.google.com/g/2005#thumbnail" src="//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiquu1685bSenxd0V6J4yvcDUazx1i_-RXZ3mHILzptpdAadwhXL6RpRbkJhVr-VrP7UHwR1C7mRJI9SOtd0MVLuJUrViIjX3yx1naUiblUPwk_ipnm72-mmGf7QELWnl0/s1600/ACg8ocKlDAVFDimnAUyl7Ji05wSkUNwgbwPLydcKfPbsqMxx20o%253Ds500-c" width="32"/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" height="72" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg66jmelly4lFwo9F5R-GxuGoQeFCUthwZlFKoQ5cGtCnZrYIJVk1EqaSGPPIoqYWXfVAFG_i7ePwWZecAcE-M-Yj_AnZxGfhGp6trzEekuUR1f4dTuHASQnJdJdScTwAaY-CLP451qY5w/s72-c/2019-09-09_12h05_10.png" width="72"/></entry><entry><id>tag:blogger.com,1999:blog-2050150641290358499.post-901057318107438565</id><published>2019-06-11T05:53:00.000+09:00</published><updated>2019-09-10T06:17:19.630+09:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="MetaTrader"/><category scheme="http://www.blogger.com/atom/ns#" term="Update"/><title type="text">[MT4] /skipupdate は機能していない？</title><content type="html">&lt;pre class="marked"&gt;
MetaTrader 4 は `terminal.exe /skipupdate` で起動すると自動アップデートを抑制できるはずです。

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

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

&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhncQrlvssS-wc0s4_k12a95EsdAxglqWNXDKDzbHc3rnLfHP6ZvkSw6DDvdMto1HEWJON4lMnZGpun_UITnGECjbZCTenwq3nUbuH_fAPziVe7RwarexwKD4sFy1XdSsbZWiGuARQqtMs/s1600/001.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhncQrlvssS-wc0s4_k12a95EsdAxglqWNXDKDzbHc3rnLfHP6ZvkSw6DDvdMto1HEWJON4lMnZGpun_UITnGECjbZCTenwq3nUbuH_fAPziVe7RwarexwKD4sFy1XdSsbZWiGuARQqtMs/s1600/001.png" data-original-width="190" data-original-height="275" /&gt;&lt;/a&gt;&lt;/div&gt;

&lt;a name='more'&gt;&lt;/a&gt;

結論から言うと、「1度だけアップデートを抑制できるけど、2度目の起動時に強制アップデートされてしまう」
という挙動を示しました。（~~もしかしたら、Build 1090 が古すぎたのが原因かも。~~詳細は以下）

正確に言うと、WebInstall フォルダ以下にアップデートがあるかどうかで挙動が変わるのですが、
1度目の起動で WebInstall フォルダを更新してしまうので、2度目は必ずアップデートしてしまうのです。

以下、簡単に説明します。


### WebInstall フォルダにアップデートがない場合
MT4 は起動時に `%APPDATA%\MetaQuotes\WebInstall\mt4clw\` をチェックして最新版がダウンロードされていないか確認します。

&gt; 参考
&gt;
&gt; [MetaTrader 4 は勝手に再起動してアップデートすることがある | Strategy of C](https://strategyofc.blogspot.com/2018/12/metatrader-4.html)

ここにアップデートがない場合、サーバーへアップデートを確認しに行き、アップデートをダウンロードします。

`/skipupdate` が指定されていない場合、このダウンロードが終わった時点で MetaTrader が再起動します。
`/skipupdate` が指定されている場合は、再起動**しません**


### WebInstall フォルダにアップデートがある場合
`%APPDATA%\MetaQuotes\WebInstall\mt4clw\` フォルダにアップデート&lt;sup&gt;&lt;span class='barenote'&gt;Build 1170 (20 Dec 2018)&lt;/span&gt;&lt;/sup&gt;があると、
`/skipupdate` を指定していても即座に再起動して最新版になってしまいました。

&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiM3ornF5Tn5pEld1sWm44B8AJB4e8nN8CdZXxQZjBEmzrAA8iL2DfQDMKaevhqjayofhEnvM1qgfK1IHb410cjW8kIqkuGCjLaRBCA-7JDeRCDJi1B1Z1wJUbPPN7bNqMFx7feBFkTREE/s1600/003.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiM3ornF5Tn5pEld1sWm44B8AJB4e8nN8CdZXxQZjBEmzrAA8iL2DfQDMKaevhqjayofhEnvM1qgfK1IHb410cjW8kIqkuGCjLaRBCA-7JDeRCDJi1B1Z1wJUbPPN7bNqMFx7feBFkTREE/s1600/003.png" data-original-width="190" data-original-height="275" /&gt;&lt;/a&gt;&lt;/div&gt;


### そもそも古すぎるとトレードできない
Build 1090 (19 May 2017) で起動した場合、ステータスバーのサーバーとの接続状況を示す項目が
「旧バージョン」となってしまいます。

&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj87oNfcT0XyW8rnX3V3fvg8jVoP-naDYdxUJP8Tps4-wAQ0pKzNIpLNzNWbQfgTk_QIOBBa4j8-L6kv1eazqGVASS6NK_lNO-2J_eMtuYbXwp8JBsOE9pnW-QEnfsQI_pVpE6m7n60pK8/s1600/002.PNG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj87oNfcT0XyW8rnX3V3fvg8jVoP-naDYdxUJP8Tps4-wAQ0pKzNIpLNzNWbQfgTk_QIOBBa4j8-L6kv1eazqGVASS6NK_lNO-2J_eMtuYbXwp8JBsOE9pnW-QEnfsQI_pVpE6m7n60pK8/s1600/002.PNG" data-original-width="204" data-original-height="31" /&gt;&lt;/a&gt;&lt;/div&gt;

そもそもトレード出来ない状況なので強制アップデートするしか手がないわけです。
今回、強制アップデートになったのはこれが原因の可能性もあります&lt;sup&gt;&lt;span class='barenote'&gt;だとしたら、ダウンロード直後も再起動したらよさそうだけど&lt;/span&gt;&lt;/sup&gt;。

次のアップデートがあったら、またテストしてみようと思います。

&lt;div class="edit"&gt;&lt;div class="title"&gt;2019/09/09 追記&lt;/div&gt;&lt;div class="content"&gt;
Build 1210 (06 Sep 2019) が配信されたので、確認してみたところ、「旧バージョン」と表示されていなくても同じ挙動を示しました。
このステータスとは関係なく、2度目の起動でアップデートしてしまう仕様のようです。
&lt;/div&gt;&lt;/div&gt;

&lt;/pre&gt;
&lt;div class='barenote_ref_list'&gt;&lt;/div&gt;</content><link href="https://www.blogger.com/feeds/2050150641290358499/posts/default/901057318107438565" rel="edit" type="application/atom+xml"/><link href="https://www.blogger.com/feeds/2050150641290358499/posts/default/901057318107438565" rel="self" type="application/atom+xml"/><link href="https://strategyofc.blogspot.com/2019/06/mt4-skipupdate.html" rel="alternate" title="[MT4] /skipupdate は機能していない？" type="text/html"/><author><name>Yusuke</name><uri>http://www.blogger.com/profile/01684623000819625562</uri><email>noreply@blogger.com</email><gd:image height="32" rel="http://schemas.google.com/g/2005#thumbnail" src="//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiquu1685bSenxd0V6J4yvcDUazx1i_-RXZ3mHILzptpdAadwhXL6RpRbkJhVr-VrP7UHwR1C7mRJI9SOtd0MVLuJUrViIjX3yx1naUiblUPwk_ipnm72-mmGf7QELWnl0/s1600/ACg8ocKlDAVFDimnAUyl7Ji05wSkUNwgbwPLydcKfPbsqMxx20o%253Ds500-c" width="32"/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" height="72" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhncQrlvssS-wc0s4_k12a95EsdAxglqWNXDKDzbHc3rnLfHP6ZvkSw6DDvdMto1HEWJON4lMnZGpun_UITnGECjbZCTenwq3nUbuH_fAPziVe7RwarexwKD4sFy1XdSsbZWiGuARQqtMs/s72-c/001.png" width="72"/></entry><entry><id>tag:blogger.com,1999:blog-2050150641290358499.post-5510494238761588006</id><published>2019-06-08T12:39:00.000+09:00</published><updated>2019-06-08T12:39:08.057+09:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="MetaTrader"/><category scheme="http://www.blogger.com/atom/ns#" term="Strategy Tester"/><category scheme="http://www.blogger.com/atom/ns#" term="WSH"/><title type="text">MetaTrader を複数起動してストラテジーテスターを行う方法</title><content type="html">&lt;pre class="marked"&gt;
MetaTrader は `/portable` オプションを付けることで、フォルダ単位に起動することができます。
つまり、フォルダをコピーすれば複数の MetaTrader を同時起動することができるということです。

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

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

&lt;a name='more'&gt;&lt;/a&gt;


### terminal_for_tester.js を作成
`metatrader.exe` と同じフォルダに 以下のスクリプトを置きます。

&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhGoHUGEb3_3vTOSnx5diPckje1LUDIJ-xO-H1_Sfvp340_RPndH63iMPCfnwubMQpLQ1l6MxVNxh6K4uzF6gOoQSdQ_o0QQvjbo1lk8xdgfZUDnlXtKBVYz2YJGvO11nCAI7fzhyphenhyphenIk2Dg/s1600/001.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhGoHUGEb3_3vTOSnx5diPckje1LUDIJ-xO-H1_Sfvp340_RPndH63iMPCfnwubMQpLQ1l6MxVNxh6K4uzF6gOoQSdQ_o0QQvjbo1lk8xdgfZUDnlXtKBVYz2YJGvO11nCAI7fzhyphenhyphenIk2Dg/s1600/001.png" data-original-width="178" data-original-height="124" /&gt;&lt;/a&gt;&lt;/div&gt;

```javascript
`title: "terminal_for_tester.js";
var shell = WScript.CreateObject('WScript.Shell');
var fso = WScript.CreateObject('Scripting.FileSystemObject');

// Create temporary folder
var tmpFolder = fso.GetSpecialFolder(2) + '\\' + fso.GetTempName();
fso.CreateFolder(tmpFolder);

// Make junctions of subfolders except 'tester'
{
  var enuFolders = new Enumerator(fso.GetFolder('.').SubFolders)
  for (; !enuFolders.atEnd(); enuFolders.moveNext()) {
    var folder = enuFolders.item();
    if (folder.Name == 'tester') continue;
    shell.Run('cmd.exe /c mklink /j ' + tmpFolder + '\\' + folder.Name + ' ' + folder, 0);
  }
}

// Create 'tester\files' folder
fso.CreateFolder(tmpFolder + '\\tester');
fso.CreateFolder(tmpFolder + '\\tester\\files');

// Copy exe file
var SRC_FILE = 'terminal.exe';
var DST_FILE = tmpFolder + '\\' + SRC_FILE;
fso.CopyFile(SRC_FILE, DST_FILE);

shell.Run('cmd.exe /c start /wait "' + tmpFolder + '" "' + DST_FILE + '" /portable', 0, true);

// Delete temporary dir
{
  fso.DeleteFolder(tmpFolder + '\\tester', false);
  // Unlink the junctions
  var enuFolders = new Enumerator(fso.GetFolder(tmpFolder).SubFolders)
  for (; !enuFolders.atEnd(); enuFolders.moveNext()) {
      var folder = enuFolders.item();
      shell.Run('cmd.exe /c rmdir ' + folder, 0, true);
  }
  // Make sure that the unlinking has been completed
  do {
    WScript.Sleep(100);
    var subFolders = fso.GetFolder(tmpFolder).SubFolders
  } while (subFolders.Count != 0);
  fso.DeleteFolder(tmpFolder, false);
}
```

WSH (JScript) なので複雑に見えますが&lt;sup&gt;&lt;span class='barenote'&gt;なぜ WSH にしたかというと、ダブルクリックでスマートに起動したかったからだけ&lt;/span&gt;&lt;/sup&gt;、やっていることは単純です。
一時フォルダを作成し、その中に `tester` フォルダ以外のジャンクションをはります。その後、`terminal.exe` をコピーして実行するだけです。

起動後の一時フォルダ削除が少々複雑ですが、ジャンクション削除のお作法です。

なお、`terminal.exe` は勝手にアップデート問題があるため、コピーにしています&lt;sup&gt;&lt;span class='barenote'&gt;/skipupdate というオプションもありますが、最近のものでは動作していない気がする&lt;/span&gt;&lt;/sup&gt;。

&gt; 参考
&gt;
&gt; [MetaTrader 4 は勝手に再起動してアップデートすることがある | Strategy of C](https://strategyofc.blogspot.com/2018/12/metatrader-4.html)


### 起動
`terminal_for_tester.js` をダブルクリックで起動。何個でも起動します。

あえてアイコンはコピーしていません。
デフォルトのアイコンになるので、区別しやすいかと思います。

&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh1FxxTNZgvkt890w93YM9iieLA9e27nk8OmKD-pZLE9nqSFoDfuiksKRPFi_IrciS_VWRubBoQimEPDvpUV5XVdzvDrRbhYiwsLG2zCr9qSazP6mVCKfVmKfiwaW9PlHuIS_UPT3wSI_M/s1600/002.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh1FxxTNZgvkt890w93YM9iieLA9e27nk8OmKD-pZLE9nqSFoDfuiksKRPFi_IrciS_VWRubBoQimEPDvpUV5XVdzvDrRbhYiwsLG2zCr9qSazP6mVCKfVmKfiwaW9PlHuIS_UPT3wSI_M/s1600/002.png" data-original-width="206" data-original-height="58" /&gt;&lt;/a&gt;&lt;/div&gt;

### 注意点
使用上の注意点がいくつかあります。

#### history フォルダはバックアップしておいた方がよい
history フォルダを共有しているので、複数のプロセスから書き込みが行われると不整合が起こる可能性があります。
基本的には `terminal.exe` の終了時に上書きが走るようなので、同時に閉じないようにすれば大丈夫な気がしていますが、確かではありません。

私はオフラインにして履歴が更新されないようにしていますが、そこまではしなくても良いかもしれません。


#### `tester\files` フォルダは消えてしまう
実行しているフォルダは MetaTrader の実行が終わると削除されてしまいます。同時に `tester\files` フォルダも消えてしまいます。
結果をファイルに出力する等している場合、別フォルダに移動する必要があります&lt;sup&gt;&lt;span class='barenote'&gt;それをスクリプトに書いてもいいかもしれない&lt;/span&gt;&lt;/sup&gt;。


#### 同時に実行する数に注意
CPU のコア数までは複数起動してもあまりパフォーマンスには影響しないでしょう&lt;sup&gt;&lt;span class='barenote'&gt;ストレージへのアクセス時は若干遅くなるはず&lt;/span&gt;&lt;/sup&gt;。
論理プロセッサ数を超えるとパフォーマンスは下がっていくと思いますが、倍くらいまでならそれなりに動くのではないかと思います。
参考にして下さい。

余談ですが、CPU の情報は「タスクマネージャー」で見ることができます。

タスクバー右クリック → タスクマネージャー
&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjfUOPB1U4gtpG7yIs_FanOONkkdZ2EUO6aZjCiqBIRK_yX0CK_W-gETvBphLYZ0kO0iSXAPC76KOeJmfc5YQKaZjOOihLjrYbciMnZpW5HH9hPzQsfpSNGFvjYCf-HgtDcNA-2xnItl20/s1600/003.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjfUOPB1U4gtpG7yIs_FanOONkkdZ2EUO6aZjCiqBIRK_yX0CK_W-gETvBphLYZ0kO0iSXAPC76KOeJmfc5YQKaZjOOihLjrYbciMnZpW5HH9hPzQsfpSNGFvjYCf-HgtDcNA-2xnItl20/s1600/003.png" data-original-width="245" data-original-height="194" /&gt;&lt;/a&gt;&lt;/div&gt;

パフォーマンスタブの CPU
&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh1PuZJaDDiQG3oWhGkKTN55LJRfehEONOX7v8O_T_TfunbbMbYPe2vK_u3K0OqC2VD2UUSyKhzDiXuSTGhrgz-yMTdhw5F2w1CB5StKi0XtVJXPUDTtT2kIgR5RvFac5yQujyw0KCd2yk/s1600/004.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh1PuZJaDDiQG3oWhGkKTN55LJRfehEONOX7v8O_T_TfunbbMbYPe2vK_u3K0OqC2VD2UUSyKhzDiXuSTGhrgz-yMTdhw5F2w1CB5StKi0XtVJXPUDTtT2kIgR5RvFac5yQujyw0KCd2yk/s640/004.png" width="640" height="448" data-original-width="594" data-original-height="416" /&gt;&lt;/a&gt;&lt;/div&gt;

&lt;/pre&gt;
&lt;div class='barenote_ref_list'&gt;&lt;/div&gt;</content><link href="https://www.blogger.com/feeds/2050150641290358499/posts/default/5510494238761588006" rel="edit" type="application/atom+xml"/><link href="https://www.blogger.com/feeds/2050150641290358499/posts/default/5510494238761588006" rel="self" type="application/atom+xml"/><link href="https://strategyofc.blogspot.com/2019/06/metatrader.html" rel="alternate" title="MetaTrader を複数起動してストラテジーテスターを行う方法" type="text/html"/><author><name>Yusuke</name><uri>http://www.blogger.com/profile/01684623000819625562</uri><email>noreply@blogger.com</email><gd:image height="32" rel="http://schemas.google.com/g/2005#thumbnail" src="//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiquu1685bSenxd0V6J4yvcDUazx1i_-RXZ3mHILzptpdAadwhXL6RpRbkJhVr-VrP7UHwR1C7mRJI9SOtd0MVLuJUrViIjX3yx1naUiblUPwk_ipnm72-mmGf7QELWnl0/s1600/ACg8ocKlDAVFDimnAUyl7Ji05wSkUNwgbwPLydcKfPbsqMxx20o%253Ds500-c" width="32"/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" height="72" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhGoHUGEb3_3vTOSnx5diPckje1LUDIJ-xO-H1_Sfvp340_RPndH63iMPCfnwubMQpLQ1l6MxVNxh6K4uzF6gOoQSdQ_o0QQvjbo1lk8xdgfZUDnlXtKBVYz2YJGvO11nCAI7fzhyphenhyphenIk2Dg/s72-c/001.png" width="72"/></entry><entry><id>tag:blogger.com,1999:blog-2050150641290358499.post-6372518155790989136</id><published>2019-06-06T01:14:00.000+09:00</published><updated>2020-01-29T06:35:08.484+09:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Custom Indicator"/><category scheme="http://www.blogger.com/atom/ns#" term="MQL4"/><title type="text">[MQL4] カスタムインジケーターを更新する際、最新値だけでは足りない</title><content type="html">&lt;pre class="marked"&gt;
以前、[カスタムインジケーターを最新値で更新する方法2種](https://strategyofc.blogspot.com/2018/06/mql4-2.html) を書きました。
その中で、「`Buffer[0]` を常に更新すれば良い」と書いたのですが、この方法には問題があることがわかりました&lt;sup&gt;&lt;span class='barenote'&gt;元記事は修正済み&lt;/span&gt;&lt;/sup&gt;。

&lt;a name='more'&gt;&lt;/a&gt;

### 1本前が更新されないことがある
以下が掲載していたコードです。

```mq4
`first-line: 34; highlight: 39;
    // NG な例
    int num_uncalculated = rates_total - prev_calculated;
    for (int i = num_uncalculated - 1; i &gt; 0; i--) {
        Buffer[i] = close[i];
    }
    Buffer[0] = close[0];

    // return value of prev_calculated for next call
    return rates_total;
```

上記を実行すると、一見正しく動作するように見えます。
しかし、新しい足が作成された瞬間、つまり `Buffer[0]` が `Buffer[1]` に切り替わった瞬間、Buffer[1] の値が更新されないことがあるようです。

最新足の1本前（黄色の矢印）が更新されないということです&lt;sup&gt;&lt;span class='barenote'&gt;そして、リアルタイムチャートに適用し続けると、ずれた値が残る&lt;/span&gt;&lt;/sup&gt;。

&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEin3GTTl1AUkDSFhKxbpu4K8-MtkxomORPzIcPfV-Orx_JVlw1z1DDYRqXRh3S_Jp9yy_zZb-FqSJlC6oN15nyYarAzPJmSz1OP1bgW85-JeYWAe0iVUjPVgYM7OHAq0TFio-h8DIny4fE/s1600/001.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEin3GTTl1AUkDSFhKxbpu4K8-MtkxomORPzIcPfV-Orx_JVlw1z1DDYRqXRh3S_Jp9yy_zZb-FqSJlC6oN15nyYarAzPJmSz1OP1bgW85-JeYWAe0iVUjPVgYM7OHAq0TFio-h8DIny4fE/s1600/001.png" data-original-width="185" data-original-height="192" /&gt;&lt;/a&gt;&lt;/div&gt;

### 修正方法
以下のようにすると良いかと思います。

```mq4
`first-line: 35; highlight: 36;
    int num_uncalculated = (prev_calculated == 0) ? rates_total - 1 : rates_total - prev_calculated;
    for (int i = num_uncalculated; i &gt;= 0; i--) {
        Buffer[i] = close[i];
    }

    // return value of prev_calculated for next call
    return rates_total;
```

`num_uncalculated` が 0 でも、`Buffer[0]` は更新されます。
最新の足に切り替わった際、`num_uncalculated` は 1 になるので、`Buffer[1]` も更新されます。


### iCustom() を使う時は特に注意
この問題、[iCustom()](https://docs.mql4.com/indicators/icustom) を使ったEAのバックテスト時に見つけました。

リアルタイムチャートでも起こるのかと思って試してみたのですが、私の手元では再現させることが出来ませんでした。
タイミングの問題のため、再現させるのは難しいのかもしれません。

インジケーターにもよりますが、ずれても誤差程度なので目視ではほとんど問題にならないかもしれません。
しかし、EA で使用する際は誤動作の原因&lt;sup&gt;&lt;span class='barenote'&gt;誤差分の差異で動きが大きく変わるような EA は大抵うまく機能しないけど…&lt;/span&gt;&lt;/sup&gt;になるので注意したいところです。

&lt;/pre&gt;
&lt;div class='barenote_ref_list'&gt;&lt;/div&gt;</content><link href="https://www.blogger.com/feeds/2050150641290358499/posts/default/6372518155790989136" rel="edit" type="application/atom+xml"/><link href="https://www.blogger.com/feeds/2050150641290358499/posts/default/6372518155790989136" rel="self" type="application/atom+xml"/><link href="https://strategyofc.blogspot.com/2019/06/mql4.html" rel="alternate" title="[MQL4] カスタムインジケーターを更新する際、最新値だけでは足りない" type="text/html"/><author><name>Yusuke</name><uri>http://www.blogger.com/profile/01684623000819625562</uri><email>noreply@blogger.com</email><gd:image height="32" rel="http://schemas.google.com/g/2005#thumbnail" src="//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiquu1685bSenxd0V6J4yvcDUazx1i_-RXZ3mHILzptpdAadwhXL6RpRbkJhVr-VrP7UHwR1C7mRJI9SOtd0MVLuJUrViIjX3yx1naUiblUPwk_ipnm72-mmGf7QELWnl0/s1600/ACg8ocKlDAVFDimnAUyl7Ji05wSkUNwgbwPLydcKfPbsqMxx20o%253Ds500-c" width="32"/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" height="72" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEin3GTTl1AUkDSFhKxbpu4K8-MtkxomORPzIcPfV-Orx_JVlw1z1DDYRqXRh3S_Jp9yy_zZb-FqSJlC6oN15nyYarAzPJmSz1OP1bgW85-JeYWAe0iVUjPVgYM7OHAq0TFio-h8DIny4fE/s72-c/001.png" width="72"/></entry><entry><id>tag:blogger.com,1999:blog-2050150641290358499.post-1194230330437304110</id><published>2019-05-08T08:20:00.000+09:00</published><updated>2019-05-08T08:20:04.860+09:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="MQL4"/><title type="text">[MQL4] StringToCharArray() を使うと最後に '\0' が入るので注意</title><content type="html">&lt;pre class="marked"&gt;
公式リファレンスにちゃんと書いてあるのですが、
[StringToCharArray()](https://docs.mql4.com/convert/stringtochararray) を使うと最後に '\0'&lt;sup&gt;&lt;span class='barenote'&gt;いわゆる [ヌル文字](https://ja.wikipedia.org/wiki/%E3%83%8C%E3%83%AB%E6%96%87%E5%AD%97)&lt;/span&gt;&lt;/sup&gt; が入ります。

```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) のように使ったりすると不具合の原因になるので気をつけましょう&lt;sup&gt;&lt;span class='barenote'&gt;やらかした人がここに&lt;/span&gt;&lt;/sup&gt;。

&lt;a name='more'&gt;&lt;/a&gt;

'\0' を入れないようにするには、以下のように文字列長分変換すると良いようです。

```mq4
`first-line: 3;
StringToCharArray(hoge, arr_hoge, 0, StringLen(hoge));
// arr_hoge は ['a', 'b', 'c']
Print(ArraySize(arr_hoge));
// 3
```
&lt;/pre&gt;
&lt;div class='barenote_ref_list'&gt;&lt;/div&gt;</content><link href="https://www.blogger.com/feeds/2050150641290358499/posts/default/1194230330437304110" rel="edit" type="application/atom+xml"/><link href="https://www.blogger.com/feeds/2050150641290358499/posts/default/1194230330437304110" rel="self" type="application/atom+xml"/><link href="https://strategyofc.blogspot.com/2019/05/mql4-stringtochararray-0.html" rel="alternate" title="[MQL4] StringToCharArray() を使うと最後に '\0' が入るので注意" type="text/html"/><author><name>Yusuke</name><uri>http://www.blogger.com/profile/01684623000819625562</uri><email>noreply@blogger.com</email><gd:image height="32" rel="http://schemas.google.com/g/2005#thumbnail" src="//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiquu1685bSenxd0V6J4yvcDUazx1i_-RXZ3mHILzptpdAadwhXL6RpRbkJhVr-VrP7UHwR1C7mRJI9SOtd0MVLuJUrViIjX3yx1naUiblUPwk_ipnm72-mmGf7QELWnl0/s1600/ACg8ocKlDAVFDimnAUyl7Ji05wSkUNwgbwPLydcKfPbsqMxx20o%253Ds500-c" width="32"/></author></entry><entry><id>tag:blogger.com,1999:blog-2050150641290358499.post-8121698621437694968</id><published>2019-04-12T00:17:00.000+09:00</published><updated>2019-04-12T00:17:08.832+09:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Array"/><category scheme="http://www.blogger.com/atom/ns#" term="MQL4"/><title type="text">MQL4 で配列用メモリを動的確保する方法</title><content type="html">&lt;pre class="marked"&gt;
プログラムの動作中に配列長が決まるということはよくあります&lt;sup&gt;&lt;span class='barenote'&gt;MQL だとそう多くはないかもしれないですが&lt;/span&gt;&lt;/sup&gt;。

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

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

&lt;a name='more'&gt;&lt;/a&gt;

なお、[CArray](https://www.mql5.com/en/docs/standardlibrary/datastructures/carray) 系のライブラリを使っても可変長配列を実現できます&lt;sup&gt;&lt;span class='barenote'&gt;これらのクラス内では `ArrayResize()` 等を使っています&lt;/span&gt;&lt;/sup&gt;。

&gt; 参考
&gt;
&gt; [MQL4 で可変長配列を使用する方法 | Strategy of C](https://strategyofc.blogspot.com/2018/10/mql4.html)

### ArrayResize() の基本の使い方
以下は動的に配列長を 1000 にした例です。
実際に使用する場合は、1000 の部分が変数になることが多いかと思います。

```mq4
int arr[];
ArrayResize(arr, 1000);
```

### Static Array には適用しない方が良い
公式ドキュメントには ArrayResize() は [Dynamic Array](https://docs.mql4.com/basis/types/dynamic_array) にしか適用できないと書いてあります。

&gt; The function can be applied only to dynamic arrays

ところが、以下のように Static Array に対して適用した場合もコンパイルは通ってしまいます。さらに、一見想定通りの動作をします。

しかし、この使用方法は何らかの問題&lt;sup&gt;&lt;span class='barenote'&gt;メモリリーク等&lt;/span&gt;&lt;/sup&gt;を起こす可能性があるので、避けるべきでしょう。

```mq4
// やってはいけない（と思う）
int arr[50]; // Static Array
Print("Is this a dynamic array = ", ArrayIsDynamic(arr) ? "Yes" : "No"); // No
ArrayResize(arr, 1000);
Print("Is this a dynamic array = ", ArrayIsDynamic(arr) ? "Yes" : "No"); // Yes
```

&gt; 参考
&gt; 
&gt; [Dynamic Array Object - Data Types - Language Basics - MQL4 Reference](https://docs.mql4.com/basis/types/dynamic_array)


### 頻繁にサイズを変更する場合
メモリの動的確保は大抵負荷の高い処理になります。
つまり、頻繁にメモリサイズを変更すると動作が重くなります。

これを避けるため、先に大きめのメモリ領域を確保しておくという機能が用意されています。

頻繁に `ArrayResize()` を呼ぶ場合は利用すると良いでしょう。

```mq4
int arr[];
// 3番目のオプション引数で追加のメモリ確保が可能
ArrayResize(arr, 1000, 1000); // 物理メモリは 2000 確保されるが、配列のサイズは 1000
Print("ArraySize = ", ArraySize(arr)); // 1000
for (int i = 1; i &lt; 3000; i++) {
   ArrayResize(arr, i, 1000); // i が既に確保されている 2000 以下の場合、配列のサイズだけが変更される（動作が速い）
}
```

### 配列のサイズを変更したらデータはどうなるか？
配列サイズを変更した際のデータの扱いについて、公式ドキュメントを検索してみたのですが、仕様としてはっきり定義されているわけではなさそうです。

[ArrayInitialize()](https://docs.mql4.com/array/arrayinitialize) に以下の記述があったくらいでしょうか。

&gt; Initialization of the array using ArrayInitialize(array, init_val) doesn't mean the initialization with the same value of reserve elements allocated for this array.
&gt; At further expanding of the array using the ArrayResize() function, the elements will be added at the end of the array, their values will be undefined and in most cases will not be equal to init_value.

意訳してみました。

&gt; ArrayInitialize(array, init_val) で初期化しても、(ArrayResize() の3番目の引数で指定した）予約領域が初期化されるわけではありません。
&gt; ArrayResize() で領域を拡張した際、末尾に追加された値は不定で、ほとんどの場合 init_value にはなりません。

逆に言うと、既に使用済みの領域は値を保持すると言えるかもしれません。
しかし、そこまではっきりと書いてあるわけでもありません。

一応、以下のような実験をしてみたところ、値は保持されていましたが、仕様が曖昧である以上、不定であると考えた方が安全かと思います。

```mq4
ArrayResize(arr, 10);

for (int i = 0; i &lt; 10; i++) {
    arr[i] = i * 10;
}    

// 拡張する
ArrayResize(arr, 20);
for (int i = 0; i &lt; 10; i++) {
    Print(i, ": ", arr[i]); // 0 ~ 90 値は保持されていた
}
```

### 動的メモリを解放する
[ArrayFree()](https://docs.mql4.com/array/arrayfree) の説明によると、明示的に動的メモリを解放する必要はあまり無いようです。

ただ、以下のようなローカル変数はどうなるのかよくわかりません。
スコープから抜けたら自動的に解放されるのかもしれません&lt;sup&gt;&lt;span class='barenote'&gt;C++ と異なる手段で動的配列確保を実装している理由かも&lt;/span&gt;&lt;/sup&gt;。

そもそも、配列をローカルで動的確保するのはパフォーマンス的にどうよ？と思いますが、
スコープを狭く安全な実装にするためには、こちらが良いケースもあるかもしれません。そういった場合、`ArrayFree()` を呼んでおいた方が安全かとは思います。

```mq4
void my_func(int size) {
    int arr[];
    ArrayResize(arr, size);

    // 何か処理

    ArrayFree(arr);
}
```
&lt;/pre&gt;
&lt;div class='barenote_ref_list'&gt;&lt;/div&gt;</content><link href="https://www.blogger.com/feeds/2050150641290358499/posts/default/8121698621437694968" rel="edit" type="application/atom+xml"/><link href="https://www.blogger.com/feeds/2050150641290358499/posts/default/8121698621437694968" rel="self" type="application/atom+xml"/><link href="https://strategyofc.blogspot.com/2019/04/mql4.html" rel="alternate" title="MQL4 で配列用メモリを動的確保する方法" type="text/html"/><author><name>Yusuke</name><uri>http://www.blogger.com/profile/01684623000819625562</uri><email>noreply@blogger.com</email><gd:image height="32" rel="http://schemas.google.com/g/2005#thumbnail" src="//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiquu1685bSenxd0V6J4yvcDUazx1i_-RXZ3mHILzptpdAadwhXL6RpRbkJhVr-VrP7UHwR1C7mRJI9SOtd0MVLuJUrViIjX3yx1naUiblUPwk_ipnm72-mmGf7QELWnl0/s1600/ACg8ocKlDAVFDimnAUyl7Ji05wSkUNwgbwPLydcKfPbsqMxx20o%253Ds500-c" width="32"/></author></entry><entry><id>tag:blogger.com,1999:blog-2050150641290358499.post-3138262451878681861</id><published>2019-04-11T09:13:00.000+09:00</published><updated>2019-04-11T10:42:16.749+09:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Android"/><category scheme="http://www.blogger.com/atom/ns#" term="MetaTrader"/><title type="text">MT4 Android 版で Notification の音を変更する方法</title><content type="html">&lt;pre class="marked"&gt;
@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 の音を変更することが出来なくなっていました&lt;sup&gt;&lt;span class='barenote'&gt;少なくとも Android 9 Pie では&lt;/span&gt;&lt;/sup&gt;。

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

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

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

&lt;a name='more'&gt;&lt;/a&gt;

### アプリ内の設定では変更できない
アプリの設定で「お知らせリングトーン」(Notification Ringtone) を変更しても、相変わらず設定が反映されずデフォルトの音がなってしまいます。

&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjHCLZZmvt6Tk6h99LRdBqHKh7cHEkUj9gEbzDqL1tCQCuLB1sfGcwfAoRaJ5hcJDLAJSGs0tHgWz79h4ApEcL3T3xZ1CCY4VMlS-vK3ctuO7cHIZisL5Rhmi3MXV2F527BoJA_ouxUM_s/s1600/002.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjHCLZZmvt6Tk6h99LRdBqHKh7cHEkUj9gEbzDqL1tCQCuLB1sfGcwfAoRaJ5hcJDLAJSGs0tHgWz79h4ApEcL3T3xZ1CCY4VMlS-vK3ctuO7cHIZisL5Rhmi3MXV2F527BoJA_ouxUM_s/s640/002.png" width="360" height="640" data-original-width="900" data-original-height="1600" /&gt;&lt;/a&gt;&lt;/div&gt;


### Android の設定から変更する
代わりに、以下の方法で音を変更することが出来ます。

Android の設定画面から、「アプリと通知」(Apps &amp; notifications) を選択
&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhkpk4H4e6GjG9oyfysfSXylmiVNgHKRYHVNMXan3Nxr1uD8c_vQm7sCVArS6oeoYKYQbVILLFjZZK0c4Vx4A6rLLdTC8q2KiM64a4TpqBOyJioZ6PBeA24bGJtpvdtZoLQ3jRgM-9AHVg/s1600/003.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhkpk4H4e6GjG9oyfysfSXylmiVNgHKRYHVNMXan3Nxr1uD8c_vQm7sCVArS6oeoYKYQbVILLFjZZK0c4Vx4A6rLLdTC8q2KiM64a4TpqBOyJioZ6PBeA24bGJtpvdtZoLQ3jRgM-9AHVg/s640/003.png" width="360" height="640" data-original-width="900" data-original-height="1600" /&gt;&lt;/a&gt;&lt;/div&gt;

「MetaTrader 4」を選択（表示されていない場合は「xx個のアプリを全て表示」(See all xx apps) から選択）
&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgjtMGrbAjkpNQFHo2znC9lJ_0lCRFaHNVH_wor-lZSkZdciq9gVd0C92NfN9OEOPzMNuRn9zH57UG2KwRkp7aNx-E6NHM8IFV07MNn7Jq-FhHpsGyvyyQwBMGUSdpGWcjc4STKBvYruHY/s1600/004.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgjtMGrbAjkpNQFHo2znC9lJ_0lCRFaHNVH_wor-lZSkZdciq9gVd0C92NfN9OEOPzMNuRn9zH57UG2KwRkp7aNx-E6NHM8IFV07MNn7Jq-FhHpsGyvyyQwBMGUSdpGWcjc4STKBvYruHY/s640/004.png" width="360" height="640" data-original-width="900" data-original-height="1600" /&gt;&lt;/a&gt;&lt;/div&gt;

「通知」(Notifications) を選択
&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhYRfn6wFxabPY8IROPkQUCPvGixgQ7ZiGhA3roU1Is2AAuOmQCwSoxpGTASkMS_cqRKEBoyzZ7kp_TlGpIGdL2sC-Le3kqw92K4TKcT5qUwt1LqwvxzhvjN6KNdZ1FtkiSf6PWzqUurb0/s1600/005.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhYRfn6wFxabPY8IROPkQUCPvGixgQ7ZiGhA3roU1Is2AAuOmQCwSoxpGTASkMS_cqRKEBoyzZ7kp_TlGpIGdL2sC-Le3kqw92K4TKcT5qUwt1LqwvxzhvjN6KNdZ1FtkiSf6PWzqUurb0/s640/005.png" width="360" height="640" data-original-width="900" data-original-height="1600" /&gt;&lt;/a&gt;&lt;/div&gt;

「MetaTrader Terminal」を選択
&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjBjoccKRRwLbHPVM0M3z7pE_3bWBq3o8_Vg45FJGaUNWW-ItH7TVP4KgLTCCSFgDcEkA1ysEIGGtVQmwrVgsYjiTy-rnO3a0sEGjYEW9ECgA4xqQVn_nAw8b-fKknRCTMZEaQ1TZYezxA/s1600/006.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjBjoccKRRwLbHPVM0M3z7pE_3bWBq3o8_Vg45FJGaUNWW-ItH7TVP4KgLTCCSFgDcEkA1ysEIGGtVQmwrVgsYjiTy-rnO3a0sEGjYEW9ECgA4xqQVn_nAw8b-fKknRCTMZEaQ1TZYezxA/s640/006.png" width="360" height="640" data-original-width="900" data-original-height="1600" /&gt;&lt;/a&gt;&lt;/div&gt;

「詳細設定」(Advanced) を選択
&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiEu15E1JuyEvjXcH9pnCoPbcohr0n2iTBwrAoysASM_RtIgmJF9IeE02DVBSOMsCnxdbkWpuNtRuKesFeuP5jVxyU8MEzTMo_5RQ0EOPYPhVRufwj3QtiYDxxRJyb4BMWTNrSdjx_YaEc/s1600/007.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiEu15E1JuyEvjXcH9pnCoPbcohr0n2iTBwrAoysASM_RtIgmJF9IeE02DVBSOMsCnxdbkWpuNtRuKesFeuP5jVxyU8MEzTMo_5RQ0EOPYPhVRufwj3QtiYDxxRJyb4BMWTNrSdjx_YaEc/s640/007.png" width="360" height="640" data-original-width="900" data-original-height="1600" /&gt;&lt;/a&gt;&lt;/div&gt;

「音」(Sound) を選択
&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhZsjXonKjFlk-q_olgCD2YqATDXL2jpJqnLyPRb6ETMZjF9g3Cp41zoBO1sAa0NjWJDEuyf4IRnn7LWAerMxYRvkYhz73LVlK-QHvlzvVVpU2HLoknT_bdhGdA0ZsBtY4JeiZDEtrzr1c/s1600/008.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhZsjXonKjFlk-q_olgCD2YqATDXL2jpJqnLyPRb6ETMZjF9g3Cp41zoBO1sAa0NjWJDEuyf4IRnn7LWAerMxYRvkYhz73LVlK-QHvlzvVVpU2HLoknT_bdhGdA0ZsBtY4JeiZDEtrzr1c/s640/008.png" width="360" height="640" data-original-width="900" data-original-height="1600" /&gt;&lt;/a&gt;&lt;/div&gt;

任意の音を選択
&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEivAQt3G0EckddjVjBIN7aaO97tc2qjA1_DI9q8l8Pi49e19yWQOzBDq9eSplfWwp-OhIUfOROTYJJuWRU39vzpQt78p0hCThME5qaSlml1uK8TpZDLRf5z8KNPDqXhLyL_3KbYJA_L_Zo/s1600/009.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEivAQt3G0EckddjVjBIN7aaO97tc2qjA1_DI9q8l8Pi49e19yWQOzBDq9eSplfWwp-OhIUfOROTYJJuWRU39vzpQt78p0hCThME5qaSlml1uK8TpZDLRf5z8KNPDqXhLyL_3KbYJA_L_Zo/s640/009.png" width="360" height="640" data-original-width="900" data-original-height="1600" /&gt;&lt;/a&gt;&lt;/div&gt;

選択した後、「保存」を押さないと元に戻ってしまうので注意しましょう。
&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEggAFko-yM_ENVvNtooUJ4boNWl4GehQCE0aysBmsTGIYjMTSTvRx2QXc4Ef6EB4pa-tu5cQLPbfbQ9OUzDBPIxYvE13GjA9WBQJ95n61Uwfgj7yCPTk7F6y_PBlhE_ZQf5xVoNti0LQt0/s1600/010.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEggAFko-yM_ENVvNtooUJ4boNWl4GehQCE0aysBmsTGIYjMTSTvRx2QXc4Ef6EB4pa-tu5cQLPbfbQ9OUzDBPIxYvE13GjA9WBQJ95n61Uwfgj7yCPTk7F6y_PBlhE_ZQf5xVoNti0LQt0/s640/010.png" width="360" height="640" data-original-width="900" data-original-height="1600" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;/pre&gt;

なお、バイブレーションもアプリ内設定は反映されませんが、上記の方法なら変更することが可能です。
&lt;div class='barenote_ref_list'&gt;&lt;/div&gt;</content><link href="https://www.blogger.com/feeds/2050150641290358499/posts/default/3138262451878681861" rel="edit" type="application/atom+xml"/><link href="https://www.blogger.com/feeds/2050150641290358499/posts/default/3138262451878681861" rel="self" type="application/atom+xml"/><link href="https://strategyofc.blogspot.com/2019/04/mt4-android-notification.html" rel="alternate" title="MT4 Android 版で Notification の音を変更する方法" type="text/html"/><author><name>Yusuke</name><uri>http://www.blogger.com/profile/01684623000819625562</uri><email>noreply@blogger.com</email><gd:image height="32" rel="http://schemas.google.com/g/2005#thumbnail" src="//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiquu1685bSenxd0V6J4yvcDUazx1i_-RXZ3mHILzptpdAadwhXL6RpRbkJhVr-VrP7UHwR1C7mRJI9SOtd0MVLuJUrViIjX3yx1naUiblUPwk_ipnm72-mmGf7QELWnl0/s1600/ACg8ocKlDAVFDimnAUyl7Ji05wSkUNwgbwPLydcKfPbsqMxx20o%253Ds500-c" width="32"/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" height="72" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjHCLZZmvt6Tk6h99LRdBqHKh7cHEkUj9gEbzDqL1tCQCuLB1sfGcwfAoRaJ5hcJDLAJSGs0tHgWz79h4ApEcL3T3xZ1CCY4VMlS-vK3ctuO7cHIZisL5Rhmi3MXV2F527BoJA_ouxUM_s/s72-c/002.png" width="72"/></entry><entry><id>tag:blogger.com,1999:blog-2050150641290358499.post-6005435143973379089</id><published>2019-04-04T23:54:00.000+09:00</published><updated>2019-04-11T03:20:08.974+09:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="MetaTrader"/><title type="text">[MT4] tester cannot calculate prices が出てしまった場合の対処方法</title><content type="html">&lt;pre class="marked"&gt;
昨日まで使えていた EA でテストをしようとしたところ、"tester cannot calculate prices" というエラーが出て、動かなくなってしまいました。
エラーの前に "margin exchange rate cannot be calculated" という警告が出ているのも気になります。

&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhzN5EEBLrr15T3oX-TuJVLPN9Spfy56n-Ef2ljGBciQ7aaPkl6xS8MjHQDCqZUacNPAlW4DfSCncoA0aS_nQ-BYrCQDdhfYqObXmfp1djvrZZbbPDW5oKH-DiFtHtvTMaTTogM9aMO8qE/s1600/001.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhzN5EEBLrr15T3oX-TuJVLPN9Spfy56n-Ef2ljGBciQ7aaPkl6xS8MjHQDCqZUacNPAlW4DfSCncoA0aS_nQ-BYrCQDdhfYqObXmfp1djvrZZbbPDW5oKH-DiFtHtvTMaTTogM9aMO8qE/s1600/001.png" data-original-width="517" data-original-height="205" /&gt;&lt;/a&gt;&lt;/div&gt;

調べてみたところ、以下のような条件下でおこるようです&lt;sup&gt;&lt;span class='barenote'&gt;条件が AND か OR か不確定&lt;/span&gt;&lt;/sup&gt;。

- "Expert properties"（エキスパート設定）の "Initial deposit currency"（初期証拠金通貨）がブローカーのものと異なる
- テストの "Symbol" （通貨ペア）が直接計算できない&lt;sup&gt;&lt;span class='barenote'&gt;例えば、証拠金を「USD」にしていて、「EURJPY」で計算しようとしている場合など&lt;/span&gt;&lt;/sup&gt;
- サーバーと通信出来ていない

&lt;a name='more'&gt;&lt;/a&gt;

&gt; 参考
&gt;
&gt; [Tester: exchange rate cannot be calculated - Forex Forum - MQL4 and MetaTrader 4 - MQL4 programming forum](https://www.mql5.com/en/forum/128233)

### 対策1 テスト用の通貨を変更する
"Expert properties"（エキスパート設定） を開きます&lt;sup&gt;&lt;span class='barenote'&gt;日本語の環境で再現しなかったので、英語のキャプチャになっています&lt;/span&gt;&lt;/sup&gt;。
&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhdxIl5mkgK2wg9rawr7cXjTDGdtTTbR1Hric4s1hXQ8eLFoORj61zuvbtVQ9PS-BlzTy4Fav-gMc0YbtrZ4IWcicbCLS3ARVdV5-vd9HJ1_moiqnb570KqdJvTW3dKIAsWvJ_ezuPB8wM/s1600/Selection_005.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhdxIl5mkgK2wg9rawr7cXjTDGdtTTbR1Hric4s1hXQ8eLFoORj61zuvbtVQ9PS-BlzTy4Fav-gMc0YbtrZ4IWcicbCLS3ARVdV5-vd9HJ1_moiqnb570KqdJvTW3dKIAsWvJ_ezuPB8wM/s1600/Selection_005.png" data-original-width="336" data-original-height="182" /&gt;&lt;/a&gt;&lt;/div&gt;

"Testing"（テスト設定）タブを選択し、
"Initial deposit"（初期証拠金）の通貨を変更します。
&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjAahNJSCyFEH6wgS16qN3utenCxvsU1G3ddLFDqp6wgkJemH7jD2uMR6FCXzp1heJ0LUvzyzhJKSm4RvpW9wpiL8eaN1jb3CZ-05uLcgHtC2sBZtcDLk-pQ66kw8o1uhmKA-qSGQHGRMo/s1600/CTest_003.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjAahNJSCyFEH6wgS16qN3utenCxvsU1G3ddLFDqp6wgkJemH7jD2uMR6FCXzp1heJ0LUvzyzhJKSm4RvpW9wpiL8eaN1jb3CZ-05uLcgHtC2sBZtcDLk-pQ66kw8o1uhmKA-qSGQHGRMo/s1600/CTest_003.png" data-original-width="362" data-original-height="116" /&gt;&lt;/a&gt;&lt;/div&gt;

基本的には、ブローカーの通貨（日本のブローカーなら"JPY"）にすると大丈夫のようです。

テストしたい通貨ペアの Base Currency （"USDJPY" なら "JPY", "EURUSD" なら "USD"、基本的に後側の通貨）にしても大丈夫かもしれません。


### 対策2 サーバーに接続する
対策1でも駄目なら、サーバーに接続するとうまくいくかもしれません&lt;sup&gt;&lt;span class='barenote'&gt;サーバーに接続すると、ヒストリーデータを勝手に上書きしたりするので注意&lt;/span&gt;&lt;/sup&gt;。

一度、サーバーに接続してからテストを実行し、その後オフラインにしても問題はなさそうです。


### 原因は？
今回、複数ある環境で再現実験をしてみたのですが、再現しないものもありました。
サーバーから何らかの情報を受け取っていて、その情報が足りないと起こるようです。

あくまで推測ですが、多分以下のようなことではないかと思います。

例えば、"Initial deposit"（初期証拠金）通貨を "USD" にしてあり、「"EURJPY" を 101.315円で買う」という処理が走ったとします。
この時、証拠金計算のために JPY -&gt; USD の換算が必要になりますが、その換算が出来なかった場合、エラーになるのだろうと思います。

1. 変換用レートがどこかに保存されているはずなので、それを使用
1. 換算レートが保存されていなかった場合、サーバーに問い合わせ
1. サーバーに接続できなかったらエラー




&lt;/pre&gt;
&lt;div class='barenote_ref_list'&gt;&lt;/div&gt;</content><link href="https://www.blogger.com/feeds/2050150641290358499/posts/default/6005435143973379089" rel="edit" type="application/atom+xml"/><link href="https://www.blogger.com/feeds/2050150641290358499/posts/default/6005435143973379089" rel="self" type="application/atom+xml"/><link href="https://strategyofc.blogspot.com/2019/04/mt4-tester-cannot-calculate-prices.html" rel="alternate" title="[MT4] tester cannot calculate prices が出てしまった場合の対処方法" type="text/html"/><author><name>Yusuke</name><uri>http://www.blogger.com/profile/01684623000819625562</uri><email>noreply@blogger.com</email><gd:image height="32" rel="http://schemas.google.com/g/2005#thumbnail" src="//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiquu1685bSenxd0V6J4yvcDUazx1i_-RXZ3mHILzptpdAadwhXL6RpRbkJhVr-VrP7UHwR1C7mRJI9SOtd0MVLuJUrViIjX3yx1naUiblUPwk_ipnm72-mmGf7QELWnl0/s1600/ACg8ocKlDAVFDimnAUyl7Ji05wSkUNwgbwPLydcKfPbsqMxx20o%253Ds500-c" width="32"/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" height="72" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhzN5EEBLrr15T3oX-TuJVLPN9Spfy56n-Ef2ljGBciQ7aaPkl6xS8MjHQDCqZUacNPAlW4DfSCncoA0aS_nQ-BYrCQDdhfYqObXmfp1djvrZZbbPDW5oKH-DiFtHtvTMaTTogM9aMO8qE/s72-c/001.png" width="72"/></entry><entry><id>tag:blogger.com,1999:blog-2050150641290358499.post-2388936674676657455</id><published>2019-03-09T00:19:00.000+09:00</published><updated>2019-03-09T00:19:01.075+09:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="MQL4"/><title type="text">[MQL4] MarketInfo で値が取れない時は気配値表示ウィンドウを確認する</title><content type="html">&lt;pre class="marked"&gt;
気配値表示ウィンドウに対象の通貨ペアを表示していない場合、基本的に [MarketInfo()](https://docs.mql4.com/marketinformation/marketinfo) の値は取得できません&lt;sup&gt;&lt;span class='barenote'&gt;値が0になってしまう&lt;/span&gt;&lt;/sup&gt;。

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

&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjkhFodChRG3zMb_IBng8p1Tt5axbDOKo9Ef8YrS_4uJNwy-3FkUL6E3cH2F5I00Sx-Hi9OCCcnQJsjtZ3P8UEAabvNh4MEkm2Bq3K4qOLUTbhApeK0FCWUy5aCnWN_mE1NASCWY2twdBw/s1600/001.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjkhFodChRG3zMb_IBng8p1Tt5axbDOKo9Ef8YrS_4uJNwy-3FkUL6E3cH2F5I00Sx-Hi9OCCcnQJsjtZ3P8UEAabvNh4MEkm2Bq3K4qOLUTbhApeK0FCWUy5aCnWN_mE1NASCWY2twdBw/s1600/001.png" data-original-width="189" data-original-height="466" /&gt;&lt;/a&gt;&lt;/div&gt;

&lt;a name='more'&gt;&lt;/a&gt;

「基本的に」と書いたのは、ストラテジーテスターの場合、一定の条件を満たせば取得できる場合もあるからです。

&gt; 参考
&gt;
&gt; [[MQL4] ストラテジーテスターの中では SymbolInfo や MarketInfo が取得できない時がある | Strategy of C](https://strategyofc.blogspot.com/2019/03/mql4-symbolinfo-marketinfo.html)

この条件、公式のドキュメントには記載がありません。
必ず気配値表示ウィンドウに対象の通貨ペアを表示するようにしておいた方が良いでしょう。

&lt;/pre&gt;
&lt;div class='barenote_ref_list'&gt;&lt;/div&gt;</content><link href="https://www.blogger.com/feeds/2050150641290358499/posts/default/2388936674676657455" rel="edit" type="application/atom+xml"/><link href="https://www.blogger.com/feeds/2050150641290358499/posts/default/2388936674676657455" rel="self" type="application/atom+xml"/><link href="https://strategyofc.blogspot.com/2019/03/mql4-marketinfo.html" rel="alternate" title="[MQL4] MarketInfo で値が取れない時は気配値表示ウィンドウを確認する" type="text/html"/><author><name>Yusuke</name><uri>http://www.blogger.com/profile/01684623000819625562</uri><email>noreply@blogger.com</email><gd:image height="32" rel="http://schemas.google.com/g/2005#thumbnail" src="//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiquu1685bSenxd0V6J4yvcDUazx1i_-RXZ3mHILzptpdAadwhXL6RpRbkJhVr-VrP7UHwR1C7mRJI9SOtd0MVLuJUrViIjX3yx1naUiblUPwk_ipnm72-mmGf7QELWnl0/s1600/ACg8ocKlDAVFDimnAUyl7Ji05wSkUNwgbwPLydcKfPbsqMxx20o%253Ds500-c" width="32"/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" height="72" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjkhFodChRG3zMb_IBng8p1Tt5axbDOKo9Ef8YrS_4uJNwy-3FkUL6E3cH2F5I00Sx-Hi9OCCcnQJsjtZ3P8UEAabvNh4MEkm2Bq3K4qOLUTbhApeK0FCWUy5aCnWN_mE1NASCWY2twdBw/s72-c/001.png" width="72"/></entry><entry><id>tag:blogger.com,1999:blog-2050150641290358499.post-6987283784287388739</id><published>2019-03-08T02:21:00.000+09:00</published><updated>2019-04-11T07:59:41.302+09:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="MQL4"/><title type="text">[MQL4] ストラテジーテスターの中では SymbolInfo や MarketInfo が取得できない時がある</title><content type="html">&lt;pre class="marked"&gt;
@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) 等の関数はストラテジーテスターの中では動作しない時があるので注意が必要です。

&lt;a name='more'&gt;&lt;/a&gt;

### 通貨ペアで指定した通貨以外の情報は SymbolInfo では取得できない
具体的には、ストラテジーテスターの「通貨ペア」で指定した通貨と関数で指定した通貨が異なる場合です。

例えば、以下のように、ストラテジーテスターの「通貨ペア」を「USDJPY」にして、EA内で「EURUSD」の情報を取ってみます。

&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhwIimXEj_AUErpM6gpuXvML6hCJau6yzGNoWKaEeYGLFa49MYAe6SYC0QiUg4HaRUFtg1_LN5cXXEUlz8hfOCxAIPK7hTxBJdyQu-X0uTGFWAKq6HdZbJ0yBBSSb-M5XfAB1PcigdTamI/s1600/001.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhwIimXEj_AUErpM6gpuXvML6hCJau6yzGNoWKaEeYGLFa49MYAe6SYC0QiUg4HaRUFtg1_LN5cXXEUlz8hfOCxAIPK7hTxBJdyQu-X0uTGFWAKq6HdZbJ0yBBSSb-M5XfAB1PcigdTamI/s1600/001.png" data-original-width="279" data-original-height="80" /&gt;&lt;/a&gt;&lt;/div&gt;

```mq4
Print("SymbolInfo: ", SymbolInfoDouble("EURUSD", SYMBOL_POINT));
Print("MarketInfo: ", MarketInfo("EURUSD", MODE_POINT));
```

結果は以下のようになります&lt;sup&gt;&lt;span class='barenote'&gt;後述のように、環境によって結果が異なります&lt;/span&gt;&lt;/sup&gt;。
```text
`gutter: false;
MarketInfo: 1e-05
SymbolInfo: 0.0
```

ご覧のように [MarketInfo()](https://docs.mql4.com/marketinformation/marketinfo) は問題なく取得できています。
ただし、この `MarketInfo()` も特定の条件が整わないと値を取ることはできません。


### MarketInfo も取得できない時がある
`MarketInfo()` でも値が取得できないのは、気配値表示ウィンドウに表示されておらず、かつストラテジーテスターの「通貨ペア」で指定していない場合です。

例えば、以下のように、気配値表示ウィンドウに「EURUSD」を非表示にした状態で、上記と同様のストラテジーテスターを走らせます&lt;sup&gt;&lt;span class='barenote'&gt;通貨ペアは「USDJPY」&lt;/span&gt;&lt;/sup&gt;。

&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjzGUvzNjjnVb1qUhZAjRkk_1QKzyszZJU2rKFYjKHOtGEiYc9jZoktTvrFlMInmvdwUsHjPFHGk3BLIyY8r6cAfeSkHTbAZuULnrViWN2DdtymhxoonHRg1_Qf0tMgbs2fAj3UyRkgcMA/s1600/002.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjzGUvzNjjnVb1qUhZAjRkk_1QKzyszZJU2rKFYjKHOtGEiYc9jZoktTvrFlMInmvdwUsHjPFHGk3BLIyY8r6cAfeSkHTbAZuULnrViWN2DdtymhxoonHRg1_Qf0tMgbs2fAj3UyRkgcMA/s1600/002.png" data-original-width="220" data-original-height="90" /&gt;&lt;/a&gt;&lt;/div&gt;

結果は以下のようになります。
```text
`gutter: false;
MarketInfo: 0.0
SymbolInfo: 0.0
```

ただし、起動後一度でもストラテジーテスターで対象の通貨&lt;sup&gt;&lt;span class='barenote'&gt;例だと「EURUSD」&lt;/span&gt;&lt;/sup&gt;を指定していると、値が取得できるようです。
データのキャッシュが残っているためだと思われますが、正確にはよくわかりません。

他の条件はよくわかりませんが、気配値表示ウィンドウに表示されていれば `MarketInfo()` の情報は取れるようです。
表示し忘れに気をつけましよう。

なお、気配値表示ウィンドウから通貨を削除してしまうとリアルEA実行中も `MarketInfo()` の情報が取れなくなってしまいます&lt;sup&gt;&lt;span class='barenote'&gt;`SymbolInfo` は気配値表示ウィンドウになくても取れる&lt;/span&gt;&lt;/sup&gt;。
こちらも気をつけましょう。

&lt;/pre&gt;
&lt;div class='barenote_ref_list'&gt;&lt;/div&gt;</content><link href="https://www.blogger.com/feeds/2050150641290358499/posts/default/6987283784287388739" rel="edit" type="application/atom+xml"/><link href="https://www.blogger.com/feeds/2050150641290358499/posts/default/6987283784287388739" rel="self" type="application/atom+xml"/><link href="https://strategyofc.blogspot.com/2019/03/mql4-symbolinfo-marketinfo.html" rel="alternate" title="[MQL4] ストラテジーテスターの中では SymbolInfo や MarketInfo が取得できない時がある" type="text/html"/><author><name>Yusuke</name><uri>http://www.blogger.com/profile/01684623000819625562</uri><email>noreply@blogger.com</email><gd:image height="32" rel="http://schemas.google.com/g/2005#thumbnail" src="//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiquu1685bSenxd0V6J4yvcDUazx1i_-RXZ3mHILzptpdAadwhXL6RpRbkJhVr-VrP7UHwR1C7mRJI9SOtd0MVLuJUrViIjX3yx1naUiblUPwk_ipnm72-mmGf7QELWnl0/s1600/ACg8ocKlDAVFDimnAUyl7Ji05wSkUNwgbwPLydcKfPbsqMxx20o%253Ds500-c" width="32"/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" height="72" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhwIimXEj_AUErpM6gpuXvML6hCJau6yzGNoWKaEeYGLFa49MYAe6SYC0QiUg4HaRUFtg1_LN5cXXEUlz8hfOCxAIPK7hTxBJdyQu-X0uTGFWAKq6HdZbJ0yBBSSb-M5XfAB1PcigdTamI/s72-c/001.png" width="72"/></entry><entry><id>tag:blogger.com,1999:blog-2050150641290358499.post-4686467115913252532</id><published>2019-03-04T08:05:00.000+09:00</published><updated>2019-03-04T08:05:05.296+09:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="MQL4"/><title type="text">[MQL4] SYMBOL_TRADE_TICK_VALUE は過去の値がとれない</title><content type="html">&lt;pre class="marked"&gt;
[値幅を基準通貨の金額に換算する](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) も同様です。

&gt; 参考
&gt; 
&gt; [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)

&lt;/pre&gt;
</content><link href="https://www.blogger.com/feeds/2050150641290358499/posts/default/4686467115913252532" rel="edit" type="application/atom+xml"/><link href="https://www.blogger.com/feeds/2050150641290358499/posts/default/4686467115913252532" rel="self" type="application/atom+xml"/><link href="https://strategyofc.blogspot.com/2019/03/mql4-symboltradetickvalue.html" rel="alternate" title="[MQL4] SYMBOL_TRADE_TICK_VALUE は過去の値がとれない" type="text/html"/><author><name>Yusuke</name><uri>http://www.blogger.com/profile/01684623000819625562</uri><email>noreply@blogger.com</email><gd:image height="32" rel="http://schemas.google.com/g/2005#thumbnail" src="//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiquu1685bSenxd0V6J4yvcDUazx1i_-RXZ3mHILzptpdAadwhXL6RpRbkJhVr-VrP7UHwR1C7mRJI9SOtd0MVLuJUrViIjX3yx1naUiblUPwk_ipnm72-mmGf7QELWnl0/s1600/ACg8ocKlDAVFDimnAUyl7Ji05wSkUNwgbwPLydcKfPbsqMxx20o%253Ds500-c" width="32"/></author></entry><entry><id>tag:blogger.com,1999:blog-2050150641290358499.post-5274273288742131675</id><published>2019-01-17T08:21:00.000+09:00</published><updated>2019-04-11T07:58:07.044+09:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="MQL4"/><title type="text">[MQL4] ObjectDelete() をループ内で実行するときには decrement にする</title><content type="html">&lt;pre class="marked"&gt;
特定の Object をまとめて消したい時、以下のようにループで各オブジェクトを消したくなります。

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

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

&lt;a name='more'&gt;&lt;/a&gt;

ループの中で [ObjectDelete()](https://docs.mql4.com/objects/objectdelete) を実行しているため、
[ObjectsTotal()](https://docs.mql4.com/objects/objectstotal) の値が減っていってしまうためです。

では、先に `ObjectsTotal()` を変数に退避しておけばよいかというと、それもうまくいきません。
ループの後半になると、既に存在しないインデックスを参照してしまうため、[ObjectName()](https://docs.mql4.com/objects/objectname) が `""` （空文字列）を返すからです。

この手の、「イテレーティブなオブジェクトを参照しながら編集してはいけない」というのは、
プログラマが最初の方に覚えるノウハウです。
しかし、「ついやってしまう系」の代表でもあります&lt;sup&gt;&lt;span class='barenote'&gt;特に言語によって少しずつ扱いが異なるので&lt;/span&gt;&lt;/sup&gt;。

### 解決策
MQL4 の場合は以下のようにインデックスを decrement にするとうまくいきます。

```mq4
// OK
for (int i = ObjectsTotal(EMPTY) - 1; i &gt;=0 ; i--) {
    string objectName = ObjectName(i);
    ObjectDelete(objectName);
}
```

### 100% 確実ではない
しかし、この方法は Objects 配列の内部実装によるところが多いです。
今のところ、これでうまく動いていますが、100% 確実とは言えません。

たまたまかもしれませんし、将来、動作が変わる可能性もあります。

私は、「もし`ObjectName()` が取れなかったらエラーが出て止まる」で良いというスタンスで上記を使用しています&lt;sup&gt;&lt;span class='barenote'&gt;トレードに直接関わるようなオブジェクトの使い方をしていないので&lt;/span&gt;&lt;/sup&gt;。

リアルタイムのトレードサイン等のように、絶対間違って欲しくない時は、先に ObjectName のリストを保存しておき、それを用いて `ObjectDelete()` を実行した方が良いかもしれません。

### ObjectsDelteAll() の使用も検討する
自分でループするより、
まとめてオブジェクトを消すための関数、[ObjectsDelteAll()](https://docs.mql4.com/objects/objectsdeleteall) が使えないか検討するのも良いかと思います。

オブジェクトの種類や名前のプレフィックスで選択的に削除も出来ます&lt;sup&gt;&lt;span class='barenote'&gt;プレフィックスで削除できるのは実はこれを書いていて知った…&lt;/span&gt;&lt;/sup&gt;。
&lt;/pre&gt;
&lt;div class='barenote_ref_list'&gt;&lt;/div&gt;</content><link href="https://www.blogger.com/feeds/2050150641290358499/posts/default/5274273288742131675" rel="edit" type="application/atom+xml"/><link href="https://www.blogger.com/feeds/2050150641290358499/posts/default/5274273288742131675" rel="self" type="application/atom+xml"/><link href="https://strategyofc.blogspot.com/2019/01/mql4-objectdelete-decrement.html" rel="alternate" title="[MQL4] ObjectDelete() をループ内で実行するときには decrement にする" type="text/html"/><author><name>Yusuke</name><uri>http://www.blogger.com/profile/01684623000819625562</uri><email>noreply@blogger.com</email><gd:image height="32" rel="http://schemas.google.com/g/2005#thumbnail" src="//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiquu1685bSenxd0V6J4yvcDUazx1i_-RXZ3mHILzptpdAadwhXL6RpRbkJhVr-VrP7UHwR1C7mRJI9SOtd0MVLuJUrViIjX3yx1naUiblUPwk_ipnm72-mmGf7QELWnl0/s1600/ACg8ocKlDAVFDimnAUyl7Ji05wSkUNwgbwPLydcKfPbsqMxx20o%253Ds500-c" width="32"/></author></entry><entry><id>tag:blogger.com,1999:blog-2050150641290358499.post-8030580075529786915</id><published>2019-01-05T00:38:00.000+09:00</published><updated>2019-04-11T07:57:34.140+09:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Expert Advisor"/><category scheme="http://www.blogger.com/atom/ns#" term="MQL4"/><title type="text">[MQL4] OnTick() 内で Bid, Ask を更新する方法</title><content type="html">&lt;pre class="marked"&gt;
EA の `OnTick()` 処理中に Bid, Ask が更新されたとしても `Bid`, `Ask` 変数にこれらの値は反映されません。

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

&lt;a name='more'&gt;&lt;/a&gt;

### 動作確認
以下のような EA を作成して実行してみました。

```mq4
void OnTick()
{
    RefreshRates();
    printf("A  Ask: %s, Bid: %s, Volume: %d",
           DoubleToStr(Ask, Digits),
           DoubleToStr(Bid, Digits),
           Volume[0]);
           
    Sleep(10000);
    
    printf("B  Ask: %s, Bid: %s, Volume: %d",
           DoubleToStr(Ask, Digits),
           DoubleToStr(Bid, Digits),
           Volume[0]);

    RefreshRates();

    printf("C  Ask: %s, Bid: %s, Volume: %d",
           DoubleToStr(Ask, Digits),
           DoubleToStr(Bid, Digits),
           Volume[0]);
}
```

結果は以下です。
```
A  Ask: 109.119, Bid: 109.111, Volume: 2
// 10 秒待機
B  Ask: 109.119, Bid: 109.111, Volume: 2
// RefreshRates() 実行
C  Ask: 109.120, Bid: 109.112, Volume: 11
```

B では10秒前の情報が保持されています。`RefreshRates()` を実行すると最新の情報に更新されました。

### 戻り値について
`RefreshRates()` の戻り値はエラーではなく、更新できたかどうかです。
例えば、以下のように `OnTick()` の最初で `RefreshRate()` を呼んでも、ほぼ間違いなく `false` になります&lt;sup&gt;&lt;span class='barenote'&gt;100% ではない&lt;/span&gt;&lt;/sup&gt;。

```mq4
void OnTick()
{
    bool refreshed = RefreshRates();
    Print(refreshed);
}
```

### 注意点
`RefreshRates()` は他スレッドとの排他が発生しているはずです。
そのため、あまり頻繁に呼ぶと動作が遅くなる可能性があります。

ただ、私の手元では目立った遅延は確認できませんでした。
それなりのスペックを持ったマシンであれば、ほとんど気にする必要は無いと思いますが、念の為。

&lt;/pre&gt;
&lt;div class='barenote_ref_list'&gt;&lt;/div&gt;</content><link href="https://www.blogger.com/feeds/2050150641290358499/posts/default/8030580075529786915" rel="edit" type="application/atom+xml"/><link href="https://www.blogger.com/feeds/2050150641290358499/posts/default/8030580075529786915" rel="self" type="application/atom+xml"/><link href="https://strategyofc.blogspot.com/2019/01/mql4-ontick-bid-ask.html" rel="alternate" title="[MQL4] OnTick() 内で Bid, Ask を更新する方法" type="text/html"/><author><name>Yusuke</name><uri>http://www.blogger.com/profile/01684623000819625562</uri><email>noreply@blogger.com</email><gd:image height="32" rel="http://schemas.google.com/g/2005#thumbnail" src="//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiquu1685bSenxd0V6J4yvcDUazx1i_-RXZ3mHILzptpdAadwhXL6RpRbkJhVr-VrP7UHwR1C7mRJI9SOtd0MVLuJUrViIjX3yx1naUiblUPwk_ipnm72-mmGf7QELWnl0/s1600/ACg8ocKlDAVFDimnAUyl7Ji05wSkUNwgbwPLydcKfPbsqMxx20o%253Ds500-c" width="32"/></author></entry><entry><id>tag:blogger.com,1999:blog-2050150641290358499.post-4473886337689891943</id><published>2019-01-04T09:01:00.000+09:00</published><updated>2019-06-09T13:44:25.342+09:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="MQL4"/><title type="text">[MQL4] 他通貨の Bid, Ask を取得する方法2種</title><content type="html">&lt;pre class="marked"&gt;
他通貨のバー情報を取得するには [iHigh()](https://docs.mql4.com/series/ihigh) 等の関数が使えます。
通常はこれで十分なのですが、リアルタイムで Bid, Ask の情報を取得したいことも時としてあります。

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

&lt;a name='more'&gt;&lt;/a&gt;

### SymbolInfoDouble() を使う方法
[SymbolInfoDouble()](https://docs.mql4.com/marketinformation/symbolinfodouble) を使うと以下のように他通貨の Bid, Ask を取得することが可能です。

```mq4
string symbol = "EURUSD";
double eurusd_bid = SymbolInfoDouble(symbol, SYMBOL_BID);
double eurusd_ask = SymbolInfoDouble(symbol, SYMBOL_ASK);
```

実運用時には、何らかのエラーで値を取得できなかった場合にメールを送るなどの処理をしておくべきでしょう。
エラーハンドリングは以下のようにします。

```mq4
string symbol = "EURUSD";
double eurusd_bid;
if (!SymbolInfoDouble(symbol, SYMBOL_BID, eurusd_bid)) {
    int error = GetLastError();
    // TODO Error handling
}
double eurusd_ask;
if (!SymbolInfoDouble(symbol, SYMBOL_ASK, eurusd_ask)) {
    int error = GetLastError();
    // TODO Error handling
}
```

エラーとして取得できるのは以下のようです。
- 4106 — 通貨が「気配値表示」 ウィンドウに表示されていない
- 4051 — symbol 名が間違っている
- 4024 — 内部エラー

&gt; 参考
&gt; - [SymbolInfoDouble - Market Info - MQL4 Reference](https://docs.mql4.com/marketinformation/symbolinfodouble)
&gt; - [Symbol Properties - Environment State - Constants, Enumerations and Structures - MQL4 Reference](https://docs.mql4.com/constants/environment_state/marketinfoconstants#enum_symbol_info_double)


###  SymbolInfoTick() を使用する方法
[SymbolInfoTick()](https://docs.mql4.com/marketinformation/symbolinfotick) でも他通貨の Bid, Ask を取得する事が出来ます。

```mq4
string symbol = "EURUSD";
MqlTick tick;
if (!SymbolInfoTick(symbol, tick)) {
    int error = GetLastError();
    // TODO Error handling
} else {
   // Print(tick.bid, tick.ask);
}
```

こちらはリファレンスにエラー番号一覧が無いのですが、`SymbolInfoDouble()` とほぼ同じ値が返ってくるようです。

&gt; 参考
&gt;
&gt; [SymbolInfoTick - Market Info - MQL4 Reference](https://docs.mql4.com/marketinformation/symbolinfotick)

### 注意点
上記の関数に限らず、`SymbolInfoxxx()` という関数は、以下のような制約があるので注意が必要です&lt;sup&gt;&lt;span class='barenote'&gt;`iHigh()` 等はこの限りではない&lt;/span&gt;&lt;/sup&gt;。

#### 「気配値表示」 ウィンドウに表示していない通貨の情報はとれない
上記のエラー `4106` を見ると明らかなのですが、「気配値表示」ウィンドウに通貨を表示していない場合、値を取得することができません。

&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiumLCzdZehZNrnPGN4R-0naNUGxrPZQifrlUhcJKUL_r3oJLW25PzRj5SWDim034Tk0LyHX_rZQZlFF1218Dk3ZwI7t08lRALrH5Ba3TUEab1tTz2xLJw1ak2p9t7HpJu5gzTWoivtNOQ/s1600/001.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiumLCzdZehZNrnPGN4R-0naNUGxrPZQifrlUhcJKUL_r3oJLW25PzRj5SWDim034Tk0LyHX_rZQZlFF1218Dk3ZwI7t08lRALrH5Ba3TUEab1tTz2xLJw1ak2p9t7HpJu5gzTWoivtNOQ/s1600/001.png" data-original-width="189" data-original-height="466" /&gt;&lt;/a&gt;&lt;/div&gt;

#### ストラテジーテスター内では情報はとれない 
ストラテジーテスター内ではこれらの関数は 0 を返します。厄介なのは、エラーにならず、成功しているのに 0 を返すという点です。
なので、うっかりこれらの関数をストラテジーテスター内で使用してしまうと想定外の動作をしてしまう可能性が高いので注意が必要です。

バックテストで使用できない関数は扱いが非常に難しいです。
私は、結局これらの関数を実運用で使うことは諦めました。
&lt;/pre&gt;
&lt;div class='barenote_ref_list'&gt;&lt;/div&gt;</content><link href="https://www.blogger.com/feeds/2050150641290358499/posts/default/4473886337689891943" rel="edit" type="application/atom+xml"/><link href="https://www.blogger.com/feeds/2050150641290358499/posts/default/4473886337689891943" rel="self" type="application/atom+xml"/><link href="https://strategyofc.blogspot.com/2019/01/mql4-bid-ask-2.html" rel="alternate" title="[MQL4] 他通貨の Bid, Ask を取得する方法2種" type="text/html"/><author><name>Yusuke</name><uri>http://www.blogger.com/profile/01684623000819625562</uri><email>noreply@blogger.com</email><gd:image height="32" rel="http://schemas.google.com/g/2005#thumbnail" src="//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiquu1685bSenxd0V6J4yvcDUazx1i_-RXZ3mHILzptpdAadwhXL6RpRbkJhVr-VrP7UHwR1C7mRJI9SOtd0MVLuJUrViIjX3yx1naUiblUPwk_ipnm72-mmGf7QELWnl0/s1600/ACg8ocKlDAVFDimnAUyl7Ji05wSkUNwgbwPLydcKfPbsqMxx20o%253Ds500-c" width="32"/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" height="72" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiumLCzdZehZNrnPGN4R-0naNUGxrPZQifrlUhcJKUL_r3oJLW25PzRj5SWDim034Tk0LyHX_rZQZlFF1218Dk3ZwI7t08lRALrH5Ba3TUEab1tTz2xLJw1ak2p9t7HpJu5gzTWoivtNOQ/s72-c/001.png" width="72"/></entry><entry><id>tag:blogger.com,1999:blog-2050150641290358499.post-2567442833020989864</id><published>2019-01-03T06:36:00.000+09:00</published><updated>2019-04-11T03:20:08.577+09:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="MetaTrader"/><category scheme="http://www.blogger.com/atom/ns#" term="OANDA Japan"/><title type="text">OANDA Japan で v20 口座を作ったら新規注文できなくなった【解決済】</title><content type="html">&lt;pre class="marked"&gt;
昨年末に「【重要】OANDA Japan　NYサーバーにおける新取引システム【v20】への移行および口座移管のお知らせ」というメールが届きました。

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

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

&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhYJTe4PBMLBwy2zaJ3xA3rlZ29b_zdgLES3UM0gb-1mG3qSKyEfliqudr6YgTzWl5dyEou6Zq9-ZOzpdL4TfVfSMmgeBwnglfdxCCoYNan9Y4OWGMXzq5qIYtlra2fKMhcl2raxUcpIio/s1600/001.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhYJTe4PBMLBwy2zaJ3xA3rlZ29b_zdgLES3UM0gb-1mG3qSKyEfliqudr6YgTzWl5dyEou6Zq9-ZOzpdL4TfVfSMmgeBwnglfdxCCoYNan9Y4OWGMXzq5qIYtlra2fKMhcl2raxUcpIio/s1600/001.png" data-original-width="276" data-original-height="168" /&gt;&lt;/a&gt;&lt;/div&gt;


&lt;a name='more'&gt;&lt;/a&gt;

### 通貨ペアを更新しないといけない
おかしいと思って、先のメールを見直してみると、さらっと以下のページへのリンクが貼られていました。

[https://www.oanda.jp/info/549](https://www.oanda.jp/info/549)

その中で言及されていたのが、以下。

&gt; ※【v20】でMT4をご利用いただく場合、通貨ペア名の後ろに
&gt; サフィックスとして【-a】（ベーシックコース）または【-b】（プロコース）が追記され、デフォルトの通貨ペアとは異なる通貨ペア名となっています。

なるほど。

そういう大事なことはメールにも書いておいて欲しかった。
もしくはメールに中途半端な移管方法を書かず、リンク先を見てくださいって書いてあればまだマシだったんだけど…

まぁ、文句を言っていても仕方がないので、書いてあるように通貨ペアを更新してみました。

表示 → 通貨ペアリスト
&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjfRNw2Vs021SUR5gTDQ9N3vsgRWL5zH2Kx_dM3yWPi-UCs5AexlrLnRKU5JxZY-l5sXcrR2GJE5YCWewa9HpdotDk1ZKK3lNexOqPdF3p6da2A3IMXgmXuHwq6ykIQUdP88_V7DHTnOxU/s1600/002.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjfRNw2Vs021SUR5gTDQ9N3vsgRWL5zH2Kx_dM3yWPi-UCs5AexlrLnRKU5JxZY-l5sXcrR2GJE5YCWewa9HpdotDk1ZKK3lNexOqPdF3p6da2A3IMXgmXuHwq6ykIQUdP88_V7DHTnOxU/s1600/002.png" data-original-width="374" data-original-height="735" /&gt;&lt;/a&gt;&lt;/div&gt;

Gropup7-b の中に `-b` のついた通貨ペア一覧があったので選択。

すると、有効な通貨ペアが表示されました&lt;sup&gt;&lt;span class='barenote'&gt;スプレッドももとのまま&lt;/span&gt;&lt;/sup&gt;。

&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg7bNIFvMhurdFQUlvvk0UDnS3TQMAna8odkggs0upZ9qVm3vi0S0lnWZZ1RrhBGSDL59k9xzTr7LZ33wlF2rR4eB0s0z8NxrQpzUwPfHpgxJHkeWBqBJcWGPrD5tf9JuYVohGHpswpokY/s1600/003.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg7bNIFvMhurdFQUlvvk0UDnS3TQMAna8odkggs0upZ9qVm3vi0S0lnWZZ1RrhBGSDL59k9xzTr7LZ33wlF2rR4eB0s0z8NxrQpzUwPfHpgxJHkeWBqBJcWGPrD5tf9JuYVohGHpswpokY/s1600/003.png" data-original-width="276" data-original-height="184" /&gt;&lt;/a&gt;&lt;/div&gt;

これ、自動で移管された人の環境はどうなるんだろう？
私は、手動でやって、時間的にも余裕があったからよかったけど、いきなりこの状況になったら焦るなぁ。

&lt;/pre&gt;
&lt;div class='barenote_ref_list'&gt;&lt;/div&gt;</content><link href="https://www.blogger.com/feeds/2050150641290358499/posts/default/2567442833020989864" rel="edit" type="application/atom+xml"/><link href="https://www.blogger.com/feeds/2050150641290358499/posts/default/2567442833020989864" rel="self" type="application/atom+xml"/><link href="https://strategyofc.blogspot.com/2019/01/oanda-japan-v20.html" rel="alternate" title="OANDA Japan で v20 口座を作ったら新規注文できなくなった【解決済】" type="text/html"/><author><name>Yusuke</name><uri>http://www.blogger.com/profile/01684623000819625562</uri><email>noreply@blogger.com</email><gd:image height="32" rel="http://schemas.google.com/g/2005#thumbnail" src="//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiquu1685bSenxd0V6J4yvcDUazx1i_-RXZ3mHILzptpdAadwhXL6RpRbkJhVr-VrP7UHwR1C7mRJI9SOtd0MVLuJUrViIjX3yx1naUiblUPwk_ipnm72-mmGf7QELWnl0/s1600/ACg8ocKlDAVFDimnAUyl7Ji05wSkUNwgbwPLydcKfPbsqMxx20o%253Ds500-c" width="32"/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" height="72" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhYJTe4PBMLBwy2zaJ3xA3rlZ29b_zdgLES3UM0gb-1mG3qSKyEfliqudr6YgTzWl5dyEou6Zq9-ZOzpdL4TfVfSMmgeBwnglfdxCCoYNan9Y4OWGMXzq5qIYtlra2fKMhcl2raxUcpIio/s72-c/001.png" width="72"/></entry><entry><id>tag:blogger.com,1999:blog-2050150641290358499.post-1241932450201816121</id><published>2018-12-18T07:57:00.000+09:00</published><updated>2019-09-10T06:17:19.499+09:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="MetaTrader"/><category scheme="http://www.blogger.com/atom/ns#" term="Update"/><title type="text">MetaTrader 4 は勝手に再起動してアップデートすることがある</title><content type="html">&lt;pre class="marked"&gt;
本日、MetaTrader 4 を起動したら突然終了してしまいました。その後、数秒待つと自動で再起動し、以後問題なく動作しています。

実被害は無かったのですが、何が起こったのかログを確認してみたところ、アップデートが走ったようです。

&lt;a name='more'&gt;&lt;/a&gt;

```text
`title: "log/20181218.log （抜粋）";
LiveUpdate: updater - started for portable 'C:\Users\yusuke\MT4'
LiveUpdate: updater - start admin updater
MetaTrader 4 build 1090 stopped
LiveUpdate: admin updater - started for portable 'C:\Users\yusuke\MT4'
LiveUpdate: admin updater - try to close terminal
LiveUpdate: admin updater - files update started
LiveUpdate: copied from 'C:\Users\yusuke\AppData\Roaming\MetaQuotes\WebInstall\mt4clw\metaeditor.exe' to 'C:\Users\yusuke\MT4\metaeditor.exe'
LiveUpdate: copied from 'C:\Users\yusuke\AppData\Roaming\MetaQuotes\WebInstall\mt4clw\terminal.exe' to 'C:\Users\yusuke\MT4\terminal.exe'
LiveUpdate: admin updater - files update finished
LiveUpdate: admin updater - clean obsolete data
LiveUpdate: admin updater - finished for portable 'C:\Users\yusuke\MT4'
LiveUpdate: updater - start terminal
LiveUpdate: updater - finished for portable 'C:\Users\yusuke\MT4'
MetaTrader 4 build 1160 started (MetaQuotes Software Corp.)
```

バージョン番号を確認すると、Build 1160 (14 Dec 2018) になっていました&lt;sup&gt;&lt;span class='barenote'&gt;昨日までは Build 1090 (19 May 2017)&lt;/span&gt;&lt;/sup&gt;。

&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEismXltMYEfdqaS5nyAIqhrOGxTgzYcFM4zR5XO92Qho7P7IAVSfvpRZSYIIIFnQ5H5Lz3DCFCSgCm5E3dmLzAO5PbTozgTIqogxdRWss4wc-yLlG6DDkhX-ycec3Z9UP9VaCmAghyphenhyphenHkD4/s1600/001.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEismXltMYEfdqaS5nyAIqhrOGxTgzYcFM4zR5XO92Qho7P7IAVSfvpRZSYIIIFnQ5H5Lz3DCFCSgCm5E3dmLzAO5PbTozgTIqogxdRWss4wc-yLlG6DDkhX-ycec3Z9UP9VaCmAghyphenhyphenHkD4/s1600/001.png" data-original-width="179" data-original-height="268" /&gt;&lt;/a&gt;&lt;/div&gt;


### 起動直後に再起動することもある
複数インストールしてある MetaTrader 4 で動作を確認してみたところ、次のようなタイミングで再起動が走るようです。

- LiveUpdate がバックグラウンドでアップデートをダウンロードした時
- `%APPDATA%\MetaQuotes\WebInstall\mt4clw\` 以下&lt;sup&gt;&lt;span class='barenote'&gt;フォルダは環境によって微妙に違うかもしれません&lt;/span&gt;&lt;/sup&gt;にアップデートがあった場合

`%APPDATA%\MetaQuotes\WebInstall\mt4clw\` は複数インストールされている MetaTrader 4 で共通です。
どれか1つがアップデートを受信したら他のインストールもアップデートされる仕組みのようです。
通信量を減らせるのは良いのですが、起動した直後に突然再起動するので不具合かと疑ってしまいます。
せめて、「アップデートします」等のダイアログが出れば良いと思うのですが。
&lt;/pre&gt;
&lt;div class='barenote_ref_list'&gt;&lt;/div&gt;</content><link href="https://www.blogger.com/feeds/2050150641290358499/posts/default/1241932450201816121" rel="edit" type="application/atom+xml"/><link href="https://www.blogger.com/feeds/2050150641290358499/posts/default/1241932450201816121" rel="self" type="application/atom+xml"/><link href="https://strategyofc.blogspot.com/2018/12/metatrader-4.html" rel="alternate" title="MetaTrader 4 は勝手に再起動してアップデートすることがある" type="text/html"/><author><name>Yusuke</name><uri>http://www.blogger.com/profile/01684623000819625562</uri><email>noreply@blogger.com</email><gd:image height="32" rel="http://schemas.google.com/g/2005#thumbnail" src="//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiquu1685bSenxd0V6J4yvcDUazx1i_-RXZ3mHILzptpdAadwhXL6RpRbkJhVr-VrP7UHwR1C7mRJI9SOtd0MVLuJUrViIjX3yx1naUiblUPwk_ipnm72-mmGf7QELWnl0/s1600/ACg8ocKlDAVFDimnAUyl7Ji05wSkUNwgbwPLydcKfPbsqMxx20o%253Ds500-c" width="32"/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" height="72" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEismXltMYEfdqaS5nyAIqhrOGxTgzYcFM4zR5XO92Qho7P7IAVSfvpRZSYIIIFnQ5H5Lz3DCFCSgCm5E3dmLzAO5PbTozgTIqogxdRWss4wc-yLlG6DDkhX-ycec3Z9UP9VaCmAghyphenhyphenHkD4/s72-c/001.png" width="72"/></entry><entry><id>tag:blogger.com,1999:blog-2050150641290358499.post-349169773004715513</id><published>2018-12-05T12:27:00.000+09:00</published><updated>2019-04-11T22:51:29.261+09:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Android"/><category scheme="http://www.blogger.com/atom/ns#" term="MetaTrader"/><title type="text">MT4 Android 版の赤と緑の帯が表すもの</title><content type="html">&lt;pre class="marked"&gt;
Android 版 MetaTrader 4 を使用していると、時々オーダーの左端に赤や緑の帯が表示されます。

&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj-IaX7R3iQ4zIoBhaUqtYyf-E59WbMYHgXjPh0emx9U1XbL4CMPg2RRz65MPgjrExW9rvjdJPVwgDEWfdtqRZ38bVOeZ0av7jE4Gl-Y312Bjfh2b0lipOSNd5Gwy6BRdsaEqsIRAHy7aY/s1600/Screenshot_20181204-113647.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj-IaX7R3iQ4zIoBhaUqtYyf-E59WbMYHgXjPh0emx9U1XbL4CMPg2RRz65MPgjrExW9rvjdJPVwgDEWfdtqRZ38bVOeZ0av7jE4Gl-Y312Bjfh2b0lipOSNd5Gwy6BRdsaEqsIRAHy7aY/s640/Screenshot_20181204-113647.png" width="360" height="640" data-original-width="900" data-original-height="1600" /&gt;&lt;/a&gt;&lt;/div&gt;

気になって調べてみたのですが&lt;sup&gt;&lt;span class='barenote'&gt;私は基本的に EA で売買して、確認のためだけに Android 版を使用しているので、これまであまり気にしてこなかったのです…&lt;/span&gt;&lt;/sup&gt;、MetaTrader 5 のヘルプしか見つけられませんでした。
ただ、動作を確認してみたところ、MetaTrader 4 も 5 と同じように動作するようです。

&lt;a name='more'&gt;&lt;/a&gt;

### Trade （トレード）ページ
[Trade - MetaTrader 5 Android Help](https://www.metatrader5.com/en/mobile-trading/android/help/trade)
&gt; When approaching the market, the order background is colored in green.

「価格が近づくと、背景が緑になります」とのことですが、約定済みの場合は少し動作が異なるようです。

#### 未約定のもの
未約定のものは買い、売りに関わらず、指値・逆指値に近づく&lt;sup&gt;&lt;span class='barenote'&gt;「近づく」の定義がどれくらいなのかはブローカーによって異なるかもしれませんが、OANDA デモ口座 USDJPY だと 10 pips のようです&lt;/span&gt;&lt;/sup&gt;と緑になります。

&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjoN38TOQEYo9a3yrHqNldzhPB8soioGir8NSOf1uLJEmevLip69dbG5zVnZjCGb4JSZj0SrUOPyt55yMnI3E05Olt2H2G4T7REhqRHMBMMGwdjAAArG_5VPUrvng0k_twoDzX1tU1RMOY/s1600/Screenshot_20181204-122614.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjoN38TOQEYo9a3yrHqNldzhPB8soioGir8NSOf1uLJEmevLip69dbG5zVnZjCGb4JSZj0SrUOPyt55yMnI3E05Olt2H2G4T7REhqRHMBMMGwdjAAArG_5VPUrvng0k_twoDzX1tU1RMOY/s640/Screenshot_20181204-122614.png" width="360" height="640" data-original-width="900" data-original-height="1600" /&gt;&lt;/a&gt;&lt;/div&gt;

&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg9OTltqMLvwhZN_mNb1mMeI-dNRS3N9HmfuLBQyT1blxotDtuhBvvqLue6z1fNaOYy1GLB5do0fO1yen0DmA0xgpuY66qA0YaSIstOstV48Lie2s0RZBUGRNNNaZ47RhtIvqafm_lLPus/s1600/Screenshot_20181204-122253.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg9OTltqMLvwhZN_mNb1mMeI-dNRS3N9HmfuLBQyT1blxotDtuhBvvqLue6z1fNaOYy1GLB5do0fO1yen0DmA0xgpuY66qA0YaSIstOstV48Lie2s0RZBUGRNNNaZ47RhtIvqafm_lLPus/s640/Screenshot_20181204-122253.png" width="360" height="640" data-original-width="900" data-original-height="1600" /&gt;&lt;/a&gt;&lt;/div&gt;


#### 約定済みのもの
これはヘルプに記載がなかったのですが、動作確認をしてみると「ストップロスに近づくと赤、テイクプロフィットに近づくと緑」という動作をするようです。

ストップロスに近づいた場合
&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhD6phCNxS2VzDNtnu88ubI-yK_IyIeIX8oQCgDwi8VaQtkUgx3vbqbZjqgxK0xt4W8MNROm3K0ILQWiKKgvvE29XSBLEbl2roRvKdG50N6uZOjgtZLaOqUR2HESv0sdp5e7sDDkPmjkZk/s1600/Screenshot_20181204-134201.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhD6phCNxS2VzDNtnu88ubI-yK_IyIeIX8oQCgDwi8VaQtkUgx3vbqbZjqgxK0xt4W8MNROm3K0ILQWiKKgvvE29XSBLEbl2roRvKdG50N6uZOjgtZLaOqUR2HESv0sdp5e7sDDkPmjkZk/s640/Screenshot_20181204-134201.png" width="360" height="640" data-original-width="900" data-original-height="1600" /&gt;&lt;/a&gt;&lt;/div&gt;

テイクプロフィットに近づいた場合
&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgsxasmyT7deFShLbdu-oBY93sIfWXvtXPu3UuNVYtyfLQPeIrcZe7t-B0533OomT2QGcqed11UPPHeySQSy3rrvuHTQU4SNlYo9Bqd4CfuQ0zX4AIqbJqIx6Yo5CX10u3MwYVzCyoFlcE/s1600/Screenshot_20181204-121239.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgsxasmyT7deFShLbdu-oBY93sIfWXvtXPu3UuNVYtyfLQPeIrcZe7t-B0533OomT2QGcqed11UPPHeySQSy3rrvuHTQU4SNlYo9Bqd4CfuQ0zX4AIqbJqIx6Yo5CX10u3MwYVzCyoFlcE/s640/Screenshot_20181204-121239.png" width="360" height="640" data-original-width="900" data-original-height="1600" /&gt;&lt;/a&gt;&lt;/div&gt;

### History （履歴）ページ
[History - MetaTrader 5 Android Help](https://www.metatrader5.com/en/mobile-trading/android/help/history)
&gt; If a deal was executed as a result of triggering of Stop Loss, it is colored in red. If Take Profit triggered, the deal is colored in green.

「ストップロスにかかった履歴は赤、テイクプロフィットで手仕舞いした履歴は緑になります。」とのことです。

ストップロスにかかったものは赤なので、トレイリングストップ等で利益が出た場合も赤くなります。

&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhf9GVrhArkQECcF2-SJ2ZMyytGfHvxCLjcjA3jS1ryo4N7Zrt5Dna3bwlq6J4YySS8kQcPHuwvZKs3zHmKu3CD078p4e_HHwyyWe0rdz4eouyHWa8h5ylPMdfXm9tbKnK_uAOEP0DgfM4/s1600/Screenshot_20181204-134237.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhf9GVrhArkQECcF2-SJ2ZMyytGfHvxCLjcjA3jS1ryo4N7Zrt5Dna3bwlq6J4YySS8kQcPHuwvZKs3zHmKu3CD078p4e_HHwyyWe0rdz4eouyHWa8h5ylPMdfXm9tbKnK_uAOEP0DgfM4/s640/Screenshot_20181204-134237.png" width="360" height="640" data-original-width="900" data-original-height="1600" /&gt;&lt;/a&gt;&lt;/div&gt;

逆にテイクプロフィットで損失が出た場合、緑になります。

&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhlEtpaMvglWj9J0R7VDHoPQXlbULmMS2uKxVM36DQdmxYCkyyt31XEUZjzylyCNJVt6en4d8tD34xsi9elzrV5LMAJz08lYQc9Tt_t20SgagXDB8xXOF_jCuRqkI6d_SN8Xxw6KYY9Kcw/s1600/Screenshot_20181204-121639.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhlEtpaMvglWj9J0R7VDHoPQXlbULmMS2uKxVM36DQdmxYCkyyt31XEUZjzylyCNJVt6en4d8tD34xsi9elzrV5LMAJz08lYQc9Tt_t20SgagXDB8xXOF_jCuRqkI6d_SN8Xxw6KYY9Kcw/s640/Screenshot_20181204-121639.png" width="360" height="640" data-original-width="900" data-original-height="1600" /&gt;&lt;/a&gt;&lt;/div&gt;


### Quotes （気配値）ページ ＆ Trade （トレード）ページのアクションバー
余談ですが Quotes ページの各通貨には、現在オープン中の注文で利益が出ている時は青、損失が出ている場合は赤の三角形が表示されます。
&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEioEfRBaWlkxhRzz6pEBi4JsRXAL09ad6fCxZyU71rBftnKz8RWB4sHTH2KD9D59TrV3mftmmETXK04MoNXkZxRlzM_c_Koh6hKETE83iW9tyOM-7xMCpzLxm_Md9n04idLBdSOtvFGUAM/s1600/Screenshot_20181204-151616.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEioEfRBaWlkxhRzz6pEBi4JsRXAL09ad6fCxZyU71rBftnKz8RWB4sHTH2KD9D59TrV3mftmmETXK04MoNXkZxRlzM_c_Koh6hKETE83iW9tyOM-7xMCpzLxm_Md9n04idLBdSOtvFGUAM/s640/Screenshot_20181204-151616.png" width="360" height="640" data-original-width="900" data-original-height="1600" /&gt;&lt;/a&gt;&lt;/div&gt;

Trade ページのアクションバーはトータルで利益が出ている場合は青、損失が出ている場合は赤くなります&lt;sup&gt;&lt;span class='barenote'&gt;Quotes でも変わってくれた方がわかりやすい気がする&lt;/span&gt;&lt;/sup&gt;。
&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEge6mLW4dSfZyvSEwGUAhiQgbD1NnV2gJ1BTMRCc2CAxhH_5ZrM31GX97Pz7lbJCnUC6ZvQSHXcxz1JVdhT4GtQOoB2NwzLDr-TJRyRrYHkoB0U9cagg7IxarFIJ9a9M0mw3Ny2sZiPlJQ/s1600/Screenshot_20181204-151605.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEge6mLW4dSfZyvSEwGUAhiQgbD1NnV2gJ1BTMRCc2CAxhH_5ZrM31GX97Pz7lbJCnUC6ZvQSHXcxz1JVdhT4GtQOoB2NwzLDr-TJRyRrYHkoB0U9cagg7IxarFIJ9a9M0mw3Ny2sZiPlJQ/s640/Screenshot_20181204-151605.png" width="360" height="640" data-original-width="900" data-original-height="1600" /&gt;&lt;/a&gt;&lt;/div&gt;

&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgqYAKSfDxxSImvpSubiYd2C1_FXknN6FXZOZPmAtDErlgjzziIGz_iXOG2YTq-VHTsLT-mXyFMJwd7gIAG1zlEOLmJiqgR7nQ-QkZx1qB1DOuXuz6twUSqlzsBPfwW2ITGfC0LvC0yqMM/s1600/Screenshot_20181204-151714.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgqYAKSfDxxSImvpSubiYd2C1_FXknN6FXZOZPmAtDErlgjzziIGz_iXOG2YTq-VHTsLT-mXyFMJwd7gIAG1zlEOLmJiqgR7nQ-QkZx1qB1DOuXuz6twUSqlzsBPfwW2ITGfC0LvC0yqMM/s640/Screenshot_20181204-151714.png" width="360" height="640" data-original-width="900" data-original-height="1600" /&gt;&lt;/a&gt;&lt;/div&gt;


### PC版 MT4 でも同様
さらに余談ですが、PC版 MT4 でも同様に色付けされますね。

取引タブでは、未約定の注文の指値・逆指値に近づくと「価格」が緑になります。
&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg2gY22A-LHKEouJK8PKRUZI1DccWsBzJPp__qyvyMPiMhcxK0T2Wug0L1hzoqPiflPUBu2WTTfkwIZZxuBNC6e_bVA5CggQUzyJBY6gXRaj8lodF2S5f3_vBT_szK5yl4FZE8kWkWZvcc/s1600/001.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg2gY22A-LHKEouJK8PKRUZI1DccWsBzJPp__qyvyMPiMhcxK0T2Wug0L1hzoqPiflPUBu2WTTfkwIZZxuBNC6e_bVA5CggQUzyJBY6gXRaj8lodF2S5f3_vBT_szK5yl4FZE8kWkWZvcc/s1600/001.png" data-original-width="259" data-original-height="74" /&gt;&lt;/a&gt;&lt;/div&gt;

約定済みの注文はテイクプロフィットに近づくと「決済指値(T/P)」が緑、ストップロスに近づくと「決済逆指値(S/L)」が赤くなります。
&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjc_Dt5om2HVw4pzGxIutPNLeEtmoUsGx5HC5qS7LxqvUUPBVx9D4RqVJjsx4fVPMJBZytNO5Xm5T3idxiH2ZeWu2ivDNJg-01ztcL8Lksj8tn2aH6GaqLR-FlJdoLsoHghG68VY454-O0/s1600/003.PNG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjc_Dt5om2HVw4pzGxIutPNLeEtmoUsGx5HC5qS7LxqvUUPBVx9D4RqVJjsx4fVPMJBZytNO5Xm5T3idxiH2ZeWu2ivDNJg-01ztcL8Lksj8tn2aH6GaqLR-FlJdoLsoHghG68VY454-O0/s1600/003.PNG" data-original-width="346" data-original-height="60" /&gt;&lt;/a&gt;&lt;/div&gt;

口座履歴タブでは、テイクプロフィットで決済したものは「決済指値(T/P)」が緑、ストップロスで決済したものは「決済逆指値(S/L)」が赤くなります。
&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEie9w9sBP8_kR03Ye8CBwTV6GdWHDWzo4dRBgN6SpvmiCx83f3d7Uc4SABbxTT2TZ1UFD-QkgUWLcKqrmaOdmIIuB2ky4bwfAd9doBDU2w-38uG_jdLSS7sxJQjYEF2tmfrnbbw32YqkO0/s1600/002.PNG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEie9w9sBP8_kR03Ye8CBwTV6GdWHDWzo4dRBgN6SpvmiCx83f3d7Uc4SABbxTT2TZ1UFD-QkgUWLcKqrmaOdmIIuB2ky4bwfAd9doBDU2w-38uG_jdLSS7sxJQjYEF2tmfrnbbw32YqkO0/s1600/002.PNG" data-original-width="302" data-original-height="95" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;/pre&gt;
&lt;div class='barenote_ref_list'&gt;&lt;/div&gt;</content><link href="https://www.blogger.com/feeds/2050150641290358499/posts/default/349169773004715513" rel="edit" type="application/atom+xml"/><link href="https://www.blogger.com/feeds/2050150641290358499/posts/default/349169773004715513" rel="self" type="application/atom+xml"/><link href="https://strategyofc.blogspot.com/2018/12/mt4-android-mt4.html" rel="alternate" title="MT4 Android 版の赤と緑の帯が表すもの" type="text/html"/><author><name>Yusuke</name><uri>http://www.blogger.com/profile/01684623000819625562</uri><email>noreply@blogger.com</email><gd:image height="32" rel="http://schemas.google.com/g/2005#thumbnail" src="//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiquu1685bSenxd0V6J4yvcDUazx1i_-RXZ3mHILzptpdAadwhXL6RpRbkJhVr-VrP7UHwR1C7mRJI9SOtd0MVLuJUrViIjX3yx1naUiblUPwk_ipnm72-mmGf7QELWnl0/s1600/ACg8ocKlDAVFDimnAUyl7Ji05wSkUNwgbwPLydcKfPbsqMxx20o%253Ds500-c" width="32"/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" height="72" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj-IaX7R3iQ4zIoBhaUqtYyf-E59WbMYHgXjPh0emx9U1XbL4CMPg2RRz65MPgjrExW9rvjdJPVwgDEWfdtqRZ38bVOeZ0av7jE4Gl-Y312Bjfh2b0lipOSNd5Gwy6BRdsaEqsIRAHy7aY/s72-c/Screenshot_20181204-113647.png" width="72"/></entry><entry><id>tag:blogger.com,1999:blog-2050150641290358499.post-2935018293220554053</id><published>2018-11-11T00:38:00.000+09:00</published><updated>2018-11-11T00:38:02.723+09:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Expert Advisor"/><category scheme="http://www.blogger.com/atom/ns#" term="MQL4"/><title type="text">[MQL4] ストラテジー毎にスレッドは別</title><content type="html">&lt;pre class="marked"&gt;
[OnTick() と OnTimer() が同一スレッドで動いている](https://strategyofc.blogspot.com/2018/11/mql4-ontick-ontimer.html) ことは
確認したのですが、ストラテジーが異なる場合はどうなのか調べてみました。

結論から言うと、各ストラテジーは別スレッドで動いているようです&lt;sup&gt;&lt;span class='barenote'&gt;当たり前というか、そうじゃないと使い物にならない気がするけど&lt;/span&gt;&lt;/sup&gt;。

1つのストラテジーが `OnTick()` 内で重たい処理をしていても、他のストラテジーの `OnTick()` は呼ばれます。

とはいえ、プロセスは1つなので完全に無関係というわけにはいかないでしょう。
同時実行のストラテジーはどれくらいまで増やせるのだろうか？

&lt;/pre&gt;
&lt;div class='barenote_ref_list'&gt;&lt;/div&gt;</content><link href="https://www.blogger.com/feeds/2050150641290358499/posts/default/2935018293220554053" rel="edit" type="application/atom+xml"/><link href="https://www.blogger.com/feeds/2050150641290358499/posts/default/2935018293220554053" rel="self" type="application/atom+xml"/><link href="https://strategyofc.blogspot.com/2018/11/mql4.html" rel="alternate" title="[MQL4] ストラテジー毎にスレッドは別" type="text/html"/><author><name>Yusuke</name><uri>http://www.blogger.com/profile/01684623000819625562</uri><email>noreply@blogger.com</email><gd:image height="32" rel="http://schemas.google.com/g/2005#thumbnail" src="//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiquu1685bSenxd0V6J4yvcDUazx1i_-RXZ3mHILzptpdAadwhXL6RpRbkJhVr-VrP7UHwR1C7mRJI9SOtd0MVLuJUrViIjX3yx1naUiblUPwk_ipnm72-mmGf7QELWnl0/s1600/ACg8ocKlDAVFDimnAUyl7Ji05wSkUNwgbwPLydcKfPbsqMxx20o%253Ds500-c" width="32"/></author></entry><entry><id>tag:blogger.com,1999:blog-2050150641290358499.post-241033831804770882</id><published>2018-11-10T13:06:00.000+09:00</published><updated>2019-09-10T05:29:12.081+09:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Expert Advisor"/><category scheme="http://www.blogger.com/atom/ns#" term="MQL4"/><title type="text">[MQL4] OnTick() と OnTimer() は同一スレッドで動いている</title><content type="html">&lt;pre class="marked"&gt;
@MetaTrader 4.00 Build 1090

Expert Adviser の `OnTick()` で何か重たい処理をしているとき&lt;sup&gt;&lt;span class='barenote'&gt;本来は、なるべく重い処理はしない方が良いけれど&lt;/span&gt;&lt;/sup&gt;、`OnTimer()` はどのように処理されるのか、調べてみました。

結論から言うと、以下のような動作をするようです。
（同一スレッド上で動いているか、少なくとも排他されている。）

- `OnTick()` の処理中に `OnTimer()` のタイミングが来た場合、`OnTick()` 終了直後に`OnTimer()`が実行される（`OnTimer()` はペンディングされる）
- ただし、2回以上ペンディングされたとしても、`OnTick()` 終了直後に実行される `OnTimer()` は1回のみ
- ペンディングされたとしても、`OnTimer()` が呼ばれるタイミングには影響しない（`EventSetTimer()` が呼ばれた時点から指定間隔で呼ばれ続ける&lt;sup&gt;&lt;span class='barenote'&gt;ただし、多少の誤差はある&lt;/span&gt;&lt;/sup&gt;）

この動作、逆の場合も当てはまるようです。
つまり、`OnTimer()` で重たい処理をしていると、その間に呼ばれるはずだった `OnTick()` が無視されることになります&lt;sup&gt;&lt;span class='barenote'&gt;最後の一回を除いて&lt;/span&gt;&lt;/sup&gt;。

また、`OnTick()` で重たい処理をしていても、同じように `OnTick()` が無視されます。

`OnTick()` や `OnTimer()` ではなるべく重たい処理をしないようにすべきですね。
かつ `OnTimer()` の呼び出し頻度は少なめに。

&lt;a name='more'&gt;&lt;/a&gt;

### 確認環境
以下のような EA を作成し、タイミングをいろいろ変えて確認してみました。

```mq4
`title: "Experts/ThreadTest.mq4";
#property strict

static uint count = 0;

int OnInit()
{
    //--- create timer
    EventSetTimer(1); // 1秒（本来こんなに高頻度で呼ぶべきではない）

    return(INIT_SUCCEEDED);
}

void OnDeinit(const int reason)
{
    //--- destroy timer
    EventKillTimer();
}

void OnTick()
{
    count++;
    printf("OnTick %u start", count);
    Sleep(3000); // 3秒待つ
    printf("OnTick %u end", count);
}

void OnTimer()
{
    Print("OnTimer");
}
```

&lt;/pre&gt;
&lt;div class='barenote_ref_list'&gt;&lt;/div&gt;</content><link href="https://www.blogger.com/feeds/2050150641290358499/posts/default/241033831804770882" rel="edit" type="application/atom+xml"/><link href="https://www.blogger.com/feeds/2050150641290358499/posts/default/241033831804770882" rel="self" type="application/atom+xml"/><link href="https://strategyofc.blogspot.com/2018/11/mql4-ontick-ontimer.html" rel="alternate" title="[MQL4] OnTick() と OnTimer() は同一スレッドで動いている" type="text/html"/><author><name>Yusuke</name><uri>http://www.blogger.com/profile/01684623000819625562</uri><email>noreply@blogger.com</email><gd:image height="32" rel="http://schemas.google.com/g/2005#thumbnail" src="//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiquu1685bSenxd0V6J4yvcDUazx1i_-RXZ3mHILzptpdAadwhXL6RpRbkJhVr-VrP7UHwR1C7mRJI9SOtd0MVLuJUrViIjX3yx1naUiblUPwk_ipnm72-mmGf7QELWnl0/s1600/ACg8ocKlDAVFDimnAUyl7Ji05wSkUNwgbwPLydcKfPbsqMxx20o%253Ds500-c" width="32"/></author></entry><entry><id>tag:blogger.com,1999:blog-2050150641290358499.post-1734485083626943664</id><published>2018-11-06T08:45:00.000+09:00</published><updated>2019-04-11T03:20:08.511+09:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="MetaTrader"/><title type="text">[MT4] PeriodConverter はオフラインチャートで上位時間足を再生成するためのものではない</title><content type="html">&lt;pre class="marked"&gt;
[[MT4] PeriodConverter を使うとヒストリーデータが消えることがある](https://strategyofc.blogspot.com/2018/11/mt4-periodconverter.html) を書いている時に
以下の投稿を見つけました。

[案外知られていない、MT4添付スクリプト「PeriodConverter」のバグ（正しくは制約）| nekonoteのFXで自動売買](http://nya0nekonote.blog.fc2.com/blog-entry-307.html)

オフラインチャートに「PeriodConverter」を適用するのは本来の使い方ではないらしい。

&gt; 「PeriodConverter」の本来の目的は、オンラインのチャートに常駐させて、パラメータで指定した倍率の上位時間足をリアルタイムで生成していくものです。
&gt; ですので、オフラインチャートの5分足～月足を生成して終わり、という使い方は、スクリプトの本来の目的から外れています。

知らなかった。
確かに「生成が終わってもスクリプトが終了せず常駐している」とは思っていたけど、そういう意味があったとは。

そのため、以下のような問題があるとのこと。

- 最新時間足が生成されない
- 週足・月足のオープン時間が異なる

最新時間足が生成されない問題は、リアルタイム用ということで理解できますが、週足・月足の問題はなぜでしょう？
今度調べてみたいと思います&lt;sup&gt;&lt;span class='barenote'&gt;と TODO に積んでおいて放置されるパターン…？&lt;/span&gt;&lt;/sup&gt;。

&lt;/pre&gt;
&lt;div class='barenote_ref_list'&gt;&lt;/div&gt;</content><link href="https://www.blogger.com/feeds/2050150641290358499/posts/default/1734485083626943664" rel="edit" type="application/atom+xml"/><link href="https://www.blogger.com/feeds/2050150641290358499/posts/default/1734485083626943664" rel="self" type="application/atom+xml"/><link href="https://strategyofc.blogspot.com/2018/11/mt4-periodconverter_6.html" rel="alternate" title="[MT4] PeriodConverter はオフラインチャートで上位時間足を再生成するためのものではない" type="text/html"/><author><name>Yusuke</name><uri>http://www.blogger.com/profile/01684623000819625562</uri><email>noreply@blogger.com</email><gd:image height="32" rel="http://schemas.google.com/g/2005#thumbnail" src="//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiquu1685bSenxd0V6J4yvcDUazx1i_-RXZ3mHILzptpdAadwhXL6RpRbkJhVr-VrP7UHwR1C7mRJI9SOtd0MVLuJUrViIjX3yx1naUiblUPwk_ipnm72-mmGf7QELWnl0/s1600/ACg8ocKlDAVFDimnAUyl7Ji05wSkUNwgbwPLydcKfPbsqMxx20o%253Ds500-c" width="32"/></author></entry><entry><id>tag:blogger.com,1999:blog-2050150641290358499.post-5535006280146064480</id><published>2018-11-06T08:11:00.000+09:00</published><updated>2019-04-11T03:20:08.841+09:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="MetaTrader"/><title type="text">[MT4] PeriodConverter を使うとヒストリーデータが消えることがある</title><content type="html">&lt;pre class="marked"&gt;
MetaTrader には `PeriodConverter` というスクリプトが標準で付属しています。
この `PeriodConverter` は M1 のデータ等から他の時間足のデータを再生成する際に使用します。

便利に使っていたのですが、ある日、再生成したヒストリーデータが直近数時間分になってしまう現象がおこりました。
M1 のデータは 1971年から&lt;sup&gt;&lt;span class='barenote'&gt;MetaQuotes 提供のもの。1900年代のデータは飛び飛びであまり使いものにならない。&lt;/span&gt;&lt;/sup&gt;あるのにも関わらずです。

先に原因を書いておくと、「チャートの最大バー数」が小さい場合、このような現象が起こります。

ツール → オプション → チャート
&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEihngVeOmd4nvdECtFXSNTjEesD2dwTdyw4sqHKwd2C7DLKJ-L7AYHM-zMwZ9XN41SPe_B7VLnElif5MWf9_nhIjrIcU6HJFTZaR0MDoLX4EGvL_QCQgYP9Hc5y61aGTrvKoNNYt9orXx4/s1600/001.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEihngVeOmd4nvdECtFXSNTjEesD2dwTdyw4sqHKwd2C7DLKJ-L7AYHM-zMwZ9XN41SPe_B7VLnElif5MWf9_nhIjrIcU6HJFTZaR0MDoLX4EGvL_QCQgYP9Hc5y61aGTrvKoNNYt9orXx4/s640/001.png" width="640" height="412" data-original-width="672" data-original-height="433" /&gt;&lt;/a&gt;&lt;/div&gt;

&lt;a name='more'&gt;&lt;/a&gt;

以下に問題を再現してみた結果を載せておきます。
「チャートの最大バー数」は上記スクリーンショットのように 800 を使用しました。

### ヒストリーデータを確認する
まずは現在のヒストリーデータを確認します。

ファイル → オフラインチャート
&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiVgYIUVgU_2xxLFIYbvej_S4KGin8zmYE5KzeW2eESN-yvS4HDnsNJILkGZ5XULYhM1mAuuZGZ0eWY9lkET-a5yLJqG2NcWoBDyBg_loOOZRLC4auHTrJaQwDIRRp_lZldYOBWYvPKNLI/s1600/002.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiVgYIUVgU_2xxLFIYbvej_S4KGin8zmYE5KzeW2eESN-yvS4HDnsNJILkGZ5XULYhM1mAuuZGZ0eWY9lkET-a5yLJqG2NcWoBDyBg_loOOZRLC4auHTrJaQwDIRRp_lZldYOBWYvPKNLI/s1600/002.png" data-original-width="535" data-original-height="297" /&gt;&lt;/a&gt;&lt;/div&gt;

全時間枠で 1971年からのデータがあることが確認できます。


### PeriodConverter を適用する
M1 のチャートを開き、PeriodConverter を適用します。

PeriodConverter → 右クリック → チャートで実行　（ダブルクリックやドラッグ＆ドロップでも良い）
&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgtRwbpWnw05yy_kOuTcjYoHpVbNNVObE8Ju7U7UwElhkf-5GXTYCMkEaAVqe915sxMujt9hyK97NOAO3t4oQOZbiyZyyp1JMD3bkWft0bzsFdUm2tusKDTtFypQ-T1aZ170SQAc3-jRZA/s1600/003.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgtRwbpWnw05yy_kOuTcjYoHpVbNNVObE8Ju7U7UwElhkf-5GXTYCMkEaAVqe915sxMujt9hyK97NOAO3t4oQOZbiyZyyp1JMD3bkWft0bzsFdUm2tusKDTtFypQ-T1aZ170SQAc3-jRZA/s1600/003.png" data-original-width="386" data-original-height="399" /&gt;&lt;/a&gt;&lt;/div&gt;

再生成する時間枠を指定。今回は 5 にしました。
&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj-oQMWpaVf5XLs-FNMcK72r_OJGOgr0s28XS4_NcS9ey2hAUjvW-oTXV5BaDGb7c6-Z5kvivoh5wiJGw-5XiHmPA5gCS4wu2im2R1wdI85xHVnc_SVKFA4NY47hurd2ZLeTxJJun9Tqrs/s1600/005.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj-oQMWpaVf5XLs-FNMcK72r_OJGOgr0s28XS4_NcS9ey2hAUjvW-oTXV5BaDGb7c6-Z5kvivoh5wiJGw-5XiHmPA5gCS4wu2im2R1wdI85xHVnc_SVKFA4NY47hurd2ZLeTxJJun9Tqrs/s640/005.png" width="640" height="307" data-original-width="703" data-original-height="337" /&gt;&lt;/a&gt;&lt;/div&gt;

### もう一度ヒストリーデータを確認すると…
以下のように、M5 だけ、直近数時間分になってしまいました&lt;sup&gt;&lt;span class='barenote'&gt;「終了」が最初のスクリーンショットと異なっている点はご容赦を&lt;/span&gt;&lt;/sup&gt;。

&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgaR0KDQM1RTOmlKLb5gLqc9EbMss7WrkrgNIR9c70SS1Ko1Xx5hv7TJ0b-whhhhuwOXj7nTNIaZlAOtjW0I87oz5vTn-gMc5ZBdzYaLxDCGIDykvd1cKJ4AI6hgKwE3WfeZEFWQnwDIJs/s1600/006.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgaR0KDQM1RTOmlKLb5gLqc9EbMss7WrkrgNIR9c70SS1Ko1Xx5hv7TJ0b-whhhhuwOXj7nTNIaZlAOtjW0I87oz5vTn-gMc5ZBdzYaLxDCGIDykvd1cKJ4AI6hgKwE3WfeZEFWQnwDIJs/s1600/006.png" data-original-width="535" data-original-height="297" /&gt;&lt;/a&gt;&lt;/div&gt;

なお、この状態でストラテジーテスターを実行すると、11/5 4:50 以降しか実行されません。（M5 をターゲットにした場合）


### 修復
データが無くなったとはいえ、M1 は残っているので修復可能です。

先に書いたように、原因は「チャートの最大バー数」が小さいことなので、「チャートの最大バー数」を十分に大きくします。
なお、この値は **MetaTrader を再起動しないと反映されない** ので注意してください。

&gt; 参考
&gt;
&gt; [[MT4] 「チャートの最大バー数」は何を意味するのか | Strategy of C](https://strategyofc.blogspot.com/2018/10/mt4.html)

ツール → オプション → チャート
&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhiDK3pjkTZCJTi-FQVDpSLH7psqbPCWlNNFrfVBzXXNcXpvy9EdyHe6D7on7Rw1SO6YeqFje8J_RKfa-72VHbzFL23x0Ty2eU1ThkZzvjSxxtejlb7FT9FTO7pW5Ao80XyDyfVS6U2hOs/s1600/007.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhiDK3pjkTZCJTi-FQVDpSLH7psqbPCWlNNFrfVBzXXNcXpvy9EdyHe6D7on7Rw1SO6YeqFje8J_RKfa-72VHbzFL23x0Ty2eU1ThkZzvjSxxtejlb7FT9FTO7pW5Ao80XyDyfVS6U2hOs/s640/007.png" width="640" height="412" data-original-width="672" data-original-height="433" /&gt;&lt;/a&gt;&lt;/div&gt;

この状態で再度 `PeriodConverter` を実行すると、M5 が再生成されます。

ただし、この設定のまま複数チャートを開いたりすると、すごく重くなります。
場合によっては完全に固まるということもありますので、ご注意ください。
&lt;/pre&gt;
&lt;div class='barenote_ref_list'&gt;&lt;/div&gt;</content><link href="https://www.blogger.com/feeds/2050150641290358499/posts/default/5535006280146064480" rel="edit" type="application/atom+xml"/><link href="https://www.blogger.com/feeds/2050150641290358499/posts/default/5535006280146064480" rel="self" type="application/atom+xml"/><link href="https://strategyofc.blogspot.com/2018/11/mt4-periodconverter.html" rel="alternate" title="[MT4] PeriodConverter を使うとヒストリーデータが消えることがある" type="text/html"/><author><name>Yusuke</name><uri>http://www.blogger.com/profile/01684623000819625562</uri><email>noreply@blogger.com</email><gd:image height="32" rel="http://schemas.google.com/g/2005#thumbnail" src="//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiquu1685bSenxd0V6J4yvcDUazx1i_-RXZ3mHILzptpdAadwhXL6RpRbkJhVr-VrP7UHwR1C7mRJI9SOtd0MVLuJUrViIjX3yx1naUiblUPwk_ipnm72-mmGf7QELWnl0/s1600/ACg8ocKlDAVFDimnAUyl7Ji05wSkUNwgbwPLydcKfPbsqMxx20o%253Ds500-c" width="32"/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" height="72" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEihngVeOmd4nvdECtFXSNTjEesD2dwTdyw4sqHKwd2C7DLKJ-L7AYHM-zMwZ9XN41SPe_B7VLnElif5MWf9_nhIjrIcU6HJFTZaR0MDoLX4EGvL_QCQgYP9Hc5y61aGTrvKoNNYt9orXx4/s72-c/001.png" width="72"/></entry><entry><id>tag:blogger.com,1999:blog-2050150641290358499.post-5404934079037125670</id><published>2018-11-05T23:26:00.000+09:00</published><updated>2019-06-09T13:43:09.063+09:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="MQL4"/><title type="text">[MQL4] Library に strict を付けてはいけない</title><content type="html">&lt;pre class="marked"&gt;
@ MetaTrader 4.00 Build 1090 (on Windows 10 Pro Ver. 1803)

MetaTrader でライブラリを作成する際、`#property strict` を書いてしまうと、実行時に以下のエラーが出てしまいます&lt;sup&gt;&lt;span class='barenote'&gt;コンパイルは通る&lt;/span&gt;&lt;/sup&gt;。

&gt; libsumtest USDJPY,H1: unresolved import function call

&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhbZ3GHvLa_HDMJPGj-7lllYtrHE7BR0peyEQHANZjOFqBejWdTKHMHeC2LQKQA9-WCgDY6NfvZj7b4AKCCofZi1ngySmSXEm3EZYTJpM4H2voYdilSIRtUJu-t1wAFMWEMd-u7cZuOQFU/s1600/001.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhbZ3GHvLa_HDMJPGj-7lllYtrHE7BR0peyEQHANZjOFqBejWdTKHMHeC2LQKQA9-WCgDY6NfvZj7b4AKCCofZi1ngySmSXEm3EZYTJpM4H2voYdilSIRtUJu-t1wAFMWEMd-u7cZuOQFU/s1600/001.png" data-original-width="477" data-original-height="148" /&gt;&lt;/a&gt;&lt;/div&gt;

`#property strict` を消すと正しく動作します。
なお、ライブラリの修正後はライブラリをコンパイルし直すのをお忘れなく。

&gt; 参考
&gt;
&gt; [Problem with #import library (Win XP, build 646) - Trading Strategies That Work - MQL4 and MetaTrader 4 - MQL4 programming forum](https://www.mql5.com/en/forum/152047)

&lt;a name='more'&gt;&lt;/a&gt;

一応、検証した方法を載せておきます。

### 検証方法
以下のようにライブラリとヘッダを用意。

```mq4
`title: "Libraries/libsum.mq4"; highlight:2 ;
#property library
#property strict

int sum(int a, int b)
{
   return a + b;
}
```

```mq4
`title: "Include/libsum.mqh";
#import "libsum.ex4"
   int sum(int a, int b);
#import
```

`libsum.mq4` をコンパイルして、`Libraries/libsum.ex4` が作成されたことを確認します。

そして、それをスクリプトで読み込みます。

```mq4
`title: "Scripts/libsumtest.mq4";
#property version   "1.00"
#property strict

#include &amp;lt;libsum.mqh&amp;gt;

void OnStart()
{
   int result = sum(1, 2);
   Print(result);
}
```

これを実行すると `unresolved import function call` エラー。

&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhbZ3GHvLa_HDMJPGj-7lllYtrHE7BR0peyEQHANZjOFqBejWdTKHMHeC2LQKQA9-WCgDY6NfvZj7b4AKCCofZi1ngySmSXEm3EZYTJpM4H2voYdilSIRtUJu-t1wAFMWEMd-u7cZuOQFU/s1600/001.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhbZ3GHvLa_HDMJPGj-7lllYtrHE7BR0peyEQHANZjOFqBejWdTKHMHeC2LQKQA9-WCgDY6NfvZj7b4AKCCofZi1ngySmSXEm3EZYTJpM4H2voYdilSIRtUJu-t1wAFMWEMd-u7cZuOQFU/s1600/001.png" data-original-width="477" data-original-height="148" /&gt;&lt;/a&gt;&lt;/div&gt;

### 修正
ライブラリ内の `#property strict` を削除&lt;sup&gt;&lt;span class='barenote'&gt;他の誰かのためにコメントアウトして何かコメントを付けておく方が良いかもしれない&lt;/span&gt;&lt;/sup&gt;。

```mq4
`title: "Libraries/libsum.mq4"; highlight:2 ;
#property library
// #property strict

int sum(int a, int b)
{
   return a + b;
}
```

再コンパイルして、`Libraries/libsum.ex4` が更新されたことを確認します。

スクリプト `libsumtest` を実行すると正しく実行されました。

&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhaOpI86R-CxhnAjUtkmBpah-O2W-GjG-OUSrDNDaVdFHR1AP7Fn0o7BSrCjnzrAMLH7JSGVdPiDcy2MOue_x1xs_krlhR_Wa5569Dno3kxWoP57w405KRCneQCfxzR3Nl1lMaacyJTwK8/s1600/002.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhaOpI86R-CxhnAjUtkmBpah-O2W-GjG-OUSrDNDaVdFHR1AP7Fn0o7BSrCjnzrAMLH7JSGVdPiDcy2MOue_x1xs_krlhR_Wa5569Dno3kxWoP57w405KRCneQCfxzR3Nl1lMaacyJTwK8/s1600/002.png" data-original-width="477" data-original-height="131" /&gt;&lt;/a&gt;&lt;/div&gt;

&lt;/pre&gt;
&lt;div class='barenote_ref_list'&gt;&lt;/div&gt;</content><link href="https://www.blogger.com/feeds/2050150641290358499/posts/default/5404934079037125670" rel="edit" type="application/atom+xml"/><link href="https://www.blogger.com/feeds/2050150641290358499/posts/default/5404934079037125670" rel="self" type="application/atom+xml"/><link href="https://strategyofc.blogspot.com/2018/11/mql4-library-strict.html" rel="alternate" title="[MQL4] Library に strict を付けてはいけない" type="text/html"/><author><name>Yusuke</name><uri>http://www.blogger.com/profile/01684623000819625562</uri><email>noreply@blogger.com</email><gd:image height="32" rel="http://schemas.google.com/g/2005#thumbnail" src="//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiquu1685bSenxd0V6J4yvcDUazx1i_-RXZ3mHILzptpdAadwhXL6RpRbkJhVr-VrP7UHwR1C7mRJI9SOtd0MVLuJUrViIjX3yx1naUiblUPwk_ipnm72-mmGf7QELWnl0/s1600/ACg8ocKlDAVFDimnAUyl7Ji05wSkUNwgbwPLydcKfPbsqMxx20o%253Ds500-c" width="32"/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" height="72" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhbZ3GHvLa_HDMJPGj-7lllYtrHE7BR0peyEQHANZjOFqBejWdTKHMHeC2LQKQA9-WCgDY6NfvZj7b4AKCCofZi1ngySmSXEm3EZYTJpM4H2voYdilSIRtUJu-t1wAFMWEMd-u7cZuOQFU/s72-c/001.png" width="72"/></entry><entry><id>tag:blogger.com,1999:blog-2050150641290358499.post-41179631138964553</id><published>2018-10-18T23:09:00.000+09:00</published><updated>2019-06-09T13:42:00.154+09:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="MQL4"/><category scheme="http://www.blogger.com/atom/ns#" term="Standard Library"/><title type="text">[MQL4] GetLastError() で取得したエラーコードをエラーメッセージに変換する方法</title><content type="html">&lt;pre class="marked"&gt;
MQL4 の関数の中には、失敗した場合、[GetLastError()](https://docs.mql4.com/check/getlasterror) でエラーコードを取得できるものがあります。

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

そのため、`ErrorDescription()` という標準関数が用意されています&lt;sup&gt;&lt;span class='barenote'&gt;公式のサンプルの中でもよく使われています&lt;/span&gt;&lt;/sup&gt;。

&lt;div class="edit"&gt;&lt;div class="title"&gt;2018/10/19 追記&lt;/div&gt;&lt;div class="content"&gt;

「載ってないものが多く」と書いたのですが、[Runtime Errors](https://docs.mql4.com/constants/errorswarnings/errorcodes) の方には 4000番台のエラーも載っていました&lt;sup&gt;&lt;span class='barenote'&gt;どこかで見た気はしていた&lt;/span&gt;&lt;/sup&gt;。
[Trade Server Return Codes](https://docs.mql4.com/constants/errorswarnings/enum_trade_return_codes) は [Runtime Errors](https://docs.mql4.com/constants/errorswarnings/errorcodes) から若い番号のものを抜粋した表のようです。&lt;br /&gt;
[OrderModify()](https://docs.mql4.com/trading/ordermodify) 等は 4000番台のエラーも返すのに、リンクされているドキュメントが不十分というのは不親切だなぁ。

&lt;/div&gt;&lt;/div&gt;


### `ErrorDescription()` の使用方法
まず `stdlib.mqh` を include します。

```mq4
#include &amp;lt;stdlib.mqh&amp;gt;
```

あとは以下のように `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度呼ぶと値が変わってしまうので、上記のように変数で一度受けて使用しましょう。

&gt; 参考
&gt;
&gt; [[MQL4] GetLastError() は2度呼んではいけない](https://strategyofc.blogspot.com/2018/10/mql4-getlasterror-2.html)

&lt;/pre&gt;
&lt;div class='barenote_ref_list'&gt;&lt;/div&gt;</content><link href="https://www.blogger.com/feeds/2050150641290358499/posts/default/41179631138964553" rel="edit" type="application/atom+xml"/><link href="https://www.blogger.com/feeds/2050150641290358499/posts/default/41179631138964553" rel="self" type="application/atom+xml"/><link href="https://strategyofc.blogspot.com/2018/10/mql4-getlasterror.html" rel="alternate" title="[MQL4] GetLastError() で取得したエラーコードをエラーメッセージに変換する方法" type="text/html"/><author><name>Yusuke</name><uri>http://www.blogger.com/profile/01684623000819625562</uri><email>noreply@blogger.com</email><gd:image height="32" rel="http://schemas.google.com/g/2005#thumbnail" src="//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiquu1685bSenxd0V6J4yvcDUazx1i_-RXZ3mHILzptpdAadwhXL6RpRbkJhVr-VrP7UHwR1C7mRJI9SOtd0MVLuJUrViIjX3yx1naUiblUPwk_ipnm72-mmGf7QELWnl0/s1600/ACg8ocKlDAVFDimnAUyl7Ji05wSkUNwgbwPLydcKfPbsqMxx20o%253Ds500-c" width="32"/></author></entry><entry><id>tag:blogger.com,1999:blog-2050150641290358499.post-6727667836827705237</id><published>2018-10-18T23:08:00.000+09:00</published><updated>2019-06-09T13:41:26.368+09:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="MQL4"/><category scheme="http://www.blogger.com/atom/ns#" term="Standard Library"/><title type="text">[MQL4] GetLastError() は2度呼んではいけない</title><content type="html">&lt;pre class="marked"&gt;
MQL4 では直前の関数が失敗した場合、[GetLastError()](https://docs.mql4.com/check/getlasterror) を使ってエラーコードを取得することが出来ます。

しかし、この関数を連続して呼び出すと値が変わってしまうので要注意です。


### 2度目は値が0
具体的には以下のように、2度目の呼び出しでは値が 0 になってしまいます&lt;sup&gt;&lt;span class='barenote'&gt;なお、4108 は "Invalid Ticket"&lt;/span&gt;&lt;/sup&gt;。

```mq4
if (!OrderModify(ticket, price, stoploss, takeprofit, expiration)) {
    printf("GetLastError1 %d", GetLastError());
    printf("GetLastError2 %d", GetLastError());
}

// 結果
// GetLastError1 4108
// GetLastError2 0
```

こんなあからさまに2度呼ぶことは無いと思うのですが、後述の `ErrorDescription()` を使う場合など、うっかり書いてしまうことはありそうです。


### GetLastError() は必ず変数で受けてから使う
対策としては、エラー発生直後に必ず変数で受けるよう習慣づけるのが一番かと思います。

```mq4
if (!OrderModify(ticket, price, stoploss, takeprofit, expiration)) {
    int error = GetLastError();
    printf("GetLastError1 %d", error);
    printf("GetLastError2 %d", error);
}    

// 結果
// GetLastError1 4108
// GetLastError2 4108
```


### エラーコードをエラーメッセージに変換する方法
このエラーコード、[Trade Server Return Codes](https://docs.mql4.com/constants/errorswarnings/enum_trade_return_codes) に一覧があると思いきや、この表には一部のコードしか載っていません&lt;sup&gt;&lt;span class='barenote'&gt;4108 も載っていない&lt;/span&gt;&lt;/sup&gt;。

これではエラーの原因がわからないので、これを文字列に変換する標準ライブラリが用意されています。

&gt; 参考
&gt;
&gt; [[MQL4] GetLastError() で取得したエラーコードをエラーメッセージに変換する方法](https://strategyofc.blogspot.com/2018/10/mql4-getlasterror.html)

&lt;div class="edit"&gt;&lt;div class="title"&gt;2018/10/19 追記&lt;/div&gt;&lt;div class="content"&gt;

「一部のコードしか載っていません」と書いたのですが、[Runtime Errors](https://docs.mql4.com/constants/errorswarnings/errorcodes) の方には 4000番台のエラーも載っていました&lt;sup&gt;&lt;span class='barenote'&gt;どこかで見た気はしていた&lt;/span&gt;&lt;/sup&gt;。
[Trade Server Return Codes](https://docs.mql4.com/constants/errorswarnings/enum_trade_return_codes) は [Runtime Errors](https://docs.mql4.com/constants/errorswarnings/errorcodes) から若い番号のものを抜粋した表のようです。&lt;br /&gt;
[OrderModify()](https://docs.mql4.com/trading/ordermodify) 等は 4000番台のエラーも返すのに、リンクされているドキュメントが不十分というのは不親切だなぁ。

&lt;/div&gt;&lt;/div&gt;
&lt;/pre&gt;
&lt;div class='barenote_ref_list'&gt;&lt;/div&gt;</content><link href="https://www.blogger.com/feeds/2050150641290358499/posts/default/6727667836827705237" rel="edit" type="application/atom+xml"/><link href="https://www.blogger.com/feeds/2050150641290358499/posts/default/6727667836827705237" rel="self" type="application/atom+xml"/><link href="https://strategyofc.blogspot.com/2018/10/mql4-getlasterror-2.html" rel="alternate" title="[MQL4] GetLastError() は2度呼んではいけない" type="text/html"/><author><name>Yusuke</name><uri>http://www.blogger.com/profile/01684623000819625562</uri><email>noreply@blogger.com</email><gd:image height="32" rel="http://schemas.google.com/g/2005#thumbnail" src="//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiquu1685bSenxd0V6J4yvcDUazx1i_-RXZ3mHILzptpdAadwhXL6RpRbkJhVr-VrP7UHwR1C7mRJI9SOtd0MVLuJUrViIjX3yx1naUiblUPwk_ipnm72-mmGf7QELWnl0/s1600/ACg8ocKlDAVFDimnAUyl7Ji05wSkUNwgbwPLydcKfPbsqMxx20o%253Ds500-c" width="32"/></author></entry><entry><id>tag:blogger.com,1999:blog-2050150641290358499.post-8078986128638538526</id><published>2018-10-16T07:53:00.000+09:00</published><updated>2019-04-11T03:20:09.105+09:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="MetaTrader"/><title type="text">[MT4] 「チャートの最大バー数」は何を意味するのか</title><content type="html">&lt;pre class="marked"&gt;
@MetaTrader 4.00 Build 1090

MetaTrader 4 の設定には「チャートの最大バー数」という項目があります。

&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh4vrw64EinFveJ4VyIpV1N7KiL8ceZP0UCWaKHxLnI1pkN8h6ogZkZIQG_1YJtV1UnZkX84KUgvZfEA_1nPYtlkRXnAt1KfnwlqMTniNpM80PbAv9h8zE3_jdQSN69N-Fr63IQ3pNfJ70/s1600/001.PNG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh4vrw64EinFveJ4VyIpV1N7KiL8ceZP0UCWaKHxLnI1pkN8h6ogZkZIQG_1YJtV1UnZkX84KUgvZfEA_1nPYtlkRXnAt1KfnwlqMTniNpM80PbAv9h8zE3_jdQSN69N-Fr63IQ3pNfJ70/s640/001.PNG" width="640" height="412" data-original-width="672" data-original-height="433" /&gt;&lt;/a&gt;&lt;/div&gt;

この設定値が何を意味するのか調べてみました。
と言っても、正式なドキュメントを見つけることができなかったので動作からの推察です。

なお、この値は** MT4 を再起動しないと反映されません**&lt;sup&gt;&lt;span class='barenote'&gt;何度も再起動するのが地味に面倒くさい&lt;/span&gt;&lt;/sup&gt;。

&lt;a name='more'&gt;&lt;/a&gt;

### チャートの最大バー数 (Max bars in chart)
以下は 「チャートの最大バー数」を 20 にしてチャートを表示してみたものです。

&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgu0pbuHpiV-EXcrIRshGps_-OKuqfWl692bCseTj3aLKr2RuG2cCQialmb3nJSvWkStPJ8UdYY5N-eYkb4YAMhNGONmuUAK618b9p_BwMgkN1XSFTdKSI43sV_djFGaD9rRXN-lsp7Ntw/s1600/002.PNG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgu0pbuHpiV-EXcrIRshGps_-OKuqfWl692bCseTj3aLKr2RuG2cCQialmb3nJSvWkStPJ8UdYY5N-eYkb4YAMhNGONmuUAK618b9p_BwMgkN1XSFTdKSI43sV_djFGaD9rRXN-lsp7Ntw/s640/002.PNG" width="640" height="360" data-original-width="1271" data-original-height="715" /&gt;&lt;/a&gt;&lt;/div&gt;

ご覧の様にチャートに表示されるバーが 20 本になりました。スクロールして過去のバーを見ることも出来ません。
つまり、最新 20本のみ参照可能ということです。

例えば、この値を400にすると、最新 400本のみスクロールして参照出来ますが、それ以前へはスクロール出来ません。

このように、「チャートの最大バー数」は（見えない部分も含めた）チャート上の最大バー数を表します&lt;sup&gt;&lt;span class='barenote'&gt;読んで字のごとくですが&lt;/span&gt;&lt;/sup&gt;。

では、「チャートの最大バー数」を大きくすれば便利に使えるのかというとそうでもありません。
この値が大きいと、その分メモリを消費します。
最近は大量のメモリを積んでいるマシンが多いとはいえ、チャートの枚数が増えてくるとかなり影響が出てきます。

チャートの枚数が増えると動きがモッサリしてくる場合、この値が大きいのが原因かもしれません。


### 「チャートの最大バー数」を小さくしすぎないように注意
EA でしか使用しないという場合、描画に使用するメモリは少ないにこしたことはありません。
しかし、「チャートの最大バー数」をあまり小さくしすぎると問題があります。

以下は
「チャートの最大バー数」を 20 にしたチャートに 10本SMA を表示したものです。
最初の 10本分にインジケーターが表示されていないのがわかるかと思います。

&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiKCvtdo3dp2pUARMn_3sz2CtGS1A35PEI2Koqzfs95ufT90Any2bqI173WnOrJu8uJ71wn3w3KX79EuK7tBjEn6MrsHy43JhdzI34IFZGTniSRtAp8K_ta-YYIU5PRoDNoqKEkVPEqEXk/s1600/003.PNG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiKCvtdo3dp2pUARMn_3sz2CtGS1A35PEI2Koqzfs95ufT90Any2bqI173WnOrJu8uJ71wn3w3KX79EuK7tBjEn6MrsHy43JhdzI34IFZGTniSRtAp8K_ta-YYIU5PRoDNoqKEkVPEqEXk/s640/003.PNG" width="640" height="338" data-original-width="1091" data-original-height="577" /&gt;&lt;/a&gt;&lt;/div&gt;

インジケーターによっては過去の累積が重要なものもあります。
こういったインジケーターの値に影響を与えるので、「チャートの最大バー数」はある程度大きな値にしておくべきです。
安易に変更すると EA の動作が変わってしまうかもしれませんのでご注意を。


### ヒストリー内の最大バー数 (Max bars in history)
「チャートの最大バー数」と同じ設定項目に「ヒストリー内の最大バー数」というのもあります。

しかし、私の環境でこの値を変更してみたところ、10000000 以下の値を設定しても、勝手に 10000000 に変更されてしまうようです。（ヒストリーセンター使用時）

私の記憶が正しければ、昔はこの値が ヒストリーファイル（`*.hst`）のサイズに影響していました。
が、勝手に大きな値に変更されてしまうようでは確認のしようがありません。

ヒストリーファイルが十分でないと、ストラテジーテスターの結果にも影響が出てくるので、小さく出来ないようにしたのかもしれません。
&lt;/pre&gt;
&lt;div class='barenote_ref_list'&gt;&lt;/div&gt;</content><link href="https://www.blogger.com/feeds/2050150641290358499/posts/default/8078986128638538526" rel="edit" type="application/atom+xml"/><link href="https://www.blogger.com/feeds/2050150641290358499/posts/default/8078986128638538526" rel="self" type="application/atom+xml"/><link href="https://strategyofc.blogspot.com/2018/10/mt4.html" rel="alternate" title="[MT4] 「チャートの最大バー数」は何を意味するのか" type="text/html"/><author><name>Yusuke</name><uri>http://www.blogger.com/profile/01684623000819625562</uri><email>noreply@blogger.com</email><gd:image height="32" rel="http://schemas.google.com/g/2005#thumbnail" src="//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiquu1685bSenxd0V6J4yvcDUazx1i_-RXZ3mHILzptpdAadwhXL6RpRbkJhVr-VrP7UHwR1C7mRJI9SOtd0MVLuJUrViIjX3yx1naUiblUPwk_ipnm72-mmGf7QELWnl0/s1600/ACg8ocKlDAVFDimnAUyl7Ji05wSkUNwgbwPLydcKfPbsqMxx20o%253Ds500-c" width="32"/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" height="72" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh4vrw64EinFveJ4VyIpV1N7KiL8ceZP0UCWaKHxLnI1pkN8h6ogZkZIQG_1YJtV1UnZkX84KUgvZfEA_1nPYtlkRXnAt1KfnwlqMTniNpM80PbAv9h8zE3_jdQSN69N-Fr63IQ3pNfJ70/s72-c/001.PNG" width="72"/></entry></feed>