<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>配列関数 アーカイブ - 自動売買を作ろう！</title>
	<atom:link href="https://mql-programing.com/archives/tag/%E9%85%8D%E5%88%97%E9%96%A2%E6%95%B0/feed/" rel="self" type="application/rss+xml" />
	<link>https://mql-programing.com/archives/tag/配列関数/</link>
	<description>MQLプログラミング学習サイト</description>
	<lastBuildDate>Wed, 01 Apr 2026 04:08:00 +0000</lastBuildDate>
	<language>ja</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=6.9.4</generator>

<image>
	<url>https://mql-programing.com/main29/wp-content/uploads/2021/02/cropped-ブログアイコン-32x32.jpg</url>
	<title>配列関数 アーカイブ - 自動売買を作ろう！</title>
	<link>https://mql-programing.com/archives/tag/配列関数/</link>
	<width>32</width>
	<height>32</height>
</image> 
	<item>
		<title>【MQL4】配列関数を完全マスター！ArraySize・ArrayResize・ArraySort・ArrayCopy・ArrayInitialize・ArraySetAsSeriesの使い方</title>
		<link>https://mql-programing.com/archives/13052/%e3%80%90mql4%e3%80%91%e9%85%8d%e5%88%97%e9%96%a2%e6%95%b0%e3%82%92%e5%ae%8c%e5%85%a8%e3%83%9e%e3%82%b9%e3%82%bf%e3%83%bc%ef%bc%81arraysize%e3%83%bbarrayresize%e3%83%bbarraysort%e3%83%bbarraycopy/</link>
		
		<dc:creator><![CDATA[朝日奈りさ]]></dc:creator>
		<pubDate>Sun, 19 Apr 2026 01:00:00 +0000</pubDate>
				<category><![CDATA[【中級編】MQLプログラムの読み方・書き方]]></category>
		<category><![CDATA[MQL4]]></category>
		<category><![CDATA[EA開発]]></category>
		<category><![CDATA[配列関数]]></category>
		<category><![CDATA[ArrayResize]]></category>
		<category><![CDATA[ArraySetAsSeries]]></category>
		<guid isPermaLink="false">https://mql-programing.com/?p=13052</guid>

					<description><![CDATA[<p>MQL4で自動売買（EA）やカスタムインジケーターを開発するとき、配列の操作は避けて通れません。価格データの格納、インジケーター値の計算、ソートによるランキング処理など、あらゆる場面で配列関数が活躍します。 この記事では [&#8230;]</p>
<p>投稿 <a href="https://mql-programing.com/archives/13052/%e3%80%90mql4%e3%80%91%e9%85%8d%e5%88%97%e9%96%a2%e6%95%b0%e3%82%92%e5%ae%8c%e5%85%a8%e3%83%9e%e3%82%b9%e3%82%bf%e3%83%bc%ef%bc%81arraysize%e3%83%bbarrayresize%e3%83%bbarraysort%e3%83%bbarraycopy/">【MQL4】配列関数を完全マスター！ArraySize・ArrayResize・ArraySort・ArrayCopy・ArrayInitialize・ArraySetAsSeriesの使い方</a> は <a href="https://mql-programing.com">自動売買を作ろう！</a> に最初に表示されました。</p>
]]></description>
										<content:encoded><![CDATA[<p>MQL4で自動売買（EA）やカスタムインジケーターを開発するとき、<strong>配列の操作</strong>は避けて通れません。価格データの格納、インジケーター値の計算、ソートによるランキング処理など、あらゆる場面で配列関数が活躍します。</p>
<p>この記事では、MQL4で特に使用頻度の高い<strong>6つの配列関数</strong>を体系的に解説します。</p>
<ul>
<li><strong>ArraySize()</strong> – 要素数の取得</li>
<li><strong>ArrayResize()</strong> – サイズの動的変更</li>
<li><strong>ArrayInitialize()</strong> – 全要素の一括初期化</li>
<li><strong>ArrayCopy()</strong> – 配列のコピー</li>
<li><strong>ArraySort()</strong> – ソート（並び替え）</li>
<li><strong>ArraySetAsSeries()</strong> – 時系列インデックスへの変換</li>
</ul>
<p>それぞれの関数について、基本的な使い方・注意点・実践的なコードサンプルを交えながら丁寧に解説していきます。</p>
<h2><span id="toc1">ArraySize() – 配列の要素数を取得する</span></h2>
<p><code>ArraySize()</code>は、配列に含まれる<strong>全要素数</strong>を返す関数です。ループ処理で配列の全要素を走査するときに欠かせません。</p>
<h3><span id="toc2">基本構文</span></h3>
<pre><code class="language-mql5">int ArraySize(
   const void&amp; array[]   // 対象の配列
);
</code></pre>
<h3><span id="toc3">基本的な使い方</span></h3>
<pre><code class="language-mql5">void OnStart()
{
   double prices[5] = {100.0, 101.5, 102.3, 99.8, 100.7};

   int size = ArraySize(prices);
   Print("要素数: ", size);  // 出力: 要素数: 5

   // ループ処理での活用
   for(int i = 0; i &lt; ArraySize(prices); i++)
   {
      Print("prices[", i, "] = ", prices[i]);
   }
}
</code></pre>
<h3><span id="toc4">多次元配列での注意点</span></h3>
<p><code>ArraySize()</code>は多次元配列に対しては、<strong>全次元の要素数の積（全要素数）</strong>を返します。特定の次元の要素数だけを知りたい場合は<code>ArrayRange()</code>を使いましょう。</p>
<pre><code class="language-mql5">void OnStart()
{
   double matrix[3][4];  // 3行4列の二次元配列

   Print("ArraySize: ", ArraySize(matrix));       // 出力: 12（3×4）
   Print("第1次元: ", ArrayRange(matrix, 0));      // 出力: 3
   Print("第2次元: ", ArrayRange(matrix, 1));      // 出力: 4
}
</code></pre>
<h2><span id="toc5">ArrayResize() – 配列のサイズを動的に変更する</span></h2>
<p><code>ArrayResize()</code>は、<strong>動的配列</strong>のサイズを変更する関数です。EAの運用中にデータが増減する場面で大活躍します。</p>
<h3><span id="toc6">基本構文</span></h3>
<pre><code class="language-mql5">int ArrayResize(
   void&amp; array[],         // サイズ変更する配列
   int    new_size,        // 新しいサイズ
   int    reserve_size=0   // 予約サイズ（省略可）
);
</code></pre>
<p>戻り値は、成功した場合は新しいサイズ、失敗した場合は<strong>-1</strong>です。</p>
<h3><span id="toc7">基本的な使い方</span></h3>
<pre><code class="language-mql5">void OnStart()
{
   double data[];  // 動的配列（サイズ未指定）

   // サイズを5に設定
   ArrayResize(data, 5);
   Print("サイズ: ", ArraySize(data));  // 出力: 5

   // データを格納
   for(int i = 0; i &lt; 5; i++)
      data[i] = i * 1.5;

   // サイズを10に拡張（既存データは保持される）
   ArrayResize(data, 10);
   Print("拡張後サイズ: ", ArraySize(data));  // 出力: 10
   Print("data[2] = ", data[2]);  // 出力: 3.0（既存データは保持）
}
</code></pre>
<h3><span id="toc8">reserve_sizeでパフォーマンスを改善する</span></h3>
<p>ループ内で何度も<code>ArrayResize()</code>を呼ぶと、メモリの再割り当てが頻繁に発生しパフォーマンスが低下します。第3引数の<code>reserve_size</code>を指定することで、あらかじめメモリを多めに確保し、再割り当ての回数を減らせます。</p>
<pre><code class="language-mql5">void OnStart()
{
   double ticks[];
   int count = 0;

   // 悪い例：毎回メモリ再割り当てが発生
   // for(int i = 0; i &lt; 10000; i++)
   // {
   //    ArrayResize(ticks, ++count);
   //    ticks[count - 1] = Bid;
   // }

   // 良い例：reserve_sizeで事前にメモリを確保
   for(int i = 0; i &lt; 10000; i++)
   {
      ArrayResize(ticks, ++count, 10000);  // 最大10000要素分を予約
      ticks[count - 1] = Bid;
   }
}
</code></pre>
<p>大量のデータを扱うEAでは、この<code>reserve_size</code>の指定が処理速度に大きく影響します。ぜひ覚えておきましょう。</p>
<h2><span id="toc9">ArrayInitialize() – 全要素を一括で初期化する</span></h2>
<p><code>ArrayInitialize()</code>は、配列の<strong>全要素を指定した値で一括初期化</strong>する関数です。</p>
<h3><span id="toc10">基本構文</span></h3>
<pre><code class="language-mql5">int ArrayInitialize(
   double&amp; array[],   // 初期化する配列
   double  value       // セットする値
);
</code></pre>
<h3><span id="toc11">基本的な使い方</span></h3>
<pre><code class="language-mql5">void OnStart()
{
   double buffer[10];

   // 全要素を0.0で初期化
   ArrayInitialize(buffer, 0.0);

   for(int i = 0; i &lt; ArraySize(buffer); i++)
      Print("buffer[", i, "] = ", buffer[i]);  // すべて0.0
}
</code></pre>
<h3><span id="toc12">ArrayResizeとの組み合わせが重要</span></h3>
<p><code>ArrayResize()</code>でサイズを拡張した直後、新しく追加された要素の値は<strong>不定（ゴミ値）</strong>です。そのため、拡張後に<code>ArrayInitialize()</code>で初期化するのが安全なパターンです。</p>
<pre><code class="language-mql5">void OnStart()
{
   double data[];

   ArrayResize(data, 10);
   ArrayInitialize(data, 0.0);  // 拡張後は必ず初期化！

   Print("data[5] = ", data[5]);  // 安全に0.0が入っている
}
</code></pre>
<h2><span id="toc13">ArrayCopy() – 配列を別の配列にコピーする</span></h2>
<p><code>ArrayCopy()</code>は、配列の全体または一部を別の配列にコピーする関数です。</p>
<h3><span id="toc14">基本構文</span></h3>
<pre><code class="language-mql5">int ArrayCopy(
   void&amp; dst_array[],      // コピー先
   const void&amp; src_array[], // コピー元
   int   dst_start=0,       // コピー先の開始位置
   int   src_start=0,       // コピー元の開始位置
   int   count=WHOLE_ARRAY  // コピーする要素数
);
</code></pre>
<p>戻り値はコピーされた要素数です。</p>
<h3><span id="toc15">基本的な使い方</span></h3>
<pre><code class="language-mql5">void OnStart()
{
   double source[5] = {1.1, 2.2, 3.3, 4.4, 5.5};
   double dest[];

   // 全要素をコピー（destは自動でリサイズされる）
   ArrayCopy(dest, source);
   Print("dest[2] = ", dest[2]);  // 出力: 3.3

   // 部分コピー：sourceのインデックス1から3要素をdest2のインデックス0にコピー
   double dest2[3];
   ArrayCopy(dest2, source, 0, 1, 3);
   // dest2 = {2.2, 3.3, 4.4}
   for(int i = 0; i &lt; ArraySize(dest2); i++)
      Print("dest2[", i, "] = ", dest2[i]);
}
</code></pre>
<p>部分コピーを使いこなすと、直近N本のデータだけを抜き出す処理などが簡潔に書けます。</p>
<h2><span id="toc16">ArraySort() – 配列をソート（並び替え）する</span></h2>
<p><code>ArraySort()</code>は、配列の要素を<strong>昇順</strong>にソートする関数です。</p>
<h3><span id="toc17">基本構文</span></h3>
<pre><code class="language-mql5">bool ArraySort(
   void&amp; array[]   // ソートする配列
);
</code></pre>
<p>MQL4の<code>ArraySort()</code>は<strong>昇順のみ</strong>に対応しています。</p>
<h3><span id="toc18">基本的な使い方</span></h3>
<pre><code class="language-mql5">void OnStart()
{
   double values[5] = {3.5, 1.2, 4.8, 2.1, 3.9};

   // 昇順ソート
   ArraySort(values);

   for(int i = 0; i &lt; ArraySize(values); i++)
      Print("values[", i, "] = ", values[i]);
   // 出力: 1.2, 2.1, 3.5, 3.9, 4.8
}
</code></pre>
<h3><span id="toc19">降順にしたい場合</span></h3>
<p>MQL4の<code>ArraySort()</code>には降順オプションがないため、昇順ソート後に逆順で読むか、別の配列に逆順コピーする方法を使います。</p>
<pre><code class="language-mql5">void OnStart()
{
   double values[5] = {3.5, 1.2, 4.8, 2.1, 3.9};

   // まず昇順ソート
   ArraySort(values);

   // 逆順で読み取ることで降順として扱う
   int size = ArraySize(values);
   for(int i = size - 1; i &gt;= 0; i--)
      Print("降順 values[", (size - 1 - i), "] = ", values[i]);
   // 出力: 4.8, 3.9, 3.5, 2.1, 1.2
}
</code></pre>
<h3><span id="toc20">注意点：時系列配列はソートできない</span></h3>
<p><code>ArraySetAsSeries()</code>で時系列フラグが設定された配列は、<code>ArraySort()</code>でソートできません。ソートしたい場合は、まず通常の配列にコピーしてからソートしましょう。</p>
<h2><span id="toc21">ArraySetAsSeries() – 時系列インデックスに変換する</span></h2>
<p><code>ArraySetAsSeries()</code>は、配列のインデックスの方向を<strong>時系列方向</strong>に変更する関数です。MetaTraderのチャートデータは最新のバー（ローソク足）がインデックス0になっていますが、通常の配列は先頭がインデックス0です。この違いを吸収するのがこの関数です。</p>
<h3><span id="toc22">基本構文</span></h3>
<pre><code class="language-mql5">bool ArraySetAsSeries(
   const void&amp; array[],  // 対象の配列
   bool        flag       // true=時系列, false=通常
);
</code></pre>
<h3><span id="toc23">通常配列と時系列配列の違い</span></h3>
<pre><code class="language-mql5">// 通常の配列（左から右へインデックスが増加）
// index:  [0]  [1]  [2]  [3]  [4]
// データ:  古い ←――――――――――→ 新しい

// 時系列配列（右から左へインデックスが増加）
// index:  [4]  [3]  [2]  [1]  [0]
// データ:  古い ←――――――――――→ 新しい
</code></pre>
<h3><span id="toc24">基本的な使い方</span></h3>
<pre><code class="language-mql5">void OnStart()
{
   double closeArray[];

   // 直近10本の終値を取得
   ArraySetAsSeries(closeArray, true);  // 時系列方向に設定
   CopyClose(Symbol(), PERIOD_CURRENT, 0, 10, closeArray);

   // closeArray[0] = 最新バーの終値
   // closeArray[1] = 1つ前のバーの終値
   // closeArray[9] = 9つ前のバーの終値
   Print("最新の終値: ", closeArray[0]);
   Print("1つ前の終値: ", closeArray[1]);
}
</code></pre>
<h3><span id="toc25">インジケーター開発での活用</span></h3>
<p>カスタムインジケーターの<code>OnCalculate()</code>関数では、引数として渡される価格配列のインデックス方向が不定の場合があります。そのため、関数の冒頭で<code>ArraySetAsSeries()</code>を呼んでインデックス方向を統一するのが定番のパターンです。</p>
<pre><code class="language-mql5">int OnCalculate(const int rates_total,
                const int prev_calculated,
                const datetime &amp;time[],
                const double &amp;open[],
                const double &amp;high[],
                const double &amp;low[],
                const double &amp;close[],
                const long &amp;tick_volume[],
                const long &amp;volume[],
                const int &amp;spread[])
{
   // インデックス方向を時系列に統一
   ArraySetAsSeries(close, true);
   ArraySetAsSeries(high, true);
   ArraySetAsSeries(low, true);

   // これで close[0] が最新バーの終値になる
   // ... インジケーターの計算処理 ...

   return(rates_total);
}
</code></pre>
<h2><span id="toc26">実践テクニック：6つの関数を組み合わせて使う</span></h2>
<p>ここまで学んだ6つの関数を組み合わせた実践的なサンプルを見てみましょう。直近N本のバーから<strong>最高値トップ3</strong>を抽出する処理です。</p>
<pre><code class="language-mql5">void OnStart()
{
   int period = 20;  // 直近20本のバーを対象

   // 1. 高値データを格納する動的配列を準備
   double highPrices[];
   ArrayResize(highPrices, period);       // サイズを設定
   ArrayInitialize(highPrices, 0.0);      // 初期化

   // 2. 直近の高値データを取得
   double tempHigh[];
   ArraySetAsSeries(tempHigh, true);      // 時系列方向に設定
   CopyHigh(Symbol(), PERIOD_CURRENT, 0, period, tempHigh);

   // 3. 作業用配列にコピー
   ArrayCopy(highPrices, tempHigh, 0, 0, period);

   // 4. 昇順ソートしてトップ3を取得（末尾3要素が最大値）
   ArraySort(highPrices);

   int size = ArraySize(highPrices);
   Print("=== 直近", period, "本の高値トップ3 ===");
   for(int i = 0; i &lt; 3; i++)
   {
      Print("第", (i + 1), "位: ", highPrices[size - 1 - i]);
   }
}
</code></pre>
<p>このように、<code>ArrayResize</code>→<code>ArrayInitialize</code>→<code>ArraySetAsSeries</code>→<code>ArrayCopy</code>→<code>ArraySort</code>→<code>ArraySize</code>と、6つの関数を自然に組み合わせて使えるようになると、実践的なEA開発がスムーズに進みます。</p>
<h2><span id="toc27">配列関数 早見表</span></h2>
<table>
<thead>
<tr>
<th>関数名</th>
<th>機能</th>
<th>主な使用場面</th>
</tr>
</thead>
<tbody>
<tr>
<td><strong>ArraySize()</strong></td>
<td>要素数を取得</td>
<td>ループの上限値、配列が空かの判定</td>
</tr>
<tr>
<td><strong>ArrayResize()</strong></td>
<td>サイズを動的に変更</td>
<td>データ数が実行時に決まる場合</td>
</tr>
<tr>
<td><strong>ArrayInitialize()</strong></td>
<td>全要素を一括初期化</td>
<td>ArrayResize後のゴミ値対策</td>
</tr>
<tr>
<td><strong>ArrayCopy()</strong></td>
<td>配列の全体/部分コピー</td>
<td>データのバックアップ、部分抽出</td>
</tr>
<tr>
<td><strong>ArraySort()</strong></td>
<td>昇順ソート</td>
<td>ランキング処理、中央値の算出</td>
</tr>
<tr>
<td><strong>ArraySetAsSeries()</strong></td>
<td>インデックス方向を時系列に変換</td>
<td>インジケーター開発、価格データ操作</td>
</tr>
</tbody>
</table>
<h2><span id="toc28">まとめ</span></h2>
<p>今回はMQL4の主要な配列関数6つについて解説しました。ポイントを振り返りましょう。</p>
<ul>
<li><strong>ArraySize()</strong>はループ処理の必須パートナー。多次元配列では全要素数が返る点に注意</li>
<li><strong>ArrayResize()</strong>は第3引数の<code>reserve_size</code>を活用してパフォーマンスを改善</li>
<li><strong>ArrayInitialize()</strong>はArrayResize後のゴミ値を防ぐために必ずセットで使う</li>
<li><strong>ArrayCopy()</strong>は部分コピーが便利。引数の順番（コピー先が最初）を間違えないように</li>
<li><strong>ArraySort()</strong>はMQL4では昇順のみ。降順が必要なら逆順で読み取る</li>
<li><strong>ArraySetAsSeries()</strong>はインジケーター開発の定番。<code>close[0]</code>を最新バーにするために使う</li>
</ul>
<p>これら6つの関数を使いこなせれば、EA開発やインジケーター作成の幅が大きく広がります。まずは実際にスクリプトやEAの中で試してみて、配列操作に慣れていきましょう！</p>
<p>投稿 <a href="https://mql-programing.com/archives/13052/%e3%80%90mql4%e3%80%91%e9%85%8d%e5%88%97%e9%96%a2%e6%95%b0%e3%82%92%e5%ae%8c%e5%85%a8%e3%83%9e%e3%82%b9%e3%82%bf%e3%83%bc%ef%bc%81arraysize%e3%83%bbarrayresize%e3%83%bbarraysort%e3%83%bbarraycopy/">【MQL4】配列関数を完全マスター！ArraySize・ArrayResize・ArraySort・ArrayCopy・ArrayInitialize・ArraySetAsSeriesの使い方</a> は <a href="https://mql-programing.com">自動売買を作ろう！</a> に最初に表示されました。</p>
]]></content:encoded>
					
		
		
			</item>
	</channel>
</rss>
