CopyTicks関数の働き・役割
CopyTicks関数は、指定したシンボル(銘柄)のティックデータを取得し、行列やベクトルにコピーするための機能を提供します。この関数を使用することで、過去のティックデータを詳細に分析することが可能になります。取得されたデータは、最も古いティックがインデックス0に配置される順序で格納されます。
ティックデータには、Bid値、Ask値、Last値、取引量、ティックフラグなど、トレードや気配値に関するさまざまな情報が含まれています。また、CopyTicks関数は、ティックデータベースを同期し、不足しているデータを自動的にダウンロードする機能も持っています。このため、ティックデータを効率的に収集し、分析に活用することが可能です。
さらに、CopyTicks関数を指標、エキスパートアドバイザー、スクリプトで使用する場合、それぞれの特性に応じた動作が行われます。指標では即座にデータが返され、エキスパートアドバイザーやスクリプトでは最大45秒間同期を待機する仕組みが組み込まれています。
この関数は、高速キャッシュや端末メモリ、ハードドライブなど、異なるソースからのデータ取得に対応しており、効率的にティック情報を提供します。
ティックフラグとは?
ティックフラグとは、各ティックに付加される情報で、そのティックがどの種類のイベントに関連するかを示すフラグです。例えば、BidやAskの更新、または取引が行われた際のティックかを区別するために使用されます。これにより、データ分析や戦略の判断に役立つ具体的な情報を得ることができます。
CopyTicks関数の引数について
CopyTicks関数には、以下の2つの書式があります。それぞれの書式ごとに引数の詳細を説明します。
書式1
この書式では、ティックデータを取得して結果を行列に格納します。
bool matrix::CopyTicks(
string symbol, // 銘柄名
ulong flags, // 受け取るティックの種類を定義するフラグ
ulong from_msc, // ティック要求の開始時刻
ulong count // 受信するティックの数
);
symbol
銘柄名を指定します。この引数には、ティックデータを取得したい銘柄の名称を文字列として渡します。例えば、「EURUSD」や「USDJPY」などの通貨ペア名が使用されます。
flags
取得するティックの種類を指定するフラグです。この引数には、ENUM_COPY_TICKS列挙から1つまたは複数の値を指定します。指定する値によって、取得するティックの内容が決まります。例えば、COPY_TICKS_INFOを指定すると気配値の変化を含むティックが取得されます。
from_msc
ティックデータを取得する開始時刻をミリ秒単位で指定します。この時刻は1970年1月1日からの経過時間を表します。from_mscに0を指定すると、最新のティックからcountで指定した数のデータを取得します。
count
取得するティックデータの数を指定します。この引数を省略した場合、デフォルトで2000件までのティックが取得されます。値が大きすぎると、パフォーマンスに影響を与える場合があります。
書式2
この書式では、ティックデータを取得して結果をベクトルに格納します。
bool vector::CopyTicks(
string symbol, // 銘柄名
ulong flags, // 受け取るティックの種類を定義するフラグ
ulong from_msc, // ティック要求の開始時刻
ulong count // 受信するティックの数
);
symbol
銘柄名を指定します。この引数には、ティックデータを取得したい銘柄の名称を文字列として渡します。行列へのコピーと同様に、「EURUSD」や「USDJPY」などが指定可能です。
flags
要求するティックデータの種類を指定します。ENUM_COPY_TICKS列挙から1つの値のみを指定できます。複数の値を指定するとエラーが発生します。例えば、COPY_TICKS_TRADEを指定すると、取引量の変化を含むティックが取得されます。
from_msc
取得範囲の開始時刻をミリ秒単位で指定します。1970年1月1日からの経過時間で指定する点は書式1と同じです。
count
要求するティックの数を指定します。この引数が省略されると、デフォルトで最大2000件のティックが返されます。行列と同様に、取得する数が多すぎると処理に時間がかかる可能性があります。
両書式ともに、取得されたデータは最も古いティックがインデックス0に配置される順序で格納されます。行列かベクトルかを用途に応じて選択する点が主な違いです。
CopyTicks関数の戻り値について
CopyTicks関数の戻り値は、操作の成否を示すブール型の値です。
成功時の戻り値
ティックデータの取得に成功した場合、CopyTicks関数は true を返します。この場合、指定した symbol に対応するティックデータが行列またはベクトルにコピーされています。
失敗時の戻り値
ティックデータの取得に失敗した場合、CopyTicks関数は false を返します。失敗の主な原因としては、以下のようなケースが考えられます。
- 指定した銘柄が無効:symbol に存在しない銘柄名を指定した場合。
- flagsの指定が不適切:特にベクトルへのコピーの場合、ENUM_COPY_TICKS列挙から複数の値を指定するとエラーが発生します。
- 接続エラーまたはデータ不足:ティックデータがサーバから取得できない場合や、指定した条件に該当するデータが存在しない場合。
- 同期未完了:ローカルデータベースの同期が完了していない場合。初回の呼び出しではこの問題が発生しやすいです。
CopyTicks関数を使う際の注意点
- 初回呼び出し時のデータベース同期
CopyTicks関数を初めて呼び出した際、関連する銘柄のティックデータベースの同期が開始されます。ローカルデータベースに不足しているティックは、取引サーバから自動的にダウンロードされます。この同期作業は、from_mscで指定した開始時刻から現在までのティックが対象となります。 - 指標での動作
指標でこの関数を使用すると、結果はすぐに返されます。ただし、利用可能なデータが不足している場合でも、同期を待たずに処理が進行します。その後、同期が完了した際に次回の呼び出しで要求されたティックが返されます。 - エキスパートアドバイザーとスクリプトでの動作
エキスパートアドバイザーやスクリプトでは、CopyTicks関数は最大で45秒間同期を待機できます。この間に必要なデータが取得できなかった場合、関数は利用可能なティックのみを返し、同期作業はバックグラウンドで続行されます。 - データリターン率
ターミナルの高速アクセスキャッシュには、直近の4096ティック(または市場深度が実行されている銘柄の場合は65536ティック)が保存されます。
このキャッシュ内のデータ要求は高速に処理されます。一方、キャッシュを超えたデータや、過去のセッションのデータを要求する場合は、処理時間が長くなる可能性があります。 - フラグとデータ配置の制約
ベクトルにティックデータをコピーする場合、ENUM_COPY_TICKS列挙から1つのフラグのみを指定する必要があります。複数の値を指定するとエラーが発生します。また、ティックを行列にコピーする場合、COPY_TICKS_VERTICALフラグを使用するとデータが縦軸に沿って配置されます。
これらの仕様を理解し、適切に関数を使用することで、効率的なティックデータの取得が可能になります。
CopyTicks関数を使ったサンプルコード
以下のサンプルコードでは、CopyTicks関数を使用して指定した銘柄(ここではEURUSD)の最新ティックデータを取得し、取得したデータをエキスパートログに出力する方法を示しています。
// スクリプトの開始時に呼び出される関数
void OnStart()
{
// 現在の銘柄名を取得します。この例ではSymbol()関数を使用して現在のチャートの銘柄を取得しています。
string symbol = Symbol();
// 取得するティックの種類を指定します。ここではAsk値の変化を含むティックを取得するためCOPY_TICKS_ASKを指定しています。
ENUM_COPY_TICKS flags = COPY_TICKS_ASK;
// ティック取得の開始時刻を指定します。0を指定すると最新のティックから取得します。
ulong from_msc = 0;
// 取得するティックデータの数を指定します。この例では100件を取得します。
ulong count = 100;
// ベクトル型のインスタンスを作成します。取得したティックデータを格納するために使用します。
vector ticks_vector;
// CopyTicksメソッドの戻り値がtrueであれば、データの取得に成功したと判断します。
if (ticks_vector.CopyTicks(symbol, flags, from_msc, count))
{
// データの取得に成功した場合、取得したティックデータの件数をエキスパートログに出力します。
Print("取得したティック数: ", ticks_vector.Size());
// ベクトル内のすべてのティックデータをループで処理します。
for (int i = 0; i < (int)ticks_vector.Size(); i++)
{
// 各ティックのAsk値をエキスパートログに出力します。
PrintFormat("ティック %d: Ask=%f", i, ticks_vector[i]);
}
}
else
{
// データの取得に失敗した場合、エラーメッセージをエキスパートログに出力します。
Print("ティックデータの取得に失敗しました。");
}
}
サンプルコード解説 1
// スクリプトの開始時に呼び出される関数
void OnStart()
{
// 現在の銘柄名を取得します。この例ではSymbol()関数を使用して現在のチャートの銘柄を取得しています。
string symbol = Symbol();
// 取得するティックの種類を指定します。ここではAsk値の変化を含むティックを取得するためCOPY_TICKS_ASKを指定しています。
ENUM_COPY_TICKS flags = COPY_TICKS_ASK;
// ティック取得の開始時刻を指定します。0を指定すると最新のティックから取得します。
ulong from_msc = 0;
// 取得するティックデータの数を指定します。この例では100件を取得します。
ulong count = 100;
// ベクトル型のインスタンスを作成します。取得したティックデータを格納するために使用します。
vector ticks_vector;
OnStart関数の概要
OnStart関数は、スクリプトが開始された際に最初に呼び出される特別な関数です。この関数内で、ティックデータを取得するロジックを記述しています。スクリプトは1回だけ実行されるプログラムであり、エキスパートアドバイザー(EA)やインジケータと異なり、手動で実行する必要があります。
銘柄の取得
Symbol関数を使用して、現在のチャートで表示されている銘柄を取得しています。この値は文字列型で、たとえば「EURUSD」や「USDJPY」といった通貨ペアの名称が返されます。このように現在のチャートの銘柄を自動取得することで、コードの再利用性が向上します。
ここで取得された銘柄名は、後続の CopyTicks関数でティックデータを取得する際に利用されます。
ティックの種類を指定するフラグ
ENUM_COPY_TICKS列挙型を使用して、取得したいティックデータの種類を指定しています。このコードでは COPY_TICKS_ASKが使用されており、Ask値の変化を含むティックのみを取得します。ENUM_COPY_TICKSには他にも以下の値があります。
- COPY_TICKS_BID: Bid値の変化を含むティックを取得。
- COPY_TICKS_ALL: すべてのティックを取得。
フラグを使い分けることで、取得するティックデータを効率的に制御できます。
ティック取得の開始時刻の指定
from_msc には、ティックデータの取得を開始する時刻をミリ秒単位で指定します。ここでは 0 を指定していますが、これは最新のティックデータから取得を開始することを意味します。
- 時刻は「1970年1月1日からの経過ミリ秒」で表されます。
- 特定の期間のデータを取得したい場合は、この値を適宜設定する必要があります。
取得するティックデータの件数の指定
count には、取得したいティックデータの件数を指定します。このコードでは 100件 を取得する設定になっています。適切な件数を指定することで、必要以上に多くのデータを取得してパフォーマンスを損ねることを防げます。
ベクトル型インスタンスの作成
vector型のインスタンス ticks_vector を作成しています。このベクトルは、ティックデータを格納するためのデータ構造です。ベクトル型は1次元配列に似ていますが、追加や削除、データ操作において柔軟性が高い特徴があります。
ここで作成されたベクトル型インスタンスは、後続の CopyTicks関数で取得したティックデータを格納するために使用されます。
サンプルコード解説 2
// CopyTicksメソッドの戻り値がtrueであれば、データの取得に成功したと判断します。
if (ticks_vector.CopyTicks(symbol, flags, from_msc, count))
{
// データの取得に成功した場合、取得したティックデータの件数をエキスパートログに出力します。
Print("取得したティック数: ", ticks_vector.Size());
// ベクトル内のすべてのティックデータをループで処理します。
for (int i = 0; i < (int)ticks_vector.Size(); i++)
{
// 各ティックのAsk値をエキスパートログに出力します。
PrintFormat("ティック %d: Ask=%f", i, ticks_vector[i]);
}
}
else
{
// データの取得に失敗した場合、エラーメッセージをエキスパートログに出力します。
Print("ティックデータの取得に失敗しました。");
}
}
CopyTicksメソッドの呼び出しと戻り値の判定
CopyTicks関数は、指定した条件でティックデータを取得し、ベクトル型のインスタンスにデータを格納します。このメソッドは戻り値としてブール値を返します。戻り値がtrueであれば、データの取得に成功したことを示します。falseの場合、何らかの理由でデータの取得に失敗しています。
コードでは、if文を使用してCopyTicks関数の戻り値を確認し、成功した場合と失敗した場合の処理を分けています。
データ取得成功時の処理
取得が成功した場合、ベクトル内に格納されたティックデータの件数を出力しています。件数はSizeメソッドを使用して取得します。このメソッドはベクトル型に組み込まれており、現在格納されているデータ要素の数を返します。
ティックデータのループ処理
forループを使用して、ベクトル内のすべてのティックデータを処理しています。ループ内では、各ティックデータのAsk値をログに出力しています。ベクトル内の特定の要素には、インデックスを使用してアクセスします。インデックスは0から始まり、Sizeメソッドで取得した値-1までの範囲です。
各ティックデータはticks_vector[i]で取得されます。このデータを使用して詳細を出力しています。
データ取得失敗時の処理
データの取得に失敗した場合、elseブロックの処理が実行されます。この場合、エキスパートログにエラーメッセージを出力します。取得失敗の理由を特定するには、GetLastError関数を使用してエラーコードを取得することが有効です。
CopyTicks関数を使ってEAを作る際のアイディア
CopyTicks関数を活用することで、ティックデータを基にした高度なエキスパートアドバイザー(EA)の開発が可能です。以下に、その具体的な応用アイディアを示します。
ティックデータによるスキャルピングEA
ティックデータをリアルタイムで収集し、短期の価格変動を活用したスキャルピング戦略を構築します。
- Bid値とAsk値の差(スプレッド)を監視し、スプレッドが狭いときにエントリーする。
- 価格の急激な変動を検出してトレンドフォロー戦略を実施する。
- 取引量の急増を検知し、流動性が高いタイミングでエントリーまたはエグジットを実行する。
ティックフラグを活用した注文分析
CopyTicks関数で取得できるティックフラグを活用して、市場参加者の動向を分析します。
- TICK_FLAG_BUYまたはTICK_FLAG_SELLを基に、買い注文や売り注文の増加をリアルタイムで検出する。
- 特定の注文パターンを基にエントリーやエグジットのタイミングを判断する。
- フラグ情報を履歴データとして蓄積し、独自の統計分析やアルゴリズム設計に活用する。
ボラティリティ監視EA
価格の変動幅を監視し、ボラティリティに応じた戦略を展開するEAを構築します。
複数銘柄の相関分析を活用した戦略
CopyTicks関数を使用して複数の銘柄のティックデータを収集し、相関性を基に取引を行います。
- 異なる通貨ペア間の価格変動の相関を計測し、裁定取引やペアトレードを実行する。
- 特定の銘柄の動きが他の銘柄に与える影響を分析し、予測に基づいた取引を行う。
- 相関が崩れるタイミングを検出して逆張りを実行する。
ティックデータ履歴を基にしたバックテスト
CopyTicks関数で取得したティックデータを活用して、過去のデータを基にした戦略のバックテストを行います。
- 過去のティックデータを用いて、特定の条件下でのエントリーやエグジットのパフォーマンスを検証する。
- 実際のティックデータを基にシミュレーションを行い、トレード戦略の有効性を確認する。
- ティック単位の精密なシミュレーションを通じて、取引コストやスリッページを評価する。
リアルタイムスプレッド監視
データ保存と機械学習への活用
CopyTicks関数で取得したティックデータを保存し、機械学習や統計モデルの学習に活用します。
- 過去のティックデータをCSVやデータベースに保存し、後から解析可能にする。
- ティックデータを基に価格予測モデルを構築し、AIを活用したEAを開発する。
- ティックデータからスプレッドや価格変動の特徴量を抽出し、取引アルゴリズムを最適化する。
ティックフラグによる市場参加者の心理分析
ティックフラグを活用して市場参加者の心理を推測し、それに基づいて戦略を立てます。
- 買い取引(TICK_FLAG_BUY)と売り取引(TICK_FLAG_SELL)の比率を監視し、需要と供給のバランスを分析する。
- 一方的な取引パターン(例: 買い一辺倒)を検出して反対方向へのトレードを検討する。
これらのアイディアをもとに、CopyTicks関数を活用したEAを設計することで、市場の動向に適応した取引ロジックを構築できます。取引スタイルや目的に応じて、最適なアイディアを選択し実装してください。