CopyTicksRange関数の働き・役割
CopyTicksRange関数は、指定された期間内のティックデータを取得するために使用されます。この関数は、特定の金融銘柄について、最も古いデータから現在のデータまでの順番で並んだティック情報を取得し、それを行列またはベクトル形式で提供します。
取得したデータには価格の変化や取引量などの詳細が含まれており、データ分析や戦略の構築に役立てることができます。
この関数を使うことで、特定の時間範囲内における市場の動き(価格変動や取引の傾向など)を細かく確認できるため、過去データに基づいた検証や予測を行う際に重要な役割を果たします。
また、関数はティックデータの「フラグ」を提供し、それを使ってデータ内でどの値が変化したのかを判別することも可能です。例えば、Bid値、Ask値、取引量のどれが変更されたかを調べることができます。
CopyTicksRange関数の引数について
行列の書式↓
bool matrix::CopyTicks(
string symbol, // 銘柄名
ulong flags, // 受け取るティックの種類を定義するフラグ
ulong from_msc, // ティック要求の開始時刻
ulong count // 受信するティックの数
);
ベクトルの書式↓
bool vector::CopyTicks(
string symbol, // 銘柄名
ulong flags, // 受け取るティックの種類を定義するフラグ
ulong from_msc, // ティック要求の開始時刻
ulong count // 受信するティックの数
);
CopyTicksRange関数の引数は以下の通りです。
第1引数: symbol
取得するティックデータの対象となる金融銘柄を指定します。
この引数には、文字列として銘柄名を入力します。例えば、「EURUSD」や「USDJPY」のように指定することで、その銘柄に関するティックデータを取得します。
第2引数: flags
取得するティックデータの種類を指定します。
この引数では、ENUM_COPY_TICKS列挙体に定義されている値を使います。主な識別子には以下のようなものがあります。
- COPY_TICKS_ALL: すべてのティックを取得します。
- COPY_TICKS_TRADE: 実際の取引が行われたティックのみを取得します。
- COPY_TICKS_INFO: Bid値やAsk値の変化を含むティック情報を取得します。
ベクトル形式でデータを取得する場合、複数のフラグを指定するとエラーが発生するため、注意が必要です。
※ENUM_COPY_TICKSについての詳細は下記の記事をご参照ください。
第3引数: from_msc
取得するティックデータの範囲の開始時刻を指定します。
時刻は、1970年1月1日からの経過時間をミリ秒単位で表した数値です。この値を指定することで、取得するデータの開始位置を設定します。指定しない場合、履歴の最も古いデータから取得されます。
第4引数: to_msc
取得するティックデータの範囲の終了時刻を指定します。
from_mscと同様に、時刻はミリ秒単位で表します。この値を指定することで、取得するデータの終了位置を設定します。指定しない場合、履歴の最も新しいデータまで取得されます。
引数を適切に設定することで、必要な範囲と種類のティックデータを正確に取得できます。
CopyTicksRange関数の戻り値について
CopyTicksRange関数の戻り値は、ティックデータの取得結果を示します。この関数は、成功か失敗かを論理値(true または false)で返します。
成功時の戻り値
ティックデータの取得に成功した場合は、trueが返されます。これは、指定した条件に基づいてデータが正常に取得できたことを意味します。
失敗時の戻り値
ティックデータの取得に失敗した場合は、falseが返されます。関数がfalseを返した場合、GetLastError関数を使ってエラーコードを取得することで、失敗の原因を特定できます。
代表的なエラーコード
- ERR_HISTORY_TIMEOUT: ティックデータの取得に時間がかかりすぎたため、部分的なデータのみが返されました。
- ERR_HISTORY_SMALL_BUFFER: 取得したティックデータを格納するためのバッファ(データを一時的に保存する領域)が小さすぎるため、格納できる範囲のデータのみが返されました。
- ERR_NOT_ENOUGH_MEMORY: 指定したデータ範囲に対応するティックデータを格納するためのメモリが不足しており、データが取得できませんでした。
これらの戻り値とエラーコードを適切に確認することで、取得したデータが正しいかどうかを検証し、エラーが発生した場合には問題を特定して解決する手がかりを得ることができます。
CopyTicksRange関数を使う際の注意点
- ティックデータの範囲指定
from_mscとto_mscで指定する時刻は、1970年1月1日からの経過時間をミリ秒単位で指定する必要があります。形式が間違っている場合、データが取得できなかったり、意図しない範囲のデータが取得される可能性があります。 - フラグの正しい使用
flags引数にENUM_COPY_TICKS列挙体から複数の値を指定することは、ベクトル形式での取得時にはエラーとなります。ベクトルでデータを取得する場合は、単一のフラグを指定してください。 - メモリ不足のリスク
大量のデータを取得しようとすると、メモリ不足(ERR_NOT_ENOUGH_MEMORY)になる場合があります。この場合、指定範囲を狭くするか、適切なバッファ管理を行ってください。 - エラーコードの確認
関数がfalseを返した際には、GetLastError関数でエラーコードを確認してください。例えば、タイムアウト(ERR_HISTORY_TIMEOUT)やバッファ不足(ERR_HISTORY_SMALL_BUFFER)の場合、部分的なデータのみが返される可能性があります。 - データ範囲の存在確認
ティックデータが存在しない期間(市場の休場日や範囲外の履歴など)を指定した場合、データは取得できません。対象となる銘柄や期間の履歴が存在するか事前に確認することが重要です。
CopyTicksRange関数を使ったサンプルコード
// スクリプトのエントリーポイント
void OnStart()
{
// vector型のインスタンスを作成します(ティックデータを格納するため)
vector tick_vector;
// 銘柄名を指定します(例: "EURUSD")
string symbol = "EURUSD";
// 取得するティックデータの種類を指定します(ここではAsk価格の変化のみを取得)
ulong flags = COPY_TICKS_ASK;
// データ取得範囲の開始時刻を指定します(1970年1月1日からの経過ミリ秒)
// TimeCurrent()で現在時刻を取得し、180秒(3分)前を指定
ulong from_msc = (ulong)(TimeCurrent() - 180) * 1000;
// データ取得範囲の終了時刻を指定します(現在時刻をミリ秒単位で指定)
ulong to_msc = (ulong)TimeCurrent() * 1000;
// CopyTicksRangeメソッドを使用して指定した期間内のティックデータを取得します
if(tick_vector.CopyTicksRange(symbol, flags, from_msc, to_msc))
{
// 取得に成功した場合
Print("ティックデータの取得に成功しました。データ件数: ", tick_vector.Size());
// 取得したティックデータをループで処理します
for(int i = 0; i < (int)tick_vector.Size(); i++) // サイズ分だけループを回す
{
// vectorインスタンスのi番目の値を取得(この場合はAsk価格)
double ask = tick_vector[i];
// 取得したAsk価格をエキスパートログに出力
PrintFormat("Ask: %.5f", ask);
}
}
else
{
// データ取得に失敗した場合
int error_code = GetLastError(); // エラーコードを取得
Print("ティックデータの取得に失敗しました。エラーコード: ", error_code);
}
}
サンプルコード解説1
// スクリプトのエントリーポイント
void OnStart()
{
// Matrix型のインスタンスを作成します
vector tick_vector;
// 銘柄名を指定します(例: "EURUSD")
string symbol = "EURUSD";
// ティックデータの種類を指定します(すべてのティックを取得)
ulong flags = COPY_TICKS_ASK;
// データ取得範囲の開始時刻を指定します(1970年1月1日からの経過ミリ秒)
// TimeCurrent()で現在時刻を取得し、1時間前を指定
ulong from_msc = (ulong)(TimeCurrent() - 180) * 1000;
// データ取得範囲の終了時刻を指定します(現在時刻をミリ秒単位で指定)
ulong to_msc = (ulong)TimeCurrent() * 1000;
このセクションでは、コードの準備部分に焦点を当て、それぞれの動作や設定内容を詳しく解説します。
スクリプトのエントリーポイント
OnStart関数は、スクリプトが実行される際に最初に呼び出される関数です。この中にスクリプトの処理内容を記述します。このセクションでは、ティックデータ取得の準備として、必要な変数の設定やインスタンスの作成が行われています。
vector型のインスタンス作成
tick_vectorは、ティックデータを格納するためのvector型インスタンスです。このインスタンスを使ってティックデータを一列に保存し、取得したデータを後からアクセスできるようにします。vectorは一連のデータを管理するのに適した構造です。
銘柄名の指定
symbol変数に文字列EURUSDを代入することで、ティックデータを取得する対象の銘柄を指定しています。この変数を使うことで、取得対象を柔軟に変更することが可能です。
ティックデータの種類指定
flags変数には、取得するティックデータの種類を示す値を設定します。この例では、COPY_TICKS_ASKを設定することで、Ask価格(売値)の変化に関するティックデータのみを取得するよう指定しています。この設定により、必要な種類のデータだけを効率的に取得できます。
データ取得範囲の開始時刻の設定
from_msc変数には、取得するティックデータの開始時刻を設定しています。現在時刻から180秒(3分)前を計算し、それをミリ秒単位に変換して格納します。この範囲設定により、3分前以降のティックデータを取得するよう制限できます。
データ取得範囲の終了時刻の設定
to_msc変数には、取得するティックデータの終了時刻を設定しています。現在時刻を取得し、それをミリ秒単位に変換して格納します。この設定により、現在時刻までのデータを対象とします。
サンプルコード解説2
// CopyTicksRangeメソッドを使用してティックデータを取得します
if(tick_vector.CopyTicksRange(symbol, flags, from_msc, to_msc))
{
// 取得に成功した場合
// int size = tick_matrix.; // データ件数を取得します
Print("ティックデータの取得に成功しました。データ件数: ", tick_vector.Size());
// 取得したティックデータをループで処理
for(int i = 0; i < (int)tick_vector.Size(); i++)
{
// Matrixインスタンスのi番目の行を取得
double ask = tick_vector[i]; // 時刻(1970年1月1日からの経過秒)
// 各ティックデータの内容をエキスパートログに出力
PrintFormat("Ask: %.5f",ask);
}
}
else
{
// 取得に失敗した場合
int error_code = GetLastError(); // エラーコードを取得
Print("ティックデータの取得に失敗しました。エラーコード: ", error_code);
}
}
このセクションでは、ティックデータの取得処理と結果の出力部分について解説します。コードの流れに沿って、それぞれの処理内容を説明します。
CopyTicksRangeメソッドを使用してティックデータを取得
tick_vectorのCopyTicksRangeメソッドを使用して、指定した範囲のティックデータを取得します。このメソッドは、成功すればtrueを返し、失敗すればfalseを返します。
引数には、以下の情報を渡します。
- symbol変数に設定された銘柄名(例: EURUSD)
- flags変数に設定されたティックデータの種類(例: Ask価格のみ)
- from_msc変数とto_msc変数に設定された取得範囲の開始時刻と終了時刻
取得したデータはtick_vectorに格納されます。
データ取得成功時の処理
データ取得に成功すると、Print関数で成功メッセージを出力し、取得したデータの件数をtick_vectorのSizeメソッドを使って取得します。件数が出力されることで、取得したデータ量が確認できます。
ティックデータのループ処理
forループを使用して、tick_vector内のデータを1件ずつ処理します。
- ループの範囲はtick_vectorのSizeメソッドで取得したデータ件数に基づいて設定します。
- tick_vector[i]を使って、i番目のデータ(Ask価格)を取得します。
この部分で、各データの内容にアクセスし、必要に応じて処理を行うことが可能です。
エキスパートログへのデータ出力
PrintFormat関数を使用して、取得したAsk価格をログに出力します。ログに出力することで、取得データの内容を確認したり、動作を検証することができます。
データ取得失敗時の処理
データ取得に失敗した場合、GetLastError関数を使用してエラーコードを取得します。その後、Print関数を使って、エラーコードをログに出力します。エラーコードは問題を特定する手がかりになります。
このセクションの処理により、ティックデータの取得、内容の確認、エラー発生時の対応を行う流れが実現されています。エラー処理を含めた構造にすることで、堅牢なコードとなっています。
CopyTicksRange関数を使ってEAを作る際のアイディア
CopyTicksRange関数を活用することで、ティックデータをリアルタイムで処理したり、過去のデータを分析したりするエキスパートアドバイザー(EA)を構築することが可能です。以下にいくつかの具体的なアイディアを示します。
ティックデータに基づくスキャルピングEA
CopyTicksRange関数で取得したティックデータを分析し、短期間の価格変動に基づいて取引を行うスキャルピングEAを作成できます。
ボリューム分析に基づくトレード
取得したティックデータの取引量(Volume)を分析し、マーケットの活発な動きを検知してエントリーやエグジットを判断するEAを作成できます。
- アイディア例: 突発的な取引量の増加が発生した際に順張りのエントリー。
- 実装ポイント: フラグ情報を利用して、ティックデータ内で取引量が変化したタイミングを抽出。
トレンドフォローEAの強化
CopyTicksRange関数を利用して、短期的な価格変動データを分析することで、トレンドフォロー戦略を強化できます。
- アイディア例: 特定の時間範囲内における連続した価格上昇や下降をトリガーにエントリー。
- 実装ポイント: 過去のティックデータを分析し、トレンドの始まりを判断。
スリッページや価格変動のモニタリング
取得したティックデータを使用して、スリッページや価格変動をリアルタイムでモニタリングし、不利な状況を回避するEAを作成します。
イベント駆動型EA
特定のティックフラグをトリガーとして動作するEAを設計できます。
ティックデータの統計分析によるバックテスト
CopyTicksRange関数を使って取得したティックデータを保存し、後で統計分析を行うことでバックテストを強化できます。
- アイディア例: 過去のティックデータを元に、価格変動のパターンを探してエントリー条件を最適化。
- 実装ポイント: ティックデータを外部ファイルに保存し、他の分析ツールで検証。
ボラティリティ検知EA
ティックデータの急激な変化を利用してボラティリティを検知し、特定の条件下でのみ取引するEAを作成します。
注意事項
これらのアイディアを実現する際には、ティックデータは非常に細かい情報であり、取得や処理に高い計算リソースを必要とする場合があります。そのため、必要な範囲と量を最適化し、適切なエラーハンドリングを実装することが重要です。