シンボルレート変換¶
損益計算に関連する機能をアプリケーションに含めたい場合、シンボルレート変換は必須のアクションです。
ユースケース
手数料、スワップ、および配当を計算する際に、シンボルレート変換を実行する必要があります。 手数料、スワップ、および配当は通常USDで表示されます。 ただし、ブローカーと設定によっては、アカウントの入金通貨がUSD以外の資産である場合があります。 手数料、スワップ、および配当を正確に定義するには、USDとアカウントの入金通貨間の為替レートを知る必要があります。
変換チェーン
各シンボルの価格を、その基本資産とクォート資産間の変換レートとして考えてください。 ある資産から別の資産に直接リンクするシンボルがない場合、変換レートを取得するタスクは複雑になります。 幸い、cTraderのバックエンドは、ある資産から別の資産への最短の変換パスとして機能する変換チェーンを自動的に作成できます。
例えば、EURをNZDに変換したいが、取引サーバーにEURNZDシンボルがない場合、cTraderは変換プロセスの中間ステップとして機能するチェーンを提案します。 シンボルの可用性に応じて、そのようなチェーンはEURUSD-USDCAD-CADNZD、EURCFH-CFHUSD-USDNZD、またはEURCAD-CADUSD-USDCFH-CFHNZDのようになる可能性があります。
2つの資産間で変換するには、アプリは次のアクションを実行する必要があります。
- 変換したい資産のIDにアクセスします。
- 1つ以上のライトシンボルを含む変換チェーンを取得します。
- スポットイベントを購読し、処理します。
- 変換チェーンを追跡し、最終的な変換レートを返します。
以下では、これらのアクションについて詳しく説明します。
アセットIDへのアクセス ¶
アセットIDは、ライトシンボルエンティティ(ProtoOALightSymbolモデルメッセージで表される)のプロパティとして直接アクセスできます。 さらに、関連するProtoOaTraderエンティティからアカウントのデポジット通貨のIDを直接取得できます。
以下の例では、1つのシンボルのアセットIDのみを取得していることに注意してください。 複数のシンボルに対して同じ操作を実行するには、ループを追加するか、別の適切なソリューション(例えば、map()メソッドまたは同等のもの)を使用する必要があります。
JSONでの作業
JSONで作業する場合でも、以下のコードやこのチュートリアルの他のコードスニペットを再利用できます。 ただし、Proto...クラスの名前をカスタムクラスの名前に置き換え、好みのTCPおよびWebSocketクライアントに対応するために必要な変更を行ってください。
symbolはProtoOALightSymbol型の変数です。 JSONを使用している場合、ProtoOALightSymbolメッセージを表す任意のカスタム型にすることができます。
1 2 | |
以下の例では、ProtoOATrader型のaccountオブジェクトのデポジット通貨のIDを取得します。
1 | |
symbolはProtoOALightSymbol型のメッセージを表す変数です。
1 2 | |
以下の例では、ProtoOATraderモデルメッセージを表すaccountオブジェクトのデポジット通貨のIDを取得します。
1 | |
変換チェーンの取得 ¶
有効な変換チェーンを取得するには、アプリがProtoOASymbolsForConversionReqメッセージを送信し、firstAssetIdとlastAssetIdフィールドを変換したいアセットのIDに設定する必要があります。 ProtoOASymbolsForConversionRes型の応答を受け取ったら、その繰り返しsymbolフィールドをコレクション内に保存します。
公式SDKを使用してこのアクションを実行する方法は以下の通りです。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 | |
1 2 3 4 5 | |
onMessageReceivedコールバックに以下の条件も追加してください。
1 2 3 | |
注意
サーバーからアセットデータを初めてリクエストして受け取ったときに、各アセットのすべての変換チェーンシンボルを取得することを強くお勧めします。 そうしないと、レートを変換する必要があるたびにProtoOASymbolsForConversionReqメッセージを送信しなければならず、場合によっては1秒間に数回送信する必要があるかもしれません。
注意
ProtoOALightSymbolエンティティには売値や買値を表すフィールドが含まれていないため、カスタムSymbolクラスまたは同等のものを作成し、プログラムで新しいシンボルを簡単に作成し、特定のイベントがトリガーされたときにそのプロパティを更新することを強くお勧めします。 ライトシンボルをこのクラスのオブジェクトに変換する必要があります。
スポットイベントの購読と処理 ¶
変換チェーンを最初から最後まで追跡するには、チェーンに含まれるすべてのシンボルのProtoOASpotEventを購読する必要があります。 公式SDKを使用して以下のように行います。
以下の操作を実行する前に、Symbolクラスまたは同等のものを作成し、プログラムで新しいシンボルを簡単に作成し、特定のイベントがトリガーされたときにそのプロパティを更新できるようにします。 以下の例では、SymbolクラスにProtoOASymbolおよびProtoOALightSymbolオブジェクトがプロパティとして含まれています。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 | |
また、スポットイベントを購読し、それらを処理する必要があります。 以下の例では、ライトシンボルを保存するsymbolsコレクションにアクセスします。 受け取ったProtoOASpotEventのsymbolIdフィールドと一致するIDを持つシンボルオブジェクトを見つけます。 最後に、GetPriceFromRelativeヘルパーメソッドを使用してsymbolのbidおよびaskプロパティを更新します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 | |
特定のシンボルのProtoOASpotEventを購読するために、以下の関数を使用できます。 これは1つのシンボルのみを購読するため、変換シンボルのコレクション内のすべてのライトシンボルに対してこの関数を呼び出す必要があります。
1 2 3 4 5 6 7 | |
スポットイベントを処理するために、onMessageReceivedコールバックに以下の条件を追加できます。
1 2 3 | |
最後に、onSpotEventコールバックは以下の通りです。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | |
Symbolクラスでは、getPipsFromRelative関数は以下のように定義されています:
1 2 3 4 | |
pipPositionおよびdigitsプロパティの値は別途取得する必要があることに注意してください。
変換チェーンを追跡し、最終的な変換レートを返す ¶
この時点で、変換チェーン内のすべてのシンボルがスポットレートを受け取り、各シンボルの正確な売値と買値にアクセスできるはずです。 あとは変換チェーンをたどり、最終的なレートを返すだけです。 これは以下のように行うことができます:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 | |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | |