質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

1回答

2086閲覧

python バックグラウンドでもレートを更新し続ける動的チャートを作りたい

globalplus

総合スコア119

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

1クリップ

投稿2019/03/18 06:34

OANDA API使って為替レートを取得し、チャート化出来たのですが、レートの自動更新で困っています。
賢い方法かわかりませんが、time関数を使ってOANDAにアクセスし直すというコードを書いて動的チャートを作ろうか考えています。
以下のコードは試しにtime関数を入れてみましたが自動更新(アクセスし直す)出来ていません。
間違い箇所を教えていただければ嬉しいです。よろしくお願いします。

python

1#oandaAPI 2from oandapyV20 import API 3import oandapyV20.endpoints.instruments as instruments 4import pandas as pd 5import oandapy 6#日付 7import pytz 8import datetime 9from datetime import datetime, timedelta 10#ローソク足ライブラリ 11import matplotlib.pyplot as plt 12import mpl_finance as mpf 13from matplotlib import ticker 14import matplotlib.dates as mdates 15#tkinter 16import tkinter as tk 17#time 18import time 19#-------------------------------------------------------------------------------# 20# APIの設定 21accountID = "accountID" 22access_token = "access_token" 23api = API(access_token=access_token) 24 25# APIへ接続 26oanda = oandapy.API(environment="practice", access_token=access_token) 27 28# 5分足で1000データ 29params = { 30 "count": 1000, 31 "granularity": "M1" 32} 33 34# APIへ過去データをリクエスト 35r = instruments.InstrumentsCandles(instrument="USD_JPY", params=params) 36api.request(r) 37 38#日本時間へ変換 39def iso_to_jp(iso): 40 date = None 41 try: 42 date = datetime.strptime(iso, '%Y-%m-%dT%H:%M:%S.%fZ') 43 date = pytz.utc.localize(date).astimezone(pytz.timezone("Asia/Tokyo")) 44 except ValueError: 45 try: 46 date = datetime.strptime(iso, '%Y-%m-%dT%H:%M:%S.%f%z') 47 date = date.astimezone(pytz.timezone("Asia/Tokyo")) 48 except ValueError: 49 pass 50 return date 51 52# datetime -> 表示用文字列 53def date_to_str(date): 54 if date is None: 55 return '' 56 return date.strftime('%Y/%m/%d %H:%M:%S') 57 58# ドル円の現在のレートを取得 59res = oanda.get_prices(instruments="USD_JPY") 60 61print(date_to_str(iso_to_jp(res['prices'][0]['time']))) 62 63# 日本時間へ変換 64iso_to_jp(res['prices'][0]['time']) 65 66# 為替レートのdictをDataFrameへ変換 67df = pd.DataFrame.from_dict({r.response['candles'][i]['time']: r.response['candles'][i]['mid'] 68 for i in range(0,len(r.response['candles'])) 69 for j in r.response['candles'][i]['mid'].keys()}, 70 orient='index', 71 ) 72 73# date型を綺麗にする 74df.index = pd.to_datetime(df.index) 75print(df.tail()) 76 77# 念のためDataFrameの確認 78df.head() 79 80# ローソク足 81def candlechart(data, width=0.8): 82 fig, ax = plt.subplots() 83 mpf.candlestick2_ohlc(ax, opens=data.o.values, closes=data.c.values, 84 lows=data.l.values, highs=data.h.values, 85 width=width, colorup='r', colordown='b') 86 87 # x軸を時間にする 88 xdate = data.index 89 ax.xaxis.set_major_locator(ticker.MaxNLocator(6)) 90 91 def mydate(x, pos): 92 try: 93 return xdate[int(x)] 94 except IndexError: 95 return '' 96 97 ax.xaxis.set_major_formatter(ticker.FuncFormatter(mydate)) 98 ax.format_xdata = mdates.DateFormatter('%Y-%m-%d') 99 100 101 fig.autofmt_xdate() 102 fig.tight_layout() 103 104 return fig, ax 105#---------------------------以下が間違っている?-----------------------------------------# 106def getprice(): 107 res = oanda.get_prices(instruments="USD_JPY") 108 109def getchart(): 110 candlechart(df) 111 plt.show() 112 113while True: 114 getchart() 115 time.sleep(5)

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

tiitoi

2019/03/18 06:39

API を使える環境はないので、こちらでデバッグはできないので、アドバイスだけ書きます。 まず自動更新できていない原因の切り分けを行いましょう。 データは2回目以降も取得できている? データは取得できているけど、表が更新されていない? print() 文を仕込めばわかる話かと思います。
guest

回答1

0

ベストアンサー

肝心のデータの入ったdfは関数の外で作られています。getchart()を呼び出しただけだと、dfそのものは更新されないので、いつまで経っても同じデータを表示しつづけます。データ取得部分も関数にまとめると良いでしょう。

また、plt.show()はウィンドウを開いてそこに一回描画するだけなので、うまく動かしたければそちらも手当てしてあげないといけません。「matplotlib アニメーション」みたいな検索キーワードでググって出てくるいろいろなページを読み、やり方を探すと良いと思います。

投稿2019/03/18 06:39

hayataka2049

総合スコア30933

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

globalplus

2019/03/18 06:49

dfの件、わかりました。ありがとうございます。 「matplotlib アニメーション」で検索したところ、たくさん出てきましたのでトライしてみます。 またわからない時はよろしくお願いします。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問