ObjectName()がオブジェクトリストのインデックス通りに動作しない

 

起きている問題

ObjectName()がオブジェクトリストのインデックス通りに動作しない。

ObjectName()のドキュメントを参考に、チャート上の全オブジェクトの名前を新しい順にターミナルに表示するスクリプトを書いたが
オブジェクトリストの順番通りに動作しない。


やりたいこと

オブジェクトリストの順番に対応したオブジェクト名を
ObjectName()に返させる方法を知りたい


やったこと

  1. 手動でオブジェクトを生成
  2. 1.のオブジェクト生成イベントを検知し、生成したオブジェクト名前をターミナルに出力
  3. オブジェクトリスト(Ctrl + B)ではオブジェクトが生成した順にリストアップされている事を確認
  4. 生成した逆順にオブジェクト名をターミナルに表示するコードを実行
  5. オブジェクトリストと、3.でターミナルに表示した名前の順序が異なる事を確認(正順にも逆順にもなっていない)


コード

void OnStart()
{
    Print("---------------------");
    int num = ObjectsTotal(0, -1, -1);
    for (int i = 0; i < num; i++)
    {
        Print(ObjectName(0, i, -1, -1));
    }
}


解決策

スクリーンショット(screen.png)も添付しております。
お手数をおかけしますが、ご教示ください。よろしくお願いいたします。

MQL5のドキュメンテーション: オブジェクト関数 / ObjectName
MQL5のドキュメンテーション: オブジェクト関数 / ObjectName
  • www.mql5.com
この関数は、指定されたチャートの指定されたサブウィンドウで、指定された型を持つオブジェクトの名称を返します。 パラメータ chart_id [in]  チャート識別子( 0 は現在のチャート) pos [in]  ...
ファイル:
screen.png  54 kb
 

オブジェクトリストには作成順に並んでいますが、 ObjectName()では種類ごとに、そのオブジェクト名の順番にリストアップされます。

例えば楕円2つに水平線3本なら次のような順序になります。

Ellipse1234

Ellipse1238

Holizontal line 1225

Holizontal line 1236

Holizontal line 1240

作成順にしたいのなら別途配列を用意したほうがいいと思います。

 
Shino Unada #:

オブジェクトリストには作成順に並んでいますが、 ObjectName()では種類ごとに、そのオブジェクト名の順番にリストアップされます。

例えば楕円2つに水平線3本なら次のような順序になります。

Ellipse1234

Ellipse1238

Holizontal line 1225

Holizontal line 1236

Holizontal line 1240

作成順にしたいのなら別途配列を用意したほうがいいと思います。

ご回答ありがとうございます。

別途配列を用意するとして、時間足変更等を行うとインジやEAはプログラムを再起動してしまうので
OnDeinit()でFileWriteArray()を呼び出してオブジェクト名をファイルに出力しようと考えました。

しかしFileWriteArray()は文字列を含む配列を利用できないようでしたので、
面倒ですがFileWriteString()でオブジェクト名を1つずつファイル出力すればよいのかなと考えました。 (工夫次第で1行で書けるかな?)

ひとまずやってみます。ありがとうございました。

理由: