2018年10月14日日曜日

[MQL4] CArrayObj::Insert() に最大値以上の index を指定すると Add と同じ動作になる

[CArrayObj](https://www.mql5.com/en/docs/standardlibrary/datastructures/carrayobj) の `Insert()` で `Total` 以上の値を指定したらどのようになるかやってみました。

結果は、「どんなに大きな値を指定しても最後に挿入される」でした。
エラーが返ってこない仕様なのでそして、ソースコードも読めるので、そうだろうとは思ってたけど、念の為。

```mq4
    // index 0〜9 の要素を追加
    for (int i = 0; i < 10; i++) {
        int value = (i % 2 == 0) ? i : i + 10;
        m_item_array.Add(new Item(value));
    }    
 
    Item* item = new Item(99);

    // index 99?に挿入
    // 実際は index 10 (最後)に挿入される
    m_item_array.Insert(item, 99);
```

`Item` 等の実装は以下のリンク先に掲載したものと同じです。

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

2018年10月13日土曜日

[MQL4] CArrayObj::Search() が想定外のインデックスを返してくることがある

[MQL4 で可変長配列を使用する方法](https://strategyofc.blogspot.com/2018/10/mql4.html) に書いたのですが、`Sort()` 済みの [CArrayObj](https://www.mql5.com/en/docs/standardlibrary/datastructures/carrayobj) から `Search()` でインデックスを取得しても正しいインデックスを返さない場合があるので注意が必要です。

具体的な例を以下に挙げます。

2018年10月12日金曜日

[MQL4] CArrayObj はソート済みじゃないと Search() の結果が -1 になってしまう

[MQL4 で可変長配列を使用する方法](https://strategyofc.blogspot.com/2018/10/mql4.html) で既に書いたのですが、以下のように `CArrayObj::Search()` を呼んでも正しくインデックスが返ってこない時があります。

`Item` 等の定義は [MQL4 で可変長配列を使用する方法](https://strategyofc.blogspot.com/2018/10/mql4.html) を参照してください。

```mq4
    for (int i = 0; i < 10; i++) {
        int value = (i % 2 == 0) ? i : i + 10;
        m_item_array.Add(new Item(value));
    }    

    // 途中に挿入
    Item* item_100 = new Item(100);
    m_item_array.Insert(item_100, 5);
    
    // 今挿入したばかりのオブジェクトを検索する
    int index = m_item_array.Search(item_100);

    printf("index: %d", index);
    
    // 結果
    // index: -1
```

2018年10月11日木曜日

MQL4 で可変長配列を使用する方法

2019/4/12 追記
[CArray](https://www.mql5.com/en/docs/standardlibrary/datastructures/carray) 系クラスの中で使用されているメモリの動的確保について書きました。
[MQL4 で配列用メモリを動的確保する方法 | Strategy of C](https://strategyofc.blogspot.com/2019/04/mql4.html)
場合によっては、こちらを直接使った方が良いかもしれません。
@MetaTrader 4 (Version 4.00 Build 1090) MQL4 では C++ の [std::vector](http://www.cplusplus.com/reference/vector/vector/) のような動的配列が標準で使用できますBuild 600 で入った変更を受けて作成された模様。 `Include/Arrays/` 以下に定義されており、#include <Arrays/ArrayObj.mqh> のように include するだけで使用可能です。 今回はその中の [CArrayObj](https://www.mql5.com/en/docs/standardlibrary/datastructures/carrayobj) について簡単な使い方を書こうと思いますが、 [CArrayInt](https://www.mql5.com/en/docs/standardlibrary/datastructures/carrayint)、[CArrayChar](https://www.mql5.com/en/docs/standardlibrary/datastructures/carraychar) 等他の class も基本の思想は同じです。 公式のリファレンスを探したのですが、 MQL5 用のものしか見つけられませんでした。 ただ、確認した限り、MQL4 でも同様に使用できるようですMQL5 から逆移植されたものと思われる。 > 参考 > > [Standard Library / Data Collections - Reference on algorithmic/automated trading language for MetaTrader 5](https://www.mql5.com/en/docs/standardlibrary/datastructures) なお、完全に動作するソースコードは最後に載せておきます。
2018年8月9日木曜日

[MQL4] mqh ファイルはどこに置けばよいのか

MQL4 のヘッダファイル (.mqh) は `Include` ディレクトリに置くのが普通ですが、実は `Experts`, `Script`, `Libraries` 等に置くこともできます。

2018年8月8日水曜日

MT4 Android 版で Notification の音が変更できない

2019/4/11 追記
Android の設定画面から変更する方法を見つけました。
[MT4 Android 版で Notification の音を変更する方法](https://strategyofc.blogspot.com/2019/04/mt4-android-notification.html#more)
[MetaTrader の EA から Android, iOS に通知を送る](https://strategyofc.blogspot.com/2018/07/metatrader-ea-android-ios.html#more) で「通知音を変更しておくと便利」と書いたのですが、私の Android 端末では最新のアップデートで通知音が変更出来なくなってしまいました。 正確には以下のように設定変更は出来るのですが、それが反映されずデフォルトの通知音が鳴ってしまいます。
2018年7月28日土曜日

[MT4] MetaQuotes ID が勝手に変わった

ここ数日、MetaTrader から Android への通知が届かないと思っていたら、MetaQuotes ID が勝手に変わっていました。