【MQL5】HistorySelect関数について

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

HistorySelect関数の働き・役割

HistorySelect関数は、指定されたサーバー時間の期間内での約定と注文履歴を取得するために使用されます。この関数を利用することで、過去の取引データを取得し、それに基づいて様々な分析や処理を行うことが可能となります。
例えば、特定の期間内の取引履歴を表示したり、過去の注文状況を確認する際に便利です。

HistorySelect関数の引数について

bool HistorySelect(
  datetime from_date,  // 開始日
  datetime to_date     // 終了日
);

第1引数: from_date

種類: dateTime
説明: リクエストの開始日を指定します。ここで指定した日時から取引履歴を取得します。

第2引数: to_date

種類: dateTime
説明: リクエストの終了日を指定します。ここで指定した日時までの取引履歴を取得します。

HistorySelect関数の戻り値について

HistorySelect関数は、指定された期間の取引履歴を正しく取得できた場合にtrueを返します。何らかの理由で取引履歴の取得に失敗した場合はfalseを返します。

HistorySelect関数を使ったサンプルコード

以下は、HistorySelect関数を使用して指定期間内の取引履歴を取得し、その内容をチャート上に表示するサンプルコードです。

void OnStart()
{
    // 買い注文を表示するための色を青色に設定
    color BuyColor = clrBlue;

    // 売り注文を表示するための色を赤色に設定
    color SellColor = clrRed;

    // 取引履歴をリクエストする。開始日は0(エポック時間)、終了日は現在の日時
    HistorySelect(0, TimeCurrent());

    // オブジェクトを作成するための変数を宣言
    // オブジェクトの名前
    string name;
    // 取引履歴の総数
    uint total = HistoryDealsTotal();
    // 約定チケット
    ulong ticket = 0;
    // 約定価格
    double price;
    // 利益
    double profit;
    // 約定日時
    datetime time;
    // シンボル(通貨ペアなど)
    string symbol;
    // 約定タイプ(買いか売りか)
    long type;
    // エントリータイプ
    long entry;

    // 全ての約定に対してループ処理を行う
    for (uint i = 0; i < total; i++)
    {
        // 約定チケットの取得を試みる
        if ((ticket = HistoryDealGetTicket(i)) > 0)
        {
            // 約定の各プロパティを取得する
            // 約定価格を取得
            price = HistoryDealGetDouble(ticket, DEAL_PRICE);
            // 約定日時を取得
            time = (datetime)HistoryDealGetInteger(ticket, DEAL_TIME);
            // シンボルを取得
            symbol = HistoryDealGetString(ticket, DEAL_SYMBOL);
            // 約定タイプを取得
            type = HistoryDealGetInteger(ticket, DEAL_TYPE);
            // エントリータイプを取得
            entry = HistoryDealGetInteger(ticket, DEAL_ENTRY);
            // 利益を取得
            profit = HistoryDealGetDouble(ticket, DEAL_PROFIT);

            // 現在のシンボルと一致する取引のみを処理
            if (price && time && symbol == Symbol())
            {
                // 価格オブジェクトの名前を設定
                name = "TradeHistory_Deal_" + string(ticket);

                // 取引エントリーの方向に応じて矢印オブジェクトを作成
                if (entry)
                    ObjectCreate(0, name, OBJ_ARROW_RIGHT_PRICE, 0, time, price, 0, 0);
                else
                    ObjectCreate(0, name, OBJ_ARROW_LEFT_PRICE, 0, time, price, 0, 0);

                // オブジェクトプロパティを設定
                // オブジェクトを選択可能にしない
                ObjectSetInteger(0, name, OBJPROP_SELECTABLE, 0);
                // オブジェクトを背面に表示しない
                ObjectSetInteger(0, name, OBJPROP_BACK, 0);
                // オブジェクトの色を設定(買いの場合は青、売りの場合は赤)
                ObjectSetInteger(0, name, OBJPROP_COLOR, type ? BuyColor : SellColor);

                // 利益がある場合は、オブジェクトに利益情報を設定
                if (profit != 0)
                    ObjectSetString(0, name, OBJPROP_TEXT, "Profit: " + string(profit));
            }
        }
    }

    // チャートを更新して変更を反映する
    ChartRedraw();
}

サンプルコード解説その1

void OnStart()
{
    // 買い注文を表示するための色を青色に設定
    color BuyColor = clrBlue;

    // 売り注文を表示するための色を赤色に設定
    color SellColor = clrRed;

    // 取引履歴をリクエストする。開始日は0(エポック時間)、終了日は現在の日時
    HistorySelect(0, TimeCurrent());

    // オブジェクトを作成するための変数を宣言
    // オブジェクトの名前
    string name;
    // 取引履歴の総数
    uint total = HistoryDealsTotal();
    // 約定チケット
    ulong ticket = 0;
    // 約定価格
    double price;
    // 利益
    double profit;
    // 約定日時
    datetime time;
    // シンボル(通貨ペアなど)
    string symbol;
    // 約定タイプ(買いか売りか)
    long type;
    // エントリータイプ
    long entry;

この部分のコードでは、主に初期設定と取引履歴のリクエストを行っています。以下に詳細な解説を行います。

色の設定

まず、買い注文と売り注文を区別するために、それぞれ異なる色を設定しています。

  • 買い注文を表示するための色をBuyColorに青色で設定しています。
  • 売り注文を表示するための色をSellColorに赤色で設定しています。

取引履歴のリクエスト

次に、取引履歴をリクエストするためにHistorySelect関数を使用しています。この関数は、指定された期間内の取引履歴を取得します。この場合、開始日は0(1970年1月1日を指します)で、終了日は現在の日時です。現在の日時はTimeCurrent関数を使用して取得しています。
TimeCurrent関数は、サーバーの現在時刻を取得するための関数です。

変数の宣言

その後、取引履歴のデータを格納するための変数を宣言しています。

  • オブジェクトの名前を格納するための文字列変数name
  • 取引履歴の総数を格納するための整数変数total。取引履歴の総数はHistoryDealsTotal関数を使用して取得します。HistoryDealsTotal関数は、現在の取引履歴リストに含まれる約定の総数を返します。
  • 約定チケットを格納するためのulong変数ticket
  • 約定価格を格納するためのdouble変数price
  • 利益を格納するためのdouble変数profit
  • 約定日時を格納するためのdateTime変数time
  • シンボル(通貨ペアなど)を格納するためのstring変数symbol
  • 約定タイプ(買いか売りか)を格納するためのlong変数type
  • エントリータイプを格納するためのlong変数entry

このように、各変数を宣言することで、後続の処理で必要なデータを保持する準備を行っています。次のステップでは、これらの変数を使用して実際に取引履歴を処理し、チャート上に表示する処理を行います。

サンプルコード解説その2

  for (uint i = 0; i < total; i++)
    {
        // 約定チケットの取得を試みる
        if ((ticket = HistoryDealGetTicket(i)) > 0)
        {
            // 約定の各プロパティを取得する
            // 約定価格を取得
            price = HistoryDealGetDouble(ticket, DEAL_PRICE);
            // 約定日時を取得
            time = (datetime)HistoryDealGetInteger(ticket, DEAL_TIME);
            // シンボルを取得
            symbol = HistoryDealGetString(ticket, DEAL_SYMBOL);
            // 約定タイプを取得
            type = HistoryDealGetInteger(ticket, DEAL_TYPE);
            // エントリータイプを取得
            entry = HistoryDealGetInteger(ticket, DEAL_ENTRY);
            // 利益を取得
            profit = HistoryDealGetDouble(ticket, DEAL_PROFIT);

この部分のコードでは、取引履歴をループ処理して各約定の詳細情報を取得しています。以下に詳細な解説を行います。

ループ処理

まず、forループを使用して、取引履歴の総数(total)に基づいて全ての約定を処理します。ループ内での各反復処理により、各約定に対して詳細情報を取得します。

約定チケットの取得

ループ内では、HistoryDealGetTicket関数を使用して各約定のチケットを取得します。この関数は、指定されたインデックスiの約定チケットを返します。チケットが取得できた場合(0より大きい場合)に、次の処理に進みます。

各プロパティの取得

取得したチケットを使用して、約定の詳細情報を取得します。

  • 約定価格は、HistoryDealGetDouble関数を使用して取得します。この関数は、指定されたチケットticketとプロパティ識別子としてDEAL_PRICEを使って、価格プロパティを返します。
  • 約定日時は、HistoryDealGetInteger関数を使用して取得します。この関数は、指定されたチケットticketとプロパティ識別子としてDEAL_TIMEを使って、日時プロパティを返します。取得した値はdateTime型にタイプキャストされます。
  • シンボルは、HistoryDealGetString関数を使用して取得します。この関数は、指定されたチケットticketとプロパティ識別子としてDEAL_SYMBOLを使って、シンボルプロパティを返します。
  • 約定タイプは、HistoryDealGetInteger関数を使用して取得します。この関数は、指定されたチケットticketとプロパティ識別子としてDEAL_TYPEを使って、約定タイププロパティを返します。約定タイプは、買い注文か売り注文かを示します。
  • エントリータイプも、HistoryDealGetInteger関数を使用して取得します。この関数は、指定されたチケットticketとプロパティ識別子としてDEAL_ENTRYを使って、エントリータイププロパティを返します。エントリータイプは、新規注文か決済注文かを示します。
  • 利益は、HistoryDealGetDouble関数を使用して取得します。この関数は、指定されたチケットticketとプロパティ識別子としてDEAL_PROFITを使って、利益プロパティを返します。

このように、各約定の詳細情報を取得することで、後続の処理でこれらの情報を使用してチャート上に取引履歴を表示することができます。

サンプルコード解説その3

    // 現在のシンボルと一致する取引のみを処理
            if (price && time && symbol == Symbol())
            {
                // 価格オブジェクトの名前を設定
                name = "TradeHistory_Deal_" + string(ticket);

                // 取引エントリーの方向に応じて矢印オブジェクトを作成
                if (entry)
                    ObjectCreate(0, name, OBJ_ARROW_RIGHT_PRICE, 0, time, price, 0, 0);
                else
                    ObjectCreate(0, name, OBJ_ARROW_LEFT_PRICE, 0, time, price, 0, 0);

                // オブジェクトプロパティを設定
                // オブジェクトを選択可能にしない
                ObjectSetInteger(0, name, OBJPROP_SELECTABLE, 0);
                // オブジェクトを背面に表示しない
                ObjectSetInteger(0, name, OBJPROP_BACK, 0);
                // オブジェクトの色を設定(買いの場合は青、売りの場合は赤)
                ObjectSetInteger(0, name, OBJPROP_COLOR, type ? BuyColor : SellColor);

                // 利益がある場合は、オブジェクトに利益情報を設定
                if (profit != 0)
                    ObjectSetString(0, name, OBJPROP_TEXT, "Profit: " + string(profit));
            }
        }
    }

    // チャートを更新して変更を反映する
    ChartRedraw();
}

この部分のコードでは、取得した約定情報を基にチャート上にオブジェクトを作成し、表示する処理を行っています。以下に詳細な解説を行います。

条件チェックとシンボルの一致確認

まず、取得した約定情報の中で、現在のシンボルと一致する取引のみを処理します。

if (price && time && symbol == Symbol()) の意味

  1. price:
    • 価格が0でないことを確認しています。価格が0の場合、その取引は無効なデータとして扱われます。
  2. time:
    • 約定の日時が0でないことを確認しています。日時が0の場合、その取引も無効なデータとして扱われます。
  3. symbol == Symbol():
    • 取得した取引のシンボルが現在のシンボルと一致することを確認しています。この条件が最も重要で、意図としては、現在表示しているチャートのシンボルと一致する取引のみを処理することです。

論理積 (&&) の使用

この条件文全体では、論理積 (&&) を使用して、すべての条件が同時に満たされている場合にのみ次の処理に進むようにしています。

  • pricetime のチェックはデータの有効性を確認するためです。これにより、無効なデータが処理されないようにします。
  • symbol == Symbol() のチェックは、Symbol関数を使って、現在のチャートのシンボルと一致する取引のみを処理するためです。これが最も重要な意図です。

オブジェクトの名前設定

次に、オブジェクトの名前を設定します。名前は、”TradeHistory_Deal_”に約定チケットの番号ticketを結合した文字列です。文字列に変換するために(string)という記述を使用しています。
これはタイプキャストと呼ばれ、特定のデータ型を別のデータ型に変換する方法です。この場合、ticket(数値)を文字列に変換しています。

矢印オブジェクトの作成

取引エントリーの方向に応じて、適切な矢印オブジェクトを作成します。

  • 新規注文の場合(entryが真の場合)は、右向き矢印(OBJ_ARROW_RIGHT_PRICE)を作成します。
  • 決済注文の場合(entryが偽の場合)は、左向き矢印(OBJ_ARROW_LEFT_PRICE)を作成します。

ObjectCreate関数を使用して、チャート上に矢印オブジェクトを作成します。引数としては、チャートID(0は現在のチャートを意味します)、オブジェクトの名前name、オブジェクトのタイプ(矢印の方向)、サブウィンドウ(ここでは0)、約定日時time、約定価格price、0、0を指定します。ここで、0はサブウィンドウIDとデフォルトの値を指定しています。

オブジェクトプロパティの設定

作成したオブジェクトのプロパティを設定します。

  • ObjectSetInteger関数を使用して、オブジェクトを選択可能にしないように設定します。引数は、チャートID、オブジェクトの名前、プロパティ識別子としてOBJPROP_SELECTABLE、設定値0です。
  • ObjectSetInteger関数を使用して、オブジェクトを背面に表示しないように設定します。引数は、チャートID、オブジェクトの名前、プロパティ識別子としてOBJPROP_BACK、設定値0です。
  • ObjectSetInteger関数を使用して、オブジェクトの色を設定します。約定タイプtypeが真(買い注文)の場合は青色、偽(売り注文)の場合は赤色に設定します。引数は、チャートID、オブジェクトの名前、プロパティ識別子としてOBJPROP_COLOR、設定する色です。

ObjectSetInteger関数引数には、三項演算子が使われています。
三項演算子は、条件式 ? 真の値 : 偽の値 の形式で、条件式が真の場合は最初の値が、偽の場合は次の値が返されます。
この例では、typeが真の場合はBuyColor(青色)が、偽の場合はSellColor(赤色)が設定されます。

利益情報の設定

利益がある場合(profitが0でない場合)は、ObjectSetString関数を使用して、オブジェクトに利益情報を設定します。引数は、チャートID、オブジェクトの名前、プロパティ識別子としてOBJPROP_TEXT、設定するテキスト(利益情報)です。

チャートの更新

最後に、ChartRedraw関数を使用して、チャートを更新し変更を反映します。この関数は、チャート上の全てのオブジェクトを再描画します。

以上の手順により、取得した取引履歴をチャート上に可視化し、過去の取引の視覚的な確認を可能にします。

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