OnTester関数を使ったサンプルコードの解説その7:利益/損失情報を配列に格納する関数

MQL5リファレンス

OnTester関数について解説した記事内↓にて、

OnTester関数を利用したサンプルコードも掲載しているのですが、同じ記事内で解説するには、ちょっと長くて複雑だったもので、別記事にして数回に分けて解説しています。

前回は本丸であるについての記述を解説しました↓

今回は利益/損失情報を配列に格納する関数である、GetTradeResultsToArray関数について解説していきます。

解説していくのは以下の部分になります。

//+------------------------------------------------------------------+
//| 取引の利益/損失の配列を得る                                      |
//+------------------------------------------------------------------+
bool GetTradeResultsToArray(double &pl_results[], double &volume)
{
    //--- 完全な取引履歴をリクエストする
    if (!HistorySelect(0, TimeCurrent()))
        return (false);

    uint total_deals = HistoryDealsTotal(); // 全取引の数を取得
    volume = 0;

    //--- 証拠金を持つ配列の初期サイズを、履歴の取引数で設定する
    ArrayResize(pl_results, total_deals);

    //--- 取引結果を修正する取引のカウンター - 利益または損失
    int counter = 0;
    ulong ticket_history_deal = 0;

    //--- 全ての取引を見る
    for (uint i = 0; i < total_deals; i++)
    {
        //--- 取引を選択する
        if ((ticket_history_deal = HistoryDealGetTicket(i)) > 0)
        {
            ENUM_DEAL_ENTRY deal_entry = (ENUM_DEAL_ENTRY)HistoryDealGetInteger(ticket_history_deal, DEAL_ENTRY); // 取引のエントリタイプを取得
            long deal_type = HistoryDealGetInteger(ticket_history_deal, DEAL_TYPE); // 取引のタイプを取得
            double deal_profit = HistoryDealGetDouble(ticket_history_deal, DEAL_PROFIT); // 取引の利益を取得
            double deal_volume = HistoryDealGetDouble(ticket_history_deal, DEAL_VOLUME); // 取引の量を取得

            //--- 興味があるのは取引操作のみである
            if ((deal_type != DEAL_TYPE_BUY) && (deal_type != DEAL_TYPE_SELL))
                continue;

            //--- 損益を固定する取引のみ
            if (deal_entry != DEAL_ENTRY_IN)
            {
                //--- 取引結果を配列に書き込み、取引のカウンターを増やす
                pl_results[counter] = deal_profit;
                volume += deal_volume;
                counter++;
            }
        }
    }

    //--- 配列の最終サイズを設定する
    ArrayResize(pl_results, counter);
    return (true);
}
スポンサーリンク
スポンサーリンク

「利益/損失情報を配列に格納する関数」の解説その1

関数の概要

GetTradeResultsToArray関数には、取引履歴を取得し、利益や損失のデータを配列に格納します。また、取引量も計算して返します。

完全な取引履歴をリクエストする

bool GetTradeResultsToArray(double &pl_results[], double &volume)
{
    //--- 完全な取引履歴をリクエストする
    if (!HistorySelect(0, TimeCurrent()))
        return (false);

まず、HistorySelect関数を使用して、完全な取引履歴をリクエストします。HistorySelect関数は、指定された期間の取引履歴を選択します。ここでは、開始時刻を0、終了時刻をTimeCurrent関数で指定し、全ての取引履歴を取得しようとしています。もし取引履歴の選択に失敗した場合、falseを返して関数を終了します。

全取引の数を取得

  uint total_deals = HistoryDealsTotal(); // 全取引の数を取得
    volume = 0;

次に、HistoryDealsTotal関数を使用して、全取引の数を取得し、total_deals変数に格納します。また、取引量を格納するためのvolume変数を0に初期化します。

配列の初期サイズを設定する

  //--- 証拠金を持つ配列の初期サイズを、履歴の取引数で設定する
    ArrayResize(pl_results, total_deals);

ここでは、ArrayResize関数を使用して、pl_results配列のサイズをtotal_deals(全取引の数)に設定します。これにより、全ての取引結果を格納できるように配列のサイズを調整します。

取引結果を修正する取引のカウンター

    //--- 取引結果を修正する取引のカウンター - 利益または損失
    int counter = 0;
    ulong ticket_history_deal = 0;

次に、取引結果を格納するためのカウンター変数counterを0に初期化します。また、取引のチケット番号を格納するためのticket_history_deal変数を0に初期化します。

このようにして、GetTradeResultsToArray関数には、取引履歴を取得し、利益や損失のデータを格納するための準備を行います。次に、各取引をループでチェックし、必要なデータを取得して配列に格納します。

「利益/損失情報を配列に格納する関数」の解説その2

このセクションでは、利益や損失の情報を配列に格納するための関数であるGetTradeResultsToArray関数にの続きについて解説します。具体的には、各取引をループでチェックし、必要なデータを取得して配列に格納する部分について説明します。

取引を選択してデータを取得する

for (uint i = 0; i < total_deals; i++)
{
    //--- 取引を選択する
    if ((ticket_history_deal = HistoryDealGetTicket(i)) > 0)
    {
        ENUM_DEAL_ENTRY deal_entry = (ENUM_DEAL_ENTRY)HistoryDealGetInteger(ticket_history_deal, DEAL_ENTRY); // 取引のエントリタイプを取得
        long deal_type = HistoryDealGetInteger(ticket_history_deal, DEAL_TYPE); // 取引のタイプを取得
        double deal_profit = HistoryDealGetDouble(ticket_history_deal, DEAL_PROFIT); // 取引の利益を取得
        double deal_volume = HistoryDealGetDouble(ticket_history_deal, DEAL_VOLUME); // 取引の量を取得

取引をループでチェックする

ここでは、全取引をループでチェックします。total_dealsは全取引の数を表し、iがループカウンターです。

取引を選択する

HistoryDealGetTicket関数を使用して、取引のチケット番号を取得します。HistoryDealGetTicket関数は、指定したインデックスに対応する取引のチケット番号を返します。取得したチケット番号が有効(0より大きい)である場合、その取引を選択します。

取引のエントリタイプを取得する

ENUM_DEAL_ENTRY deal_entry = (ENUM_DEAL_ENTRY)HistoryDealGetInteger(ticket_history_deal, DEAL_ENTRY); // 取引のエントリタイプを取得

ここでは、HistoryDealGetInteger関数を使用して取引のエントリタイプを取得し、ENUM_DEAL_ENTRY型にタイプキャストします。
タイプキャストとは、あるデータ型を別のデータ型に変換する処理のことです。ENUM_DEAL_ENTRYは取引のエントリタイプを表す列挙型です。

取引のタイプを取得する

long deal_type = HistoryDealGetInteger(ticket_history_deal, DEAL_TYPE); // 取引のタイプを取得

次に、HistoryDealGetInteger関数を使用して取引のタイプを取得し、deal_type変数に格納します。DEAL_TYPEは取引が買いか売りかを示します。

取引の利益を取得する

double deal_profit = HistoryDealGetDouble(ticket_history_deal, DEAL_PROFIT); // 取引の利益を取得

ここでは、HistoryDealGetDouble関数を使用して取引の利益を取得し、deal_profit変数に格納します。DEAL_PROFITは取引による利益または損失を示します。

取引の量を取得する

double deal_volume = HistoryDealGetDouble(ticket_history_deal, DEAL_VOLUME); // 取引の量を取得

最後に、HistoryDealGetDouble関数を使用して取引の量を取得し、deal_volume変数に格納します。DEAL_VOLUMEは取引の量を示します。

このようにして、GetTradeResultsToArray関数には、取引履歴から必要なデータを取得し、それを処理するための準備を行います。次に、取得したデータを配列に格納し、さらに必要な処理を行います。

「利益/損失情報を配列に格納する関数」の解説その3

このセクションでは、利益や損失の情報を配列に格納するための関数であるGetTradeResultsToArray関数にの続きについて解説します。具体的には、取得したデータをフィルタリングし、必要な情報を配列に格納する部分について説明します。

取引の種類をフィルタリングする

//--- 興味があるのは取引操作のみである
if ((deal_type != DEAL_TYPE_BUY) && (deal_type != DEAL_TYPE_SELL))
    continue;

まず、deal_typeを確認し、興味がある取引タイプ(買い取引または売り取引)のみを処理対象とします。DEAL_TYPE_BUYおよびDEAL_TYPE_SELLは、それぞれ買い取引と売り取引を示します。これら以外の取引タイプは無視し、次のループへ進みます。

損益を固定する取引のみを処理する

//--- 損益を固定する取引のみ
if (deal_entry != DEAL_ENTRY_IN)
{
    //--- 取引結果を配列に書き込み、取引のカウンターを増やす
    pl_results[counter] = deal_profit;
    volume += deal_volume;
    counter++;
}

次に、deal_entryを確認し、損益を固定する取引(取引が完了している取引)のみを処理します。DEAL_ENTRY_INは取引の開始を示し、これ以外の場合にのみ処理を続けます。

  1. 取引結果を配列に書き込む: pl_results配列にdeal_profitを格納します。
  2. 取引量を合計する: volumeにdeal_volumeを加算します。
  3. 取引のカウンターを増やす: counterをインクリメントします。

配列の最終サイズを設定する

//--- 配列の最終サイズを設定する
ArrayResize(pl_results, counter);
return (true);

ループが完了した後、ArrayResize関数を使用してpl_results配列のサイズをcounterに設定します。これにより、配列のサイズが実際に格納された取引結果の数に調整されます。最後に、関数はtrueを返して正常終了を示します。

このようにして、GetTradeResultsToArray関数に、取引履歴から必要なデータを取得し、フィルタリングして配列に格納する処理を完了します。この関数を使用することで、利益や損失の情報を効率的に管理し、取引結果の分析に活用することができます。

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