An unofficial python API for trading on the DeGiro platform, with the ability to get real time data and historical data.

Overview

DegiroAPI

An unofficial API for the trading platform Degiro written in Python with the ability to get real time data and historical data for products.

DEPRECATED!

The package degiro-connector contains the same and much more functionality. It is also maintained well. Hence, the decision to deprecate this repository.

Credits

This project is a fork from DegiroAPI by lolokrauz. It was not actively maintained anymore, hence the creation of this repository.

Added changes

Over the original repository the following things were added:

  • Pre-commit hooks.
  • Style and type checking.
  • Dependencies handled by the setup instead of the user.
  • Typing information all over the code.
  • Removed logic from __init__.
  • Renaming of function, parameters and variables to adhere to pythons snake_case.

Getting Started

Installing

pip install degiroapi

Logging in

frmo degiroapi.degiro import DeGiro
degiro = DeGiro()
degiro.login("username", "password")

Logging out

degiro.logout()

Available Functions

  • login
  • logout
  • get_data
  • search_products
  • product_info
  • transactions
  • orders
  • delete_order
  • real_time_price
  • get_stock_list
  • buy_order
  • sell_order

get_data

Printing your current cash funds:

from degiroapi.data_type import DataType
cashfunds = degiro.get_data(DataType.CASHFUNDS)
for data in cashfunds:
    print(data)

Printing your current portfolio, argument True to filter out products with a size of 0, False or no Argument to show all:

from degiroapi.data_type import DataType
portfolio = degiro.get_data(DataType.PORTFOLIO, True)
for data in portfolio:
    print(data)

search_products

Searching for a product:

products = degiro.search_products('Pfizer')
print(Product(products[0]).id)

product_info

Printing info for a specified product ID:

info = degiro.product_info(331823)
print(info["id"], info["name"], info["currency"], info["closePrice"])

transactions

Printing your transactions in a given time interval:

from datetime import datetime, timedelta

transactions = degiro.transactions(datetime(2019, 1, 1), datetime.now())
print(pretty_json(transactions))

orders

Printing your order history(the maximum timespan is 90 days) With argument True, this function only returns open orders

from datetime import datetime, timedelta

orders = degiro.orders(datetime.now() - timedelta(days=90), datetime.now())
print(pretty_json(orders))

orders = degiro.orders(datetime.now() - timedelta(days=90), datetime.now(), True)
print(pretty_json(orders))

delete_order

Deleting an open order with the orderId

orders = degiro.orders(datetime.now() - timedelta(days=1), datetime.now(), True)
degiro.delete_order(orders[0]['orderId'])
degiro.delete_order("f278d56f-eaa0-4dc7-b067-45c6b4b3d74f")

real_time_price

Get the real time price and the historical data of a stock:

from degiro.interval_type import IntervalType

products = degiro.search_products('nrz')
# Interval can be set to One_Day, One_Week, One_Month, Three_Months, Six_Months, One_Year, Three_Years, Five_Years, Max
realprice = degiro.real_time_price(Product(products[0]).id, IntervalType.One_Day)

# getting the real time price
print(realprice[0]['data']['lastPrice'])
print(pretty_json(realprice[0]['data']))

# getting historical data
print(realprice[1]['data'])

get_stock_list

Get the symbols of the S&P500 stocks:

sp5symbols = []
products = degiro.get_stock_list(14, 846)
for product in products:
    sp5symbols.append(Product(product).symbol)

Get the symbols of the german30 stocks:

daxsymbols = []
products = degiro.get_stock_list(6, 906)
for product in products:
    daxsymbols.append(Product(product).symbol)

buy_order

Placing a buy order is dependent on the order Type:

Limit order

You have to set a limit order price to which the order gets executed. arguments: order type, product id, execution time type (either 1 for "valid on a daily basis", or 3 for unlimited, size, limit(the limit price)

from degiroapi.order_type import OrderType
degiro.buy_order(OrderType.LIMIT, Product(products[0]).id, 3, 1, 30)

StopLimit order

Sets a limit order when the stoploss price is reached (not bought for more than the limit at the stop loss price): arguments: order type, product id, execution time type (either 1 for "valid on a daily basis", or 3 for "unlimited"), size, limit(the limit price), stop_loss(stop loss price)

from degiroapi.order_type import OrderType
degiro.buy_order(OrderType.STOPLIMIT, Product(products[0]).id, 3, 1, 38, 38)

Market order

Bought at the market price: arguments: order type, product id, execution time type (either 1 for "valid on a daily basis", or 3 for "unlimited"), size

from degiroapi.order_type import OrderType
degiro.buy_order(OrderType.MARKET, Product(products[0]).id, 3, 1)

StopLoss order

The stop loss price has to be higher than the current price, when current price reaches the stoploss price the order is placed: arguments: order type, product id, execution time type (either 1 for "valid on a daily basis", or 3 for "unlimited"), size

from degiroapi.order_type import OrderType
degiro.buy_order(OrderType.STOPLOSS, Product(products[0]).id, 3, 1, None, 38)

sell_order

Placing a sell order is dependent on the order Type: Equivalent to the buy orders:

from degiroapi.order_type import OrderType
degiro.sell_order(OrderType.LIMIT, Product(products[0]).id, 3, 1, 40)
from degiroapi.order_type import OrderType
degiro.sell_order(OrderType.STOPLIMIT, Product(products[0]).id, 3, 1, 37, 38)
from degiroapi.order_type import OrderType
degiro.sell_order(OrderType.MARKET, Product(products[0]).id, 3, 1)
from degiroapi.order_type import OrderType
degiro.sell_order(OrderType.STOPLOSS, Product(products[0]).id, 3, 1, None, 38)

Usage

For documented examples see examples.py

Contributing

How great this project will turn out to be, totally depends on you. If you think you have a great addition, please create a PR :). If you are unfamilar with pull requests, please take a look here.

Requirements

In order for your commit to be accepted, please install pre-commit. This will run a couple of tools to make sure the formatting of the code is good and there are no obvious mistakes.

Installing pre-commit

pre-commit install

Now everytime you will commit, it will automatically run the pre-commit hooks. If you are using Pycharm, the errors appear in git(left bottom) -> console.

You might also like...
OnTime is a small python that you set a time and on that time, app will send you notification and also play an alarm.

OnTime Always be OnTime! What is OnTime? OnTime is a small python that you set a time and on that time, app will send you notification and also play a

Stocks Trading News Alert Using Python

Stocks-Trading-News-Alert-Using-Python Ever Thought of Buying Shares of your Dream Company, When their stock price got down? But It is not possible to

Simple Python API for the Ergo Platform Explorer
Simple Python API for the Ergo Platform Explorer

Ergo is a "Resilient Platform for Contractual Money." It is designed to be a platform for applications with the main focus to provide an efficient, se

Graphene Metanode is a locally hosted node for one account and several trading pairs, which uses minimal RAM resources.

Graphene Metanode is a locally hosted node for one account and several trading pairs, which uses minimal RAM resources. It provides the necessary user stream data and order book data for trading in a format one would expect from a centralized exchange API.

A pairs trade is a market neutral trading strategy enabling traders to profit from virtually any market conditions.

A pairs trade is a market neutral trading strategy enabling traders to profit from virtually any market conditions. This strategy is categorized as a statistical arbitrage and convergence trading strategy.

Senator Stock Trading Tester

Senator Stock Trading Tester Program to compare stock performance of Senator's transactions vs when the sale is disclosed. Using to find if tracking S

Unofficial Python Library to communicate with SESAME 3 series products from CANDY HOUSE, Inc.

pysesame3 Unofficial Python Library to communicate with SESAME 3 series products from CANDY HOUSE, Inc. This project aims to control SESAME 3 series d

Unofficial Python implementation of the DNMF overlapping community detection algorithm

DNMF Unofficial Python implementation of the Discrete Non-negative Matrix Factorization (DNMF) overlapping community detection algorithm Paper Ye, Fan

Unofficial Valorant documentation and tools for third party developers

Valorant Third Party Toolkit This repository contains unofficial Valorant documentation and tools for third party developers. Our goal is to centraliz

Comments
  • Could not login since this week. Does everybody experience this problem?

    Could not login since this week. Does everybody experience this problem?

    You are not supposed to be here Reference: 01c39b5b6e8855f9a109602b826b8a89 Remote IP: 164.90.200.176 Identifier: 69f25a1512df4531acb32e9e6e22f3cd=python_bot Date: 11/Dec/2022:18:54:46 +0100

    opened by uptodata 0
  • Could not login

    Could not login

    While executing degiro.login():

    Exception: Could not login. Response: ...

    You are not supposed to be here

    Reference: 56a89c89a5fbe8faf38d15fbd1283c11

    Remote IP: 88.149.xxx.xxx

    Identifier: 69f25a1512df4531acb32e9e6e22f3cd=python_bot

    Date: 10/Dec/2022:12:45:47 +0100

    opened by TriposDev 0
  • real_time_price ValueError: invalid literal for int() with base 10

    real_time_price ValueError: invalid literal for int() with base 10

    The command 'real_time_price' most of the times complete the gathering of data, but sometimes comes out the this error:

    Traceback (most recent call last):

    File "C:\Users\840653\Anaconda3\lib\site-packages\degiroapi_init_.py", line 224, in real_time_price int(tmp)

    ValueError: invalid literal for int() with base 10: 'US6806652052.TRADE,E'

    If I run it again, it works and then fails with a different product id.

    opened by paulomiguelfferreira 1
  • Releases(0.1.0)
    • 0.1.0(Sep 14, 2021)

    • v0.0.5(Sep 12, 2021)

    • v0.0.4(Sep 12, 2021)

    • v0.0.3(Sep 12, 2021)

    • v0.0.2(Sep 12, 2021)

    • v0.0.1(Sep 12, 2021)

      This is a project that was based on https://github.com/lolokraus/DegiroAPI. It still contains 90% the same code.

      Changelog:

      • Add requests as dependency in setup.py. This prevents the need for users to install it themselves.
      • Add typing information.
      • Add some pre-commit hooks.
      • Add logging in with 2FA (thanks @pforero)
      • Add modify_order (thanks @adamchabin)
      • Add get account overview (thanks @pforero)
      • Add common exchange rates (thanks @blunderedbishop)
      • Add list of dividends that will be paid (thanks @Jakub-CZ)
      • Add session usage (thanks @eugep)
      • Add support for missing close price in product (thanks @Jakub-CZ)
      • Formatted readme (thanks @ahmedhamedaly)
      • Add support for multiple vwd keys (thanks @hjortlund)
      Source code(tar.gz)
      Source code(zip)
    Owner
    Jorrick Sleijster
    Data Engineer @Adyen
    Jorrick Sleijster
    Commodore 64 OS running on Atari 8-bit hardware

    This is the Commodre 64 KERNAL, modified to run on the Atari 8-bit line of computers. They're practically the same machine; why didn't someone try this 30 years ago?

    Nick Bensema 133 Nov 12, 2022
    COVID-19 case tracker in Dash

    covid_dashy_personal This is a personal project to build a simple COVID-19 tracker for Australia with Dash. Key functions of this dashy will be to Dis

    Jansen Zhang 1 Nov 30, 2021
    Repositório do Projeto de Jogo da Resília Educação.

    Jogo da Segurança das Indústrias Acme Descrição Este jogo faz parte do projeto de entrega do primeiro módulo da Resilia Educação, referente ao curso d

    Márcio Estevam da Silva 2 Apr 28, 2022
    WorldsCollide - Final Fantasy VI Randomizer

    FFVI Worlds Collide Worlds Collide is an open worlds randomizer for Final Fantas

    8 Jun 13, 2022
    Custom python interface to xstan (a modified (cmd)stan)

    Custom python interface to xstan (a modified (cmd)stan) Use at your own risk, currently everything is very brittle and will probably be changed in the

    2 Dec 16, 2021
    Task dispatcher for Postgres

    Features a task being ran as an OS process supports task queue with priority and process limit per node fully database driven (a worker and task can b

    2 Dec 06, 2021
    Graphene Metanode is a locally hosted node for one account and several trading pairs, which uses minimal RAM resources.

    Graphene Metanode is a locally hosted node for one account and several trading pairs, which uses minimal RAM resources. It provides the necessary user stream data and order book data for trading in a

    litepresence 5 May 08, 2022
    Workshop OOP - Workshop OOP - Discover object-oriented programming

    About: This is an open-source bot, the code is open for anyone to see, fork and

    Francis Clairicia-Rose-Claire-Joséphine 5 May 02, 2022
    A Python feed reader library.

    reader is a Python feed reader library. It aims to allow writing feed reader applications without any business code, and without enforcing a dependenc

    266 Dec 30, 2022
    Use this function to get list of routes for particular journey

    route-planner Functions api_processing Use this function to get list of routes for particular journey. Function has three parameters: Origin Destinati

    2 Nov 28, 2021
    Cylc: a workflow engine for cycling systems

    Cylc: a workflow engine for cycling systems. Repository master branch: core meta-scheduler component of cylc-8 (in development); Repository 7.8.x branch: full cylc-7 system.

    The Cylc Workflow Engine 205 Dec 20, 2022
    ThnoolBox - A thneed is a multi-use versatile object

    ThnoolBox Have you ever wanted a collection of bodged desktop apps that are Lorax themed ? No ? Sucks to suck I guess Apps & their downsides CalculaTh

    pocoyo 1 Jan 21, 2022
    CPLib is the abbreviation of Competitive Programming Library.

    CPLib CPLib is the abbreviation of Competitive Programming Library. It aims to be a general template and optimization library for competitive programm

    12 Oct 16, 2021
    A small Blender addon for changing an object's local orientation while in edit mode

    A small Blender addon for changing an object's local orientation while in edit mode.

    Jonathan Lampel 50 Jan 06, 2023
    JD-backup is an advanced Python script, that will extract all links from a jDownloader 2 file list and export them to a text file.

    JD-backup is an advanced Python script, that will extract all links from a jDownloader 2 file list and export them to a text file.

    Kraken.snv 3 Jun 07, 2022
    Collections of python projects

    nppy, mostly contains projects written in Python. Some projects are very simple while some are a bit lenghty and difficult(for beginners) Requirements

    ghanteyyy 75 Dec 20, 2022
    Random Programming Language Project

    Crastle Random Programming Language Project Freedom of expression Are you a fan of curly brace languages? Then use curly braces! Not a fan of curly br

    DevNugget 2 Dec 23, 2021
    Grimoire is a Python library for creating interactive fiction as hyperlinked html.

    Grimoire Grimoire is a Python library for creating interactive fiction as hyperlinked html. Installation pip install grimoire-if Usage Check out the

    Scott Russell 5 Oct 11, 2022
    apysc is the Python frontend library to create html and js file, that has ActionScript 3 (as3)-like interface.

    apysc apysc is the Python frontend library to create HTML and js files, that has ActionScript 3 (as3)-like interface. Notes: Currently developing and

    simonritchie 17 Dec 14, 2022
    DeDRM tools for ebooks

    DeDRM_tools DeDRM tools for ebooks This is a fork of Apprentice Harper's version of the DeDRM tools. I've added some of the PRs that still haven't bee

    2 Jan 10, 2022