손익 계산
손익(P&L) 계산은 거의 모든 cTrader Open API 애플리케이션 및 서비스에서 구현해야 하는 필수 사용 사례입니다.
수동으로 손익을 계산하는 것은 포지션 크기와 매수 또는 매도한 심볼의 견적 자산과 계정 예치 통화 간의 가능한 환전을 고려해야 하기 때문에 어려운 과정입니다.
다행히도, ProtoOAGetPositionUnrealizedPnLReq 메시지를 전송하여 cTrader 백엔드에 손익을 계산하도록 요청할 수 있습니다. 그러면 ProtoOAGetPositionUnrealizedPnLRes 메시지를 받게 되며, 이 메시지에는 ProtoOAPositionUnrealizedPnL 모델 메시지가 포함되어 있습니다.
요율 제한
손익 요청은 비역사적 요청이므로, 초당 최대 50회까지만 요청할 수 있습니다. 요율 제한을 초과할 위험 없이 손익을 2~3초마다 한 번씩 새로 고칠 것을 권장합니다.
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'])
|