Zarathustra2 / TradeRepublicApi

Unofficial trade republic API
MIT License
277 stars 68 forks source link

timelineCsvConverter.py index out of range for selling a fractional share (gift) by market order #19

Open bufemc opened 2 years ago

bufemc commented 2 years ago

timelineCsvConverter.py index out of range for selling a fractional share (giftby Stellantis) by market order, and selling I guess "Bezugsrechte" by Kion (this might be 2 bugs in 1 report):

This:

            profit = abs(float(re.findall("[-+]?\d.*\.\d+|\d+", body)[1].replace(",", "")) / 100) #as decimal (percentage)

works fine for e.g.

'Limit Sell order executed at 132.22 €\nProfit:  -1.18 %'

But breaks on:

'Sell order executed at 46.58 €'
'Sell order executed at 0.3727 €'

with (for both):

Traceback (most recent call last):
  File "C:\workspace\python\TradeRepublicApi\examples\timelineCsvConverter.py", line 180, in <module>
    profit = abs(float(re.findall("[-+]?\d.*\.\d+|\d+", body)[1].replace(",", "")) / 100) #as decimal (percentage)
IndexError: list index out of range

and (only for the second):

Traceback (most recent call last):
  File "C:\workspace\python\TradeRepublicApi\examples\timelineCsvConverter.py", line 187, in <module>
    shares = "{0:.4f}".format(cashChangeAmount / amountPerShare)
ZeroDivisionError: float division by zero

There is a clue: this was a and my only (maybe) fractional share I got from Stellantis as a "gift" once:

    {
        "type": "timelineEvent",
        "data": {
            "id": "***",
            "timestamp": 1618213392603,
            "icon": "https://assets.traderepublic.com/img/icon/timeline/Arrow-Left.png",
            "title": "Faurecia",
            "body": "Sell order executed at 46.58 \u20ac",
            "cashChangeAmount": 16.73,
            "action": {
                "type": "timelineDetail",
                "payload": "***"
            },
            "attributes": [],
            "month": "2021-04"
        }
    },

and I guess Bezugsrechte Kion:

    {
        "type": "timelineEvent",
        "data": {
            "id": "***",
            "timestamp": 1606928074040,
            "icon": "https://assets.traderepublic.com/img/icon/timeline/Arrow-Left.png",
            "title": "KION GROUP AG",
            "body": "Sell order executed at 0.3727 \u20ac",
            "cashChangeAmount": 4.74,
            "action": {
                "type": "timelineDetail",
                "payload": "***"
            },
            "attributes": [],
            "month": "2020-12"
        }
    },

Which could be sold only by market order and might even have no buy in. It's no big bug, as the occurence might be quite rare. But just wanted it to be noted.

First one is a "gift" by Stellantis and second one might be "Bezugsrechte" by Kion.

Workaround: edit myTimeline.json and change it e.g. to:

"Sell order executed at 46.58 €\nProfit:  0.00 %",

The latter one (Bezugsrechte) I added some print statements and it turned out that: cashChangeAmount = 4.74 amountPerShare = 0.0 So that's why division by zero error.

A really dirty quick workaround could be here:

            if amountPerShare == 0:
                amountPerShare = cashChangeAmount

If this issue should be too confusing I could create 2 issues instead, now it's mixed up a little ;)