计算盈亏
计算盈亏是几乎所有 cTrader Open API 应用程序和服务都需要实现的基本用例。
手动计算盈亏是一个困难的过程,因为计算需要考虑头寸大小以及买入或卖出的交易品种的报价资产与账户存款货币之间的可能转换。
幸运的是,您可以通过发送ProtoOAGetPositionUnrealizedPnLReq 消息简单地要求 cTrader 后端为您计算盈亏。 您应该会收到ProtoOAGetPositionUnrealizedPnLRes 消息,其中包含ProtoOAPositionUnrealizedPnL 模型消息作为其字段之一。
速率限制
请求盈亏是非历史性请求,这意味着您每秒最多只能执行 50 次此类请求。 我们建议每两到三秒刷新一次盈亏,这样就不会有超过速率限制的风险。
了解更多关于在Protobuf 和 JSON 教程中发送和接收消息的信息。
当使用 Protobuf 操作时,您可以使用编译器生成的类来序列化和反序列化消息以获取盈亏率。 当使用 JSON 操作时,您需要自己创建这些类。 以下是它们可能的样子。
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
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70 | public abstract class OpenAPIModelMessageBase { }
public class PositionUnrealizedPnL : OpenAPIModelMessageBase
{
public PositionUnrealizedPnL() { }
public PositionUnrealizedPnL(int positionId, int grossUnrealizedPnL, int netUnrealizedPnL)
{
this.PositionId = positionId;
this.GrossUnrealizedPnL = grossUnrealizedPnL;
this.NetUnrealizedPnL = netUnrealizedPnL;
}
public int PositionId { get; set; }
public int GrossUnrealizedPnL { get; set; }
public int NetUnrealizedPnL { get; set; }
}
public class GetPositionUnrealizedPnLReq : OpenAPIMessageBase
{
public GetPositionUnrealizedPnLReq() { }
public GetPositionUnrealizedPnLReq(int ctidTraderAccountId)
{
this.Payload = new GetPositionUnrealizedPnLReqPayload(ctidTraderAccountId);
this.ClientMsgId = Guid.NewGuid().ToString();
}
public override int PayloadType => 2187;
public GetPositionUnrealizedPnLReqPayload? Payload { get; set; }
}
public class GetPositionUnrealizedPnLReqPayload : OpenAPIMessagePayloadBase
{
public GetPositionUnrealizedPnLReqPayload() { }
public GetPositionUnrealizedPnLReqPayload(int ctidTraderAccountId)
{
this.CtidTraderAccountId = ctidTraderAccountId;
}
public int CtidTraderAccountId { get; set; } = 0;
}
public class GetPositionUnrealizedPnLRes : OpenAPIMessageBase
{
public GetPositionUnrealizedPnLRes() { }
public GetPositionUnrealizedPnLRes(int ctidTraderAccountId, int moneyDigits, List<PositionUnrealizedPnL> positionUnrealizedPnL)
{
this.Payload = new GetPositionUnrealizedPnLResPayload(ctidTraderAccountId, moneyDigits, positionUnrealizedPnL);
this.ClientMsgId = Guid.NewGuid().ToString();
}
public override int PayloadType => 2188;
public GetPositionUnrealizedPnLResPayload? Payload { get; set; }
}
public class GetPositionUnrealizedPnLResPayload : OpenAPIMessagePayloadBase
{
public GetPositionUnrealizedPnLResPayload() { }
public GetPositionUnrealizedPnLResPayload(int ctidTraderAccountId, int moneyDigits, List<PositionUnrealizedPnL> positionUnrealizedPnL)
{
this.CtidTraderAccountId = ctidTraderAccountId;
this.MoneyDigits = moneyDigits;
this.PositionUnrealizedPnL = positionUnrealizedPnL;
}
public int CtidTraderAccountId { get; set; } = 0;
public int MoneyDigits { get; set; } = 0;
public List<PositionUnrealizedPnL> PositionUnrealizedPnL { get; set; } = new List<PositionUnrealizedPnL>();
}
|
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
36
37 | class OpenAPIModelMessage:
def __init__(self):
pass
class PositionUnrealizedPnL(OpenAPIModelMessage):
def __init__(self, position_id, gross_unrealized_pnl, net_unrealized_pnl):
self.position_id = position_id
self.gross_unrealized_pnl = gross_unrealized_pnl
self.net_unrealized_pnl = net_unrealized_pnl
class GetPositionUnrealizedPnLReq(OpenAPIMessage):
def __init__(self, ctid_trader_account_id, client_msg_id = str(uuid.uuid4())):
self.ctid_trader_account_id = ctid_trader_account_id
self.payload_type = 2187
self.client_msg_id = client_msg_id
self.payload = {"ctidTraderAccountId": self.ctid_trader_account_id}
def as_json_string(self):
return json.dumps({"clientMsgId": self.client_msg_id, "payloadType": self.payload_type, "payload": self.payload})
@staticmethod
def from_json(json_dct):
return GetPositionUnrealizedPnLReq(client_id=json_dct['payload']['clientId'], client_secret=json_dct['payload']['clientSecret'], client_msg_id=json_dct['clientMsgId'])
class GetPositionUnrealizedPnLRes(OpenAPIMessage):
def __init__(self, ctid_trader_account_id, position_unrealized_pnl, money_digits, client_msg_id):
self.ctid_trader_account_id = ctid_trader_account_id
self.position_unrealized_pnl = position_unrealized_pnl
self.money_digits = money_digits
self.client_msg_id = client_msg_id
def as_json_string(self):
return json.dumps({"clientMsgId": self.client_msg_id, "payloadType": self.payload_type, "payload": self.payload})
@staticmethod
def from_json(json_dct):
return GetPositionUnrealizedPnLRes(ctid_trader_account_id=json_dct['payload']['clientSecret'], position_unrealized_pnl=json_dct['payload']['positionUnrealizedPnL'], money_digits=json_dct['payload']['moneyDigits'], client_msg_id=['clientMsgId'])
|