Aller au contenu

Calculer les profits et pertes

Le calcul des P&P est un cas d'utilisation essentiel qui doit être implémenté par presque toutes les applications et services Open API de cTrader.

Calculer manuellement les P&P est un processus difficile car le calcul doit tenir compte de la taille de la position et de la conversion possible entre l'actif de cotation du symbole acheté ou vendu et la devise de dépôt du compte.

Heureusement, vous pouvez simplement demander au backend de cTrader de calculer les P&P pour vous en envoyant le message ProtoOAGetPositionUnrealizedPnLReq. Vous devriez recevoir le message ProtoOAGetPositionUnrealizedPnLRes contenant le message modèle ProtoOAPositionUnrealizedPnL dans l'un de ses champs.

Remarque

ProtoOAGetPositionUnrealizedPnLRes contient des informations sur les P&P de toutes les positions actuellement ouvertes du compte avec le ctidTraderAccountId spécifié dans son champ répété positionUnrealizedPnL.

Limites de taux

La demande de P&P est une requête non historique, ce qui signifie que vous ne pouvez effectuer qu'un maximum de 50 requêtes de ce type par seconde. Nous recommandons de rafraîchir les P&P une fois toutes les deux à trois secondes afin qu'il n'y ait aucun risque de dépasser les limites de taux.

Apprenez-en davantage sur l'envoi et la réception de messages dans les tutoriels sur Protobuf et JSON.

Lorsque vous travaillez avec Protobuf, vous pouvez utiliser les classes générées par le compilateur pour sérialiser et désérialiser le message pour obtenir les taux de P&P. Lorsque vous travaillez avec JSON, vous devrez créer ces classes vous-même. Voici un exemple de à quoi elles pourraient ressembler.

 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'])