<?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/%e3%82%a4%e3%83%b3%e3%82%b8%e3%82%b1%e3%83%bc%e3%82%bf/feed/" rel="self" type="application/rss+xml" />
	<link>https://mql-programing.com/archives/tag/インジケータ/</link>
	<description>MQLプログラミング学習サイト</description>
	<lastBuildDate>Tue, 31 Mar 2026 11:39:55 +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関数】OnCalculate関数とは？ロウソク足が動くたびに実行されるイベント関数</title>
		<link>https://mql-programing.com/archives/3471/oncalculate/</link>
		
		<dc:creator><![CDATA[朝日奈りさ]]></dc:creator>
		<pubDate>Mon, 23 May 2022 12:19:49 +0000</pubDate>
				<category><![CDATA[関数]]></category>
		<category><![CDATA[【中級編】MQLプログラムの読み方・書き方]]></category>
		<category><![CDATA[【辞書】MQLリファレンス]]></category>
		<category><![CDATA[その他]]></category>
		<category><![CDATA[MQL]]></category>
		<category><![CDATA[リファレンス]]></category>
		<category><![CDATA[自動売買]]></category>
		<category><![CDATA[イベント関数]]></category>
		<category><![CDATA[OnCalculate]]></category>
		<category><![CDATA[インジケータ]]></category>
		<guid isPermaLink="false">https://mql-programing.com/?p=3471</guid>

					<description><![CDATA[<p>OnCalculate関数とは？ OnCalculate()は、カスタムインジケータ専用のイベント関数で、チャートに新しい価格データ（ティック）が到着するたびに自動的に呼び出されます。ロウソク足の値動きが発生するたびに実 [&#8230;]</p>
<p>投稿 <a href="https://mql-programing.com/archives/3471/oncalculate/">【MQL4関数】OnCalculate関数とは？ロウソク足が動くたびに実行されるイベント関数</a> は <a href="https://mql-programing.com">自動売買を作ろう！</a> に最初に表示されました。</p>
]]></description>
										<content:encoded><![CDATA[<h2><span id="toc1">OnCalculate関数とは？</span></h2>
<p>OnCalculate()は、<strong>カスタムインジケータ専用のイベント関数</strong>で、チャートに新しい価格データ（ティック）が到着するたびに自動的に呼び出されます。ロウソク足の値動きが発生するたびに実行されるため、移動平均線やRSIなどのテクニカル指標の計算処理をこの関数の中に記述します。</p>
<p>EA（エキスパートアドバイザー）における <code>OnTick()</code> に相当する役割を持ちますが、OnCalculate()はインジケータバッファへの描画計算に特化した設計になっています。</p>
<h2><span id="toc2">OnCalculate関数の2つの書式</span></h2>
<p>OnCalculate()には<strong>2つの書式</strong>があります。1つのインジケータで使えるのはどちらか一方のみです。</p>
<h3><span id="toc3">書式1：短縮形（シンプル版）</span></h3>
<p>チャートの価格データ（始値・高値・安値・終値など）を直接受け取る形式です。最も一般的に使われます。</p>
<pre><code class="language-mql4">int OnCalculate(const int rates_total,      // 利用可能なバーの総数
                const int prev_calculated,   // 前回呼び出し時の計算済みバー数
                const datetime &time[],      // 各バーの時刻
                const double &open[],        // 始値
                const double &high[],        // 高値
                const double &low[],         // 安値
                const double &close[],       // 終値
                const long &tick_volume[],   // ティックボリューム
                const long &volume[],        // 実ボリューム
                const int &spread[])         // スプレッド
</code></pre>
<h3><span id="toc4">書式2：OnInit()でのSetIndexBuffer連携版</span></h3>
<p>他のインジケータの値を入力として使う場合に利用します。<code>#property indicator_separate_window</code>を使うインジケータなどで使われます。</p>
<pre><code class="language-mql4">int OnCalculate(const int rates_total,      // 利用可能なデータ数
                const int prev_calculated,   // 前回呼び出し時の計算済みデータ数
                const int begin,             // 意味のあるデータの開始位置
                const double &price[])       // 計算対象の価格配列
</code></pre>
<h2><span id="toc5">引数の詳細解説</span></h2>
<table>
<thead>
<tr>
<th>引数</th>
<th>型</th>
<th>説明</th>
</tr>
</thead>
<tbody>
<tr>
<td>rates_total</td>
<td>int</td>
<td>チャート上の全バー数。<code>Bars</code>と同等の値</td>
</tr>
<tr>
<td>prev_calculated</td>
<td>int</td>
<td>前回のOnCalculate()呼び出しで返した戻り値。初回は<strong>0</strong></td>
</tr>
<tr>
<td>time[]</td>
<td>datetime</td>
<td>各バーの開始時刻の配列</td>
</tr>
<tr>
<td>open[]</td>
<td>double</td>
<td>各バーの始値の配列</td>
</tr>
<tr>
<td>high[]</td>
<td>double</td>
<td>各バーの高値の配列</td>
</tr>
<tr>
<td>low[]</td>
<td>double</td>
<td>各バーの安値の配列</td>
</tr>
<tr>
<td>close[]</td>
<td>double</td>
<td>各バーの終値の配列</td>
</tr>
<tr>
<td>tick_volume[]</td>
<td>long</td>
<td>各バーのティックボリューム</td>
</tr>
<tr>
<td>volume[]</td>
<td>long</td>
<td>各バーの実ボリューム（対応サーバーのみ）</td>
</tr>
<tr>
<td>spread[]</td>
<td>int</td>
<td>各バーのスプレッド（ポイント単位）</td>
</tr>
<tr>
<td>begin</td>
<td>int</td>
<td>（書式2のみ）有効データの開始インデックス</td>
</tr>
<tr>
<td>price[]</td>
<td>double</td>
<td>（書式2のみ）計算に使う価格データ配列</td>
</tr>
</tbody>
</table>
<h2><span id="toc6">戻り値</span></h2>
<p>OnCalculate()は<strong>int型</strong>の値を返します。この戻り値は、<strong>次回呼び出し時に <code>prev_calculated</code> 引数として渡されます</strong>。</p>
<ul>
<li>通常は <code>rates_total</code> を返します（すべてのバーを計算済みという意味）</li>
<li><strong>0を返す</strong>と、次回の呼び出しで全バーを再計算します</li>
<li>初回呼び出し時は <code>prev_calculated</code> が0になるため、全バーの計算が行われます</li>
</ul>
<h2><span id="toc7">prev_calculatedの仕組み（重要）</span></h2>
<p><code>prev_calculated</code> は、OnCalculate()の<strong>パフォーマンス最適化の鍵</strong>となる引数です。毎回すべてのバーを計算し直すのではなく、新しいバーだけを計算することで処理を高速化します。</p>
<pre><code class="language-mql4">// prev_calculatedの動作イメージ
// 
// 1回目の呼び出し: prev_calculated = 0  → 全バーを計算
//   戻り値として rates_total（例：1000）を返す
//
// 2回目の呼び出し: prev_calculated = 1000
//   rates_total = 1000（新しいバーなし）→ 最後のバーだけ更新
//   rates_total = 1001（新しいバーあり）→ 新しいバーだけ計算
</code></pre>
<h2><span id="toc8">プログラム例1：最もシンプルな終値ラインインジケータ</span></h2>
<p>まずは最も基本的な例として、終値をそのままラインとして描画するインジケータを作成します。OnCalculate()の基本構造と<code>prev_calculated</code>の使い方を理解するのに最適です。</p>
<pre><code class="language-mql4">//+------------------------------------------------------------------+
//| 終値ラインインジケータ（OnCalculateの基本構造を学ぶ）             |
//+------------------------------------------------------------------+
#property indicator_chart_window        // メインチャートに表示
#property indicator_buffers 1           // バッファ数：1本
#property indicator_color1 clrDodgerBlue // ラインの色
#property indicator_width1 2            // ラインの太さ

// インジケータバッファ
double LineBuffer[];

//+------------------------------------------------------------------+
//| 初期化関数                                                        |
//+------------------------------------------------------------------+
int OnInit()
{
   // バッファをインジケータラインとして割り当て
   SetIndexBuffer(0, LineBuffer);
   SetIndexStyle(0, DRAW_LINE);
   SetIndexLabel(0, "終値ライン");
   
   return(INIT_SUCCEEDED);
}

//+------------------------------------------------------------------+
//| OnCalculate - ティックごとに呼ばれるメイン関数                    |
//+------------------------------------------------------------------+
int OnCalculate(const int rates_total,
                const int prev_calculated,
                const datetime &time[],
                const double &open[],
                const double &high[],
                const double &low[],
                const double &close[],
                const long &tick_volume[],
                const long &volume[],
                const int &spread[])
{
   // 計算開始位置を決定
   // prev_calculated == 0 なら全バーを計算（初回 or 再計算）
   // それ以外なら、最後のバーから計算（効率化）
   int start;
   if(prev_calculated == 0)
      start = 0;                        // 初回：最初のバーから
   else
      start = prev_calculated - 1;      // 2回目以降：最後のバーから
   
   // 計算ループ
   for(int i = start; i < rates_total; i++)
   {
      LineBuffer[i] = close[i];         // 終値をそのままバッファに格納
   }
   
   // rates_totalを返すことで、次回のprev_calculatedに反映される
   return(rates_total);
}
</code></pre>
<p>このコードのポイントは、<code>prev_calculated</code>を活用した計算開始位置の決定です。初回はすべてのバーを計算し、2回目以降は最後のバーだけを更新するため、処理が非常に軽くなります。</p>
<h2><span id="toc9">プログラム例2：単純移動平均（SMA）インジケータ</span></h2>
<p>次に、実用的な単純移動平均線（SMA）を自作します。外部パラメータで期間を変更でき、<code>prev_calculated</code>による最適化も実装しています。</p>
<pre><code class="language-mql4">//+------------------------------------------------------------------+
//| 自作SMA（単純移動平均線）インジケータ                              |
//+------------------------------------------------------------------+
#property indicator_chart_window
#property indicator_buffers 1
#property indicator_color1 clrRed
#property indicator_width1 2

// 外部パラメータ（ユーザーが変更可能）
input int    MaPeriod = 20;             // 移動平均の期間
input int    MaShift  = 0;              // 表示をシフトするバー数

// インジケータバッファ
double MaBuffer[];

//+------------------------------------------------------------------+
//| 初期化関数                                                        |
//+------------------------------------------------------------------+
int OnInit()
{
   // パラメータチェック
   if(MaPeriod < 1)
   {
      Print("エラー: 期間は1以上を指定してください");
      return(INIT_PARAMETERS_INCORRECT);
   }
   
   SetIndexBuffer(0, MaBuffer);
   SetIndexStyle(0, DRAW_LINE);
   SetIndexShift(0, MaShift);           // ラインの水平シフト
   SetIndexLabel(0, "SMA(" + IntegerToString(MaPeriod) + ")");
   
   // 最初のMaPeriod-1本は描画しない（データ不足のため）
   SetIndexDrawBegin(0, MaPeriod);
   
   return(INIT_SUCCEEDED);
}

//+------------------------------------------------------------------+
//| OnCalculate - SMAの計算処理                                       |
//+------------------------------------------------------------------+
int OnCalculate(const int rates_total,
                const int prev_calculated,
                const datetime &#038;time[],
                const double &#038;open[],
                const double &#038;high[],
                const double &#038;low[],
                const double &#038;close[],
                const long &#038;tick_volume[],
                const long &#038;volume[],
                const int &#038;spread[])
{
   // データが移動平均の期間に満たない場合は計算しない
   if(rates_total < MaPeriod)
      return(0);
   
   // 計算開始位置の決定
   int start;
   if(prev_calculated == 0)
      start = MaPeriod - 1;             // 初回：期間分のデータが揃った位置から
   else
      start = prev_calculated - 1;      // 2回目以降：最後のバーから
   
   // SMAの計算ループ
   for(int i = start; i < rates_total; i++)
   {
      double sum = 0.0;
      
      // 現在のバーからMaPeriod本分の終値を合計
      for(int j = 0; j < MaPeriod; j++)
      {
         sum += close[i - j];
      }
      
      // 平均値をバッファに格納
      MaBuffer[i] = sum / MaPeriod;
   }
   
   return(rates_total);
}
</code></pre>
<p><code>SetIndexDrawBegin()</code> を使って、データが不足する最初の数本のバーでは描画を行わないようにしている点に注目してください。</p>
<h2><span id="toc10">プログラム例3：高値・安値バンドインジケータ（複数バッファ）</span></h2>
<p>複数のインジケータバッファを使い、指定期間の高値ラインと安値ラインを同時に描画する例です。ドンチャンチャネルに似たバンド型インジケータを作成します。</p>
<pre><code class="language-mql4">//+------------------------------------------------------------------+
//| 高値・安値バンドインジケータ（ドンチャンチャネル風）               |
//+------------------------------------------------------------------+
#property indicator_chart_window
#property indicator_buffers 3           // バッファ3本（高値・安値・中間線）
#property indicator_color1 clrDeepSkyBlue   // 高値バンド
#property indicator_color2 clrOrangeRed     // 安値バンド
#property indicator_color3 clrGray          // 中間線
#property indicator_width1 2
#property indicator_width2 2
#property indicator_style3 STYLE_DOT    // 中間線は点線

// 外部パラメータ
input int BandPeriod = 20;              // バンドの期間

// インジケータバッファ
double HighBand[];                      // 高値バンド
double LowBand[];                       // 安値バンド
double MidLine[];                       // 中間線

//+------------------------------------------------------------------+
//| 初期化関数                                                        |
//+------------------------------------------------------------------+
int OnInit()
{
   if(BandPeriod < 2)
   {
      Print("エラー: 期間は2以上を指定してください");
      return(INIT_PARAMETERS_INCORRECT);
   }
   
   // バッファの割り当て
   SetIndexBuffer(0, HighBand);
   SetIndexBuffer(1, LowBand);
   SetIndexBuffer(2, MidLine);
   
   // 描画スタイルの設定
   SetIndexStyle(0, DRAW_LINE);
   SetIndexStyle(1, DRAW_LINE);
   SetIndexStyle(2, DRAW_LINE);
   
   // ラベル設定
   SetIndexLabel(0, "高値バンド(" + IntegerToString(BandPeriod) + ")");
   SetIndexLabel(1, "安値バンド(" + IntegerToString(BandPeriod) + ")");
   SetIndexLabel(2, "中間線");
   
   // 描画開始位置
   SetIndexDrawBegin(0, BandPeriod);
   SetIndexDrawBegin(1, BandPeriod);
   SetIndexDrawBegin(2, BandPeriod);
   
   return(INIT_SUCCEEDED);
}

//+------------------------------------------------------------------+
//| OnCalculate - 高値・安値バンドの計算                               |
//+------------------------------------------------------------------+
int OnCalculate(const int rates_total,
                const int prev_calculated,
                const datetime &#038;time[],
                const double &#038;open[],
                const double &#038;high[],
                const double &#038;low[],
                const double &#038;close[],
                const long &#038;tick_volume[],
                const long &#038;volume[],
                const int &#038;spread[])
{
   // データ不足チェック
   if(rates_total < BandPeriod)
      return(0);
   
   // 計算開始位置
   int start;
   if(prev_calculated == 0)
      start = BandPeriod - 1;
   else
      start = prev_calculated - 1;
   
   // バンドの計算
   for(int i = start; i < rates_total; i++)
   {
      double highestHigh = high[i];     // 最高値の初期値
      double lowestLow   = low[i];      // 最安値の初期値
      
      // 過去BandPeriod本のバーから最高値・最安値を探す
      for(int j = 0; j < BandPeriod; j++)
      {
         if(high[i - j] > highestHigh)
            highestHigh = high[i - j];
         if(low[i - j] < lowestLow)
            lowestLow = low[i - j];
      }
      
      // バッファに格納
      HighBand[i] = highestHigh;        // 期間内の最高値
      LowBand[i]  = lowestLow;          // 期間内の最安値
      MidLine[i]   = (highestHigh + lowestLow) / 2.0;  // 中間値
   }
   
   return(rates_total);
}
</code></pre>
<p>3本のバッファを同時に使うことで、チャート上にバンド（帯域）を視覚的に表示できます。<code>SetIndexStyle()</code>で各ラインの線種を変えることで、見分けやすくなります。</p>
<h2><span id="toc11">プログラム例4：書式2を使った価格モメンタムインジケータ（サブウインドウ）</span></h2>
<p>書式2（price[]配列を使う形式）の例です。サブウインドウに表示するモメンタム系インジケータを作成します。ユーザーがチャート上で「適用価格」を選択でき、その値がprice[]として渡されます。</p>
<pre><code class="language-mql4">//+------------------------------------------------------------------+
//| モメンタムインジケータ（OnCalculate書式2を使用）                   |
//+------------------------------------------------------------------+
#property indicator_separate_window      // サブウインドウに表示
#property indicator_buffers 2
#property indicator_color1 clrLimeGreen  // モメンタムライン
#property indicator_color2 clrRed        // ゼロライン用（水平線）
#property indicator_width1 2
#property indicator_level1 0.0           // ゼロラインを自動描画
#property indicator_levelcolor clrSilver

// 外部パラメータ
input int MomentumPeriod = 14;          // モメンタム期間

// インジケータバッファ
double MomentumBuffer[];
double SignalBuffer[];                   // シグナル用（SMA平滑化）

//+------------------------------------------------------------------+
//| 初期化関数                                                        |
//+------------------------------------------------------------------+
int OnInit()
{
   if(MomentumPeriod < 1)
   {
      Print("エラー: 期間は1以上を指定してください");
      return(INIT_PARAMETERS_INCORRECT);
   }
   
   SetIndexBuffer(0, MomentumBuffer);
   SetIndexBuffer(1, SignalBuffer);
   
   SetIndexStyle(0, DRAW_LINE);
   SetIndexStyle(1, DRAW_LINE);
   
   SetIndexLabel(0, "Momentum(" + IntegerToString(MomentumPeriod) + ")");
   SetIndexLabel(1, "Signal(9)");
   
   SetIndexDrawBegin(0, MomentumPeriod);
   SetIndexDrawBegin(1, MomentumPeriod + 9);
   
   // インジケータの短縮名（サブウインドウのタイトル）
   IndicatorShortName("My Momentum(" + IntegerToString(MomentumPeriod) + ")");
   
   return(INIT_SUCCEEDED);
}

//+------------------------------------------------------------------+
//| OnCalculate - 書式2：price[]配列を使う形式                        |
//| ※ユーザーがインジケータの「適用価格」で選択した値がprice[]に入る   |
//+------------------------------------------------------------------+
int OnCalculate(const int rates_total,
                const int prev_calculated,
                const int begin,             // 有効データの開始位置
                const double &#038;price[])       // 適用価格の配列
{
   // データ不足チェック
   if(rates_total < MomentumPeriod + 1)
      return(0);
   
   // ===== モメンタムの計算 =====
   int start;
   if(prev_calculated == 0)
      start = MomentumPeriod + begin;   // beginを考慮して開始位置を決定
   else
      start = prev_calculated - 1;
   
   // モメンタム = 現在価格 - N期間前の価格
   for(int i = start; i < rates_total; i++)
   {
      MomentumBuffer[i] = price[i] - price[i - MomentumPeriod];
   }
   
   // ===== シグナルライン（モメンタムの9期間SMA）=====
   int signalPeriod = 9;
   int signalStart;
   
   if(prev_calculated == 0)
      signalStart = MomentumPeriod + begin + signalPeriod - 1;
   else
      signalStart = prev_calculated - 1;
   
   // signalStartがデータ範囲内か確認
   if(signalStart < MomentumPeriod + begin + signalPeriod - 1)
      signalStart = MomentumPeriod + begin + signalPeriod - 1;
   
   for(int i = signalStart; i < rates_total; i++)
   {
      double sum = 0.0;
      for(int j = 0; j < signalPeriod; j++)
      {
         sum += MomentumBuffer[i - j];
      }
      SignalBuffer[i] = sum / signalPeriod;
   }
   
   return(rates_total);
}
</code></pre>
<p>書式2では、ユーザーがインジケータのプロパティで「適用価格」（終値、始値、高値、安値、中間値など）を選択でき、その値が<code>price[]</code>として自動的に渡されます。<code>begin</code>パラメータは、他のインジケータの出力を入力にチェーンする場合に、有効なデータの開始位置を示します。</p>
<h2><span id="toc12">よくある使い方のポイント・注意事項</span></h2>
<h3><span id="toc13">1. prev_calculatedの正しい活用</span></h3>
<p>OnCalculate()で最も重要なのは<code>prev_calculated</code>の活用です。毎回全バーを再計算すると、バー数が多い場合に処理が重くなります。</p>
<pre><code class="language-mql4">// ◎ 正しい使い方：差分計算
int start;
if(prev_calculated == 0)
   start = 0;              // 初回のみ全バー計算
else
   start = prev_calculated - 1;  // -1 は最後のバー（形成中）を再計算するため

// ✕ 悪い使い方：毎回全バー計算（非効率）
for(int i = 0; i < rates_total; i++)  // 毎回全部計算してしまう
</code></pre>
<h3><span id="toc14">2. 配列のインデックス方向に注意</span></h3>
<p>OnCalculate()の引数で渡される配列（close[], high[]など）は、<strong>デフォルトで時系列ではない</strong>点に注意が必要です。</p>
<pre><code class="language-mql4">// OnCalculate内の配列のインデックス
// close[0]                → 最も古いバーの終値
// close[rates_total - 1]  → 最新（現在形成中の）バーの終値
//
// ※通常のClose[0]が最新バーを指すのとは逆！
//
// もし時系列順にしたい場合は以下を使う（ただし通常は不要）
// ArraySetAsSeries(close, true);
// ※ただし const 配列なので変更できない場合がある
</code></pre>
<h3><span id="toc15">3. 戻り値は必ずrates_totalを返す</span></h3>
<pre><code class="language-mql4">// 正常な計算が完了した場合
return(rates_total);     // 次回のprev_calculatedにこの値が入る

// エラーや計算不能の場合
return(0);               // 次回は全バーを再計算する
</code></pre>
<h3><span id="toc16">4. OnCalculate()はEAやスクリプトでは使えない</span></h3>
<p>OnCalculate()は<strong>カスタムインジケータ（.mq4ファイルの#property indicator_～ がある場合）でのみ</strong>使用できます。EAではOnTick()、スクリプトではOnStart()を使用してください。</p>
<h3><span id="toc17">5. rates_totalの変化を検知して新しいバーを判定</span></h3>
<pre><code class="language-mql4">int OnCalculate(const int rates_total,
                const int prev_calculated,
                /* 省略 */)
{
   // 新しいバーが形成されたかどうかの判定
   if(rates_total > prev_calculated)
   {
      // 新しいバーが追加された（または初回呼び出し）
      Print("新しいバーが追加されました。バー総数: ", rates_total);
   }
   else
   {
      // 既存のバー（最新バー）のティック更新
      // 最新バーの終値だけが変わっている
   }
   
   return(rates_total);
}
</code></pre>
<h3><span id="toc18">6. EMPTY_VALUEで描画をスキップ</span></h3>
<p>特定の条件でラインを描画しない場合は、バッファに<code>EMPTY_VALUE</code>を設定します。</p>
<pre><code class="language-mql4">// 条件を満たさない場合は描画しない
if(close[i] < open[i])
   LineBuffer[i] = EMPTY_VALUE;  // この位置はラインが途切れる
else
   LineBuffer[i] = close[i];
</code></pre>
<h2><span id="toc19">まとめ</span></h2>
<ul>
<li>OnCalculate()は<strong>カスタムインジケータ専用</strong>のイベント関数で、ティックごとに自動実行される</li>
<li><strong>2つの書式</strong>があり、用途に応じて使い分ける（書式1がメイン、書式2は他インジケータの値を入力にする場合）</li>
<li><code>prev_calculated</code>を活用して<strong>差分計算</strong>を行い、パフォーマンスを最適化するのが基本</li>
<li>引数の配列は<strong>時系列ではない</strong>（インデックス0が最古、rates_total-1が最新）</li>
<li>戻り値として<code>rates_total</code>を返すことで、次回の<code>prev_calculated</code>に計算済みバー数を伝える</li>
<li>描画をスキップしたい場合は<code>EMPTY_VALUE</code>を使用する</li>
</ul>
<p>投稿 <a href="https://mql-programing.com/archives/3471/oncalculate/">【MQL4関数】OnCalculate関数とは？ロウソク足が動くたびに実行されるイベント関数</a> は <a href="https://mql-programing.com">自動売買を作ろう！</a> に最初に表示されました。</p>
]]></content:encoded>
					
		
		
			</item>
	</channel>
</rss>
