iMA関数

この関数は、Moving Average(移動平均線)指標のハンドルを返します。バッファは1つです。

構文

mql5

Copy

int iMA(
   string symbol,            // 銘柄名
   ENUM_TIMEFRAMES period,   // 期間
   int ma_period,            // 平均期間
   int ma_shift,             // 水平シフト
   ENUM_MA_METHOD ma_method, // 平滑化の種類
   ENUM_APPLIED_PRICE applied_price // 価格の種類かハンドル
);

iMA関数のパラメータ説明

パラメータ説明デフォルト値必須項目
symbol移動平均線を計算するための銘柄名を指定します。
(例: "EURUSD"
**NULL**を指定すると、現在のチャートの銘柄が使用されます。
NULL任意
period移動平均線を計算する時間軸(タイムフレーム)を指定します。
(例: PERIOD_H1は1時間足)
**0**を指定すると、現在のチャートの時間軸が使用されます。
0任意
ma_period移動平均線を計算する期間を指定します。
(例: 14は14期間の移動平均線)
なし必須
ma_shift移動平均線を価格チャートに対して水平方向にシフトする量を指定します。
(例: 1を指定すると、移動平均線が右に1期間分ずれます)
0任意
ma_method移動平均線の計算方法(平滑化の種類)を指定します。
(例: MODE_SMAは単純移動平均線、MODE_EMAは指数移動平均線)
MODE_SMA任意
applied_price移動平均線の計算に使用する価格を指定します。
(例: PRICE_CLOSEは終値、PRICE_HIGHは高値)
別の指標ハンドルを指定することもできます。
PRICE_CLOSE任意

戻り値

  • 戻り値:
    • 移動平均線の計算に成功した場合、その指標ハンドル(int型)を返します。
    • 失敗した場合、INVALID_HANDLE(無効なハンドル)を返します。

戻り値の使い方

  • 返されたハンドルは、他の関数(例: CopyBuffer())で移動平均線の値を取得するために使用されます。
  • ハンドルを使い終わった後は、IndicatorRelease()関数でメモリを解放することを推奨します。

例: 戻り値の確認

mql5

Copy

int handle = iMA(NULL, 0, 14, 0, MODE_SMA, PRICE_CLOSE);
if (handle == INVALID_HANDLE)
  {
   Print("移動平均線のハンドル作成に失敗しました。エラーコード: ", GetLastError());
  }
else
  {
   Print("移動平均線のハンドルが正常に作成されました。");
   // ハンドルを使用して移動平均線の値を取得する
   double maValue[];
   CopyBuffer(handle, 0, 0, 1, maValue);
   Print("最新の移動平均線の値: ", maValue[0]);
   
   // ハンドルを解放する
   IndicatorRelease(handle);
  }

補足説明

  • symbol:
    • 銘柄名を指定しますが、NULLを指定すると現在のチャートの銘柄が自動的に使用されます。
    • デフォルト値NULL
    • 必須項目: 任意(指定しない場合は現在のチャートの銘柄が使用されます)
  • period:
    • 時間軸を指定します。0を指定すると現在のチャートの時間軸が適用されます。
    • デフォルト値0
    • 必須項目: 任意(指定しない場合は現在のチャートの時間軸が使用されます)
  • ma_period:
    • 移動平均線の計算に使用する期間を指定します。例えば、14を指定すると、過去14期間の平均値を計算します。
    • デフォルト値: なし
    • 必須項目: 必須(必ず指定する必要があります)
  • ma_shift:
    • 移動平均線をチャート上で左右にずらすことができます。正の値を指定すると右に、負の値を指定すると左にずれます。
    • デフォルト値0
    • 必須項目: 任意(指定しない場合はシフトなし)
  • ma_method:
    • 移動平均線の計算方法を指定します。単純移動平均線(MODE_SMA)や指数移動平均線(MODE_EMA)など、複数の計算方法から選択できます。
    • デフォルト値MODE_SMA
    • 必須項目: 任意(指定しない場合は単純移動平均線が使用されます)
  • applied_price:
    • 移動平均線の計算に使用する価格を指定します。終値(PRICE_CLOSE)や高値(PRICE_HIGH)など、さまざまな価格を選択できます。
    • デフォルト値PRICE_CLOSE
    • 必須項目: 任意(指定しない場合は終値が使用されます)

具体例

以下は、iMA関数を使用する際の具体的な例です。

mql5

Copy

// 現在のチャートの銘柄と時間軸を使用し、14期間の単純移動平均線を計算する
int handle = iMA(NULL, 0, 14, 0, MODE_SMA, PRICE_CLOSE);

// EURUSDの1時間足で、20期間の指数移動平均線を計算し、右に2期間分シフトする
int handle = iMA("EURUSD", PERIOD_H1, 20, 2, MODE_EMA, PRICE_HIGH);

まとめ

  • 必須項目ma_periodは必ず指定する必要があります。
  • デフォルト値: 他のパラメータはデフォルト値が設定されているため、省略可能です。
  • 戻り値: 成功時は指標ハンドルを返し、失敗時はINVALID_HANDLEを返します。ハンドルを使い終わった後は、IndicatorRelease()でメモリを解放します。

パラメータ

パラメータ説明
symbolデータが指標計算に使用される有価証券の銘柄名(NULLは現在のシンボル)
period期間の値はENUM_TIMEFRAMES列挙の値の1つで、0は現在の時間軸を意味します。
ma_period移動平均計算の期間
ma_shift価格チャートに相対した指標のシフト
ma_method平滑化の種類。ENUM_MA_METHOD値のいずれか。
applied_price使用される価格。ENUM_APPLIED_PRICE価格定数のいずれか、または別の指標ハンドル。

戻り値

  • 戻り値: 指定されたテクニカル指標ハンドル。失敗の場合、INVALID_HANDLEを返します。
  • メモリ管理IndicatorRelease()関数に指標ハンドルを渡すことで、コンピュータメモリを解放できます。

使用例

以下は、iMA関数を使用して移動平均線を計算し、チャートに表示するサンプルコードです。

mql5

Copy

//+------------------------------------------------------------------+
//| Demo_iMA.mq5                                                     |
//| Copyright 2011, MetaQuotes Software Corp.                        |
//| https://www.MQL5.com                                             |
//+------------------------------------------------------------------+
#property copyright "Copyright 2000-2024, MetaQuotes Ltd."
#property link      "https://www.mql5.com"
#property version   "1.00"
#property description "The indicator demonstrates how to obtain data"
#property description "of indicator buffers for the iMA technical indicator."
#property description "A symbol and timeframe used for calculation of the indicator,"
#property description "are set by the symbol and period parameters."
#property description "The method of creation of the handle is set through the 'type' parameter (function type)."
#property description "All other parameters like in the standard Moving Average."

#property indicator_chart_window
#property indicator_buffers 1
#property indicator_plots   1

//--- iMAプロット
#property indicator_label1  "iMA"
#property indicator_type1   DRAW_LINE
#property indicator_color1  clrRed
#property indicator_style1  STYLE_SOLID
#property indicator_width1  1

//+------------------------------------------------------------------+
//| 作成を処理する方法の列挙                                         |
//+------------------------------------------------------------------+
enum Creation
  {
   Call_iMA,               // iMAを使用
   Call_IndicatorCreate    // IndicatorCreateを使用する
  };

//--- 入力パラメータ
input Creation          type=Call_iMA;          // 関数の種類
input int               ma_period=10;           // MA期間
input int               ma_shift=0;             // シフト
input ENUM_MA_METHOD    ma_method=MODE_SMA;     // 平滑化の種類
input ENUM_APPLIED_PRICE applied_price=PRICE_CLOSE; // 価格の種類
input string            symbol="";              // シンボル
input ENUM_TIMEFRAMES   period=PERIOD_CURRENT;  // 時間軸

//--- 指標バッファ
double iMABuffer[];

//--- iMA指標ハンドルを格納する変数
int handle;

//--- 格納に使用される変数
string name=symbol;

//--- チャートでの指標名
string short_name;

//--- 移動平均線指標に値の数を保存
int bars_calculated=0;

//+------------------------------------------------------------------+
//| カスタム指標を初期化する関数                                     |
//+------------------------------------------------------------------+
int OnInit()
  {
   //--- 配列の指標バッファへの割り当て
   SetIndexBuffer(0,iMABuffer,INDICATOR_DATA);

   //--- シフトを設定
   PlotIndexSetInteger(0,PLOT_SHIFT,ma_shift);

   //--- 指標が描画するシンボルを決める
   name=symbol;

   //--- 左右のスペースを削除する
   StringTrimRight(name);
   StringTrimLeft(name);

   //---「name」文字列の長さがゼロになった場合
   if(StringLen(name)==0)
     {
      //--- 指標が接続されているチャートのシンボルを取る
      name=_Symbol;
     }

   //--- 指標ハンドルを作成する
   if(type==Call_iMA)
      handle=iMA(name,period,ma_period,ma_shift,ma_method,applied_price);
   else
     {
      //--- 構造体を指標のパラメータで記入
      MqlParam pars[4];

      //--- 期間
      pars[0].type=TYPE_INT;
      pars[0].integer_value=ma_period;

      //--- シフト
      pars[1].type=TYPE_INT;
      pars[1].integer_value=ma_shift;

      //--- 平滑化の種類
      pars[2].type=TYPE_INT;
      pars[2].integer_value=ma_method;

      //--- 価格の種類
      pars[3].type=TYPE_INT;
      pars[3].integer_value=applied_price;

      handle=IndicatorCreate(name,period,IND_MA,4,pars);
     }

   //--- ハンドルが作成されなかった場合
   if(handle==INVALID_HANDLE)
     {
      //--- 失敗した事実とエラーコードを出力する
      PrintFormat("Failed to create handle of the iMA indicator for the symbol %s/%s, error code %d",
                  name,
                  EnumToString(period),
                  GetLastError());

      //--- 指標が早期に中止された
      return(INIT_FAILED);
     }

   //--- 移動平均線が計算された銘柄/時間軸を表示
   short_name=StringFormat("iMA(%s/%s, %d, %d, %s, %s)",name,EnumToString(period),
                           ma_period,
                           ma_shift,EnumToString(ma_method),EnumToString(applied_price));
   IndicatorSetString(INDICATOR_SHORTNAME,short_name);

   //--- 通常の指標の初期化
   return(INIT_SUCCEEDED);
  }

//+------------------------------------------------------------------+
//| カスタム指標の反復関数                                           |
//+------------------------------------------------------------------+
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[])
  {
   //--- iMA指標から複製された値の数
   int values_to_copy;

   //--- 指標で計算された値の数を決める
   int calculated=BarsCalculated(handle);
   if(calculated<=0)
     {
      PrintFormat("BarsCalculated() returned %d, error code %d",calculated,GetLastError());
      return(0);
     }

   //--- これが指標計算の初めであるか iMA指標の値の数が変更した
   //--- または、2つ以上のバーの指標の計算が必要である場合(価格履歴で何かが変更された)
   if(prev_calculated==0 || calculated!=bars_calculated || rates_total>prev_calculated+1)
     {
      //--- iMABuffer配列が銘柄/期間で iMA指標の値の数より大きい場合、全体のコピーはしない
      //--- 他の場合、指標バッファサイズより少ない量をコピーをする
      if(calculated>rates_total) values_to_copy=rates_total;
      else values_to_copy=calculated;
     }
   else
     {
      //--- これは初回の計算ではなく、
      //--- 前回の OnCalculate() から、一以上のバーが加えられてない。
      values_to_copy=(rates_total-prev_calculated)+1;
     }

   //--- iMABuffer配列を適応型移動平均線指標の値で記入する
   //--- FillArrayFromBufferが falseを返した場合、情報の準備が終わっていないので操作を終了する
   if(!FillArrayFromBuffer(iMABuffer,ma_shift,handle,values_to_copy)) return(0);

   //--- メッセージを形成する
   string comm=StringFormat("%s ==> Updated value in the indicator %s: %d",
                            TimeToString(TimeCurrent(),TIME_DATE|TIME_SECONDS),
                            short_name,
                            values_to_copy);

   //--- チャートにサービスメッセージを表示する
   Comment(comm);

   //--- 移動平均線指標の値の数を覚える
   bars_calculated=calculated;

   //--- prev_calculated値を次の関数呼び出しのために返す
   return(rates_total);
  }

//+------------------------------------------------------------------+
//| 移動平均線指標から指標バッファを記入する                         |
//+------------------------------------------------------------------+
bool FillArrayFromBuffer(double &values[], // 移動平均線値の指標バッファ
                         int shift,        // シフト
                         int ind_handle,   // iMA指標ハンドル
                         int amount        // 複製された値の数
                        )
  {
   //--- エラーコードをリセットする
   ResetLastError();

   //--- インデックス0を持つ指標バッファの値で iMABuffer配列の一部を記入する
   if(CopyBuffer(ind_handle,0,-shift,amount,values)<0)
     {
      //--- 複製が失敗したら、エラーコードを出す
      PrintFormat("Failed to copy data from the iMA indicator, error code %d",GetLastError());

      //--- ゼロ結果で終了。指標は計算されていないと見なされる
      return(false);
     }

   //--- 全てが成功
   return(true);
  }

//+------------------------------------------------------------------+
//| 指標初期化解除関数                                               |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
   if(handle!=INVALID_HANDLE)
      IndicatorRelease(handle);

   //--- 指標の削除後チャートをクリアする
   Comment("");
  }

解説

FillArrayFromBuffer関数: 移動平均線の値をバッファにコピーし、チャートに表示します。

iMA関数: 移動平均線を計算し、そのハンドルを返します。

IndicatorRelease関数: 使用済みの指標ハンドルを解放し、メモリを効率的に管理します。

コメント

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