見出し画像

暗号資産・販売所ザイフ(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()



この記事が気に入ったらサポートをしてみませんか?