2019年6月6日木曜日
[MQL4] カスタムインジケーターを更新する際、最新値だけでは足りない
以前、[カスタムインジケーターを最新値で更新する方法2種](https://strategyofc.blogspot.com/2018/06/mql4-2.html) を書きました。
その中で、「`Buffer[0]` を常に更新すれば良い」と書いたのですが、この方法には問題があることがわかりました。
以前、[カスタムインジケーターを最新値で更新する方法2種](https://strategyofc.blogspot.com/2018/06/mql4-2.html) を書きました。
その中で、「`Buffer[0]` を常に更新すれば良い」と書いたのですが、この方法には問題があることがわかりました元記事は修正済み。
公式リファレンスにちゃんと書いてあるのですが、 [StringToCharArray()](https://docs.mql4.com/convert/stringtochararray) を使うと最後に '\0'いわゆる [ヌル文字](https://ja.wikipedia.org/wiki/%E3%83%8C%E3%83%AB%E6%96%87%E5%AD%97) が入ります。 ```mq4 string hoge = "abc"; uchar arr_hoge[]; StringToCharArray(hoge, arr_hoge); // arr_hoge は ['a', 'b', 'c', '\0'] Print(ArraySize(arr_hoge)); // 4 ``` [ArraySize()](https://docs.mql4.com/array/arraysize) を [StringLen()](https://docs.mql4.com/strings/stringlen) のように使ったりすると不具合の原因になるので気をつけましょうやらかした人がここに。
プログラムの動作中に配列長が決まるということはよくありますMQL だとそう多くはないかもしれないですが。
そういった場合、C++ では `new` 演算子で動的にメモリを確保するわけですが、MQL4 では `new` 演算子で配列用のメモリを確保することは出来ません。
その代わり、[ArrayResize()](https://docs.mql4.com/array/arrayresize) を利用することでメモリを動的確保することができます。
@Android版 MetaTrader 4 Build 1174 (05 Apr 2019) [MT4 Android 版で Notification の音が変更できない](https://strategyofc.blogspot.com/2018/08/mt4-android-notification.html) で書いたように [MT4 Android 版](https://play.google.com/store/apps/details?id=net.metaquotes.metatrader4) では Notification の音を変更することが出来なくなっていました少なくとも Android 9 Pie では。 アプリの更新が出るたびに、修正されているか確認しているのですが、未だに直っていないようです。 …と思ったら、アプリ内からは変更できないけど Android の設定からは変更できるようになっていましたもしかしたら 2018 Jun バージョンから出来たのかも。 Android 9 Pie で Notification の仕様が少し変わり、MetaTrader 4 アプリはそれに正しく対応出来ていないようですね。 なので、公式にはまだ直っているとは言い難いですが、Android の機能を使えば Notification の音を変更することが可能です。
昨日まで使えていた EA でテストをしようとしたところ、"tester cannot calculate prices" というエラーが出て、動かなくなってしまいました。 エラーの前に "margin exchange rate cannot be calculated" という警告が出ているのも気になります。 調べてみたところ、以下のような条件下でおこるようです条件が AND か OR か不確定。 - "Expert properties"(エキスパート設定)の "Initial deposit currency"(初期証拠金通貨)がブローカーのものと異なる - テストの "Symbol" (通貨ペア)が直接計算できない例えば、証拠金を「USD」にしていて、「EURJPY」で計算しようとしている場合など - サーバーと通信出来ていない
気配値表示ウィンドウに対象の通貨ペアを表示していない場合、基本的に [MarketInfo()](https://docs.mql4.com/marketinformation/marketinfo) の値は取得できません値が0になってしまう。 `MarketInfo()` の値が取れない時は、気配値表示ウィンドウを確認してみましょう。
@MetaTrader 4.00 Build 1170 (20 Dec 2018) [SymbolInfoDouble()](https://docs.mql4.com/marketinformation/symbolinfodouble), [SymbolInfoInteger()](https://docs.mql4.com/marketinformation/symbolinfointeger), [SymbolInfoString()](https://docs.mql4.com/marketinformation/symbolinfostring) 等の関数はストラテジーテスターの中では動作しない時があるので注意が必要です。
アプリケーション開発から組み込みまで手を出しているフリーランスのエンジニア
投資経験は10年以上
現在、完全自動売買を目指して研究中
当ブログ内の情報は環境等により動作が異なる場合があります。 情報は正確になるよう努めていますが、もし間違いを見つけた方はご一報いただけると幸いです。 なお、当ブログの情報によって損害が生じたとしても管理人は一切の責任を負いません。 全て自己責任でお願い致します。