ブログタイトルを「FX自動売買システム開発部」から「autoFX」に変更しました!

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

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修正 プログラムに不備があったので修正しました。また、引数の列数はいつの間にか不要になっていたので、文を削除しました。

MQL4プログラミングの最新記事8件

>完全放ったらかしEA 「AutoEndlessCatchRange」

完全放ったらかしEA 「AutoEndlessCatchRange」

「本業が忙しい!」「でも資産運用したい!」そんなあなたに最適なEAです。兼業トレーダーの方はチャートを毎日みて分析してトレードする時間はなかなか確保できないものです。トレードは本EAに任せて、本業やプライベートの時間をもっと増やしませんか?元々は自分自身のために開発したEAですので、手抜き無しのガチものです。

CTR IMG