文字列を含む配列のソート関数

MQL4のArraySort()は数字しかソートしてくれない

順番が意味を持つアルゴリズムを考える時に、ソートが必要になることがあります。

普通は、MQL4標準関数のArraySort()で事足りるのでしょうが、文字列を含む配列を並び替えたい時は、この関数では対応できません。

「文字列を含む配列なんて使う時ある?」って思われるかもしれませんが、オーダー時のコメント情報をアルゴリズムに組み込むことがたまにあります。

というわけで、必要に迫られて以下のソート関数を作りました。

//+------------------------------------------------------------------+
//|【関数】バブルソート(配列を最初の列値で並替え)                  |
//|                                                                  |
//|【引数】 IN OUT  引数名             説明                          |
//|        --------------------------------------------------------- |
//|         ○ ○   aArray             配列                          |
//|         ○      aSortType          ソートの種類                  |
//|                                    ┣ 1: 昇順ソート              |
//|                                    ┗ 2: 降順ソート              |
//|                                                                  |
//|【戻値】なし                                                      |
//|                                                                  |
//|【備考】1列目の項目はソートに利用する。                          |
//|        そのため、数字でなければならない。                        |
//+------------------------------------------------------------------+
void bubbleSort(string &aArray[][], int aSortType)
{
  int asc = 1; // 昇順ソート
  int dsc = 2; // 降順ソート

  string tmpAry[];

  int rowNum = ArrayRange(aArray, 0);
  int colNum = ArrayRange(aArray, 1);

  int elmNum = ArrayResize(tmpAry, rowNum);

  // 最後の要素を除いて、すべての要素を並替え
  for(int k = 0; k < rowNum - 1; k++){
    // 下から上に順番に比較
    for(int i = rowNum - 1; i > k; i--){
      if(aSortType == asc){
        // 上の方が大きい場合は、入替え
        if(StrToDouble(aArray[i - 1][0]) > StrToDouble(aArray[i][0])){
          for(int j = 0; j < colNum; j++){
            tmpAry[j]        = aArray[i][j];
            aArray[i][j]     = aArray[i - 1][j];
            aArray[i - 1][j] = tmpAry[j];
          }
        }
      }else if(aSortType == dsc){
        // 上の方が小さい場合は、入替え
        if(StrToDouble(aArray[i - 1][0]) < StrToDouble(aArray[i][0])){
          for(j = 0; j < colNum; j++){
            tmpAry[j]        = aArray[i][j];
            aArray[i][j]     = aArray[i - 1][j];
            aArray[i - 1][j] = tmpAry[j];
          }
        }
      }
    }
  }
}

配列要素の中身は数字でも文字で何でもOKですが、型は文字列型にしておく必要があります。

また、1項目目はソートに使う項目のため、必ず数字型の項目にしておかなければなりません。

さらに、配列の列数は事前に指定しておく必要があり、この例では3列の配列を想定しているため、引数配列の列番号に「3」が記入されています。上記のプログラムを使う時は、ここを適宜変更してください。

ソート種類

ソートアルゴリズムには他にも沢山の種類があって高速化できるのですが、複雑になるし面倒くさかった(!)ので、一番単純なバブルソートを採用しました。

チェックです!
吹き出し

2015/12/15修正 プログラムに不備があったので修正しました。また、引数の列数はいつの間にか不要になっていたので、文を削除しました。

MT4の無料プログラミング講座

メルマガ登録して、MT4のプログラミング講座を無料で受けちゃおう!

超豪華プレゼントも盛りだくさん♪

MT4プログラミングを習得すると、オリジナルEA運用、作成代行、商品販売等、複数の収入源を手に入れられるよ。副業に最適だね!

↓↓↓ 詳細はこちら ↓↓↓

アイキャッチ

>

エターナル・パートナーPRO ~MT4裁量トレード支援ツール~ 「MT4は裁量トレーダーに優しくない」そう思ったことありませんか?もっと快適にトレードするための強力な売買ツールが必要だと考え、開発したのが「エターナル・パートナーPRO」です。元々は自分自身のために開発したツールですので、手抜き無しのガチものです。既に200名近い方に手に取っていただき、喜びの声が続々と届いております。ぜひご覧ください!

CTR IMG