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
71
72
73
74
75
76
77
78
79
80
81
82
|
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import os
from configparser import ConfigParser
import requests
import json
import datetime
from codecs import open
# Config sample:
#
# [fixer]
# access_key = 00000000000000000000000000000000
# base=RUB
#
# [exchange-symbols]
# USD=$
# EUR=€
# RUB=R
#
# [stocks]
# symbols=V,AMD
#
# [etf]
# symbols=FXUS
CONFIG_FILE = '~/.ledger-commodities'
current_date = datetime.datetime.now().strftime('%Y/%m/%d %H:%M:%S')
config = ConfigParser()
config.readfp(open(os.path.expanduser(CONFIG_FILE), 'r', 'utf-8'))
def get_json(url, **kwargs):
response = requests.get(url, **kwargs)
return json.loads(response.content)
def print_price(symbol, price, base):
print ('P %s %s %f %s' % (current_date, symbol, price, base)).encode('utf-8')
def exchange_rates():
base = config.get('fixer', 'base')
symbols = dict([(symbol.upper(), commodity) for symbol, commodity in config.items('exchange-symbols')])
params = {
"access_key": config.get('fixer', 'access_key'),
"symbols": ','.join(symbols.keys() + [base,])
}
rates = get_json(r'http://data.fixer.io/api/latest', params=params)['rates']
base_value = rates[base]
for symbol, value in rates.items():
if symbol != base:
print_price(symbols[symbol], base_value / value, symbols[base])
def stocks():
params = {
"types": "ohlc",
"symbols": config.get('stocks', 'symbols')
}
data = get_json(r'https://api.iextrading.com/1.0/stock/market/batch', params=params)
for symbol in data.keys():
price = data[symbol]['ohlc']['close']['price']
print_price(symbol, price, '$')
def etfs():
symbols = config.get('etf', 'symbols')
for symbol in symbols.split(','):
data = get_json(r'http://iss.moex.com/iss/engines/stock/markets/shares/boards/TQTF/securities/%s.jsonp' % symbol)
value_index = data['marketdata']['columns'].index('LAST')
value = data['marketdata']['data'][0][value_index]
print_price(symbol, value, 'R')
def main():
exchange_rates()
stocks()
etfs()
if __name__ == '__main__':
main()
|