MQL4 配列関数リファレンス|ArrayResize・ArrayCopy・ArraySort・時系列配列

MQL4の配列関数は、公式リファレンスの索引に19個あります。この記事では、ArrayResize・ArrayCopy・ArraySort・ArrayMaximumなどの引数と戻り値を公式リファレンスで確かめ、サンプル7本をMT4でコンパイルして実行しました。7本ともコンパイルはエラー0・警告0でした。配列を1要素ずつ10万回増やす時間は、予約サイズなしの中央値が909.2ミリ秒、予約サイズありが1.38ミリ秒でした。

目次

MQL4 配列関数の一覧|19個の関数と静的配列・動的配列

MQL4の配列関数19個を、サイズ・種類と向き・入れる写す・並べる探す・比べるの5つに分けて関数名を並べた表
出典: MQL4リファレンスの配列関数の索引(docs.mql4.com/array)、2026年10月に確認。19個を5つに分けた表。

配列関数19個の分類

数えたのは、公式リファレンスの配列の索引ページ(docs.mql4.com/array)に載っている関数です。2026年10月に確認して、19個ありました。図では、使い方で5つに分けています。サイズを扱う関数が5個、種類と向きを調べたり変えたりする関数が4個、入れる・写す関数が5個、並べる・探す関数が4個、比べる関数が1個で、合わせて19個です。

この記事は、使う機会の多い関数から順に、引数と戻り値を公式の説明と手元の実行結果で並べていきます。公式の説明と手元の動きが違った点は、そのつど書き分けました。

静的配列と動的配列

MQL4の配列には、大きさが決まっている静的配列と、あとから大きさを変えられる動的配列があります。double a[100]; のように大きさを書くと静的配列、double b[]; のように大きさを書かないと動的配列です。大きさを変える ArrayResize は、公式の説明では動的配列のための関数です。

配列が動的かどうかは、ArrayIsDynamic で調べられます。要素数は ArraySize で取れます。次元が2つ以上の配列では、次元の数を ArrayDimension、指定した次元の要素数を ArrayRange で調べます。使い方は3つめの節のサンプルで確かめました。

アドバイス

配列の関数は19個。まず、サイズ・向き・入れる写す・並べる探す・比べるの5つに分けて見ると探しやすいよ。

MQL4 配列関数 ArrayResize・ArrayFree|サイズを変える

ArrayResizeで要素を1つずつ増やす時間を、予約サイズなしとありで1万・3万・10万要素ごとに並べた対数目盛の棒グラフ
出典: 手元のMT4(XMTrading、ビルド1492)で実行した結果、2026年10月。1つずつ増やす時間の中央値。

ArrayResizeの引数と戻り値

宣言は int ArrayResize(void& array[], int new_size, int reserve_size=0) です。公式の説明では、戻り値は変更後の要素数で、失敗したときは-1です。第3引数の予約サイズは、配列のメモリを実際に取り直すときに使われます。

次のサンプルは、動的配列を1つずつ増やして直近5本の終値を入れ、縮めて、解放するまでの流れです。MT4のスクリプトにして、EURUSDの15分足のチャートで実行しました。

#property strict

// 動的配列を 1 つずつ増やし、直近 5 本の終値を入れる
void OnStart()
	{
	double prices[];									// 動的配列(サイズ未指定)
	int size = ArrayResize(prices, 0);			// 戻り値は変更後の要素数
	Print("空にした: 戻り値=", size, " ArraySize=", ArraySize(prices));

	for(int i = 0; i < 5; i++)
	{
		size = ArrayResize(prices, i + 1);
		prices[size - 1] = Close[i];
	}
	Print("5 本追加: ArraySize=", ArraySize(prices),
			" prices[0]==Close[0]: ", prices[0] == Close[0],
			" prices[4]==Close[4]: ", prices[4] == Close[4]);

	ArrayResize(prices, 3);							// 縮めると先頭 3 つは残る
	Print("3 に縮めた: ArraySize=", ArraySize(prices),
			" prices[2]==Close[2]: ", prices[2] == Close[2]);

	ArrayFree(prices);									// バッファを解放し、要素数は 0
	Print("ArrayFree 後: ArraySize=", ArraySize(prices));

	double fixedArr[10];								// 静的配列
	int r = ArrayResize(fixedArr, 20);			// 静的配列に使うと
	Print("静的配列に ArrayResize: 戻り値=", r, " ArraySize=", ArraySize(fixedArr),
			" ArrayIsDynamic=", ArrayIsDynamic(fixedArr));

	double buf[100];
	int n = ArrayInitialize(buf, EMPTY_VALUE);	// 全要素を同じ値にする
	Print("ArrayInitialize の戻り値=", n, " buf[99]==EMPTY_VALUE: ", buf[99] == EMPTY_VALUE);
	}

結果は次のとおりです。ArrayResize(prices, 0) の戻り値は0でした。5つに増やすと ArraySize が5になり、prices[0]==Close[0] と prices[4]==Close[4] がどちらも true でした。3つに縮めても、先頭の3つは残り、prices[2]==Close[2] は true でした。ArrayFree のあとは ArraySize が0になりました。

静的配列 double fixedArr[10] に ArrayResize(fixedArr, 20) を呼ぶと、手元のビルド1492では戻り値が20で、ArraySize も20、ArrayIsDynamic は true になりました。公式の説明は動的配列向けなので、この動きは公式にない挙動です。静的配列には使わず、大きさを変えたい配列は、最初から動的配列で宣言するのが安全です。

予約サイズで増やす時間を測った結果

要素を1つずつ増やすたびに、メモリを取り直すと時間がかかります。そこで、ArrayResize(a, i) を i=1 から n まで繰り返す「予約なし」と、ArrayResize(b, i, n) を同じ回数繰り返す「予約あり」を比べました。n は1万・3万・10万の3通りで、各 n を5回ずつ実行し、GetMicrosecondCount で測った時間の中央値を出しています。1回の測定は、n 要素まで増やし終えるまでの時間です。

#property strict

// 予約サイズなしと、予約サイズありで、配列を 1 要素ずつ増やす時間を比べる
void OnStart()
	{
	int sizes[3] = {10000, 30000, 100000};
	int handle = FileOpen("arr_reserve.csv", FILE_WRITE | FILE_CSV | FILE_ANSI, ',');
	FileWrite(handle, "n", "run", "no_reserve_us", "reserve_us");
	for(int k = 0; k < 3; k++)
	{
		int n = sizes[k];
		for(int run = 1; run <= 5; run++)
		{
			double a[], b[];
			ulong t0 = GetMicrosecondCount();
			for(int i = 1; i <= n; i++)
				ArrayResize(a, i);					// 予約なし
			ulong t1 = GetMicrosecondCount();
			for(int j = 1; j <= n; j++)
				ArrayResize(b, j, n);				// 予約サイズ n
			ulong t2 = GetMicrosecondCount();
			FileWrite(handle, n, run, t1 - t0, t2 - t1);
			ArrayFree(a);
			ArrayFree(b);
		}
	}
	FileClose(handle);
	Print("arr_reserve done");
	}

中央値は、n が1万のとき、予約なしが8.5ミリ秒、予約ありが0.14ミリ秒でした。3万のとき、85.0ミリ秒と0.38ミリ秒でした。10万のとき、909.2ミリ秒と1.38ミリ秒です。予約ありのほうが、約62倍、約224倍、約658倍短い結果でした。10万要素の5回の範囲は、予約なしが888.4〜966.8ミリ秒、予約ありが0.87〜1.71ミリ秒で、予約なしの最短より予約ありの最長のほうが小さい値でした。

スクロールできます
要素数 n予約なし予約あり倍率
1万8.50.14約62倍
3万85.00.38約224倍
10万909.21.38約658倍

表の「予約なし」「予約あり」は、5回の中央値(単位はミリ秒)です。「倍率」は、予約なしの中央値を予約ありの中央値で割った値です。測定条件は、XMTradingのデモ口座のMT4(ビルド1492)で、EURUSDの15分足のチャートにスクリプトを載せて実行したものです。

この結果は、手元の1台のPCで、デモ口座のMT4を動かしたときの値です。ほかの環境で同じ倍率になるとは限りません。使うメモリの量も測っていません。予約サイズは、増やす回数が先に分かっているときに、n と同じ値かそれ以上を渡す使い方になります。公式の説明のサンプルにも、予約サイズで速くなる例があります。

アドバイス

増やす回数が先に分かっているなら、第3引数に予約サイズを入れよう。10万回増やす例では、909.2ミリ秒が1.38ミリ秒になったよ。

MQL4 配列関数 ArrayCopy・ArrayInitialize|コピー・初期化・比較

ArrayCopyの4つの呼び出しについて、戻り値とコピー先の中身を並べた表
出典: 手元のMT4(XMTrading、ビルド1492)で実行した結果、2026年10月。ArrayCopyの4つの呼び出し。

ArrayCopyの引数と戻り値

宣言は int ArrayCopy(dst_array[], src_array[], int dst_start=0, int src_start=0, int count=WHOLE_ARRAY) です。公式の説明では、戻り値はコピーした要素数で、コピー先の配列は足りなければ自動で広がります。同じ配列を、コピー元とコピー先の両方に指定すると、結果は決まっていません。

#property strict

void OnStart()
	{
	double source[] = {1.0, 2.0, 3.0, 4.0, 5.0};

	double dest[];											// サイズを決めていない動的配列
	int c1 = ArrayCopy(dest, source);					// 全要素。コピー先は自動で広がる
	Print("全部: 戻り値=", c1, " ArraySize(dest)=", ArraySize(dest));

	double partial[];
	int c2 = ArrayCopy(partial, source, 0, 2, 2);	// dst_start=0, src_start=2, count=2
	Print("部分: 戻り値=", c2, " partial[0]=", partial[0], " partial[1]=", partial[1]);

	double recent[];
	int c3 = ArrayCopy(recent, Close, 0, 0, 3);		// 時系列の Close から 3 本
	Print("Close: 戻り値=", c3, " recent[0]==Close[0]: ", recent[0] == Close[0],
			" recent[2]==Close[2]: ", recent[2] == Close[2]);

	int c4 = ArrayCopy(recent, source, 3, 0, 2);	// コピー先の 3 番目から 2 要素
	Print("後ろへ足す: 戻り値=", c4, " ArraySize(recent)=", ArraySize(recent),
			" recent[3]=", recent[3], " recent[4]=", recent[4]);
	}

図の4つが、このサンプルの結果です。全部をコピーすると戻り値は5で、コピー先は5要素に広がりました。ArrayCopy(partial, source, 0, 2, 2) は、コピー元の2番目から2個を、コピー先の先頭へ入れるので、{3.0, 4.0} になります。時系列の Close から3本をコピーすると、戻り値は3で、recent[0]==Close[0] と recent[2]==Close[2] がどちらも true でした。

最後の呼び出しは、コピー先の3番目から2個を足す形です。戻り値は2で、ArraySize は5になり、recent[3] が1.0、recent[4] が2.0でした。コピー先の開始位置を、いまの要素数にそろえると、後ろへ足せます。

ArrayInitializeとArrayFill

ArrayInitialize は、配列の全要素を同じ値にします。公式の説明には戻り値の記載がなく、No return value とあります。ところが、手元のビルド1492では、double buf[100] に ArrayInitialize(buf, EMPTY_VALUE) を呼ぶと戻り値が100で、buf[99]==EMPTY_VALUE は true でした。戻り値は当てにせず、初期化だけに使うと決めておくと安全です。

配列の一部だけを同じ値にしたいときは、ArrayFill(void ArrayFill(array[], int start, int count, value))を使います。サンプルでは、10要素の配列に、0番目から5個を123、5番目から5個を456にして、a[0] と a[4] が123、a[5] と a[9] が456になりました。

ArrayRange・ArrayDimension・ArrayCompare

#property strict

void OnStart()
	{
	double grid[][3];											// 2 次元の動的配列(最初の次元だけ可変)
	ArrayResize(grid, 4);										// 最初の次元を 4 にする
	Print("ArraySize=", ArraySize(grid), " ArrayRange(0)=", ArrayRange(grid, 0),
			" ArrayRange(1)=", ArrayRange(grid, 1), " ArrayDimension=", ArrayDimension(grid));

	int a[];
	ArrayResize(a, 10);
	ArrayFill(a, 0, 5, 123);									// 0 番目から 5 個を 123 に
	ArrayFill(a, 5, 5, 456);									// 5 番目から 5 個を 456 に
	Print("ArrayFill: a[0]=", a[0], " a[4]=", a[4], " a[5]=", a[5], " a[9]=", a[9]);

	int x[] = {1, 2, 3};
	int y[] = {1, 2, 4};
	int z[] = {1, 2, 3};
	Print("ArrayCompare(x,y)=", ArrayCompare(x, y), " (y,x)=", ArrayCompare(y, x),
			" (x,z)=", ArrayCompare(x, z), " (x,y,0,0,2)=", ArrayCompare(x, y, 0, 0, 2));
	}

2次元の動的配列 double grid[][3] の最初の次元を4にすると、ArraySize は12、ArrayRange(grid, 0) は4、ArrayRange(grid, 1) は3、ArrayDimension は2でした。ArrayRange は、次元ごとの要素数を返します。

ArrayCompare は、2つの配列の中身を比べます。公式の説明では、戻り値は、同じなら0、1つめが小さければ-1、大きければ1で、エラーのときは-2です。サンプルでは、{1,2,3} と {1,2,4} の比較が-1、逆順が1、{1,2,3} どうしが0でした。比べる個数を2にすると、{1,2,3} と {1,2,4} も0になりました。

アドバイス

ArrayCopyの戻り値は、コピーした要素数。後ろへ足したいときは、コピー先の開始位置をいまの要素数にそろえようね。

MQL4 配列関数 ArraySort・ArrayBsearch|並べ替えと探索

ArraySortの4つの呼び出しについて、昇順・降順・一部だけ・時系列配列にしたときの並べ替え結果を並べた表
出典: 手元のMT4(XMTrading、ビルド1492)で実行した結果、2026年10月。ArraySortで並べ替えた結果。

ArraySortの引数と結果

宣言は bool ArraySort(array[], int count=WHOLE_ARRAY, int start=0, int direction=MODE_ASCEND) です。公式の説明では、配列の時系列の向きも考えて並べ替えます。第2引数が個数、第3引数が開始位置、第4引数が昇順か降順かの指定です。

#property strict

string Join(const double &a[])
	{
	string s = "";
	for(int i = 0; i < ArraySize(a); i++)
		s += (i > 0 ? "," : "") + DoubleToString(a[i], 0);
	return s;
	}

void OnStart()
	{
	double values[] = {5, 2, 8, 1, 9, 3};
	ArraySort(values);												// 昇順(既定)
	Print("昇順: ", Join(values));
	ArraySort(values, WHOLE_ARRAY, 0, MODE_DESCEND);		// 降順
	Print("降順: ", Join(values));

	double part[] = {5, 2, 8, 1, 9, 3};
	ArraySort(part, 3, 1);											// count=3, start=1: [1]〜[3] だけ
	Print("一部だけ: ", Join(part));

	double s[];															// 時系列にした配列
	ArrayResize(s, 4);
	s[0] = 3; s[1] = 1; s[2] = 4; s[3] = 2;
	ArraySetAsSeries(s, true);
	ArraySort(s);														// 昇順を指定
	Print("時系列のまま昇順: s[0]=", s[0], " s[3]=", s[3]);
	ArraySetAsSeries(s, false);									// 通常の向きで見直す
	Print("通常の向きで見ると: ", Join(s));

	double sorted[] = {1, 2, 3, 5, 8, 9};
	Print("ArrayBsearch(5)=", ArrayBsearch(sorted, 5.0));	// 値がある
	Print("ArrayBsearch(4)=", ArrayBsearch(sorted, 4.0));	// 値がない: 近い要素の位置
	Print("ArrayBsearch(7)=", ArrayBsearch(sorted, 7.0), " ArrayBsearch(0)=", ArrayBsearch(sorted, 0.0),
			" ArrayBsearch(10)=", ArrayBsearch(sorted, 10.0));
	double unsorted[] = {5, 2, 8, 1, 9, 3};
	Print("並べていない配列で ArrayBsearch(8)=", ArrayBsearch(unsorted, 8.0));
	}

{5, 2, 8, 1, 9, 3} を昇順にすると 1, 2, 3, 5, 8, 9、降順にすると 9, 8, 5, 3, 2, 1 になりました。ArraySort(part, 3, 1) は、番号1から3個だけを昇順にするので、5, 1, 2, 8, 9, 3 です。

時系列にした配列 {3, 1, 4, 2} を昇順にすると、時系列の向きで s[0] が1、s[3] が4になりました。通常の向きに戻して見ると、4, 3, 2, 1 です。時系列の配列でも、並べ替えは時系列の向きに合わせて行われます。通常の向きに戻してから並べ替える必要はありません。

ArrayBsearchは並べた配列だけ

ArrayBsearch は、昇順に並んだ配列から、値の位置を二分探索で探します。{1, 2, 3, 5, 8, 9} では、5を探すと3が返りました。値がない場合、公式の説明は近い位置を返すとしています。手元では、4を探すと2、7を探すと3、0を探すと0、10を探すと5でした。値以下で最も後ろの要素の位置が返っていて、7では、値が近い8(番号4)ではなく5(番号3)の位置です。

並べていない {5, 2, 8, 1, 9, 3} で8を探すと、正しい位置は2ですが、5が返りました。ArrayBsearch は、必ず ArraySort のあとに使います。

アドバイス

ArraySortは、時系列にした配列でも、その向きに合わせて並べてくれたよ。ArrayBsearchの前には必ず並べ替えよう。

MQL4 配列関数 ArrayMaximum・ArrayMinimum|引数の順番

ArrayMaximumの引数を個数3・開始位置1と個数1・開始位置3にしたとき、探した範囲と返った位置を色分けした2つの棒グラフ
出典: 手元のMT4(XMTrading、ビルド1492)で実行した結果、2026年10月。ArrayMaximumの引数の違い。

第2引数が個数、第3引数が開始位置

宣言は int ArrayMaximum(array[], int count=WHOLE_ARRAY, int start=0) で、ArrayMinimum も同じ形です。公式の説明では、戻り値は最大値の位置で、探せないときは-1です。MQL4では、個数が先、開始位置があとです。

#property strict

void OnStart()
	{
	double myData[] = {10.5, 20.3, 5.8, 15.2, 30.1};
	int maxIdx = ArrayMaximum(myData);						// 全体から探す
	int minIdx = ArrayMinimum(myData);
	Print("最大 ", myData[maxIdx], " は ", maxIdx, " 番目、最小 ", myData[minIdx], " は ", minIdx, " 番目");

	int a = ArrayMaximum(myData, 3, 1);						// 第2引数が count、第3引数が start
	int b = ArrayMaximum(myData, 1, 3);						// 順番を逆にすると別の範囲になる
	Print("ArrayMaximum(myData, 3, 1)=", a, "	ArrayMaximum(myData, 1, 3)=", b);

	int hi = iHighest(NULL, 0, MODE_CLOSE, 20, 1);		// 価格の配列を直接探す
	int ar = ArrayMaximum(Close, 20, 1);					// Close[] は時系列配列
	Print("iHighest=", hi, " ArrayMaximum(Close,20,1)=", ar, " 一致: ", hi == ar);
	}

{10.5, 20.3, 5.8, 15.2, 30.1} の全体から探すと、最大値は30.1で位置は4、最小値は5.8で位置は2でした。引数を付けた ArrayMaximum(myData, 3, 1) は、番号1から3個(20.3, 5.8, 15.2)を探して、20.3の位置1を返しました。順番を入れ替えた ArrayMaximum(myData, 1, 3) は、番号3から1個(15.2)を探すので、3が返ります。

2つの呼び出しは、引数が同じ数字でも、範囲がまったく違います。戻り値は位置なので、値を取るには、myData[ArrayMaximum(myData)] のように添え字へ入れます。

iHighestとの照合

チャートの価格を直接探す iHighest もあります。iHighest(NULL, 0, MODE_CLOSE, 20, 1) と、時系列配列の Close に対する ArrayMaximum(Close, 20, 1) を、EURUSDの15分足で同時に呼ぶと、どちらも13が返りました。1回の照合なので、一致する保証にはなりませんが、Close を ArrayMaximum に渡しても、iHighest と同じ位置を探せました。

アドバイス

MQL4のArrayMaximumは、配列・個数・開始位置の順だよ。順番を逆にすると、探す範囲が変わるから気をつけてね。

MQL4 配列関数 ArraySetAsSeries|時系列配列の向き

値100から104を入れた配列の番号が、通常は0から4、時系列にすると4から0になる様子を並べた図
出典: 手元のMT4(XMTrading、ビルド1492)で実行した結果、2026年10月。通常と時系列の番号の向き。

ArraySetAsSeriesで番号が逆になる

宣言は bool ArraySetAsSeries(array[], bool flag) です。公式の説明では、true にすると、配列の番号が時系列の向き(最新が0)になります。値は動かず、番号の振り方だけが変わります。

#property strict

void OnStart()
	{
	double data[];
	ArrayResize(data, 5);
	for(int i = 0; i < 5; i++)
		data[i] = 100 + i;											// 100, 101, 102, 103, 104

	Print("通常: [0]=", data[0], " [4]=", data[4], " 時系列か=", ArrayGetAsSeries(data));

	bool ok = ArraySetAsSeries(data, true);					// 値は動かず、番号の向きだけ変わる
	Print("時系列に変更: 戻り値=", ok, " [0]=", data[0], " [4]=", data[4]);

	double fixedArr[5];
	Print("静的配列に設定: 戻り値=", ArraySetAsSeries(fixedArr, true));

	Print("Close は時系列か=", ArrayIsSeries(Close), " Bars=", Bars, " ArraySize(Close)=", ArraySize(Close));
	Print("Time[0] は Time[1] より新しい: ", Time[0] > Time[1]);
	}

100〜104を入れた配列は、通常の向きでは [0] が100、[4] が104で、ArrayGetAsSeries は false でした。ArraySetAsSeries を true にすると、[0] が104、[4] が100になり、戻り値は true でした。

公式の説明では、静的配列にはこの設定ができないとされています。手元のビルド1492では、静的配列 double fixedArr[5] に呼んでも戻り値は true でした。公式の説明と違う動きなので、時系列にしたい配列は動的配列にしておくのが安全です。

Closeなどの定義済み配列

Close・High・Low・Open・Time・Volume は、最初から時系列の配列です。ArrayIsSeries で Close を調べると true で、Bars は65,000、ArraySize(Close) も65,000でした。Time[0]>Time[1] も true なので、[0]が現在の足で、番号が増えるほど過去になります。

価格の履歴を別の配列へ取る関数には、ArrayCopyRates(価格をまとめて配列にコピーして、コピーした本数を返す)と、ArrayCopySeries(指定した時系列配列を別の配列へコピーして、コピーした要素数を返す)があります。この2つは、この記事では実行していません。

アドバイス

ArraySetAsSeriesは、値を動かさず、番号の向きだけを変えるよ。Closeなどは、最初から最新が[0]だね。

MQL4 配列関数の動作確認|コンパイルと名前の照合

サンプル7本のコンパイル結果、実行した関数の数、関数名の照合結果、実行環境を項目別にまとめた表
出典: 手元のMT4(XMTrading、ビルド1492)で実行した結果、2026年10月。コンパイルと名前の照合のまとめ。

コンパイルと実行の結果

この記事のサンプルは、arr_resize・arr_copy・arr_sort・arr_max・arr_series・arr_reserve・arr_misc の7本です。MT4のMetaEditorでコンパイルして、7本ともエラー0・警告0でした。実行は、XMTradingのデモ口座のMT4(ビルド1492)に入っていた、EURUSDの15分足の履歴65,000本で行いました。

7本で実行した配列関数は、公式の索引19個のうち17個です。ArrayCopyRates と ArrayCopySeries は、実行していません。数字の「19個のうち17個」は、サンプルの中で関数名を1つ以上呼んでいるものを、関数ごとに1個と数えたものです。

関数名の照合と公式との違い

サンプルで呼んでいる関数名を、公式の関数索引と機械で突き合わせました。同じ関数が何度出ても1個と数えて、24個です。そのうち23個が索引にあり、索引になかったのは GetMicrosecondCount の1個でした。この関数は、公式に個別のページがあります。名前の綴りは、機械で確かめられています。

公式の説明と、手元のビルド1492の動きが違ったのは、3点です。静的配列に ArrayResize を呼ぶと、サイズが変わった。ArrayInitialize が要素数を返した。静的配列に ArraySetAsSeries を呼ぶと、true が返った。この3点は、別のビルドでは同じとは限らないので、サンプルでは使っていません。

アドバイス

サンプル7本は、エラー0・警告0でコンパイルできたよ。公式と動きが違った3点は、使わないでおくと安心だね。

MQL4 配列関数とMQL5の違い|引数の並びに注意

ArrayMaximum・ArrayMinimumとArraySortについて、MQL4とMQL5の引数の並びを並べた表
出典: docs.mql4.com と www.mql5.com/en/docs の各関数ページ、2026年10月に確認。引数の並びの違い。

引数が違う関数

MQL4のコードをMQL5へ移すときは、引数の並びに注意が要ります。ArrayMaximum と ArrayMinimum は、MQL4が(array, count, start)、MQL5が(array, start, count)で、個数と開始位置の順が逆です。ArraySort は、MQL4が4つの引数を取るのに対し、MQL5のArraySortは配列だけを渡す形で、降順の指定はありません。ArrayResize と ArrayCopy は、どちらも引数が同じでした。

移植のとき

引数の個数が同じでも、順番が違う関数は、コンパイルが通っても動きが変わる場合があります。MQL5のArrayMaximumに、MQL4の呼び出し ArrayMaximum(myData, 3, 1) をそのまま使うと、開始位置が3、個数が1の意味になります。MQL5側の記事は、MQL5 配列関数にまとめています。

アドバイス

MQL5へ移すときは、ArrayMaximum・ArrayMinimumの個数と開始位置の順、それとArraySortの引数を見直そうね。

要点
・MQL4の配列関数は、公式の索引に19個ある。使い方で5つに分けると探しやすい
・ArrayMaximum・ArrayMinimumは、配列・個数・開始位置の順。MQL5は開始位置・個数の順
・予約サイズありだと、10万要素を1つずつ増やす時間の中央値が、909.2ミリ秒から1.38ミリ秒になった(手元の1台、各5回)
・ArraySortは時系列にした配列でも、その向きに合わせて並べた。ArrayBsearchは並べた配列だけに使う
・サンプル7本は、エラー0・警告0でコンパイルできた。公式と動きが違った3点は、サンプルで使っていません

MQL4 配列関数のよくある質問

MQL4に配列関数はいくつありますか?

公式の索引に19個あります。サイズ、種類と向き、入れる・写す、並べる・探す、比べるの5つの使い方に分けられます。

ArrayMaximumの引数の順番は?

配列、個数、開始位置の順です。MQL5では開始位置、個数の順なので、MQL4から移すときは、入れ替えが要ります。

ArrayResizeを何度も呼ぶと遅くなりますか?

要素数が増えるほど、予約サイズなしは遅くなりました。1つずつ10万回増やした手元の測定では、予約なしの中央値が約0.9秒、予約ありが約1.4ミリ秒でした。

時系列にした配列に、ArraySortは使えますか?

使えます。手元の実行では、時系列にした配列を昇順にすると、[0]側から小さい順に並びました。

ArrayBsearchは、並べていない配列にも使えますか?

使えません。{5, 2, 8, 1, 9, 3} で8を探したところ、正しい位置の2ではなく5が返りました。先に ArraySort で並べてください。

配列関数の引数は、MQL4とMQL5で同じですか?

関数によって違います。ArrayResizeとArrayCopyは同じです。ArrayMaximum・ArrayMinimumは個数と開始位置が逆、ArraySortはMQL5だと配列だけを渡します。

MQL4 配列関数のまとめ

MQL4の配列関数は、公式の索引に19個あります。ArrayMaximumの引数は配列・個数・開始位置の順で、ArraySortは時系列にした配列でもその向きに合わせて並べ、ArrayBsearchは並べた配列だけに使います。7本のサンプルは、エラー0・警告0でコンパイルでき、手元のMT4(ビルド1492)で17個の関数を実行しました。予約サイズの測定では、10万要素を1つずつ増やす時間の中央値が、909.2ミリ秒から1.38ミリ秒になりました。

公式の説明と違った3点は、手元のビルドでの動きなので、サンプルでは使っていません。次は、チャートの操作をMQL4 チャート操作、エラーの読み方をMQL4 エラーコード、文字列の扱いをMQL4 文字列関数、ファイルの読み書きをMQL4 ファイル操作で確かめてください。インジケーターの値を取る関数は、MQL4 インジケーター関数にあります。関数全体の一覧は、MQLリファレンスから探せます。

この記事はMQL4のプログラミングの情報提供で、特定の取引をすすめるものではありません。FXには価格変動のリスクがあり、元本を超える損失が出ることもあります。取引は自己責任で、リスク管理を自分で決めて行ってください。

⚠ リスクに関する注意事項

本記事は情報提供を目的としており、特定の金融商品の売買を推奨するものではありません。FX取引はレバレッジ取引の特性上、預託した証拠金以上の損失が生じる可能性があります。取引の際は、ご自身の判断と責任において行ってください。詳しくは特定商取引法に基づく表記をご確認ください。

\シストレ.COMで実績のあるEAが使い放題!/
無料会員登録はこちら
FX自動売買でEAを探すなら
シストレ.COM 記事下バナー
実績あるEAが無料
厳格な審査を乗り越えた実績のあるEAが無料で使えます!
自由な口座選び
有料版を購入し柔軟な口座選びが可能!
フォワードテスト公開
全EAのフォワードテスト結果を公開中!
FX初心者も安心
初心者の方も安心して取引を始められます。
多様なEA選択肢
様々な種別のEAをご用意!自分の手法にあった取引が可能です。
信頼のFX会社と提携
人気のFX会社と提携中!様々なFX会社から選べます。
\1分で登録完了!EA探すならシストレ.COM!/
無料会員登録はこちら

この記事が気に入ったら
フォローしてね!

お役立ち情報をシェアする
  • URLをコピーしました!

この記事を書いた人

シストレ.COM編集部は、FX自動売買(EA)とテクニカル分析を専門とするインターネットメディア「シストレ.COM」の編集チームです。200本以上のEAのフォワードテスト結果を公開し、実際の運用データに基づいた客観的な情報を発信しています。記事の執筆・監修はMetaTrader(MT4/MT5)での実運用経験を持つスタッフが担当。

目次