シンボルデータ(たとえば、特定期間のすべてのバーのオープン価格とクローズ価格)を取得して解釈することは、次の機能のいずれかを持つアプリケーションで重要です。
- チャート。 バーまたはラインチャートを構築するには、過去およびライブのバー/クォートデータの両方を知る必要があります。
- 市場統計。 個々のシンボルの日次価格変動などの市場統計を表示したい場合は、過去およびライブの価格を取得する必要があります。
- リプレイ。 アプリケーションでトレーダーが過去のデータで「時間を遡って」取引し、取引を行うことができるようにする場合、過去のバーおよび/またはティックデータを取得および処理する必要があります。
このチュートリアルでは、歴史的およびライブのバー/ティックデータ、およびライブのデプスクォートを取得して処理する方法を示します。
チュートリアルは歴史的バーデータを取得するためのコードスニペットのみを提供しています。 行う操作に関係なく、コアロジックは同じままなので、このスニペットを他のタイプのデータを取得するために適応させることができます。
JSONを使用する
JSONを操作する場合、このチュートリアルのコードを再利用することができますが、シリアル化/デシリアル化のアプローチに応じて少し変更する必要があります。
歴史的なバーデータの取得
歴史的なバーのデータを受け取るには、次の手順を実行します。
ProtoOAGetTrendbarsReq
メッセージを表すオブジェクトを初期化します。- 必要な
ctidTraderAccountId
、symbolId
、ProtoOATrendbarPeriod
、返すトレンドバーのcount
、およびtoTimestamp
とfromTimestamp
の Unix タイムスタンプをオブジェクトのプロパティに入力します。
タイムスタンプの制約
toTimestamp
と fromTimestamp
の間の最大距離には制約があります。 これらの制約は指定された ProtoOATrendPeriod
に依存します。 詳細については、こちらをクリックしてください。
- 新しく作成したメッセージを送信し、
ProtoOAGetTrendbarsRes
タイプ の応答を受け取ります。 そのtrendbar
フィールドにアクセスして、トレンドバーのリストを取得します。 - データを相対フォーマットから実際のシンボル価格に変換します。 これを行うには、まずトレンドバーの低価格を取得し、100000で除算します。 次に、その結果をシンボルの桁(たとえば、区切り文字の後の数値)に丸めます。 トレンドバーの高価格、オープン価格、クローズ価格を取得するには、それぞれの価格のトレンドバーデルタをトレンドバーの低価格に加えます。 その後、それぞれの数値を100000で除算し、その結果をシンボルの桁に丸めます。
以下のコードを再利用して、これらの操作を完了させることができます。
private static async void TrendbarRequest(ProtoOATrendbarPeriod period, int accountId, int symbolId, int days)
{
Console.WriteLine("Sending ProtoOAGetTrendbarsReq...");
var request = new ProtoOAGetTrendbarsReq
{
CtidTraderAccountId = accountId,
SymbolId = symbolId,
Period = period,
FromTimestamp = DateTimeOffset.UtcNow.AddDays(-days).ToUnixTimeMilliseconds(),
ToTimestamp = DateTimeOffset.UtcNow.ToUnixTimeMilliseconds(),
};
Console.WriteLine($"FromTimestamp: {request.FromTimestamp} | ToTimestamp: {request.ToTimestamp}");
await _client.SendMessage(request);
}
public static double GetPriceFromRelative(ProtoOASymbol symbol, long relative) => Math.Round(relative / 100000.0, symbol.Digits);
private List OnHistoricalTrendbarsReceived(ProtoOAGetTrendbarsRes message)
{
var trendbars = message.Trendbar;
var data = new List();
foreach (var trendbar in trendbars)
{
data.Add(new Trendbar
{
Low = GetPriceFromRelative(symbol, trendbar.Low),
High = GetPriceFromRelative(symbol, trendbar.Low + (int)trendbar.DeltaHigh),
Open = GetPriceFromRelative(symbol, trendbar.Low + (int)trendbar.DeltaOpen),
Close = GetPriceFromRelative(symbol, trendbar.Low + (int)trendbar.DeltaClose),
}
);
}
return data;
}
def sendProtoOAGetTrendbarsReq(ctidTraderAccountId, weeks, period, symbolId, clientMsgId = None):
request = ProtoOAGetTrendbarsReq()
request.ctidTraderAccountId = ctidTraderAccountId
request.period = ProtoOATrendbarPeriod.Value(period)
request.fromTimestamp = int(calendar.timegm((datetime.datetime.utcnow() - datetime.timedelta(weeks=int(weeks))).utctimetuple())) * 1000
request.toTimestamp = int(calendar.timegm(datetime.datetime.utcnow().utctimetuple())) * 1000
request.symbolId = int(symbolId)
deferred = client.send(request, clientMsgId = clientMsgId)
def getPriceFromRelative(symbol, relative): round(relative / 100000.0, symbol.digits)
def onHistoricalTrendbarsReceived(message):
trendbars = message.trendbars
data = []
for trendbar in trenbars:
data.append(Trendbar(low=getPriceFromRelative(symbol, trendbar.low), high=getPriceFromRelative(symbol, trendbar.low + int(trendbar.deltaHigh)), open=getPriceFromRelative(symbol, trendbar.low + int(trendbar.deltaHigh)), close=getPriceFromRelative(symbol, trendbar.low +int(trendbar.deltaClose))))
return data
歴史的なティックデータの取得
歴史的なティックデータを受け取るには、次の手順を実行します。
ProtoOAGetTickDataReq
メッセージ を表すオブジェクトを初期化します。- 必要な
ctidTraderAccountId
、symbolId
、引用のtype
、fromTimestamp
、toTimestamp
をオブジェクトのプロパティに入力します。
タイムスタンプの制約
1 週間を超える期間の歴史的なティックデータをリクエストすることはできません。そのため、指定された toTimestamp
と fromTimestamp
の差は、 604800000
を超えてはいけません。
- 新しく作成したメッセージを送信し、
ProtoOAGetTickDataRes
タイプ の応答を受け取ります。そのtickData
フィールドにアクセスして、ProtoOATickData
タイプの要素のリストを取得します。 - データを相対フォーマットから実際のシンボル価格に変換します。そのためには、各ティックを100000で除算し、その結果をシンボルの桁に丸めます。
大量のティックのリクエスト
ProtoOAGetTickDataRes
メッセージで返されるティックの数には制限があります。この制限を超える場合(たとえば、指定された期間に多数のティックがある場合)、ProtoOAGetTickDataRes
メッセージにはティック制限よりも少ない数の最初の X ティックのみが含まれます。正確な制限は cTrader バックエンドの構成に依存します。
受信したメッセージに返されるよりも多くのティックが存在するかどうかを確認するには、hasMore
フラグを使用します。
ライブバーデータの取得
ライブバーを受信するには、次の手順を実行します。
ProtoOAGetTrendbarsReq
メッセージ を表す変数を初期化します。- 必要な
ctidTraderAccountId
、symbolId
、ProtoOATrendbarPeriod
、返すトレンドバーのcount
、およびtoTimestamp
とfromTimestamp
の Unix タイムスタンプをオブジェクトのプロパティに入力します。
タイムスタンプの制約
toTimestamp
と fromTimestamp
の間の最大距離には制約があります。これらの制約は指定された ProtoOATrendPeriod
に依存します。詳細については、こちらをクリックしてください。
- 新しく作成したメッセージを送信し、
ProtoOAGetTrendbarsRes
タイプ の応答を受け取ります。そのtrendbar
フィールドにアクセスして、トレンドバーのリストを取得します。 データを相対フォーマットから実際のシンボル価格に変換します。そのためには、まずトレンドバーの低価格を取得し、100000で除算します。次に、その結果をシンボルの桁(たとえば、区切り文字の後の数値)に丸めます。トレンドバーの高価格、オープン価格、クローズ価格を取得するには、それぞれの価格のトレンドバーデルタをトレンドバーの低価格に加えます。その後、それぞれの数値を100000で除算し、その結果をシンボルの桁に丸めます。
ProtoOASubscribeLiveTrendbarReq
メッセージ を表すオブジェクトを初期化します。ctidTraderAccountId
、ProtoOATrendbarPeriod
、およびsymbolId
でオブジェクトのプロパティを入力します。ProtoOASubscribeSpotsReq
メッセージ を表すオブジェクトも同様にします。- この順序で
ProtoOASubscribeSpotsReq
メッセージとProtoOASubscribeLiveTrendbarReq
メッセージを送信し、ProtoOASubscribeSpotsRes
タイプとProtoOASubscribeLiveTrenbarsRes
タイプ の応答を受け取ります。この時点で、ライブバーデータに登録されており、ProtoOASpotEvent
タイプ のメッセージを受信するはずです。
ライブトレンドバーへの登録
ライブトレンドバーに正常に登録するには、まずスポットイベントの登録が必要です。
- 新しい
ProtoOASpotEvent
メッセージを受信した場合、そのtrendbar
フィールドを使用して、最後に閉じたバーのデータを取得します。 - データを相対フォーマットから実際のシンボル価格に変換します。そのためには、まずトレンドバーの低価格を取得し、100000で除算します。次に、その結果をシンボルの桁(たとえば、区切り文字の後の数値)に丸めます。トレンドバーの高価格、オープン価格、クローズ価格を取得するには、それぞれの価格のトレンドバーデルタをトレンドバーの低価格に加えます。その後、それぞれの数値を100000で除算し、その結果をシンボルの桁に丸めます。
ライブトレンドバーデータの登録を解除するには、常に ProtoOAUnsubscribeLiveTrendbarsReq
メッセージ を送信し、 symbolId
、 period
、および ctidTraderAccountId
を指定します。リクエストが成功した場合、 ProtoOAUnsubscribeLiveTrenbarRes
タイプ の応答を受け取ります。スポットイベントの登録は引き続き有効です。
ライブクォートの取得
シンボルのライブ入札/出札のクォートを受信するには、次の手順を実行します。
ProtoOASubscribeSpotsReq
メッセージ を表すオブジェクトを初期化します。ctidTraderAccountId
、symbolId
、およびオプションでsubscribeToSpotTimestamp
をオブジェクトのプロパティに入力します。- 新しく作成したメッセージを送信し、
ProtoOASubscribeSpotsRes
タイプの応答を受け取ります。この時点で、ライブのクォートデータに登録されており、ProtoOASpotEvent
タイプ のメッセージを受信するはずです。 - 新しい
ProtoOASpotEvent
メッセージを受信した場合、そのbid
および/またはask
フィールドにアクセスして、最新のクォートを取得します。なお、データを実際の価格値に変換するには、依然として各クォートを100000で除算し、シンボルの桁に丸める必要があります。
入札/出札フィールド
bid
および ask
フィールドはオプションですので、両方が指定されている ProtoOASpotEvent
メッセージが表示されない可能性があります。
クォートデータの登録を解除するには、常に ProtoOAUnsubscribeSpotsReq
メッセージ を送信し、 symbolId
および ctidTraderAccountId
を指定します。リクエストが成功した場合、ProtoOAUnsubscribeSpotsRes
タイプ の応答を受け取ります。この時点で、スポットイベントの受信は停止します。
デプスクォート
最後に、シンボルのライブデプスまたはレベル II クォートを受信することもできます。このためには、次の手順を実行します。
API からシンボルのライブデプスまたはレベル II クォートを登録および受信できます。
ProtoOASubscribeDepthQuotesReq
メッセージ を表すオブジェクトを初期化します。ctidTraderAccountId
とsymbolId
をオブジェクトのプロパティに入力します。- 新しく作成したメッセージを送信し、
ProtoOASubscribeDepthQuotesRes
タイプ の応答を受け取ります。この時点で、デプスクォートに登録されており、ProtoOADepthEvent
メッセージ を受信するはずです。 - 新しい
ProtoOADepthEvent
メッセージを受信した場合、そのnewQuotes
およびdeletedQuotes
フィールドを使用して、最新のデプスデータを取得します。また、データを実際の価格値に変換するには、各データを100000で除算し、その結果をシンボルの桁に丸める必要があります。デプスクォートのサイズを単位に変換するには、100で除算する必要もあります。
デプスイベントの受信を解除するには、常に ProtoOAUnsubscribeDepthQuotesReq
メッセージ を使用し、 symbolId
と ctidTraderAccountId
を指定します。その後、ProtoOAUnsubscribeDepthQuotesRes
タイプ のメッセージを受信し、以降、デプスイベントを受信しなくなります。