テクニカル指標関数

iAC

この関数はクライアント端末のグローバルキャッシュに Accelerator Oscillator ( AC オシレーター)を作成してハンドルを返します。バッファは 1 つです。

int  iAC(
string          symbol,    // 銘柄名
ENUM_TIMEFRAMES  period      // 期間
);

パラメータ

symbol

[in] データが指標計算に使用される有価証券の銘柄名(NULL は現在のシンボル)

period

[in] 期間の値は ENUM_TIMEFRAMES 列挙の値の 1 つで、0 は現在の時間軸の意味です。

戻り値

指定されたテクニカル指標ハンドル。失敗の場合 INVALID_HANDLE。IndicatorRelease() 関数に指標ハンドルを渡すことによって 、コンピュータメモリを利用されていない指標から解放することが出来ます。

例:

//+——————————————————————+
//|                                                     Demo_iAC.mq5 |
//|                        Copyright 2011, MetaQuotes Software Corp. |
//|                                             https://www.MQL5.com |
//+——————————————————————+
#property copyright “Copyright 2011, MetaQuotes Software Corp.”
#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 iAC 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 indicator_separate_window
#property indicator_buffers 2
#property indicator_plots   1
//— iAC のプロット
#property indicator_label1 “iAC”
#property indicator_type1   DRAW_COLOR_HISTOGRAM
#property indicator_color1  clrGreen, clrRed
#property indicator_style1 STYLE_SOLID
#property indicator_width1  1
//+——————————————————————+
//| 作成を処理する方法の列挙                                              |
//+——————————————————————+
enum Creation
{
Call_iAC,               // iAC を使用する
Call_IndicatorCreate   // IndicatorCreateを使用する
};
//— 入力パラメータ
input Creation             type=Call_iAC;         // 関数の種類
input string               symbol=” “;             // シンボル
input ENUM_TIMEFRAMES     period=PERIOD_CURRENT; // 時間軸
//— 指標バッファ
double iACBuffer[];
double iACColors[];
//— iAC 指標ハンドルを格納する変数
int    handle;
//— 格納に使用される変数
string name=symbol;
//— チャートでの指標名
string short_name;
//— ACオシレーター指標に値の数を保存
int    bars_calculated=0;
//+——————————————————————+
//| カスタム指標を初期化する関数                                            |
//+——————————————————————+
int OnInit()
{
//— 配列の指標バッファへの割り当て
SetIndexBuffer(0,iACBuffer,INDICATOR_DATA);
SetIndexBuffer(1,iACColors,INDICATOR_COLOR_INDEX);
//— 指標が描画するシンボルを決める
name=symbol;
//— 左右のスペースを削する
StringTrimRight(name);
StringTrimLeft(name);
//—「name」文字列の長さがゼロになった場合
if(StringLen(name)==0)
{
//— 指標が接続されているチャートのシンボルを取る
name=_Symbol;
}
//— 指標ハンドルを作成する
if(type==Call_iAC)
handle=iAC(name,period);
else
handle=IndicatorCreate(name,period,IND_AC);
//— ハンドルが作成されなかった場合
if(handle==INVALID_HANDLE)
{
//— 失敗した事実とエラーコードを出力する
PrintFormat(“Failed to create handle of the iAC indicator for the symbol %s/%s, error code %d”,
name,
EnumToString(period),
GetLastError());
//— 指標が早期に中止された
return(INIT_FAILED);
}
//— ACオシレーターが計算された銘柄/時間軸を表示
short_name=StringFormat(“iAC(%s/%s)”,name,EnumToString(period));
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[])
{
//— iAC 指標から複製された値の数
int values_to_copy;
//— 指標で計算された値の数を決める
int calculated=BarsCalculated(handle);
if(calculated<=0)
{
PrintFormat(“BarsCalculated() returned %d, error code %d”,calculated,GetLastError());
return(0);
}
//— これが指標計算の初めであるか iAC 指標の値の数が変更した
//—または、2 つ以上のバーの指標の計算が必要である場合(価格履歴で何かが変更された)
if(prev_calculated==0 || calculated!=bars_calculated || rates_total>prev_calculated+1)
{
//— もし iACBuffer 配列が銘柄/期間で iAC 指標の値の数より大きい場合、全体のコピーはしない
//— 他の場合、指標バッファサイズより少ない量をコピーをする
if(calculated>rates_total) values_to_copy=rates_total;
else                       values_to_copy=calculated;
}
else
{
//— これは初回の計算ではなく、
//— 前回の OnCalculate() から、一以上のバーが加えられてない。
values_to_copy=(rates_total-prev_calculated)+1;
}
//— ACオシレーター指標の値で iACBuffer と iACColors 配列を記入する
//— FillArraysFromBuffer が false を返した場合、情報の準備が終わっていないので操作を終了する
if(!FillArraysFromBuffer(iACBuffer,iACColors,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);
//— ACオシレーター指標の値の数を覚える
bars_calculated=calculated;
//— prev_calculated 値を次の関数呼び出しのために返す
return(rates_total);
}
//+——————————————————————+
//| iAC 指標から指標バッファを記入する                                        |
//+——————————————————————+
bool FillArraysFromBuffer(double &values[],       // ACオシレーター値の指標バッファ
double &color_indexes[], // 色のバッファ(色インデックスを格納)
int ind_handle,         // iAC 指標ハンドル
int amount               // 複製された値の数

{
//— エラーコードをリセットする
ResetLastError();
//— インデックス0 を持つ指標バッファの値で iACBuffer 配列の一部を記入する
if(CopyBuffer(ind_handle,0,0,amount,values)<0)
{
//— 複製が失敗したら、エラーコードを出す
PrintFormat(“Failed to copy data from the iAC indicator, error code %d”,GetLastError());
//— ゼロ結果で終了。 指標は計算されていないと見なされる
return(false);
}
//— 色インデックスを複製する
if(CopyBuffer(ind_handle,1,0,amount,color_indexes)<0)
{
//— 複製が失敗したら、エラーコードを出す
PrintFormat(“Failed to copy color values from the iAC indicator, error code %d”,GetLastError());
//— ゼロ結果で終了。 指標は計算されていないと見なされる
return(false);
}
//— 全てが成功
return(true);
}
//+——————————————————————+
//| 指標初期化解除関数                                                  |
//+——————————————————————+
void OnDeinit(const int reason)
{
//— 指標の削除後チャートをクリアする
Comment(“”);
}

iAD

この関数は Accumulation(蓄積)/ Distribution(分配)指標ハンドルを返します。バッファは 1 つです。

int  iAD(
string              symbol,            // 銘柄名
ENUM_TIMEFRAMES      period,            // 期間
ENUM_APPLIED_VOLUME  applied_volume      // 計算に使用するボリュームの種類
);

パラメータ

symbol

[in] データが指標計算に使用される有価証券の銘柄名(NULL は現在のシンボル)

period

[in] 期間の値は ENUM_TIMEFRAMES 列挙の値の 1 つで、0 は現在の時間軸の意味です。

applied_volume

[in]  使用されるボリューム(ENUM_APPLIED_VOLUME 値のいずれか)

戻り値

指定されたテクニカル指標ハンドル。失敗の場合 INVALID_HANDLE。IndicatorRelease() 関数に指標ハンドルを渡すことによって 、コンピュータメモリを利用されていない指標から解放することが出来ます。

例:

//+——————————————————————+
//|                                                     Demo_iAD.mq5 |
//|                        Copyright 2011, MetaQuotes Software Corp. |
//|                                             https://www.MQL5.com |
//+——————————————————————+
#property copyright “Copyright 2011, MetaQuotes Software Corp.”
#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 iAD 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 indicator_separate_window
#property indicator_buffers 1
#property indicator_plots   1
//— iAD をプロットする
#property indicator_label1 “iAD”
#property indicator_type1   DRAW_LINE
#property indicator_color1  clrLightSeaGreen
#property indicator_style1 STYLE_SOLID
#property indicator_width1  1
//+——————————————————————+
//| 作成を処理する方法の列挙                                              |
//+——————————————————————+
enum Creation
{
Call_iAD,               // iAD を使用する
Call_IndicatorCreate   // IndicatorCreateを使用する
};
//— 入力パラメータ
input Creation             type=Call_iAD;         // 型の関数
input ENUM_APPLIED_VOLUME  volumes;               // 使用されるボリューム
input string               symbol=” “;             // シンボル
input ENUM_TIMEFRAMES     period=PERIOD_CURRENT; // 時間軸
//— 指標バッファ
double         iADBuffer[];
//— iAD 指標ハンドルを格納する変数
int    handle;
//— 格納に使用される変数
string name=symbol;
//— チャートでの指標名
string short_name;
//— A/D 指標に値の数を保存
int    bars_calculated=0;
//+——————————————————————+
//| カスタム指標を初期化する関数                                            |
//+——————————————————————+
int OnInit()
{
//— 配列の指標バッファへの割り当て
SetIndexBuffer(0,iADBuffer,INDICATOR_DATA);
//— 指標が描画するシンボルを決める
name=symbol;
//— 左右のスペースを削する
StringTrimRight(name);
StringTrimLeft(name);
//—「name」文字列の長さがゼロになった場合
if(StringLen(name)==0)
{
//— 指標が接続されているチャートのシンボルを取る
name=_Symbol;
}
//— 指標ハンドルを作成する
if(type==Call_iAD)
handle=iAD(name,period,volumes);
else
{
//— 構造体を指標のパラメータで記入
MqlParam pars[1];
pars[0].type=TYPE_INT;
pars[0].integer_value=volumes;
handle=IndicatorCreate(name,period,IND_AD,1,pars);
}
//— ハンドルが作成されなかった場合
if(handle==INVALID_HANDLE)
{
//— 失敗した事実とエラーコードを出力する
PrintFormat(“Failed to create handle of the iAD indicator for the symbol %s/%s, error code %d”,
name,
EnumToString(period),
GetLastError());
//— 指標が早期に中止された
return(INIT_FAILED);
}
//— A/D が計算された銘柄/時間軸を表示
short_name=StringFormat(“iAD(%s/%s)”,name,EnumToString(period));
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[])
{
//— iAD 指標から複製された値の数
int values_to_copy;
//— 指標で計算された値の数を決める
int calculated=BarsCalculated(handle);
if(calculated<=0)
{
PrintFormat(“BarsCalculated() returned %d, error code %d”,calculated,GetLastError());
return(0);
}
//— これが指標計算の初めであるか iAD 指標の値の数が変更した
//—または、2 つ以上のバーの指標の計算が必要である場合(価格履歴で何かが変更された)
if(prev_calculated==0 || calculated!=bars_calculated || rates_total>prev_calculated+1)
{
//— もし iADBuffer 配列が銘柄/期間で iAD 指標の値の数より大きい場合、全体のコピーはしない
//— 他の場合、指標バッファサイズより少ない量をコピーをする
if(calculated>rates_total) values_to_copy=rates_total;
else                       values_to_copy=calculated;
}
else
{
//— これは初回の計算ではなく、
//— 前回の OnCalculate() から、一以上のバーが加えられてない。
values_to_copy=(rates_total-prev_calculated)+1;
}
//— iADBuffer 配列をA/D の値で記入
//— FillArraysFromBuffer が false を返した場合、情報の準備が終わっていないので操作を終了する
if(!FillArrayFromBuffer(iADBuffer,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);
//— A/D 指標の値の数を覚える
bars_calculated=calculated;
//— prev_calculated 値を次の関数呼び出しのために返す
return(rates_total);
}
//+——————————————————————+
//| iAD 指標から指標バッファを記入する                                        |
//+——————————————————————+
bool FillArrayFromBuffer(double &values[],   // A/D 指標値の指標バッファ
int ind_handle,   // iAD 指標ハンドル
int amount         // 複製された値の数

{
//— エラーコードをリセットする
ResetLastError();
//— インデックス0 を持つ指標バッファの値で iADBuffer 配列の一部を記入する
if(CopyBuffer(ind_handle,0,0,amount,values)<0)
{
//— 複製が失敗したら、エラーコードを出す
PrintFormat(“Failed to copy data from the iAD indicator, error code %d”,GetLastError());
//— ゼロ結果で終了。 指標は計算されていないと見なされる
return(false);
}
//— 全てが成功
return(true);
}
//+——————————————————————+
//| 指標初期化解除関数                                                  |
//+——————————————————————+
void OnDeinit(const int reason)
{
//— 指標の削除後チャートをクリアする
Comment(“”);
}

iADX

この関数は ADX (Average Directional Movement )指標ハンドルを返します。

int  iADX(
string          symbol,        // 銘柄名
ENUM_TIMEFRAMES  period,        // 期間
int              adx_period      // 平均期間
);

パラメータ

symbol

[in] データが指標計算に使用される有価証券の銘柄名(NULL は現在のシンボル)

period

[in] 期間の値は ENUM_TIMEFRAMES 列挙の値の 1 つで、0 は現在の時間軸の意味です。

adx_period

[in]  インデックス計算の期間

戻り値

指定されたテクニカル指標ハンドル。失敗の場合 INVALID_HANDLE。IndicatorRelease() 関数に指標ハンドルを渡すことによって 、コンピュータメモリを利用されていない指標から解放することが出来ます。

注意事項

バッファ番号は 0 – MAIN_LINE、1 – PLUSDI_LINE、2 – MINUSDI_LINE です。

例:

//+——————————————————————+
//|                                                    Demo_iADX.mq5 |
//|                        Copyright 2011, MetaQuotes Software Corp. |
//|                                             https://www.MQL5.com |
//+——————————————————————+
#property copyright “Copyright 2011, MetaQuotes Software Corp.”
#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 iADX 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 indicator_separate_window
#property indicator_buffers 3
#property indicator_plots   3
//— ADX をプロットする
#property indicator_label1 “ADX”
#property indicator_type1   DRAW_LINE
#property indicator_color1  clrLightSeaGreen
#property indicator_style1 STYLE_SOLID
#property indicator_width1  1
//— DI_plus をプロットする
#property indicator_label2 “DI_plus”
#property indicator_type2   DRAW_LINE
#property indicator_color2  clrYellowGreen
#property indicator_style2 STYLE_SOLID
#property indicator_width2  1
//— DI_minus をプロットする
#property indicator_label3 “DI_minus”
#property indicator_type3   DRAW_LINE
#property indicator_color3  clrWheat
#property indicator_style3 STYLE_SOLID
#property indicator_width3  1
//+——————————————————————+
//| 作成を処理する方法の列挙                                              |
//+——————————————————————+
enum Creation
{
Call_iADX,             // use iADX を使用する
Call_IndicatorCreate   // IndicatorCreateを使用する
};
//— 入力パラメータ
input Creation             type=Call_iADX;         // 関数の種類
input int                  adx_period=14;         // 計算期間
input string               symbol=” “;             // シンボル
input ENUM_TIMEFRAMES     period=PERIOD_CURRENT; // 時間軸
//— 指標バッファ
double         ADXBuffer[];
double         DI_plusBuffer[];
double         DI_minusBuffer[];
//— iADX 指標ハンドルを格納する変数
int    handle;
//— 格納に使用される変数
string name=symbol;
//— チャートでの指標名
string short_name;
//— ADX 指標に値の数を保存
int    bars_calculated=0;
//+——————————————————————+
//| カスタム指標を初期化する関数                                            |
//+——————————————————————+
int OnInit()
{
//— 配列の指標バッファへの割り当て
SetIndexBuffer(0,ADXBuffer,INDICATOR_DATA);
SetIndexBuffer(1,DI_plusBuffer,INDICATOR_DATA);
SetIndexBuffer(2,DI_minusBuffer,INDICATOR_DATA);
//— 指標が描画するシンボルを決める
name=symbol;
//— 左右のスペースを削する
StringTrimRight(name);
StringTrimLeft(name);
//—「name」文字列の長さがゼロになった場合
if(StringLen(name)==0)
{
//— 指標が接続されているチャートのシンボルを取る
name=_Symbol;
}
//— 指標ハンドルを作成する
if(type==Call_iADX)
handle=iADX(name,period,adx_period);
else
{
//— 構造体を指標のパラメータで記入
MqlParam pars[1];
pars[0].type=TYPE_INT;
pars[0].integer_value=adx_period;
handle=IndicatorCreate(name,period,IND_ADX,1,pars);
}
//— ハンドルが作成されなかった場合
if(handle==INVALID_HANDLE)
{
//— 失敗した事実とエラーコードを出力する
PrintFormat(“Failed to create handle of the iADX indicator for the symbol %s/%s, error code %d”,
name,
EnumToString(period),
GetLastError());
//— 指標が早期に中止された
return(INIT_FAILED);
}
//— ADX が計算された銘柄/時間軸を表示
short_name=StringFormat(“iADX(%s/%s period=%d)”,name,EnumToString(period),adx_period);
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[])
{
//— iADX 指標から複製された値の数
int values_to_copy;
//— 指標で計算された値の数を決める
int calculated=BarsCalculated(handle);
if(calculated<=0)
{
PrintFormat(“BarsCalculated() returned %d, error code %d”,calculated,GetLastError());
return(0);
}
//— これが指標計算の初めであるか iADX 指標の値の数が変更した
//—または、2 つ以上のバーの指標の計算が必要である場合(価格履歴で何かが変更された)
if(prev_calculated==0 || calculated!=bars_calculated || rates_total>prev_calculated+1)
{
//— もし iADXBuffer 配列が銘柄/期間で iADX 指標の値の数より大きい場合、全体のコピーはしない
//— 他の場合、指標バッファサイズより少ない量をコピーをする
if(calculated>rates_total) values_to_copy=rates_total;
else                       values_to_copy=calculated;
}
else
{
//— これは初回の計算ではなく、
//— 前回の OnCalculate() から、一以上のバーが加えられてない。
values_to_copy=(rates_total-prev_calculated)+1;
}
//— 配列をADX 指標の値で記入
//— FillArraysFromBuffer が false を返した場合、情報の準備が終わっていないので操作を終了する
if(!FillArraysFromBuffers(ADXBuffer,DI_plusBuffer,DI_minusBuffer,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);
//— Average Directional Movement Index 指標の値の数を覚える<55/66/79% >
bars_calculated=calculated;
//— prev_calculated 値を次の関数呼び出しのために返す
return(rates_total);
}
//+——————————————————————+
//| iADX 指標から指標バッファを記入する                                       |
//+——————————————————————+
bool FillArraysFromBuffers(double &adx_values[],     // ADX 指標値の指標バッファ
double &DIplus_values[],   // DI+ 指標バッファ
double &DIminus_values[], // DI- 指標バッファ
int ind_handle,           // iADX 指標ハンドル
int amount                 // 複製された値の数

{
//— エラーコードをリセットする
ResetLastError();
//— インデックス0 を持つ指標バッファの値で iADXBuffer 配列の一部を記入する
if(CopyBuffer(ind_handle,0,0,amount,adx_values)<0)
{
//— 複製が失敗したら、エラーコードを出す
PrintFormat(“Failed to copy data from the iADX indicator, error code %d”,GetLastError());
//— ゼロ結果で終了。 指標は計算されていないと見なされる
return(false);
}

//— インデックス 1 を持つ指標バッファの値で DI_plusBuffer 配列の一部を記入する
if(CopyBuffer(ind_handle,1,0,amount,DIplus_values)<0)
{
//— 複製が失敗したら、エラーコードを出す
PrintFormat(“Failed to copy data from the iADX indicator, error code %d”,GetLastError());
//— ゼロ結果で終了。 指標は計算されていないと見なされる
return(false);
}

//— インデックス 2 を持つ指標バッファの値で DI_minusBuffer 配列の一部を記入する
if(CopyBuffer(ind_handle,2,0,amount,DIminus_values)<0)
{
//— 複製が失敗したら、エラーコードを出す
PrintFormat(“Failed to copy data from the iADX indicator, error code %d”,GetLastError());
//— ゼロ結果で終了。 指標は計算されていないと見なされる
return(false);
}
//— 全てが成功
return(true);
}
//+——————————————————————+
//| 指標初期化解除関数                                                  |
//+——————————————————————+
void OnDeinit(const int reason)
{
//— 指標の削除後チャートをクリアする
Comment(“”);
}

iADXWilder

この関数は Average Directional Movement Index by Welles Wilder のハンドルを返します。

int  iADXWilder(
string          symbol,        // 銘柄名
ENUM_TIMEFRAMES  period,        // 期間
int              adx_period      // 平均期間
);

パラメータ

symbol

[in] データが指標計算に使用される有価証券の銘柄名(NULL は現在のシンボル)

period

[in] 期間の値は ENUM_TIMEFRAMES 列挙の値の 1 つで、0 は現在の時間軸の意味です。

adx_period

[in]  インデックス計算の期間

戻り値

指定されたテクニカル指標ハンドル。失敗の場合 INVALID_HANDLE。IndicatorRelease() 関数に指標ハンドルを渡すことによって 、コンピュータメモリを利用されていない指標から解放することが出来ます。

注意事項

バッファ番号は 0 – MAIN_LINE、1 – PLUSDI_LINE、2 – MINUSDI_LINE です。

例:

//+——————————————————————+
//|                                                   iADXWilder.mq5 |
//|                        Copyright 2011, MetaQuotes Software Corp. |
//|                                             https://www.MQL5.com |
//+——————————————————————+
#property copyright “Copyright 2011, MetaQuotes Software Corp.”
#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 iADXWilder 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 indicator_separate_window
#property indicator_buffers 3
#property indicator_plots   3
//— ADX をプロットする
#property indicator_label1 “ADX”
#property indicator_type1   DRAW_LINE
#property indicator_color1  clrLightSeaGreen
#property indicator_style1 STYLE_SOLID
#property indicator_width1  1
//— DI_plus をプロットする
#property indicator_label2 “DI_plus”
#property indicator_type2   DRAW_LINE
#property indicator_color2  clrYellowGreen
#property indicator_style2 STYLE_SOLID
#property indicator_width2  1
//— DI_minus をプロットする
#property indicator_label3 “DI_minus”
#property indicator_type3   DRAW_LINE
#property indicator_color3  clrWheat
#property indicator_style3 STYLE_SOLID
#property indicator_width3  1
//+——————————————————————+
//| 作成を処理する方法の列挙                                              |
//+——————————————————————+
enum Creation
{
Call_iADXWilder,       // iADXWilder を使用する
Call_IndicatorCreate   // IndicatorCreateを使用する
};
//— 入力パラメータ
input Creation             type=Call_iADXWilder;   // 関数の種類
input int                  adx_period=14;         // 計算期間
input string               symbol=” “;             // シンボル
input ENUM_TIMEFRAMES     period=PERIOD_CURRENT; // 時間軸
//— 指標バッファ
double         ADXBuffer[];
double         DI_plusBuffer[];
double         DI_minusBuffer[];
//— iADXWilder 指標ハンドルを格納する変数
int    handle;
//— 格納に使用される変数
string name=symbol;
//— チャートでの指標名
string short_name;
//— Average Directional Movement Index by Welles Wilder 指標に値の数を保存
int    bars_calculated=0;
//+——————————————————————+
//| カスタム指標を初期化する関数                                            |
//+——————————————————————+
int OnInit()
{
//— 配列の指標バッファへの割り当て
SetIndexBuffer(0,ADXBuffer,INDICATOR_DATA);
SetIndexBuffer(1,DI_plusBuffer,INDICATOR_DATA);
SetIndexBuffer(2,DI_minusBuffer,INDICATOR_DATA);
//— 指標が描画するシンボルを決める
name=symbol;
//— 左右のスペースを削する
StringTrimRight(name);
StringTrimLeft(name);
//—「name」文字列の長さがゼロになった場合
if(StringLen(name)==0)
{
//— 指標が接続されているチャートのシンボルを取る
name=_Symbol;
}
//— 指標ハンドルを作成する
if(type==Call_iADXWilder)
handle=iADXWilder(name,period,adx_period);
else
{
//— 構造体を指標のパラメータで記入
MqlParam pars[1];
pars[0].type=TYPE_INT;
pars[0].integer_value=adx_period;
handle=IndicatorCreate(name,period,IND_ADXW,1,pars);
}
//— ハンドルが作成されなかった場合
if(handle==INVALID_HANDLE)
{
//— 失敗した事実とエラーコードを出力する
PrintFormat(“Failed to create handle of the iADXWilder indicator for the symbol %s/%s, error code %d”,
name,
EnumToString(period),
GetLastError());
//— 指標が早期に中止された
return(INIT_FAILED);
}
//— Average Directional Movement Index by Welles Wilder 指標が計算された銘柄/時間軸を表示
short_name=StringFormat(“iADXWilder(%s/%s period=%d)”,name,EnumToString(period),adx_period);
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[])
{
//— iADXWilder 指標から複製された値の数
int values_to_copy;
//— 指標で計算された値の数を決める
int calculated=BarsCalculated(handle);
if(calculated<=0)
{
PrintFormat(“BarsCalculated() returned %d, error code %d”,calculated,GetLastError());
return(0);
}
//— これが指標計算の初めであるか iADXWilder 指標の値の数が変更した
//—または、2 つ以上のバーの指標の計算が必要である場合(価格履歴で何かが変更された)
if(prev_calculated==0 || calculated!=bars_calculated || rates_total>prev_calculated+1)
{
//— もし iADXWilder Buffer 配列が銘柄/期間で iADXWilder 指標の値の数より大きい場合、全体のコピーはしない
//— 他の場合、指標バッファサイズより少ない量をコピーをする
if(calculated>rates_total) values_to_copy=rates_total;
else                       values_to_copy=calculated;
}
else
{
//— これは初回の計算ではなく、
//— 前回の OnCalculate() から、一以上のバーが加えられてない。
values_to_copy=(rates_total-prev_calculated)+1;
}
//— 配列をAverage Directional Movement Index by Welles Wilder 指標の値で記入<81/80/82% >
//— FillArraysFromBuffer が false を返した場合、情報の準備が終わっていないので操作を終了する
if(!FillArraysFromBuffers(ADXBuffer,DI_plusBuffer,DI_minusBuffer,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);
//— Average Directional Movement Index 指標の値の数を覚える<55/66/79% >
bars_calculated=calculated;
//— prev_calculated 値を次の関数呼び出しのために返す
return(rates_total);
}
//+——————————————————————+
//| iADXWilder 指標から指標バッファを記入する                                 |
//+——————————————————————+
bool FillArraysFromBuffers(double &adx_values[],     // ADX 指標値の指標バッファ
double &DIplus_values[],   // DI+ 指標バッファ
double &DIminus_values[], // DI- 指標バッファ
int ind_handle,           // iADXWilder 指標ハンドル
int amount                 // 複製された値の数

{
//— エラーコードをリセットする
ResetLastError();
//— インデックス0 を持つ指標バッファの値で iADXBuffer 配列の一部を記入する
if(CopyBuffer(ind_handle,0,0,amount,adx_values)<0)
{
//— 複製が失敗したら、エラーコードを出す
PrintFormat(“Failed to copy data from the iADXWilder indicator, error code %d”,GetLastError());
//— ゼロ結果で終了。 指標は計算されていないと見なされる
return(false);
}

//— インデックス 1 を持つ指標バッファの値で DI_plusBuffer 配列の一部を記入する
if(CopyBuffer(ind_handle,1,0,amount,DIplus_values)<0)
{
//— 複製が失敗したら、エラーコードを出す
PrintFormat(“Failed to copy data from the iADXWilder indicator, error code %d”,GetLastError());
//— ゼロ結果で終了。 指標は計算されていないと見なされる
return(false);
}

//— インデックス 2 を持つ指標バッファの値で DI_minusBuffer 配列の一部を記入する
if(CopyBuffer(ind_handle,2,0,amount,DIminus_values)<0)
{
//— 複製が失敗したら、エラーコードを出す
PrintFormat(“Failed to copy data from the iADXWilder indicator, error code %d”,GetLastError());
//— ゼロ結果で終了。 指標は計算されていないと見なされる
return(false);
}
//— 全てが成功
return(true);
}
//+——————————————————————+
//| 指標初期化解除関数                                                  |
//+——————————————————————+
void OnDeinit(const int reason)
{
//— 指標の削除後チャートをクリアする
Comment(“”);
}

iAlligator

この関数は Alligator (アリゲーター)指標のハンドルを返します。

int  iAlligator(
string              symbol,            // 銘柄名
ENUM_TIMEFRAMES    period,            // 期間
int                jaw_period,        // 顎の計算期間
int                jaw_shift,        // 顎の水平シフト
int                teeth_period,      // 歯の計算期間
int                teeth_shift,      // 歯の水平シフト
int                lips_period,      // 口の計算期間
int                lips_shift,        // 口の水平シフト
ENUM_MA_METHOD      ma_method,        // 平滑化の種類
ENUM_APPLIED_PRICE  applied_price      // 価格の種類かハンドル
);

パラメータ

symbol

[in] データが指標計算に使用される有価証券の銘柄名(NULL は現在のシンボル)

period

[in] 期間の値は ENUM_TIMEFRAMES 列挙の値の 1 つで、0 は現在の時間軸の意味です。

jaw_period

[in]  青線の平均期間(アリゲーターの顎)

jaw_shift

[in] 価格チャートに相対した青線のシフト

teeth_period

[in]  赤線の平均期間(アリゲーターの歯)

teeth_shift

[in] 価格チャートに相対した赤線のシフト

lips_period

[in]  緑線の平均期間(アリゲーターの口)

lips_shift

[in] 価格チャートに相対した緑線のシフト

ma_method

[in]  平均化の方法ENUM_MA_METHOD 値のいずれか

applied_price

[in]  使用される価格。ENUM_APPLIED_PRICE 価格定数のいずれか、または別の指標ハンドル。

戻り値

指定されたテクニカル指標ハンドル。失敗の場合 INVALID_HANDLE。IndicatorRelease() 関数に指標ハンドルを渡すことによって 、コンピュータメモリを利用されていない指標から解放することが出来ます。

注意事項

バッファ番号は 0 – GATORJAW_LINE、1 – GATORTEETH_LINE、2 – GATORLIPS_LINE です。

例:

//+——————————————————————+
//|                                              Demo_iAlligator.mq5 |
//|                        Copyright 2011, MetaQuotes Software Corp. |
//|                                             https://www.MQL5.com |
//+——————————————————————+
#property copyright “Copyright 2011, MetaQuotes Software Corp.”
#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 iAlligator 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 the other parameters are similar to the standard Alligator.”

#property indicator_chart_window
#property indicator_buffers 3
#property indicator_plots   3
//— 顎をプロットする
#property indicator_label1 “Jaws”
#property indicator_type1   DRAW_LINE
#property indicator_color1  clrBlue
#property indicator_style1 STYLE_SOLID
#property indicator_width1  1
//— 歯をプロットする
#property indicator_label2 “Teeth”
#property indicator_type2   DRAW_LINE
#property indicator_color2  clrRed
#property indicator_style2 STYLE_SOLID
#property indicator_width2  1
//— 口をプロットする
#property indicator_label3 “Lips”
#property indicator_type3   DRAW_LINE
#property indicator_color3  clrLime
#property indicator_style3 STYLE_SOLID
#property indicator_width3  1
//+——————————————————————+
//| 作成を処理する方法の列挙                                              |
//+——————————————————————+
enum Creation
{
Call_iAlligator,       // iAlligator を使用する
Call_IndicatorCreate   // IndicatorCreateを使用する
};
//— 入力パラメータ
input Creation             type=Call_iAlligator;   // 関数の種類
input string               symbol=” “;             // シンボル
input ENUM_TIMEFRAMES     period=PERIOD_CURRENT; // 時間軸
input int                  jaw_period=13;         // 顎線の期間
input int                  jaw_shift=8;           // 顎線のシフト
input int                  teeth_period=8;         // 歯線の期間
input int                  teeth_shift=5;         // 歯線のシフト
input int     &nnbsp;            lips_period=5;         // 口線の期間
input int                  lips_shift=3;           // 口線のシフト
input ENUM_MA_METHOD       MA_method=MODE_SMMA;   // アリゲーター線の平均化の方法
input ENUM_APPLIED_PRICE   applied_price=PRICE_MEDIAN;// アリゲーター計算に使用される価格の種類
//— 指標バッファ
double         JawsBuffer[];
double         TeethBuffer[];
double         LipsBuffer[];
//— iAlligator 指標ハンドルを格納する変数
int    handle;
//— 格納に使用される変数
string name=symbol;
//— チャートでの指標名
string short_name;
//— アリゲーター指標に値の数を保存
int    bars_calculated=0;
//+——————————————————————+
//| カスタム指標を初期化する関数                                            |
//+——————————————————————+
int OnInit()
{
//— 配列の指標バッファへの割り当て
SetIndexBuffer(0,JawsBuffer,INDICATOR_DATA);
SetIndexBuffer(1,TeethBuffer,INDICATOR_DATA);
SetIndexBuffer(2,LipsBuffer,INDICATOR_DATA);
//— それぞれの線のシフトを設定
PlotIndexSetInteger(0,PLOT_SHIFT,jaw_shift);
PlotIndexSetInteger(1,PLOT_SHIFT,teeth_shift);
PlotIndexSetInteger(2,PLOT_SHIFT,lips_shift);
//— 指標が描画するシンボルを決める
name=symbol;
//— 左右のスペースを削する
StringTrimRight(name);
StringTrimLeft(name);
//—「name」文字列の長さがゼロになった場合
if(StringLen(name)==0)
{
//— 指標が接続されているチャートのシンボルを取る
name=_Symbol;
}
//— 指標ハンドルを作成する
if(type==Call_iAlligator)
handle=iAlligator(name,period,jaw_period,jaw_shift,teeth_period,
teeth_shift,lips_period,lips_shift,MA_method,applied_price);
else
{
//— 構造体を指標のパラメータで記入
MqlParam pars[8];
     //— アリゲーター線の期間とシフト
pars[0].type=TYPE_INT;
pars[0].integer_value=jaw_period;
pars[1].type=TYPE_INT;
pars[1].integer_value=jaw_shift;
pars[2].type=TYPE_INT;
pars[2].integer_value=teeth_period;
pars[3].type=TYPE_INT;
pars[3].integer_value=teeth_shift;
pars[4].type=TYPE_INT;
pars[4].integer_value=lips_period;
pars[5].type=TYPE_INT;
pars[5].integer_value=lips_shift;
//— 平滑化の種類
pars[6].type=TYPE_INT;
pars[6].integer_value=MA_method;
//— 価格の種類
pars[7].type=TYPE_INT;
pars[7].integer_value=applied_price;
//— ハンドルを作成
handle=IndicatorCreate(name,period,IND_ALLIGATOR,8,pars);
}
//— ハンドルが作成されなかった場合
if(handle==INVALID_HANDLE)
{
//— 失敗した事実とエラーコードを出力する
PrintFormat(“Failed to create handle of the iAlligator indicator for the symbol %s/%s, error code %d”,
name,
EnumToString(period),
GetLastError());
//— 指標が早期に中止された
return(INIT_FAILED);
}
//— アリゲーターが計算された銘柄/時間軸を表示
short_name=StringFormat(“iAlligator(%s/%s, %d,%d,%d,%d,%d,%d)”,name,EnumToString(period),
jaw_period,jaw_shift,teeth_period,teeth_shift,lips_period,lips_shift);
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[])
{
//— iAlligator 指標から複製された値の数
int values_to_copy;
//— 指標で計算された値の数を決める
int calculated=BarsCalculated(handle);
if(calculated<=0)
{
PrintFormat(“BarsCalculated() returned %d, error code %d”,calculated,GetLastError());
return(0);
}
//— これが指標計算の初めであるか iAlligator 指標の値の数が変更した
//—または、2 つ以上のバーの指標の計算が必要である場合(価格履歴で何かが変更された)
if(prev_calculated==0 || calculated!=bars_calculated || rates_total>prev_calculated+1)
{
//— もし JawsBuffer 配列が銘柄/期間で iAlligator 指標の値の数より大きい場合、全体のコピーはしない
//— 他の場合、指標バッファサイズより少ない量をコピーをする
if(calculated>rates_total) values_to_copy=rates_total;
else                       values_to_copy=calculated;
}
else
{
//— これは初回の計算ではなく、
//— 前回の OnCalculate() から、一以上のバーが加えられてない。
values_to_copy=(rates_total-prev_calculated)+1;
}
//— 配列をアリゲーター指標の値で記入
//— FillArraysFromBuffer が false を返した場合、情報の準備が終わっていないので操作を終了する
if(!FillArraysFromBuffers(JawsBuffer,jaw_shift,TeethBuffer,teeth_shift,LipsBuffer,lips_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);
}
//+——————————————————————+
//| iAlligator 指標から指標バッファを記入する                                 |
//+——————————————————————+
bool FillArraysFromBuffers(double &jaws_buffer[], // 顎線の指標バッファ
int j_shift,           // 顎線のシフト
double &teeth_buffer[], // 歯線の指標バッファ
int t_shift,           // 歯線のシフト
double &lips_buffer[], // 口線の指標バッファe
int l_shift,           // 口線のシフト
int ind_handle,         // iAlligator 指標ハンドル
int amount             // 複製された値の数

{
//— エラーコードをリセットする
ResetLastError();
//— インデックス0 を持つ指標バッファの値で JawsBuffer 配列の一部を記入する
if(CopyBuffer(ind_handle,0,-j_shift,amount,jaws_buffer)<0)
{
//— 複製が失敗したら、エラーコードを出す
PrintFormat(“Failed to copy data from the iAlligator indicator, error code %d”,GetLastError());
//— ゼロ結果で終了。 指標は計算されていないと見なされる
return(false);
}

//— インデックス0 を持つ指標バッファの値で TeethBuffer 配列の一部を記入する
if(CopyBuffer(ind_handle,1,-t_shift,amount,teeth_buffer)<0)
{
//— 複製が失敗したら、エラーコードを出す
PrintFormat(“Failed to copy data from the iAlligator indicator, error code %d”,GetLastError());
//— ゼロ結果で終了。 指標は計算されていないと見なされる
return(false);
}

//— インデックス 2 を持つ指標バッファの値で LipsBuffer 配列の一部を記入する
if(CopyBuffer(ind_handle,2,-l_shift,amount,lips_buffer)<0)
{
//— 複製が失敗したら、エラーコードを出す
PrintFormat(“Failed to copy data from the iAlligator indicator, error code %d”,GetLastError());
//— ゼロ結果で終了。 指標は計算されていないと見なされる
return(false);
}
//— 全てが成功
return(true);
}
//+——————————————————————+
//| 指標初期化解除関数                                                  |
//+——————————————————————+
void OnDeinit(const int reason)
{
//— 指標の削除後チャートをクリアする
Comment(“”);
}

iAMA

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

int  iAMA(
string              symbol,            // 銘柄名
ENUM_TIMEFRAMES    period,            // 期間
int                ama_period,        // AMA 平均期間
int                fast_ma_period,    // 高速 MA 期間
int                slow_ma_period,    // 低速 MA 期間
int                ama_shift,          // 指標の水平シフト
ENUM_APPLIED_PRICE  applied_price      // 価格の種類かハンドル
);

パラメータ

symbol

[in] データが指標計算に使用される有価証券の銘柄名(NULL は現在のシンボル)

period

[in] 期間の値は ENUM_TIMEFRAMES 列挙の値の 1 つで、0 は現在の時間軸の意味です。

ama_period

[in]  効率係数が計算された計算期間

fast_ma_period

[in]  急速な市場のための平滑化係数計算の高速期間

slow_ma_period

[in]  トレンド不在下での平滑化係数計算の低速期間

ama_shift

[in]  価格チャートに相対した指標のシフト

applied_price

[in]  使用される価格。ENUM_APPLIED_PRICE 価格定数のいずれか、または別の指標ハンドル。

戻り値

指定されたテクニカル指標ハンドル。失敗の場合 INVALID_HANDLE。IndicatorRelease() 関数に指標ハンドルを渡すことによって 、コンピュータメモリを利用されていない指標から解放することが出来ます。

例:

//+——————————————————————+
//|                                                    Demo_iAMA.mq5 |
//|                        Copyright 2011, MetaQuotes Software Corp. |
//|                                             https://www.MQL5.com |
//+——————————————————————+
#property copyright “Copyright 2011, MetaQuotes Software Corp.”
#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 iAMA 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 the other parameters are similar to the standard AMA.”

#property indicator_chart_window
#property indicator_buffers 1
#property indicator_plots   1
//— iAMA をプロットする
#property indicator_label1 “iAMA”
#property indicator_type1   DRAW_LINE
#property indicator_color1  clrRed
#property indicator_style1 STYLE_SOLID
#property indicator_width1  1
//+——————————————————————+
//| 作成を処理する方法の列挙                                              |
//+——————————————————————+
enum Creation
{
Call_iAMA,             // iAMA を使用する
Call_IndicatorCreate   // IndicatorCreateを使用する
};
//— 入力パラメータ
input Creation             type=Call_iAMA;         // 関数の種類
input string               symbol=” “;             // シンボル
input ENUM_TIMEFRAMES     period=PERIOD_CURRENT;   // 時間軸
input int                  ama_period=15;           // 計算期間
input int                  fast_ma_period=2;       // 高速 MA 期間
input int                  slow_ma_period=30;       // 低速 MA 期間
input int                  ama_shift=0;             // 水平シフト
input ENUM_APPLIED_PRICE   applied_price;           // 価格の種類
//— 指標バッファ
double         iAMABuffer[];
//— iAMA 指標ハンドルを格納する変数
int    handle;
//— 格納に使用される変数
string name=symbol;
//— チャートでの指標名
string short_name;
//— 適応型移動平均指標に値の数を保存
int    bars_calculated=0;
//+——————————————————————+
//| カスタム指標を初期化する関数                                            |
//+——————————————————————+
int OnInit()
{
//— 指標バッファマッピング
SetIndexBuffer(0,iAMABuffer,INDICATOR_DATA);
//— シフトを設定
PlotIndexSetInteger(0,PLOT_SHIFT,ama_shift);
//— 指標が描画するシンボルを決める
name=symbol;
//— 左右のスペースを削する
StringTrimRight(name);
StringTrimLeft(name);
//—「name」文字列の長さがゼロになった場合
if(StringLen(name)==0)
{
//— 指標が接続されているチャートのシンボルを取る
name=_Symbol;
}
//— 指標ハンドルを作成する
if(type==Call_iAMA)
handle=iAMA(name,period,ama_period,fast_ma_period,slow_ma_period,ama_shift,applied_price);
else
{
//— 構造体を指標のパラメータで記入
MqlParam pars[5];
pars[0].type=TYPE_INT;
pars[0].integer_value=ama_period;
pars[1].type=TYPE_INT;
pars[1].integer_value=fast_ma_period;
pars[2].type=TYPE_INT;
pars[2].integer_value=slow_ma_period;
pars[3].type=TYPE_INT;
pars[3].integer_value=ama_shift;
//— 価格の種類
pars[4].type=TYPE_INT;
pars[4].integer_value=applied_price;
handle=IndicatorCreate(name,period,IND_AMA,5,pars);
}
//— ハンドルが作成されなかった場合
if(handle==INVALID_HANDLE)
{
//— 失敗した事実とエラーコードを出力する
PrintFormat(“Failed to create handle of the iAMA indicator for the symbol %s/%s, error code %d”,
name,
EnumToString(period),
GetLastError());
//— 指標が早期に中止された
return(INIT_FAILED);
}
//— 適応型移動平均 が計算された銘柄/時間軸を表示
short_name=StringFormat(“iAMA(%s/%s,%d,%d,%d,d)”,name,EnumToString(period),ama_period,fast_ma_period,slow_ma_period,ama_shift);
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[])
{
//— iAMA 指標から複製された値の数
int values_to_copy;
//— 指標で計算された値の数を決める
int calculated=BarsCalculated(handle);
if(calculated<=0)
{
PrintFormat(“BarsCalculated() returned %d, error code %d”,calculated,GetLastError());
return(0);
}
//— これが指標計算の初めであるか iAMA 指標の値の数が変更した
//—または、2 つ以上のバーの指標の計算が必要である場合(価格履歴で何かが変更された)
if(prev_calculated==0 || calculated!=bars_calculated || rates_total>prev_calculated+1)
{
//— もし iAMABuffer 配列が銘柄/期間で iAMA 指標の値の数より大きい場合、全体のコピーはしない
//— 他の場合、指標バッファサイズより少ない量をコピーをする
if(calculated>rates_total) values_to_copy=rates_total;
else                       values_to_copy=calculated;
}
else
{
//— これは初回の計算ではなく、
//— 前回の OnCalculate() から、一以上のバーが加えられてない。
values_to_copy=(rates_total-prev_calculated)+1;
}
//— 配列を 適応型移動平均指標の値で記入
//— FillArraysFromBuffer が false を返した場合、情報の準備が終わっていないので操作を終了する
if(!FillArrayFromBuffer(iAMABuffer,ama_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);
}
//+——————————————————————+
//| iAMA 指標から指標バッファを記入する                                       |
//+——————————————————————+
bool FillArrayFromBuffer(double &ama_buffer[], // AMA 線の指標バッファ
int a_shift,           // AMA 線のシフト
int ind_handle,       // iAMA 指標ハンドル
int amount             // 複製された値の数

{
//— エラーコードをリセットする
ResetLastError();
//— インデックス0 を持つ指標バッファの値で iAMABuffer 配列の一部を記入する
if(CopyBuffer(ind_handle,0,-a_shift,amount,ama_buffer)<0)
{
//— 複製が失敗したら、エラーコードを出す
PrintFormat(“Failed to copy data from the iAMA indicator, error code %d”,GetLastError());
//— ゼロ結果で終了。 指標は計算されていないと見なされる
return(false);
}
//— 全てが成功
return(true);
}
//+——————————————————————+
//| 指標初期化解除関数                                                  |
//+——————————————————————+
void OnDeinit(const int reason)
{
//— 指標の削除後チャートをクリアする
Comment(“”);
}

iAO

この関数は Awesome Oscillator (オーサムオシレータ)指標のハンドルを返します。バッファは 1 つです。

int  iAO(
string          symbol,    // 銘柄名
ENUM_TIMEFRAMES  period      // 期間
);

パラメータ

symbol

[in] データが指標計算に使用される有価証券の銘柄名(NULL は現在のシンボル)

period

[in] 期間の値は ENUM_TIMEFRAMES 列挙の値の 1 つで、0 は現在の時間軸の意味です。

戻り値

指定されたテクニカル指標ハンドル。失敗の場合 INVALID_HANDLE。IndicatorRelease() 関数に指標ハンドルを渡すことによって 、コンピュータメモリを利用されていない指標から解放することが出来ます。

例:

//+——————————————————————+
//|                                                     Demo_iAO.mq5 |
//|                        Copyright 2011, MetaQuotes Software Corp. |
//|                                             https://www.MQL5.com |
//+——————————————————————+
#property copyright “Copyright 2011, MetaQuotes Software Corp.”
#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 iAO 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 indicator_separate_window
#property indicator_buffers 2
#property indicator_plots   1
//— iAO プロット
#property indicator_label1 “iAO”
#property indicator_type1   DRAW_COLOR_HISTOGRAM
#property indicator_color1  clrGreen,clrRed
#property indicator_style1 STYLE_SOLID
#property indicator_width1  1
//+——————————————————————+
//| 作成を処理する方法の列挙                                              |
//+——————————————————————+
enum Creation
{
Call_iAO,               // iAO を使用する
Call_IndicatorCreate   // IndicatorCreateを使用する
};
//— 入力パラメータ
input Creation             type=Call_iAO;         // 関数の種類
input string               symbol=” “;             // シンボル
input ENUM_TIMEFRAMES     period=PERIOD_CURRENT; // 時間軸
//— 指標バッファ
double         iAOBuffer[];
double         iAOColors[];
//— iAO 指標ハンドルを格納する変数
int    handle;
//— 格納に使用される変数
string name=symbol;
//— チャートでの指標名
string short_name;
//— Awesome Oscillator 指標に値の数を保存
int    bars_calculated=0;
//+——————————————————————+
//| カスタム指標を初期化する関数                                            |
//+——————————————————————+
int OnInit()
{
//— 配列の指標バッファへの割り当て
SetIndexBuffer(0,iAOBuffer,INDICATOR_DATA);
SetIndexBuffer(1,iAOColors,INDICATOR_COLOR_INDEX);
//— 指標が描画するシンボルを決める
name=symbol;
//— 左右のスペースを削する
StringTrimRight(name);
StringTrimLeft(name);
//—「name」文字列の長さがゼロになった場合
if(StringLen(name)==0)
{
//— 指標が接続されているチャートのシンボルを取る
name=_Symbol;
}
//— 指標ハンドルを作成する
if(type==Call_iAO)
handle=iAO(name,period);
else
handle=IndicatorCreate(name,period,IND_AO);
//— ハンドルが作成されなかった場合
if(handle==INVALID_HANDLE)
{
//— 失敗した事実とエラーコードを出力する
PrintFormat(“Failed to create handle of the iAO indicator for the symbol %s/%s, error code %d”,
name,
EnumToString(period),
GetLastError());
//— 指標が早期に中止された
return(INIT_FAILED);
}
//— オーサムオシレーターが計算された銘柄/時間軸を表示r
short_name=StringFormat(“iAO(%s/%s)”,name,EnumToString(period));
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[])
{
//— iAO 指標から複製された値の数
int values_to_copy;
//— 指標で計算された値の数を決める
int calculated=BarsCalculated(handle);
if(calculated<=0)
{
PrintFormat(“BarsCalculated() returned %d, error code %d”,calculated,GetLastError());
return(0);
}
//— これが指標計算の初めであるか iAO 指標の値の数が変更した
//—または、2 つ以上のバーの指標の計算が必要である場合(価格履歴で何かが変更された)
if(prev_calculated==0 || calculated!=bars_calculated || rates_total>prev_calculated+1)
{
//— もし iAOBuffer 配列が銘柄/期間で iAO 指標の値の数より大きい場合、全体のコピーはしない
//— 他の場合、指標バッファサイズより少ない量をコピーをする
if(calculated>rates_total) values_to_copy=rates_total;
else                       values_to_copy=calculated;
}
else
{
//— これは初回の計算ではなく、
//— 前回の OnCalculate() から、一以上のバーが加えられてない。
values_to_copy=(rates_total-prev_calculated)+1;
}
//— オーサムオシレーター指標の値で iAOBuffer と iAOColors 配列を記入する
//— FillArraysFromBuffer が false を返した場合、情報の準備が終わっていないので操作を終了する
if(!FillArraysFromBuffer(iAOBuffer,iAOColors,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);
}
//+——————————————————————+
//| iAO 指標から指標バッファを記入する                                        |
//+——————————————————————+
bool FillArraysFromBuffer(double &values[],       // オーサムオシレーター値の指標バッファ
double &color_indexes[], // 色のバッファ(色インデックスを格納)
int ind_handle,         // iAO 指標ハンドル
int amount               // 複製された値の数

{
//— エラーコードをリセットする
ResetLastError();
//—インデックス0 を持つ指標バッファの値で iAOBuffer 配列の一部を記入する
if(CopyBuffer(ind_handle,0,0,amount,values)<0)
{
//— 複製が失敗したら、エラーコードを出す
PrintFormat(“Failed to copy data from the iAO indicator, error code %d”,GetLastError());
//— ゼロ結果で終了。 指標は計算されていないと見なされる
return(false);
}
//— 色インデックスを複製する
if(CopyBuffer(ind_handle,1,0,amount,color_indexes)<0)
{
//— 複製が失敗したら、エラーコードを出す
PrintFormat(“Failed to copy color values from the iAO indicator, error code %d”,GetLastError());
//— ゼロ結果で終了。 指標は計算されていないと見なされる
return(false);
}
//— 全てが成功
return(true);
}
//+——————————————————————+
//| 指標初期化解除関数                                                  |
//+——————————————————————+
void OnDeinit(const int reason)
{
//— 指標の削除後チャートをクリアする
Comment(“”);
}

iATR

この関数は ATR(Average True Range)指標ハンドルを返します。バッファは 1 つです。

int  iATR(
string          symbol,        // 銘柄名
ENUM_TIMEFRAMES  period,        // 期間
int              ma_period      // 平均期間
);

パラメータ

symbol

[in] データが指標計算に使用される有価証券の銘柄名(NULL は現在のシンボル)

period

[in] 期間の値は ENUM_TIMEFRAMES 列挙の値の 1 つで、0 は現在の時間軸の意味です。

ma_period

[in]  指標計算の平均期間の値

戻り値

指定されたテクニカル指標ハンドル。失敗の場合 INVALID_HANDLE。IndicatorRelease() 関数に指標ハンドルを渡すことによって 、コンピュータメモリを利用されていない指標から解放することが出来ます。

例:

//+——————————————————————+
//|                                                    Demo_iATR.mq5 |
//|                        Copyright 2011, MetaQuotes Software Corp. |
//|                                             https://www.MQL5.com |
//+——————————————————————+
#property copyright “Copyright 2011, MetaQuotes Software Corp.”
#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 iATR 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 indicator_separate_window
#property indicator_buffers 1
#property indicator_plots   1
//— iATR をプロットする
#property indicator_label1 “iATR”
#property indicator_type1   DRAW_LINE
#property indicator_color1  clrLightSeaGreen
#property indicator_style1 STYLE_SOLID
#property indicator_width1  1
//+——————————————————————+
//| 作成を処理する方法の列挙                                              |
//+——————————————————————+
enum Creation
{
Call_iATR,// iATR を使用する
Call_IndicatorCreate   // IndicatorCreateを使用する
};
//— 入力パラメータ
input int                  atr_period=14;         // 計算期間
input Creation             type=Call_iATR;         // 関数の種類
input string               symbol=” “;             // シンボル
input ENUM_TIMEFRAMES     period=PERIOD_CURRENT; // 時間軸
//— 指標バッファ
double         iATRBuffer[];
//— iAC 指標ハンドルを格納する変数
int    handle;
//— 格納に使用される変数
string name=symbol;
//— チャートでの指標名
string short_name;
//— ATR 指標に値の数を保存
int    bars_calculated=0;
//+——————————————————————+
//| カスタム指標を初期化する関数                                            |
//+——————————————————————+
int OnInit()
{
//— 配列の指標バッファへの割り当て
SetIndexBuffer(0,iATRBuffer,INDICATOR_DATA);
//— 指標が描画するシンボルを決める
name=symbol;
//— 左右のスペースを削する
StringTrimRight(name);
StringTrimLeft(name);
//—「name」文字列の長さがゼロになった場合
if(StringLen(name)==0)
{
//— 指標が接続されているチャートのシンボルを取る
name=_Symbol;
}
//— 指標ハンドルを作成する
if(type==Call_iATR)
handle=iATR(name,period,atr_period);
else
{
//— 構造体を指標のパラメータで記入
MqlParam pars[1];
pars[0].type=TYPE_INT;
pars[0].integer_value=atr_period;
handle=IndicatorCreate(name,period,IND_ATR,1,pars);
}
//— ハンドルが作成されなかった場合
if(handle==INVALID_HANDLE)
{
//— 失敗した事実とエラーコードを出力する
PrintFormat(“Failed to create handle of the iATR indicator for the symbol %s/%s, error code %d”,
name,
EnumToString(period),
GetLastError());
//— 指標が早期に中止された
return(INIT_FAILED);
}
//— ATR 指標が計算された銘柄/時間軸を表示
short_name=StringFormat(“iATR(%s/%s, period=%d)”,name,EnumToString(period),atr_period);
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[])
{
//— iATR 指標から複製された値の数
int values_to_copy;
//— 指標で計算された値の数を決める
int calculated=BarsCalculated(handle);
if(calculated<=0)
{
PrintFormat(“BarsCalculated() returned %d, error code %d”,calculated,GetLastError());
return(0);
}
//— これが指標計算の初めであるか iATR 指標の値の数が変更した
//—または、2 つ以上のバーの指標の計算が必要である場合(価格履歴で何かが変更された)
if(prev_calculated==0 || calculated!=bars_calculated || rates_total>prev_calculated+1)
{
//—もし iATRBuffer 配列が銘柄/期間で iATR 指標の値の数より大きい場合、全体のコピーはしない
//— 他の場合、指標バッファサイズより少ない量をコピーをする
if(calculated>rates_total) values_to_copy=rates_total;
else                       values_to_copy=calculated;
}
else
{
//— これは初回の計算ではなく、
//— 前回の OnCalculate() から、一以上のバーが加えられてない。
values_to_copy=(rates_total-prev_calculated)+1;
}
//— iATRBuffer 配列をATR 指標の値で記入
//— FillArrayFromBuffer が false を返した場合、情報の準備が終わっていないので操作を終了する
if(!FillArrayFromBuffer(iATRBuffer,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);
//— ATR 指標の値の数を覚える
bars_calculated=calculated;
//— prev_calculated 値を次の関数呼び出しのために返す
return(rates_total);
}
//+——————————————————————+
//| iATR 指標から指標バッファを記入する                                       |
//+——————————————————————+
bool FillArrayFromBuffer(double &values[], // ATR 値の指標バッファ
int ind_handle,   // iATR 指標ハンドル
int amount         // 複製された値の数

{
//— エラーコードをリセットする
ResetLastError();
//— インデックス0 を持つ指標バッファの値で iATRBuffer 配列の一部を記入するx
if(CopyBuffer(ind_handle,0,0,amount,values)<0)
{
//— 複製が失敗したら、エラーコードを出す
PrintFormat(“Failed to copy data from the iATR indicator, error code %d”,GetLastError());
//— ゼロ結果で終了。 指標は計算されていないと見なされる
return(false);
}
//— 全てが成功
return(true);
}
//+——————————————————————+
//| 指標初期化解除関数                                                  |
//+——————————————————————+
void OnDeinit(const int reason)
{
//— 指標の削除後チャートをクリアする
Comment(“”);
}

iBearsPower

この関数は Bears Power (ベアパワー)指標のハンドルを返します。バッファは 1 つです。

int  iBearsPower(
string              symbol,            // 銘柄名
ENUM_TIMEFRAMES    period,            // 期間
int                ma_period,        // 平均期間
);

パラメータ

symbol

[in] データが指標計算に使用される有価証券の銘柄名(NULL は現在のシンボル)

period

[in] 期間の値は ENUM_TIMEFRAMES 列挙の値の 1 つで、0 は現在の時間軸の意味です。

ma_period

[in]  指標計算の平均期間の値

戻り値

指定されたテクニカル指標ハンドル。失敗の場合 INVALID_HANDLE。IndicatorRelease() 関数に指標ハンドルを渡すことによって 、コンピュータメモリを利用されていない指標から解放することが出来ます。

例:

//+——————————————————————+
//|                                             Demo_iBearsPower.mq5 |
//|                        Copyright 2011, MetaQuotes Software Corp. |
//|                                             https://www.MQL5.com |
//+——————————————————————+
#property copyright “Copyright 2011, MetaQuotes Software Corp.”
#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 iBearsPower 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 indicator_separate_window
#property indicator_buffers 1
#property indicator_plots   1
//— iBearsPower プロット
#property indicator_label1 “iBearsPower”
#property indicator_type1   DRAW_HISTOGRAM
#property indicator_color1  clrSilver
#property indicator_style1 STYLE_SOLID
#property indicator_width1  1
//+——————————————————————+
//| 作成を処理する方法の列挙                                              |
//+——————————————————————+
enum Creation
{
Call_iBearsPower,       // iBearsPower を使用する
Call_IndicatorCreate   // IndicatorCreateを使用する
};
//— 入力パラメータ
input Creation             type=Call_iBearsPower; // 関数の種類
input int                  ma_period=13;           // 移動平均の期間
input string               symbol=” “;             // シンボル
input ENUM_TIMEFRAMES     period=PERIOD_CURRENT; // 時間軸
//— 指標バッファ
double         iBearsPowerBuffer[];
//— iBearsPower 指標ハンドルを格納する変数
int    handle;
//— 格納に使用される変数
string name=symbol;
//— チャートでの指標名
string short_name;
//— ベアパワー指標に値の数を保存
int    bars_calculated=0;
//+——————————————————————+
//| カスタム指標を初期化する関数                                            |
//+——————————————————————+
int OnInit()
{
//— 配列の指標バッファへの割り当て
SetIndexBuffer(0,iBearsPowerBuffer,INDICATOR_DATA);
//— 指標が描画するシンボルを決める
name=symbol;
//— 左右のスペースを削する
StringTrimRight(name);
StringTrimLeft(name);
//—「name」文字列の長さがゼロになった場合
if(StringLen(name)==0)
{
//— 指標が接続されているチャートのシンボルを取る
name=_Symbol;
}
//— 指標ハンドルを作成する
if(type==Call_iBearsPower)
handle=iBearsPower(name,period,ma_period);
else
{
//— 構造体を指標のパラメータで記入
MqlParam pars[1];
//— ma 期間    
pars[0].type=TYPE_INT;
pars[0].integer_value=ma_period;
handle=IndicatorCreate(name,period,IND_BEARS,1,pars);
}
//— ハンドルが作成されなかった場合
if(handle==INVALID_HANDLE)
{
//— 失敗した事実とエラーコードを出力する
PrintFormat(“Failed to create handle of the iBearsPower indicator for the symbol %s/%s, error code %d”,
name,
EnumToString(period),
GetLastError());
//— 指標が早期に中止された
return(INIT_FAILED);
}
//— ベアパワー指標が計算された銘柄/時間軸を表示
short_name=StringFormat(“iBearsPower(%s/%s, period=%d)”,name,EnumToString(period),ma_period);
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[])
{
//— iBearsPower 指標から複製された値の数
int values_to_copy;
//— 指標で計算された値の数を決める
int calculated=BarsCalculated(handle);
if(calculated<=0)
{
PrintFormat(“BarsCalculated() returned %d, error code %d”,calculated,GetLastError());
return(0);
}
//— これが指標計算の初めであるか iBearsPower 指標の値の数が変更した
//—または、2 つ以上のバーの指標の計算が必要である場合(価格履歴で何かが変更された)
if(prev_calculated==0 || calculated!=bars_calculated || rates_total>prev_calculated+1)
{
//— もし iBearsPowerBuffer 配列が銘柄/期間で iBearsPower 指標の値の数より大きい場合、全体のコピーはしない
//— 他の場合、指標バッファサイズより少ない量をコピーをする
if(calculated>rates_total) values_to_copy=rates_total;
else                       values_to_copy=calculated;
}
else
{
//— これは初回の計算ではなく、
//— 前回の OnCalculate() から、一以上のバーが加えられてない。
values_to_copy=(rates_total-prev_calculated)+1;
}
//— iBearsPowerBuffer 配列をベアパワー指標の値で記入
//— FillArrayFromBuffer が false を返した場合、情報の準備が終わっていないので操作を終了する
if(!FillArrayFromBuffer(iBearsPowerBuffer,handle,values_to_copy)) return(0);
//— メッセージを形成する
string comm=StringFormat(“%s ==>  Updated value in the indicator %s: %d”,
TimeToString(TimeCurrent(),TIME_DATE|TIME_SECONDS),
&nbsnbsp;              short_name,
values_to_copy);
//— チャートにサービスメッセージを表示する
Comment(comm);
//— ベアパワー指標の値の数を覚える
bars_calculated=calculated;
//— prev_calculated 値を次の関数呼び出しのために返す
return(rates_total);
}
//+——————————————————————+
//| iBearsPower 指標から指標バッファを記入する                               |
//+——————————————————————+
bool FillArrayFromBuffer(double &values[], // ベアパワー値の指標バッファ
int ind_handle,   // iBearsPower 指標ハンドル
int amount         // 複製された値の数

{
//— エラーコードをリセットする
ResetLastError();
//— インデックス0 を持つ指標バッファの値で iBearsPowerBuffer 配列の一部を記入する
if(CopyBuffer(ind_handle,0,0,amount,values)<0)
{
//— 複製が失敗したら、エラーコードを出す
PrintFormat(“Failed to copy data from the iBearsPower indicator, error code %d”,GetLastError());
//— ゼロ結果で終了。 指標は計算されていないと見なされる
return(false);
}
//— 全てが成功
return(true);
}
//+——————————————————————+
//| 指標初期化解除関数                                                  |
//+——————————————————————+
void OnDeinit(const int reason)
{
//— 指標の削除後チャートをクリアする
Comment(“”);
}

iBands

この関数は Bollinger Bands® (ボリンジャーバンド®)指標ハンドルを返します。

int  iBands(
string              symbol,            // 銘柄名
ENUM_TIMEFRAMES    period,            // 期間
int                bands_period,     // 平均線の計算の期間
int                bands_shift,      // 指標の水平シフト
double              deviation,        // 標準偏差の数
ENUM_APPLIED_PRICE  applied_price      // 価格の種類かハンドル
);

パラメータ

symbol

[in] データが指標計算に使用される有価証券の銘柄名(NULL は現在のシンボル)

period

[in] 期間の値は ENUM_TIMEFRAMES 列挙の値の 1 つで、0 は現在の時間軸の意味です。

bands_period

[in]  指標の正中線の平均期間

bands_shift

[in] 価格チャートに相対した指標のシフト

偏差

[in]  正中線からの逸脱

applied_price

[in]  使用される価格。ENUM_APPLIED_PRICE 価格定数のいずれか、または別の指標ハンドル。

戻り値

指定されたテクニカル指標ハンドル。失敗の場合 INVALID_HANDLE。IndicatorRelease() 関数に指標ハンドルを渡すことによって 、コンピュータメモリを利用されていない指標から解放することが出来ます。

注意事項

バッファ番号は 0 – BASE_LINE、1 – UPPER_BAND、2 – LOWER_BAND です。

例:

//+——————————————————————+
//|                                                  Demo_iBands.mq5 |
//|                        Copyright 2011, MetaQuotes Software Corp. |
//|                                             https://www.MQL5.com |
//+——————————————————————+
#property copyright “Copyright 2011, MetaQuotes Software Corp.”
#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 iBands 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 indicator_chart_window
#property indicator_buffers 3
#property indicator_plots   3
//— 上のプロット
#property indicator_label1 “Upper”
#property indicator_type1   DRAW_LINE
#property indicator_color1  clrMediumSeaGreen
#property indicator_style1 STYLE_SOLID
#property indicator_width1  1
//— 下のプロット
#property indicator_label2 “Lower”
#property indicator_type2   DRAW_LINE
#property indicator_color2  clrMediumSeaGreen
#property indicator_style2 STYLE_SOLID
#property indicator_width2  1
//— 真ん中のプロット
#property indicator_label3 “Middle”
#property indicator_type3   DRAW_LINE
#property indicator_color3  clrMediumSeaGreen
#property indicator_style3 STYLE_SOLID
#property indicator_width3  1
//+——————————————————————+
//| 作成を処理する方法の列挙                                              |
//+——————————————————————+
enum Creation
{
Call_iBands,           // iBands を使用する
Call_IndicatorCreate   // IndicatorCreateを使用する
};
//— 入力パラメータ
input Creation             type=Call_iBands;         // 関数の種類
input int                  bands_period=20;           // 移動平均の期間
input int                  bands_shift=0;             // シフト
input double               deviation=2.0;             // 標準偏差の数
input ENUM_APPLIED_PRICE   applied_price=PRICE_CLOSE; // 価格の種類
input string               symbol=” “;               // シンボル
input ENUM_TIMEFRAMES     period=PERIOD_CURRENT;     // 時間軸
//— 指標バッファ
double         UpperBuffer[];
double         LowerBuffer[];
double         MiddleBuffer[];
//— iBands 指標ハンドルを格納する変数
int    handle;
//— 格納に使用される変数
string name=symbol;
//— チャートでの指標名
string short_name;
//— ボリンジャーバンド指標に値の数を保存
int    bars_calculated=0;
//+——————————————————————+
//| カスタム指標を初期化する関数                                            |
//+——————————————————————+
int OnInit()
{
//— 配列の指標バッファへの割り当て
SetIndexBuffer(0,UpperBuffer,INDICATOR_DATA);
SetIndexBuffer(1,LowerBuffer,INDICATOR_DATA);
SetIndexBuffer(2,MiddleBuffer,INDICATOR_DATA);
//— それぞれの線のシフトを設定
PlotIndexSetInteger(0,PLOT_SHIFT,bands_shift);
PlotIndexSetInteger(1,PLOT_SHIFT,bands_shift);
PlotIndexSetInteger(2,PLOT_SHIFT,bands_shift);
//— 指標が描画するシンボルを決める
name=symbol;
//— 左右のスペースを削する
StringTrimRight(name);
StringTrimLeft(name);
//—「name」文字列の長さがゼロになった場合
if(StringLen(name)==0)
{
//— 指標が接続されているチャートのシンボルを取る
name=_Symbol;
}
//— 指標ハンドルを作成する
if(type==Call_iBands)
handle=iBands(name,period,bands_period,bands_shift,deviation,applied_price);
else
{
//— 構造体を指標のパラメータで記入
MqlParam pars[4];
//— ma の期間
pars[0].type=TYPE_INT;
pars[0].integer_value=bands_period;
//— シフト
pars[1].type=TYPE_INT;
pars[1].integer_value=bands_shift;
//— 標準偏差の数
pars[2].type=TYPE_DOUBLE;
pars[2].double_value=deviation;
//— 価格の種類
pars[3].type=TYPE_INT;
pars[3].integer_value=applied_price;
handle=IndicatorCreate(name,period,IND_BANDS,4,pars);
}
//— ハンドルが作成されなかった場合
if(handle==INVALID_HANDLE)
{
//— 失敗した事実とエラーコードを出力する
PrintFormat(“Failed to create handle of the iBands indicator for the symbol %s/%s, error code %d”,
name,
EnumToString(period),
GetLastError());
//— 指標が早期に中止された
return(INIT_FAILED);
}
//— ボリンジャーバンド指標が計算された銘柄/時間軸を表示
short_name=StringFormat(“iBands(%s/%s, %d,%d,%G,%s)”,name,EnumToString(period),
bands_period,bands_shift,deviation,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[])
{
//— iBands 指標から複製された値の数
int values_to_copy;
//— 指標で計算された値の数を決める
int calculated=BarsCalculated(handle);
if(calculated<=0)
{
PrintFormat(“BarsCalculated() returned %d, error code %d”,calculated,GetLastError());
return(0);
}
//— これが指標計算の初めであるか iBands 指標の値の数が変更した changed
//—または、2 つ以上のバーの指標の計算が必要である場合(価格履歴で何かが変更された)
if(prev_calculated==0 || calculated!=bars_calculated || rates_total>prev_calculated+1)
{
//— もし iBands 配列が銘柄/期間で iAC 指標の値の数より大きい場合、全体のコピーはしない
//— 他の場合、指標バッファサイズより少ない量をコピーをする
if(calculated>rates_total) values_to_copy=rates_total;
else                       values_to_copy=calculated;
}
else
{
//— これは初回の計算ではなく、
//— 前回の OnCalculate() から、一以上のバーが加えられてない。
values_to_copy=(rates_total-prev_calculated)+1;
}
//— 配列をボリンジャーバンド指標の値で記入
//— FillArraysFromBuffer が false を返した場合、情報の準備が終わっていないので操作を終了する
if(!FillArraysFromBuffers(MiddleBuffer,UpperBuffer,LowerBuffer,bands_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);
}
//+——————————————————————+
//| iBands 指標から指標バッファを記入する                                     |
//+——————————————————————+
bool FillArraysFromBuffers(double &base_values[],     // ボリンジャーバンドの中線の指標バッファ
double &upper_values[],   // 上縁の指標バッファ
double &lower_values[],   // 下縁の指標バッファ
int shift,                 // シフト
int ind_handle,           // iBands 指標ハンドル
int amount                 // 複製された値の数

{
//— エラーコードをリセットする
ResetLastError();
//— インデックス0 を持つ指標バッファの値で MiddleBuffer 配列の一部を記入する
if(CopyBuffer(ind_handle,0,-shift,amount,base_values)<0)
{
//— 複製が失敗したら、エラーコードを出す
PrintFormat(“Failed to copy data from the iBands indicator, error code %d”,GetLastError());
//— ゼロ結果で終了。 指標は計算されていないと見なされる
return(false);
}

//— インデックス 1 を持つ指標バッファの値で UpperBuffer 配列の一部を記入する
if(CopyBuffer(ind_handle,1,-shift,amount,upper_values)<0)
{
//— 複製が失敗したら、エラーコードを出す
PrintFormat(“Failed to copy data from the iBands indicator, error code %d”,GetLastError());
//— ゼロ結果で終了。 指標は計算されていないと見なされる
return(false);
}

//— インデックス 2 を持つ指標バッファの値で LowerBuffer 配列の一部を記入する
if(CopyBuffer(ind_handle,2,-shift,amount,lower_values)<0)
{
//— 複製が失敗したら、エラーコードを出す
PrintFormat(“Failed to copy data from the iBands indicator, error code %d”,GetLastError());
//— ゼロ結果で終了。 指標は計算されていないと見なされる
return(false);
}
//— 全てが成功
return(true);
}
//+——————————————————————+
//| 指標初期化解除関数                                                  |
//+——————————————————————+
void OnDeinit(const int reason)
{
//— 指標の削除後チャートをクリアする
Comment(“”);
}

iBullsPower

この関数は Bulls Power (ブルパワー)指標ハンドルを返します。バッファは 1 つです。

int  iBullsPower(
string              symbol,            // 銘柄名
ENUM_TIMEFRAMES    period,           // 期間
int                ma_period,        // 平均期間
);

パラメータ

symbol

[in] データが指標計算に使用される有価証券の銘柄名(NULL は現在のシンボル)

period

[in] 期間の値は ENUM_TIMEFRAMES 列挙の値の 1 つで、0 は現在の時間軸の意味です。

ma_period

[in]  指標計算の平均期間

戻り値

指定されたテクニカル指標ハンドル。失敗の場合 INVALID_HANDLE。IndicatorRelease() 関数に指標ハンドルを渡すことによって 、コンピュータメモリを利用されていない指標から解放することが出来ます。

例:

//+——————————————————————+
//|                                             Demo_iBullsPower.mq5 |
//|                        Copyright 2011, MetaQuotes Software Corp. |
//|                                             https://www.MQL5.com |
//+——————————————————————+
#property copyright “Copyright 2011, MetaQuotes Software Corp.”
#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 iBullsPower 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 indicator_separate_window
#property indicator_buffers 1
#property indicator_plots   1
//— ブルパワープロット
#property indicator_label1 “iBullsPower”
#property indicator_type1   DRAW_HISTOGRAM
#property indicator_color1  clrSilver
#property indicator_style1 STYLE_SOLID
#property indicator_width1  1
//+——————————————————————+
//| 作成を処理する方法の列挙                                              |
//+——————————————————————+
enum Creation
{
Call_iBullsPower,       // iBullsPower を使用する
Call_IndicatorCreate   // IndicatorCreateを使用する
};
//— 入力パラメータ
input Creation             type=Call_iBullsPower; // 関数の種類
input int                  ma_period=13;           // 移動平均の期間
input string               symbol=” “;             // シンボル
input ENUM_TIMEFRAMES     period=PERIOD_CURRENT; // 時間軸
//— 指標バッファ
double         iBullsPowerBuffer[];
//— iBullsPower 指標ハンドルを格納する変数
int    handle;
//— 格納に使用される変数
string name=symbol;
//— チャートでの指標名
string short_name;
//— ブルパワー指標に値の数を保存
int    bars_calculated=0;
//+——————————————————————+
//| カスタム指標を初期化する関数                                            |
//+——————————————————————+
int OnInit()
{
//— 配列の指標バッファへの割り当て
SetIndexBuffer(0,iBullsPowerBuffer,INDICATOR_DATA);
//— 指標が描画するシンボルを決める
name=symbol;
//— 左右のスペースを削する
StringTrimRight(name);
StringTrimLeft(name);
//—「name」文字列の長さがゼロになった場合
if(StringLen(name)==0)
{
//— 指標が接続されているチャートのシンボルを取る
name=_Symbol;
}
//— 指標ハンドルを作成する
if(type==Call_iBullsPower)
handle=iBullsPower(name,period,ma_period);
else
{
//— 構造体を指標のパラメータで記入
MqlParam pars[1];
//— ma の期間
pars[0].type=TYPE_INT;
pars[0].integer_value=ma_period;
handle=IndicatorCreate(name,period,IND_BULLS,1,pars);
}
//— ハンドルが作成されなかった場合
if(handle==INVALID_HANDLE)
{
//— 失敗した事実とエラーコードを出力する
PrintFormat(“Failed to create handle of the iBullsPower indicator for the symbol %s/%s, error code %d”,
name,
EnumToString(period),
GetLastError());
//— 指標が早期に中止された
return(INIT_FAILED);
}
//— ブルパワー指標が計算された銘柄/時間軸を表示
short_name=StringFormat(“iBullsPower(%s/%s, period=%d)”,name,EnumToString(period),ma_period);
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[])
{
//— iBullsPower 指標から複製された値の数
int values_to_copy;
//— 指標で計算された値の数を決める
int calculated=BarsCalculated(handle);
if(calculated<=0)
{
PrintFormat(“BarsCalculated() returned %d, error code %d”,calculated,GetLastError());
return(0);
}
//— これが指標計算の初めであるか iBullsPower 指標の値の数が変更した
//—または、2 つ以上のバーの指標の計算が必要である場合(価格履歴で何かが変更された)
if(prev_calculated==0 || calculated!=bars_calculated || rates_total>prev_calculated+1)
{
//— もし iBullsPowerBuffer 配列が銘柄/期間で iBullsPower 指標の値の数より大きい場合、全体のコピーはしない
//— 他の場合、指標バッファサイズより少ない量をコピーをする
if(calculated>rates_total) values_to_copy=rates_total;
else                       values_to_copy=calculated;
}
else
{
//— これは初回の計算ではなく、
//— 前回の OnCalculate() から、一以上のバーが加えられてない。
values_to_copy=(rates_total-prev_calculated)+1;
}
//— iBullsPowerBuffer 配列をブルパワー指標の値で記入
//— FillArrayFromBuffer が false を返した場合、情報の準備が終わっていないので操作を終了する
if(!FillArrayFromBuffer(iBullsPowerBuffer,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);
}
//+——————————————————————+
//| iBullsPower 指標から指標バッファを記入する                                |
//+——————————————————————+
bool FillArrayFromBuffer(double &values[], // ブルパワー値の指標バッファ
int ind_handle,   // iBullsPower 指標ハンドル
int amount         // 複製された値の数

{
//— エラーコードをリセットする
ResetLastError();
//— インデックス0 を持つ指標バッファの値で iBullsPowerBuffer 配列の一部を記入する
if(CopyBuffer(ind_handle,0,0,amount,values)<0)
{
//— 複製が失敗したら、エラーコードを出す
PrintFormat(“Failed to copy data from the iBullsPower indicator, error code %d”,GetLastError());
//— ゼロ結果で終了。 指標は計算されていないと見なされる
return(false);
}
//— 全てが成功
return(true);
}
//+——————————————————————+
//| 指標初期化解除関数                                                  |
//+——————————————————————+
void OnDeinit(const int reason)
{
//— 指標の削除後チャートをクリアする
Comment(“”);
}
//+——————————————————————+

iCCI

この関数は CCI(Commodity Channel Index、商品チャンネル指数)指標ハンドルを返します。バッファは 1 つです。

int  iCCI(
string              symbol,            // 銘柄名
ENUM_TIMEFRAMES    period,            // 期間
int                ma_period,        // 平均期間
ENUM_APPLIED_PRICE  applied_price   // 価格の種類かハンドル
);

パラメータ

symbol

[in] データが指標計算に使用される有価証券の銘柄名(NULL は現在のシンボル)

period

[in] 期間の値は ENUM_TIMEFRAMES 列挙の値の 1 つで、0 は現在の時間軸の意味です。

ma_period

[in]  指標計算の平均期間

applied_price

[in]  使用される価格。ENUM_APPLIED_PRICE 価格定数のいずれか、または別の指標ハンドル。

戻り値

指定されたテクニカル指標ハンドル。失敗の場合 INVALID_HANDLE。IndicatorRelease() 関数に指標ハンドルを渡すことによって 、コンピュータメモリを利用されていない指標から解放することが出来ます。

例:

//+——————————————————————+
//|                                                    Demo_iCCI.mq5 |
//|                        Copyright 2011, MetaQuotes Software Corp. |
//|                                             https://www.MQL5.com |
//+——————————————————————+
#property copyright “Copyright 2011, MetaQuotes Software Corp.”
#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 iCCI 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 indicator_separate_window
#property indicator_buffers 1
#property indicator_plots   1
//— iCCI プロット
#property indicator_label1 “iCCI”
#property indicator_type1   DRAW_LINE
#property indicator_color1  clrLightSeaGreen
#property indicator_style1 STYLE_SOLID
#property indicator_width1  1
//— 指標ウィンドウの水平レベル
#property indicator_level1  -100.0
#property indicator_level2  100.0
//+——————————————————————+
//| 作成を処理する方法の列挙                                              |
//+——————————————————————+
enum Creation
{
Call_iCCI,             // iCCI を使用する
Call_IndicatorCreate   // IndicatorCreateを使用する
};
//— 入力パラメータ
input Creation             type=Call_iCCI;               // 関数の種類
input int                  ma_period=14;                 // 移動平均の期間
input ENUM_APPLIED_PRICE   applied_price=PRICE_TYPICAL; // 価格の種類
input string               symbol=” “;                   // シンボル
input ENUM_TIMEFRAMES     period=PERIOD_CURRENT;       // 時間軸
//— 指標バッファ
double         iCCIBuffer[];
//— iCCI 指標ハンドルを格納する変数r
int    handle;
//— 格納に使用される変数
string name=symbol;
//— チャートでの指標名
string short_name;
//— CCI 指標に値の数を保存
int    bars_calculated=0;
//+——————————————————————+
//| カスタム指標を初期化する関数                                            |
//+——————————————————————+
int OnInit()
{
//— 配列の指標バッファへの割り当て
SetIndexBuffer(0,iCCIBuffer,INDICATOR_DATA);
//— 指標が描画するシンボルを決める
name=symbol;
//— 左右のスペースを削する
StringTrimRight(name);
StringTrimLeft(name);
//—「name」文字列の長さがゼロになった場合
if(StringLen(name)==0)
{
//— 指標が接続されているチャートのシンボルを取る
name=_Symbol;
}
//— 指標ハンドルを作成する
if(type==Call_iCCI)
handle=iCCI(name,period,ma_period,applied_price);
else
{
//— 構造体を指標のパラメータで記入
MqlParam pars[2];
//— 移動平均の期間
pars[0].type=TYPE_INT;
pars[0].integer_value=ma_period;
//— 価格の種類
pars[1].type=TYPE_INT;
pars[1].integer_value=applied_price;
handle=IndicatorCreate(name,period,IND_CCI,2,pars);
}
//— ハンドルが作成されなかった場合
if(handle==INVALID_HANDLE)
{
//— 失敗した事実とエラーコードを出力する
PrintFormat(“Failed to create handle of the iCCI indicator for the symbol %s/%s, error code %d”,
name,
EnumToString(period),
GetLastError());
//— 指標が早期に中止された
return(INIT_FAILED);
}
//— CCI 指標が計算された銘柄/時間軸を表示
short_name=StringFormat(“iCCI(%s/%s, %d, %s)”,name,EnumToString(period),
ma_period,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[])
{
//— iCCI 指標から複製された値の数
int values_to_copy;
//— 指標で計算された値の数を決める
int calculated=BarsCalculated(handle);
if(calculated<=0)
{
PrintFormat(“BarsCalculated() returned %d, error code %d”,calculated,GetLastError());
return(0);
}
//— これが指標計算の初めであるか iCCI 指標の値の数が変更した
//—または、2 つ以上のバーの指標の計算が必要である場合(価格履歴で何かが変更された)
if(prev_calculated==0 || calculated!=bars_calculated || rates_total>prev_calculated+1)
{
//— もし iCCIBuffer 配列が銘柄/期間で iCCI 指標の値の数より大きい場合、全体のコピーはしない
//— 他の場合、指標バッファサイズより少ない量をコピーをする
if(calculated>rates_total) values_to_copy=rates_total;
else                       values_to_copy=calculated;
}
else
{
//— これは初回の計算ではなく、
//— 前回の OnCalculate() から、一以上のバーが加えられてない。
values_to_copy=(rates_total-prev_calculated)+1;
}
//— iCCIBuffer 配列を CCI 指標の値で記入
//— FillArrayFromBuffer が false を返した場合、情報の準備が終わっていないので操作を終了する
if(!FillArrayFromBuffer(iCCIBuffer,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);
//— CCI 指標の値の数を覚える
bars_calculated=calculated;
//— prev_calculated 値を次の関数呼び出しのために返す
return(rates_total);
}
//+——————————————————————+
//| iCCI 指標から指標バッファを記入する                                       |
//+——————————————————————+
bool FillArrayFromBuffer(double &values[], // CCI 値の指標バッファ
int ind_handle,   // iCCI 指標ハンドル
int amount         // 複製された値の数

{
//— エラーコードをリセットする
ResetLastError();
//— インデックス0 を持つ指標バッファの値で iCCIBuffer 配列の一部を記入する
if(CopyBuffer(ind_handle,0,0,amount,values)<0)
{
//— 複製が失敗したら、エラーコードを出す
PrintFormat(“Failed to copy data from the iCCI indicator, error code %d”,GetLastError());
//— ゼロ結果で終了。 指標は計算されていないと見なされる
return(false);
}
//— 全てが成功
return(true);
}
//+——————————————————————+
//| 指標初期化解除関数                              |
//+——————————————————————+
void OnDeinit(const int reason)
{
//— 指標の削除後チャートをクリアする
Comment(“”);
}

iChaikin

この関数は Chaikin Oscillator(チャイキンオシレーター)指標のハンドルを返します。バッファは 1 つです。

int  iChaikin(
string              symbol,            // 銘柄名
ENUM_TIMEFRAMES      period,            // 期間
int                  fast_ma_period,    // 高速期間
int                  slow_ma_period,    // 低速期間
ENUM_MA_METHOD      ma_method,          // 平滑化の種類
ENUM_APPLIED_VOLUME  applied_volume     // ボリュームの種類
);

パラメータ

symbol

[in] データが指標計算に使用される有価証券の銘柄名(NULL は現在のシンボル)

period

[in] 期間の値は ENUM_TIMEFRAMES 列挙の値の 1 つで、0 は現在の時間軸の意味です。

fast_ma_period

[in] 計算の高速平均期間

slow_ma_period

[in] 計算の低速平均期間

ma_method

[in]  平滑化の種類(ENUM_MA_METHOD 定数のいずれか)

applied_volume

[in]  使用されるボリューム(ENUM_APPLIED_VOLUME 定数のいずれか)

戻り値

指定されたテクニカル指標ハンドル。失敗の場合 INVALID_HANDLE。IndicatorRelease() 関数に指標ハンドルを渡すことによって 、コンピュータメモリを利用されていない指標から解放することが出来ます。

例:

//+——————————————————————+
//|                                                Demo_iChaikin.mq5 |
//|                        Copyright 2011, MetaQuotes Software Corp. |
//|                                             https://www.MQL5.com |
//+——————————————————————+
#property copyright “Copyright 2011, MetaQuotes Software Corp.”
#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 iChaikin 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 indicator_separate_window
#property indicator_buffers 1
#property indicator_plots   1
//— iChaikin プロット
#property indicator_label1 “iChaikin”
#property indicator_type1   DRAW_LINE
#property indicator_color1  clrLightSeaGreen
#property indicator_style1 STYLE_SOLID
#property indicator_width1  1
//+——————————————————————+
//| 作成を処理する方法の列挙                                              |
//+——————————————————————+
enum Creation
{
Call_iChaikin,         // iChaikinを使用する
Call_IndicatorCreate   // IndicatorCreateを使用する
};
//— 入力パラメータ
input Creation             type=Call_iChaikin;           // 関数の種類
input int                  fast_ma_period=3;             // 高速 MA 期間
input int                  slow_ma_period=10;           // 低速 MA 期間
input ENUM_MA_METHOD       ma_method=MODE_EMA;           // 平滑化の種類
input ENUM_APPLIED_VOLUME  applied_volume=VOLUME_TICK;   // ボリュームの種類
input string               symbol=” “;                   // シンボル
input ENUM_TIMEFRAMES     period=PERIOD_CURRENT;       // 時間軸
//— 指標バッファ
double         iChaikinBuffer[];
//— iChaikin 指標ハンドルを格納する変数
int    handle;
//— 格納に使用される変数
string name=symbol;
//— チャートでの指標名
string short_name;
//— チャイキンオシレーター 指標に値の数を保存
int    bars_calculated=0;
//+——————————————————————+
//| カスタム指標を初期化する関数                                            |
//+——————————————————————+
int OnInit()
{
//— 配列の指標バッファへの割り当て
SetIndexBuffer(0,iChaikinBuffer,INDICATOR_DATA);
//— 指標が描画するシンボルを決める
name=symbol;
//— 左右のスペースを削する
StringTrimRight(name);
StringTrimLeft(name);
//—「name」文字列の長さがゼロになった場合
if(StringLen(name)==0)
{
//— 指標が接続されているチャートのシンボルを取る
name=_Symbol;
}
//— 指標ハンドルを作成する
if(type==Call_iChaikin)
handle=iChaikin(name,period,fast_ma_period,slow_ma_period,ma_method,applied_volume);
else
{
//— 構造体を指標のパラメータで記入
MqlParam pars[4];
//— 高速 MA 期間
pars[0].type=TYPE_INT;
pars[0].integer_value=fast_ma_period;
//— 低速 MA 期間
pars[1].type=TYPE_INT;
pars[1].integer_value=slow_ma_period;
//— 平滑化の種類
pars[2].type=TYPE_INT;
pars[2].integer_value=ma_method;
//— ボリュームの種類
pars[3].type=TYPE_INT;
pars[3].integer_value=applied_volume;
handle=IndicatorCreate(name,period,IND_CHAIKIN,4,pars);
}
//— ハンドルが作成されなかった場合
if(handle==INVALID_HANDLE)
{
//— 失敗した事実とエラーコードを出力する
PrintFormat(“Failed to create handle of the iChaikin indicator for the symbol %s/%s, error code %d”,
name,
EnumToString(period),
GetLastError());
//— 指標が早期に中止された
return(INIT_FAILED);
}
//— チャイキンオシレーター 指標が計算された銘柄/時間軸を表示
short_name=StringFormat(“iChaikin(%s/%s, %d, %d, %s, %s)”,name,EnumToString(period),
fast_ma_period,slow_ma_period,
EnumToString(ma_method),EnumToString(applied_volume));
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[])
{
//— iChaikin 指標から複製された値の数r
int values_to_copy;
//— 指標で計算された値の数を決める
int calculated=BarsCalculated(handle);
if(calculated<=0)
{
PrintFormat(“BarsCalculated() returned %d, error code %d”,calculated,GetLastError());
return(0);
}
//— これが指標計算の初めであるか iChaikin 指標の値の数が変更した
//—または、2 つ以上のバーの指標の計算が必要である場合(価格履歴で何かが変更された)
if(prev_calculated==0 || calculated!=bars_calculated || rates_total>prev_calculated+1)
{
//— もし iChaikinBuffer 配列が銘柄/期間でiChaikin 指標の値の数より大きい場合、全体のコピーはしない
//— 他の場合、指標バッファサイズより少ない量をコピーをする
if(calculated>rates_total) values_to_copy=rates_total;
else                       values_to_copy=calculated;
}
else
{
//— これは初回の計算ではなく、
//— 前回の OnCalculate() から、一以上のバーが加えられてない。
values_to_copy=(rates_total-prev_calculated)+1;
}
//— iChaikinBuffer 配列を チャイキンオシレーター 指標の値で記入
//— FillArrayFromBuffer が false を返した場合、情報の準備が終わっていないので操作を終了する
if(!FillArrayFromBuffer(iChaikinBuffer,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);
}
//+——————————————————————+
//| iChaikin 指標から指標バッファを記入する                                   |
//+——————————————————————+
bool FillArrayFromBuffer(double &values[], // チャイキンオシレーター 値の指標バッファ
int ind_handle,   // iChaikin 指標ハンドル
int amount         // 複製された値の数

{
//— エラーコードをリセットする
ResetLastError();
//— インデックス0 を持つ指標バッファの値で iChaikinBuffer 配列の一部を記入する
if(CopyBuffer(ind_handle,0,0,amount,values)<0)
{
//— 複製が失敗したら、エラーコードを出す
PrintFormat(“Failed to copy data from the iChaikin indicator, error code %d”,GetLastError());
//— ゼロ結果で終了。 指標は計算されていないと見なされる
return(false);
}
//— 全てが成功
return(true);
}
//+——————————————————————+
//| 指標初期化解除関数                                                  |
//+——————————————————————+
void OnDeinit(const int reason)
{
//— 指標の削除後チャートをクリアする
Comment(“”);
}

iCustom

この関数は指定されたカスタム指標ハンドルを返します。

int  iCustom(
string          symbol,    // 銘柄名
ENUM_TIMEFRAMES  period,    // 期間
string          name        // フォルダ/カスタム指標名
  …                          // 指標入力パラメータのリスト
);

パラメータ

symbol

[in] データが指標計算に使用される有価証券の銘柄名(NULL は現在のシンボル)

period

[in] 期間の値は ENUM_TIMEFRAMES 列挙の値の 1 つで、0 は現在の時間軸の意味です。

name

[in]  指標のルートディレクトリ(MQL5/Indicators/)からの相対パスを使用したカスタム指標の名称。指標が、例えば MQL5/Indicators/Examples サブディレクトリに位置する場合、名称は “Examples\indicator_name” (セパレータとして単一のスラッシュの代わりにダブルスラッシュを使用する必要があります)の様に指定される必要があります。

[in]  コンマで区切られたカスタム指標の入力パラメータパラメータの種類と順序が一致している必要があります。パラメータの指定がない場合は初期値が使用されます。

戻り値

指定されたテクニカル指標ハンドル。失敗の場合 INVALID_HANDLE。IndicatorRelease() 関数に指標ハンドルを渡すことによって 、コンピュータメモリを利用されていない指標から解放することが出来ます。

注意事項

カスタム指標はコンパイルされて( EX5 拡張子) クライアント端末の MQL5/Indicators ディレクトリかそのサブディレクトリに置かれなければなりません。

テストが必要な指標は、パラメータが文字列定数で設定されていれば、iCustom() 関数の呼び出しから自動的に定義されています。他の全ての場合(IndicatorCreate() 関数の使用や指標名を設定するパラメータでの非定数文字列の使用)#property tester_indicator プロパティが必要です。

#property tester_indicator “indicator_name.ex5”

指標が最初の呼び出し形式を使用する場合、カスタム指標を使い始める時に、その「パラメータ」タブで、計算のためのデータを指定することが出来ます。「適用価格」パラメータが明確に選択されていない場合、デフォルト計算は終値に基づきます。

指標計算に使用する時系列の選択

MQL5 プログラムからカスタム指標が呼ばれる場合、Applied_Price パラメータまたは別の指標ハンドルは、カスタム指標の他の入力パラメータ全ての後で受け渡しされるべきです。

参照

プログラムプロパティ、時系列と指標へのアクセス、IndicatorCreate()、IndicatorRelease()

例:

#property indicator_separate_window
#property indicator_buffers 1
#property indicator_plots   1
//—- Label1 をプロットする
#property indicator_label1 “Label1”
#property indicator_type1   DRAW_LINE
#property indicator_color1 clrRed
#property indicator_style1 STYLE_SOLID
#property indicator_width1  1
//— 入力パラメータ
input int MA_Period=21;
input int MA_Shift=0;
input ENUM_MA_METHOD MA_Method=MODE_SMA;
//— 指標バッファ
double         Label1Buffer[];
//— Custom Moving Average.mq5 カスタム指標ハンドル
int MA_handle;
//+——————————————————————+
//| カスタム指標を初期化する関数                                            |
//+——————————————————————+
int OnInit()
{
//— 指標バッファマッピング
SetIndexBuffer(0,Label1Buffer,INDICATOR_DATA);
ResetLastError();
MA_handle=iCustom(NULL,0,“Examples\Custom Moving Average”,
MA_Period,
MA_Shift,
MA_Method,
PRICE_CLOSE // 終値の使用
);
Print(“MA_handle = “,MA_handle,”  error = “,GetLastError());
//—
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[])
{
//— 指標 Custom Moving Average の値を指標バッファに複製する
int copy=CopyBuffer(MA_handle,0,0,rates_total,Label1Buffer);
Print(“copy = “,copy,”    rates_total = “,rates_total);
//— I試みが失敗したら報告する
if(copy<=0)
Print(“An attempt to get the values if Custom Moving Average has failed”);
//— 次の呼び出しのために prev_calculated の値を返す
return(rates_total);
}
//+——————————————————————+

iDEMA

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

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

パラメータ

symbol

[in] データが指標計算に使用される有価証券の銘柄名(NULL は現在のシンボル)

period

[in] 期間の値は ENUM_TIMEFRAMES 列挙の値の 1 つで、0 は現在の時間軸の意味です。

ma_period

[in] 計算の平均期間(バーの数)

ma_shift

[in]  価格チャートに相対した指標のシフト

applied_price

[in]  使用される価格。ENUM_APPLIED_PRICE 価格定数のいずれか、または別の指標ハンドル。

戻り値

指定されたテクニカル指標ハンドル。失敗の場合 INVALID_HANDLE。IndicatorRelease() 関数に指標ハンドルを渡すことによって 、コンピュータメモリを利用されていない指標から解放することが出来ます。

例:

//+——————————————————————+
//|                                                   Demo_iDEMA.mq5 |
//|                        Copyright 2011, MetaQuotes Software Corp. |
//|                                             https://www.MQL5.com |
//+——————————————————————+
#property copyright “Copyright 2011, MetaQuotes Software Corp.”
#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 iDEMA 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 indicator_chart_window
#property indicator_buffers 1
#property indicator_plots   1
//— iDEMA プロット
#property indicator_label1 “iDEMA”
#property indicator_type1   DRAW_LINE
#property indicator_color1  clrRed
#property indicator_style1 STYLE_SOLID
#property indicator_width1  1
//+——————————————————————+
//| 作成を処理する方法の列挙                                              |
//+——————————————————————+
enum Creation
{
Call_iDEMA,             // iDEMA を使用する
Call_IndicatorCreate   // IndicatorCreateを使用する
};
//— 入力パラメータ
input Creation             type=Call_iDEMA;           // 関数の種類
input int                  ma_period=14;             // 移動平均の期間
input int                  ma_shift=0;               // シフト
input ENUM_APPLIED_PRICE   applied_price=PRICE_CLOSE; // 価格の種類
input string               symbol=” “;               // シンボル
input ENUM_TIMEFRAMES     period=PERIOD_CURRENT;     // 時間軸
//— 指標バッファ
double         iDEMABuffer[];
//— iDEMA 指標ハンドルを格納する変数
int    handle;
//— 格納に使用される変数
string name=symbol;
//— チャートでの指標名
string short_name;
//— 2 重指数移動平均指標に値の数を保存
int    bars_calculated=0;
//+——————————————————————+
//| カスタム指標を初期化する関数                                            |
//+——————————————————————+
int OnInit()
{
//— 配列の指標バッファへの割り当て
SetIndexBuffer(0,iDEMABuffer,INDICATOR_DATA);
//— シフトを設定
PlotIndexSetInteger(0,PLOT_SHIFT,ma_shift);
//— 指標が描画するシンボルを決める
name=symbol;
//— 左右のスペースを削する
StringTrimRight(name);
StringTrimLeft(name);
//—「name」文字列の長さがゼロになった場合
if(StringLen(name)==0)
{
//— 指標が接続されているチャートのシンボルを取る
name=_Symbol;
}
//— 指標ハンドルを作成する
if(type==Call_iDEMA)
handle=iDEMA(name,period,ma_period,ma_shift,applied_price);
else
{
//— 構造体を指標のパラメータで記入
MqlParam pars[3];
//— 移動平均の期間
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=applied_price;
handle=IndicatorCreate(name,period,IND_DEMA,3,pars);
}
//— ハンドルが作成されなかった場合
if(handle==INVALID_HANDLE)
{
//— 失敗した事実とエラーコードを出力する
PrintFormat(“Failed to create handle of the iDEMA indicator for the symbol %s/%s, error code %d”,
name,
EnumToString(period),
GetLastError());
//— 指標が早期に中止された
return(INIT_FAILED);
}
//— 2 重指数移動平均指標が計算された銘柄/時間軸を表示
short_name=StringFormat(“iDEMA(%s/%s, %d, %d, %s)”,name,EnumToString(period),
ma_period,ma_shift,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[])
{
//— iDEMA 指標から複製された値の数
int values_to_copy;
//— 指標で計算された値の数を決める
int calculated=BarsCalculated(handle);
if(calculated<=0)
{
PrintFormat(“BarsCalculated() returned %d, error code %d”,calculated,GetLastError());
return(0);
}
//— これが指標計算の初めであるか iDEMA 指標の値の数が変更した
//—または、2 つ以上のバーの指標の計算が必要である場合(価格履歴で何かが変更された)
if(prev_calculated==0 || calculated!=bars_calculated || rates_total>prev_calculated+1)
{
//— もし iDEMABuffer 配列が銘柄/期間で iDEMA 指標の値の数より大きい場合、全体のコピーはしない
//— 他の場合、指標バッファサイズより少ない量をコピーをする
if(calculated>rates_total) values_to_copy=rates_total;
else                       values_to_copy=calculated;
}
else
{
//— これは初回の計算ではなく、
//— 前回の OnCalculate() から、一以上のバーが加えられてない。
values_to_copy=(rates_total-prev_calculated)+1;
}
//— iDEMABuffer 配列を ouble Exponential Moving Average 指標の値で記入
//— FillArrayFromBuffer が false を返した場合、情報の準備が終わっていないので操作を終了する
if(!FillArrayFromBuffer(iDEMABuffer,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);
//— 2 重指数移動平均指標の値の数を覚える
bars_calculated=calculated;
//— prev_calculated 値を次の関数呼び出しのために返す
return(rates_total);
}
//+——————————————————————+
//| iDEMA 指標から指標バッファを記入する                                      |
//+——————————————————————+
bool FillArrayFromBuffer(double &values[], // 2 重指数移動平均 値の指標バッファ
int shift,         // シフト
int ind_handle,   // iDEMA 指標ハンドル
int amount         // 複製された値の数

{
//— エラーコードをリセットする
ResetLastError();
//— インデックス0 を持つ指標バッファの値で iDEMABuffer 配列の一部を記入する
if(CopyBuffer(ind_handle,0,-shift,amount,values)<0)
{
//— 複製が失敗したら、エラーコードを出す
PrintFormat(“Failed to copy data from the iDEMA indicator, error code %d”,GetLastError());
//— ゼロ結果で終了。 指標は計算されていないと見なされる
return(false);
}
//— 全てが成功
return(true);
}
//+——————————————————————+
//| 指標初期化解除関数                                                  |
//+——————————————————————+
void OnDeinit(const int reason)
{
//— 指標の削除後チャートをクリアする
Comment(“”);
}

iDeMarker

この関数は DeMarker (デマーカー)指標のハンドルを返します。バッファは 1 つです。

int  iDeMarker(
string          symbol,        // 銘柄名
ENUM_TIMEFRAMES  period,        // 期間
int              ma_period      // 平均期間
);

パラメータ

symbol

[in] データが指標計算に使用される有価証券の銘柄名(NULL は現在のシンボル)

period

[in] 期間の値は ENUM_TIMEFRAMES 列挙の値の 1 つで、0 は現在の時間軸の意味です。

ma_period

[in] 計算の平均期間(バーの数)

戻り値

指定されたテクニカル指標ハンドル。失敗の場合 INVALID_HANDLE。IndicatorRelease() 関数に指標ハンドルを渡すことによって 、コンピュータメモリを利用されていない指標から解放することが出来ます。

例:

//+——————————————————————+
//|                                               Demo_iDeMarker.mq5 |
//|                        Copyright 2011, MetaQuotes Software Corp. |
//|                                             https://www.MQL5.com |
//+——————————————————————+
#property copyright “Copyright 2011, MetaQuotes Software Corp.”
#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 iDeMarker 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 indicator_separate_window
#property indicator_buffers 1
#property indicator_plots   1
//— iDeMarker プロット
#property indicator_label1 “iDeMarker”
#property indicator_type1   DRAW_LINE
#property indicator_color1  clrLightSeaGreen
#property indicator_style1 STYLE_SOLID
#property indicator_width1  1
//— 指標ウィンドウの水平レベル
#property indicator_level1  0.3
#property indicator_level2  0.7
//+——————————————————————+
//| 作成を処理する方法の列挙                                              |
//+——————————————————————+
enum Creation
{
Call_iDeMarker,         // iDeMarker を使用する
Call_IndicatorCreate   // IndicatorCreateを使用する
};
//— 入力パラメータ
input Creation             type=Call_iDeMarker;       // 関数の種類
input int                  ma_period=14;             // 移動平均の期間
input string               symbol=” “;               // シンボル
input ENUM_TIMEFRAMES     period=PERIOD_CURRENT;     // 時間軸
//— 指標バッファ
double         iDeMarkerBuffer[];
//— iDeMarker 指標ハンドルを格納する変数
int    handle;
//— 格納に使用される変数
string name=symbol;
//— チャートでの指標名
string short_name;
//— DeMarker 指標に値の数を保存
int    bars_calculated=0;
//+——————————————————————+
//| カスタム指標を初期化する関数                                            |
//+——————————————————————+
int OnInit()
{
//— 配列の指標バッファへの割り当て
SetIndexBuffer(0,iDeMarkerBuffer,INDICATOR_DATA);
//— 指標が描画するシンボルを決める
name=symbol;
//— 左右のスペースを削する
StringTrimRight(name);
StringTrimLeft(name);
//—「name」文字列の長さがゼロになった場合
if(StringLen(name)==0)
{
//— 指標が接続されているチャートのシンボルを取る
name=_Symbol;
}
//— 指標ハンドルを作成する
if(type==Call_iDeMarker)
handle=iDeMarker(name,period,ma_period);
else
{
//— 構造体を指標のパラメータで記入
MqlParam pars[1];
//— 移動平均の期間
pars[0].type=TYPE_INT;
pars[0].integer_value=ma_period;
handle=IndicatorCreate(name,period,IND_DEMARKER,1,pars);
}
//— ハンドルが作成されなかった場合
if(handle==INVALID_HANDLE)
{
//— 失敗した事実とエラーコードを出力する
PrintFormat(“Failed to create handle of the iDeMarker indicator for the symbol %s/%s, error code %d”,
name,
EnumToString(period),
GetLastError());
//— 指標が早期に中止された
return(INIT_FAILED);
}
//— DeMarker 指標が計算された銘柄/時間軸を表示
short_name=StringFormat(“iDeMarker(%s/%s, period=%d)”,name,EnumToString(period),ma_period);
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[])
{
//— iDeMarker 指標から複製された値の数
int values_to_copy;
//— 指標で計算された値の数を決める
int calculated=BarsCalculated(handle);
if(calculated<=0)
{
PrintFormat(“BarsCalculated() returned %d, error code %d”,calculated,GetLastError());
return(0);
}
//— これが指標計算の初めであるか iDeMarker 指標の値の数が変更した
//—または、2 つ以上のバーの指標の計算が必要である場合(価格履歴で何かが変更された)
if(prev_calculated==0 || calculated!=bars_calculated || rates_total>prev_calculated+1)
{
//— もし iDeMarkerBuffer 配列が銘柄/期間で iDeMarker 指標の値の数より大きい場合、全体のコピーはしない
//— 他の場合、指標バッファサイズより少ない量をコピーをする
if(calculated>rates_total) values_to_copy=rates_total;
else                       values_to_copy=calculated;
}
else
{
//— これは初回の計算ではなく、
//— 前回の OnCalculate() から、一以上のバーが加えられてない。
values_to_copy=(rates_total-prev_calculated)+1;
}
//— iDeMarkerBuffer 配列を DeMarker 指標の値で記入
//— FillArrayFromBuffer が false を返した場合、情報の準備が終わっていないので操作を終了する
if(!FillArrayFromBuffer(iDeMarkerBuffer,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);
//— DeMarker 指標の値の数を覚える
bars_calculated=calculated;
//— prev_calculated 値を次の関数呼び出しのために返す
return(rates_total);
}
//+——————————————————————+
//| iDeMarker 指標から指標バッファを記入する                                  |
//+——————————————————————+
bool FillArrayFromBuffer(double &values[], // DeMarker 値の指標バッファ
int ind_handle,   // iDeMarker 指標ハンドル
int amount         // 複製された値の数

{
//— エラーコードをリセットする
ResetLastError();
//— インデックス0 を持つ指標バッファの値で iDeMarkerBuffer 配列の一部を記入するx
if(CopyBuffer(ind_handle,0,0,amount,values)<0)
{
//— 複製が失敗したら、エラーコードを出す
PrintFormat(“Failed to copy data from the iDeMarker indicator, error code %d”,GetLastError());
//— ゼロ結果で終了。 指標は計算されていないと見なされる
return(false);
}
//— 全てが成功
return(true);
}
//+——————————————————————+
//| 指標初期化解除関数                                                  |
//+——————————————————————+
void OnDeinit(const int reason)
{
//— 指標の削除後チャートをクリアする
Comment(“”);
}

iEnvelopes

この関数は Envelopes (エンベロープ)指標のハンドルを返します。

int  iEnvelopes(
string              symbol,            // 銘柄名
ENUM_TIMEFRAMES    period,            // 期間
int                ma_period,        // 平均線計算の期間
int                ma_shift,          // 指標の水平シフト
ENUM_MA_METHOD      ma_method,        // 平滑化の種類
ENUM_APPLIED_PRICE  applied_price,    // 価格の種類かハンドル
double              deviation          // 百分率での正中線から境界線のズレ
);

パラメータ

symbol

[in] データが指標計算に使用される有価証券の銘柄名(NULL は現在のシンボル)

period

[in] 期間の値は ENUM_TIMEFRAMES 列挙の値の 1 つで、0 は現在の時間軸の意味です。

ma_period

[in] 正中線の平均期間

ma_shift

[in]  価格チャートに相対した指標のシフト

ma_method

[in]  平滑化の種類ENUM_MA_METHOD のいずれかの値

applied_price

[in]  使用される価格。ENUM_APPLIED_PRICE 価格定数のいずれか、または別の指標ハンドル。

偏差

[in]  百分率での正中線からのズレ

戻り値

指定されたテクニカル指標ハンドル。失敗の場合 INVALID_HANDLE。IndicatorRelease() 関数に指標ハンドルを渡すことによって 、コンピュータメモリを利用されていない指標から解放することが出来ます。

注意事項

バッファ番号は 0 – UPPER_LINE, 1 – LOWER_LINE です。

例:

//+——————————————————————+
//|                                              Demo_iEnvelopes.mq5 |
//|                        Copyright 2011, MetaQuotes Software Corp. |
//|                                             https://www.MQL5.com |
//+——————————————————————+
#property copyright “Copyright 2011, MetaQuotes Software Corp.”
#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 iEnvelopes 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 indicator_chart_window
#property indicator_buffers 2
#property indicator_plots   2
//— 上のプロット
#property indicator_label1 “Upper”
#property indicator_type1   DRAW_LINE
#property indicator_color1  clrBlue
#property indicator_style1 STYLE_SOLID
#property indicator_width1  1
//— 下のプロット
#property indicator_label2 “Lower”
#property indicator_type2   DRAW_LINE
#property indicator_color2  clrRed
#property indicator_style2 STYLE_SOLID
#property indicator_width2  1
//+——————————————————————+
//| 作成を処理する方法の列挙                                              |
//+——————————————————————+
enum Creation
{
Call_iEnvelopes,       // iEnvelopes を使用する
Call_IndicatorCreate   // IndicatorCreateを使用する
};
//— 入力パラメータ
input Creation             type=Call_iEnvelopes;     // 関数の種類
input int                  ma_period=14;             // 移動平均の期間
input int                  ma_shift=0;               // シフト
input ENUM_MA_METHOD       ma_method=MODE_SMA;       // 平滑化の種類
input ENUM_APPLIED_PRICE   applied_price=PRICE_CLOSE; // 価格の種類
input double               deviation=0.1;             // 堺の移動平均からの偏差
input string               symbol=” “;               // シンボル
input ENUM_TIMEFRAMES     period=PERIOD_CURRENT;     // 時間軸
//— 指標バッファ
double         UpperBuffer[];
double         LowerBuffer[];
//— iEnvelopes 指標ハンドルを格納する変数
int    handle;
//— 格納に使用される変数
string name=symbol;
//— チャートでの指標名
string short_name;
//— Envelopes 指標に値の数を保存
int    bars_calculated=0;
//+——————————————————————+
//| カスタム指標を初期化する関数                                            |
//+——————————————————————+
int OnInit()
{
//— 配列の指標バッファへの割り当て
SetIndexBuffer(0,UpperBuffer,INDICATOR_DATA);
SetIndexBuffer(1,LowerBuffer,INDICATOR_DATA);
//— それぞれの線のシフトを設定
PlotIndexSetInteger(0,PLOT_SHIFT,ma_shift);
PlotIndexSetInteger(1,PLOT_SHIFT,ma_shift);
//— 指標が描画するシンボルを決める
name=symbol;
//— 左右のスペースを削する
StringTrimRight(name);
StringTrimLeft(name);
//—「name」文字列の長さがゼロになった場合
if(StringLen(name)==0)
{
//— 指標が接続されているチャートのシンボルを取る
name=_Symbol;
}
//— 指標ハンドルを作成する
if(type==Call_iEnvelopes)
handle=iEnvelopes(name,period,ma_period,ma_shift,ma_method,applied_price,deviation);
else
{
//— 構造体を指標のパラメータで記入
MqlParam pars[5];
//— 移動平均の期間
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;
//— 価格の種類
pars[4].type=TYPE_DOUBLE;
pars[4].double_value=deviation;
handle=IndicatorCreate(name,period,IND_ENVELOPES,5,pars);
}
//— ハンドルが作成されなかった場合
if(handle==INVALID_HANDLE)
{
//— 失敗した事実とエラーコードを出力する
PrintFormat(“Failed to create handle of the iEnvelopes indicator for the symbol %s/%s, error code %d”,
name,
EnumToString(period),
GetLastError());
//— 指標が早期に中止された
return(INIT_FAILED);
}
//— Envelopes 指標が計算された銘柄/時間軸を表示
short_name=StringFormat(“iEnvelopes(%s/%s, %d, %d, %s,%s, %G)”,name,EnumToString(period),
ma_period,ma_shift,EnumToString(ma_method),EnumToString(applied_price),deviation);
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[])
{
//— iEnvelopes 指標から複製された値の数
int values_to_copy;
//— 指標で計算された値の数を決める
int calculated=BarsCalculated(handle);
if(calculated<=0)
{
PrintFormat(“BarsCalculated() returned %d, error code %d”,calculated,GetLastError());
return(0);
}
//— これが指標計算の初めであるか iEnvelopes 指標の値の数が変更した
//—または、2 つ以上のバーの指標の計算が必要である場合(価格履歴で何かが変更された)
if(prev_calculated==0 || calculated!=bars_calculated || rates_total>prev_calculated+1)
{
//— もし UpperBuffer 配列が銘柄/期間で iEnvelopes 指標の値の数より大きい場合、全体のコピーはしない
//— 他の場合、指標バッファサイズより少ない量をコピーをする
if(calculated>rates_total) values_to_copy=rates_total;
else                       values_to_copy=calculated;
}
else
{
//— これは初回の計算ではなく、
//— 前回の OnCalculate() から、一以上のバーが加えられてない。
values_to_copy=(rates_total-prev_calculated)+1;
}
//— エンベロープ指標の値で UpperBuffer 及び LowerBuffer 配列を記入する
//— FillArrayFromBuffer が false を返した場合、情報の準備が終わっていないので操作を終了する
if(!FillArraysFromBuffers(UpperBuffer,LowerBuffer,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);
}
//+——————————————————————+
//| iEnvelopes 指標から指標バッファを記入する                                 |
//+——————————————————————+
bool FillArraysFromBuffers(double &upper_values[],   // 上縁の指標バッファ
double &lower_values[],   // 下縁の指標バッファ
int shift,                 // シフト
int ind_handle,           // iEnvelopes 指標ハンドル
int amount                 // 複製された値の数

{
//— エラーコードをリセットする
ResetLastError();
//— インデックス0 を持つ指標バッファの値で UpperBuffer 配列の一部を記入する
if(CopyBuffer(ind_handle,0,-shift,amount,upper_values)<0)
{
//— 複製が失敗したら、エラーコードを出す
PrintFormat(“Failed to copy data from the iEnvelopes indicator, error code %d”,GetLastError());
//— ゼロ結果で終了。 指標は計算されていないと見なされる
return(false);
}
//— インデックス 1 を持つ指標バッファの値で LowerBuffer 配列の一部を記入する
if(CopyBuffer(ind_handle,1,-shift,amount,lower_values)<0)
{
//— 複製が失敗したら、エラーコードを出す
PrintFormat(“Failed to copy data from the iEnvelopes indicator, error code %d”,GetLastError());
//— ゼロ結果で終了。 指標は計算されていないと見なされる
return(false);
}
//— 全てが成功
return(true);
}
//+——————————————————————+
//| 指標初期化解除関数                                                  |
//+——————————————————————+
void OnDeinit(const int reason)
{
//— 指標の削除後チャートをクリアする
Comment(“”);
}

iForce

この関数は Force Index (勢力指数)指標のハンドルを返します。バッファは 1 つです。

int  iForce(
string              symbol,            // 銘柄名
ENUM_TIMEFRAMES    period,            // 期間
int                ma_period,        // 平均期間
ENUM_MA_METHOD      ma_method,        // 平滑化の種類
ENUM_APPLIED_VOLUME applied_volume     // 計算に使用するボリュームの種類
);

パラメータ

symbol

[in] データが指標計算に使用される有価証券の銘柄名(NULL は現在のシンボル)

period

[in] 期間の値は ENUM_TIMEFRAMES 列挙の値の 1 つで、0 は現在の時間軸の意味です。

ma_period

[in] 指標計算の平均期間

ma_method

[in]  平滑化の種類ENUM_MA_METHOD のいずれかの値

applied_volume

[in]  使用されるボリューム(ENUM_APPLIED_VOLUME のいずれかの値)

戻り値

指定されたテクニカル指標ハンドル。失敗の場合 INVALID_HANDLE。IndicatorRelease() 関数に指標ハンドルを渡すことによって 、コンピュータメモリを利用されていない指標から解放することが出来ます。

例:

//+——————————————————————+
//|                                                  Demo_iForce.mq5 |
//|                        Copyright 2011, MetaQuotes Software Corp. |
//|                                             https://www.MQL5.com |
//+——————————————————————+
#property copyright “Copyright 2011, MetaQuotes Software Corp.”
#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 iForce 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 indicator_separate_window
#property indicator_buffers 1
#property indicator_plots   1
//— iForce の描画
#property indicator_label1 “iForce”
#property indicator_type1   DRAW_LINE
#property indicator_color1  clrLightSeaGreen
#property indicator_style1 STYLE_SOLID
#property indicator_width1  1
//+——————————————————————+
//| 作成を処理する方法の列挙                                              |
//+——————————————————————+
enum Creation
{
Call_iForce,           // iForce を使用する
Call_IndicatorCreate   // IndicatorCreateを使用する
};
//— 入力パラメータ
input Creation             type=Call_iForce;             // 関数の種類
input int                  ma_period=13;                 // 平均期間
input ENUM_MA_METHOD       ma_method=MODE_SMA;           // 平滑化の種類
input ENUM_APPLIED_VOLUME  applied_volume=VOLUME_TICK;   // ボリュームの種類
input string               symbol=” “;                   // シンボル
input ENUM_TIMEFRAMES     period=PERIOD_CURRENT;       // 時間軸
//— 指標バッファ
double         iForceBuffer[];
//— iForce 指標ハンドルを格納する変数
int    handle;
//— 格納に使用される変数
string name=symbol;
//— チャートでの指標名
string short_name;
//— フォース指標に値の数を保存
int    bars_calculated=0;
//+——————————————————————+
//| カスタム指標を初期化する関数                                            |
//+——————————————————————+
int OnInit()
{
//— 配列の指標バッファへの割り当て
SetIndexBuffer(0,iForceBuffer,INDICATOR_DATA);
//— 指標が描画するシンボルを決める
name=symbol;
//— 左右のスペースを削する
StringTrimRight(name);
StringTrimLeft(name);
//—「name」文字列の長さがゼロになった場合
if(StringLen(name)==0)
{
//— 指標が接続されているチャートのシンボルを取る
name=_Symbol;
}
//— 指標ハンドルを作成する
if(type==Call_iForce)
handle=iForce(name,period,ma_period,ma_method,applied_volume);
else
{
//— 構造体を指標のパラメータで記入
MqlParam pars[3];
//— 移動平均の期間
pars[0].type=TYPE_INT;
pars[0].integer_value=ma_period;
//— 平滑化の種類
pars[1].type=TYPE_INT;
pars[1].integer_value=ma_method;
//— ボリュームの種類
pars[2].type=TYPE_INT;
pars[2].integer_value=applied_volume;
//— 価格の種類
handle=IndicatorCreate(name,period,IND_FORCE,3,pars);
}
//— ハンドルが作成されなかった場合
if(handle==INVALID_HANDLE)
{
//— 失敗した事実とエラーコードを出力する
PrintFormat(“Failed to create handle of the iForce indicator for the symbol %s/%s, error code %d”,
name,
EnumToString(period),
GetLastError());
//— 指標が早期に中止された
return(INIT_FAILED);
}
//— フォース指標が計算された銘柄/時間軸を表示
short_name=StringFormat(“iForce(%s/%s, %d, %s, %s)”,name,EnumToString(period),
ma_period,EnumToString(ma_method),EnumToString(applied_volume));
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[])
{
//— iForce 指標から複製された値の数
int values_to_copy;
//— 指標で計算された値の数を決める
int calculated=BarsCalculated(handle);
if(calculated<=0)
{
PrintFormat(“BarsCalculated() returned %d, error code %d”,calculated,GetLastError());
return(0);
}
//— これが指標計算の初めであるか iForce 指標の値の数が変更した
//—または、2 つ以上のバーの指標の計算が必要である場合(価格履歴で何かが変更された)
if(prev_calculated==0 || calculated!=bars_calculated || rates_total>prev_calculated+1)
{
//— もし iForceBuffer 配列が銘柄/期間で iForce 指標の値の数より大きい場合、全体のコピーはしない
//— 他の場合、指標バッファサイズより少ない量をコピーをする
if(calculated>rates_total) values_to_copy=rates_total;
else                       values_to_copy=calculated;
}
else
{
//— これは初回の計算ではなく、
//— 前回の OnCalculate() から、一以上のバーが加えられてない。
values_to_copy=(rates_total-prev_calculated)+1;
}
//— iForceBuffer 配列をフォース指標の値で記入
//— FillArrayFromBuffer が false を返した場合、情報の準備が終わっていないので操作を終了する
if(!FillArrayFromBuffer(iForceBuffer,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);
}
//+——————————————————————+
//| iForce 指標から指標バッファを記入する                                     |
//+——————————————————————+
bool FillArrayFromBuffer(double &values[], // フォース指標バッファ values
int ind_handle,   // iForce 指標ハンドル
int amount         // 複製された値の数

{
//— エラーコードをリセットする
ResetLastError();
//— インデックス0 を持つ指標バッファの値で iForceBuffer 配列の一部を記入する
if(CopyBuffer(ind_handle,0,0,amount,values)<0)
{
//— 複製が失敗したら、エラーコードを出す
PrintFormat(“Failed to copy data from the iForce indicator, error code %d”,GetLastError());
//— ゼロ結果で終了。 指標は計算されていないと見なされる
return(false);
}
//— 全てが成功
return(true);
}
//+——————————————————————+
//| 指標初期化解除関数                                                  |
//+——————————————————————+
void OnDeinit(const int reason)
{
//— 指標の削除後チャートをクリアする
Comment(“”);
}

iFractals

この関数は Fractals (フラクタル)指標ハンドルを返します。

int  iFractals(
string          symbol,    // 銘柄名
ENUM_TIMEFRAMES  period      // 期間
);

パラメータ

symbol

[in] データが指標計算に使用される有価証券の銘柄名(NULL は現在のシンボル)

period

[in] 期間の値は ENUM_TIMEFRAMES 列挙の値の 1 つで、0 は現在の時間軸の意味です。

戻り値

指定されたテクニカル指標ハンドル。失敗の場合 INVALID_HANDLE。IndicatorRelease() 関数に指標ハンドルを渡すことによって 、コンピュータメモリを利用されていない指標から解放することが出来ます。

注意事項

バッファ番号は 0 – UPPER_LINE, 1 – LOWER_LINE です。

例:

//+——————————————————————+
//|                                               Demo_iFractals.mq5 |
//|                        Copyright 2011, MetaQuotes Software Corp. |
//|                                             https://www.MQL5.com |
//+——————————————————————+
#property copyright “Copyright 2011, MetaQuotes Software Corp.”
#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 iFractals 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 indicator_chart_window
#property indicator_buffers 1
#property indicator_plots   1
#property indicator_chart_window
#property indicator_buffers 2
#property indicator_plots   2
//— FractalUp プロット
#property indicator_label1 “FractalUp”
#property indicator_type1   DRAW_ARROW
#property indicator_color1  clrBlue
//— FractalDown プロット
#property indicator_label2 “FractalDown”
#property indicator_type2   DRAW_ARROW
#property indicator_color2  clrRed
//+——————————————————————+
//| 作成を処理する方法の列挙                                              |
//+——————————————————————+
enum Creation
{
Call_iFractals,         // iFractals を使用する
Call_IndicatorCreate   // IndicatorCreateを使用する
};
//— 入力パラメータ
input Creation             type=Call_iFractals;         // 関数の種類
input string               symbol=” “;                   // シンボル
input ENUM_TIMEFRAMES     period=PERIOD_CURRENT;       // 時間軸
//— 指標バッファ
double         FractalUpBuffer[];
double         FractalDownBuffer[];
//— iFractals 指標ハンドルを格納する変数
int    handle;
//— 格納に使用される変数
string name=symbol;
//— チャートでの指標名
string short_name;
//— フラクタル指標に値の数を保存
int    bars_calculated=0;
//+——————————————————————+
//| カスタム指標を初期化する関数                                            |
//+——————————————————————+
int OnInit()
{
//— 配列の指標バッファへの割り当て
SetIndexBuffer(0,FractalUpBuffer,INDICATOR_DATA);
SetIndexBuffer(1,FractalDownBuffer,INDICATOR_DATA);
//— PLOT_ARROWプロパティのコードを Wingdings 文字セットからの記号を使用して設定
PlotIndexSetInteger(0,PLOT_ARROW,217); // 上矢印
PlotIndexSetInteger(1,PLOT_ARROW,218); // 下矢印
//— 指標が描画するシンボルを決める
name=symbol;
//— 左右のスペースを削する
StringTrimRight(name);
StringTrimLeft(name);
//—「name」文字列の長さがゼロになった場合
if(StringLen(name)==0)
{
//— 指標が接続されているチャートのシンボルを取る
name=_Symbol;
}
//— 指標ハンドルを作成する
if(type==Call_iFractals)
handle=iFractals(name,period);
else
handle=IndicatorCreate(name,period,IND_FRACTALS);
//— ハンドルが作成されなかった場合
if(handle==INVALID_HANDLE)
{
//— 失敗した事実とエラーコードを出力する
PrintFormat(“Failed to create handle of the iFractals indicator for the symbol %s/%s, error code %d”,
name,
EnumToString(period),
GetLastError());
//— 指標が早期に中止された
return(INIT_FAILED);
}
//— フラクタル指標が計算された銘柄/時間軸を表示
short_name=StringFormat(“iFractals(%s/%s)”,name,EnumToString(period));
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[])
{
//— iFractals 指標から複製された値の数
int values_to_copy;
//— 指標で計算された値の数を決める
int calculated=BarsCalculated(handle);
if(calculated<=0)
{
PrintFormat(“BarsCalculated() returned %d, error code %d”,calculated,GetLastError());
return(0);
}
//— これが指標計算の初めであるか iFractals 指標の値の数が変更した
//—または、2 つ以上のバーの指標の計算が必要である場合(価格履歴で何かが変更された)
if(prev_calculated==0 || calculated!=bars_calculated || rates_total>prev_calculated+1)
{
//— もし FractalUpBuffer 配列が銘柄/期間で iFractals指標の値の数より大きい場合、全体のコピーはしない
//— 他の場合、指標バッファサイズより少ない量をコピーをする
if(calculated>rates_total) values_to_copy=rates_total;
else                       values_to_copy=calculated;
}
else
{
//— これは初回の計算ではなく、
//— 前回の OnCalculate() から、一以上のバーが加えられてない。
values_to_copy=(rates_total-prev_calculated)+1;
}
//— フラクタル指標の値で FractalUpBuffer 及び FractalDownBuffer 配列を記入する
//— FillArrayFromBuffer が false を返した場合、情報の準備が終わっていないので操作を終了する
if(!FillArraysFromBuffers(FractalUpBuffer,FractalDownBuffer,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);
}
//+——————————————————————+
//| iFractals 指標から指標バッファを記入する                                  |
//+——————————————————————+
bool FillArraysFromBuffers(double &up_arrows[],       // 上矢印の指標バッファ
double &down_arrows[],     // 上矢印の指標バッファ
int ind_handle,             // iFractals 指標ハンドル
int amount                 // 複製された値の数

{
//— エラーコードをリセットする
ResetLastError();
//— インデックス0 を持つ指標バッファの値で FractalUpBuffer 配列の一部を記入する
if(CopyBuffer(ind_handle,0,0,amount,up_arrows)<0)
{
//— 複製が失敗したら、エラーコードを出す
PrintFormat(“Failed to copy data from the iFractals indicator to the FractalUpBuffer array, error code %d”,
GetLastError());
//— ゼロ結果で終了。 指標は計算されていないと見なされる
return(false);
}
//— インデックス 1 を持つ指標バッファの値で FractalDownBuffer 配列の一部を記入する1
if(CopyBuffer(ind_handle,1,0,amount,down_arrows)<0)
{
//— 複製が失敗したら、エラーコードを出す
PrintFormat(“Failed to copy data from the iFractals indicator to the FractalDownBuffer array, error code %d”,
GetLastError());
//— ゼロ結果で終了。 指標は計算されていないと見なされる
return(false);
}
//— 全てが成功
return(true);
}
//+——————————————————————+
//| 指標初期化解除関数                                                  |
//+——————————————————————+
void OnDeinit(const int reason)
{
//— 指標の削除後チャートをクリアする
Comment(“”);
}

iFrAMA

この関数は Fractal Adaptive Moving Average(フラクタル適応型移動平均)指標のハンドルを返します。バッファは 1 つです。

int  iFrAMA(
string              symbol,            // 銘柄名
ENUM_TIMEFRAMES    period,            // 期間
int                ma_period,        // 平均期間
int                ma_shift,          // チャートの水平シフト
ENUM_APPLIED_PRICE  applied_price      // 価格の種類かハンドル
);

パラメータ

symbol

[in] データが指標計算に使用される有価証券の銘柄名(NULL は現在のシンボル)

period

[in] 期間の値は ENUM_TIMEFRAMES 列挙の値の 1 つで、0 は現在の時間軸の意味です。

ma_period

[in] 指標計算の平均期間(バーの数)

ma_shift

[in]  価格チャートでの指標のシフト

applied_price

[in]  使用される価格。ENUM_APPLIED_PRICE 価格定数のいずれか、または別の指標ハンドル。

戻り値

指定されたテクニカル指標ハンドル。失敗の場合 INVALID_HANDLE。IndicatorRelease() 関数に指標ハンドルを渡すことによって 、コンピュータメモリを利用されていない指標から解放することが出来ます。

例:

//+——————————————————————+
//|                                                  Demo_iFrAMA.mq5 |
//|                        Copyright 2011, MetaQuotes Software Corp. |
//|                                             https://www.MQL5.com |
//+——————————————————————+
#property copyright “Copyright 2011, MetaQuotes Software Corp.”
#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 iFrAMA 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 indicator_chart_window
#property indicator_buffers 1
#property indicator_plots   1
//— iFrAMA の描画
#property indicator_label1 “iFrAMA”
#property indicator_type1   DRAW_LINE
#property indicator_color1  clrBlue
#property indicator_style1 STYLE_SOLID
#property indicator_width1  1
//+——————————————————————+
//| 作成を処理する方法の列挙                                              |
//+——————————————————————+
enum Creation
{
Call_iFrAMA,           // iFrAMA を使用する
Call_IndicatorCreate   // IndicatorCreateを使用する
};
//— 入力パラメータ
input Creation             type=Call_iFrAMA;             // 関数の種類
input int                  ma_period=14;                 // 平均期間
input int                  ma_shift=0;                   // シフト
input ENUM_APPLIED_PRICE   applied_price=PRICE_CLOSE;   // 価格の種類
input string               symbol=” “;                   // シンボル
input ENUM_TIMEFRAMES     period=PERIOD_CURRENT;       // 時間軸
//— 指標バッファ
double         iFrAMABuffer[];
//— iFrAMA 指標ハンドルを格納する変数
int    handle;
//— 格納に使用される変数
string name=symbol;
//— チャートでの指標名
string short_name;
//— フラクタル適応型移動平均指標に値の数を保存
int    bars_calculated=0;
//+——————————————————————+
//| カスタム指標を初期化する関数                                            |
//+——————————————————————+
int OnInit()
{
//— 配列の指標バッファへの割り当て
SetIndexBuffer(0,iFrAMABuffer,INDICATOR_DATA);
//— シフトを設定
PlotIndexSetInteger(0,PLOT_SHIFT,ma_shift);
//— 指標が描画するシンボルを決める
name=symbol;
//— 左右のスペースを削する
StringTrimRight(name);
StringTrimLeft(name);
//—「name」文字列の長さがゼロになった場合
if(StringLen(name)==0)
{
//— 指標が接続されているチャートのシンボルを取る
name=_Symbol;
}
//— 指標ハンドルを作成する
if(type==Call_iFrAMA)
handle=iFrAMA(name,period,ma_period,ma_shift,applied_price);
else
{
//— 構造体を指標のパラメータで記入
MqlParam pars[3];
//— 移動平均の期間
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=applied_price;
//— 価格の種類
handle=IndicatorCreate(name,period,IND_FRAMA,3,pars);
}
//— ハンドルが作成されなかった場合
if(handle==INVALID_HANDLE)
{
//— 失敗した事実とエラーコードを出力する
PrintFormat(“Failed to create handle of the iFrAMA indicator for the symbol %s/%s, error code %d”,
name,
EnumToString(period),
GetLastError());
//— 指標が早期に中止された
return(INIT_FAILED);
}
//— iFrAMA 指標が計算された銘柄/時間軸を表示
short_name=StringFormat(“iFrAMA(%s/%s, %d, %d, %s)”,name,EnumToString(period),
ma_period,ma_shift,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[])
{
//— iFrAMA 指標から複製された値の数
int values_to_copy;
//— 指標で計算された値の数を決める
int calculated=BarsCalculated(handle);
if(calculated<=0)
{
PrintFormat(“BarsCalculated() returned %d, error code %d”,calculated,GetLastError());
return(0);
}
//— これが指標計算の初めであるか iFrAMA 指標の値の数が変更した
//—または、2 つ以上のバーの指標の計算が必要である場合(価格履歴で何かが変更された)
if(prev_calculated==0 || calculated!=bars_calculated || rates_total>prev_calculated+1)
{
//— もし iFrAMABuffer 配列が銘柄/期間で iFrAMA 指標の値の数より大きい場合、全体のコピーはしない
//— 他の場合、指標バッファサイズより少ない量をコピーをする
if(calculated>rates_total) values_to_copy=rates_total;
else                       values_to_copy=calculated;
}
else
{
//— これは初回の計算ではなく、
//— 前回の OnCalculate() から、一以上のバーが加えられてない。
values_to_copy=(rates_total-prev_calculated)+1;
}
//— iFrAMABuffer 配列を フラクタル適応型移動平均指標の値で記入
//— FillArrayFromBuffer が false を返した場合、情報の準備が終わっていないので操作を終了する
if(!FillArrayFromBuffer(iFrAMABuffer,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);
}
//+——————————————————————+
//| iFrAMA 指標から指標バッファを記入する                                     |
//+——————————————————————+
bool FillArrayFromBuffer(double &values[], // フラクタル適応型移動平均 値の指標バッファ
int shift,         // シフト
int ind_handle,   // iFrAMA 指標ハンドル
int amount         // 複製された値の数

{
//— エラーコードをリセットする
ResetLastError();
//— インデックス0 を持つ指標バッファの値で iFrAMABuffer 配列の一部を記入する
if(CopyBuffer(ind_handle,0,-shift,amount,values)<0)
{
//— 複製が失敗したら、エラーコードを出す
PrintFormat(“Failed to copy data from the iFrAMA indicator, error code %d”,GetLastError());
//— ゼロ結果で終了。 指標は計算されていないと見なされる
return(false);
}
//— 全てが成功
return(true);
}
//+——————————————————————+
//| 指標初期化解除関数                                                  |
//+——————————————————————+
void OnDeinit(const int reason)
{
//— 指標の削除後チャートをクリアする
Comment(“”);
}

iGator

この関数は Gator (ゲーター)指標のハンドルを返します。 オシレーターは、アリゲーターの青線と赤線の差(上ヒストグラム)と、赤線と緑線の差(下ヒストグラム)を示します。

int  iGator(
string              symbol,            // 銘柄名
ENUM_TIMEFRAMES    period,            // 期間
int                jaw_period,        // 顎の計算期間
int                jaw_shift,        // 顎の水平シフト
int                teeth_period,      // 歯の計算期間
int                teeth_shift,      // 歯の水平シフト
int                lips_period,      // 口の計算期間
int                lips_shift,        // 口の水平シフト
ENUM_MA_METHOD      ma_method,        // 平滑化の種類
ENUM_APPLIED_PRICE  applied_price      // 価格の種類かハンドル
);

パラメータ

symbol

[in] データが指標計算に使用される有価証券の銘柄名(NULL は現在のシンボル)

period

[in] 期間の値は ENUM_TIMEFRAMES 列挙の値の 1 つで、0 は現在の時間軸の意味です。

jaw_period

[in]  青線の平均期間(アリゲーターの顎)

jaw_shift

[in] 価格チャートに相対した青線のシフト(指標ヒストグラムの視覚的なズレとは直接関係しません)。

teeth_period

[in]  赤線の平均期間(アリゲーターの歯)

teeth_shift

[in] 価格チャートに相対した赤線のシフト(指標ヒストグラムの視覚的なズレとは直接関係しません)。

lips_period

[in]  緑線の平均期間(アリゲーターの口)

lips_shift

[in] 価格チャートに相対した緑線のシフト(指標ヒストグラムの視覚的なズレとは直接関係しません)。

ma_method

[in]  平滑化の種類ENUM_MA_METHOD のいずれかの値

applied_price

[in]  使用される価格。ENUM_APPLIED_PRICE 価格定数のいずれか、または別の指標ハンドル。

戻り値

指定されたテクニカル指標ハンドル。失敗の場合 INVALID_HANDLE。IndicatorRelease() 関数に指標ハンドルを渡すことによって 、コンピュータメモリを利用されていない指標から解放することが出来ます。

注意事項

バッファ番号は 0 – UPPER_HISTOGRAM, 1 – 上ヒストグラムの色バッファ 2 – LOWER_HISTOGRAM, 3 – 下ヒストグラムの色バッファ です。

例:

//+——————————————————————+
//|                                                  Demo_iGator.mq5 |
//|                        Copyright 2011, MetaQuotes Software Corp. |
//|                                             https://www.MQL5.com |
//+——————————————————————+
#property copyright “Copyright 2011, MetaQuotes Software Corp.”
#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 iGator 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 are as in a standard Gator Oscillator.”

#property indicator_separate_window
#property indicator_buffers 4
#property indicator_plots   2
//— GatorUp の描画
#property indicator_label1 “GatorUp”
#property indicator_type1   DRAW_COLOR_HISTOGRAM
#property indicator_color1  clrGreen, clrRed
#property indicator_style1 STYLE_SOLID
#property indicator_width1  1
//— GatorDown の描画
#property indicator_label2 “GatorDown”
#property indicator_type2   DRAW_COLOR_HISTOGRAM
#property indicator_color2  clrGreen, clrRed
#property indicator_style2 STYLE_SOLID
#property indicator_width2  1
//+——————————————————————+
//| 作成を処理する方法の列挙                                              |
//+——————————————————————+
enum Creation
{
Call_iGator,           // iGator を使用する
Call_IndicatorCreate   // IndicatorCreateを使用する
};
//— 入力パラメータ
input Creation             type=Call_iGator;       // 関数の種類
input string               symbol=” “;             // シンボル
input ENUM_TIMEFRAMES     period=PERIOD_CURRENT; // 時間軸
input int                  jaw_period=13;         // 顎線の期間
input int                  jaw_shift=8;           // 顎線のシフト
input int                  teeth_period=8;         // 歯線の期間
input int                  teeth_shift=5;         // 歯線のシフト
input int                  lips_period=5;         // 口線の期間
input int                  lips_shift=3;           // 口線のシフト
input ENUM_MA_METHOD       MA_method=MODE_SMMA;   // アリゲーター線の平均化の方法
input ENUM_APPLIED_PRICE   applied_price=PRICE_MEDIAN;// アリゲーター計算に使用される価格の種類
//— 指標バッファ
double         GatorUpBuffer[];
double         GatorUpColors[];
double         GatorDownBuffer[];
double         GatorDownColors[];
//— iGator 指標ハンドルを格納する変数
int    handle;
//— 格納に使用される変数
string name=symbol;
//— チャートでの指標名
string short_name;
//— 上下ヒストグラムのシフト値
int shift;
//— ゲーターオシレーター指標に値の数を保存
int    bars_calculated=0;
//+——————————————————————+
//| カスタム指標を初期化する関数                                            |
//+——————————————————————+
int OnInit()
{
//— 配列の指標バッファへの割り当て
SetIndexBuffer(0,GatorUpBuffer,INDICATOR_DATA);
SetIndexBuffer(1,GatorUpColors,INDICATOR_COLOR_INDEX);
SetIndexBuffer(2,GatorDownBuffer,INDICATOR_DATA);
SetIndexBuffer(3,GatorDownColors,INDICATOR_COLOR_INDEX);
/*
  パラメータで指定された全てのシフトは、ゲーターオシレーターが描画されているアリゲーター指標を参照します。
  これが、ゲーター指標自体は動数にアリゲーター線を動かし、
  ゲーターオシレーター値の計算に使用される理由です。
*/
//— 顎線と歯線との差に等しい上下のヒストグラムのシフトを計算してみる
shift=MathMin(jaw_shift,teeth_shift);
PlotIndexSetInteger(0,PLOT_SHIFT,shift);
//— 指標の 2 つのヒストグラムに同じシフトを使用されるのが iGator 指標の実装の仕方
PlotIndexSetInteger(1,PLOT_SHIFT,shift);

//— 指標が描画するシンボルを決める
name=symbol;
//— 左右のスペースを削する
StringTrimRight(name);
StringTrimLeft(name);
//—「name」文字列の長さがゼロになった場合
if(StringLen(name)==0)
{
//— 指標が接続されているチャートのシンボルを取る
name=_Symbol;
}
//— 指標ハンドルを作成する
if(type==Call_iGator)
handle=iGator(name,period,jaw_period,jaw_shift,teeth_period,teeth_shift,
lips_period,lips_shift,MA_method,applied_price);
else
{
//— 構造体を指標のパラメータで記入
MqlParam pars[8];
//— アリゲーター線の期間とシフト
pars[0].type=TYPE_INT;
pars[0].integer_value=jaw_period;
pars[1].type=TYPE_INT;
pars[1].integer_value=jaw_shift;
pars[2].type=TYPE_INT;
pars[2].integer_value=teeth_period;
pars[3].type=TYPE_INT;
pars[3].integer_value=teeth_shift;
pars[4].type=TYPE_INT;
pars[4].integer_value=lips_period;
pars[5].type=TYPE_INT;
pars[5].integer_value=lips_shift;
//— 平滑化の種類
pars[6].type=TYPE_INT;
pars[6].integer_value=MA_method;
//— 価格の種類
pars[7].type=TYPE_INT;
pars[7].integer_value=applied_price;
//— ハンドルを作成
handle=IndicatorCreate(name,period,IND_GATOR,8,pars);
}
//— ハンドルが作成されなかった場合
if(handle==INVALID_HANDLE)
{
//— 失敗した事実とエラーコードを出力する
PrintFormat(“Failed to create handle of the iGator indicator for the symbol %s/%s, error code %d”,
name,
EnumToString(period),
GetLastError());
//— 指標が早期に中止された
return(INIT_FAILED);
}
//— ゲーターオシレーターが計算された銘柄/時間軸を表示
short_name=StringFormat(“iGator(%s/%s, %d, %d ,%d, %d, %d, %d)”,name,EnumToString(period),
jaw_period,jaw_shift,teeth_period,teeth_shift,lips_period,lips_shift);
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[])
{
//— iGator 指標から複製された値の数
int values_to_copy;
//— 指標で計算された値の数を決める
int calculated=BarsCalculated(handle);
if(calculated<=0)
{
PrintFormat(“BarsCalculated() returned %d, error code %d”,calculated,GetLastError());
return(0);
}
//— これが指標計算の初めであるか iGator 指標の値の数が変更した
//—または、2 つ以上のバーの指標の計算が必要である場合(価格履歴で何かが変更された)
if(prev_calculated==0 || calculated!=bars_calculated || rates_total>prev_calculated+1)
{
//— もし GatorUpBuffer 配列が銘柄/期間で iGator 指標の値の数より大きい場合、全体のコピーはしない
//— 他の場合、指標バッファサイズより少ない量をコピーをする
if(calculated>rates_total) values_to_copy=rates_total;
else                       values_to_copy=calculated;
}
else
{
//— これは初回の計算ではなく、
//— 前回の OnCalculate() から、一以上のバーが加えられてない。
values_to_copy=(rates_total-prev_calculated)+1;
}
//— 配列をゲーターオシレーター指標の値で記入
//— FillArraysFromBuffer が false を返した場合、情報の準備が終わっていないので操作を終了する
if(!FillArraysFromBuffers(GatorUpBuffer,GatorUpColors,GatorDownBuffer,GatorDownColors,
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);
}
//+——————————————————————+
//| iGator 指標から指標バッファを記入する                                     |
//+——————————————————————+
bool FillArraysFromBuffers(double &ups_buffer[],         // 上ヒストグラムの指標バッファ
double &up_color_buffer[],   // 上ヒストグラムの価格インデックスの指標バッファ
double &downs_buffer[],       // 下ヒストグラムの指標バッファ
double &downs_color_buffer[], // 下ヒストグラムの価格インデックスの指標バッファ
int u_shift,                 // 上下ヒストグラムのシフト
int ind_handle,               // iGator 指標ハンドル
int amount                   // 複製された値の数

{
//— エラーコードをリセットする
ResetLastError();
//— インデックス0 を持つ指標バッファの値で GatorUpBuffer 配列の一部を記入する
if(CopyBuffer(ind_handle,0,-u_shift,amount,ups_buffer)<0)
{
//— 複製が失敗したら、エラーコードを出す
PrintFormat(“Failed to copy data from the iGator indicator, error code %d”,GetLastError());
//— ゼロ結果で終了。 指標は計算されていないと見なされる
return(false);
}

//— インデックス 1 を持つ指標バッファの値で GatorUpColors 配列の一部を記入する
if(CopyBuffer(ind_handle,1,-u_shift,amount,up_color_buffer)<0)
{
//— 複製が失敗したら、エラーコードを出す
PrintFormat(“Failed to copy data from the iGator indicator, error code %d”,GetLastError());
//— ゼロ結果で終了。 指標は計算されていないと見なされる
return(false);
}

//— インデックス 2 を持つ指標バッファの値で GatorDownBuffer 配列の一部を記入する GatorDownColors
if(CopyBuffer(ind_handle,2,-u_shift,amount,downs_buffer)<0)
{
//— 複製が失敗したら、エラーコードを出す
PrintFormat(“Failed to copy data from the iGator indicator, error code %d”,GetLastError());
//— ゼロ結果で終了。 指標は計算されていないと見なされる
return(false);
}

//— インデックス3 を持つ指標バッファの値でGatorDownColors 配列の一部を記入する
if(CopyBuffer(ind_handle,3,-u_shift,amount,downs_color_buffer)<0)
{
//— 複製が失敗したら、エラーコードを出す
PrintFormat(“Failed to copy data from the iGator indicator, error code %d”,GetLastError());
//— ゼロ結果で終了。 指標は計算されていないと見なされる
return(false);
}
//— 全てが成功
return(true);
}
//+——————————————————————+
//| 指標初期化解除関数                                                  |
//+——————————————————————+
void OnDeinit(const int reason)
{
//— 指標の削除後チャートをクリアする
Comment(“”);
}

iIchimoku

この関数は一目均衡表指標ハンドルを返します。

int  iIchimoku(
string          symbol,            // 銘柄名
ENUM_TIMEFRAMES  period,            // 期間
int              tenkan_sen,        // 転換線の期間
int              kijun_sen,        // 基準線の期間
int              senkou_span_b      // 先行スパンBの期間
);

パラメータ

symbol

[in] データが指標計算に使用される有価証券の銘柄名(NULL は現在のシンボル)

period

[in] 期間の値は ENUM_TIMEFRAMES 列挙の値の 1 つで、0 は現在の時間軸の意味です。

tenkan_sen

[in] 転換線の平均期間

kijun_sen

[in] 基準線の平均期間

senkou_span_b

[in] 先行スパンBの平均期間

戻り値

指定されたテクニカル指標ハンドル。失敗の場合 INVALID_HANDLE。IndicatorRelease() 関数に指標ハンドルを渡すことによって 、コンピュータメモリを利用されていない指標から解放することが出来ます。

注意事項

バッファ番号は 0 – TENKANSEN_LINE、1 – KIJUNSEN_LINE、2 – SENKOUSPANA_LINE、3 – SENKOUSPANB_LINE、4 – CHIKOUSPAN_LINE です。

例:

//+——————————————————————+
//|                                               Demo_iIchimoku.mq5 |
//|                        Copyright 2011, MetaQuotes Software Corp. |
//|                                             https://www.MQL5.com |
//+——————————————————————+
#property copyright “Copyright 2011, MetaQuotes Software Corp.”
#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 iIchimoku 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 just like in the standard Ichimoku Kinko Hyo.”

#property indicator_chart_window
#property indicator_buffers 5
#property indicator_plots   4
//— Tenkan_sen プロット
#property indicator_label1 “Tenkan_sen”
#property indicator_type1   DRAW_LINE
#property indicator_color1  clrRed
#property indicator_style1 STYLE_SOLID
#property indicator_width1  1
//— Kijun_sen プロット
#property indicator_label2 “Kijun_sen”
#property indicator_type2   DRAW_LINE
#property indicator_color2  clrBlue
#property indicator_style2 STYLE_SOLID
#property indicator_width2  1
//— Senkou_Span プロット
#property indicator_label3 “Senkou Span A;Senkou Span B” // 2 つのフィールドはデータウィンドウに表示される
#property indicator_type3   DRAW_FILLING
#property indicator_color3  clrSandyBrown, clrThistle
#property indicator_style3 STYLE_SOLID
#property indicator_width3  1
//— Chikou_Span プロット
#property indicator_label4 “Chinkou_Span”
#property indicator_type4   DRAW_LINE
#property indicator_color4  clrLime
#property indicator_style4 STYLE_SOLID
#property indicator_width4  1
//+——————————————————————+
//| 作成を処理する方法の列挙                                              |
//+——————————————————————+
enum Creation
{
Call_iIchimoku,         // iIchimoku を使用する
Call_IndicatorCreate   // IndicatorCreateを使用する
};
//— 入力パラメータ
input Creation             type=Call_iIchimoku;       // 関数の種類
input int                  tenkan_sen=9;             // 転換線の期間
input int                  kijun_sen=26;             // 基準線の期間
input int                  senkou_span_b=52;         // 先行スパンBの期間
input string               symbol=” “;               // シンボル
input ENUM_TIMEFRAMES     period=PERIOD_CURRENT;     // 時間軸
//— 指標バッファ
double         Tenkan_sen_Buffer[];
double         Kijun_sen_Buffer[];
double         Senkou_Span_A_Buffer[];
double         Senkou_Span_B_Buffer[];
double         Chinkou_Span_Buffer[];
//— 一目指標ハンドルを格納する変数
int    handle;
//— 格納に使用される変数
string name=symbol;
//— チャートでの指標名
string short_name;
//— 一目均衡表指標に値の数を保存
int    bars_calculated=0;
//+——————————————————————+
//| カスタム指標を初期化する関数                                            |
//+——————————————————————+
int OnInit()
{
//— 配列の指標バッファへの割り当て
SetIndexBuffer(0,Tenkan_sen_Buffer,INDICATOR_DATA);
SetIndexBuffer(1,Kijun_sen_Buffer,INDICATOR_DATA);
SetIndexBuffer(2,Senkou_Span_A_Buffer,INDICATOR_DATA);
SetIndexBuffer(3,Senkou_Span_B_Buffer,INDICATOR_DATA);
SetIndexBuffer(4,Chinkou_Span_Buffer,INDICATOR_DATA);
//— 基準線バーの先行スパンチャンネルのシフトを将来に向けて設定する
PlotIndexSetInteger(2,PLOT_SHIFT,kijun_sen);
//— 遅行データスパンはすでに一目のシフトに保存されているので
//— 遅行スパン線のシフトは設定する必要がない
//— 指標が描画するシンボルを決める
name=symbol;
//— 左右のスペースを削する
StringTrimRight(name);
StringTrimLeft(name);
//—「name」文字列の長さがゼロになった場合
if(StringLen(name)==0)
{
//— 指標が接続されているチャートのシンボルを取る
name=_Symbol;
}
//— 指標ハンドルを作成する
if(type==Call_iIchimoku)
handle=iIchimoku(name,period,tenkan_sen,kijun_sen,senkou_span_b);
else
{
//— 構造体を指標のパラメータで記入
MqlParam pars[3];
//— アリゲーター線の期間とシフト
pars[0].type=TYPE_INT;
pars[0].integer_value=tenkan_sen;
pars[1].type=TYPE_INT;
pars[1].integer_value=kijun_sen;
pars[2].type=TYPE_INT;
pars[2].integer_value=senkou_span_b;
//— ハンドルを作成
handle=IndicatorCreate(name,period,IND_ICHIMOKU,3,pars);
}
//— ハンドルが作成されなかった場合
if(handle==INVALID_HANDLE)
{
//— 失敗した事実とエラーコードを出力する
PrintFormat(“Failed to create handle of the iIchimoku indicator for the symbol %s/%s, error code %d”,
name,
EnumToString(period),
GetLastError());
//— 指標が早期に中止された
return(INIT_FAILED);
}
//— 一目均衡表指標が計算された銘柄/時間軸を表示
short_name=StringFormat(“iIchimoku(%s/%s, %d, %d ,%d)”,name,EnumToString(period),
tenkan_sen,kijun_sen,senkou_span_b);
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[])
{
//— 一目均衡表指標から複製された値の数
int values_to_copy;
//— 指標で計算された値の数を決める
int calculated=BarsCalculated(handle);
if(calculated<=0)
{
PrintFormat(“BarsCalculated() returned %d, error code %d”,calculated,GetLastError());
return(0);
}
//— これが指標計算の初めであるか一目均衡表指標の値の数が変更した
//—または、2 つ以上のバーの指標の計算が必要である場合(価格履歴で何かが変更された)
if(prev_calculated==0 || calculated!=bars_calculated || rates_total>prev_calculated+1)
{
//— Tenkan_sen_Buffer 配列が銘柄/期間で一目指標の値の数より大きい場合、全体のコピーはしない
//— 他の場合、指標バッファサイズより少ない量をコピーをする
if(calculated>rates_total) values_to_copy=rates_total;
else                       values_to_copy=calculated;
}
else
{
//— これは初回の計算ではなく、
//— 前回の OnCalculate() から、一以上のバーが加えられてない。
values_to_copy=(rates_total-prev_calculated)+1;
}
//— 配列を一目均衡表指標の値で記入
//— FillArraysFromBuffer が false を返した場合、情報の準備が終わっていないので操作を終了する
if(!FillArraysFromBuffers(Tenkan_sen_Buffer,Kijun_sen_Buffer,Senkou_Span_A_Buffer,Senkou_Span_B_Buffer,Chinkou_Span_Buffer,
kijun_sen,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 FillArraysFromBuffers(double &tenkan_sen_buffer[],     // 転換線の指標バッファ
double &kijun_sen_buffer[],     // 基準線の指標バッファ
double &senkou_span_A_buffer[], // 選考スパンA線の指標バッファ
double &senkou_span_B_buffer[], // 選考スパンB線の指標バッファ
double &chinkou_span_buffer[],   // 遅行スパン線の指標バッファ
int senkou_span_shift,           // 選考スパン線を将来に向けてシフト
int ind_handle,                 // 一目指標ハンドル
&nnbsp;                   int amount                       // 複製された値の数

{
//— エラーコードをリセットする
ResetLastError();
//— インデックス0 を持つ指標バッファの値で Tenkan_sen_Buffer 配列の一部を記入する
if(CopyBuffer(ind_handle,0,0,amount,tenkan_sen_buffer)<0)
{
//— 複製が失敗したら、エラーコードを出す
PrintFormat(“1.Failed to copy data from the iIchimoku indicator, error code %d”,GetLastError());
//— ゼロ結果で終了。 指標は計算されていないと見なされる
return(false);
}

//— インデックス 1 を持つ指標バッファの値で Kijun_sen_Buffer 配列の一部を記入する
if(CopyBuffer(ind_handle,1,0,amount,kijun_sen_buffer)<0)
{
//— 複製が失敗したら、エラーコードを出す
PrintFormat(“2.Failed to copy data from the iIchimoku indicator, error code %d”,GetLastError());
//— ゼロ結果で終了。 指標は計算されていないと見なされる
return(false);
}

//— インデックス 2 を持つ指標バッファの値で Chinkou_Span_Buffer 配列の一部を記入する
//— senkou_span_shift>0 の場合、線はsenkou_span_shift バーの数だけ将来に向けてシフトされる
if(CopyBuffer(ind_handle,2,-senkou_span_shift,amount,senkou_span_A_buffer)<0)
{
//— 複製が失敗したら、エラーコードを出す
PrintFormat(“3.Failed to copy data from the iIchimoku indicator, error code %d”,GetLastError());
//— ゼロ結果で終了。 指標は計算されていないと見なされる
return(false);
}

//— インデックス3 を持つ指標バッファの値で Senkou_Span_A_Buffer 配列の一部を記入する
//— senkou_span_shift>0 の場合、線はsenkou_span_shift バーの数だけ将来に向けてシフトされる
if(CopyBuffer(ind_handle,3,-senkou_span_shift,amount,senkou_span_B_buffer)<0)
{
//— 複製が失敗したら、エラーコードを出す
PrintFormat(“4.Failed to copy data from the iIchimoku indicator, error code %d”,GetLastError());
//— ゼロ結果で終了。 指標は計算されていないと見なされる
return(false);
}

//— インデックス0 を持つ指標バッファの値で Senkou_Span_B_Buffer 配列の一部を記入する
//— 遅行スパンデータは既に一目シフトに保存されているので、遅行スパンの複製時に
//— 遅行スパン線のシフトは設定する必要がない  
if(CopyBuffer(ind_handle,4,0,amount,chinkou_span_buffer)<0)
{
//— 複製が失敗したら、エラーコードを出す
PrintFormat(“5.Failed to copy data from the iIchimoku indicator, error code %d”,GetLastError());
//— ゼロ結果で終了。 指標は計算されていないと見なされる
return(false);
}
//— 全てが成功
return(true);
}
//+——————————————————————+
//| 指標初期化解除関数                                                 |
//+——————————————————————+
void OnDeinit(const int reason)
{
//— 指標の削除後チャートをクリアする
Comment(“”);
}

iBWMFI

この関数は Market Facilitation Index 指標ハンドルを返します。バッファは 1 つです。

int  iBWMFI(
string              symbol,            // 銘柄名
ENUM_TIMEFRAMES      period,            // 期間
ENUM_APPLIED_VOLUME  applied_volume      // 計算に使用するボリュームの種類
);

パラメータ

symbol

[in] データが指標計算に使用される有価証券の銘柄名(NULL は現在のシンボル)

period

[in] 期間の値は ENUM_TIMEFRAMES 列挙の値の 1 つで、0 は現在の時間軸の意味です。

applied_volume

[in]  使用されるボリューム(ENUM_APPLIED_VOLUME 定数のいずれか)

戻り値

指定されたテクニカル指標ハンドル。失敗の場合 INVALID_HANDLE。IndicatorRelease() 関数に指標ハンドルを渡すことによって 、コンピュータメモリを利用されていない指標から解放することが出来ます。

例:

//+——————————————————————+
//|                                                  Demo_iBWMFI.mq5 |
//|                        Copyright 2011, MetaQuotes Software Corp. |
//|                                             https://www.MQL5.com |
//+——————————————————————+
#property copyright “Copyright 2011, MetaQuotes Software Corp.”
#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 iBWMFI 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 indicator_separate_window
#property indicator_buffers 2
#property indicator_plots   1
//— iBWMFI プロット
#property indicator_label1 “iBWMFI”
#property indicator_type1   DRAW_COLOR_HISTOGRAM
#property indicator_color1  clrLime,clrSaddleBrown,clrBlue,clrPink
#property indicator_style1 STYLE_SOLID
#property indicator_width1  1
//+——————————————————————+
//| 作成を処理する方法の列挙                                              |
//+——————————————————————+
enum Creation
{
Call_iBWMFI,           // use iBWMFI を使用する
Call_IndicatorCreate   // IndicatorCreateを使用する
};
//— 入力パラメータ
input Creation             type=Call_iBWMFI;         // 関数の種類
input ENUM_APPLIED_VOLUME  applied_volume=VOLUME_TICK;// ボリュームの種類
input string               symbol=” “;               // シンボル
input ENUM_TIMEFRAMES     period=PERIOD_CURRENT;     // 時間軸
//— 指標バッファ
double         iBWMFIBuffer[];
double         iBWMFIColors[];
//— iBWMFI 指標ハンドルを格納する変数
int    handle;
//— 格納に使用される変数
string name=symbol;
//— チャートでの指標名
string short_name;
//— BW MFI (ビルウィリアムズのマーケットファシリテーションインデックス)指標に値の数を保存
int    bars_calculated=0;
//+——————————————————————+
//| カスタム指標を初期化する関数                                            |
//+——————————————————————+
int OnInit()
{
//— 配列の指標バッファへの割り当て
SetIndexBuffer(0,iBWMFIBuffer,INDICATOR_DATA);
SetIndexBuffer(1,iBWMFIColors,INDICATOR_COLOR_INDEX);
//— 指標が描画するシンボルを決める
name=symbol;
//— 左右のスペースを削する
StringTrimRight(name);
StringTrimLeft(name);
//—「name」文字列の長さがゼロになった場合
if(StringLen(name)==0)
{
//— 指標が接続されているチャートのシンボルを取る
name=_Symbol;
}
//— 指標ハンドルを作成する
if(type==Call_iBWMFI)
handle=iBWMFI(name,period,applied_volume);
else
{
//— 構造体を指標のパラメータで記入
MqlParam pars[1];
//— ボリュームの種類
pars[0].type=TYPE_INT;
pars[0].integer_value=applied_volume;
handle=IndicatorCreate(name,period,IND_BWMFI,1,pars);
}
//— ハンドルが作成されなかった場合
if(handle==INVALID_HANDLE)
{
//— 失敗した事実とエラーコードを出力する
PrintFormat(“Failed to create handle of the iBWMFI indicator for the symbol %s/%s, error code %d”,
name,
EnumToString(period),
GetLastError());
//— 指標が早期に中止された
return(INIT_FAILED);
}
//— BW MFI (ビルウィリアムズのマーケットファシリテーションインデックス)指標が計算された銘柄/時間軸を表示
short_name=StringFormat(“iBWMFI(%s/%s, %s)”,name,EnumToString(period),
EnumToString(applied_volume));
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[])
{
//— iBWMFI 指標から複製された値の数
int values_to_copy;
//— 指標で計算された値の数を決める
int calculated=BarsCalculated(handle);
if(calculated<=0)
{
PrintFormat(“BarsCalculated() returned %d, error code %d”,calculated,GetLastError());
return(0);
}
//— これが指標計算の初めであるか iBWMFI 指標の値の数が変更した
//—または、2 つ以上のバーの指標の計算が必要である場合(価格履歴で何かが変更された)
if(prev_calculated==0 || calculated!=bars_calculated || rates_total>prev_calculated+1)
{
//— もしiBWMFIBuffer 配列が銘柄/期間で iBWMFI 指標の値の数より大きい場合、全体のコピーはしない
//— 他の場合、指標バッファサイズより少ない量をコピーをする
if(calculated>rates_total) values_to_copy=rates_total;
else                       values_to_copy=calculated;
}
else
{
//— これは初回の計算ではなく、
//— 前回の OnCalculate() から、一以上のバーが加えられてない。
values_to_copy=(rates_total-prev_calculated)+1;
}
//— 配列を BW MFI (ビルウィリアムズのマーケットファシリテーションインデックス)指標の値で記入
//— FillArraysFromBuffer が false を返した場合、情報の準備が終わっていないので操作を終了する
if(!FillArraysFromBuffers(iBWMFIBuffer,iBWMFIColors,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);
//— BW MFI (ビルウィリアムズのマーケットファシリテーションインデックス)指標の値の数を覚える
bars_calculated=calculated;
//— prev_calculated 値を次の関数呼び出しのために返す
return(rates_total);
}
//+——————————————————————+
//| iBWMFI 指標から指標バッファを記入する                                     |
//+——————————————————————+
bool FillArraysFromBuffers(double &values[],   // ヒストグラム値の指標バッファ
double &colors[],   // ヒストグラムの色の指標バッファ colors
int ind_handle,     // iBWMFI 指標ハンドル
int amount           // 複製された値の数

{
//— エラーコードをリセットする
ResetLastError();
//— インデックス0 を持つ指標バッファの値で iBWMFIBuffer 配列の一部を記入する
if(CopyBuffer(ind_handle,0,0,amount,values)<0)
{
//— 複製が失敗したら、エラーコードを出す
PrintFormat(“Failed to copy data from the iBWMFI indicator, error code %d”,GetLastError());
//— ゼロ結果で終了。 指標は計算されていないと見なされる
return(false);
}
//— インデックス 1 を持つ指標バッファの値で iBWMFIColors 配列の一部を記入する
if(CopyBuffer(ind_handle,1,0,amount,colors)<0)
{
//— 複製が失敗したら、エラーコードを出す
PrintFormat(“Failed to copy data from the iBWMFI indicator, error code %d”,GetLastError());
//— ゼロ結果で終了。 指標は計算されていないと見なされる
return(false);
}
//— 全てが成功
return(true);
}
//+——————————————————————+
//| 指標初期化解除関数                                                  |
//+——————————————————————+
void OnDeinit(const int reason)
{
//— 指標の削除後チャートをクリアする
Comment(“”);
}

iMomentum

この関数は Momentum(モメンタム)指標のハンドルを返します。バッファは 1 つです。

int  iMomentum(
string              symbol,            // 銘柄名
ENUM_TIMEFRAMES      period,            // 期間
int                  mom_period,       // 平均期間
ENUM_APPLIED_PRICE   applied_price      // 価格の種類かハンドル
);

パラメータ

symbol

[in] データが指標計算に使用される有価証券の銘柄名(NULL は現在のシンボル)

period

[in] 期間の値は ENUM_TIMEFRAMES 列挙の値の 1 つで、0 は現在の時間軸の意味です。

mom_period

[in]  価格変化計算の平均期間(バーの数

applied_price

[in]  使用される価格。ENUM_APPLIED_PRICE 価格定数のいずれか、または別の指標ハンドル。

戻り値

指定されたテクニカル指標ハンドル。失敗の場合 INVALID_HANDLE。IndicatorRelease() 関数に指標ハンドルを渡すことによって 、コンピュータメモリを利用されていない指標から解放することが出来ます。

例:

//+——————————————————————+
//|                                               Demo_iMomentum.mq5 |
//|                        Copyright 2011, MetaQuotes Software Corp. |
//|                                             https://www.MQL5.com |
//+——————————————————————+
#property copyright “Copyright 2011, MetaQuotes Software Corp.”
#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 iMomentum 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 the other parameters are similar to the standard Momentum.”

#property indicator_separate_window
#property indicator_buffers 1
#property indicator_plots   1
//— モメンタムをプロット
#property indicator_label1 “iMomentum”
#property indicator_type1   DRAW_LINE
#property indicator_color1  clrDodgerBlue
#property indicator_style1 STYLE_SOLID
#property indicator_width1  1
//+——————————————————————+
//| 作成を処理する方法の列挙                                              |
//+——————————————————————+
enum Creation
{
Call_iMomentum,         // iMomentum を使用する
Call_IndicatorCreate   // IndicatorCreateを使用する
};
//— 入力パラメータ
input Creation             type=Call_iMomentum;       // 関数の種類
input int                  mom_period=14;             // モメンタムの期間
input ENUM_APPLIED_PRICE   applied_price=PRICE_CLOSE; // 価格の種類
input string               symbol=” “;               // シンボル
input ENUM_TIMEFRAMES     period=PERIOD_CURRENT;     // 時間軸
//— 指標バッファ
double         iMomentumBuffer[];
//— iMomentum 指標ハンドルを格納する変数
int    handle;
//— 格納に使用される変数
string name=symbol;
//— チャートでの指標名
string short_name;
//— モメンタム指標に値の数を保存
int    bars_calculated=0;
//+——————————————————————+
//| カスタム指標を初期化する関数                                            |
//+——————————————————————+
int OnInit()
{
//— 配列の指標バッファへの割り当て
SetIndexBuffer(0,iMomentumBuffer,INDICATOR_DATA);
//— 指標が描画するシンボルを決める
name=symbol;
//— 左右のスペースを削する
StringTrimRight(name);
StringTrimLeft(name);
//—「name」文字列の長さがゼロになった場合
if(StringLen(name)==0)
{
//— 指標が接続されているチャートのシンボルを取る
name=_Symbol;
}
//— 指標ハンドルを作成する
if(type==Call_iMomentum)
handle=iMomentum(name,period,mom_period,applied_price);
else
{
//— 構造体を指標のパラメータで記入
MqlParam pars[2];
//— 期間
pars[0].type=TYPE_INT;
pars[0].integer_value=mom_period;
//— 価格の種類
pars[1].type=TYPE_INT;
pars[1].integer_value=applied_price;
handle=IndicatorCreate(name,period,IND_MOMENTUM,2,pars);
}
//— ハンドルが作成されなかった場合
if(handle==INVALID_HANDLE)
{
//— 失敗した事実とエラーコードを出力する
PrintFormat(“Failed to create handle of the iMomentum indicator for the symbol %s/%s, error code %d”,
name,
EnumToString(period),
GetLastError());
//— 指標が早期に中止された
return(INIT_FAILED);
}
//— モメンタム指標が計算された銘柄/時間軸を表示
short_name=StringFormat(“iMomentum(%s/%s, %d, %s)”,name,EnumToString(period),
mom_period, 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[])
{
//— iMomentum 指標から複製された値の数
int values_to_copy;
//— 指標で計算された値の数を決める
int calculated=BarsCalculated(handle);
if(calculated<=0)
{
PrintFormat(“BarsCalculated() returned %d, error code %d”,calculated,GetLastError());
return(0);
}
//— これが指標計算の初めであるか iMomentum 指標の値の数が変更した
//—または、2 つ以上のバーの指標の計算が必要である場合(価格履歴で何かが変更された)
if(prev_calculated==0 || calculated!=bars_calculated || rates_total>prev_calculated+1)
{
//— iMomentumBuffer 配列が銘柄/期間で iMomentum 指標の値の数より大きい場合、全体のコピーはしない
//— 他の場合、指標バッファサイズより少ない量をコピーをする
if(calculated>rates_total) values_to_copy=rates_total;
else                       values_to_copy=calculated;
}
else
{
//— これは初回の計算ではなく、
//— 前回の OnCalculate() から、一以上のバーが加えられてない。
values_to_copy=(rates_total-prev_calculated)+1;
}
//— iMomentumBuffer 配列をモメンタム指標の値で記入
//— FillArrayFromBuffer が false を返した場合、情報の準備が終わっていないので操作を終了する
if(!FillArrayFromBuffer(iMomentumBuffer,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);
}
//+——————————————————————+
//| iMomentum 指標から指標バッファを記入する                                  |
//+——————————————————————+
bool FillArrayFromBuffer(double &values[], // モメンタム値の指標バッファ
int ind_handle,   // iMomentum 指標ハンドル
int amount         // 複製された値の数

{
//— エラーコードをリセットする
ResetLastError();
//— インデックス0 を持つ指標バッファの値で iMomentumBuffer 配列の一部を記入する
if(CopyBuffer(ind_handle,0,0,amount,values)<0)
{
//— 複製が失敗したら、エラーコードを出す
PrintFormat(“Failed to copy data from the iMomentum indicator, error code %d”,GetLastError());
//— ゼロ結果で終了。 指標は計算されていないと見なされる
return(false);
}
//— 全てが成功
return(true);
}
//+——————————————————————+
//| 指標初期化解除関数                                                  |
//+——————————————————————+
void OnDeinit(const int reason)
{
//— 指標の削除後チャートをクリアする
Comment(“”);
}

iMFI

この関数は MFI(Money Flow Index)指標ハンドルを返します。

int  iMFI(
string              symbol,            // 銘柄名
ENUM_TIMEFRAMES      period,            // 期間
int                  ma_period,          // 平均期間
ENUM_APPLIED_VOLUME  applied_volume      // 計算に使用するボリュームの種類
);

パラメータ

symbol

[in] データが指標計算に使用される有価証券の銘柄名(NULL は現在のシンボル)

period

[in] 期間の値は ENUM_TIMEFRAMES 列挙の値の 1 つで、0 は現在の時間軸の意味です。

ma_period

[in] 計算の平均期間(バーの数)

applied_volume

[in]  使用されるボリューム(ENUM_APPLIED_VOLUME 値のいずれか)

戻り値

指定されたテクニカル指標ハンドル。失敗の場合 INVALID_HANDLE。IndicatorRelease() 関数に指標ハンドルを渡すことによって 、コンピュータメモリを利用されていない指標から解放することが出来ます。

例:

//+——————————————————————+
//|                                                    Demo_iMFI.mq5 |
//|                        Copyright 2011, MetaQuotes Software Corp. |
//|                                             https://www.MQL5.com |
//+——————————————————————+
#property copyright “Copyright 2011, MetaQuotes Software Corp.”
#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 iMFI 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 the other parameters are similar to the standard Money Flow Index.”

#property indicator_separate_window
#property indicator_buffers 1
#property indicator_plots   1
//— iMFI プロット
#property indicator_label1 “iMFI”
#property indicator_type1   DRAW_LINE
#property indicator_color1  clrDodgerBlue
#property indicator_style1 STYLE_SOLID
#property indicator_width1  1
//— 指標ウィンドウの水平レベル
#property indicator_level1  20
#property indicator_level2  80
//+——————————————————————+
//| 作成を処理する方法の列挙                                              |
//+——————————————————————+
enum Creation
{
Call_iMFI,             // iMFI を使用する
Call_IndicatorCreate   // IndicatorCreateを使用する
};
//— 入力パラメータ
input Creation             type=Call_iMFI;               // 関数の種類
input int                  ma_period=14;                 // 期間
input ENUM_APPLIED_VOLUME  applied_volume=VOLUME_TICK;   // ボリュームの種類
input string               symbol=” “;                   // シンボル
input ENUM_TIMEFRAMES     period=PERIOD_CURRENT;       // 時間軸
//— 指標バッファ
double         iMFIBuffer[];
//— iMFI 指標ハンドルを格納する変数r
int    handle;
//— 格納に使用される変数
string name=symbol;
//— チャートでの指標名
string short_name;
//— MFI 指標に値の数を保存
int    bars_calculated=0;
//+——————————————————————+
//| カスタム指標を初期化する関数                                            |
//+——————————————————————+
int OnInit()
{
//— 配列の指標バッファへの割り当て
SetIndexBuffer(0,iMFIBuffer,INDICATOR_DATA);
//— 指標が描画するシンボルを決める  
name=symbol;
//— 左右のスペースを削する
StringTrimRight(name);
StringTrimLeft(name);
//—「name」文字列の長さがゼロになった場合
if(StringLen(name)==0)
{
//— 指標が接続されているチャートのシンボルを取る
name=_Symbol;
}
//— 指標ハンドルを作成する
if(type==Call_iMFI)
handle=iMFI(name,period,ma_period,applied_volume);
else
{
//— 構造体を指標のパラメータで記入
MqlParam pars[2];
//— 期間
pars[0].type=TYPE_INT;
pars[0].integer_value=ma_period;
//— ボリュームの種類
pars[1].type=TYPE_INT;
pars[1].integer_value=applied_volume;
handle=IndicatorCreate(name,period,IND_MFI,2,pars);
}
//— ハンドルが作成されなかった場合
if(handle==INVALID_HANDLE)
{
//— 失敗した事実とエラーコードを出力する
PrintFormat(“Failed to create handle of the iMFI indicator for the symbol %s/%s, error code %d”,
name,
EnumToString(period),
GetLastError());
//— 指標が早期に中止された
return(INIT_FAILED);
}
//— MFI 指標が計算された銘柄/時間軸を表示
short_name=StringFormat(“iMFI(%s/%s, %d, %s)”,name,EnumToString(period),
ma_period, EnumToString(applied_volume));
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[])
{
//— iMFI 指標から複製された値の数
int values_to_copy;
//— 指標で計算された値の数を決める
int calculated=BarsCalculated(handle);
if(calculated<=0)
{
PrintFormat(“BarsCalculated() returned %d, error code %d”,calculated,GetLastError());
return(0);
}
//— これが指標計算の初めであるか iMFI 指標の値の数が変更した
//—または、2 つ以上のバーの指標の計算が必要である場合(価格履歴で何かが変更された)
if(prev_calculated==0 || calculated!=bars_calculated || rates_total>prev_calculated+1)
{
//— iMFIBuffer 配列が銘柄/期間で iMFI 指標の値の数より大きい場合、全体のコピーはしない
//— 他の場合、指標バッファサイズより少ない量をコピーをする
if(calculated>rates_total) values_to_copy=rates_total;
else                       values_to_copy=calculated;
}
else
{
//— これは初回の計算ではなく、
//— 前回の OnCalculate() から、一以上のバーが加えられてない。
values_to_copy=(rates_total-prev_calculated)+1;
}
//— iMFIBuffer 配列をMFI 指標の値で記入
//— FillArrayFromBuffer が false を返した場合、情報の準備が終わっていないので操作を終了する
if(!FillArrayFromBuffer(iMFIBuffer,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);
//— MFI 指標に値の数を覚える
bars_calculated=calculated;
//— prev_calculated 値を次の関数呼び出しのために返す
return(rates_total);
}
//+——————————————————————+
//| iMFI 指標から指標バッファを記入する                                       |
//+——————————————————————+
bool FillArrayFromBuffer(double &values[], // MFI 値の指標バッファ
int ind_handle,   // iMFI 指標ハンドル
int amount         // 複製された値の数

{
//— エラーコードをリセットする
ResetLastError();
//— インデックス0 を持つ指標バッファの値で iMFIBuffer 配列の一部を記入する
if(CopyBuffer(ind_handle,0,0,amount,values)<0)
{
//— 複製が失敗したら、エラーコードを出す
PrintFormat(“Failed to copy data from the iMFI indicator, error code %d”,GetLastError());
//— ゼロ結果で終了。 指標は計算されていないと見なされる
return(false);
}
//— 全てが成功
return(true);
}
//+——————————————————————+
//| 指標初期化解除関数                                                  |
//+——————————————————————+
void OnDeinit(const int reason)
{
//— 指標の削除後チャートをクリアする
Comment(“”);
}

iMA

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

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

パラメータ

symbol

[in] データが指標計算に使用される有価証券の銘柄名(NULL は現在のシンボル)

period

[in] 期間の値は ENUM_TIMEFRAMES 列挙の値の 1 つで、0 は現在の時間軸の意味です。

ma_period

[in] 移動平均計算の期間

ma_shift

[in]  価格チャートに相対した指標のシフト

ma_method

[in]  平滑化の種類ENUM_MA_METHOD 値のいずれか

applied_price

[in]  使用される価格。ENUM_APPLIED_PRICE 価格定数のいずれか、または別の指標ハンドル。

戻り値

指定されたテクニカル指標ハンドル。失敗の場合 INVALID_HANDLE。IndicatorRelease() 関数に指標ハンドルを渡すことによって 、コンピュータメモリを利用されていない指標から解放することが出来ます。

例:

//+——————————————————————+
//|                                                     Demo_iMA.mq5 |
//|                        Copyright 2011, MetaQuotes Software Corp. |
//|                                             https://www.MQL5.com |
//+——————————————————————+
#property copyright “Copyright 2011, MetaQuotes Software Corp.”
#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)
{
//— 指標の削除後チャートをクリアする
Comment(“”);
}

iOsMA

この関数は Moving Average of Oscillator(移動平均オシレーター)指標のハンドルを返します。OsMA オシレーターは MACD とシグナル線の差を表示します。バッファは 1 つです。

int  iOsMA(
string              symbol,              // 銘柄名
ENUM_TIMEFRAMES    period,              // 期間
int                fast_ema_period,    // 高速移動平均期間
int                slow_ema_period,    // 低速移動平均期間
int                signal_period,      // 差の平均期間
ENUM_APPLIED_PRICE  applied_price        // 価格の種類かハンドル
);

パラメータ

symbol

[in] データが指標計算に使用される有価証券の銘柄名(NULL は現在のシンボル)

period

[in] 期間の値は ENUM_TIMEFRAMES 列挙の値の 1 つで、0 は現在の時間軸の意味です。

fast_ema_period

[in]  高速移動平均計算の期間

slow_ema_period

[in]  低速移動平均計算の期間

signal_period

[in]  シグナル線計算の平均期間

applied_price

[in]  使用される価格。ENUM_APPLIED_PRICE 価格定数のいずれか、または別の指標ハンドル。

戻り値

指定されたテクニカル指標ハンドル。失敗の場合 INVALID_HANDLE。IndicatorRelease() 関数に指標ハンドルを渡すことによって 、コンピュータメモリを利用されていない指標から解放することが出来ます。

注意事項

システムによってはこのオシレーターは MACD ヒストグラムとして知られています。

例:

//+——————————————————————+
//|                                                   Demo_iOsMA.mq5 |
//|                        Copyright 2011, MetaQuotes Software Corp. |
//|                                             https://www.MQL5.com |
//+——————————————————————+
#property copyright “Copyright 2011, MetaQuotes Software Corp.”
#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 iOsMA 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 the other parameters are similar to the standard Moving Average of Oscillator.”

#property indicator_separate_window
#property indicator_buffers 1
#property indicator_plots   1
//— iOsMA プロット
#property indicator_label1 “iOsMA”
#property indicator_type1   DRAW_HISTOGRAM
#property indicator_color1  clrSilver
#property indicator_style1 STYLE_SOLID
#property indicator_width1  1
//+——————————————————————+
//| 作成を処理する方法の列挙                                              |
//+——————————————————————+
enum Creation
{
Call_iOsMA,             // iOsMA を使用する
Call_IndicatorCreate   // IndicatorCreateを使用する
};
//— 入力パラメータ
input Creation             type=Call_iOsMA;           // 関数の種類
input int                  fast_ema_period=12;       // 高速 MA 期間
input int                  slow_ema_period=26;       // 低速 MA 期間
input int                  signal_period=9;           // 差の平均期間
input ENUM_APPLIED_PRICE   applied_price=PRICE_CLOSE; // 価格の種類
input string               symbol=” “;               // シンボル
input ENUM_TIMEFRAMES     period=PERIOD_CURRENT;     // 時間軸
//— 指標バッファ
double         iOsMABuffer[];
//— iAMA 指標ハンドルを格納する変数
int    handle;
//— 格納に使用される変数
string name=symbol;
//— チャートでの指標名
string short_name;
//— 移動平均線指標に値の数を保存
int    bars_calculated=0;
//+——————————————————————+
//| カスタム指標を初期化する関数                                            |
//+——————————————————————+
int OnInit()
{
//— 配列の指標バッファへの割り当て
SetIndexBuffer(0,iOsMABuffer,INDICATOR_DATA);
//— 指標が描画するシンボルを決める
name=symbol;
//— 左右のスペースを削する
StringTrimRight(name);
StringTrimLeft(name);
//—「name」文字列の長さがゼロになった場合
if(StringLen(name)==0)
{
//— 指標が接続されているチャートのシンボルを取る
name=_Symbol;
}
//— 指標ハンドルを作成する
if(type==Call_iOsMA)
handle=iOsMA(name,period,fast_ema_period,slow_ema_period,signal_period,applied_price);
else
{
//— 構造体を指標のパラメータで記入    
MqlParam pars[4];
//— 高速 MA 期間
pars[0].type=TYPE_INT;
pars[0].integer_value=fast_ema_period;
//— 低速 MA 期間
pars[1].type=TYPE_INT;
pars[1].integer_value=slow_ema_period;
//— 高速移動平均と低速移動平均の差の平均期間
pars[2].type=TYPE_INT;
pars[2].integer_value=signal_period;
//— 価格の種類
pars[3].type=TYPE_INT;
pars[3].integer_value=applied_price;
handle=IndicatorCreate(name,period,IND_OSMA,4,pars);
}
//— ハンドルが作成されなかった場合
if(handle==INVALID_HANDLE)
{
//— 失敗した事実とエラーコードを出力する
PrintFormat(“Failed to create a handle of iOsMA for the pair %s/%s, error code is %d”,
name,
EnumToString(period),
GetLastError());
//— 指標が早期に中止された
return(INIT_FAILED);
}
//— 移動平均オシレーター指標が計算された銘柄/時間軸を表示
short_name=StringFormat(“iOsMA(%s/%s,%d,%d,%d,%s)”,name,EnumToString(period),
fast_ema_period,slow_ema_period,signal_period,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[])
{
//— iOsMA 指標から複製された値の数
int values_to_copy;
//— 指標で計算された値の数を決める
int calculated=BarsCalculated(handle);
if(calculated<=0)
{
PrintFormat(“BarsCalculated() returned %d, error code %d”,calculated,GetLastError());
return(0);
}
//— これが指標計算の初めであるか iOsMA 指標の値の数が変更した changed
//—または、2 つ以上のバーの指標の計算が必要である場合(価格履歴で何かが変更された)
if(prev_calculated==0 || calculated!=bars_calculated || rates_total>prev_calculated+1)
{
//— iOsMABuffer 配列が銘柄/期間で iOsMA 指標の値の数より大きい場合、全体のコピーはしない
//— 他の場合、指標バッファサイズより少ない量をコピーをする
if(calculated>rates_total) values_to_copy=rates_total;
else                       values_to_copy=calculated;
}
else
{
//— これは初回の計算ではなく、
//— 前回の OnCalculate() から、一以上のバーが加えられてない。
values_to_copy=(rates_total-prev_calculated)+1;
}
//— 配列をiOsMA 指標の値で記入
//— FillArrayFromBuffer が false を返した場合、情報の準備が終わっていないので操作を終了する
if(!FillArrayFromBuffer(iOsMABuffer,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);
}
//+——————————————————————+
//| iOsMA 指標から指標バッファを記入する                                      |
//+——————————————————————+
bool FillArrayFromBuffer(double &ama_buffer[], // OsMA 値の指標バッファ
int ind_handle,       // iOsMA 指標ハンドル
int amount             // 複製された値の数

{
//— エラーコードをリセットする
ResetLastError();
//— インデックス0 を持つ指標バッファの値で iOsMABuffer 配列の一部を記入する
if(CopyBuffer(ind_handle,0,0,amount,ama_buffer)<0)
{
//— 複製が失敗したら、エラーコードを出す
PrintFormat(“Failed to copy data from the iOsMA indicator, error code %d”,GetLastError());
//— ゼロ結果で終了。 指標は計算されていないと見なされる
return(false);
}
//— 全てが成功
return(true);
}
//+——————————————————————+
//| 指標初期化解除関数                                                  |
//+——————————————————————+
void OnDeinit(const int reason)
{
//— 指標の削除後チャートをクリアする
Comment(“”);
}

iMACD

この関数は MACD(Moving Averages Convergence/Divergence)指標ハンドルを返します。OsMA が MACD ヒストグラムと呼ばれるシステムでは、この指標は 2 本の線として表示されます。クライアント端末では MACD はヒストグラムのように見えます。

int  iMACD(
string              symbol,              // 銘柄名
ENUM_TIMEFRAMES    period,              // 期間
int                fast_ema_period,    // 高速平均計算の期間
int                slow_ema_period,    // 低速平均計算の期間
int                signal_period,      // 差の平均計算の期間
ENUM_APPLIED_PRICE  applied_price        // 価格の種類かハンドル
);

パラメータ

symbol

[in] データが指標計算に使用される有価証券の銘柄名(NULL は現在のシンボル)

period

[in] 期間の値は ENUM_TIMEFRAMES 列挙の値の 1 つで、0 は現在の時間軸の意味です。

fast_ema_period

[in]  高速移動平均計算の期間

slow_ema_period

[in]  低速移動平均計算の期間

signal_period

[in]  シグナル線の計算期間

applied_price

[in]  使用される価格。ENUM_APPLIED_PRICE 価格定数のいずれか、または別の指標ハンドル。

戻り値

指定されたテクニカル指標ハンドル。失敗の場合 INVALID_HANDLE。IndicatorRelease() 関数に指標ハンドルを渡すことによって 、コンピュータメモリを利用されていない指標から解放することが出来ます。

注意事項

バッファ番号は 0 – MAIN_LINE, 1 – SIGNAL_LINE です。

例:

//+——————————————————————+
//|                                                   Demo_iMACD.mq5 |
//|                        Copyright 2011, MetaQuotes Software Corp. |
//|                                             https://www.MQL5.com |
//+——————————————————————+
#property copyright “Copyright 2011, MetaQuotes Software Corp.”
#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 iMACD 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 MACD.”

#property indicator_separate_window
#property indicator_buffers 2
#property indicator_plots   2
//— MACD プロット
#property indicator_label1 “MACD”
#property indicator_type1   DRAW_HISTOGRAM
#property indicator_color1  clrSilver
#property indicator_style1 STYLE_SOLID
#property indicator_width1  1
//— シグナルプロット
#property indicator_label2 “Signal”
#property indicator_type2   DRAW_LINE
#property indicator_color2  clrRed
#property indicator_style2 STYLE_DOT
#property indicator_width2  1
//+——————————————————————+
//| 作成を処理する方法の列挙                                              |
//+——————————————————————+
enum Creation
{
Call_iMACD,             // iMACD を使用する
Call_IndicatorCreate   // IndicatorCreateを使用する
};
//— 入力パラメータ
input Creation             type=Call_iMACD;           // 関数の種類
input int                  fast_ema_period=12;       // 高速 MA 期間
input int                  slow_ema_period=26;       // 低速 MA 期間
input int                  signal_period=9;           // 差の平均期間
input ENUM_APPLIED_PRICE   applied_price=PRICE_CLOSE; // 価格の種類
input string               symbol=” “;               // シンボル
input ENUM_TIMEFRAMES     period=PERIOD_CURRENT;     // 時間軸
//— 指標バッファ
double         MACDBuffer[];
double         SignalBuffer[];
//— iMACD 指標ハンドルを格納する変数
int    handle;
//— 格納に使用される変数
string name=symbol;
//— チャートでの指標名
string short_name;
//— MACD 指標に値の数を保存
int    bars_calculated=0;
//+——————————————————————+
//| カスタム指標を初期化する関数                                            |
//+——————————————————————+
int OnInit()
{
//— 配列の指標バッファへの割り当て
SetIndexBuffer(0,MACDBuffer,INDICATOR_DATA);
SetIndexBuffer(1,SignalBuffer,INDICATOR_DATA);
//— 指標が描画するシンボルを決める
name=symbol;
//— 左右のスペースを削する
StringTrimRight(name);
StringTrimLeft(name);
//—「name」文字列の長さがゼロになった場合
if(StringLen(name)==0)
{
//— 指標が接続されているチャートのシンボルを取る
name=_Symbol;
}
//— 指標ハンドルを作成する
if(type==Call_iMACD)
handle=iMACD(name,period,fast_ema_period,slow_ema_period,signal_period,applied_price);
else
{
//— 構造体を指標のパラメータで記入    
MqlParam pars[4];
//— 高速 MA 期間
pars[0].type=TYPE_INT;
pars[0].integer_value=fast_ema_period;
//— 低速 MA 期間
pars[1].type=TYPE_INT;
pars[1].integer_value=slow_ema_period;
//— 高速移動平均と低速移動平均の差の平均期間
pars[2].type=TYPE_INT;
pars[2].integer_value=signal_period;
//— 価格の種類
pars[3].type=TYPE_INT;
pars[3].integer_value=applied_price;
handle=IndicatorCreate(name,period,IND_MACD,4,pars);
}
//— ハンドルが作成されなかった場合
if(handle==INVALID_HANDLE)
{
//— 失敗した事実とエラーコードを出力する
PrintFormat(“Failed to create handle of the iMACD indicator for the symbol %s/%s, error code %d”,
name,
EnumToString(period),
GetLastError());
//— 指標が早期に中止された
return(INIT_FAILED);
}
//— MACD が計算された銘柄/時間軸を表示
short_name=StringFormat(“iMACD(%s/%s,%d,%d,%d,%s)”,name,EnumToString(period),
fast_ema_period,slow_ema_period,signal_period,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[])
{
//— iMACD 指標から複製された値の数
int values_to_copy;
//— 指標で計算された値の数を決める
int calculated=BarsCalculated(handle);
if(calculated<=0)
{
PrintFormat(“BarsCalculated() returned %d, error code %d”,calculated,GetLastError());
return(0);
}
//— これが指標計算の初めであるか iMACD 指標の値の数が変更した
//—または、2 つ以上のバーの指標の計算が必要である場合(価格履歴で何かが変更された)
if(prev_calculated==0 || calculated!=bars_calculated || rates_total>prev_calculated+1)
{
//— MACDBuffer 配列が銘柄/期間でiMACD 指標の値の数より大きい場合、全体のコピーはしない
//— 他の場合、指標バッファサイズより少ない量をコピーをする
if(calculated>rates_total) values_to_copy=rates_total;
else                       values_to_copy=calculated;
}
else
{
//— これは初回の計算ではなく、
//— 前回の OnCalculate() から、一以上のバーが加えられてない。
values_to_copy=(rates_total-prev_calculated)+1;
}
//— 配列を iMACD 指標の値で記入
//— FillArraysFromBuffer が false を返した場合、情報の準備が終わっていないので操作を終了する
if(!FillArraysFromBuffers(MACDBuffer,SignalBuffer,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);
//— MACD 指標の値の数を覚える
bars_calculated=calculated;
//— prev_calculated 値を次の関数呼び出しのために返す
return(rates_total);
}
//+——————————————————————+
//| iMACD 指標から指標バッファを記入する                                      |
//+——————————————————————+
bool FillArraysFromBuffers(double &macd_buffer[],   // MACD 値の指標バッファ
double &signal_buffer[], // MACD シグナル線の指標バッファ
int ind_handle,           // iMACD 指標ハンドル
int amount               // 複製された値の数

{
//— エラーコードをリセットする
ResetLastError();
//— インデックス0 を持つ指標バッファの値で iMACDBuffer 配列の一部を記入する
if(CopyBuffer(ind_handle,0,0,amount,macd_buffer)<0)
{
//— 複製が失敗したら、エラーコードを出す
PrintFormat(“Failed to copy data from the iMACD indicator, error code %d”,GetLastError());
//— ゼロ結果で終了。 指標は計算されていないと見なされる
return(false);
}

//— インデックス 1 を持つ指標バッファの値で SignalBuffer 配列の一部を記入する
if(CopyBuffer(ind_handle,1,0,amount,signal_buffer)<0)
{
//— 複製が失敗したら、エラーコードを出す
PrintFormat(“Failed to copy data from the iMACD indicator, error code %d”,GetLastError());
//— ゼロ結果で終了。 指標は計算されていないと見なされる
return(false);
}
//— 全てが成功
return(true);
}
//+——————————————————————+
//| 指標初期化解除関数                                                  |
//+——————————————————————+
void OnDeinit(const int reason)
{
//— 指標の削除後チャートをクリアする
Comment(“”);
}

iOBV

この関数は On Balance Volume (オンバランスボリューム)指標のハンドルを返します。バッファは 1 つです。

int  iOBV(
string                symbol,            // 銘柄名
ENUM_TIMEFRAMES      period,            // 期間
ENUM_APPLIED_VOLUME   applied_volume      // 計算に使用するボリュームの種類
);

パラメータ

symbol

[in] データが指標計算に使用される有価証券の銘柄名(NULL は現在のシンボル)

period

[in] 期間の値は ENUM_TIMEFRAMES 列挙の値の 1 つで、0 は現在の時間軸の意味です。

applied_volume

[in]  使用されるボリューム(ENUM_APPLIED_VOLUME 値のいずれか)

戻り値

指定されたテクニカル指標ハンドル。失敗の場合 INVALID_HANDLE。IndicatorRelease() 関数に指標ハンドルを渡すことによって 、コンピュータメモリを利用されていない指標から解放することが出来ます。

例:

//+——————————————————————+
//|                                                    Demo_iOBV.mq5 |
//|                        Copyright 2011, MetaQuotes Software Corp. |
//|                                             https://www.MQL5.com |
//+——————————————————————+
#property copyright “Copyright 2011, MetaQuotes Software Corp.”
#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 iOBV 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 indicator_separate_window
#property indicator_buffers 1
#property indicator_plots   1
//—  iOBV
#property indicator_label1 “iOBV”
#property indicator_type1   DRAW_LINE
#property indicator_color1  clrLightSeaGreen
#property indicator_style1 STYLE_SOLID
#property indicator_width1  1
//+——————————————————————+
//| 作成を処理する方法の列挙                                              |
//+——————————————————————+
enum Creation
{
Call_iOBV ,             // iOBV を使用する
Call_IndicatorCreate   // IndicatorCreateを使用する
};
//— 入力パラメータ
input Creation             type=Call_iOBV;               // 関数の種類
input ENUM_APPLIED_VOLUME  applied_volume=VOLUME_TICK;   // ボリュームの種類
input string               symbol=” “;                   // シンボル
input ENUM_TIMEFRAMES &nnbsp;   period=PERIOD_CURRENT;       // 時間軸
//— 指標バッファ
double         iOBVBuffer[];
//— iOBV 指標ハンドルを格納する変数
int    handle;
//— 格納に使用される変数
string name=symbol;
//— チャートでの指標名
string short_name;
//— オンバランスボリューム指標に値の数を保存
int    bars_calculated=0;
//+——————————————————————+
//| カスタム指標を初期化する関数                                            |
//+——————————————————————+
int OnInit()
{
//— 配列の指標バッファへの割り当て
SetIndexBuffer(0,iOBVBuffer,INDICATOR_DATA);
//— 指標が描画するシンボルを決める
name=symbol;
//— 左右のスペースを削する
StringTrimRight(name);
StringTrimLeft(name);
//—「name」文字列の長さがゼロになった場合
if(StringLen(name)==0)
{
//— 指標が接続されているチャートのシンボルを取る
name=_Symbol;
}
//— 指標ハンドルを作成する
if(type==Call_iOBV)
handle=iOBV(name,period,applied_volume);
else
{
//— 構造体を指標のパラメータで記入    
MqlParam pars[1];
//— ボリュームの種類
pars[0].type=TYPE_INT;
pars[0].integer_value=applied_volume;
handle=IndicatorCreate(name,period,IND_OBV,1,pars);
}
//— ハンドルが作成されなかった場合
if(handle==INVALID_HANDLE)
{
//— 失敗した事実とエラーコードを出力する
PrintFormat(“Failed to create handle of the iOBV indicator for the symbol %s/%s, error code %d”,
name,
EnumToString(period),
GetLastError());
//— 指標が早期に中止された
return(INIT_FAILED);
}
//— オンバランスボリューム指標が計算された銘柄/時間軸を表示
short_name=StringFormat(“iOBV(%s/%s, %s)”,name,EnumToString(period),
EnumToString(applied_volume));
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[])
{
//— iOBV 指標から複製された値の数
int values_to_copy;
//— 指標で計算された値の数を決める
int calculated=BarsCalculated(handle);
if(calculated<=0)
{
PrintFormat(“BarsCalculated() returned %d, error code %d”,calculated,GetLastError());
return(0);
}
//— これが指標計算の初めであるか iOBV 指標の値の数が変更した
//—または、2 つ以上のバーの指標の計算が必要である場合(価格履歴で何かが変更された)
if(prev_calculated==0 || calculated!=bars_calculated || rates_total>prev_calculated+1)
{
//— iOBVBuffer 配列が銘柄/期間で iOBV 指標の値の数より大きい場合、全体のコピーはしない
//— 他の場合、指標バッファサイズより少ない量をコピーをする
if(calculated>rates_total) values_to_copy=rates_total;
else                       values_to_copy=calculated;
}
else
{
//— これは初回の計算ではなく、
//— 前回の OnCalculate() から、一以上のバーが加えられてない。
values_to_copy=(rates_total-prev_calculated)+1;
}
//— 配列を iOBV 指標の値で記入
//— FillArrayFromBuffer が false を返した場合、情報の準備が終わっていないので操作を終了する
if(!FillArrayFromBuffer(iOBVBuffer,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);
}
//+——————————————————————+
//| iOBV 指標から指標バッファを記入する                                       |
//+——————————————————————+
bool FillArrayFromBuffer(double &obv_buffer[], // OBV 値の指標バッファ
int ind_handle,       // iOBV 指標ハンドル
int amount             // 複製された値の数

{
//— エラーコードをリセットする
ResetLastError();
//— インデックス0 を持つ指標バッファの値で iOBVBuffer 配列の一部を記入する
if(CopyBuffer(ind_handle,0,0,amount,obv_buffer)<0)
{
//— 複製が失敗したら、エラーコードを出す
PrintFormat(“Failed to copy data from the iOBV indicator, error code %d”,GetLastError());
//— ゼロ結果で終了。 指標は計算されていないと見なされる
return(false);
}
//— 全てが成功
return(true);
}
//+——————————————————————+
//| 指標初期化解除関数                                                  |
//+——————————————————————+
void OnDeinit(const int reason)
{
//— 指標の削除後チャートをクリアする
Comment(“”);
}

iSAR

この関数は Parabolic Stop and Reverse system(パラボリック SAR )の指標ハンドルを返します。バッファは 1 つです。

int  iSAR(
string          symbol,      // 銘柄名
ENUM_TIMEFRAMES  period,      // 期間
double          step,        // 価格増分ステップ(加速因子)
double          maximum      // ステップの最大値
);

パラメータ

symbol

[in] データが指標計算に使用される有価証券の銘柄名(NULL は現在のシンボル)

period

[in] 期間の値は ENUM_TIMEFRAMES 列挙の値の 1 つで、0 は現在の時間軸の意味です。

step

[in]  価格増分ステップ(通常  0.02 )

maximum

[in]  ステップの最大値(通常 0.2 )

戻り値

指定されたテクニカル指標ハンドル。失敗の場合 INVALID_HANDLE。IndicatorRelease() 関数に指標ハンドルを渡すことによって 、コンピュータメモリを利用されていない指標から解放することが出来ます。

例:

//+——————————————————————+
//|                                                    Demo_iSAR.mq5 |
//|                        Copyright 2011, MetaQuotes Software Corp. |
//|                                             https://www.MQL5.com |
//+——————————————————————+
#property copyright “Copyright 2011, MetaQuotes Software Corp.”
#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 iSAR 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 the other parameters are similar to the standard Parabolic Stop and Reverse.”

#property indicator_chart_window
#property indicator_buffers 1
#property indicator_plots   1
//— iSAR の描画
#property indicator_label1 “iSAR”
#property indicator_type1   DRAW_ARROW
#property indicator_color1  clrBlue
#property indicator_style1 STYLE_SOLID
#property indicator_width1  1
//+——————————————————————+
//| 作成を処理する方法の列挙                                              |
//+——————————————————————+
enum Creation
{
Call_iSAR,             // iSAR を使用する
Call_IndicatorCreate   // IndicatorCreateを使用する
};
//— 入力パラメータ
input Creation             type=Call_iSAR;               // 関数の種類
input double               step=0.02;                   // ストップトレイリングの加速因子
input double               maximum=0.2;                 // ステップの最大値
input string               symbol=” “;                   // シンボル
input ENUM_TIMEFRAMES     period=PERIOD_CURRENT;       // 時間軸
//— 指標バッファ
double         iSARBuffer[];
//— iSAR 指標ハンドルを格納する変数
int    handle;
//— 格納に使用される変数
string name=symbol;
//— チャートでの指標名
string short_name;
//— パラボリックSAR 指標に値の数を保存
int    bars_calculated=0;
//+——————————————————————+
//| カスタム指標を初期化する関数                                            |
//+——————————————————————+
int OnInit()
{
//— 配列の指標バッファへの割り当て
SetIndexBuffer(0,iSARBuffer,INDICATOR_DATA);
//— シャーとに表示する PLOT_ARROW プロパティのコードを Wingdings 文字セットからの記号を使用して設定
PlotIndexSetInteger(0,PLOT_ARROW,159);
//— 指標が描画するシンボルを決める
name=symbol;
//— 左右のスペースを削する
StringTrimRight(name);
StringTrimLeft(name);
//—「name」文字列の長さがゼロになった場合
if(StringLen(name)==0)
{
//— 指標が接続されているチャートのシンボルを取る
name=_Symbol;
}
//— 指標ハンドルを作成する
if(type==Call_iSAR)
handle=iSAR(name,period,step,maximum);
else
{
//— 構造体を指標のパラメータで記入    
MqlParam pars[2];
//— ステップ値
pars[0].type=TYPE_DOUBLE;
pars[0].double_value=step;
//— 計算に使用するステップ値の制限
pars[1].type=TYPE_DOUBLE;
pars[1].double_value=maximum;
handle=IndicatorCreate(name,period,IND_SAR,2,pars);
}
//— ハンドルが作成されなかった場合
if(handle==INVALID_HANDLE)
{
//— 失敗した事実とエラーコードを出力する
PrintFormat(“Failed to create handle of the iSAR indicator for the symbol %s/%s, error code %d”,
name,
EnumToString(period),
GetLastError());
//— 指標が早期に中止された
return(INIT_FAILED);
}
//— パラボリック SAR 指標が計算された銘柄/時間軸を表示する
short_name=StringFormat(“iSAR(%s/%s, %G, %G)”,name,EnumToString(period),
step,maximum);
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[])
{
//— iSAR 指標から複製された値の数
int values_to_copy;
//— 指標で計算された値の数を決める
int calculated=BarsCalculated(handle);
if(calculated<=0)
{
PrintFormat(“BarsCalculated() returned %d, error code %d”,calculated,GetLastError());
return(0);
}
//— これが指標計算の初めであるか iSAR 指標の値の数が変更した
//—または、2 つ以上のバーの指標の計算が必要である場合(価格履歴で何かが変更された)
if(prev_calculated==0 || calculated!=bars_calculated || rates_total>prev_calculated+1)
{
//— iSARBuffer 配列が銘柄/期間でiSAR 指標の値の数より大きい場合、全体のコピーはしない
//— 他の場合、指標バッファサイズより少ない量をコピーをする
if(calculated>rates_total) values_to_copy=rates_total;
else                       values_to_copy=calculated;
}
else
{
//— これは初回の計算ではなく、
//— 前回の OnCalculate() から、一以上のバーが加えられてない。
values_to_copy=(rates_total-prev_calculated)+1;
}
//— 配列をiSAR 指標の値で記入
//— FillArrayFromBuffer が false を返した場合、情報の準備が終わっていないので操作を終了する
if(!FillArrayFromBuffer(iSARBuffer,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);
//— パラボリックSAR 指標の値の数を覚える
bars_calculated=calculated;
//— prev_calculated 値を次の関数呼び出しのために返す
return(rates_total);
}
//+——————————————————————+
//| iSAR 指標から指標バッファを記入する                                       |
//+——————————————————————+
bool FillArrayFromBuffer(double &sar_buffer[], // パラボリック SAR 値の指標バッファ
int ind_handle,       // iSAR 指標ハンドル
int amount             // 複製された値の数

{
//— エラーコードをリセットする
ResetLastError();
//— インデックス0 を持つ指標バッファの値で iSARBuffer 配列の一部を記入する
if(CopyBuffer(ind_handle,0,0,amount,sar_buffer)<0)
{
//— 複製が失敗したら、エラーコードを出す
PrintFormat(“Failed to copy data from the iSAR indicator, error code %d”,GetLastError());
//— ゼロ結果で終了。 指標は計算されていないと見なされる
return(false);
}
//— 全てが成功
return(true);
}
//+——————————————————————+
//| 指標初期化解除関数                                                  |
//+——————————————————————+
void OnDeinit(const int reason)
{
//— 指標の削除後チャートをクリアする
Comment(“”);
}

iRSI

この関数は Relative Strength Index(相対力指数)指標のハンドルを返します。バッファは 1 つです。

int  iRSI(
string              symbol,            // 銘柄名
ENUM_TIMEFRAMES    period,            // 期間
int                ma_period,        // 平均期間
ENUM_APPLIED_PRICE  applied_price      // 価格の種類かハンドル
);

パラメータ

symbol

[in] データが指標計算に使用される有価証券の銘柄名(NULL は現在のシンボル)

period

[in] 期間の値は ENUM_TIMEFRAMES 列挙の値の 1 つで、0 は現在の時間軸の意味です。

ma_period

[in]  RSI 計算の平均期間

applied_price

[in]  使用される価格。ENUM_APPLIED_PRICE 価格定数のいずれか、または別の指標ハンドル。

戻り値

指定されたテクニカル指標ハンドル。失敗の場合 INVALID_HANDLE。IndicatorRelease() 関数に指標ハンドルを渡すことによって 、コンピュータメモリを利用されていない指標から解放することが出来ます。

例:

//+——————————————————————+
//|                                                    Demo_iRSI.mq5 |
//|                        Copyright 2011, MetaQuotes Software Corp. |
//|                                             https://www.MQL5.com |
//+——————————————————————+
#property copyright “Copyright 2011, MetaQuotes Software Corp.”
#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 iRSI 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 the other parameters are similar to the standard Relative Strength Index.”

#property indicator_separate_window
#property indicator_buffers 1
#property indicator_plots   1
//— iRSI の描画
#property indicator_label1 “iRSI”
#property indicator_type1   DRAW_LINE
#property indicator_color1  clrDodgerBlue
#property indicator_style1 STYLE_SOLID
#property indicator_width1  1
//— 指標ウィンドウでの値の表示の制限
#property indicator_maximum 100
#property indicator_minimum 0
//— 指標ウィンドウの水平レベル
#property indicator_level1  70.0
#property indicator_level2  30.0
//+——————————————————————+
//| 作成を処理する方法の列挙                                              |
//+——————————————————————+
enum Creation
{
Call_iRSI,             // iRSI を使用する
Call_IndicatorCreate   // IndicatorCreateを使用する
};
//— 入力パラメータ
input Creation             type=Call_iRSI;               // 関数の種類
input int                  ma_period=14;                 // 平均期間
input ENUM_APPLIED_PRICE   applied_price=PRICE_CLOSE;   // 価格の種類
input string               symbol=” “;                   // シンボル
input ENUM_TIMEFRAMES     period=PERIOD_CURRENT;       // 時間軸
//— 指標バッファ
double         iRSIBuffer[];
//— iRSI 指標ハンドルを格納する変数
int    handle;
//— 格納に使用される変数
string name=symbol;
//— チャートでの指標名
string short_name;
//— 相対力指数指標に値の数を保存
int    bars_calculated=0;
//+——————————————————————+
//| カスタム指標を初期化する関数                                            |
//+——————————————————————+
int OnInit()
{
//— 配列の指標バッファへの割り当て
SetIndexBuffer(0,iRSIBuffer,INDICATOR_DATA);
//— 指標が描画するシンボルを決める
name=symbol;
//— 左右のスペースを削する
StringTrimRight(name);
StringTrimLeft(name);
//—「name」文字列の長さがゼロになった場合
if(StringLen(name)==0)
{
//— 指標が接続されているチャートのシンボルを取る
name=_Symbol;
}
//— 指標ハンドルを作成する
if(type==Call_iRSI)
handle=iRSI(name,period,ma_period,applied_price);
else
{
//— 構造体を指標のパラメータで記入    
MqlParam pars[2];
//— 移動平均の期間
pars[0].type=TYPE_INT;
pars[0].integer_value=ma_period;
//— 計算に使用するステップ値の制限
pars[1].type=TYPE_INT;
pars[1].integer_value=applied_price;
handle=IndicatorCreate(name,period,IND_RSI,2,pars);
}
//— ハンドルが作成されなかった場合
if(handle==INVALID_HANDLE)
{
//— 失敗した事実とエラーコードを出力する
PrintFormat(“Failed to create handle of the iRSI indicator for the symbol %s/%s, error code %d”,
name,
EnumToString(period),
GetLastError());
//— 指標が早期に中止された
return(INIT_FAILED);
}
//— 相対力指数指標が計算された銘柄/時間軸を表示
short_name=StringFormat(“iRSI(%s/%s, %d, %d)”,name,EnumToString(period),
ma_period,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[])
{
//— iRSI 指標から複製された値の数
int values_to_copy;
//— 指標で計算された値の数を決める
int calculated=BarsCalculated(handle);
if(calculated<=0)
{
PrintFormat(“BarsCalculated() returned %d, error code %d”,calculated,GetLastError());
return(0);
}
//— これが指標計算の初めであるか iRSI 指標の値の数が変更した
//—または、2 つ以上のバーの指標の計算が必要である場合(価格履歴で何かが変更された)
if(prev_calculated==0 || calculated!=bars_calculated || rates_total>prev_calculated+1)
{
//— iRSIBuffer 配列が銘柄/期間で iRSI 指標の値の数より大きい場合、全体のコピーはしない
//— 他の場合、指標バッファサイズより少ない量をコピーをする
if(calculated>rates_total) values_to_copy=rates_total;
else                       values_to_copy=calculated;
}
else
{
//— これは初回の計算ではなく、
//— 前回の OnCalculate() から、一以上のバーが加えられてない。
values_to_copy=(rates_total-prev_calculated)+1;
}
//— 配列をiRSI 指標の値で記入
//— FillArrayFromBuffer が false を返した場合、情報の準備が終わっていないので操作を終了する
if(!FillArrayFromBuffer(iRSIBuffer,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);
}
//+——————————————————————+
//| iRSI 指標から指標バッファを記入する                                       |
//+——————————————————————+
bool FillArrayFromBuffer(double &rsi_buffer[], // 相対力指数値の指標バッファ
int ind_handle,       // iRSI 指標ハンドル
int amount             // 複製された値の数

{
//— エラーコードをリセットする
ResetLastError();
//— インデックス0 を持つ指標バッファの値で iRSIBuffer 配列の一部を記入する
if(CopyBuffer(ind_handle,0,0,amount,rsi_buffer)<0)
{
//— 複製が失敗したら、エラーコードを出す
PrintFormat(“Failed to copy data from the iRSI indicator, error code %d”,GetLastError());
//— ゼロ結果で終了。 指標は計算されていないと見なされる
return(false);
}
//— 全てが成功
return(true);
}
//+——————————————————————+
//| 指標初期化解除関数                                                  |
//+——————————————————————+
void OnDeinit(const int reason)
{
//— 指標の削除後チャートをクリアする
Comment(“”);
}

iRVI

この関数は Relative Vigor Index(相対活力指数)指標ハンドルを返します。

int  iRVI(
string          symbol,        // 銘柄名
ENUM_TIMEFRAMES  period,        // 期間
int              ma_period      // 平均期間
);

パラメータ

symbol

[in] データが指標計算に使用される有価証券の銘柄名(NULL は現在のシンボル)

period

[in] 期間の値は ENUM_TIMEFRAMES 列挙の値の 1 つで、0 は現在の時間軸の意味です。

ma_period

[in]  RVI 計算の平均期間

戻り値

指定されたテクニカル指標ハンドル。失敗の場合 INVALID_HANDLE。IndicatorRelease() 関数に指標ハンドルを渡すことによって 、コンピュータメモリを利用されていない指標から解放することが出来ます。

注意事項

バッファ番号は 0 – MAIN_LINE, 1 – SIGNAL_LINE です。

例:

//+——————————————————————+
//|                                                    Demo_iRVI.mq5 |
//|                        Copyright 2011, MetaQuotes Software Corp. |
//|                                             https://www.MQL5.com |
//+——————————————————————+
#property copyright “Copyright 2011, MetaQuotes Software Corp.”
#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 iRVI 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 the other parameters are similar to the standard Relative Vigor Index.”

#property indicator_separate_window
#property indicator_buffers 2
#property indicator_plots   2
//— RVI プロット
#property indicator_label1 “RVI”
#property indicator_type1   DRAW_LINE
#property indicator_color1  clrGreen
#property indicator_style1 STYLE_SOLID
#property indicator_width1  1
//— シグナルプロット
#property indicator_label2 “Signal”
#property indicator_type2   DRAW_LINE
#property indicator_color2  clrRed
#property indicator_style2 STYLE_SOLID
#property indicator_width2  1
//+——————————————————————+
//| 作成を処理する方法の列挙                                              |
//+——————————————————————+
enum Creation
{
Call_iRVI,             // iRVI を使用する
Call_IndicatorCreate   // IndicatorCreateを使用する
};
//— 入力パラメータ
input Creation             type=Call_iRVI;               // 関数の種類
input int                  ma_period=10;                 // 計算期間
input string               symbol=” “;                   // シンボル
input ENUM_TIMEFRAMES     period=PERIOD_CURRENT;       // 時間軸
//— 指標バッファ
double         RVIBuffer[];
double         SignalBuffer[];
//— iRVI 指標ハンドルを格納する変数
int    handle;
//— 格納に使用される変数
string name=symbol;
//— チャートでの指標名
string short_name;
//— 相対活力指数指標に値の数を保存
int    bars_calculated=0;
//+——————————————————————+
//| カスタム指標を初期化する関数                                            |
//+——————————————————————+
int OnInit()
{
//— 配列の指標バッファへの割り当て
SetIndexBuffer(0,RVIBuffer,INDICATOR_DATA);
SetIndexBuffer(1,SignalBuffer,INDICATOR_DATA);
//— 指標が描画するシンボルを決める
name=symbol;
//— 左右のスペースを削する
StringTrimRight(name);
StringTrimLeft(name);
//—「name」文字列の長さがゼロになった場合
if(StringLen(name)==0)
{
//— 指標が接続されているチャートのシンボルを取る
name=_Symbol;
}
//— 指標ハンドルを作成する
if(type==Call_iRVI)
handle=iRVI(name,period,ma_period);
else
{
//— 構造体を指標のパラメータで記入    
MqlParam pars[1];
//— 計算期間
pars[0].type=TYPE_INT;
pars[0].integer_value=ma_period;
handle=IndicatorCreate(name,period,IND_RVI,1,pars);
}
//— ハンドルが作成されなかった場合
if(handle==INVALID_HANDLE)
{
//— 失敗した事実とエラーコードを出力する
PrintFormat(“Failed to create handle of the iRVI indicator for the symbol %s/%s, error code %d”,
name,
EnumToString(period),
GetLastError());
//— 指標が早期に中止された
return(INIT_FAILED);
}
//— 相対活力指数指標が計算された銘柄/時間軸を表示
short_name=StringFormat(“iRVI(%s/%s, %d, %d)”,name,EnumToString(period),ma_period);
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[])
{
//— iRVI 指標から複製された値の数
int values_to_copy;
//— 指標で計算された値の数を決める
int calculated=BarsCalculated(handle);
if(calculated<=0)
{
PrintFormat(“BarsCalculated() returned %d, error code %d”,calculated,GetLastError());
return(0);
}
//— これが指標計算の初めであるか iRVI 指標の値の数が変更した
//—または、2 つ以上のバーの指標の計算が必要である場合(価格履歴で何かが変更された)
if(prev_calculated==0 || calculated!=bars_calculated || rates_total>prev_calculated+1)
{
//— RVIBuffer 配列が銘柄/期間で iRVI 指標の値の数より大きい場合、全体のコピーはしない
//— 他の場合、指標バッファサイズより少ない量をコピーをする
if(calculated>rates_total) values_to_copy=rates_total;
else                       values_to_copy=calculated;
}
else
{
//— これは初回の計算ではなく、
//— 前回の OnCalculate() から、一以上のバーが加えられてない。
values_to_copy=(rates_total-prev_calculated)+1;
}
//— 配列を iRVI 指標の値で記入
//— FillArrayFromBuffer が false を返した場合、情報の準備が終わっていないので操作を終了する
if(!FillArrayFromBuffer(RVIBuffer,SignalBuffer,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);
}
//+——————————————————————+
//| iRVI 指標から指標バッファを記入する                                       |
//+——————————————————————+
bool FillArrayFromBuffer(double &rvi_buffer[],     // 相対活力指数値の指標バッファ
double &signal_buffer[], // シグナル線の指標バッファ
int ind_handle,           // iRVI 指標ハンドルr
int amount               // 複製された値の数

{
//— エラーコードをリセットする
ResetLastError();
//— インデックス0 を持つ指標バッファの値で iRVIBuffer 配列の一部を記入する
if(CopyBuffer(ind_handle,0,0,amount,rvi_buffer)<0)
{
//— 複製が失敗したら、エラーコードを出す
PrintFormat(“Failed to copy data from the iRVI indicator, error code %d”,GetLastError());
//— ゼロ結果で終了。 指標は計算されていないと見なされる
return(false);
}
//— インデックス 1 を持つ指標バッファの値で SignalBuffer 配列の一部を記入する
if(CopyBuffer(ind_handle,1,0,amount,signal_buffer)<0)
{
//— 複製が失敗したら、エラーコードを出す
PrintFormat(“Failed to copy data from the iRVI indicator, error code %d”,GetLastError());
//— ゼロ結果で終了。 指標は計算されていないと見なされる
return(false);
}
//— 全てが成功
return(true);
}
//+——————————————————————+
//| 指標初期化解除関数                                                  |
//+——————————————————————+
void OnDeinit(const int reason)
{
//— 指標の削除後チャートをクリアする
Comment(“”);
}

iStdDev

この関数は Standard Deviation(標準偏差)指標のハンドルを返します。バッファは 1 つです。

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

パラメータ

symbol

[in] データが指標計算に使用される有価証券の銘柄名(NULL は現在のシンボル)

period

[in] 期間の値は ENUM_TIMEFRAMES 列挙の値の 1 つで、0 は現在の時間軸の意味です。

ma_period

[in]  指標計算の平均期間

ma_shift

[in]  価格チャートに相対した指標のシフト

ma_method

[in]  平均化の方法ENUM_MA_METHOD 値のいずれか

applied_price

[in]  使用される価格。ENUM_APPLIED_PRICE 価格定数のいずれか、または別の指標ハンドル。

戻り値

指定されたテクニカル指標ハンドル。失敗の場合 INVALID_HANDLE。IndicatorRelease() 関数に指標ハンドルを渡すことによって 、コンピュータメモリを利用されていない指標から解放することが出来ます。

例:

//+——————————————————————+
//|                                                 Demo_iStdDev.mq5 |
//|                        Copyright 2011, MetaQuotes Software Corp. |
//|                                             https://www.MQL5.com |
//+——————————————————————+
#property copyright “Copyright 2011, MetaQuotes Software Corp.”
#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 iStdDev 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 the other parameters are similar to the normal Standard Deviation.”

#property indicator_separate_window
#property indicator_buffers 1
#property indicator_plots   1
//— iStdDev プロット
#property indicator_label1 “iStdDev”
#property indicator_type1   DRAW_LINE
#property indicator_color1  clrMediumSeaGreen
#property indicator_style1 STYLE_SOLID
#property indicator_width1  1
//+——————————————————————+
//| 作成を処理する方法の列挙                                              |
//+——————————————————————+
enum Creation
{
Call_iStdDev,           // iStdDev を使用
Call_IndicatorCreate   // IndicatorCreateを使用する
};
//— 入力パラメータ
input Creation             type=Call_iStdDev;         // 関数の種類
input int                  ma_period=20;             // 平均期間
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         iStdDevBuffer[];
//— iStdDev 指標ハンドルを格納する変数
int    handle;
//— 格納に使用される変数
string name=symbol;
//— チャートでの指標名
string short_name;
//— 標準偏差指標に値の数を保存
int    bars_calculated=0;
//+——————————————————————+
//| カスタム指標を初期化する関数                                            |
//+——————————————————————+
int OnInit()
{
//— 配列の指標バッファへの割り当て
SetIndexBuffer(0,iStdDevBuffer,INDICATOR_DATA);
//— シフトを設定
PlotIndexSetInteger(0,PLOT_SHIFT,ma_shift);
//— 指標が描画するシンボルを決める
name=symbol;
//— 左右のスペースを削する
StringTrimRight(name);
StringTrimLeft(name);
//—「name」文字列の長さがゼロになった場合
if(StringLen(name)==0)
{
//— 指標が接続されているチャートのシンボルを取る
name=_Symbol;
}
//— 指標ハンドルを作成する
if(type==Call_iStdDev)
handle=iStdDev(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_STDDEV,4,pars);
}
//— ハンドルが作成されなかった場合
if(handle==INVALID_HANDLE)
{
//— 失敗した事実とエラーコードを出力する
PrintFormat(“Failed to create handle of the iStdDev indicator for the symbol %s/%s, error code %d”,
name,
EnumToString(period),
GetLastError());
//— 指標が早期に中止された
return(INIT_FAILED);
}
//— 標準偏差指標が計算された銘柄/時間軸を表示
short_name=StringFormat(“iStdDev(%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[])
{
//— iStdDev 指標から複製された値の数
int values_to_copy;
//— 指標で計算された値の数を決める
int calculated=BarsCalculated(handle);
if(calculated<=0)
{
PrintFormat(“BarsCalculated() returned %d, error code %d”,calculated,GetLastError());
return(0);
}
//— これが指標計算の初めであるか iStdDev 指標の値の数が変更した
//—または、2 つ以上のバーの指標の計算が必要である場合(価格履歴で何かが変更された)
if(prev_calculated==0 || calculated!=bars_calculated || rates_total>prev_calculated+1)
{
//— iStdDevBuffer 配列が銘柄/期間で iStdDev 指標の値の数より大きい場合、全体のコピーはしない
//— 他の場合、指標バッファサイズより少ない量をコピーをする
if(calculated>rates_total) values_to_copy=rates_total;
else                       values_to_copy=calculated;
}
else
{
//— これは初回の計算ではなく、
//— 前回の OnCalculate() から、一以上のバーが加えられてない。
values_to_copy=(rates_total-prev_calculated)+1;
}
//— 配列を標準偏差指標の値で記入
//— FillArrayFromBuffer が false を返した場合、情報の準備が終わっていないので操作を終了する
if(!FillArrayFromBuffer(iStdDevBuffer,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);
}
//+——————————————————————+
//| iStdDev 指標から指標バッファを記入する                                    |
//+——————————————————————+
bool FillArrayFromBuffer(double &std_buffer[], // 標準偏差線の指標バッファ
int std_shift,         // 標準偏差線のシフト
int ind_handle,       // iStdDev 指標ハンドル
int amount             // 複製された値の数

{
//— エラーコードをリセットする
ResetLastError();
//— インデックス0 を持つ指標バッファの値で iStdDevBuffer 配列の一部を記入する
if(CopyBuffer(ind_handle,0,-std_shift,amount,std_buffer)<0)
{
//— 複製が失敗したら、エラーコードを出す
PrintFormat(“Failed to copy data from the iStdDev indicator, error code %d”,GetLastError());
//— ゼロ結果で終了。 指標は計算されていないと見なされる
return(false);
}
//— 全てが成功
return(true);
}
//+——————————————————————+
//| 指標初期化解除関数                                                  |
//+——————————————————————+
void OnDeinit(const int reason)
{
//— 指標の削除後チャートをクリアする
Comment(“”);
}

iStochastic

この関数は Stochastic Oscillator(ストキャスティックス)指標のハンドルを返します。

int  iStochastic(
string          symbol,          // 銘柄名
ENUM_TIMEFRAMES  period,          // 期間
int              Kperiod,        // K期間(計算に使用されるバーの数)
int              Dperiod,        // D期間(初めの平滑化の期間)
int              slowing,        // 最終の平滑化
ENUM_MA_METHOD  ma_method,      // 平滑化の種類
ENUM_STO_PRICE  price_field      // 確率論的計算方法
);

パラメータ

symbol

[in] データが指標計算に使用される有価証券の銘柄名(NULL は現在のシンボル)

period

[in] 期間の値は ENUM_TIMEFRAMES 列挙の値の 1 つで、0 は現在の時間軸の意味です。

Kperiod

[in]  %K 線計算の平均期間(バーの数)

Dperiod

[in]  %D 線計算の平均期間(バーの数)

slowing

[in]  スロー値

ma_method

[in]  平均化の方法ENUM_MA_METHOD 値のいずれか

price_field

[in]  計算に使用される価格選択のパラメータENUM_STO_PRICE 値のいずれか

戻り値

指定されたテクニカル指標ハンドル。失敗の場合 INVALID_HANDLE。IndicatorRelease() 関数に指標ハンドルを渡すことによって 、コンピュータメモリを利用されていない指標から解放することが出来ます。

注意事項

バッファ番号は 0 – MAIN_LINE, 1 – SIGNAL_LINE です。

例:

//+——————————————————————+
//|                                             Demo_iStochastic.mq5 |
//|                        Copyright 2011, MetaQuotes Software Corp. |
//|                                             https://www.MQL5.com |
//+——————————————————————+
#property copyright “Copyright 2011, MetaQuotes Software Corp.”
#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 iStochastic 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 the other parameters are similar to the standard Stochastic Oscillator.”

#property indicator_separate_window
#property indicator_buffers 2
#property indicator_plots   2
//— ストキャスティックスプロット
#property indicator_label1 “Stochastic”
#property indicator_type1   DRAW_LINE
#property indicator_color1  clrLightSeaGreen
#property indicator_style1 STYLE_SOLID
#property indicator_width1  1
//— シグナルプロット
#property indicator_label2 “Signal”
#property indicator_type2   DRAW_LINE
#property indicator_color2  clrRed
#property indicator_style2 STYLE_SOLID
#property indicator_width2  1
//— 指標値を制限する
#property indicator_minimum 0
#property indicator_maximum 100
//— 指標ウィンドウの水平レベル
#property indicator_level1  -100.0
#property indicator_level2  100.0
//+——————————————————————+
//| 作成を処理する方法の列挙                                              |
//+——————————————————————+
enum Creation
{
Call_iStochastic,       // use iStochastic を使用する
Call_IndicatorCreate   // IndicatorCreateを使用する
};
//— 入力パラメータ
input Creation             type=Call_iStochastic;     // 関数の種類
input int                  Kperiod=5;                 // K 期間(計算に使用されるバーの数)
input int                  Dperiod=3;                 // D 期間(主要な平滑化の期間)
input int                  slowing=3;                 // 最終平滑化期間 
input ENUM_MA_METHOD       ma_method=MODE_SMA;       // 平滑化の種類  
input ENUM_STO_PRICE       price_field=STO_LOWHIGH;   // 確率の計算方法
input string               symbol=” “;               // シンボル
input ENUM_TIMEFRAMES     period=PERIOD_CURRENT;     // 時間軸
//— 指標バッファ
double         StochasticBuffer[];
double         SignalBuffer[];
//— iStochastic 指標ハンドルを格納する変数
int    handle;
//— 格納に使用される変数
string name=symbol;
//— チャートでの指標名
string short_name;
//— ストキャスティックスー指標に値の数を保存
int    bars_calculated=0;
//+——————————————————————+
//| カスタム指標を初期化する関数                                            |
//+——————————————————————+
int OnInit()
{
//— 配列の指標バッファへの割り当て
SetIndexBuffer(0,StochasticBuffer,INDICATOR_DATA);
SetIndexBuffer(1,SignalBuffer,INDICATOR_DATA);
//— 指標が描画するシンボルを決める
name=symbol;
//— 左右のスペースを削する
StringTrimRight(name);
StringTrimLeft(name);
//—「name」文字列の長さがゼロになった場合
if(StringLen(name)==0)
{
//— 指標が接続されているチャートのシンボルを取る
name=_Symbol;
}
//— 指標ハンドルを作成する
if(type==Call_iStochastic)
handle=iStochastic(name,period,Kperiod,Dperiod,slowing,ma_method,price_field);
else
{
//— 構造体を指標のパラメータで記入    
MqlParam pars[5];
//— 計算の K 期間
pars[0].type=TYPE_INT;
pars[0].integer_value=Kperiod;
//— 主要な平滑化の D 期間
pars[1].type=TYPE_INT;
pars[1].integer_value=Dperiod;
//— 最後の平滑化の K 期間
pars[2].type=TYPE_INT;
pars[2].integer_value=slowing;
//— 平滑化の種類
pars[3].type=TYPE_INT;
pars[3].integer_value=ma_method;
//— 確率の計算方法
pars[4].type=TYPE_INT;
pars[4].integer_value=price_field;
handle=IndicatorCreate(name,period,IND_STOCHASTIC,5,pars);
}
//— ハンドルが作成されなかった場合
if(handle==INVALID_HANDLE)
{
//— 失敗した事実とエラーコードを出力する
PrintFormat(“Failed to create handle of the iStochastic indicator for the symbol %s/%s, error code %d”,
name,
EnumToString(period),
GetLastError());
//— 指標が早期に中止された
return(INIT_FAILED);
}
//— ストキャスティックスーが計算された銘柄/時間軸を表示
short_name=StringFormat(“iStochastic(%s/%s, %d, %d, %d, %s, %s)”,name,EnumToString(period),
Kperiod,Dperiod,slowing,EnumToString(ma_method),EnumToString(price_field));
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[])
{
//— iStochastic 指標から複製された値の数
int values_to_copy;
//— 指標で計算された値の数を決める
int calculated=BarsCalculated(handle);
if(calculated<=0)
{
PrintFormat(“BarsCalculated() returned %d, error code %d”,calculated,GetLastError());
return(0);
}
//— これが指標計算の初めであるか iStochastic 指標の値の数が変更した
//—または、2 つ以上のバーの指標の計算が必要である場合(価格履歴で何かが変更された)
if(prev_calculated==0 || calculated!=bars_calculated || rates_total>prev_calculated+1)
{
//— StochasticBuffer 配列が銘柄/期間で iStochastic 指標の値の数より大きい場合、全体のコピーはしない
//— 他の場合、指標バッファサイズより少ない量をコピーをする
if(calculated>rates_total) values_to_copy=rates_total;
else                       values_to_copy=calculated;
}
else
{
//— これは初回の計算ではなく、
//— 前回の OnCalculate() から、一以上のバーが加えられてない。
values_to_copy=(rates_total-prev_calculated)+1;
}
//— f配列を iStochastic 指標の値で記入
//— FillArraysFromBuffer が false を返した場合、情報の準備が終わっていないので操作を終了する
if(!FillArraysFromBuffers(StochasticBuffer,SignalBuffer,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);
}
//+——————————————————————+
//| iStochastic 指標から指標バッファを記入する                               |
//+——————————————————————+
bool FillArraysFromBuffers(double &main_buffer[],   // ストキャスティックスー値の指標バッファ
double &signal_buffer[], // シグナル線の指標バッファ
int ind_handle,           // iStochastic 指標ハンドル
int amount               // 複製された値の数

{
//— エラーコードをリセットする
ResetLastError();
//— インデックス0 を持つ指標バッファの値で StochasticBuffer 配列の一部を記入する
if(CopyBuffer(ind_handle,MAIN_LINE,0,amount,main_buffer)<0)
{
//— 複製が失敗したら、エラーコードを出す
PrintFormat(“Failed to copy data from the iStochastic indicator, error code %d”,GetLastError());
//— ゼロ結果で終了。 指標は計算されていないと見なされる
return(false);
}
//— インデックス 1 を持つ指標バッファの値で SignalBuffer 配列の一部を記入する
if(CopyBuffer(ind_handle,SIGNAL_LINE,0,amount,signal_buffer)<0)
{
//— 複製が失敗したら、エラーコードを出す
PrintFormat(“Failed to copy data from the iStochastic indicator, error code %d”,GetLastError());
//— ゼロ結果で終了。 指標は計算されていないと見なされる
return(false);
}
//— 全てが成功
return(true);
}
//+——————————————————————+
//| 指標初期化解除関数                                                  |
//+——————————————————————+
void OnDeinit(const int reason)
{
//— 指標の削除後チャートをクリアする
Comment(“”);
}

iTEMA

この関数は Triple Exponential Moving Average 指標ハンドルを返します。バッファは 1 つです。

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

パラメータ

symbol

[in] データが指標計算に使用される有価証券の銘柄名(NULL は現在のシンボル)

period

[in] 期間の値は ENUM_TIMEFRAMES 列挙の値の 1 つで、0 は現在の時間軸の意味です。

ma_period

[in]  計算の平均期間(バーの数)

ma_shift

[in]  価格チャートに相対した指標のシフト

applied_price

[in]  使用される価格。ENUM_APPLIED_PRICE 価格定数のいずれか、または別の指標ハンドル。

戻り値

指定されたテクニカル指標ハンドル。失敗の場合 INVALID_HANDLE。IndicatorRelease() 関数に指標ハンドルを渡すことによって 、コンピュータメモリを利用されていない指標から解放することが出来ます。

例:

//+——————————————————————+
//|                                                   Demo_iTEMA.mq5 |
//|                        Copyright 2011, MetaQuotes Software Corp. |
//|                                             https://www.MQL5.com |
//+——————————————————————+
#property copyright “Copyright 2011, MetaQuotes Software Corp.”
#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 iTEMA 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 the other parameters are similar to the standard Triple Exponential Moving Average.”

#property indicator_chart_window
#property indicator_buffers 1
#property indicator_plots   1
//— iTEMA プロット
#property indicator_label1 “iTEMA”
#property indicator_type1   DRAW_LINE
#property indicator_color1  clrRed
#property indicator_style1 STYLE_SOLID
#property indicator_width1  1
//+——————————————————————+
//| 作成を処理する方法の列挙                                              |
//+——————————————————————+
enum Creation
{
Call_iTEMA,             // iTEMA を使用する
Call_IndicatorCreate   // IndicatorCreateを使用する
};
//— 入力パラメータ
input Creation             type=Call_iTEMA;           // 関数の種類
input int                  ma_period=14;             // 平均期間
input int                  ma_shift=0;               // シフト
input ENUM_APPLIED_PRICE   applied_price=PRICE_CLOSE; // 価格の種類
input string               symbol=” “;               // シンボル
input ENUM_TIMEFRAMES     period=PERIOD_CURRENT;     // 時間軸
//— 指標バッファ
double         iTEMABuffer[];
//— iTEMA 指標ハンドルを格納する変数
int    handle;
//— 格納に使用される変数
string name=symbol;
//— チャートでの指標名
string short_name;
//— Triple Exponential Moving Average 指標に値の数を保存
int    bars_calculated=0;
//+——————————————————————+
//| カスタム指標を初期化する関数                                            |
//+——————————————————————+
int OnInit()
{
//— 配列の指標バッファへの割り当て
SetIndexBuffer(0,iTEMABuffer,INDICATOR_DATA);
//— シフトを設定
PlotIndexSetInteger(0,PLOT_SHIFT,ma_shift);
//— 指標が描画するシンボルを決める
name=symbol;
//— 左右のスペースを削する
StringTrimRight(name);
StringTrimLeft(name);
//—「name」文字列の長さがゼロになった場合
if(StringLen(name)==0)
{
//— 指標が接続されているチャートのシンボルを取る
name=_Symbol;
}
//— 指標ハンドルを作成する
if(type==Call_iTEMA)
handle=iTEMA(name,period,ma_period,ma_shift,applied_price);
else
{
//— 構造体を指標のパラメータで記入    
MqlParam pars[3];
//— 期間
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=applied_price;
handle=IndicatorCreate(name,period,IND_TEMA,3,pars);
}
//— ハンドルが作成されなかった場合
if(handle==INVALID_HANDLE)
{
//— 失敗した事実とエラーコードを出力する
PrintFormat(“Failed to create handle of the iTEMA indicator for the symbol %s/%s, error code %d”,
name,
EnumToString(period),
GetLastError());
//— 指標が早期に中止された
return(INIT_FAILED);
}
//— Triple Exponential Moving Average 指標が計算された銘柄/時間軸を表示
short_name=StringFormat(“iTEMA(%s/%s, %d, %d, %s)”,name,EnumToString(period),
ma_period,ma_shift,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[])
{
//— iTEMA 指標から複製された値の数r
int values_to_copy;
//— 指標で計算された値の数を決める
int calculated=BarsCalculated(handle);
if(calculated<=0)
{
PrintFormat(“BarsCalculated() returned %d, error code %d”,calculated,GetLastError());
return(0);
}
//— これが指標計算の初めであるか iTEMA 指標の値の数が変更した
//—または、2 つ以上のバーの指標の計算が必要である場合(価格履歴で何かが変更された)
if(prev_calculated==0 || calculated!=bars_calculated || rates_total>prev_calculated+1)
{
//— iTEMABuffer 配列が銘柄/期間で iTEMA 指標の値の数より大きい場合、全体のコピーはしない
//— 他の場合、指標バッファサイズより少ない量をコピーをする
if(calculated>rates_total) values_to_copy=rates_total;
else                       values_to_copy=calculated;
}
else
{
//— これは初回の計算ではなく、
//— 前回の OnCalculate() から、一以上のバーが加えられてない。
values_to_copy=(rates_total-prev_calculated)+1;
}
//— 配列をTriple Exponential Moving Average 指標の値で記入
//— FillArrayFromBuffer が false を返した場合、情報の準備が終わっていないので操作を終了する
if(!FillArrayFromBuffer(iTEMABuffer,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);
//— Triple Exponential Moving Average 指標の値の数を覚える
bars_calculated=calculated;
//— prev_calculated 値を次の関数呼び出しのために返す
return(rates_total);
}
//+——————————————————————+
//| iTEMA 指標から指標バッファを記入する                                      |
//+——————————————————————+
bool FillArrayFromBuffer(double &tema_buffer[], // Triple Exponential Moving Average 値の指標バッファ
int t_shift,           // 線のシフト
int ind_handle,       // iTEMA 指標ハンドル
int amount             // 複製された値の数
&nbnbsp;                     )
{
//— エラーコードをリセットする
ResetLastError();
//— インデックス0 を持つ指標バッファの値で iTEMABuffer 配列の一部を記入する
if(CopyBuffer(ind_handle,0,-t_shift,amount,tema_buffer)<0)
{
//— 複製が失敗したら、エラーコードを出す
PrintFormat(“Failed to copy data from the iTEMA indicator, error code %d”,GetLastError());
//— ゼロ結果で終了。 指標は計算されていないと見なされる
return(false);
}
//— 全てが成功
return(true);
}
//+——————————————————————+
//| 指標初期化解除関数                                                  |
//+——————————————————————+
void OnDeinit(const int reason)
{
//— 指標の削除後チャートをクリアする
Comment(“”);
}

iTriX

この関数はTriple Exponential Moving Averages Oscillator 指標ハンドルを返します。バッファは 1 つです。

int  iTriX(
string              symbol,            // 銘柄名
ENUM_TIMEFRAMES    period,            // 期間
int                ma_period,        // 平均期間
ENUM_APPLIED_PRICE  applied_price      // 価格の種類かハンドル
);

パラメータ

symbol

[in] データが指標計算に使用される有価証券の銘柄名(NULL は現在のシンボル)

period

[in] 期間の値は ENUM_TIMEFRAMES 列挙の値の 1 つで、0 は現在の時間軸の意味です。

ma_period

[in]  計算の平均期間(バーの数)

applied_price

[in]  使用される価格。ENUM_APPLIED_PRICE 価格定数のいずれか、または別の指標ハンドル。

戻り値

指定されたテクニカル指標ハンドル。失敗の場合 INVALID_HANDLE。IndicatorRelease() 関数に指標ハンドルを渡すことによって 、コンピュータメモリを利用されていない指標から解放することが出来ます。

例:

//+——————————————————————+
//|                                                   Demo_iTriX.mq5 |
//|                        Copyright 2011, MetaQuotes Software Corp. |
//|                                             https://www.MQL5.com |
//+——————————————————————+
#property copyright “Copyright 2011, MetaQuotes Software Corp.”
#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 iTriX 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 indicator_separate_window
#property indicator_buffers 1
#property indicator_plots   1
//— iTriX プロット
#property indicator_label1 “iTriX”
#property indicator_type1   DRAW_LINE
#property indicator_color1  clrRed
#property indicator_style1 STYLE_SOLID
#property indicator_width1  1
//+——————————————————————+
//| 作成を処理する方法の列挙                                              |
//+——————————————————————+
enum Creation
{
Call_iTriX,             // iTriX を使用する
Call_IndicatorCreate   // IndicatorCreateを使用する
};
//— 入力パラメータ
input Creation             type=Call_iTriX;           // 関数の種類
input int                  ma_period=14;             // 期間
input ENUM_APPLIED_PRICE   applied_price=PRICE_CLOSE; // 価格の種類
input string               symbol=” “;               // シンボル
input ENUM_TIMEFRAMES     period=PERIOD_CURRENT;     // 時間軸
//— 指標バッファ
double         iTriXBuffer[];
//— iTriX 指標ハンドルを格納する変数
int    handle;
//— 格納に使用される変数
string name=symbol;
//— チャートでの指標名
string short_name;
//— Triple Exponential Moving Averages Oscillator 指標に値の数を保存
int    bars_calculated=0;
//+——————————————————————+
//| カスタム指標を初期化する関数                                            |
//+——————————————————————+
int OnInit()
{
//— 配列の指標バッファへの割り当て
SetIndexBuffer(0,iTriXBuffer,INDICATOR_DATA);
//— 指標が描画するシンボルを決める
name=symbol;
//— 左右のスペースを削する
StringTrimRight(name);
StringTrimLeft(name);
//—「name」文字列の長さがゼロになった場合
if(StringLen(name)==0)
{
//— 指標が接続されているチャートのシンボルを取る
name=_Symbol;
}
//— 指標ハンドルを作成する
if(type==Call_iTriX)
handle=iTriX(name,period,ma_period,applied_price);
else
{
//— 構造体を指標のパラメータで記入    
MqlParam pars[2];
//— 期間
pars[0].type=TYPE_INT;
pars[0].integer_value=ma_period;
//— 価格の種類
pars[1].type=TYPE_INT;
pars[1].integer_value=applied_price;
handle=IndicatorCreate(name,period,IND_TRIX,2,pars);
}
//— ハンドルが作成されなかった場合
if(handle==INVALID_HANDLE)
{
//— 失敗した事実とエラーコードを出力する
PrintFormat(“Failed to create handle of the iTriX indicator for the symbol %s/%s, error code %d”,
name,
EnumToString(period),
GetLastError());
//— 指標が早期に中止された
return(INIT_FAILED);
}
//— Triple Exponential Moving Averages Oscillator 指標が計算された銘柄/時間軸を表示
short_name=StringFormat(“iTriX(%s/%s, %d, %s)”,name,EnumToString(period),
ma_period,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[])
{
//— iTriX 指標から複製された値の数
int values_to_copy;
//— 指標で計算された値の数を決める
int calculated=BarsCalculated(handle);
if(calculated<=0)
{
PrintFormat(“BarsCalculated() returned %d, error code %d”,calculated,GetLastError());
return(0);
}
//— これが指標計算の初めであるか iTriX 指標の値の数が変更した
//—または、2 つ以上のバーの指標の計算が必要である場合(価格履歴で何かが変更された)
if(prev_calculated==0 || calculated!=bars_calculated || rates_total>prev_calculated+1)
{
//— iTriXBuffer 配列が銘柄/期間でiTriX 指標の値の数より大きい場合、全体のコピーはしない
//— 他の場合、指標バッファサイズより少ない量をコピーをする
if(calculated>rates_total) values_to_copy=rates_total;
else                       values_to_copy=calculated;
}
else
{
//— これは初回の計算ではなく、
//— 前回の OnCalculate() から、一以上のバーが加えられてない。
values_to_copy=(rates_total-prev_calculated)+1;
}
//— Triple Exponential Moving Averages Oscillator 指標の値で記入
//— FillArrayFromBuffer が false を返した場合、情報の準備が終わっていないので操作を終了する
if(!FillArrayFromBuffer(iTriXBuffer,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);
//— Triple Exponential Moving Averages Oscillator 指標の値の数を覚える
bars_calculated=calculated;
//— prev_calculated 値を次の関数呼び出しのために返す
return(rates_total);
}
//+——————————————————————+
//| iTriX 指標から指標バッファを記入する                                      |
//+——————————————————————+
bool FillArrayFromBuffer(double &trix_buffer[], // Triple Exponential Moving Averages Oscillator 値の指標バッファ
int ind_handle,       // iTriX 指標ハンドル
int amount             // 複製された値の数

{
//— エラーコードをリセットする
ResetLastError();
//— インデックス0 を持つ指標バッファの値で iTriXBuffer 配列の一部を記入する
if(CopyBuffer(ind_handle,0,0,amount,trix_buffer)<0)
{
//— 複製が失敗したら、エラーコードを出す
PrintFormat(“Failed to copy data from the iTriX indicator, error code %d”,GetLastError());
//— ゼロ結果で終了。 指標は計算されていないと見なされる
return(false);
}
//— 全てが成功
return(true);
}
//+——————————————————————+
//| 指標初期化解除関数                                                  |
//+——————————————————————+
void OnDeinit(const int reason)
{
//— 指標の削除後チャートをクリアする
Comment(“”);
}

iWPR

この関数は Larry Williams’ Percent Range(ラリーウィリアムパーセントレンジ)指標のハンドルを返します。バッファは 1 つです。

int  iWPR(
string          symbol,          // 銘柄名
ENUM_TIMEFRAMES  period,          // 期間
int              calc_period      // 平均期間
);

パラメータ

symbol

[in] データが指標計算に使用される有価証券の銘柄名(NULL は現在のシンボル)

period

[in] 期間の値は ENUM_TIMEFRAMES 列挙の値の 1 つで、0 は現在の時間軸の意味です。

calc_period

[in]  指標計算の平均期間(バーの数)

戻り値

指定されたテクニカル指標ハンドル。失敗の場合 INVALID_HANDLE。IndicatorRelease() 関数に指標ハンドルを渡すことによって 、コンピュータメモリを利用されていない指標から解放することが出来ます。

例:

//+——————————————————————+
//|                                                    Demo_iWPR.mq5 |
//|                        Copyright 2011, MetaQuotes Software Corp. |
//|                                             https://www.MQL5.com |
//+——————————————————————+
#property copyright “Copyright 2011, MetaQuotes Software Corp.”
#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 iWPR 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 indicator_separate_window
#property indicator_buffers 1
#property indicator_plots   1
//— iWPR プロット
#property indicator_label1 “iWPR”
#property indicator_type1   DRAW_LINE
#property indicator_color1  clrCyan
#property indicator_style1 STYLE_SOLID
#property indicator_width1  1
//— 指標値を制限する
#property indicator_minimum -100
#property indicator_maximum 0
//— 指標ウィンドウの水平レベル
#property indicator_level1  -20.0
#property indicator_level2  -80.0
//+——————————————————————+
//| 作成を処理する方法の列挙                                              |
//+——————————————————————+
enum Creation
{
Call_iWPR,             // iWPRを使用する
Call_IndicatorCreate   // IndicatorCreateを使用する
};
//— 入力パラメータ
input Creation             type=Call_iWPR;           // 関数の種類
input int                  calc_period=14;           // 期間
input string               symbol=” “;               // シンボル
input ENUM_TIMEFRAMES     period=PERIOD_CURRENT;     // 時間軸
//— 指標バッファ
double         iWPRBuffer[];
//— iWPR 指標ハンドルを格納する変数
int    handle;
//— 格納に使用される変数
string name=symbol;
//— チャートでの指標名
string short_name;
//— ラリーウィリアムパーセントレンジ 指標に値の数を保存
int    bars_calculated=0;
//+——————————————————————+
//| カスタム指標を初期化する関数                                            |
//+——————————————————————+
int OnInit()
{
//— 配列の指標バッファへの割り当て
SetIndexBuffer(0,iWPRBuffer,INDICATOR_DATA);
//— 指標が描画するシンボルを決める
name=symbol;
//— 左右のスペースを削する
StringTrimRight(name);
StringTrimLeft(name);
//—「name」文字列の長さがゼロになった場合
if(StringLen(name)==0)
{
//— 指標が接続されているチャートのシンボルを取る
name=_Symbol;
}
//— 指標ハンドルを作成する
if(type==Call_iWPR)
handle=iWPR(name,period,calc_period);
else
{
//— 構造体を指標のパラメータで記入    
MqlParam pars[1];
//— 期間
pars[0].type=TYPE_INT;
pars[0].integer_value=calc_period;
handle=IndicatorCreate(name,period,IND_WPR,1,pars);
}
//— ハンドルが作成されなかった場合
if(handle==INVALID_HANDLE)
{
//— 失敗した事実とエラーコードを出力する
PrintFormat(“Failed to create handle of the iWPR indicator for the symbol %s/%s, error code %d”,
name,
EnumToString(period),
GetLastError());
//— 指標が早期に中止された
return(INIT_FAILED);
}
//— ウィリアムパーセントレンジ 指標が計算された銘柄/時間軸を表示
short_name=StringFormat(“iWPR(%s/%s, %d)”,name,EnumToString(period),calc_period);
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[])
{
//— iWPR 指標から複製された値の数
int values_to_copy;
//— 指標で計算された値の数を決める
int calculated=BarsCalculated(handle);
if(calculated<=0)
{
PrintFormat(“BarsCalculated() returned %d, error code %d”,calculated,GetLastError());
return(0);
}
//— これが指標計算の初めであるか iWPR 指標の値の数が変更した
//—または、2 つ以上のバーの指標の計算が必要である場合(価格履歴で何かが変更された)
if(prev_calculated==0 || calculated!=bars_calculated || rates_total>prev_calculated+1)
{
//— iiWPRBuffer 配列が銘柄/期間で iWPR 指標の値の数より大きい場合、全体のコピーはしない
//— 他の場合、指標バッファサイズより少ない量をコピーをする
if(calculated>rates_total) values_to_copy=rates_total;
else                       values_to_copy=calculated;
}
else
{
//— これは初回の計算ではなく、
//— 前回の OnCalculate() から、一以上のバーが加えられてない。
values_to_copy=(rates_total-prev_calculated)+1;
}
//—配列をウィリアムパーセントレンジ 指標の値で記入
//— FillArrayFromBuffer が false を返した場合、情報の準備が終わっていないので操作を終了する
if(!FillArrayFromBuffer(iWPRBuffer,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);
}
//+——————————————————————+
//| iWPR 指標から指標バッファを記入する                                       |
//+——————————————————————+
bool FillArrayFromBuffer(double &wpr_buffer[], // ウィリアムパーセントレンジ 値の指標バッファ
int ind_handle,       // iWPR 指標ハンドルr
int amount             // 複製された値の数

{
//— エラーコードをリセットする
ResetLastError();
//— インデックス0 を持つ指標バッファの値で iWPRBuffer 配列の一部を記入する
if(CopyBuffer(ind_handle,0,0,amount,wpr_buffer)<0)
{
//— 複製が失敗したら、エラーコードを出す
PrintFormat(“Failed to copy data from the iWPR indicator, error code %d”,GetLastError());
//— ゼロ結果で終了。 指標は計算されていないと見なされる
return(false);
}
//— 全てが成功
return(true);
}
//+——————————————————————+
//| 指標初期化解除関数                                                  |
//+——————————————————————+
void OnDeinit(const int reason)
{
//— 指標の削除後チャートをクリアする
Comment(“”);
}

iVIDyA

この関数は Variable Index Dynamic Average 指標ハンドルを返します。バッファは 1 つです。

int  iVIDyA(
string              symbol,            // 銘柄名
ENUM_TIMEFRAMES    period,            // 期間
int                cmo_period,        // Chandeモメンタムの期間 Momentum
int                ema_period,        // EMA 平滑期間
int                ma_shift,          // 価格チャートでの水平シフト
ENUM_APPLIED_PRICE  applied_price      // 価格の種類かハンドル
);

パラメータ

symbol

[in] データが指標計算に使用される有価証券の銘柄名(NULL は現在のシンボル)

period

[in] 期間の値は ENUM_TIMEFRAMES 列挙の値の 1 つで、0 は現在の時間軸の意味です。

cmo_period

[in]  Chande モメンタムオシレーター計算の期間(バーの数)

ema_period

[in]  平滑化係数計算の EMA 期間(バーの数)

ma_shift

[in]  価格チャートに相対した指標のシフト

applied_price

[in]  使用される価格。ENUM_APPLIED_PRICE 価格定数のいずれか、または別の指標ハンドル。

戻り値

指定されたテクニカル指標ハンドル。失敗の場合 INVALID_HANDLE。IndicatorRelease() 関数に指標ハンドルを渡すことによって 、コンピュータメモリを利用されていない指標から解放することが出来ます。

例:

//+——————————————————————+
//|                                                  Demo_iVIDyA.mq5 |
//|                        Copyright 2011, MetaQuotes Software Corp. |
//|                                             https://www.MQL5.com |
//+——————————————————————+
#property copyright “Copyright 2011, MetaQuotes Software Corp.”
#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 iVIDyA 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 Variable Index Dynamic Average.”

#property indicator_chart_window
#property indicator_buffers 1
#property indicator_plots   1
//— iVIDyA プロット
#property indicator_label1 “iVIDyA”
#property indicator_type1   DRAW_LINE
#property indicator_color1  clrBlue
#property indicator_style1 STYLE_SOLID
#property indicator_width1  1
//+——————————————————————+
//| 作成を処理する方法の列挙                                              |
//+——————————————————————+
enum Creation
{
Call_iVIDyA,           // iVIDyA を使用する
Call_IndicatorCreate   // IndicatorCreateを使用する
};
//— 入力パラメータ
input Creation             type=Call_iVIDyA;         // 関数の種類
input int                  cmo_period=15;             // Chande モメンタム期間
input int                  ema_period=12;             // 平滑化係数の期間
input int                  ma_shift=0;               // シフト
input ENUM_APPLIED_PRICE   applied_price=PRICE_CLOSE; // 価格の種類
input string               symbol=” “;               // シンボル
input ENUM_TIMEFRAMES     period=PERIOD_CURRENT;     // 時間軸
//— 指標バッファ
double         iVIDyABuffer[];
//— iVIDyA 指標ハンドルを格納する変数
int    handle;
//— 格納に使用される変数
string name=symbol;
//— チャートでの指標名
string short_name;
//— Variable Index Dynamic Average 指標に値の数を保存
int    bars_calculated=0;
//+——————————————————————+
//| カスタム指標を初期化する関数                                            |
//+——————————————————————+
int OnInit()
{
//— 配列の指標バッファへの割り当て
SetIndexBuffer(0,iVIDyABuffer,INDICATOR_DATA);
//— シフトを設定
PlotIndexSetInteger(0,PLOT_SHIFT,ma_shift);
//— 指標が描画するシンボルを決める
name=symbol;
//— 左右のスペースを削する
StringTrimRight(name);
StringTrimLeft(name);
//—「name」文字列の長さがゼロになった場合
if(StringLen(name)==0)
{
//— 指標が接続されているチャートのシンボルを取る
name=_Symbol;
}
//— 指標ハンドルを作成する
if(type==Call_iVIDyA)
handle=iVIDyA(name,period,cmo_period,ema_period,ma_shift,applied_price);
else
{
//— 構造体を指標のパラメータで記入    
MqlParam pars[4];
//— Chande モメンタム期間
pars[0].type=TYPE_INT;
pars[0].integer_value=cmo_period;
//— 平滑化係数の期間
pars[1].type=TYPE_INT;
pars[1].integer_value=ema_period;
//— シフト
pars[2].type=TYPE_INT;
pars[2].integer_value=ma_shift;
//— 価格の種類
pars[3].type=TYPE_INT;
pars[3].integer_value=applied_price;
handle=IndicatorCreate(name,period,IND_VIDYA,4,pars);
}
//— ハンドルが作成されなかった場合
if(handle==INVALID_HANDLE)
{
//— 失敗した事実とエラーコードを出力する
PrintFormat(“Failed to create handle of the iVIDyA indicator for the symbol %s/%s, error code %d”,
name,
EnumToString(period),
GetLastError());
//— 指標が早期に中止された
return(INIT_FAILED);
}
//— Variable Index Dynamic Average 指標が計算された銘柄/時間軸を表示
short_name=StringFormat(“iVIDyA(%s/%s, %d, %d, %d, %s)”,name,EnumToString(period),
cmo_period,ema_period,ma_shift,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[])
{
//— iVIDyA 指標から複製された値の数
int values_to_copy;
//— 指標で計算された値の数を決める
int calculated=BarsCalculated(handle);
if(calculated<=0)
{
PrintFormat(“BarsCalculated() returned %d, error code %d”,calculated,GetLastError());
return(0);
}
//— これが指標計算の初めであるか iVIDyA 指標の値の数が変更した
//—または、2 つ以上のバーの指標の計算が必要である場合(価格履歴で何かが変更された)
if(prev_calculated==0 || calculated!=bars_calculated || rates_total>prev_calculated+1)
{
//— iVIDyABuffer 配列が銘柄/期間でiVIDyA 指標の値の数より大きい場合、全体のコピーはしない
//— 他の場合、指標バッファサイズより少ない量をコピーをする
if(calculated>rates_total) values_to_copy=rates_total;
else                       values_to_copy=calculated;
}
else
{
//— これは初回の計算ではなく、
//— 前回の OnCalculate() から、一以上のバーが加えられてない。
values_to_copy=(rates_total-prev_calculated)+1;
}
//— 配列を Variable Index Dynamic Average 指標の値で記入
//— FillArrayFromBuffer が false を返した場合、情報の準備が終わっていないので操作を終了する
if(!FillArrayFromBuffer(iVIDyABuffer,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);
//— Variable Index Dynamic Average 指標の値の数を覚える
bars_calculated=calculated;
//— prev_calculated 値を次の関数呼び出しのために返す
return(rates_total);
}
//+——————————————————————+
//| iVIDyA 指標から指標バッファを記入する                                     |
//+——————————————————————+
bool FillArrayFromBuffer(double &vidya_buffer[],// Variable Index Dynamic Average 値の指標バッファ
int v_shift,           // 線のシフト
int ind_handle,       // iVIDyA 指標ハンドル
int amount             // 複製された値の数

{
//— エラーコードをリセットする
ResetLastError();
//— インデックス0 を持つ指標バッファの値で iVIDyABuffer 配列の一部を記入する
if(CopyBuffer(ind_handle,0,-v_shift,amount,vidya_buffer)<0)
{
//— 複製が失敗したら、エラーコードを出す
PrintFormat(“Failed to copy data from the iVIDyA indicator, error code %d”,GetLastError());
//— ゼロ結果で終了。 指標は計算されていないと見なされる
return(false);
}
//— 全てが成功
return(true);
}
//+——————————————————————+
//| 指標初期化解除関数                                                  |
//+——————————————————————+
void OnDeinit(const int reason)
{
//— 指標の削除後チャートをクリアする
Comment(“”);
}

iVolumes

この関数は Volumes(ボリューム)指標のハンドルを返します。バッファは 1 つです。

int  iVolumes(
string              symbol,            // 銘柄名
ENUM_TIMEFRAMES      period,            // 期間
ENUM_APPLIED_VOLUME  applied_volume      // 計算に使用するボリュームの種類

パラメータ

symbol

[in] データが指標計算に使用される有価証券の銘柄名(NULL は現在のシンボル)

period

[in] 期間の値は ENUM_TIMEFRAMES 列挙の値の 1 つで、0 は現在の時間軸の意味です。

applied_volume

[in]  使用されるボリューム(ENUM_APPLIED_VOLUME 値のいずれか)

戻り値

指定されたテクニカル指標ハンドル。失敗の場合 INVALID_HANDLE。IndicatorRelease() 関数に指標ハンドルを渡すことによって 、コンピュータメモリを利用されていない指標から解放することが出来ます。

例:

//+——————————————————————+
//|                                                Demo_iVolumes.mq5 |
//|                        Copyright 2011, MetaQuotes Software Corp. |
//|                                             https://www.MQL5.com |
//+——————————————————————+
#property copyright “Copyright 2011, MetaQuotes Software Corp.”
#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 iVolumes 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 indicator_separate_window
#property indicator_buffers 2
#property indicator_plots   1
//— iVolumes プロット
#property indicator_label1 “iVolumes”
#property indicator_type1   DRAW_COLOR_HISTOGRAM
#property indicator_color1  clrGreen, clrRed
#property indicator_style1 STYLE_SOLID
#property indicator_width1  1
//+——————————————————————+
//| 作成を処理する方法の列挙                                              |
//+——————————————————————+
enum Creation
{
Call_iVolumes,         // iVolumesを使用する
Call_IndicatorCreate   // IndicatorCreateを使用する
};
//— 入力パラメータ
input Creation             type=Call_iVolumes;           // 関数の種類
input ENUM_APPLIED_VOLUME  applied_volume=VOLUME_TICK;   // ボリュームの種類
input string               symbol=” “;                   // シンボル
input ENUM_TIMEFRAMES     period=PERIOD_CURRENT;       // 時間軸
//— 指標バッファ
double         iVolumesBuffer[];
double         iVolumesColors[];
//— iVolumes 指標ハンドルを格納する変数
int    handle;
//— 格納に使用される変数
string name=symbol;
//— チャートでの指標名
string short_name;
//— ボリューム指標に値の数を保存
int    bars_calculated=0;
//+——————————————————————+
//| カスタム指標を初期化する関数                                            |
//+——————————————————————+
int OnInit()
{
//— 配列の指標バッファへの割り当て
SetIndexBuffer(0,iVolumesBuffer,INDICATOR_DATA);
SetIndexBuffer(1,iVolumesColors,INDICATOR_COLOR_INDEX);
//— 指標が描画するシンボルを決める
name=symbol;
//— 左右のスペースを削する
StringTrimRight(name);
StringTrimLeft(name);
//—「name」文字列の長さがゼロになった場合
if(StringLen(name)==0)
{
//— 指標が接続されているチャートのシンボルを取る
name=_Symbol;
}
//— 指標ハンドルを作成する
if(type==Call_iVolumes)
handle=iVolumes(name,period,applied_volume);
else
{
//— 構造体を指標のパラメータで記入    
MqlParam pars[1];
//— 価格の種類
pars[0].type=TYPE_INT;
pars[0].integer_value=applied_volume;
handle=IndicatorCreate(name,period,IND_VOLUMES,1,pars);
}
//— ハンドルが作成されなかった場合
if(handle==INVALID_HANDLE)
{
//— 失敗した事実とエラーコードを出力する
PrintFormat(“Failed to create handle of the iVolumes indicator for the symbol %s/%s, error code %d”,
name,
EnumToString(period),
GetLastError());
//— 指標が早期に中止された
return(INIT_FAILED);
}
//— ボリューム指標が計算された銘柄/時間軸を表示
short_name=StringFormat(“iVolumes(%s/%s, %s)”,name,EnumToString(period),EnumToString(applied_volume));
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[])
{
//— iVolumes 指標から複製された値の数
int values_to_copy;
//— 指標で計算された値の数を決める
int calculated=BarsCalculated(handle);
if(calculated<=0)
{
PrintFormat(“BarsCalculated() returned %d, error code %d”,calculated,GetLastError());
return(0);
}
//— これが指標計算の初めであるか iVolumes 指標の値の数が変更した
//—または、2 つ以上のバーの指標の計算が必要である場合(価格履歴で何かが変更された)
if(prev_calculated==0 || calculated!=bars_calculated || rates_total>prev_calculated+1)
{
//— iVolumesBuffer 配列が銘柄/期間で iVolumes 指標の値の数より大きい場合、全体のコピーはしない
//— 他の場合、指標バッファサイズより少ない量をコピーをする
if(calculated>rates_total) values_to_copy=rates_total;
else                       values_to_copy=calculated;
}
else
{
//— これは初回の計算ではなく、
//— 前回の OnCalculate() から、一以上のバーが加えられてない。
values_to_copy=(rates_total-prev_calculated)+1;
}
//— 配列を iVolumes 指標の値で記入
//— FillArraysFromBuffer が false を返した場合、情報の準備が終わっていないので操作を終了する
if(!FillArraysFromBuffers(iVolumesBuffer,iVolumesColors,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);
}
//+——————————————————————+
//| iVolumes 指標から指標バッファを記入する                                   |
//+——————————————————————+
bool FillArraysFromBuffers(double &volume_buffer[],   // ボリューム値の指標バッファ
double &color_buffer[],   // 色の指標バッファ
int ind_handle,           // ボリューム指標ハンドル
int amount                 // 複製された値の数

{
//— エラーコードをリセットする
ResetLastError();
//— インデックス0 を持つ指標バッファの値で iVolumesBuffer 配列の一部を記入する
if(CopyBuffer(ind_handle,0,0,amount,volume_buffer)<0)
{
//— 複製が失敗したら、エラーコードを出す
PrintFormat(“Failed to copy data from the iVolumes indicator, error code %d”,GetLastError());
//— ゼロ結果で終了。 指標は計算されていないと見なされる
return(false);
}
//— インデックス 1 を持つ指標バッファの値で iVolumesColors 配列の一部を記入する
if(CopyBuffer(ind_handle,1,0,amount,color_buffer)<0)
{
//— 複製が失敗したら、エラーコードを出す
PrintFormat(“Failed to copy data from the iVolumes indicator, error code %d”,GetLastError());
//— ゼロ結果で終了。 指標は計算されていないと見なされる
return(false);
}
//— 全てが成功
return(true);
}
//+——————————————————————+
//| 指標初期化解除関数                                                  |
//+——————————————————————+
void OnDeinit(const int reason)
{
//— 指標の削除後チャートをクリアする
Comment(“”);
}

Originally posted 2019-07-30 09:42:34.

Leave a Reply

Your email address will not be published. Required fields are marked *

CAPTCHA


You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code class="" title="" data-url=""> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong> <pre class="" title="" data-url=""> <span class="" title="" data-url="">