IndicatorSetDouble関数の働き・役割
![](https://mqlinvestmentlab.com/wp-content/uploads/2024/07/2ed2ad3ec49ef120dd9ca1929a9160ff-1024x585.webp)
IndicatorSetDouble関数は、特定の指標プロパティに対してdouble型の値を設定するために使用されます。この関数は、カスタムインジケ-タのプロパティを動的に変更する際に特に便利です。
IndicatorSetDouble関数には、プロパティ識別子のみを使用するバージョンと、プロパティ識別子と修飾子の両方を使用するバージョンの2つのバリエーションがあります。修飾子を使用するバージョンでは、特定のレベルプロパティを設定する際に使用されます。
IndicatorSetDouble関数の引数について
![](https://mqlinvestmentlab.com/wp-content/uploads/2024/07/2bb010665837a0c08d42825a84fbf6b3-1024x585.webp)
IndicatorSetDouble関数には、2つの書式があります。それぞれの書式について引数を詳しく説明します。
書式1
bool IndicatorSetDouble(
int prop_id, // 識別子
double prop_value // 設定する値
);
prop_idは、指標プロパティの識別子を指定します。この識別子はENUM_CUSTOMIND_PROPERTY_DOUBLEの値の一つです。
prop_valueは、設定するプロパティの値を指定します。
書式2
bool IndicatorSetDouble(
int prop_id, // 識別子
int prop_modifier, // 修飾子
double prop_value // 設定する値
);
prop_idとprop_valueは、書式1と同様です。
prop_modifierは、指定されたプロパティの修飾子を指定します。修飾子はレベルプロパティのみで必要です。レベルの番号付けは0から始まります。例えば、レベル2のプロパティを設定するには1を指定します。
ENUM_CUSTOMIND_PROPERTY_DOUBLEについて
![](https://mqlinvestmentlab.com/wp-content/uploads/2024/07/1b39e52b9e8c1f4cc3fc3f3170b37acc-1024x585.webp)
ENUM_CUSTOMIND_PROPERTY_DOUBLEとは、IndicatorSetDouble関数で使用される指標プロパティの識別子を定義する列挙型です。これらの識別子を使用して、指標プロパティの値を設定します。各識別子は特定のプロパティを示しており、プロパティ型はすべてdouble型です。
INDICATOR_MINIMUM
プロパティ型:double型
INDICATOR_MINIMUMは、指標ウィンドウの最小サイズを設定するための識別子です。
INDICATOR_MAXIMUM
プロパティ型:double型
INDICATOR_MAXIMUMは、指標ウィンドウの最大サイズを設定するための識別子です。
INDICATOR_LEVELVALUE
プロパティ型:double型
INDICATOR_LEVELVALUEは、レベル値を設定するための識別子です。この識別子を使用する際には、修飾子としてレベル番号を指定します。レベル番号は0から始まります。
IndicatorSetDouble関数の戻り値について
![](https://mqlinvestmentlab.com/wp-content/uploads/2024/07/4527f2730eb722cc8027b173b7297245-1024x585.webp)
IndicatorSetDouble関数の戻り値は、実行結果を示すブール値です。
関数が成功した場合、戻り値はtrueとなります。これは、指定した指標プロパティの値が正しく設定されたことを示します。
一方、関数が失敗した場合、戻り値はfalseとなります。失敗の原因は、無効なプロパティ識別子やプロパティ値の範囲外などが考えられます。この場合、エラーの詳細についてはエキスパートログを確認することが推奨されます。
IndicatorSetDouble関数を使う際の注意点
![](https://mqlinvestmentlab.com/wp-content/uploads/2024/07/a8fd2401d2b11cee8c4ab33230ea0282-1024x585.webp)
プロパティの識別子とその対応する値は、ENUM_CUSTOMIND_PROPERTY_DOUBLEに定義されたものでなければなりません。誤った識別子や値を指定すると、関数は失敗し、戻り値がfalseになります。
propertyディレクティブを使用している場合、プロパティ(修飾子)の番号付けが1から始まる一方で、IndicatorSetDouble関数では0から始まることに注意が必要です。この違いを理解していないと、意図しないレベル値が設定される可能性があります。
レベルプロパティを設定する際、修飾子を正しく指定する必要があります。レベルの番号付けは0から始まり、例えばレベル2のプロパティを設定するには1を指定することが求められます。番号付けが正しくないと、期待したレベル値が反映されません。
例えば、次のように指定します。
scssコードをコピーする// レベル番号は1で指定
#property indicator_level1 50
// レベル1を指定するのに0を使用
IndicatorSetDouble(INDICATOR_LEVELVALUE, 0, 50);
上記の例では、#propertyディレクティブを使用してレベル番号を1で指定していますが、IndicatorSetDouble関数を使用する際には0を使用してレベル1を指定しています。この違いに注意してください。
IndicatorSetDouble関数を使ったサンプルコード
![](https://mqlinvestmentlab.com/wp-content/uploads/2024/07/16c699126f5e9a92553d461f7ae79c18-1024x585.webp)
以下はIndicatorSetDouble関数を使ったサンプルコードになります。
// 指標ウィンドウを別ウィンドウとして設定
#property indicator_separate_window
// 指標ウィンドウの最小値を0に設定
#property indicator_minimum 0
// 指標ウィンドウの最大値を100に設定
#property indicator_maximum 100
// 3つの水平レベルを表示するためのプロパティを設定
#property indicator_level1 25
#property indicator_level2 50
#property indicator_level3 75
// 水平レベルの線の太さを1に設定
#property indicator_levelwidth 1
// 水平レベルの線のスタイルを点線に設定
#property indicator_levelstyle STYLE_DOT
//+------------------------------------------------------------------+
//| カスタム指標を初期化する関数 |
//+------------------------------------------------------------------+
int OnInit()
{
// 水平レベルの説明を設定
// 第一引数は識別子、ここでは水平レベルのテキストを示すINDICATOR_LEVELTEXT
// 第二引数は修飾子、0は最初のレベルを示す
// 第三引数は設定する文字列、最初のレベルに対する説明文
IndicatorSetString(INDICATOR_LEVELTEXT,0,"First Level (index 0)");
// 第二の水平レベルの説明を設定
IndicatorSetString(INDICATOR_LEVELTEXT,1,"Second Level (index 1)");
// 第三の水平レベルの説明を設定
IndicatorSetString(INDICATOR_LEVELTEXT,2,"Third Level (index 2)");
// 指標の短縮名を設定
// 第一引数は識別子、ここでは短縮名を示すINDICATOR_SHORTNAME
// 第二引数は設定する文字列、指標の短縮名
IndicatorSetString(INDICATOR_SHORTNAME,"IndicatorSetDouble() Demo");
// 各水平レベルの色を設定
// 第一引数は識別子、ここでは水平レベルの色を示すINDICATOR_LEVELCOLOR
// 第二引数は修飾子、0は最初のレベルを示す
// 第三引数は設定する色、最初のレベルには青を設定
IndicatorSetInteger(INDICATOR_LEVELCOLOR,0,clrBlue);
// 第二の水平レベルの色を設定、緑を設定
IndicatorSetInteger(INDICATOR_LEVELCOLOR,1,clrGreen);
// 第三の水平レベルの色を設定、赤を設定
IndicatorSetInteger(INDICATOR_LEVELCOLOR,2,clrRed);
// 初期化が成功したことを示すためにINIT_SUCCEEDEDを返す
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[]) // スプレッド配列
{
// ティックカウンタを初期化
static int tick_counter=0;
// 水平レベルの初期値を設定
static double level1=25,level2=50,level3=75;
// 最大値と最小値の初期値を設定
static double max=100,min=0, shift=100;
// ティックカウンタをインクリメント
tick_counter++;
// 10ティックごとにレベル値を反転する
if(tick_counter%10==0)
{
// 水平レベル値を反転
level1=-level1;
level2=-level2;
level3=-level3;
// 最大値と最小値を反転
max-=shift;
min-=shift;
// シフト値を反転
shift=-shift;
// 反転したレベル値を設定
// 第一引数は識別子、ここでは水平レベルの値を示すINDICATOR_LEVELVALUE
// 第二引数は修飾子、0は最初のレベルを示す
// 第三引数は設定する値、反転したlevel1の値
IndicatorSetDouble(INDICATOR_LEVELVALUE,0,level1);
// 第二の水平レベルの値を設定
IndicatorSetDouble(INDICATOR_LEVELVALUE,1,level2);
// 第三の水平レベルの値を設定
IndicatorSetDouble(INDICATOR_LEVELVALUE,2,level3);
// 新しい最大値と最小値を設定
// 第一引数は識別子、ここでは最大値を示すINDICATOR_MAXIMUM
// 第二引数は設定する値、反転したmaxの値
IndicatorSetDouble(INDICATOR_MAXIMUM,max);
// 最小値を設定
// 第一引数は識別子、ここでは最小値を示すINDICATOR_MINIMUM
// 第二引数は設定する値、反転したminの値
IndicatorSetDouble(INDICATOR_MINIMUM,min);
// デバッグ用に設定された最大値と最小値を出力
Print("Set up max = ",max,", min = ",min);
}
// 次回の呼び出しのために計算されたバー数を返す
return(rates_total);
}
少し複雑なので、小分けにして解説していきたいと思います
解説1: プロパティ命令によるインジケータ設定
![](https://mqlinvestmentlab.com/wp-content/uploads/2024/07/a2fd454d5f3af344ac21decc1c0d3a43-1024x585.webp)
// 指標ウィンドウを別ウィンドウとして設定
#property indicator_separate_window
// 指標ウィンドウの最小値を0に設定
#property indicator_minimum 0
// 指標ウィンドウの最大値を100に設定
#property indicator_maximum 100
// 3つの水平レベルを表示するためのプロパティを設定
#property indicator_level1 25
#property indicator_level2 50
#property indicator_level3 75
// 水平レベルの線の太さを1に設定
#property indicator_levelwidth 1
// 水平レベルの線のスタイルを点線に設定
#property indicator_levelstyle STYLE_DOT
【#property indicator_separate_window】
この命令は、インジケータを別ウィンドウに表示することを指定しています。通常の価格チャートとは別の独立したウィンドウにインジケータが表示されます。
【#property indicator_minimum 0】
この命令は、インジケータウィンドウの最小値を0に設定しています。インジケータが表示されるウィンドウの下限を指定することができます。
【#property indicator_maximum 100】
この命令は、インジケータウィンドウの最大値を100に設定しています。インジケータが表示されるウィンドウの上限を指定することができます。
【#property indicator_level1 25】
この命令は、最初の水平レベルを25に設定しています。水平レベルは、インジケータウィンドウに描画される水平線の位置を示します。
【#property indicator_level2 50】
この命令は、第二の水平レベルを50に設定しています。
【#property indicator_level3 75】
この命令は、第三の水平レベルを75に設定しています。
【#property indicator_levelwidth 1】
この命令は、水平レベルの線の太さを1に設定しています。線の太さはピクセル(デジタル画像を構成する最小の単位)単位で指定されます。
【#property indicator_levelstyle STYLE_DOT】
この命令は、水平レベルの線のスタイルを点線に設定しています。点線スタイルは、線が点の連続で描かれることを示します。
解説2: OnInit関数
![](https://mqlinvestmentlab.com/wp-content/uploads/2024/07/e62e7240c7e5d988f98edd2958f339a2-1024x585.webp)
//+------------------------------------------------------------------+
//| カスタム指標を初期化する関数 |
//+------------------------------------------------------------------+
int OnInit()
{
// 水平レベルの説明を設定
// 第一引数は識別子、ここでは水平レベルのテキストを示すINDICATOR_LEVELTEXT
// 第二引数は修飾子、0は最初のレベルを示す
// 第三引数は設定する文字列、最初のレベルに対する説明文
IndicatorSetString(INDICATOR_LEVELTEXT,0,"First Level (index 0)");
// 第二の水平レベルの説明を設定
IndicatorSetString(INDICATOR_LEVELTEXT,1,"Second Level (index 1)");
// 第三の水平レベルの説明を設定
IndicatorSetString(INDICATOR_LEVELTEXT,2,"Third Level (index 2)");
// 指標の短縮名を設定
// 第一引数は識別子、ここでは短縮名を示すINDICATOR_SHORTNAME
// 第二引数は設定する文字列、指標の短縮名
IndicatorSetString(INDICATOR_SHORTNAME,"IndicatorSetDouble() Demo");
// 各水平レベルの色を設定
// 第一引数は識別子、ここでは水平レベルの色を示すINDICATOR_LEVELCOLOR
// 第二引数は修飾子、0は最初のレベルを示す
// 第三引数は設定する色、最初のレベルには青を設定
IndicatorSetInteger(INDICATOR_LEVELCOLOR,0,clrBlue);
// 第二の水平レベルの色を設定、緑を設定
IndicatorSetInteger(INDICATOR_LEVELCOLOR,1,clrGreen);
// 第三の水平レベルの色を設定、赤を設定
IndicatorSetInteger(INDICATOR_LEVELCOLOR,2,clrRed);
// 初期化が成功したことを示すためにINIT_SUCCEEDEDを返す
return(INIT_SUCCEEDED);
}
【OnInit関数】
OnInit関数は、カスタムインジケ-タの初期化時に自動的に呼び出される関数です。この関数では、インジケータの各種設定を行います。
【IndicatorSetString関数】
IndicatorSetString関数は、指定したプロパティに文字列を設定するための関数です。
【IndicatorSetString(INDICATOR_LEVELTEXT,0,”First Level (index 0)”)】
IndicatorSetString関数を使用して、最初の水平レベルの説明を設定しています。第一引数のINDICATOR_LEVELTEXTは、水平レベルのテキストを示す識別子です。第二引数の0は、最初のレベルを示す修飾子です。第三引数の”First Level (index 0)”は、設定する文字列です。
【IndicatorSetString(INDICATOR_LEVELTEXT,1,”Second Level (index 1)”)】
IndicatorSetString関数を使用して、第二の水平レベルの説明を設定しています。修飾子1は、第二のレベルを示します。
【IndicatorSetString(INDICATOR_LEVELTEXT,2,”Third Level (index 2)”)】
IndicatorSetString関数を使用して、第三の水平レベルの説明を設定しています。修飾子2は、第三のレベルを示します。
【IndicatorSetString(INDICATOR_SHORTNAME,”IndicatorSetDouble() Demo”)】
IndicatorSetString関数を使用して、インジケータの短縮名を設定しています。第一引数のINDICATOR_SHORTNAMEは、短縮名を示す識別子です。第二引数の”IndicatorSetDouble() Demo”は、設定する短縮名です。
【IndicatorSetInteger関数】
IndicatorSetInteger関数は、指定したプロパティに整数値を設定するための関数です。
【IndicatorSetInteger(INDICATOR_LEVELCOLOR,0,clrBlue)】
IndicatorSetInteger関数を使用して、最初の水平レベルの色を設定しています。第一引数のINDICATOR_LEVELCOLORは、水平レベルの色を示す識別子です。第二引数の0は、最初のレベルを示す修飾子です。第三引数のclrBlueは、設定する色です。
【IndicatorSetInteger(INDICATOR_LEVELCOLOR,1,clrGreen)】
IndicatorSetInteger関数を使用して、第二の水平レベルの色を設定しています。修飾子1は、第二のレベルを示し、設定する色はclrGreenです。
【IndicatorSetInteger(INDICATOR_LEVELCOLOR,2,clrRed)】
IndicatorSetInteger関数を使用して、第三の水平レベルの色を設定しています。修飾子2は、第三のレベルを示し、設定する色はclrRedです。
【return(INIT_SUCCEEDED)】
return文は、初期化が成功したことを示すためにINIT_SUCCEEDEDを返します。これは、インジケータの初期化が正常に完了したことを示します。
解説3: OnCalculate関数その1
![](https://mqlinvestmentlab.com/wp-content/uploads/2024/07/5ec6398e0aa3f29f61727fdceb6f7776-1024x585.webp)
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[]) // スプレッド配列
{
// ティックカウンタを初期化
static int tick_counter=0;
// 水平レベルの初期値を設定
static double level1=25,level2=50,level3=75;
// 最大値と最小値の初期値を設定
static double max=100,min=0, shift=100;
// ティックカウンタをインクリメント
tick_counter++;
【OnCalculate関数】
OnCalculate関数は、カスタムインジケ-タの計算時に呼び出されるメイン関数です。この関数は、価格データが更新されるたびに実行され、インジケータの計算と更新を行います。
【static int tick_counter=0】
この行は、ティックカウンタを初期化しています。static変数として定義されているため、関数が呼び出されるたびに初期化されず、前回の値が保持されます。
【static double level1=25,level2=50,level3=75】
この行は、水平レベルの初期値を設定しています。level1、level2、level3は、それぞれの水平レベルの初期値を示します。
【static double max=100,min=0, shift=100】
この行は、最大値と最小値の初期値を設定しています。maxは最大値、minは最小値、shiftは値を反転させるためのシフト量を示します。
【tick_counter++】
この行は、ティックカウンタをインクリメントしています。価格データが更新されるたびにtick_counterの値が1増加します。
解説4: OnCalculate関数その2
![](https://mqlinvestmentlab.com/wp-content/uploads/2024/07/5aa9b32151a2e73081338356cae42824-1024x585.webp)
// 10ティックごとにレベル値を反転する
if(tick_counter%10==0)
{
// 水平レベル値を反転
level1=-level1;
level2=-level2;
level3=-level3;
// 最大値と最小値を反転
max-=shift;
min-=shift;
// シフト値を反転
shift=-shift;
【10ティックごとにレベル値を反転する】
この部分のコードでは、ティックカウンタが10の倍数に達するたびに、水平レベル値、最大値と最小値、シフト値を反転させています。
【if(tick_counter%10==0)】
この条件文は、ティックカウンタが10で割り切れる場合に真となります。つまり、ティックカウンタが10の倍数になったときに、以下のブロックが実行されます。
【水平レベル値を反転】
level1=-level1;
level2=-level2;
level3=-level3;
この行では、level1、level2、およびlevel3の符号を反転しています。たとえば、level1の値が25の場合、-level1により値は-25になります。符号を反転することで、正の値が負の値になり、負の値が正の値になります。
【最大値と最小値を反転】
max-=shift;
min-=shift;
ここでは、maxとminの値からshiftの値を引いています。たとえば、最初のmaxの値が100でshiftの値が100の場合、max-=shiftはmaxの値を100から0にします。同様に、minの値は0から-100に変わります。この操作を行うことで、最大値と最小値の範囲が逆転します。
【シフト値を反転】
shift=-shift;
この行では、shiftの符号を反転しています。たとえば、shiftの値が100の場合、-shiftにより値は-100になります。これにより、次回の実行時に最大値と最小値が再び逆転します。
これらの反転操作により、インジケータの水平レベル値と最大値・最小値が定期的に上下に変動し、視覚的に動きのあるインジケータを実現しています。
解説5: OnCalculate関数その3
![](https://mqlinvestmentlab.com/wp-content/uploads/2024/07/85be89957a76f5879ba4d2f0c231c520-1024x585.webp)
// 反転したレベル値を設定
// 第一引数は識別子、ここでは水平レベルの値を示すINDICATOR_LEVELVALUE
// 第二引数は修飾子、0は最初のレベルを示す
// 第三引数は設定する値、反転したlevel1の値
IndicatorSetDouble(INDICATOR_LEVELVALUE,0,level1);
// 第二の水平レベルの値を設定
IndicatorSetDouble(INDICATOR_LEVELVALUE,1,level2);
// 第三の水平レベルの値を設定
IndicatorSetDouble(INDICATOR_LEVELVALUE,2,level3);
// 新しい最大値と最小値を設定
// 第一引数は識別子、ここでは最大値を示すINDICATOR_MAXIMUM
// 第二引数は設定する値、反転したmaxの値
IndicatorSetDouble(INDICATOR_MAXIMUM,max);
// 最小値を設定
// 第一引数は識別子、ここでは最小値を示すINDICATOR_MINIMUM
// 第二引数は設定する値、反転したminの値
IndicatorSetDouble(INDICATOR_MINIMUM,min);
// デバッグ用に設定された最大値と最小値を出力
Print("Set up max = ",max,", min = ",min);
}
// 次回の呼び出しのために計算されたバー数を返す
return(rates_total);
}
【IndicatorSetDouble関数】
IndicatorSetDouble関数は、特定の指標プロパティにdouble型の値を設定するための関数です。
【IndicatorSetDouble(INDICATOR_LEVELVALUE,0,level1)】
IndicatorSetDouble関数を使用して、最初の水平レベルの値を設定します。第一引数のINDICATOR_LEVELVALUEは、水平レベルの値を示す識別子です。第二引数の0は、最初のレベルを示す修飾子です。第三引数のlevel1は、設定する値です。この場合、反転したlevel1の値を設定しています。
【IndicatorSetDouble(INDICATOR_LEVELVALUE,1,level2)】
IndicatorSetDouble関数を使用して、第二の水平レベルの値を設定します。修飾子1は、第二のレベルを示し、設定する値は反転したlevel2の値です。
【IndicatorSetDouble(INDICATOR_LEVELVALUE,2,level3)】
IndicatorSetDouble関数を使用して、第三の水平レベルの値を設定します。修飾子2は、第三のレベルを示し、設定する値は反転したlevel3の値です。
【IndicatorSetDouble(INDICATOR_MAXIMUM,max)】
IndicatorSetDouble関数を使用して、新しい最大値を設定します。第一引数のINDICATOR_MAXIMUMは、最大値を示す識別子です。第二引数のmaxは、反転した最大値を設定します。
【IndicatorSetDouble(INDICATOR_MINIMUM,min)】
IndicatorSetDouble関数を使用して、新しい最小値を設定します。第一引数のINDICATOR_MINIMUMは、最小値を示す識別子です。第二引数のminは、反転した最小値を設定します。
【Print関数】
Print関数は、デバッグ用に情報をエキスパートログに出力するための関数です。ここでは、設定された最大値と最小値を出力しています。Print関数の引数には、出力するテキストや変数が指定されます。
【return(rates_total)】
return文は、次回の呼び出しのために計算されたバー数を返します。rates_totalは、全バーの数を示します。これにより、次回のOnCalculate関数が呼び出されたときに、前回の計算結果を基に新しい計算を行うことができます。
![](https://mqlinvestmentlab.com/wp-content/uploads/2024/07/8e25e598d5f0493ae3b74dc90ba01a1f-1024x585.webp)