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は取引の開始を示し、これ以外の場合にのみ処理を続けます。
- 取引結果を配列に書き込む: pl_results配列にdeal_profitを格納します。
- 取引量を合計する: volumeにdeal_volumeを加算します。
- 取引のカウンターを増やす: counterをインクリメントします。
配列の最終サイズを設定する
//--- 配列の最終サイズを設定する
ArrayResize(pl_results, counter);
return (true);
ループが完了した後、ArrayResize関数を使用してpl_results配列のサイズをcounterに設定します。これにより、配列のサイズが実際に格納された取引結果の数に調整されます。最後に、関数はtrueを返して正常終了を示します。
このようにして、GetTradeResultsToArray関数に、取引履歴から必要なデータを取得し、フィルタリングして配列に格納する処理を完了します。この関数を使用することで、利益や損失の情報を効率的に管理し、取引結果の分析に活用することができます。