From b6e7b6e732bff50e7cd083df2a785b134fb582b4 Mon Sep 17 00:00:00 2001 From: TheManis92 Date: Thu, 23 Apr 2020 19:34:00 +0100 Subject: [PATCH 01/20] First draft --- dataFromApi.py | 30 ++++++++++++++++++++++++++++++ 1 file changed, 30 insertions(+) create mode 100644 dataFromApi.py diff --git a/dataFromApi.py b/dataFromApi.py new file mode 100644 index 00000000..20df56bf --- /dev/null +++ b/dataFromApi.py @@ -0,0 +1,30 @@ +import requests +import json + +url = "https://bitbay.net/API/Public/BTC/orderbook.json" +response = requests.get(url) + +data = response.text + +parsed = json.loads(data) + +buy_list = parsed["bids"] +sell_list = parsed["asks"] + +print(len(buy_list)) +print(len(sell_list)) + +print("BUY LIST") + +for buy in buy_list: + print("RATE: " + str(buy[0]) + " AMOUNT OF CRYPTOCURRENCY: " + str(buy[1])) + +print("SELL LIST") + +for sell in sell_list: + print("RATE: " + str(sell[0]) + "AMOUNT OF CRYPTOCURRENCY: " + str(sell[1])) + +best_buy_offer = buy_list[0][0] +best_sell_offer = sell_list[0][0] + +print((best_sell_offer - best_buy_offer) / (best_buy_offer) * 100) \ No newline at end of file From 31836fc3324907af469b853e2ab0ed10593a2bf6 Mon Sep 17 00:00:00 2001 From: TheManis92 Date: Thu, 23 Apr 2020 20:26:09 +0100 Subject: [PATCH 02/20] Divided into functions --- dataFromApi.py | 56 +++++++++++++++++++++++++------------------------- 1 file changed, 28 insertions(+), 28 deletions(-) diff --git a/dataFromApi.py b/dataFromApi.py index 20df56bf..27b1df4f 100644 --- a/dataFromApi.py +++ b/dataFromApi.py @@ -1,30 +1,30 @@ import requests import json - -url = "https://bitbay.net/API/Public/BTC/orderbook.json" -response = requests.get(url) - -data = response.text - -parsed = json.loads(data) - -buy_list = parsed["bids"] -sell_list = parsed["asks"] - -print(len(buy_list)) -print(len(sell_list)) - -print("BUY LIST") - -for buy in buy_list: - print("RATE: " + str(buy[0]) + " AMOUNT OF CRYPTOCURRENCY: " + str(buy[1])) - -print("SELL LIST") - -for sell in sell_list: - print("RATE: " + str(sell[0]) + "AMOUNT OF CRYPTOCURRENCY: " + str(sell[1])) - -best_buy_offer = buy_list[0][0] -best_sell_offer = sell_list[0][0] - -print((best_sell_offer - best_buy_offer) / (best_buy_offer) * 100) \ No newline at end of file +import threading + +def parsedData(url): + response = requests.get(url) + data = response.text + parsed = json.loads(data) + return parsed + +def printOfferList(list): + for elem in list: + print("Rate: " + str(elem[0]) + " Amount of Cryptocurrency: " + str(elem[1])) + + +def main(): + url = "https://bitbay.net/API/Public/BTC/orderbook.json" + parsed = parsedData(url) + buy_list = parsed["bids"] + sell_list = parsed["asks"] + print("BUY OFFERS") + printOfferList(buy_list) + print("SELL OFFERS") + printOfferList(sell_list) + best_buy_offer = buy_list[0][0] + best_sell_offer = sell_list[0][0] + print((best_sell_offer - best_buy_offer) / (best_buy_offer) * 100) + +if __name__ == "__main__": + main() \ No newline at end of file From 3a20be79b00470988a33bdb21b77516bcfccbaf0 Mon Sep 17 00:00:00 2001 From: TheManis92 Date: Thu, 23 Apr 2020 21:30:33 +0100 Subject: [PATCH 03/20] Add repeat every 5 seconds --- dataFromApi.py | 24 ++++++++++++++++-------- 1 file changed, 16 insertions(+), 8 deletions(-) diff --git a/dataFromApi.py b/dataFromApi.py index 27b1df4f..7b5349b6 100644 --- a/dataFromApi.py +++ b/dataFromApi.py @@ -8,23 +8,31 @@ def parsedData(url): parsed = json.loads(data) return parsed -def printOfferList(list): +def printOfferList(offer_type,list_title, list): + print(list_title) for elem in list: - print("Rate: " + str(elem[0]) + " Amount of Cryptocurrency: " + str(elem[1])) + print(offer_type + " Rate: " + str(elem[0]) + " Amount of Cryptocurrency: " + str(elem[1])) def main(): + threading.Timer(5.0, main).start() url = "https://bitbay.net/API/Public/BTC/orderbook.json" parsed = parsedData(url) buy_list = parsed["bids"] sell_list = parsed["asks"] - print("BUY OFFERS") - printOfferList(buy_list) - print("SELL OFFERS") - printOfferList(sell_list) + printOfferList("Buy","BUY OFFERS",buy_list) + printOfferList("Sell", "SELL OFFERS",sell_list) best_buy_offer = buy_list[0][0] best_sell_offer = sell_list[0][0] - print((best_sell_offer - best_buy_offer) / (best_buy_offer) * 100) + print("BUY/SELL PERCENT DIFFERENCE " + str((best_sell_offer - best_buy_offer) / (best_buy_offer) * 100)) + +def runMainEvery5Seconds(): + try: + threading.Timer(5.0, runMainEvery5Seconds).start() + main() + print("CTRL+C TO STOP") + except KeyboardInterrupt: + pass if __name__ == "__main__": - main() \ No newline at end of file + runMainEvery5Seconds() \ No newline at end of file From 424a4330bcaf1a22f8b98711c9b2c33dd91df80a Mon Sep 17 00:00:00 2001 From: TheManis92 Date: Thu, 23 Apr 2020 21:40:03 +0100 Subject: [PATCH 04/20] Final changes --- dataFromApi.py | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/dataFromApi.py b/dataFromApi.py index 7b5349b6..a582494f 100644 --- a/dataFromApi.py +++ b/dataFromApi.py @@ -13,19 +13,20 @@ def printOfferList(offer_type,list_title, list): for elem in list: print(offer_type + " Rate: " + str(elem[0]) + " Amount of Cryptocurrency: " + str(elem[1])) +def getDiffPercentage(buy_list, sell_list): + best_buy_offer = buy_list[0][0] + best_sell_offer = sell_list[0][0] + print("BUY/SELL PERCENT DIFFERENCE " + str((best_sell_offer - best_buy_offer) / (best_buy_offer) * 100)) def main(): - threading.Timer(5.0, main).start() url = "https://bitbay.net/API/Public/BTC/orderbook.json" parsed = parsedData(url) buy_list = parsed["bids"] sell_list = parsed["asks"] printOfferList("Buy","BUY OFFERS",buy_list) printOfferList("Sell", "SELL OFFERS",sell_list) - best_buy_offer = buy_list[0][0] - best_sell_offer = sell_list[0][0] - print("BUY/SELL PERCENT DIFFERENCE " + str((best_sell_offer - best_buy_offer) / (best_buy_offer) * 100)) - + getDiffPercentage() + def runMainEvery5Seconds(): try: threading.Timer(5.0, runMainEvery5Seconds).start() From e98ab4e03e5647f3e48abab43c783c2f6e974973 Mon Sep 17 00:00:00 2001 From: TheManis92 Date: Fri, 8 May 2020 20:33:04 +0100 Subject: [PATCH 05/20] Fetch data from 4 apis --- dataFromApi.py | 31 ++++++++++++++++++++++++++----- 1 file changed, 26 insertions(+), 5 deletions(-) diff --git a/dataFromApi.py b/dataFromApi.py index a582494f..5cdac081 100644 --- a/dataFromApi.py +++ b/dataFromApi.py @@ -18,15 +18,36 @@ def getDiffPercentage(buy_list, sell_list): best_sell_offer = sell_list[0][0] print("BUY/SELL PERCENT DIFFERENCE " + str((best_sell_offer - best_buy_offer) / (best_buy_offer) * 100)) -def main(): +def getBitbayData(): url = "https://bitbay.net/API/Public/BTC/orderbook.json" parsed = parsedData(url) - buy_list = parsed["bids"] + buy_list = parsed["bids"][0] + sell_list = parsed["asks"][0] + return (buy_list, sell_list) + +def getBittrexData(): + url = "https://api.bittrex.com/api/v1.1/public/getorderbook?market=USD-BTC&type=both" + parsed = parsedData(url) + sell_list = parsed["result"]["sell"] + buy_list = parsed["result"]["buy"] + return (buy_list, sell_list) + +def getBinanceData(): + url = "https://api.binance.com/api/v3/depth?symbol=BTCTUSD" + parsed = parsedData(url) + #print(parsed) sell_list = parsed["asks"] - printOfferList("Buy","BUY OFFERS",buy_list) - printOfferList("Sell", "SELL OFFERS",sell_list) - getDiffPercentage() + buy_list = parsed["bids"] + return (buy_list, sell_list) +def getBitstampData(): + url = "https://www.bitstamp.net/api/v2/order_book/BTCUSD/"" + parsed = parsedData(url) + #print(parsed) + sell_list = parsed["asks"] + buy_list = parsed["bids"] + return (buy_list, sell_list) + def runMainEvery5Seconds(): try: threading.Timer(5.0, runMainEvery5Seconds).start() From 0ad0ca85c424e96acf8d83a787e0438f2ddab1d4 Mon Sep 17 00:00:00 2001 From: TheManis92 Date: Fri, 8 May 2020 21:05:42 +0100 Subject: [PATCH 06/20] Restructured --- dataFromApi.py | 47 +++++++++++++++++++---------------------------- 1 file changed, 19 insertions(+), 28 deletions(-) diff --git a/dataFromApi.py b/dataFromApi.py index 5cdac081..d9ba8487 100644 --- a/dataFromApi.py +++ b/dataFromApi.py @@ -18,35 +18,23 @@ def getDiffPercentage(buy_list, sell_list): best_sell_offer = sell_list[0][0] print("BUY/SELL PERCENT DIFFERENCE " + str((best_sell_offer - best_buy_offer) / (best_buy_offer) * 100)) -def getBitbayData(): - url = "https://bitbay.net/API/Public/BTC/orderbook.json" +def getData(url, api): parsed = parsedData(url) - buy_list = parsed["bids"][0] - sell_list = parsed["asks"][0] - return (buy_list, sell_list) - -def getBittrexData(): - url = "https://api.bittrex.com/api/v1.1/public/getorderbook?market=USD-BTC&type=both" - parsed = parsedData(url) - sell_list = parsed["result"]["sell"] - buy_list = parsed["result"]["buy"] - return (buy_list, sell_list) - -def getBinanceData(): - url = "https://api.binance.com/api/v3/depth?symbol=BTCTUSD" - parsed = parsedData(url) - #print(parsed) - sell_list = parsed["asks"] - buy_list = parsed["bids"] - return (buy_list, sell_list) + if api == "bittrex": + return (parsed["result"]["buy"],parsed["result"]["sell"]) + else: + return (parsed["bids"],parsed["asks"]) -def getBitstampData(): - url = "https://www.bitstamp.net/api/v2/order_book/BTCUSD/"" - parsed = parsedData(url) - #print(parsed) - sell_list = parsed["asks"] - buy_list = parsed["bids"] - return (buy_list, sell_list) +def fetchData(url, api, currency): + if api == "bitbay": + return getData("https://bitbay.net/API/Public/{currency}USD/orderbook.json",api) + if api == "binance": + return getData("https://api.binance.com/api/v3/depth?symbol={currency}TUSD",api) + if api == "bitstamp": + return getData("https://www.bitstamp.net/api/v2/order_book/{currency}USD/",api) + if api == "bittrex": + return getData("https://api.bittrex.com/api/v1.1/public/getorderbook?market=USD-{currency}&type=both",api) + def runMainEvery5Seconds(): try: @@ -57,4 +45,7 @@ def runMainEvery5Seconds(): pass if __name__ == "__main__": - runMainEvery5Seconds() \ No newline at end of file + #runMainEvery5Seconds() + data = getBittrexData() + #printOfferList("Sell","Sell",data[1]) + print(data[1][0]) \ No newline at end of file From 990375b02d9dba61375d2c59ca4e2de809ce9fc7 Mon Sep 17 00:00:00 2001 From: TheManis92 Date: Fri, 8 May 2020 21:11:59 +0100 Subject: [PATCH 07/20] Fixed little error --- dataFromApi.py | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-) diff --git a/dataFromApi.py b/dataFromApi.py index d9ba8487..1154b424 100644 --- a/dataFromApi.py +++ b/dataFromApi.py @@ -25,16 +25,15 @@ def getData(url, api): else: return (parsed["bids"],parsed["asks"]) -def fetchData(url, api, currency): +def fetchData(api, currency): if api == "bitbay": - return getData("https://bitbay.net/API/Public/{currency}USD/orderbook.json",api) + return getData("https://bitbay.net/API/Public/{}USD/orderbook.json".format(currency),api) if api == "binance": - return getData("https://api.binance.com/api/v3/depth?symbol={currency}TUSD",api) + return getData("https://api.binance.com/api/v3/depth?symbol={}TUSD".format(currency),api) if api == "bitstamp": - return getData("https://www.bitstamp.net/api/v2/order_book/{currency}USD/",api) + return getData("https://www.bitstamp.net/api/v2/order_book/{}USD/".format(currency),api) if api == "bittrex": - return getData("https://api.bittrex.com/api/v1.1/public/getorderbook?market=USD-{currency}&type=both",api) - + return getData("https://api.bittrex.com/api/v1.1/public/getorderbook?market=USD-{}&type=both".format(currency),api) def runMainEvery5Seconds(): try: @@ -46,6 +45,6 @@ def runMainEvery5Seconds(): if __name__ == "__main__": #runMainEvery5Seconds() - data = getBittrexData() + data = fetchData("bitbay", "BTC") #printOfferList("Sell","Sell",data[1]) print(data[1][0]) \ No newline at end of file From 363ca48a3835f6607d8843906750ba5f47c7434a Mon Sep 17 00:00:00 2001 From: TheManis92 Date: Sat, 9 May 2020 07:42:36 +0100 Subject: [PATCH 08/20] 4 pairs of currencies --- dataFromApi.py | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/dataFromApi.py b/dataFromApi.py index 1154b424..80178cc9 100644 --- a/dataFromApi.py +++ b/dataFromApi.py @@ -2,6 +2,8 @@ import json import threading +currencies = ["BTC","ETH","LTC","BCH"] + def parsedData(url): response = requests.get(url) data = response.text @@ -20,6 +22,7 @@ def getDiffPercentage(buy_list, sell_list): def getData(url, api): parsed = parsedData(url) + print(parsed) if api == "bittrex": return (parsed["result"]["buy"],parsed["result"]["sell"]) else: @@ -30,8 +33,10 @@ def fetchData(api, currency): return getData("https://bitbay.net/API/Public/{}USD/orderbook.json".format(currency),api) if api == "binance": return getData("https://api.binance.com/api/v3/depth?symbol={}TUSD".format(currency),api) - if api == "bitstamp": - return getData("https://www.bitstamp.net/api/v2/order_book/{}USD/".format(currency),api) + if api == "kraken" and currency == "BTC": + return getData("https://api.kraken.com/0/public/Depth?pair=XBTUSD".format(currency),api) + elif api == "kraken": + return getData("https://api.kraken.com/0/public/Depth?pair={}USD".format(currency),api) if api == "bittrex": return getData("https://api.bittrex.com/api/v1.1/public/getorderbook?market=USD-{}&type=both".format(currency),api) @@ -45,6 +50,7 @@ def runMainEvery5Seconds(): if __name__ == "__main__": #runMainEvery5Seconds() - data = fetchData("bitbay", "BTC") + #data = fetchData("kraken", "USD","BTC") + print(parsedData("https://api.kraken.com/0/public/Depth?pair=BCHUSD")) #printOfferList("Sell","Sell",data[1]) - print(data[1][0]) \ No newline at end of file + #print(data[1][0]) \ No newline at end of file From 6bb9fb0462de094b681fc95f87e92bac5131f534 Mon Sep 17 00:00:00 2001 From: TheManis92 Date: Sat, 9 May 2020 10:09:43 +0100 Subject: [PATCH 09/20] Changed Orderbook to ticker --- dataFromApi.py | 59 ++++++++++++++++++++++++++++++++++++++++---------- 1 file changed, 47 insertions(+), 12 deletions(-) diff --git a/dataFromApi.py b/dataFromApi.py index 80178cc9..b53a99ea 100644 --- a/dataFromApi.py +++ b/dataFromApi.py @@ -3,6 +3,8 @@ import threading currencies = ["BTC","ETH","LTC","BCH"] +apis = ["bitbay","binance","kraken", "bitrex"] +wallet = 10000 def parsedData(url): response = requests.get(url) @@ -20,25 +22,54 @@ def getDiffPercentage(buy_list, sell_list): best_sell_offer = sell_list[0][0] print("BUY/SELL PERCENT DIFFERENCE " + str((best_sell_offer - best_buy_offer) / (best_buy_offer) * 100)) -def getData(url, api): +def getData(url, api,currency): parsed = parsedData(url) - print(parsed) + if api == "bittrex": - return (parsed["result"]["buy"],parsed["result"]["sell"]) - else: - return (parsed["bids"],parsed["asks"]) + return (parsed["result"]["Bid"],parsed["result"]["Ask"]) + elif api == "kraken": + if currency == "BTC": + return (parsed["result"]["XXBTZUSD"]["b"][0],parsed["result"]["XXBTZUSD"]["a"][0]) + elif currency == "BCH": + return (parsed["result"]["BCHUSD"]["b"][0],parsed["result"]["BCHUSD"]["a"][0]) + else: + return (parsed["result"]["X"+currency+"ZUSD"]["b"][0],parsed["result"]["X"+currency+"ZUSD"]["a"][0]) + if api == "bitbay": + return (parsed["bid"],parsed["ask"]) + elif api == "binance": + return (parsed["bidPrice"],parsed["askPrice"]) def fetchData(api, currency): + if api == "bitbay" and currency == "BCH": + currency = "BCC" if api == "bitbay": - return getData("https://bitbay.net/API/Public/{}USD/orderbook.json".format(currency),api) + return getData("https://bitbay.net/API/Public/{}USD/ticker.json".format(currency),api, currency) if api == "binance": - return getData("https://api.binance.com/api/v3/depth?symbol={}TUSD".format(currency),api) + return getData("https://api.binance.com/api/v3/ticker/bookTicker?symbol={}TUSD".format(currency),api, currency) if api == "kraken" and currency == "BTC": - return getData("https://api.kraken.com/0/public/Depth?pair=XBTUSD".format(currency),api) + return getData("https://api.kraken.com/0/public/Ticker?pair=XBTUSD".format(currency),api, currency) elif api == "kraken": - return getData("https://api.kraken.com/0/public/Depth?pair={}USD".format(currency),api) + return getData("https://api.kraken.com/0/public/Ticker?pair={}USD".format(currency),api, currency) if api == "bittrex": - return getData("https://api.bittrex.com/api/v1.1/public/getorderbook?market=USD-{}&type=both".format(currency),api) + return getData("https://api.bittrex.com/api/v1.1/public/getticker?market=USD-{}".format(currency),api, currency) + +def format(buy_and_sell): + return (float(buy_and_sell[0]),float(buy_and_sell[1])) + + + + +def checkArbitrage(): + for currency in currencies: + bitbayData = format(fetchData("bitbay", currency)) + binanceData = format(fetchData("binance", currency)) + krakenData = format(fetchData("kraken", currency)) + bittrexData = format(fetchData("bittrex", currency)) + print(bitbayData) + print(binanceData) + print(krakenData) + print(bittrexData) + def runMainEvery5Seconds(): try: @@ -51,6 +82,10 @@ def runMainEvery5Seconds(): if __name__ == "__main__": #runMainEvery5Seconds() #data = fetchData("kraken", "USD","BTC") - print(parsedData("https://api.kraken.com/0/public/Depth?pair=BCHUSD")) + #print(parsedData("https://bitbay.net/API/Public/BTCUSD/ticker.json")) + #print(parsedData("https://api.binance.com/api/v3/ticker/bookTicker?symbol=BTCTUSD")) + #print(parsedData("https://api.kraken.com/0/public/Ticker?pair=XBTUSD")) + #print(parsedData("https://api.bittrex.com/api/v1.1/public/getticker?market=USD-BTC")) #printOfferList("Sell","Sell",data[1]) - #print(data[1][0]) \ No newline at end of file + #print(data[1][0]) + checkArbitrage() \ No newline at end of file From f0e64df5f8a3161a852c51d91f1ad393f384c386 Mon Sep 17 00:00:00 2001 From: TheManis92 Date: Sat, 9 May 2020 10:51:59 +0100 Subject: [PATCH 10/20] Checking arbitrage done --- dataFromApi.py | 48 +++++++++++++++++++++++++++++++++--------------- 1 file changed, 33 insertions(+), 15 deletions(-) diff --git a/dataFromApi.py b/dataFromApi.py index b53a99ea..aac6467b 100644 --- a/dataFromApi.py +++ b/dataFromApi.py @@ -3,7 +3,7 @@ import threading currencies = ["BTC","ETH","LTC","BCH"] -apis = ["bitbay","binance","kraken", "bitrex"] +apis = ["bitbay","binance","kraken", "bittrex"] wallet = 10000 def parsedData(url): @@ -55,32 +55,50 @@ def fetchData(api, currency): def format(buy_and_sell): return (float(buy_and_sell[0]),float(buy_and_sell[1])) - - - +def calculate_fee(buy_and_sell,api): + if api == "binance" or "bitbay": + fee = 0.001 + elif api == "bittrex": + fee = 0.002 + elif api == "kraken": + fee = 0.0026 + return (buy_and_sell[0]*(1-fee),buy_and_sell[1]*(1+fee)) + def checkArbitrage(): + global wallet for currency in currencies: - bitbayData = format(fetchData("bitbay", currency)) - binanceData = format(fetchData("binance", currency)) - krakenData = format(fetchData("kraken", currency)) - bittrexData = format(fetchData("bittrex", currency)) - print(bitbayData) - print(binanceData) - print(krakenData) - print(bittrexData) + data = {"bitbay" : [],"binance" : [],"kraken" : [],"bittrex" : []} + data["bitbay"] = format(fetchData("bitbay", currency)) + data["binance"] = format(fetchData("binance", currency)) + data["kraken"] = format(fetchData("kraken", currency)) + data["bittrex"] = format(fetchData("bittrex", currency)) + + for api in apis: + data[api] = calculate_fee(data[api],api) + + expensive_crypto = max(data, key=lambda x: data[x][0]) + cheapest_crypto = min(data, key=lambda x: data[x][1]) + + if data[cheapest_crypto][1] < data[expensive_crypto][0] and data[cheapest_crypto][1] < wallet: + print("Deal made on " + currency) + wallet += expensive_crypto - cheapest_crypto + print("Gained " + str(expensive_crypto - cheapest_crypto)) + else: + print("No deal on " + currency) + print("Wallet: "+str(wallet)) def runMainEvery5Seconds(): try: threading.Timer(5.0, runMainEvery5Seconds).start() - main() + checkArbitrage() print("CTRL+C TO STOP") except KeyboardInterrupt: pass if __name__ == "__main__": - #runMainEvery5Seconds() + runMainEvery5Seconds() #data = fetchData("kraken", "USD","BTC") #print(parsedData("https://bitbay.net/API/Public/BTCUSD/ticker.json")) #print(parsedData("https://api.binance.com/api/v3/ticker/bookTicker?symbol=BTCTUSD")) @@ -88,4 +106,4 @@ def runMainEvery5Seconds(): #print(parsedData("https://api.bittrex.com/api/v1.1/public/getticker?market=USD-BTC")) #printOfferList("Sell","Sell",data[1]) #print(data[1][0]) - checkArbitrage() \ No newline at end of file + #checkArbitrage() \ No newline at end of file From 0ec7d22c0d11f9451e2dc4615614414308c7b2d8 Mon Sep 17 00:00:00 2001 From: TheManis92 Date: Sat, 23 May 2020 13:41:56 +0100 Subject: [PATCH 11/20] Add create_wallet.py --- create_wallet.py | 19 +++++++++++++++++++ dataFromApi.py | 9 +-------- 2 files changed, 20 insertions(+), 8 deletions(-) create mode 100644 create_wallet.py diff --git a/create_wallet.py b/create_wallet.py new file mode 100644 index 00000000..b9b84fab --- /dev/null +++ b/create_wallet.py @@ -0,0 +1,19 @@ +import sqlite3 +import os + +def create_database(path): + if os.path.exists(path): + os.remove(path) + print("The old database has been delated, it will be replaced by a new one.") + connection = sqlite3.connect(path) + cursor = connection.cursor() + cursor.execute(""" CREATE TABLE wallet ( + currency text, + amount double + )""") + connection.commit() + connection.close() + print("The new database has been created.") + +if __name__ == "__main__": + create_database() \ No newline at end of file diff --git a/dataFromApi.py b/dataFromApi.py index aac6467b..7b6a3ff2 100644 --- a/dataFromApi.py +++ b/dataFromApi.py @@ -99,11 +99,4 @@ def runMainEvery5Seconds(): if __name__ == "__main__": runMainEvery5Seconds() - #data = fetchData("kraken", "USD","BTC") - #print(parsedData("https://bitbay.net/API/Public/BTCUSD/ticker.json")) - #print(parsedData("https://api.binance.com/api/v3/ticker/bookTicker?symbol=BTCTUSD")) - #print(parsedData("https://api.kraken.com/0/public/Ticker?pair=XBTUSD")) - #print(parsedData("https://api.bittrex.com/api/v1.1/public/getticker?market=USD-BTC")) - #printOfferList("Sell","Sell",data[1]) - #print(data[1][0]) - #checkArbitrage() \ No newline at end of file + \ No newline at end of file From c09038e4ca6dce9af8698e9ddecf4003eaf774b1 Mon Sep 17 00:00:00 2001 From: TheManis92 Date: Sat, 23 May 2020 15:59:19 +0100 Subject: [PATCH 12/20] Tkinter start --- __pycache__/create_wallet.cpython-38.pyc | Bin 0 -> 742 bytes myown.db | Bin 0 -> 8192 bytes myown.db.db | 0 new.db | Bin 0 -> 8192 bytes third.db | Bin 0 -> 8192 bytes wallet_app.py | 88 +++++++++++++++++++++++ 6 files changed, 88 insertions(+) create mode 100644 __pycache__/create_wallet.cpython-38.pyc create mode 100644 myown.db create mode 100644 myown.db.db create mode 100644 new.db create mode 100644 third.db create mode 100644 wallet_app.py diff --git a/__pycache__/create_wallet.cpython-38.pyc b/__pycache__/create_wallet.cpython-38.pyc new file mode 100644 index 0000000000000000000000000000000000000000..c3422d2dc7b7730739151d5fa0a1406a1726d030 GIT binary patch literal 742 zcmZWn&2AGh5Vm(W$u`gyaX{jNEDngEDi>}DAxe@1QYk-4ixjO`IqQ+K;9UpX+cZ&n zDi4wzc@$p3S5CYFTo@+-1u@dhXMZ!}`E2=Yf4@o4e%<}{;Z8uvcfZ*+i0}&;1`vwqQ=lI}a7`%I^hvAs1MA6YMm=mTMD*T4H|H2E`AC<+f~=^% zXUQ`3D@tr6=(We%vhJBHx}eL(id+SYU>S?R*C4aE!dZw-kJuCX9zk$+bUN=2#=w*m zOmNFb+yEPM!$trl6Ck+-al~@Vrn!{JG7S^SGZ1VvW1N*RWvYbs{4MLe>m3hzY;gSI zq{pUQO0eu|yb*D#-DZsDH#y-WrMXoab8BLAiFET+?a9m?Zka##jc}T|je*dcv`OQQM=`GSEo5Ds urUlQ-G;Kw?frR#7@NcT*1*GX(^G-NiH$E+ts3bh|f6l}h@X#PWi0N+)MZ}N* literal 0 HcmV?d00001 diff --git a/myown.db b/myown.db new file mode 100644 index 0000000000000000000000000000000000000000..fc4081d6172cf4c7a3caa967389e92d3ef3739b7 GIT binary patch literal 8192 zcmeI#I|{-;5C-7cAP9nJC+VhCP#ZmfQPQPRbAdIk5Xb|<1hw=K-q(pCpq0J+Kl@;I zmMy++kNYSU$Ct9ot?-J*WDISXiOA^mbarX#URUVe)W2eAx#pqXGNUKyKp+4C2tWV= z5P$##AOHafKmY;|=mb*JpZLCcEX1BNcePpOq+Pw;Aq?V><6s+w+@A4tz#mEKs&Ykg xXK^=~f3<90)`jr7to7M<6s+w+@A4tz#mEKs&Ykg xXK^=~f3<90)`jr7to7M<6s+w+@A4tz#mEKs&Ykg xXK^=~f3<90)`jr7to7M Date: Sat, 23 May 2020 19:32:42 +0100 Subject: [PATCH 13/20] Final version - Incomplete --- __pycache__/dataFromApi.cpython-38.pyc | Bin 0 -> 3720 bytes info.txt | 1 + myown.db | Bin 8192 -> 0 bytes myown.db.db | 0 new.db | Bin 8192 -> 0 bytes third.db | Bin 8192 -> 0 bytes wallet_app.py | 180 +++++++++++++++++++++++-- 7 files changed, 173 insertions(+), 8 deletions(-) create mode 100644 __pycache__/dataFromApi.cpython-38.pyc create mode 100644 info.txt delete mode 100644 myown.db delete mode 100644 myown.db.db delete mode 100644 new.db delete mode 100644 third.db diff --git a/__pycache__/dataFromApi.cpython-38.pyc b/__pycache__/dataFromApi.cpython-38.pyc new file mode 100644 index 0000000000000000000000000000000000000000..83f483ba2b5580c6bb9ddbf65a59d0a4e2700a01 GIT binary patch literal 3720 zcmb7H&vP3|74DuHNh4X7?L66FY2n%8PcSZaEW4 zBc-PmVnycSR1v6x3RN69P*lP#{{VjjXO45Cic^jhRUEb`itqKviXG>&qw3fF-s@lQ zy{})l?o3bT7{1^C@~=N%pJD8u#2o${FrT1AzXK6W@DB5mntR;vmS+h|*uoL19mlgp zT4aPPvS>RZ=cmM!$Uk9TT1<-q>Wr8Xv#4D$Cr+Twij$&>@$viY_jq@udpXpi|wmhRnK1Ay6)NQTUD^t>v6gf=!U-= zXBt81hfNu$+sbdtkOW#Q`6!tEHe*drGmJkn)kdkJMDKuT_MDH{3%AtTbDPA%)i>1E2Q@yx-Cz2}K?)q8|wr_=URRs^__Qs&o5A^n?9*Dr-zVWltrtD%p zwS99lSlwRt8$IRgo`TK@XzpvO*S*pYmioJKE?H$2(kz+ff-s)rX%uw=?Iu}#@R0}7 zD8>Vq(a>zf_c>=HYn6Te{+s*Sme` zpIXKIFZ`1BRjHd9GH+fOc58%1h;71IywQ>EF!BIckxpTXf-Y3#~)dpLNQi< zj0V}bV9K5~;*&P47ZzDQvgYBDbFjQNuwzy8WXuwHI;!E;xta_prbweY9KuOO4L?_97S;P z+`D(LZh3b$S7Y8VagMpK==gYPWE>;E>p9dxk!wA>L38++gV2Rg2Vz47P3gIinN~SD zgJnleqepD}{UCM^PJ|-hz8UHag&K#MKpdR~0jMpP&l_kjf-YJggU-_Neizy!Kqo6E zLH`RF0y>;kL{KfNg^g5~$d&+h2kDQ$fCNbZ2@e_y{dH*4$21ve?qeR8YV^pywZ{`^ za>q0Tj6Xw@KdLc-nXVaUCVoa{uMR8swC+b2E0rX}FNIQ9u58?>Yz!KmpjmmmhX7P` z&}>V!M0wbFe|Y&|6nwliz7v+3y>113<>80p0hLCt*WNN?SEAi+qu06gcyEg$I)TCP zgTpf=mx`I_dzF5&gYo#jAE-+}3`P$xe3dcA0t3h4%HeV2i|h5SFDzX+SQD^FOkU~w zsx9>;toq%@du7X@AWpY>3ik@w62h*&PK2(VLs>K1lDc`1u=O1%qInPo963PK2~%dr zHB#s|p*wPQQtF-{i-sl_1ziZHWv&WJ17$l&k?JHmm3f?M;gZy7Nkr0jq zCbE=tiYDEab2Wn>1HzsEzWmqUZ#FhoOmN2B7b^xEJAe33y8g#?xneSdG0#|0w$-<= zALDn=Zb|uuZSi!|?=%M;T#|KYe}ukK0fa8A^td=&;jO}&BtH1aTEZk*9-W8(HCtuR z_~)~GY-juv{7=rWaaC))&yd`$ef|^|*m5GVClY%saV8RHEJ;lyDM)NQ0Z#96?L38d zkwE#rMXhD_K4h;{o7>6fK8wyxJG#pY?baJH~?U_#$cwS^peN?(MzrC`D;FRqK@msYvR6>UTO)Uo4e#ac+D)1u`KgaqCU<67*)^7r#$WpG1&s z-x!j->yG+u6|+P%6|-`@faGL;xD1O{5oHnYo;*Ko;q~(&`W!htG>BfpRg`EMWcV(< z^#zW~3+uW40)H^HLw_@LO5oUV_9+XC4%6v&PW^yG&e>-ywC*OaKD)MqDex6P85XKr zx7XjRmbPw{Hn(nVlrwQw-&4{TLAc|kwt}uyaZwGzoAC46L#cK@+LX;+D55wOXgSB znj-RjB1=RnL_Q!w{|3zC*t{0ay9irVahBtk>VRr`TQY_QaqgFB8U0 djOgXSZ>-);Wy_NT-(jM^RDai{{uz(CMEy? literal 0 HcmV?d00001 diff --git a/info.txt b/info.txt new file mode 100644 index 00000000..5b3ef6f9 --- /dev/null +++ b/info.txt @@ -0,0 +1 @@ +Po uruchomieniu programu można wczytać portfel (bazę danych) lub utworzyć nowy. Przed dodaniem zasobu lub wyliczeniem wartości portfela zawsze trzeba ustawić walutę główną. \ No newline at end of file diff --git a/myown.db b/myown.db deleted file mode 100644 index fc4081d6172cf4c7a3caa967389e92d3ef3739b7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8192 zcmeI#I|{-;5C-7cAP9nJC+VhCP#ZmfQPQPRbAdIk5Xb|<1hw=K-q(pCpq0J+Kl@;I zmMy++kNYSU$Ct9ot?-J*WDISXiOA^mbarX#URUVe)W2eAx#pqXGNUKyKp+4C2tWV= z5P$##AOHafKmY;|=mb*JpZLCcEX1BNcePpOq+Pw;Aq?V><6s+w+@A4tz#mEKs&Ykg xXK^=~f3<90)`jr7to7M<6s+w+@A4tz#mEKs&Ykg xXK^=~f3<90)`jr7to7M<6s+w+@A4tz#mEKs&Ykg xXK^=~f3<90)`jr7to7M Date: Sat, 6 Jun 2020 13:28:47 +0100 Subject: [PATCH 14/20] Prepare data --- create_wallet.py | 19 ---- cryptoPredict.py | 25 +++++ dataFromApi.py | 102 ------------------- wallet_app.py | 252 ----------------------------------------------- 4 files changed, 25 insertions(+), 373 deletions(-) delete mode 100644 create_wallet.py create mode 100644 cryptoPredict.py delete mode 100644 dataFromApi.py delete mode 100644 wallet_app.py diff --git a/create_wallet.py b/create_wallet.py deleted file mode 100644 index b9b84fab..00000000 --- a/create_wallet.py +++ /dev/null @@ -1,19 +0,0 @@ -import sqlite3 -import os - -def create_database(path): - if os.path.exists(path): - os.remove(path) - print("The old database has been delated, it will be replaced by a new one.") - connection = sqlite3.connect(path) - cursor = connection.cursor() - cursor.execute(""" CREATE TABLE wallet ( - currency text, - amount double - )""") - connection.commit() - connection.close() - print("The new database has been created.") - -if __name__ == "__main__": - create_database() \ No newline at end of file diff --git a/cryptoPredict.py b/cryptoPredict.py new file mode 100644 index 00000000..865f9dd2 --- /dev/null +++ b/cryptoPredict.py @@ -0,0 +1,25 @@ +import requests +import time +import datetime + +s = "03/06/2020" +t = time.mktime(datetime.datetime.strptime(s, "%d/%m/%Y").timetuple()) +parameters = {"pair": "XBTUSD", "interval": 1440, "since": t} +response = requests.get("https://api.kraken.com/0/public/OHLC", params = parameters) +data = response.json() +result = data['result']['XXBTZUSD'] +dataset = [] +i = 0 +for record in result: + data_day = [] + data_day.append((float(record[4]) - float(record[1]))/float(record[1])) + if i > 0: + data_day.append((dataset[i-1][3] - float(record[6]))/float(record[6])) + else: + data_day.append(0) + data_day.append(float(record[4])) + data_day.append(float(record[6])) + data_day.append(float(record[4])/float(record[6])) + dataset.append(data_day) + i = i+1 +print(dataset) \ No newline at end of file diff --git a/dataFromApi.py b/dataFromApi.py deleted file mode 100644 index 7b6a3ff2..00000000 --- a/dataFromApi.py +++ /dev/null @@ -1,102 +0,0 @@ -import requests -import json -import threading - -currencies = ["BTC","ETH","LTC","BCH"] -apis = ["bitbay","binance","kraken", "bittrex"] -wallet = 10000 - -def parsedData(url): - response = requests.get(url) - data = response.text - parsed = json.loads(data) - return parsed - -def printOfferList(offer_type,list_title, list): - print(list_title) - for elem in list: - print(offer_type + " Rate: " + str(elem[0]) + " Amount of Cryptocurrency: " + str(elem[1])) - -def getDiffPercentage(buy_list, sell_list): - best_buy_offer = buy_list[0][0] - best_sell_offer = sell_list[0][0] - print("BUY/SELL PERCENT DIFFERENCE " + str((best_sell_offer - best_buy_offer) / (best_buy_offer) * 100)) - -def getData(url, api,currency): - parsed = parsedData(url) - - if api == "bittrex": - return (parsed["result"]["Bid"],parsed["result"]["Ask"]) - elif api == "kraken": - if currency == "BTC": - return (parsed["result"]["XXBTZUSD"]["b"][0],parsed["result"]["XXBTZUSD"]["a"][0]) - elif currency == "BCH": - return (parsed["result"]["BCHUSD"]["b"][0],parsed["result"]["BCHUSD"]["a"][0]) - else: - return (parsed["result"]["X"+currency+"ZUSD"]["b"][0],parsed["result"]["X"+currency+"ZUSD"]["a"][0]) - if api == "bitbay": - return (parsed["bid"],parsed["ask"]) - elif api == "binance": - return (parsed["bidPrice"],parsed["askPrice"]) - -def fetchData(api, currency): - if api == "bitbay" and currency == "BCH": - currency = "BCC" - if api == "bitbay": - return getData("https://bitbay.net/API/Public/{}USD/ticker.json".format(currency),api, currency) - if api == "binance": - return getData("https://api.binance.com/api/v3/ticker/bookTicker?symbol={}TUSD".format(currency),api, currency) - if api == "kraken" and currency == "BTC": - return getData("https://api.kraken.com/0/public/Ticker?pair=XBTUSD".format(currency),api, currency) - elif api == "kraken": - return getData("https://api.kraken.com/0/public/Ticker?pair={}USD".format(currency),api, currency) - if api == "bittrex": - return getData("https://api.bittrex.com/api/v1.1/public/getticker?market=USD-{}".format(currency),api, currency) - -def format(buy_and_sell): - return (float(buy_and_sell[0]),float(buy_and_sell[1])) - -def calculate_fee(buy_and_sell,api): - if api == "binance" or "bitbay": - fee = 0.001 - elif api == "bittrex": - fee = 0.002 - elif api == "kraken": - fee = 0.0026 - return (buy_and_sell[0]*(1-fee),buy_and_sell[1]*(1+fee)) - -def checkArbitrage(): - global wallet - for currency in currencies: - data = {"bitbay" : [],"binance" : [],"kraken" : [],"bittrex" : []} - data["bitbay"] = format(fetchData("bitbay", currency)) - data["binance"] = format(fetchData("binance", currency)) - data["kraken"] = format(fetchData("kraken", currency)) - data["bittrex"] = format(fetchData("bittrex", currency)) - - for api in apis: - data[api] = calculate_fee(data[api],api) - - expensive_crypto = max(data, key=lambda x: data[x][0]) - cheapest_crypto = min(data, key=lambda x: data[x][1]) - - if data[cheapest_crypto][1] < data[expensive_crypto][0] and data[cheapest_crypto][1] < wallet: - print("Deal made on " + currency) - wallet += expensive_crypto - cheapest_crypto - print("Gained " + str(expensive_crypto - cheapest_crypto)) - else: - print("No deal on " + currency) - print("Wallet: "+str(wallet)) - - -def runMainEvery5Seconds(): - try: - threading.Timer(5.0, runMainEvery5Seconds).start() - checkArbitrage() - print("CTRL+C TO STOP") - except KeyboardInterrupt: - pass - -if __name__ == "__main__": - runMainEvery5Seconds() - \ No newline at end of file diff --git a/wallet_app.py b/wallet_app.py deleted file mode 100644 index 4d8d2682..00000000 --- a/wallet_app.py +++ /dev/null @@ -1,252 +0,0 @@ -import tkinter -import sys -import os -import sqlite3 -from tkinter import messagebox -import pathlib -import create_wallet -from tkinter import filedialog -import dataFromApi - -wallet_file = "" -resources=[] -base_currency = None - -def create_new_wallet(wind): - global wallet_file - wallet_name = filedialog.asksaveasfilename(parent=wind, - initialdir=os.getcwd(), - title="Create your wallet file:", - filetypes= [('database', '.db')]) - wallet_file = wallet_name + ".db" - create_wallet.create_database(wallet_file) - wind.destroy() - create_main_window() - - -def load_data(filename): - connention = sqlite3.connect(filename) - cursor = connention.cursor() - cursor.execute("SELECT * FROM wallet") - global resources - resources = cursor.fetchall() - print(resources) - -def load_wallet(wind): - global wallet_file - wallet_name = filedialog.askopenfilename(parent=wind, - initialdir=os.getcwd(), - title="Open your wallet file file:", - filetypes= [('database', '.db')]) - load_data(wallet_name) - wallet_file = wallet_name - wind.destroy() - create_main_window() - -def print_resources(): - labels_resources = [] - print_resources_window = tkinter.Tk() - print_resources_window.title("Resources") - resources - print(resources) - for resource in resources: - labels_resources.append(tkinter.Label(print_resources_window, text=("Currency: %s Amount: %f" % (resource[0],resource[1])))) - - for label in labels_resources: - label.pack(side="top") - - print_resources_window.mainloop() - -def setBase(base, window): - global base_currency - if base == "USD" or base == "PLN": - base_currency = base - window.destroy() - else: - messagebox.showinfo("Set result","Wrong currency - Choose one from [USD,PLN]") - -def calculateValue(currency,amount): - if next(iter(dataFromApi.parsedData("https://bitbay.net/API/Public/{0}{1}/ticker.json".format(currency,base_currency)))) == 'code': - if(dataFromApi.parsedData("https://api.bittrex.com/api/v1.1/public/getticker?market={}-{}".format(base_currency, currency)))['success'] == False: - if next(iter(dataFromApi.parsedData("https://api.binance.com/api/v3/ticker/bookTicker?symbol={}T{}".format(currency, base_currency)))) == 'code': - print() - else: - return float(dataFromApi.parsedData("https://api.binance.com/api/v3/ticker/bookTicker?symbol={}T{}".format(currency, base_currency))['bidPrice'])*amount - else: - return float((dataFromApi.parsedData("https://api.bittrex.com/api/v1.1/public/getticker?market={}-{}".format(base_currency, currency)))['result']['Bid'])*amount - else: - return float(dataFromApi.parsedData("https://bitbay.net/API/Public/{0}{1}/ticker.json".format(currency,base_currency))['bid'])*amount - - -def checkExistance(currency): - if next(iter(dataFromApi.parsedData("https://bitbay.net/API/Public/{}{}/ticker.json".format(currency, base_currency)))) == 'code': - if(dataFromApi.parsedData("https://api.bittrex.com/api/v1.1/public/getticker?market={}-{}".format(base_currency, currency)))['success'] == False: - if next(iter(dataFromApi.parsedData("https://api.binance.com/api/v3/ticker/bookTicker?symbol={}T{}".format(currency, base_currency)))) == 'code': - return True - else: - return False - -def set_base_currency(): - set_base_currency_window = tkinter.Tk() - set_base_currency_window.geometry("200x100") - set_base_currency_window.title("Base currency") - set_base = tkinter.Entry(set_base_currency_window) - set_base_label = tkinter.Label(set_base_currency_window, text = "Set base currency [USD,PLN]") - set_base.place(x=10,y=40) - set_base_label.place(x=10,y=5) - set_button = tkinter.Button(set_base_currency_window, text="Set", command=lambda: setBase(set_base.get(), set_base_currency_window)) - set_button.place( height=30, width=40,x=75,y=60) - set_base_currency_window.mainloop() - -def addResource(currency, amount, window): - found = False - if base_currency == None: - messagebox.showinfo("Error","Set a base currency first") - found = True - window.destroy() - elif checkExistance(currency): - messagebox.showinfo("Error","This market doesn't exist") - found = True - else: - for resource in resources: - if currency == resource[0]: - messagebox.showinfo("Error","This currency already in resources") - found = True - if found == False: - resources.append((currency,float(amount))) - connection = sqlite3.connect(wallet_file) - cursor = connection.cursor() - cursor.execute("INSERT INTO wallet VALUES (?,?)", - (currency, amount)) - connection.commit() - connection.close() - messagebox.showinfo("Success","Resource added.") - window.destroy() - -def add_resource(): - - add_resource_window = tkinter.Tk() - add_resource_window.geometry("150x200") - add_resource_window.title("Add resource") - resource_currency = tkinter.Entry(add_resource_window) - resource_currency_label = tkinter.Label(add_resource_window, text = "Currency") - resource_currency.place(x=10,y=40) - resource_currency_label.place(x=10,y=5) - resource_amount = tkinter.Entry(add_resource_window) - resource_amount_label = tkinter.Label(add_resource_window, text = "Amount") - resource_amount.place(x=10,y=90) - resource_amount_label.place(x=10,y=65) - add_button = tkinter.Button(add_resource_window, text="Add", command=lambda: addResource(resource_currency.get(), resource_amount.get(), add_resource_window)) - add_button.place( height=30, width=40,x=65,y=120) - add_resource_window.mainloop() - -def deleteResource(currency,window): - found = False - for resource in resources: - if currency == resource[0]: - resources.remove((currency,resource[1])) - connection = sqlite3.connect(wallet_file) - cursor = connection.cursor() - cursor.execute('DELETE FROM wallet WHERE currency=?',(currency,)) - connection.commit() - connection.close() - messagebox.showinfo("Success","Deleted successfully.") - found = True - window.destroy() - if found == False: - messagebox.showinfo("Error","No such currency. Impossible to delete") - window.destroy() - - - -def delete_resource(): - delete_resource_window = tkinter.Tk() - delete_resource_window.geometry("150x100") - delete_resource_window.title("Delete resource") - resource_currency = tkinter.Entry(delete_resource_window) - resource_currency_label = tkinter.Label(delete_resource_window, text = "Currency") - resource_currency.place(x=10,y=40) - resource_currency_label.place(x=10,y=5) - delete_button = tkinter.Button(delete_resource_window, text="Delete", command=lambda: deleteResource(resource_currency.get(), delete_resource_window)) - delete_button.place( height=30, width=40,x=65,y=70) - delete_resource_window.mainloop() - -def modifyResource(currency, amount, window): - for resource in resources: - if currency == resource[0]: - connection = sqlite3.connect(wallet_file) - cursor = connection.cursor() - cursor.execute('UPDATE wallet SET amount = ? WHERE currency = ?', (amount,currency,)) - connection.commit() - connection.close() - messagebox.showinfo("Success","Updated successfully.") - window.destroy() - -def modify_resource(): - modify_resource_window = tkinter.Tk() - modify_resource_window.geometry("150x200") - modify_resource_window.title("Modify resource") - resource_currency = tkinter.Entry(modify_resource_window) - resource_currency_label = tkinter.Label(modify_resource_window, text = "Currency") - resource_currency.place(x=10,y=40) - resource_currency_label.place(x=10,y=5) - resource_amount = tkinter.Entry(modify_resource_window) - resource_amount_label = tkinter.Label(modify_resource_window, text = "Amount") - resource_amount.place(x=10,y=90) - resource_amount_label.place(x=10,y=65) - modify_button = tkinter.Button(modify_resource_window, text="Modify", command=lambda: modifyResource(resource_currency.get(), resource_amount.get(), modify_resource_window)) - modify_button.place( height=30, width=40,x=65,y=130) - modify_resource_window.mainloop() - -def print_value(): - if base_currency == None: - messagebox.showinfo("Error", "Set base currency first") - else: - print_value_window = tkinter.Tk() - print_value_window.geometry("150x60") - print_value_window.title("Wallet value") - value = 0 - for resource in resources: - value += float(calculateValue(resource[0],resource[1])) - value_label = tkinter.Label(print_value_window, text = ("Value of wallet: %d %s" % (value,base_currency))) - value_label.place(x=40,y=20) - print_value_window.mainloop() - -def create_main_window(): - window = tkinter.Tk() - window.title("Virtual Wallet") - window.geometry("250x260") - see_resources_button = tkinter.Button(window, text="See resources", command=lambda: print_resources()) - see_resources_button.place( height=30, width=120,x=65,y=20) - set_base_currency_button = tkinter.Button(window, text="Set base currency", command=lambda: set_base_currency()) - set_base_currency_button.place( height=30, width=120,x=65,y=60) - add_resource_button = tkinter.Button(window, text="Add resource", command=lambda: add_resource()) - add_resource_button.place( height=30, width=120,x=65,y=100) - delete_resource_button = tkinter.Button(window, text="Delete resource", command=lambda: delete_resource()) - delete_resource_button.place( height=30, width=120,x=65,y=140) - modify_resource_button = tkinter.Button(window, text="Modify resource", command=lambda: modify_resource()) - modify_resource_button.place( height=30, width=120,x=65,y=180) - show_wallet_value_button = tkinter.Button(window, text="Show wallet value", command=lambda: print_value()) - show_wallet_value_button.place( height=30, width=120,x=65,y=220) - - - window.mainloop() - -def create_start_window(): - window = tkinter.Tk() - window.title("Virtual Wallet") - window.geometry("250x100") - create_wallet_button = tkinter.Button(window, text="Create new wallet", command=lambda: create_new_wallet(window)) - create_wallet_button.place( height=30, width=120,x=65,y=20) - load_wallet_button = tkinter.Button(window, text="Load wallet", command=lambda: load_wallet(window)) - load_wallet_button.place( height=30, width=120,x=65,y=60) - - window.mainloop() - - -if __name__ == "__main__": - create_start_window() - #checkExistance("CCC") - #base_currency = "BTC" - #print(calculateValue("BTC",0.1)) - \ No newline at end of file From 1220c82aac959ed04a86aa8e561bbcc0dae6bc5c Mon Sep 17 00:00:00 2001 From: TheManis92 Date: Sat, 6 Jun 2020 16:38:38 +0100 Subject: [PATCH 15/20] Build model --- cryptoPredict.py | 34 +++++++++++++++++++++++++++++++--- 1 file changed, 31 insertions(+), 3 deletions(-) diff --git a/cryptoPredict.py b/cryptoPredict.py index 865f9dd2..8cde1e2d 100644 --- a/cryptoPredict.py +++ b/cryptoPredict.py @@ -1,8 +1,11 @@ import requests import time import datetime +import numpy as np +import statsmodels.api as sm +from sklearn.linear_model import LinearRegression -s = "03/06/2020" +s = "01/06/2020" t = time.mktime(datetime.datetime.strptime(s, "%d/%m/%Y").timetuple()) parameters = {"pair": "XBTUSD", "interval": 1440, "since": t} response = requests.get("https://api.kraken.com/0/public/OHLC", params = parameters) @@ -14,12 +17,37 @@ data_day = [] data_day.append((float(record[4]) - float(record[1]))/float(record[1])) if i > 0: - data_day.append((dataset[i-1][3] - float(record[6]))/float(record[6])) + data_day.append((dataset[i-1][7] - float(record[6]))/dataset[i-1][7]) else: data_day.append(0) + if data_day[0] > 0: + data_day.append(1) + data_day.append(0) + else: + data_day.append(0) + data_day.append(1) + if data_day[1] > 0: + data_day.append(1) + data_day.append(0) + else: + data_day.append(0) + data_day.append(1) data_day.append(float(record[4])) data_day.append(float(record[6])) data_day.append(float(record[4])/float(record[6])) dataset.append(data_day) i = i+1 -print(dataset) \ No newline at end of file + +D = np.matrix(dataset) +D = np.squeeze(np.asarray(D)) +y = D[1:,[0,1,2,3,4,5]] +X = D[:-1,[0,1,6,7,8]] +print(X) +print(y) +regressor = LinearRegression() +model = regressor.fit(X, y) +print(model.coef_) + + + + From 127de99eb66cee85bc043e59cf6807f817780143 Mon Sep 17 00:00:00 2001 From: TheManis92 Date: Sat, 6 Jun 2020 18:58:16 +0100 Subject: [PATCH 16/20] Add single simulation --- cryptoPredict.py | 115 ++++++++++++++++++++++++++++++----------------- 1 file changed, 74 insertions(+), 41 deletions(-) diff --git a/cryptoPredict.py b/cryptoPredict.py index 8cde1e2d..cce0234a 100644 --- a/cryptoPredict.py +++ b/cryptoPredict.py @@ -4,50 +4,83 @@ import numpy as np import statsmodels.api as sm from sklearn.linear_model import LinearRegression +import random -s = "01/06/2020" -t = time.mktime(datetime.datetime.strptime(s, "%d/%m/%Y").timetuple()) -parameters = {"pair": "XBTUSD", "interval": 1440, "since": t} -response = requests.get("https://api.kraken.com/0/public/OHLC", params = parameters) -data = response.json() -result = data['result']['XXBTZUSD'] -dataset = [] -i = 0 -for record in result: - data_day = [] - data_day.append((float(record[4]) - float(record[1]))/float(record[1])) - if i > 0: - data_day.append((dataset[i-1][7] - float(record[6]))/dataset[i-1][7]) - else: - data_day.append(0) - if data_day[0] > 0: - data_day.append(1) - data_day.append(0) - else: - data_day.append(0) - data_day.append(1) - if data_day[1] > 0: - data_day.append(1) - data_day.append(0) + +def growthOrLoss(probability): + rand = random.uniform(0,1) + if rand <= probability: + return 1 else: - data_day.append(0) - data_day.append(1) - data_day.append(float(record[4])) - data_day.append(float(record[6])) - data_day.append(float(record[4])/float(record[6])) - dataset.append(data_day) - i = i+1 - -D = np.matrix(dataset) -D = np.squeeze(np.asarray(D)) -y = D[1:,[0,1,2,3,4,5]] -X = D[:-1,[0,1,6,7,8]] -print(X) -print(y) -regressor = LinearRegression() -model = regressor.fit(X, y) -print(model.coef_) + return -1 + +def simulate(iterations, x, reg): + sim_result = [] + for i in range(0, iterations-1): + sim_day = [] + y = reg.predict(x) + y = y.tolist() + x = x.tolist() + x = x[0] + sim_day.append(abs(y[0][0])) + sim_day.append(abs(y[0][1])) + sim_day.append(growthOrLoss(y[0][2])*abs(y[0][0])*x[2]+x[2]) + sim_day.append(growthOrLoss(y[0][3])*abs(y[0][1])*x[3]+x[3]) + sim_day.append(sim_day[2]/sim_day[3]) + x = sim_day + x = np.matrix(x) + sim_result.append(sim_day) + return sim_result + + +def start(dateFrom,dateTo): + df = time.mktime(datetime.datetime.strptime(dateFrom, "%d/%m/%Y").timetuple()) + dt = time.mktime(datetime.datetime.strptime(dateTo, "%d/%m/%Y").timetuple()) + parameters = {"pair": "XBTUSD", "interval": 1440, "since": df} + response = requests.get("https://api.kraken.com/0/public/OHLC", params = parameters) + data = response.json() + result = data['result']['XXBTZUSD'] + dataset = [] + i = 0 + for record in result: + if record[0] > dt: + break + data_day = [] + data_day.append(abs((float(record[4]) - float(record[1]))/float(record[1]))) + if i > 0: + data_day.append(abs((dataset[i-1][5] - float(record[6]))/dataset[i-1][5])) + else: + data_day.append(0) + if i > 0 and ((float(record[4]) - float(record[1]))/float(record[1])) > 0: + data_day.append(1) + else: + data_day.append(0) + if i > 0 and ((dataset[i-1][5] - float(record[6]))/dataset[i-1][5]) > 0: + data_day.append(1) + else: + data_day.append(0) + data_day.append(float(record[4])) + data_day.append(float(record[6])) + data_day.append(float(record[4])/float(record[6])) + dataset.append(data_day) + i = i+1 + + D = np.matrix(dataset) + D = np.squeeze(np.asarray(D)) + y = D[1:,[0,1,2,3]] + X = D[:-1,[0,1,4,5,6]] + print(X) + print(y) + regressor = LinearRegression() + model = regressor.fit(X, y) + + X_pred = D[-1:,[0,1,4,5,6]] + print(np.matrix(simulate(10, X_pred, model))) + +if __name__ == "__main__": + start("01/04/2020","01/06/2020") + #print(random.uniform(0,1)) From 38d1a7a446aecb4c95b9fcdef31b32c58684913e Mon Sep 17 00:00:00 2001 From: TheManis92 Date: Sat, 6 Jun 2020 19:41:16 +0100 Subject: [PATCH 17/20] Add multiple simulation --- cryptoPredict.py | 30 +++++++++++++++++------------- 1 file changed, 17 insertions(+), 13 deletions(-) diff --git a/cryptoPredict.py b/cryptoPredict.py index cce0234a..592c7a5d 100644 --- a/cryptoPredict.py +++ b/cryptoPredict.py @@ -16,16 +16,17 @@ def growthOrLoss(probability): def simulate(iterations, x, reg): sim_result = [] - for i in range(0, iterations-1): + for i in range(0, iterations): sim_day = [] y = reg.predict(x) y = y.tolist() x = x.tolist() x = x[0] + sim_day.append(1) sim_day.append(abs(y[0][0])) sim_day.append(abs(y[0][1])) - sim_day.append(growthOrLoss(y[0][2])*abs(y[0][0])*x[2]+x[2]) - sim_day.append(growthOrLoss(y[0][3])*abs(y[0][1])*x[3]+x[3]) + sim_day.append(growthOrLoss(y[0][2])*abs(y[0][0])*x[3]+x[3]) + sim_day.append(growthOrLoss(y[0][3])*abs(y[0][1])*x[4]+x[4]) sim_day.append(sim_day[2]/sim_day[3]) x = sim_day x = np.matrix(x) @@ -46,16 +47,17 @@ def start(dateFrom,dateTo): if record[0] > dt: break data_day = [] + data_day.append(1) data_day.append(abs((float(record[4]) - float(record[1]))/float(record[1]))) if i > 0: - data_day.append(abs((dataset[i-1][5] - float(record[6]))/dataset[i-1][5])) + data_day.append(abs((dataset[i-1][6] - float(record[6]))/dataset[i-1][6])) else: data_day.append(0) if i > 0 and ((float(record[4]) - float(record[1]))/float(record[1])) > 0: data_day.append(1) else: data_day.append(0) - if i > 0 and ((dataset[i-1][5] - float(record[6]))/dataset[i-1][5]) > 0: + if i > 0 and ((dataset[i-1][6] - float(record[6]))/dataset[i-1][6]) > 0: data_day.append(1) else: data_day.append(0) @@ -67,19 +69,21 @@ def start(dateFrom,dateTo): D = np.matrix(dataset) D = np.squeeze(np.asarray(D)) - y = D[1:,[0,1,2,3]] - X = D[:-1,[0,1,4,5,6]] - print(X) - print(y) + y = D[1:,[1,2,3,4]] + X = D[:-1,[0,1,2,5,6,7]] regressor = LinearRegression() model = regressor.fit(X, y) - X_pred = D[-1:,[0,1,4,5,6]] - print(np.matrix(simulate(10, X_pred, model))) - + X_pred = D[-1:,[0,1,2,5,6,7]] + single_simulation = np.matrix(simulate(int((dt-df)/86400), X_pred, model)) + multi_simulation = [] + for i in range (0,100): + multi_simulation.append(np.matrix(simulate(int((dt-df)/86400), X_pred, model))) + print(i) + print("Done") if __name__ == "__main__": - start("01/04/2020","01/06/2020") + start("01/02/2020","01/06/2020") #print(random.uniform(0,1)) From 7d4ef2634f50a82756d315f5942378614aa2bd25 Mon Sep 17 00:00:00 2001 From: TheManis92 Date: Sat, 6 Jun 2020 21:17:16 +0100 Subject: [PATCH 18/20] Single simulation on plot --- cryptoPredict.py | 27 +++++++++++++++++++++------ 1 file changed, 21 insertions(+), 6 deletions(-) diff --git a/cryptoPredict.py b/cryptoPredict.py index 592c7a5d..a0f8b113 100644 --- a/cryptoPredict.py +++ b/cryptoPredict.py @@ -5,6 +5,7 @@ import statsmodels.api as sm from sklearn.linear_model import LinearRegression import random +import matplotlib.pyplot as plt def growthOrLoss(probability): @@ -14,7 +15,7 @@ def growthOrLoss(probability): else: return -1 -def simulate(iterations, x, reg): +def simulate(iterations, x, reg, dt): sim_result = [] for i in range(0, iterations): sim_day = [] @@ -30,6 +31,8 @@ def simulate(iterations, x, reg): sim_day.append(sim_day[2]/sim_day[3]) x = sim_day x = np.matrix(x) + sim_day.append(dt) + dt += 86400 sim_result.append(sim_day) return sim_result @@ -42,11 +45,15 @@ def start(dateFrom,dateTo): data = response.json() result = data['result']['XXBTZUSD'] dataset = [] + x_axis = [] + y_axis = [] i = 0 for record in result: if record[0] > dt: break data_day = [] + x_axis.append(record[0]) + y_axis.append(float(record[4])) data_day.append(1) data_day.append(abs((float(record[4]) - float(record[1]))/float(record[1]))) if i > 0: @@ -75,16 +82,24 @@ def start(dateFrom,dateTo): model = regressor.fit(X, y) X_pred = D[-1:,[0,1,2,5,6,7]] - single_simulation = np.matrix(simulate(int((dt-df)/86400), X_pred, model)) + single_simulation = np.matrix(simulate(int((dt-df)/86400), X_pred, model, dt)) + #print(single_simulation) + """ multi_simulation = [] for i in range (0,100): multi_simulation.append(np.matrix(simulate(int((dt-df)/86400), X_pred, model))) print(i) print("Done") + """ + second_x_axis = single_simulation[:,-1:] + second_x_axis = second_x_axis.tolist() + single_simulation = single_simulation[:,[2]] + single_simulation = single_simulation.tolist() + plt.plot(second_x_axis[0], single_simulation[0]) + + plt.plot(x_axis, y_axis) + plt.show() if __name__ == "__main__": start("01/02/2020","01/06/2020") - #print(random.uniform(0,1)) - - - + #print(random.uniform(0,1)) \ No newline at end of file From e07458cae42d41cb6937854f4299a71b1e779fb2 Mon Sep 17 00:00:00 2001 From: TheManis92 Date: Sat, 6 Jun 2020 22:08:42 +0100 Subject: [PATCH 19/20] Mean simulation plot --- cryptoPredict.py | 30 +++++++++++++++++++++--------- 1 file changed, 21 insertions(+), 9 deletions(-) diff --git a/cryptoPredict.py b/cryptoPredict.py index a0f8b113..1b785f0f 100644 --- a/cryptoPredict.py +++ b/cryptoPredict.py @@ -6,7 +6,7 @@ from sklearn.linear_model import LinearRegression import random import matplotlib.pyplot as plt - +from itertools import chain def growthOrLoss(probability): rand = random.uniform(0,1) @@ -36,6 +36,14 @@ def simulate(iterations, x, reg, dt): sim_result.append(sim_day) return sim_result +def toMean(multi_simulation, iterations): + meanSimulation = [] + for j in range (0,iterations): + sum_sim = 0 + for i in range (0, 100): + sum_sim = sum_sim + multi_simulation[i][j:j+1,[3,6]].tolist()[0][0] + meanSimulation.append(sum_sim/100) + return meanSimulation def start(dateFrom,dateTo): df = time.mktime(datetime.datetime.strptime(dateFrom, "%d/%m/%Y").timetuple()) @@ -82,22 +90,26 @@ def start(dateFrom,dateTo): model = regressor.fit(X, y) X_pred = D[-1:,[0,1,2,5,6,7]] - single_simulation = np.matrix(simulate(int((dt-df)/86400), X_pred, model, dt)) + iterations = int((dt-df)/86400) + single_simulation = np.matrix(simulate(iterations, X_pred, model, dt)) #print(single_simulation) - """ + multi_simulation = [] for i in range (0,100): - multi_simulation.append(np.matrix(simulate(int((dt-df)/86400), X_pred, model))) + multi_simulation.append(np.matrix(simulate(iterations, X_pred, model, dt))) print(i) print("Done") - """ + meanSimulation = toMean(multi_simulation, iterations) + print(meanSimulation) second_x_axis = single_simulation[:,-1:] second_x_axis = second_x_axis.tolist() - single_simulation = single_simulation[:,[2]] + single_simulation = single_simulation[:,[3]] single_simulation = single_simulation.tolist() - plt.plot(second_x_axis[0], single_simulation[0]) - - plt.plot(x_axis, y_axis) + second_x_axis = list(chain.from_iterable(second_x_axis)) + single_simulation = list(chain.from_iterable(single_simulation)) + plt.plot(x_axis, y_axis, label = "Real") + plt.plot(second_x_axis, single_simulation, label = "Single simulation") + plt.plot(second_x_axis, meanSimulation, label = "Mean simulation") plt.show() if __name__ == "__main__": From beab7c8e7392b7a5447b89b3e93575c5398634be Mon Sep 17 00:00:00 2001 From: TheManis92 Date: Sat, 6 Jun 2020 22:56:07 +0100 Subject: [PATCH 20/20] Final commit, no volumes on plot --- cryptoPredict.py | 36 +++++++++++++++++++++++------------- info.txt | 1 - 2 files changed, 23 insertions(+), 14 deletions(-) delete mode 100644 info.txt diff --git a/cryptoPredict.py b/cryptoPredict.py index 1b785f0f..b248a715 100644 --- a/cryptoPredict.py +++ b/cryptoPredict.py @@ -45,13 +45,21 @@ def toMean(multi_simulation, iterations): meanSimulation.append(sum_sim/100) return meanSimulation -def start(dateFrom,dateTo): +def run_simulation(currency, dateFrom,dateTo): df = time.mktime(datetime.datetime.strptime(dateFrom, "%d/%m/%Y").timetuple()) dt = time.mktime(datetime.datetime.strptime(dateTo, "%d/%m/%Y").timetuple()) - parameters = {"pair": "XBTUSD", "interval": 1440, "since": df} + if currency == "BTC": + parameters = {"pair": "XBTUSD", "interval": 1440, "since": df} + elif currency == "ETH" or "DAI": + parameters = {"pair": currency+"USDT", "interval": 1440, "since": df} + else: + exit(0) response = requests.get("https://api.kraken.com/0/public/OHLC", params = parameters) data = response.json() - result = data['result']['XXBTZUSD'] + if currency == "BTC": + result = data['result']['XXBTZUSD'] + else: + result = data['result'][currency+'USDT'] dataset = [] x_axis = [] y_axis = [] @@ -92,26 +100,28 @@ def start(dateFrom,dateTo): X_pred = D[-1:,[0,1,2,5,6,7]] iterations = int((dt-df)/86400) single_simulation = np.matrix(simulate(iterations, X_pred, model, dt)) - #print(single_simulation) multi_simulation = [] for i in range (0,100): multi_simulation.append(np.matrix(simulate(iterations, X_pred, model, dt))) - print(i) - print("Done") meanSimulation = toMean(multi_simulation, iterations) - print(meanSimulation) + second_x_axis = single_simulation[:,-1:] second_x_axis = second_x_axis.tolist() - single_simulation = single_simulation[:,[3]] - single_simulation = single_simulation.tolist() + single_simulation = single_simulation[:,[3,4]] + single_simulation_values = single_simulation[:,[0]].tolist() + single_simulation_volumes = single_simulation[:,[1]].tolist() second_x_axis = list(chain.from_iterable(second_x_axis)) - single_simulation = list(chain.from_iterable(single_simulation)) + single_simulation_values = list(chain.from_iterable(single_simulation_values)) + single_simulation_volumes = list(chain.from_iterable(single_simulation_volumes)) plt.plot(x_axis, y_axis, label = "Real") - plt.plot(second_x_axis, single_simulation, label = "Single simulation") + plt.plot(second_x_axis, single_simulation_values, label = "Single simulation") plt.plot(second_x_axis, meanSimulation, label = "Mean simulation") + plt.legend(loc="lower center") + plt.show() if __name__ == "__main__": - start("01/02/2020","01/06/2020") - #print(random.uniform(0,1)) \ No newline at end of file + #BTC ETH OR DAI + run_simulation("BTC","01/02/2020","01/06/2020") + \ No newline at end of file diff --git a/info.txt b/info.txt deleted file mode 100644 index 5b3ef6f9..00000000 --- a/info.txt +++ /dev/null @@ -1 +0,0 @@ -Po uruchomieniu programu można wczytać portfel (bazę danych) lub utworzyć nowy. Przed dodaniem zasobu lub wyliczeniem wartości portfela zawsze trzeba ustawić walutę główną. \ No newline at end of file