PeriodSeconds関数の働き・役割
PeriodSeconds関数は、指定されたチャート期間中の秒数を返すために使用されます。
この関数は、トレーディングプログラムが実行されているチャートの期間や、他の指定されたチャート期間に対して、その期間の秒数を取得することができます。これにより、異なる時間枠間の比較や計算を行う際に役立ちます。
PeriodSeconds関数の引数について
int PeriodSeconds(
ENUM_TIMEFRAMES period = PERIOD_CURRENT // チャート期間
);
period
種類: ENUM_TIMEFRAMES
説明: チャート期間を指定します。ENUM_TIMEFRAMES列挙体から選択された期間を指定します。パラメータが指定されていない場合は、プログラムが実行されている現在のチャートの期間の秒数を返します。
PeriodSeconds関数の戻り値について
PeriodSeconds関数は、指定されたチャート期間の秒数を整数型の値として返します。例えば、1分(M1)チャートの場合は60秒、5分(M5)チャートの場合は300秒を返します。戻り値が0の場合は、指定されたチャート期間が無効であることを意味します。
PeriodSeconds関数を使う際の注意点
PeriodSeconds関数を使用する際には、指定するチャート期間がENUM_TIMEFRAMES列挙体に含まれる有効な値であることを確認する必要があります。
無効な値を指定すると、予期しない結果やエラーが発生する可能性があります。また、パラメータを指定しない場合は、現在のチャートの期間が使用されるため、意図しない期間の秒数が返されることがないよう注意が必要です。
指定したチャート期間が適切であることを確認した上で、PeriodSeconds関数を活用することで、異なる時間枠間の比較や計算を効率的に行うことができます。
PeriodSeconds関数を使ったサンプルコード
以下は、PeriodSeconds関数を使用して指定したチャート期間の秒数を取得し、その結果をエキスパートログに出力するサンプルコードです。
//--- 入力パラメータを宣言
input ENUM_TIMEFRAMES InpPeriod1 = PERIOD_CURRENT; // 第一のチャート期間
input ENUM_TIMEFRAMES InpPeriod2 = PERIOD_M1; // 第二のチャート期間
//+------------------------------------------------------------------+
//| スクリプトプログラム開始関数 |
//+------------------------------------------------------------------+
void OnStart()
{
//--- InpPeriod1およびInpPeriod2チャート期間の秒数を取得する
int sec1 = PeriodSeconds(InpPeriod1);
int sec2 = PeriodSeconds(InpPeriod2);
//--- 取得した値をエキスパートログに表示する
// InpPeriod1のチャート期間の秒数を表示
PrintFormat("Seconds in period %s: %d", TimeframeDescription(InpPeriod1), sec1);
// InpPeriod2のチャート期間の秒数を表示
PrintFormat("Seconds in period %s: %d", TimeframeDescription(InpPeriod2), sec2);
//--- InpPeriod1のチャート期間のバーにInpPeriod2チャート期間のバーが何本含まれるかを計算する
int res = sec1 / sec2;
if (res == 0)
res = 1;
//--- 取得した値をエキスパートログに表示する
// InpPeriod1の1バーに含まれるInpPeriod2のバー数を表示
PrintFormat("One bar %s contains %d bars %s", TimeframeDescription(InpPeriod1), res, TimeframeDescription(InpPeriod2));
}
/* 結果:
Seconds in period M5: 300, in period M1: 60
One bar M5 contains 5 bars M1
*/
//+------------------------------------------------------------------+
//| 時間枠名を返す関数 |
//+------------------------------------------------------------------+
string TimeframeDescription(const ENUM_TIMEFRAMES period)
{
// 現在のチャート期間をチェックし、期間の文字列を取得する
return StringSubstr(EnumToString(period == PERIOD_CURRENT ? Period() : period), 7);
}
サンプルコード解説
このサンプルコードでは、PeriodSeconds関数を使用して指定されたチャート期間の秒数を取得し、その結果をエキスパートログに出力しています。以下に、各部分の詳細な解説を行います。
- 入力パラメータの宣言:
- 第一のチャート期間としてInpPeriod1を、現在のチャート期間に設定。
- 第二のチャート期間としてInpPeriod2を、1分(M1)に設定。
- チャート期間の秒数を取得:
- PeriodSeconds関数を使用して、InpPeriod1およびInpPeriod2の秒数を取得し、それぞれsec1とsec2に格納。
- 取得した秒数をエキスパートログに表示:
- PrintFormat関数を使用して、InpPeriod1およびInpPeriod2の秒数をエキスパートログに表示。
- バーの数を計算:
- InpPeriod1の1バーに含まれるInpPeriod2のバー数を計算し、resに格納。計算結果が0の場合は1に設定。
- 計算結果をエキスパートログに表示:
- PrintFormat関数を使用して、計算結果をエキスパートログに表示。
時間枠名を返す関数:
string TimeframeDescription(const ENUM_TIMEFRAMES period)
{
// 現在のチャート期間をチェックし、期間の文字列を取得する
return StringSubstr(EnumToString(period == PERIOD_CURRENT ? Period() : period), 7);
}
このTimeframeDescription関数は、指定されたチャート期間の名前を文字列として返すために使用されます。以下に、各部分の詳細な解説を行います。
このTimeframeDescription関数は、指定されたチャート期間の名前を文字列として返すために使用されます。以下に、各部分の詳細な解説を行います。
EnumToString関数
EnumToString関数は、列挙型の値を対応する文字列に変換する関数です。例えば、ENUM_TIMEFRAMESのPERIOD_M1をEnumToString関数に渡すと、”PERIOD_M1“という文字列が返されます。
三項演算子
period == PERIOD_CURRENT? Period() : period という記述は三項演算子を使用しています。これは、以下のように読み替えることができます。
period
がPERIOD_CURRENTと等しい場合、Period関数を呼び出します。- それ以外の場合、
period
の値をそのまま使用します。
三項演算子は、条件式 ? 真の場合の値 : 偽の場合の値 の形式で使用されます。この例では、period
がPERIOD_CURRENTであれば、現在のチャート期間を返し、そうでなければ指定されたperiod
を返します。
StringSubstr関数
StringSubstr関数は、文字列の一部を抽出するための関数です。StringSubstr(EnumToString(period), 7)という記述は、EnumToString関数で得られた文字列の7文字目から末尾までを取得します。
第2引数の「7」とは?
StringSubstr関数の第2引数「7」は、抽出を開始する位置を示しています。この場合、文字列の7文字目から抽出を開始します。例えば、”PERIOD_M1“という文字列の場合、7文字目は’M’です。したがって、この関数は”PERIOD_M1“から”M1″の部分を抽出します。