[Python] Bitvavo automatische trade

Pagina: 1
Acties:

Vraag


Acties:
  • 0 Henk 'm!

  • ironheart
  • Registratie: September 2022
  • Laatst online: 29-09 12:45
*snip* Laat dit soort flauw geneuzel gewoon achterwege joh.

PS. Heb deze vraag ook gepost op Cryptocurrencies maar ik weet niet of deze daar wel echt thuishoort.


Hoi,

Ik probeer een automatische trade te doen via Python.

Wat ik al heb:

code:
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
import requests
import os
import time
import hashlib
import hmac

response = requests.get('https://api.bitvavo.com/v2/time')
API_Data = response.json()
bitvavo_tijd =  API_Data['time']

os.system('clear')

#message = str(bitvavo_tijd)+'GET/order'
message = str(bitvavo_tijd)+'GET/order{\"market\":\"BTC-EUR\"}'

print(message)

secret = "Lange sleutel"

signature = hmac.new(bytes(secret , 'utf-8'), msg = bytes(message , 'utf-8'), digestmod = hashlib.sha256).hexdigest().upper()
print(signature)

headers = {
    'Bitvavo-Access-Key': 'Korte_sleutel',
    'Bitvavo-Access-Signature': signature,
    'Bitvavo-Access-Timestamp': str(bitvavo_tijd),
    'Bitvavo-Access-Window': '10000',
    'Content-Type': 'application/json',
}

json_data = {
    'market': 'BTC-EUR',
    'side': 'buy',
    'orderType': 'market',
    'amount': '10',
    'responseRequired': True,
}

response = requests.post('https://api.bitvavo.com/v2/order', headers=headers, json=json_data)
print(response.text)


Ik blijf echter terugkrijgen:

code:
1
{"errorCode":309,"error":"The signature is invalid."}


k heb de API documentatie erop nageslagen:
https://docs.bitvavo.com/#tag/Transfer-endpoints
En ik denk dat het in de generering van de signature zit.
Hier op Tweakers is er ook een forum met een .net variant:
https://gathering.tweakers.net/forum/list_messages/2075884
en die heb ik geprobeerd te repliceren in Python maar dat lukt me nog niet helemaal. Wat gaat hier mis? Vermoeddelijk in het stukje timestamp. Ik heb ook getracht om de timestamp van Bitvavo op te vragen, te vergelijken met die van mijn vps en met het verschil weer terug te sturen maar ook dat levert geen succes op:

code:
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
import requests
import os
import time
import hashlib
import hmac

os.system('clear')

#Lokale tijd
obj = time.gmtime(0)
epoch = time.asctime(obj)
curr_time = round(time.time()*1000)
print("Lokale tijd: ",curr_time)

#Bitvavo tijd
response = requests.get('https://api.bitvavo.com/v2/time')
API_Data = response.json()
bitvavo_tijd =  API_Data['time']
print('Bitvavo tijd: '+str(bitvavo_tijd))

verschil = bitvavo_tijd - curr_time

print("Verschil: " + str(verschil))


message = str(bitvavo_tijd+verschil)+'GET/v2/order{\"market\":\"BTC-EUR\"}'

print(message)

secret = "Lange_key"

signature = hmac.new(bytes(secret , 'utf-8'), msg = bytes(message , 'utf-8'), digestmod = hashlib.sha256).hexdigest().upper()
print(signature)

headers = {
    'Bitvavo-Access-Key': 'Korte_key',
    'Bitvavo-Access-Signature': signature,
    'Bitvavo-Access-Timestamp': str(bitvavo_tijd+verschil),
    'Bitvavo-Access-Window': '60000',
    'Content-Type': 'application/json',
}

json_data = {
    'market': 'BTC-EUR',
    'side': 'buy',
    'orderType': 'market',
    'amount': '10',
    'responseRequired': True,
}

response = requests.post('https://api.bitvavo.com/v2/order', headers=headers, json=json_data)
print(response.text)

[ Voor 1% gewijzigd door RobIII op 07-12-2023 12:25 ]

Alle reacties


Acties:
  • 0 Henk 'm!

  • jammo
  • Registratie: November 2020
  • Laatst online: 15:06
Waarom gebruik je de python api van bitvavo zelf niet?
https://github.com/bitvavo/python-bitvavo-api

Verder staat in de documentatie dat je je (onderandere) je body nodig hebt voor je signature, in je voorbeeld gebruik je de body niet in je signature.

Acties:
  • 0 Henk 'm!

  • ironheart
  • Registratie: September 2022
  • Laatst online: 29-09 12:45
HI Jammo,

Die heb ik uitgetest en dan krijg ik dit erop terug:

code:
1
2
Error: Request was not received within acceptable window (default 30s, or custom with Bitvavo-Access-Window header) of Bitvavo-Access-Timestamp header (or timestamp parameter for websocket).
DEBUG: Remaining rate limit calls for this minute: 1000


Ik wil de Bitvavo-Access-Window aanpassen maar ik kan niet goed zien waar ik deze optie moet toevoegen in het script.

Ik verwacht dat dat hier moet zijn:

code:
1
orderResponse = bitvavo.placeOrder(ORDER_MARKET_PAIR, ORDER_SIDE, 'market', { 'amountQuote': str(ORDER_AMOUNT_EURO) })


Heb jij een idee?

Voor wat de body betreft in mijn eigen code; volgens de handleiding zou dat niet hoeven bij enkel een Market order, of vergis ik me?

Acties:
  • 0 Henk 'm!

  • jammo
  • Registratie: November 2020
  • Laatst online: 15:06
ironheart schreef op donderdag 7 december 2023 @ 15:02:
HI Jammo,

Die heb ik uitgetest en dan krijg ik dit erop terug:

code:
1
2
Error: Request was not received within acceptable window (default 30s, or custom with Bitvavo-Access-Window header) of Bitvavo-Access-Timestamp header (or timestamp parameter for websocket).
DEBUG: Remaining rate limit calls for this minute: 1000


Ik wil de Bitvavo-Access-Window aanpassen maar ik kan niet goed zien waar ik deze optie moet toevoegen in het script.

Ik verwacht dat dat hier moet zijn:

code:
1
orderResponse = bitvavo.placeOrder(ORDER_MARKET_PAIR, ORDER_SIDE, 'market', { 'amountQuote': str(ORDER_AMOUNT_EURO) })


Heb jij een idee?
https://docs.bitvavo.com/#tag/Authentication
Daar staat een voorbeeld waarin ze gebruik maken van de hun eigen wrapper.
Verder heb ik geen ervaring met de api (deze informatie komt ook gewoon allemaal uit de docs)
Voor wat de body betreft in mijn eigen code; volgens de handleiding zou dat niet hoeven bij enkel een Market order, of vergis ik me?
Dat is niet wat ik lees (zie link hierboven over authenticatie) en ik zou het ook heel vreemd vinden als je maar een deel van de body zou moeten gebruiken (dan heeft heel de signature namelijk geen nut meer).