シンボルデータの取得

API

シンボルデータ(たとえば、特定期間のすべてのバーのオープン価格とクローズ価格)を取得して解釈することは、次の機能のいずれかを持つアプリケーションで重要です。

  • チャート。 バーまたはラインチャートを構築するには、過去およびライブのバー/クォートデータの両方を知る必要があります。
  • 市場統計。 個々のシンボルの日次価格変動などの市場統計を表示したい場合は、過去およびライブの価格を取得する必要があります。
  • リプレイ。 アプリケーションでトレーダーが過去のデータで「時間を遡って」取引し、取引を行うことができるようにする場合、過去のバーおよび/またはティックデータを取得および処理する必要があります。

このチュートリアルでは、歴史的およびライブのバー/ティックデータ、およびライブのデプスクォートを取得して処理する方法を示します。

チュートリアルは歴史的バーデータを取得するためのコードスニペットのみを提供しています。 行う操作に関係なく、コアロジックは同じままなので、このスニペットを他のタイプのデータを取得するために適応させることができます。

JSONを使用する

JSONを操作する場合、このチュートリアルのコードを再利用することができますが、シリアル化/デシリアル化のアプローチに応じて少し変更する必要があります。

歴史的なバーデータの取得

歴史的なバーのデータを受け取るには、次の手順を実行します。

  • ProtoOAGetTrendbarsReq メッセージを表すオブジェクトを初期化します。
  • 必要な ctidTraderAccountIdsymbolIdProtoOATrendbarPeriod、返すトレンドバーの count、および toTimestampfromTimestamp の Unix タイムスタンプをオブジェクトのプロパティに入力します。

タイムスタンプの制約

toTimestampfromTimestamp の間の最大距離には制約があります。 これらの制約は指定された 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<Trendbar> OnHistoricalTrendbarsReceived(ProtoOAGetTrendbarsRes message) 
{
    var trendbars = message.Trendbar;

    var data = new List<Trendbar>();

    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 メッセージ を表すオブジェクトを初期化します。
  • 必要な ctidTraderAccountIdsymbolId、引用の typefromTimestamptoTimestamp をオブジェクトのプロパティに入力します。

タイムスタンプの制約

1 週間を超える期間の歴史的なティックデータをリクエストすることはできません。そのため、指定された toTimestampfromTimestamp の差は、 604800000 を超えてはいけません。

  • 新しく作成したメッセージを送信し、ProtoOAGetTickDataRes タイプ の応答を受け取ります。その tickData フィールドにアクセスして、ProtoOATickData タイプの要素のリストを取得します。
  • データを相対フォーマットから実際のシンボル価格に変換します。そのためには、各ティックを100000で除算し、その結果をシンボルの桁に丸めます。

大量のティックのリクエスト

ProtoOAGetTickDataRes メッセージで返されるティックの数には制限があります。この制限を超える場合(たとえば、指定された期間に多数のティックがある場合)、ProtoOAGetTickDataRes メッセージにはティック制限よりも少ない数の最初の X ティックのみが含まれます。正確な制限は cTrader バックエンドの構成に依存します。

受信したメッセージに返されるよりも多くのティックが存在するかどうかを確認するには、hasMore フラグを使用します。

ライブバーデータの取得

ライブバーを受信するには、次の手順を実行します。

  • ProtoOAGetTrendbarsReq メッセージ を表す変数を初期化します。
  • 必要な ctidTraderAccountIdsymbolIdProtoOATrendbarPeriod、返すトレンドバーの count、および toTimestampfromTimestamp の Unix タイムスタンプをオブジェクトのプロパティに入力します。

タイムスタンプの制約

toTimestampfromTimestamp の間の最大距離には制約があります。これらの制約は指定された ProtoOATrendPeriodに依存します。詳細については、こちらをクリックしてください。

  • 新しく作成したメッセージを送信し、ProtoOAGetTrendbarsRes タイプ の応答を受け取ります。その trendbar フィールドにアクセスして、トレンドバーのリストを取得します。
  • データを相対フォーマットから実際のシンボル価格に変換します。そのためには、まずトレンドバーの低価格を取得し、100000で除算します。次に、その結果をシンボルの桁(たとえば、区切り文字の後の数値)に丸めます。トレンドバーの高価格、オープン価格、クローズ価格を取得するには、それぞれの価格のトレンドバーデルタをトレンドバーの低価格に加えます。その後、それぞれの数値を100000で除算し、その結果をシンボルの桁に丸めます。

  • ProtoOASubscribeLiveTrendbarReq メッセージ を表すオブジェクトを初期化します。

  • ctidTraderAccountIdProtoOATrendbarPeriod、および symbolId でオブジェクトのプロパティを入力します。
  • ProtoOASubscribeSpotsReq メッセージ を表すオブジェクトも同様にします。
  • この順序で ProtoOASubscribeSpotsReq メッセージと ProtoOASubscribeLiveTrendbarReq メッセージを送信し、ProtoOASubscribeSpotsRes タイプと ProtoOASubscribeLiveTrenbarsRes タイプ の応答を受け取ります。この時点で、ライブバーデータに登録されており、 ProtoOASpotEvent タイプ のメッセージを受信するはずです。

ライブトレンドバーへの登録

ライブトレンドバーに正常に登録するには、まずスポットイベントの登録が必要です。

  • 新しい ProtoOASpotEvent メッセージを受信した場合、その trendbar フィールドを使用して、最後に閉じたバーのデータを取得します。
  • データを相対フォーマットから実際のシンボル価格に変換します。そのためには、まずトレンドバーの低価格を取得し、100000で除算します。次に、その結果をシンボルの桁(たとえば、区切り文字の後の数値)に丸めます。トレンドバーの高価格、オープン価格、クローズ価格を取得するには、それぞれの価格のトレンドバーデルタをトレンドバーの低価格に加えます。その後、それぞれの数値を100000で除算し、その結果をシンボルの桁に丸めます。

ライブトレンドバーデータの登録を解除するには、常に ProtoOAUnsubscribeLiveTrendbarsReq メッセージ を送信し、 symbolIdperiod、および ctidTraderAccountId を指定します。リクエストが成功した場合、 ProtoOAUnsubscribeLiveTrenbarRes タイプ の応答を受け取ります。スポットイベントの登録は引き続き有効です。

ライブクォートの取得

シンボルのライブ入札/出札のクォートを受信するには、次の手順を実行します。

  • ProtoOASubscribeSpotsReq メッセージ を表すオブジェクトを初期化します。
  • ctidTraderAccountIdsymbolId、およびオプションで subscribeToSpotTimestamp をオブジェクトのプロパティに入力します。
  • 新しく作成したメッセージを送信し、ProtoOASubscribeSpotsRes タイプの応答を受け取ります。この時点で、ライブのクォートデータに登録されており、 ProtoOASpotEvent タイプ のメッセージを受信するはずです。
  • 新しい ProtoOASpotEvent メッセージを受信した場合、その bid および/または ask フィールドにアクセスして、最新のクォートを取得します。なお、データを実際の価格値に変換するには、依然として各クォートを100000で除算し、シンボルの桁に丸める必要があります。

入札/出札フィールド

bid および ask フィールドはオプションですので、両方が指定されている ProtoOASpotEvent メッセージが表示されない可能性があります。

クォートデータの登録を解除するには、常に ProtoOAUnsubscribeSpotsReq メッセージ を送信し、 symbolId および ctidTraderAccountId を指定します。リクエストが成功した場合、ProtoOAUnsubscribeSpotsRes タイプ の応答を受け取ります。この時点で、スポットイベントの受信は停止します。

デプスクォート

最後に、シンボルのライブデプスまたはレベル II クォートを受信することもできます。このためには、次の手順を実行します。

API からシンボルのライブデプスまたはレベル II クォートを登録および受信できます。

  • ProtoOASubscribeDepthQuotesReq メッセージ を表すオブジェクトを初期化します。
  • ctidTraderAccountIdsymbolId をオブジェクトのプロパティに入力します。
  • 新しく作成したメッセージを送信し、ProtoOASubscribeDepthQuotesRes タイプ の応答を受け取ります。この時点で、デプスクォートに登録されており、 ProtoOADepthEvent メッセージ を受信するはずです。
  • 新しい ProtoOADepthEvent メッセージを受信した場合、その newQuotes および deletedQuotes フィールドを使用して、最新のデプスデータを取得します。また、データを実際の価格値に変換するには、各データを100000で除算し、その結果をシンボルの桁に丸める必要があります。デプスクォートのサイズを単位に変換するには、100で除算する必要もあります。

デプスイベントの受信を解除するには、常に ProtoOAUnsubscribeDepthQuotesReq メッセージ を使用し、 symbolIdctidTraderAccountId を指定します。その後、ProtoOAUnsubscribeDepthQuotesRes タイプ のメッセージを受信し、以降、デプスイベントを受信しなくなります。

このページについて