【MQL5】Sort関数について

MQL5リファレンス
スポンサーリンク
スポンサーリンク

Sort関数の働き・役割

Sort関数は、ベクトル行列のデータをその場で並べ替えるために使用されます。この関数は、デフォルトでは昇順に並べ替えを行いますが、カスタムの比較関数を指定することで、独自の条件に基づいた並べ替えも可能です。

ベクトル行列の内容を一時的にコピーすることなく、直接その場で並べ替えを適用するため、効率的な処理を実現できます。また、行列の場合には、並べ替えの軸を指定することで、行単位または列単位での操作が行えます。

Sort関数の引数について

Sort関数には、以下の引数が指定できます。

vector::Sort

void vector::Sort(
func_name compare_func=NULL, // 比較関数
T         context           // カスタム並び替え関数のパラメータ
  );
  1. compare_func
    並べ替えに使用する比較関数を指定します。指定しない場合、デフォルトの昇順で並べ替えが実行されます。比較関数には以下の形式の関数を指定できます。
    • int comparator(T x1, T x2)
      ここで、x1x2ベクトル要素です。x1x2 より小さい場合に負の値を返し、大きい場合に正の値を返します。同じ場合は 0 を返します。
    • int comparator(T x1, T x2, TContext context)
      追加パラメータ context を用いる比較関数です。context を条件としてカスタムソートが行えます。
  2. context
    カスタム比較関数に渡す追加のオプションパラメータです。例えば、並べ替えの基準を変更したい場合に使用します。

matrix::Sort (比較関数のみ指定)

void matrix::Sort(
func_name compare_func=NULL   // 比較関数
T         context           // カスタム並び替え関数のパラメータ
  );
  1. compare_func
    並べ替えに使用する比較関数を指定します。仕様は vector::Sortと同様です。
  2. context
    カスタム比較関数に渡す追加パラメータです。

matrix::Sort (軸指定あり)

void matrix::Sort(
  const int  axis,              // 並べ替えの軸
func_name compare_func=NULL   // 比較関数
T         context           // カスタム並び替え関数のパラメータ
  );
  1. axis
    並べ替えの軸を指定します。
    • 0: 水平方向(行を基準に並べ替え)。
    • 1: 垂直方向(列を基準に並べ替え)。
  2. compare_func
    並べ替えに使用する比較関数を指定します。仕様は vector::Sortと同様です。
  3. context
    カスタム比較関数に渡す追加パラメータです。

Sort関数の戻り値について

Sort関数は値を返しません。この関数を実行すると、指定したベクトル行列のデータがその場で並べ替えられます。つまり、Sort関数は元のデータに直接変更を加える形式で動作します。

並べ替えの結果を新しいデータ構造として取得するのではなく、呼び出し元で使用している行列ベクトルの内容が、関数の実行後に並べ替えられた状態になります。そのため、操作後のデータを使用する際には、関数呼び出しが完了した時点で変更が反映されていることを考慮する必要があります。

Sort関数を使ったサンプルコード

一応公式リファレンスには下記のようなサンプルコードが掲載されていますが・・・

//+------------------------------------------------------------------+
//| 並び替え関数                                                        |
//+------------------------------------------------------------------+
int MyDoubleComparator(double x1,double x2,int sort_mode=0)
 {
  int res=x1<x2 ? -1 : (x1>x2 ? 1 : 0);
  return(sort_mode==0 ? res : -res);
 }
//+------------------------------------------------------------------+
//| スクリプトを開始する関数                                                |
//+------------------------------------------------------------------+
void OnStart()
 {
  //--- ベクトルに書き入れる
  vector v(100);
  //--- 昇順で並べ替える
  v.Sort(MyDoubleComparator);   // an additional parameter with the default value '0' is used here
  Print(v);
  // 降順で並べ替える
  v.Sort(MyDoubleComparator,1); // ここでは、追加のパラメータ「1」がユーザーによって明示的に指定されている
  Print(v);
 }

vector型のインスタンスからは呼び出せないようになっています。(=「vectorインスタンスメンバには実装されていない」というコンパイルエラーが出てしまう)

ArgSort関数でも同じような問題が発生していますが、ArgSort関数は少なくとも多次元配列からは

呼び出す事が出来て挙動を確認することはできました。一方Sort関数からも呼び出せず、リファレンス解説にあるような挙動は現状実行しては確認できておりません。

※どなたか詳しい方がいたらご教授いただければ幸いです。

タイトルとURLをコピーしました