暗号資産・販売所ザイフ(zaif)pythonによるBOT開発サンプル・プログラム
板情報取得、発注、取消し、未約定注文照会のサンプル/プログラムです。
BOT開発の参考にして下さい。
動作確認済み、実際に使用できますが、プログラムロジックを熟知の上、自己責任で使用して下さい。
使用に当たってはザイフ取引所への会員登録が必要です。
アクセスキー入力等の改造が必要です。
from zaifapi import ZaifPublicApi,ZaifTradeApi
zaif_public = ZaifPublicApi()
#from zaifapi import ZaifTradeApi
KEY = "Zaifで取得したKEYをコピペ" # このままだとエラーになります
SECRET = "Zaifで取得したSECRETをコピペ" # このままだとエラーになります
zaif_trade = ZaifTradeApi(KEY,SECRET)
import time
import threading
import tkinter
import tkinter.messagebox
import requests
import json
import math
loop = 1260
hei = 680
count = -1
root1 = tkinter.Tk()
root1.title("暗号資産・販売所ザイフ")
root1.geometry("800x500")
#ca = tkinter.Canvas(width=loop, height=hei, bg="white")
#ca.pack()
me_flyer = tkinter.Message(root1, text="銭の生る樹", font=("Times New ZRoman", 18), width=500)
me_flyer.place(x=100, y=90)
me_zaif = tkinter.Message(root1, text="銭の生る樹", font=("Times New ZRoman", 18), width=500)
me_zaif.place(x=350, y=90)
#me2 = tkinter.Message(root1, text="countがloopに成るとコイン価格推移グラフが表示されます", font=("Times New ZRoman", 16), width=550)
#me2.place(x=20, y=130)
mefunds_jpy = tkinter.Message(root1, text="", font=("Times New ZRoman", 16), width=500)
mefunds_jpy.place(x=140, y=180)
mefunds_btc = tkinter.Message(root1, text="", font=("Times New ZRoman", 16), width=500)
mefunds_btc.place(x=140, y=210)
te = tkinter.Text(font=("Times New ZRoman", 13))
te.place(x=360,y=250,width=400,height=180)
#te.configure(state="disabled")
flag = "off"
histry1s = []
market = "bitflyer"
def func1():
global flag
global loop
global ca
global count
global loop
global histry1s
btn_on3()
btn_bu_contract()
while True:
time.sleep(0.001)
count = count + 1
#if market == "bitflyer":
# bitflyer
#res = requests.get('https://api.zaif.jp/api/1/last_price/btc_jpy')
res = requests.get('https://api.bitflyer.jp/v1/getboard?product_code=BTC_JPY')
if res.status_code != 200:
raise Exception('return status code is {}'.format(res.status_code))
price = json.loads(res.text)
graph_y = int(price["mid_price"])
me_flyer["text"] = "{} flyer = {}円".format(count,str(graph_y))
#else:
# zaif
try:
res = zaif_public.last_price('btc_jpy')
except:
print("現在の終値を取得失敗")
graph_y = 0
finally:
#print("現在の終値を取得完了")
graph_y = int(res["last_price"])
me_zaif["text"] = "{} zaif = {}円".format(count,str(graph_y))
def btn_on2():
global flag
global bu2
bu2["text"] = "終了しました。"
flag = "on"
def btn_on3():
global bu3
#_残高情報(軽量)の取得
print("残高情報(軽量)の取得")
try:
res = zaif_trade.get_info2()
except:
tkinter.messagebox.showinfo("エラー","エラーが発生しました。\nやり直して下さい。")
finally:
print("残高情報(軽量)の取得完了")
funds_jpy = res["funds"]["jpy"]
print("jpy:{}円".format(str(int(funds_jpy))))
mefunds_jpy["text"] = "JPY = {}円".format(str(int(funds_jpy)))
funds_btc = res["funds"]["btc"]
print("btc:" + str(funds_btc))
mefunds_btc["text"] = "BTC = {}枚".format(str(float(funds_btc)))
#_ユーザー自身の取引履歴を取得
#print("ユーザー自身の取引履歴を取得")
#res = zaif_trade.trade_history(currency_pair="btc_jpy",count=2)
#for id in res:
#print(id)
#key = str(id)
#print('currency_pair = '+res[key]['currency_pair'])
#print('action = '+res[key]['action'])
#print('amount = '+str(res[key]['amount']))
#print('price = '+str(res[key]['price']))
def btn_bu_buy():
global bu_buy
buy_price = en_price.get()
if buy_price == "":
tkinter.messagebox.showinfo("エラー","買値を指定して下さい")
return
else:
int_price = int(buy_price)
buy_amount = en_amount.get()
if buy_amount == "":
tkinter.messagebox.showinfo("エラー","枚数を指定して下さい")
return
else:
float_amount = float(buy_amount)
res = tkinter.messagebox.askokcancel("確認","買いを実行しますか?")
if res:
try:
res = zaif_trade.trade(currency_pair="btc_jpy", action="bid", price=int_price, amount=float_amount)
except: #catch
tkinter.messagebox.showinfo("エラー","エラーが発生しました。\nやり直して下さい。")
return
finally:
print("買い注文完了")
print("買い注文ID:"+str(res["order_id"]))
tkinter.messagebox.showinfo("確認","買いを発注しました。")
else:
tkinter.messagebox.showinfo("確認","キャンセルしました。")
def btn_bu_bid():
global bu_bid
try:
res = zaif_public.depth('btc_jpy')
except: #catch
tkinter.messagebox.showinfo("エラー","エラーが発生しました。\nやり直して下さい。")
return
finally:
print("板情報の取得完了")
bid_price = int(res["asks"][0][0])
bid_amount = en_bid_amount.get()
if bid_amount == "":
tkinter.messagebox.showinfo("エラー","枚数を入力して下さい。")
returnk
answer = tkinter.messagebox.askokcancel("確認","買値={}円 枚数={}枚 で買いますか?".format(bid_price,bid_amount))
if answer:
try:
res = zaif_trade.trade(currency_pair="btc_jpy", action="bid", price=bid_price, amount=bid_amount)
except: #catch
tkinter.messagebox.showinfo("エラー","エラーが発生しました。\nやり直して下さい。")
return
finally:
print("板情報の取得完了")
tkinter.messagebox.showinfo("通知","買いを発注しました。")
print("買い注文ID:"+str(res["order_id"]))
else:
tkinter.messagebox.showinfo("通知","買いを取消しました。")
def btn_bu_ask():
global bu_ask
try:
res = zaif_public.depth('btc_jpy')
except: #catch
tkinter.messagebox.showinfo("エラー","エラーが発生しました。\nやり直して下さい。")
return
finally:
print("板情報の取得完了")
ask_price = int(res["bids"][0][0])
ask_amount = en_ask_amount.get()
if ask_amount == "":
tkinter.messagebox.showinfo("エラー","枚数を入力して下さい。")
return
answer = tkinter.messagebox.askokcancel("確認","売値={}円 枚数={}枚 で売りますか?".format(ask_price,ask_amount))
if answer:
res = zaif_trade.trade(currency_pair="btc_jpy", action="ask", price=ask_price, amount=ask_amount)
tkinter.messagebox.showinfo("通知","売りを発注しました。")
print("売り注文ID:"+str(res["order_id"]))
else:
tkinter.messagebox.showinfo("通知","売りを取消しました。")
def btn_bu_cancel():
global bu_cancel
res = tkinter.messagebox.askyesno("確認","取消しを実行しますか?")
if res:
#_未約定注文一覧の取得
print("未約定注文一覧の取得")
try:
res = zaif_trade.active_orders(currency_pair="btc_jpy")
except: #catch
tkinter.messagebox.showinfo("エラー","エラーが発生しました。\nやり直して下さい。")
return
finally:
print("未約定注文一覧の取得完了")
for id in res:
print(id)
key = str(id)
print('currency_pair = '+res[key]['currency_pair'])
print('action = '+res[key]['action'])
print('amount = '+str(res[key]['amount']))
print('price = '+str(res[key]['price']))
print('timestamp = '+str(res[key]['timestamp']))
print('comment = '+str(res[key]['comment']))
#_注文の取消し
print("注文の取消し")
cancel_id = int(id)
try:
res2 = zaif_trade.cancel_order(currency_pair="btc_jpy",order_id=cancel_id )
except: #catch
tkinter.messagebox.showinfo("エラー","エラーが発生しました。\nやり直して下さい。")
return
finally:
print("注文の取消し完了")
print("取消ID:"+str(res2["order_id"]))
tkinter.messagebox.showinfo("確認","取り消しました。")
btn_bu_contract()
def btn_bu_contract():
global bu_contract
#_未約定注文一覧の取得
print("未約定注文一覧の取得")
try:
res = zaif_trade.active_orders(currency_pair="btc_jpy")
except: #catch
tkinter.messagebox.showinfo("エラー","エラーが発生しました。\nやり直して下さい。")
return
finally:
print("未約定注文一覧の取得完了")
te.delete("1.0",tkinter.END)
for id in res:
print(id)
key = str(id)
te.insert(tkinter.END,id+" ")
print('currency_pair = {} '.format(res[key]['currency_pair']))
te.insert(tkinter.END,res[key]['currency_pair']+" ")
print('action = {} '.format(res[key]['action']))
te.insert(tkinter.END,res[key]['action']+" ")
print('amount = {} '.format(str(res[key]['amount'])))
te.insert(tkinter.END,str(res[key]['amount'])+" ")
print('price = {} '.format(str(res[key]['price'])))
te.insert(tkinter.END,str(res[key]['price'])+" ")
print('timestamp = {} '.format(str(res[key]['timestamp'])))
te.insert(tkinter.END,str(res[key]['timestamp'])+" ")
print('comment = {} '.format(str(res[key]['comment'])))
te.insert(tkinter.END,str(res[key]['comment'])+" ")
te.insert(tkinter.END,'\n')
te.insert(tkinter.END,"ー 以上 ー")
def btn_bu_sign():
global bu_sign
#_板情報の取得
print("板情報の取得")
try:
res = zaif_public.depth('btc_jpy')
except: #catch
tkinter.messagebox.showinfo("エラー","エラーが発生しました。\nやり直して下さい。")
return
finally:
print("板情報の取得完了")
btc_ask_price = int(res["asks"][0][0])
btc_ask_amount = round(float(res["asks"][0][1]), 4)
me_bid_price["text"] = "約{}円".format(str( btc_ask_price))
en_bid_amount.delete(0,tkinter.END)
en_bid_amount.insert(tkinter.END,btc_ask_amount)
print("売気配値:" + str(btc_ask_price) + " " + str(btc_ask_amount))
btc_bid_price = int(res["bids"][0][0])
btc_bid_amount = round(float(res["bids"][0][1]), 4)
me_ask_price["text"] = "約{}円".format(str(btc_bid_price))
en_ask_amount.delete(0,tkinter.END)
en_ask_amount.insert(tkinter.END,btc_bid_amount)
print("買気配値:" + str(btc_bid_price) + " " + str(btc_bid_amount))
bu2 = tkinter.Button(root1, text="表示終了", font=("Times New ZRoman", 16), command=btn_on2)
bu2.place(x=20, y=50)
bu3 = tkinter.Button(root1, text="残高情報(軽量)の取得", font=("Times New ZRoman", 16), command=btn_on3)
bu3.place(x=20, y=120)
bu_buy = tkinter.Button(root1, text="指値買", font=("Times New ZRoman", 16), command=btn_bu_buy)
bu_buy.place(x=20, y=250)
en_price = tkinter.Entry(root1, width=8, font=("Times New ZRoman",16), justify=tkinter.RIGHT)
en_price.place(x=120, y=255)
me_price = tkinter.Message(root1, text="円", font=("Times New ZRoman", 16), width=500)
me_price.place(x=218, y=255)
en_amount = tkinter.Entry(root1, width=5, font=("Times New ZRoman",16), justify=tkinter.RIGHT)
en_amount.place(x=260, y=255)
me_amount = tkinter.Message(root1, text="枚", font=("Times New ZRoman", 16), width=500)
me_amount.place(x=318, y=255)
bu_bid = tkinter.Button(root1, text="成行買", font=("Times New ZRoman", 16), command=btn_bu_bid)
bu_bid.place(x=20, y=300)
me_bid_price = tkinter.Message(root1, text="売り気配値", font=("Times New ZRoman", 16), width=500)
me_bid_price.place(x=110, y=300)
en_bid_amount = tkinter.Entry(root1, width=5, font=("Times New ZRoman",16), justify=tkinter.RIGHT)
en_bid_amount.place(x=260, y=300)
me_bid_amount = tkinter.Message(root1, text="枚", font=("Times New ZRoman", 16), width=500)
me_bid_amount.place(x=318, y=300)
bu_ask = tkinter.Button(root1, text="成行売", font=("Times New ZRoman", 16), command=btn_bu_ask)
bu_ask.place(x=20, y=350)
me_ask_price = tkinter.Message(root1, text="買い気配値", font=("Times New ZRoman", 16), width=500)
me_ask_price.place(x=110, y=350)
en_ask_amount = tkinter.Entry(root1, width=5, font=("Times New ZRoman",16), justify=tkinter.RIGHT)
en_ask_amount.place(x=260, y=350)
me_ask_amount = tkinter.Message(root1, text="枚", font=("Times New ZRoman", 16), width=500)
me_ask_amount.place(x=318, y=350)
bu_cancel = tkinter.Button(root1, text="板情報", font=("Times New ZRoman", 16), command=btn_bu_sign)
bu_cancel.place(x=20, y=400)
bu_contract = tkinter.Button(root1, text="未約定照会", font=("Times New ZRoman", 16), command=btn_bu_contract)
bu_contract.place(x=360, y=210)
bu_cancel = tkinter.Button(root1, text="未約定取消", font=("Times New ZRoman", 16), command=btn_bu_cancel)
bu_cancel.place(x=500, y=210)
thread_1 = threading.Thread(target=func1)
thread_1.start()
root1.mainloop()