【MQL5】PeriodSeconds関数について

MQL5リファレンス
スポンサーリンク

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関数を使用して指定されたチャート期間の秒数を取得し、その結果をエキスパートログに出力しています。以下に、各部分の詳細な解説を行います。

  1. 入力パラメータの宣言:
    • 第一のチャート期間としてInpPeriod1を、現在のチャート期間に設定。
    • 第二のチャート期間としてInpPeriod2を、1分(M1)に設定。
  2. チャート期間の秒数を取得:
    • PeriodSeconds関数を使用して、InpPeriod1およびInpPeriod2の秒数を取得し、それぞれsec1とsec2に格納。
  3. 取得した秒数をエキスパートログに表示:
    • PrintFormat関数を使用して、InpPeriod1およびInpPeriod2の秒数をエキスパートログに表示。
  4. バーの数を計算:
    • InpPeriod1の1バーに含まれるInpPeriod2のバー数を計算し、resに格納。計算結果が0の場合は1に設定。
  5. 計算結果をエキスパートログに表示:
    • PrintFormat関数を使用して、計算結果をエキスパートログに表示。

時間枠名を返す関数:

string TimeframeDescription(const ENUM_TIMEFRAMES period)
{
    // 現在のチャート期間をチェックし、期間の文字列を取得する
    return StringSubstr(EnumToString(period == PERIOD_CURRENT ? Period() : period), 7);
}

このTimeframeDescription関数は、指定されたチャート期間の名前を文字列として返すために使用されます。以下に、各部分の詳細な解説を行います。

このTimeframeDescription関数は、指定されたチャート期間の名前を文字列として返すために使用されます。以下に、各部分の詳細な解説を行います。

EnumToString関数

EnumToString関数は、列挙型の値を対応する文字列に変換する関数です。例えば、ENUM_TIMEFRAMESPERIOD_M1EnumToString関数に渡すと、”PERIOD_M1“という文字列が返されます。

三項演算子

period == PERIOD_CURRENT? Period() : period という記述は三項演算子を使用しています。これは、以下のように読み替えることができます。

  • periodPERIOD_CURRENTと等しい場合、Period関数を呼び出します。
  • それ以外の場合、periodの値をそのまま使用します。

三項演算子は、条件式 ? 真の場合の値 : 偽の場合の値 の形式で使用されます。この例では、periodPERIOD_CURRENTであれば、現在のチャート期間を返し、そうでなければ指定されたperiodを返します。

StringSubstr関数

StringSubstr関数は、文字列の一部を抽出するための関数です。StringSubstr(EnumToString(period), 7)という記述は、EnumToString関数で得られた文字列の7文字目から末尾までを取得します。

第2引数の「7」とは?

StringSubstr関数の第2引数「7」は、抽出を開始する位置を示しています。この場合、文字列の7文字目から抽出を開始します。例えば、”PERIOD_M1“という文字列の場合、7文字目は’M’です。したがって、この関数は”PERIOD_M1“から”M1″の部分を抽出します。

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