From 81d91c9a0f8ca0a4de11815c2a8a1ffd42bca7fa Mon Sep 17 00:00:00 2001 From: MichalEgier Date: Mon, 23 Mar 2020 11:48:36 -0700 Subject: [PATCH 01/17] Tresc commita --- file.txt | 1 + 1 file changed, 1 insertion(+) create mode 100644 file.txt diff --git a/file.txt b/file.txt new file mode 100644 index 00000000..6113771c --- /dev/null +++ b/file.txt @@ -0,0 +1 @@ +tresc testowa From 577205455a905ac9b019fe0cccf5e9b29f7adc64 Mon Sep 17 00:00:00 2001 From: MichalEgier Date: Mon, 18 May 2020 21:28:07 +0200 Subject: [PATCH 02/17] Initial commit - first task --- L4/copy.py | 112 +++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 112 insertions(+) create mode 100644 L4/copy.py diff --git a/L4/copy.py b/L4/copy.py new file mode 100644 index 00000000..87170846 --- /dev/null +++ b/L4/copy.py @@ -0,0 +1,112 @@ +#Najpierw zaimplementuje algorytm bioracy dane, ktorych pobieranie zaimplementuje +#pozniej + +#Bedzie 16 sprawdzen czy oferta sprzedazy jest mniejsza jak oferta kupna + +#Przy kalkulacjach brac pod uwage prowizje + +import requests +import string +import json + +markets = ['bitbay.net','bittrex.com','bitstamp.net','cex.io'] + +currency_pairs = [("ETH","USD"),("LTC","BTC"),("ETH","EUR"),("ETH","BTC")] + +#Fees in percent values +fees = {'bitbay.net': 0.43,'bittrex.com': 0.2,'bitstamp.net': 0.5,'cex.io': 0.25} + +def get_orderbook_url(market, currency_pair): + source_currency = currency_pair[0] + target_currency = currency_pair[1] + if market == 'bitbay.net': + return 'https://bitbay.net/API/Public/' + source_currency + target_currency + '/orderbook.json' + if market == 'bittrex.com': + return 'https://api.bittrex.com/api/v1.1/public/getorderbook?market=' + source_currency + '-' + target_currency + "&type=both" + if market == 'bitstamp.net': + return 'https://www.bitstamp.net/api/v2/order_book/' + source_currency.lower() + target_currency.lower() + '/' + if market == 'cex.io': + return 'https://cex.io/api/order_book/' + source_currency + "/" + target_currency + return "" + +def get_ticker_url(market, currency_pair): + source_currency = currency_pair[0] + target_currency = currency_pair[1] + if market == 'bitstamp.net': + return 'https://www.bitstamp.net/api/v2/ticker/' + source_currency.lower() + target_currency.lower() + '/' + if market == 'bitbay.net': + return 'https://bitbay.net/API/Public/' + source_currency + target_currency + '/ticker.json' + if market == 'bittrex.com': + return 'https://api.bittrex.com/api/v1.1/public/getticker?market=' + source_currency + '-' + target_currency + if market == 'cex.io': + return 'https://cex.io/api/ticker/' + source_currency + '/' + target_currency + return "" + +def getBidAskPair(market, pair): + url = get_ticker_url(market,pair) + req = requests.get(url) + jsonText = req.json() + repairedJson = str(jsonText).replace("\'", "\"") + dict = json.loads(repairedJson) + bid = None + ask = None + if 'bid' in dict.keys(): + bid = dict['bid'] + if 'ask' in dict.keys(): + ask = dict['ask'] + return (float(bid),float(ask)) + +def sell_offer(market, pair): + pair = getBidAskPair(market, pair) + return pair[1] + +def buy_offer(market, pair): + pair = getBidAskPair(market, pair) + return pair[0] + +''' +def is_arbitrage_possible(): + for pair in currency_pairs: + #Sprawdzenie najpierw gdzie jest najmniejsza oferta sprzedazy + best_sell_offer = [markets[0],sell_offer(markets[0],pair)] + for market in markets: + if market.sell_offer < best_sell_offer[1]: + best_sell_offer[0] = market + best_sell_offer[1] = market.sell_offer + + #Sprawdzenie gdzie jest najwieksza oferta kupna + best_buy_offer = [market[0],markets[0].buy_offer] + for market in markets: + if market.buy_offer > best_buy_offer[1]: + best_buy_offer[0] = market + best_buy_offer[1] = market.buy_offer + + #Sprawdzenie,czy oferta kupna jest wieksza niz oferta sprzedazy + + if best_sell_offer[1] < best_buy_offer[1]: + return(best_sell_offer,best_buy_offer) + else: + return None +''' + #Sprawdza tylko czy mozna kupic na pierwszym i sprzedac na drugim, nie na odwrot +def check_arbitrage(market1, market2, curr_pair): + sell = sell_offer(market1,pair) + buy = buy_offer(market2,pair) + if sell == None or buy == None: + return False + if buy_offer > sell_offer: + return True + return False + +def print_arbitrages(): + for market1 in markets: + for market2 in markets: + for pair in currency_pairs: + arbitrage_possible = check_arbitrage(market1,market2,pair) + if arbitrage_possible: + print("Buy" + pair[0] + "-" + pair[1] + "on market " + market1 + " for " + buy_offer(market1,pair) + " and sell on market " + + market2 + " for " + sell_offer(market2,pair)) + +def check_and_print_arbitrages(): + sleep(5000) + print_arbitrages() \ No newline at end of file From e7020da3b419b7512766e27b48761f97af5dab57 Mon Sep 17 00:00:00 2001 From: MichalEgier Date: Mon, 18 May 2020 21:37:47 +0200 Subject: [PATCH 03/17] 4.2. Done - fee added --- L4/__pycache__/copy.cpython-37.pyc | Bin 0 -> 2991 bytes L4/copy.py | 36 ++++++++--------------------- L4/copy.pyc | Bin 0 -> 3825 bytes 3 files changed, 10 insertions(+), 26 deletions(-) create mode 100644 L4/__pycache__/copy.cpython-37.pyc create mode 100644 L4/copy.pyc diff --git a/L4/__pycache__/copy.cpython-37.pyc b/L4/__pycache__/copy.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..c8a5a862ac1d2a673bfd987f3b7cde111982b7b9 GIT binary patch literal 2991 zcmb7G&2JM&6rb4-d+qomKuSW|rfv^_i<$+BT2Vm*BveqPQA&c4Qrcj9HpyZqc4jBU zu{IJ?O3%IY(5i>z*#DsC-g@hKda1;vi2op`{@$$Zga}mF)x4Q`Z|BXM_kQoq-pJ>( z4A1kYe|+~-j z^m*~F7(-tO3OkI$k~vm>?-{IOGo5TTRMpDX_*$Sk0~jkAw8v}B)lLqRNL5x_MwF_7 z9X89Bwr|eg()QiCDH>1DPip(d{AAgZ7Sus__fB^#>HN!2o`3!O*pt5}mVfz~o$A80*^O!=tofay-;^Sd)n>Ck{xE8;y%>utz15XgIDRNdKIZh&B_s{z)&DFqP4Qnfv27K0Nh06bG?)H>FU8!F3r!Qd=Vsgo^HCtQb ztu1|w)bw4kxFH)uP!yd6VcawCAm|X<2-+Z*$02z+vSLVHfvod{tRpBnjIdh?!VL0& zGK0Jf(DOiK4SEK8=m8>g;I~EI@S&rNssd0|Oi(4$Fyu)1&ir5aR9LGA(w7-pdpOzq z0el4_bAGb)C2+jl+w?Wym?-ICQF>%X4@09pJ%=#VvzO{>nacs{9EsY>WS&TYNRbF3 zBO%8y(glimvYNvEK6o#LI|(y|+JyTABz7a$!(l*Yi9jX!9j+E4C z8MGReT0q%W5s`N4!B(W*CCn67ljpQ!(#?ijv<*etqvi8KTj?BDBNYSjB`I`7SW}Xc zL=F=<;^I8Ez7dM+QGFI`#_>fo0>XF}FL^b~9lSY=smarj^?gi5yI-s++4?@_Npj)* z){Mb8;!aC(k(jubFg|KZHVPVz#pcpdAg@3iQS`_Tc?SKP?n%}9HTKL@H@1>3uVKN# zmS<^8IvPDGwEi(4U_!@K1SMNpF+1tB*)ca#7gD;roY=(+=?L3)V_UGg z6-~!3^>UVOZe=T0cjSEmz?hrdp7~-PDMAOAB@pc_1wkaqs&Y!FlhS*kH@K)XRBn?3 z?2s3=jqicDjjf|jF4k6pT79u1Q6gkzIk*Xx-JGI$=Sz)r#lCHCv$iy&hugd@6bJ7<@(j+2d2H?2lxcEQ*#a}V#&JR8g2fm)lU(32 z^{HWoOay<2uJAOz;9ah3^nkm=Ia?pS$JPhYQupxl1&nz!_+!CYDd?sgC1o|+Tq`B6 zDs|k_Qd5>XL#4`^D3Oaw2f_oFM!L|uxQsU=bAIi%WVoh``%O#`nh$BKb3{rY`gq@= zi>+o9h1EuI)boQz$${siJ6IS|?Msp^3+FrB;_?%4`YtDNAA6&iw1*Vi#Xr#=9HA`w z_glBRZm?#;fAMYE){Y8SQ9YtY5VVZGL&lf_V9M)g7Yl1*@u+RzV5f+1&tMT!@G?f_ zqNLKGQz%j4+Oi~T literal 0 HcmV?d00001 diff --git a/L4/copy.py b/L4/copy.py index 87170846..7eb7e15a 100644 --- a/L4/copy.py +++ b/L4/copy.py @@ -8,6 +8,7 @@ import requests import string import json +import time markets = ['bitbay.net','bittrex.com','bitstamp.net','cex.io'] @@ -64,34 +65,14 @@ def buy_offer(market, pair): pair = getBidAskPair(market, pair) return pair[0] -''' -def is_arbitrage_possible(): - for pair in currency_pairs: - #Sprawdzenie najpierw gdzie jest najmniejsza oferta sprzedazy - best_sell_offer = [markets[0],sell_offer(markets[0],pair)] - for market in markets: - if market.sell_offer < best_sell_offer[1]: - best_sell_offer[0] = market - best_sell_offer[1] = market.sell_offer - - #Sprawdzenie gdzie jest najwieksza oferta kupna - best_buy_offer = [market[0],markets[0].buy_offer] - for market in markets: - if market.buy_offer > best_buy_offer[1]: - best_buy_offer[0] = market - best_buy_offer[1] = market.buy_offer - - #Sprawdzenie,czy oferta kupna jest wieksza niz oferta sprzedazy - - if best_sell_offer[1] < best_buy_offer[1]: - return(best_sell_offer,best_buy_offer) - else: - return None -''' #Sprawdza tylko czy mozna kupic na pierwszym i sprzedac na drugim, nie na odwrot def check_arbitrage(market1, market2, curr_pair): sell = sell_offer(market1,pair) + fee = fees[market1] + sell = sell + sell * fee buy = buy_offer(market2,pair) + fee = fees[market2] + buy = buy - buy * fee if sell == None or buy == None: return False if buy_offer > sell_offer: @@ -108,5 +89,8 @@ def print_arbitrages(): + market2 + " for " + sell_offer(market2,pair)) def check_and_print_arbitrages(): - sleep(5000) - print_arbitrages() \ No newline at end of file + while True: + time.sleep(1000) + print_arbitrages() + +check_and_print_arbitrages() diff --git a/L4/copy.pyc b/L4/copy.pyc new file mode 100644 index 0000000000000000000000000000000000000000..be6e3da192251df15aa71cf47a9e50d0ee3bdd15 GIT binary patch literal 3825 zcmcIm&u<$=6n<+vKb$6Mnua=Up>m68EkUzwsUiU_p=}B+Dp9*`RTQa2ws(_k?0B7> zF-=gyrBvdCI8=xq;t$}+1##xajXM`4jvV;|;QQX#iQ51|4S2n?Z{C}EGxOf}-ka?2 zBSYW(`onuQ>HPZeeFLxg4o!%^Ck>JLZQ7H0uglNKd`3e2vl8Yc?31OO%!4jSI4R*_ z36CfzCo!b^IC451=IH5ggfphYQO=s4?~`!9e1v8CB^*;?K*9q`3`#hzL|(#!N(@Oj zp#(HOqXcvwQUY2%DVL67>+v7>&6y#P)!0@m8&l25ntiTo(`bFFmaLj#*EhDZ+R_32 zVALRt6PpEj_4YOW-YL)O_r~oj`n}xwUcD16J^by~_s1UoJhSxW7ySJ=vxJHG{n90V znyF>b&*A0w3SRR$noStelfzpXr81zhvI#?HrJj-W3@x;ok-}zH3b0b4Oj*CmZb~?y zvT(2?&v)cQDqp9$F?U7ef#`@11@k*SBRcMpzyn-^e6CZ5AIhaMY;G<_Be93(Nh2Nu zZ`sYE)LnBL<$Xy`QEPiGF6kP^3J89t5Vew3EzZc8<8yLJR*t(~S(v$nC&s>G?K zkxbG~Ytceipgdbiao%lS3ByDia|V>ZoUBIvYFt~cG+^&WE4KbSrf8#tl zF*@h{TGHB>YHip9m_&Ws23%;Tje}sCLukYs!ZYlR;hn(ytkSyy`v^n-8L$^RfZYwc z$HDt<7rY8=09b*YS3p_`ha4dHbpT1w53B4`LDo>PLZ1WcD8Nc9_JVa+NT0%hE?oZ( z05-1Gqtp-Rucv@J*Yur^zsCA2J$v{USa+(rKo1D2UPK=0(bj{=?jZ&sRx}2KqzJ?y z&xXk`U6gtuoq`I2!6+YSQ9GcaUseXG zq24d)Cc9uB#)u}61&zJpuT-3ac#vY7m(2lcB>^3tEM|Z>x?|2T+)rtHLQ6t54)t3x z^^zKz_ObLp8m+Y>gRH}I!(upx2vedmj7=>)mPV~cr51HENF_8nY%W3B;`n;BVN|x* zNGi6Z{$!&mEI2F%mQwQ1^N%^RC8kix5NUpH~~EE6ym=3*0r_cg8$vM3A_Vx7Y;0! zn5^d1WS83;F*>59XXg@_G>gs$MMFOo7n8JTCP-D9VUdO}?hMg9+2bo?nGw4;9rc$9 zUg9F^eWJqEs*~iMVxu4#2eobWg;rurTx~>q^(Zr5D~+3W$D`&JczS^pBq%=PUVla% z3Bk_Yo!ebMO5df=(P{7sN`r?`d4N>0mhD*6<*Scz(<)^#BX|LgW^mJpqE>Jg-JL@y z^>p_;8mWWLX1MU=ndTwYyMuUn0MsQ+@FZXXb6xH<;2wLVjHI5fO6k9V*GawCqHx8{ zrGPidV2X{;=6N!c0sF^m`-&WvZq RvnMk75j>;$T)q$A{GUZN3sC?7 literal 0 HcmV?d00001 From 5e25e381d7a0569e868595c3ace89c63488162c1 Mon Sep 17 00:00:00 2001 From: MichalEgier Date: Tue, 19 May 2020 00:01:48 +0200 Subject: [PATCH 04/17] Repaired few bugs --- L4/main.py | 100 +++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 100 insertions(+) create mode 100644 L4/main.py diff --git a/L4/main.py b/L4/main.py new file mode 100644 index 00000000..1c075c87 --- /dev/null +++ b/L4/main.py @@ -0,0 +1,100 @@ +#Najpierw zaimplementuje algorytm bioracy dane, ktorych pobieranie zaimplementuje +#pozniej + +#Bedzie 16 sprawdzen czy oferta sprzedazy jest mniejsza jak oferta kupna + +#Przy kalkulacjach brac pod uwage prowizje + +import requests +import string +import json +import time + +markets = ['bitbay.net','bittrex.com','bitstamp.net','cex.io'] + +currency_pairs = [("ETH","USD"),("LTC","BTC"),("ETH","EUR"),("ETH","BTC")] + +#Fees in percent values +fees = {'bitbay.net': 0.43,'bittrex.com': 0.2,'bitstamp.net': 0.5,'cex.io': 0.25} + +def orderbook_url(market, currency_pair): + source_currency = currency_pair[0] + target_currency = currency_pair[1] + if market == 'bitbay.net': + return 'https://bitbay.net/API/Public/' + source_currency + target_currency + '/orderbook.json' + if market == 'bittrex.com': + return 'https://api.bittrex.com/api/v1.1/public/getorderbook?market=' + source_currency + '-' + target_currency + "&type=both" + if market == 'bitstamp.net': + return 'https://www.bitstamp.net/api/v2/order_book/' + source_currency.lower() + target_currency.lower() + '/' + if market == 'cex.io': + return 'https://cex.io/api/order_book/' + source_currency + "/" + target_currency + return "" + +def ticker_url(market, currency_pair): + source_currency = currency_pair[0] + target_currency = currency_pair[1] + if market == 'bitstamp.net': + return 'https://www.bitstamp.net/api/v2/ticker/' + source_currency.lower() + target_currency.lower() + '/' + if market == 'bitbay.net': + return 'https://bitbay.net/API/Public/' + source_currency + target_currency + '/ticker.json' + if market == 'bittrex.com': + return 'https://api.bittrex.com/api/v1.1/public/getticker?market=' + source_currency + '-' + target_currency + if market == 'cex.io': + return 'https://cex.io/api/ticker/' + source_currency + '/' + target_currency + return "" + +def bid_ask_pair(market, pair): + url = ticker_url(market,pair) + req = requests.get(url) + print(req) + jsonText = req.json() + repairedJson = str(jsonText).replace("\'", "\"") + if "message" not in repairedJson: + print(repairedJson) + dict = json.loads(repairedJson) + bid = None + ask = None + if 'bid' in dict.keys(): + bid = dict['bid'] + if 'ask' in dict.keys(): + ask = dict['ask'] + return (float(bid),float(ask)) + return (None, None) + +def sell_offer(market, pair): + pair = bid_ask_pair(market, pair) + return pair[1] + +def buy_offer(market, pair): + pair = bid_ask_pair(market, pair) + return pair[0] + + #Sprawdza tylko czy mozna kupic na pierwszym i sprzedac na drugim, nie na odwrot +def check_arbitrage(market1, market2, pair): + sell = sell_offer(market1,pair) + buy = buy_offer(market2,pair) + if sell == None or buy == None: + return False + fee = fees[market2] + buy = buy - buy * fee + fee = fees[market1] + sell = sell + sell * fee + if buy > sell: + return True + return False + +def print_arbitrages(): + for market1 in markets: + for market2 in markets: + for pair in currency_pairs: + arbitrage_possible = check_arbitrage(market1,market2,pair) + if arbitrage_possible: + print("Buy" + pair[0] + "-" + pair[1] + "on market " + market1 + " for " + buy_offer(market1,pair) + " and sell on market " + + market2 + " for " + sell_offer(market2,pair)) + +def check_and_print_arbitrages(): + while True: + time.sleep(1) + print_arbitrages() + +check_and_print_arbitrages() From 170bacafd72a18a48a5e092e11007e38f87e4579 Mon Sep 17 00:00:00 2001 From: MichalEgier Date: Tue, 19 May 2020 00:43:03 +0200 Subject: [PATCH 05/17] Working tasks 1 and 2 --- L4/main.py | 26 ++++++++++++++------------ 1 file changed, 14 insertions(+), 12 deletions(-) diff --git a/L4/main.py b/L4/main.py index 1c075c87..2d623f19 100644 --- a/L4/main.py +++ b/L4/main.py @@ -46,11 +46,11 @@ def ticker_url(market, currency_pair): def bid_ask_pair(market, pair): url = ticker_url(market,pair) req = requests.get(url) - print(req) +# print(req) jsonText = req.json() repairedJson = str(jsonText).replace("\'", "\"") if "message" not in repairedJson: - print(repairedJson) +# print(repairedJson) dict = json.loads(repairedJson) bid = None ask = None @@ -63,23 +63,25 @@ def bid_ask_pair(market, pair): def sell_offer(market, pair): pair = bid_ask_pair(market, pair) - return pair[1] + return pair[0] def buy_offer(market, pair): pair = bid_ask_pair(market, pair) - return pair[0] + return pair[1] - #Sprawdza tylko czy mozna kupic na pierwszym i sprzedac na drugim, nie na odwrot + #Sprawdza tylko czy mozna sprzedac na pierwszym i kupic na drugim, nie na odwrot def check_arbitrage(market1, market2, pair): - sell = sell_offer(market1,pair) - buy = buy_offer(market2,pair) + sell = sell_offer(market1,pair) #Sprzedac moge JA - czyli jest to czyjas chec KUPNA ode mnie + buy = buy_offer(market2,pair) #Kupic moge JA +# print("Without fee: Buy: " + str(buy) + " Sell: " + str(sell)) if sell == None or buy == None: return False fee = fees[market2] - buy = buy - buy * fee + buy = buy + buy * (fee/100.0) fee = fees[market1] - sell = sell + sell * fee - if buy > sell: + sell = sell - sell * (fee/100.0) +# print("With fee: Buy: " + str(buy) + " Sell: " + str(sell)) + if buy < sell: return True return False @@ -89,8 +91,8 @@ def print_arbitrages(): for pair in currency_pairs: arbitrage_possible = check_arbitrage(market1,market2,pair) if arbitrage_possible: - print("Buy" + pair[0] + "-" + pair[1] + "on market " + market1 + " for " + buy_offer(market1,pair) + " and sell on market " - + market2 + " for " + sell_offer(market2,pair)) + print("Buy " + pair[0] + "-" + pair[1] + " on market " + market1 + " for " + str(buy_offer(market2,pair)) + " and sell on market " + + market2 + " for " + str(sell_offer(market1,pair)) + " (Including fees)") def check_and_print_arbitrages(): while True: From c2ae2bc3fddab20bfd9e7a4d60187e48bd01de3f Mon Sep 17 00:00:00 2001 From: MichalEgier Date: Tue, 19 May 2020 01:40:15 +0200 Subject: [PATCH 06/17] Added wallet, fixed bugs - done 3 tasks --- L4/main.py | 51 +++++++++++++++++++++++++++++++++++++++++++++------ 1 file changed, 45 insertions(+), 6 deletions(-) diff --git a/L4/main.py b/L4/main.py index 2d623f19..9cf7bd9c 100644 --- a/L4/main.py +++ b/L4/main.py @@ -14,6 +14,9 @@ currency_pairs = [("ETH","USD"),("LTC","BTC"),("ETH","EUR"),("ETH","BTC")] + #Portfel sprawdza dla kazdej pary walut osobno +wallet = {("ETH","USD"): 0.0,("LTC","BTC"): 0.0,("ETH","EUR"): 0.0,("ETH","BTC"): 0.0} + #Fees in percent values fees = {'bitbay.net': 0.43,'bittrex.com': 0.2,'bitstamp.net': 0.5,'cex.io': 0.25} @@ -49,7 +52,7 @@ def bid_ask_pair(market, pair): # print(req) jsonText = req.json() repairedJson = str(jsonText).replace("\'", "\"") - if "message" not in repairedJson: + if "message" not in repairedJson: #jesli pojawia sie "message" to znaczy ze cos sie nie powiodlo # print(repairedJson) dict = json.loads(repairedJson) bid = None @@ -84,19 +87,55 @@ def check_arbitrage(market1, market2, pair): if buy < sell: return True return False + #w market2 KUPUJEMY w market1 SPRZEDAJEMY +def ammount_of_arbitrage(market1, market2, pair): + url = orderbook_url(market2, pair) + req = requests.get(url) + # print(req) + jsonText = req.json() + repairedJson = str(jsonText).replace("\'", "\"") + buy_ammount = 0.0 + sell_ammount = 0.0 + if "message" not in repairedJson: + # print(repairedJson) + dict = json.loads(repairedJson) + asks_ammount_pairs = None + buy_ammout_pairs = None + if 'asks' in dict.keys(): + asks_ammount_pairs = dict['asks'] + min_buy = asks_ammount_pairs[0][0] + buy_ammount = asks_ammount_pairs[0][1] + for pair in asks_ammount_pairs: + if pair[0] < min_buy: + min_buy = pair[0] + buy_ammount = pair[1] + if 'bids' in dict.keys(): + bids_ammount_pairs = dict['bids'] + max_sell = bids_ammount_pairs[0][0] + sell_ammount = bids_ammount_pairs[0][1] + for pair in bids_ammount_pairs: + if pair[0] > max_sell: + max_sell = pair[0] + sell_ammount = pair[1] + return min(buy_ammount,sell_ammount) + -def print_arbitrages(): +def loop_arbitrages(): for market1 in markets: for market2 in markets: for pair in currency_pairs: arbitrage_possible = check_arbitrage(market1,market2,pair) if arbitrage_possible: - print("Buy " + pair[0] + "-" + pair[1] + " on market " + market1 + " for " + str(buy_offer(market2,pair)) + " and sell on market " + print("Arbitrage!") + ammount = ammount_of_arbitrage(market1,market2,pair) + wallet[pair] = wallet[pair] + ammount *(sell_offer(market1,pair) - buy_offer(market2,pair)) + print("Buy " + str(ammount) + " " + pair[0] + "-" + pair[1] + " on market " + market1 + " for " + str(buy_offer(market2,pair)) + " and sell on market " + market2 + " for " + str(sell_offer(market1,pair)) + " (Including fees)") + print("Wallet after operation: " + str(wallet)) -def check_and_print_arbitrages(): +def run_arbitrages(): while True: time.sleep(1) - print_arbitrages() + loop_arbitrages() -check_and_print_arbitrages() +run_arbitrages() From 65e3b7399f0f788265384eb9f60b43c98a62fbdd Mon Sep 17 00:00:00 2001 From: MichalEgier Date: Tue, 19 May 2020 04:02:21 +0200 Subject: [PATCH 07/17] Added task 4 --- L4/main.py | 273 ++++++++++++++++++++++++++++++++++------------------- 1 file changed, 174 insertions(+), 99 deletions(-) diff --git a/L4/main.py b/L4/main.py index 9cf7bd9c..520e3d40 100644 --- a/L4/main.py +++ b/L4/main.py @@ -14,128 +14,203 @@ currency_pairs = [("ETH","USD"),("LTC","BTC"),("ETH","EUR"),("ETH","BTC")] - #Portfel sprawdza dla kazdej pary walut osobno + #Portfel sprawdza dla kazdej pary walut osobno wallet = {("ETH","USD"): 0.0,("LTC","BTC"): 0.0,("ETH","EUR"): 0.0,("ETH","BTC"): 0.0} +wallet2 = {"ETH": 0.0, "USD": 0.0, "LTC": 0.0, "BTC": 0.0, "EUR": 0.0} + #Fees in percent values fees = {'bitbay.net': 0.43,'bittrex.com': 0.2,'bitstamp.net': 0.5,'cex.io': 0.25} def orderbook_url(market, currency_pair): - source_currency = currency_pair[0] - target_currency = currency_pair[1] - if market == 'bitbay.net': - return 'https://bitbay.net/API/Public/' + source_currency + target_currency + '/orderbook.json' - if market == 'bittrex.com': - return 'https://api.bittrex.com/api/v1.1/public/getorderbook?market=' + source_currency + '-' + target_currency + "&type=both" - if market == 'bitstamp.net': - return 'https://www.bitstamp.net/api/v2/order_book/' + source_currency.lower() + target_currency.lower() + '/' - if market == 'cex.io': - return 'https://cex.io/api/order_book/' + source_currency + "/" + target_currency - return "" + source_currency = currency_pair[0] + target_currency = currency_pair[1] + if market == 'bitbay.net': + return 'https://bitbay.net/API/Public/' + source_currency + target_currency + '/orderbook.json' + if market == 'bittrex.com': + return 'https://api.bittrex.com/api/v1.1/public/getorderbook?market=' + source_currency + '-' + target_currency + "&type=both" + if market == 'bitstamp.net': + return 'https://www.bitstamp.net/api/v2/order_book/' + source_currency.lower() + target_currency.lower() + '/' + if market == 'cex.io': + return 'https://cex.io/api/order_book/' + source_currency + "/" + target_currency + return "" def ticker_url(market, currency_pair): - source_currency = currency_pair[0] - target_currency = currency_pair[1] - if market == 'bitstamp.net': - return 'https://www.bitstamp.net/api/v2/ticker/' + source_currency.lower() + target_currency.lower() + '/' - if market == 'bitbay.net': - return 'https://bitbay.net/API/Public/' + source_currency + target_currency + '/ticker.json' - if market == 'bittrex.com': - return 'https://api.bittrex.com/api/v1.1/public/getticker?market=' + source_currency + '-' + target_currency - if market == 'cex.io': - return 'https://cex.io/api/ticker/' + source_currency + '/' + target_currency - return "" + source_currency = currency_pair[0] + target_currency = currency_pair[1] + if market == 'bitstamp.net': + return 'https://www.bitstamp.net/api/v2/ticker/' + source_currency.lower() + target_currency.lower() + '/' + if market == 'bitbay.net': + return 'https://bitbay.net/API/Public/' + source_currency + target_currency + '/ticker.json' + if market == 'bittrex.com': + return 'https://api.bittrex.com/api/v1.1/public/getticker?market=' + source_currency + '-' + target_currency + if market == 'cex.io': + return 'https://cex.io/api/ticker/' + source_currency + '/' + target_currency + return "" def bid_ask_pair(market, pair): - url = ticker_url(market,pair) - req = requests.get(url) + url = ticker_url(market,pair) + req = requests.get(url) # print(req) - jsonText = req.json() - repairedJson = str(jsonText).replace("\'", "\"") - if "message" not in repairedJson: #jesli pojawia sie "message" to znaczy ze cos sie nie powiodlo + jsonText = req.json() + repairedJson = str(jsonText).replace("\'", "\"") + if "message" not in repairedJson: #jesli pojawia sie "message" to znaczy ze cos sie nie powiodlo # print(repairedJson) - dict = json.loads(repairedJson) - bid = None - ask = None - if 'bid' in dict.keys(): - bid = dict['bid'] - if 'ask' in dict.keys(): - ask = dict['ask'] - return (float(bid),float(ask)) - return (None, None) + dict = json.loads(repairedJson) + bid = None + ask = None + if 'bid' in dict.keys(): + bid = dict['bid'] + if 'ask' in dict.keys(): + ask = dict['ask'] + return (float(bid),float(ask)) + return (None, None) def sell_offer(market, pair): - pair = bid_ask_pair(market, pair) - return pair[0] + pair = bid_ask_pair(market, pair) + return pair[0] def buy_offer(market, pair): - pair = bid_ask_pair(market, pair) - return pair[1] + pair = bid_ask_pair(market, pair) + return pair[1] - #Sprawdza tylko czy mozna sprzedac na pierwszym i kupic na drugim, nie na odwrot + #Sprawdza tylko czy mozna sprzedac na pierwszym i kupic na drugim, nie na odwrot def check_arbitrage(market1, market2, pair): - sell = sell_offer(market1,pair) #Sprzedac moge JA - czyli jest to czyjas chec KUPNA ode mnie - buy = buy_offer(market2,pair) #Kupic moge JA + sell = sell_offer(market1,pair) #Sprzedac moge JA - czyli jest to czyjas chec KUPNA ode mnie + buy = buy_offer(market2,pair) #Kupic moge JA # print("Without fee: Buy: " + str(buy) + " Sell: " + str(sell)) - if sell == None or buy == None: - return False - fee = fees[market2] - buy = buy + buy * (fee/100.0) - fee = fees[market1] - sell = sell - sell * (fee/100.0) + if sell == None or buy == None: + return False + fee = fees[market2] + buy = buy + buy * (fee/100.0) + fee = fees[market1] + sell = sell - sell * (fee/100.0) # print("With fee: Buy: " + str(buy) + " Sell: " + str(sell)) - if buy < sell: - return True - return False - #w market2 KUPUJEMY w market1 SPRZEDAJEMY + if buy < sell: + return True + return False + #w market2 KUPUJEMY w market1 SPRZEDAJEMY def ammount_of_arbitrage(market1, market2, pair): - url = orderbook_url(market2, pair) - req = requests.get(url) - # print(req) - jsonText = req.json() - repairedJson = str(jsonText).replace("\'", "\"") - buy_ammount = 0.0 - sell_ammount = 0.0 - if "message" not in repairedJson: - # print(repairedJson) - dict = json.loads(repairedJson) - asks_ammount_pairs = None - buy_ammout_pairs = None - if 'asks' in dict.keys(): - asks_ammount_pairs = dict['asks'] - min_buy = asks_ammount_pairs[0][0] - buy_ammount = asks_ammount_pairs[0][1] - for pair in asks_ammount_pairs: - if pair[0] < min_buy: - min_buy = pair[0] - buy_ammount = pair[1] - if 'bids' in dict.keys(): - bids_ammount_pairs = dict['bids'] - max_sell = bids_ammount_pairs[0][0] - sell_ammount = bids_ammount_pairs[0][1] - for pair in bids_ammount_pairs: - if pair[0] > max_sell: - max_sell = pair[0] - sell_ammount = pair[1] - return min(buy_ammount,sell_ammount) + return min(ammounts_of_best_offers(market1, market2, pair)) + + #w market2 KUPUJEMY w market1 SPRZEDAJEMY +def ammounts_of_best_offers(market1, market2, pair): + url = orderbook_url(market2, pair) + req = requests.get(url) + # print(req) + jsonText = req.json() + repairedJson = str(jsonText).replace("\'", "\"") + buy_ammount = 0.0 + sell_ammount = 0.0 + if "message" not in repairedJson: + # print(repairedJson) + dict = json.loads(repairedJson) + asks_ammount_pairs = None + buy_ammout_pairs = None + if 'asks' in dict.keys(): + asks_ammount_pairs = dict['asks'] + min_buy = asks_ammount_pairs[0][0] + buy_ammount = asks_ammount_pairs[0][1] + for pair in asks_ammount_pairs: + if pair[0] < min_buy: + min_buy = pair[0] + buy_ammount = pair[1] + if 'bids' in dict.keys(): + bids_ammount_pairs = dict['bids'] + max_sell = bids_ammount_pairs[0][0] + sell_ammount = bids_ammount_pairs[0][1] + for pair in bids_ammount_pairs: + if pair[0] > max_sell: + max_sell = pair[0] + sell_ammount = pair[1] + return (buy_ammount,sell_ammount) def loop_arbitrages(): - for market1 in markets: - for market2 in markets: - for pair in currency_pairs: - arbitrage_possible = check_arbitrage(market1,market2,pair) - if arbitrage_possible: - print("Arbitrage!") - ammount = ammount_of_arbitrage(market1,market2,pair) - wallet[pair] = wallet[pair] + ammount *(sell_offer(market1,pair) - buy_offer(market2,pair)) - print("Buy " + str(ammount) + " " + pair[0] + "-" + pair[1] + " on market " + market1 + " for " + str(buy_offer(market2,pair)) + " and sell on market " - + market2 + " for " + str(sell_offer(market1,pair)) + " (Including fees)") - print("Wallet after operation: " + str(wallet)) + for market1 in markets: + for market2 in markets: + for pair in currency_pairs: + arbitrage_possible = check_arbitrage(market1,market2,pair) + if arbitrage_possible: + print("Arbitrage!") + ammount = ammount_of_arbitrage(market1,market2,pair) + wallet[pair] = wallet[pair] + ammount *(sell_offer(market1,pair) - buy_offer(market2,pair)) + print("Buy " + str(ammount) + " " + pair[0] + "-" + pair[1] + " on market " + market1 + " for " + str(buy_offer(market2,pair)) + " and sell on market " + + market2 + " for " + str(sell_offer(market1,pair)) + " (Including fees)") + print("Wallet after operation: " + str(wallet)) def run_arbitrages(): - while True: - time.sleep(1) - loop_arbitrages() - -run_arbitrages() + while True: + time.sleep(1) + loop_arbitrages() + +#run_arbitrages() + +#Zad 4 + #Przyjalem tutaj zalozenie - ask to oferta sprzedazy tego co po prawej stronie za to co po lewej + #Ammount - to jest ilosc tego co po prawej do sprzedania przez kogos + # bid to oferta zakupu tego co po prawej za to co po lewej + # Ammount - to jest ilosc to co po lewej ktos chce sprzedac + #Czyli ask -> dajesz lewe dostajesz prawe (dostajesz tyle prawego co ammount) (tracisz tyle lewego do wyliczenia) + # bid -> dajesz prawe dostajesz lewe (tracisz tyle prawego ile ammount) (dostajesz tyle co przeliczenie) +def buy(source_currency, target_currency, rate, ammount, fee): + wallet2[target_currency] = wallet2[target_currency] + (ammount - ammount * fee / 100.0) + wallet2[source_currency] = wallet2[source_currency] - (ammount * rate + ammount * rate * fee / 100.0) + print("Buy " + str(ammount) + " of " + target_currency + " for " + source_currency + " with rate " + rate) + print("Wallet now: " + wallet2) + +def sell(source_currency, target_currency, rate, ammount, fee): + rev_rate = 1.0 / rate + wallet2[source_currency] = wallet2[source_currency] + (ammount * rev_rate - ammount * rev_rate * fee / 100.0) + wallet2[target_currency] = wallet2[target_currency] - (ammount + ammount * fee / 100.0) + print("Sell " + str(ammount) + " of " + target_currency + " for " + source_currency + " with rate " + rate) + print("Wallet now: " + str(wallet2)) + +def count_average(arr): + return sum(arr) / len(arr) + +def sum_errors(arr): + sum_of_errors = 0.0 + average = count_average(arr) + for x in arr: + sum_of_errors = sum_of_errors + abs(x - average) + return sum_of_errors + +def average_deviation(arr): + return sum_errors(arr) / len(arr) + +def analyze_market(market): + dict = {} + for pair in currency_pairs: + dict[pair] = ([],[]) #Przypisanie do każdej pary walut pary pustych list + #Z lewej jest tablica bid-ow, z prawej ask-ow zarejestrowanych + while True: + time.sleep(1) + print(str(dict)) + for pair in currency_pairs: + best_offers_pair = bid_ask_pair(market,pair) + dict[pair][0].append(best_offers_pair[0]) + dict[pair][1].append(best_offers_pair[1]) + if len(dict[pair][0]) > 1500: #Jezeli tablice maja juz dlugosc ponad 1500 to usun 50 elementow ostatnich + for x in range(50): + dict[pair][0].pop(0) + if len(dict[pair][1]) > 1500: + for x in range(50): + dict[pair][0].pop(0) + if len(dict[pair][0]) > 100: #Jezeli danych zebrano juz ponad 100 to mozna zaczac spekulacje + average_dev_ask = average_deviation(dict[pair][1]) + average_dev_bid = average_deviation(dict[pair][0]) + relative_dev_ask = average_dev_ask / count_average(dict[pair][1]) + relative_dev_bid = average_dev_bid / count_average(dict[pair][0]) + av_deviation = (relative_dev_ask+ relative_dev_bid) / 2.0 + print(str(av_deviation)) + if av_deviation > 0.00025: #Dzialam tylko jezeli funkcja ma wzgledne odchylenie powyzej tej wartosci + # (patrzy wyzej + #Wzgledne odchylenie (relative_dev_ask i bid) + ammounts = ammounts_of_best_offers(market, market, pair) + if best_offers_pair[0] == min(dict[pair][0]): #Jesli aktualna cena, za która mozemy kupic osiagnela minimum + buy(pair[0],pair[1],best_offers_pair[0],ammounts[0],fees[market]) + if best_offers_pair[1] == max(dict[pair][1]): #Jesli aktualna cena, za która mozemy sprzedaz osiagnela maximum + sell(pair[0],pair[1],best_offers_pair[1],ammounts[1],fees[market]) + +analyze_market("bitbay.net") From 91f60e319002c50175e2f4825d1d4625fd2928aa Mon Sep 17 00:00:00 2001 From: MichalEgier Date: Tue, 19 May 2020 04:23:36 +0200 Subject: [PATCH 08/17] Finished but still need some fixes --- L4/main.py | 15 +++++++-------- 1 file changed, 7 insertions(+), 8 deletions(-) diff --git a/L4/main.py b/L4/main.py index 520e3d40..d1d0f3a6 100644 --- a/L4/main.py +++ b/L4/main.py @@ -14,9 +14,7 @@ currency_pairs = [("ETH","USD"),("LTC","BTC"),("ETH","EUR"),("ETH","BTC")] - #Portfel sprawdza dla kazdej pary walut osobno -wallet = {("ETH","USD"): 0.0,("LTC","BTC"): 0.0,("ETH","EUR"): 0.0,("ETH","BTC"): 0.0} - + #Portfel sprawdza dla kazdej waluty osobno wallet2 = {"ETH": 0.0, "USD": 0.0, "LTC": 0.0, "BTC": 0.0, "EUR": 0.0} #Fees in percent values @@ -60,10 +58,10 @@ def bid_ask_pair(market, pair): bid = None ask = None if 'bid' in dict.keys(): - bid = dict['bid'] + bid = float(dict['bid']) if 'ask' in dict.keys(): - ask = dict['ask'] - return (float(bid),float(ask)) + ask = float(dict['ask']) + return (bid,ask) return (None, None) def sell_offer(market, pair): @@ -134,10 +132,10 @@ def loop_arbitrages(): if arbitrage_possible: print("Arbitrage!") ammount = ammount_of_arbitrage(market1,market2,pair) - wallet[pair] = wallet[pair] + ammount *(sell_offer(market1,pair) - buy_offer(market2,pair)) print("Buy " + str(ammount) + " " + pair[0] + "-" + pair[1] + " on market " + market1 + " for " + str(buy_offer(market2,pair)) + " and sell on market " + market2 + " for " + str(sell_offer(market1,pair)) + " (Including fees)") - print("Wallet after operation: " + str(wallet)) + buy(pair[0],pair[1],buy_offer(market2,pair),ammount,fees[market2]) + sell(pair[0],pair[1],sell_offer(market1,pair),ammount,fees[market1]) def run_arbitrages(): while True: @@ -214,3 +212,4 @@ def analyze_market(market): sell(pair[0],pair[1],best_offers_pair[1],ammounts[1],fees[market]) analyze_market("bitbay.net") +#run_arbitrages() From 33f7deb86a4bea725cc1fccdfdfa2aad3697dd1e Mon Sep 17 00:00:00 2001 From: MichalEgier Date: Tue, 19 May 2020 14:13:45 +0200 Subject: [PATCH 09/17] Done --- L4/main.py | 43 +++++++++++++++++++++++++++++++------------ 1 file changed, 31 insertions(+), 12 deletions(-) diff --git a/L4/main.py b/L4/main.py index d1d0f3a6..fe111386 100644 --- a/L4/main.py +++ b/L4/main.py @@ -15,7 +15,7 @@ currency_pairs = [("ETH","USD"),("LTC","BTC"),("ETH","EUR"),("ETH","BTC")] #Portfel sprawdza dla kazdej waluty osobno -wallet2 = {"ETH": 0.0, "USD": 0.0, "LTC": 0.0, "BTC": 0.0, "EUR": 0.0} +wallet = {"ETH": 0.0, "USD": 0.0, "LTC": 0.0, "BTC": 0.0, "EUR": 0.0} #Fees in percent values fees = {'bitbay.net': 0.43,'bittrex.com': 0.2,'bitstamp.net': 0.5,'cex.io': 0.25} @@ -83,7 +83,7 @@ def check_arbitrage(market1, market2, pair): buy = buy + buy * (fee/100.0) fee = fees[market1] sell = sell - sell * (fee/100.0) -# print("With fee: Buy: " + str(buy) + " Sell: " + str(sell)) + #print("With fee: Buy: " + str(buy) + " Sell: " + str(sell)) if buy < sell: return True return False @@ -121,6 +121,7 @@ def ammounts_of_best_offers(market1, market2, pair): if pair[0] > max_sell: max_sell = pair[0] sell_ammount = pair[1] + #print(str((buy_ammount,sell_ammount))) return (buy_ammount,sell_ammount) @@ -152,17 +153,17 @@ def run_arbitrages(): #Czyli ask -> dajesz lewe dostajesz prawe (dostajesz tyle prawego co ammount) (tracisz tyle lewego do wyliczenia) # bid -> dajesz prawe dostajesz lewe (tracisz tyle prawego ile ammount) (dostajesz tyle co przeliczenie) def buy(source_currency, target_currency, rate, ammount, fee): - wallet2[target_currency] = wallet2[target_currency] + (ammount - ammount * fee / 100.0) - wallet2[source_currency] = wallet2[source_currency] - (ammount * rate + ammount * rate * fee / 100.0) - print("Buy " + str(ammount) + " of " + target_currency + " for " + source_currency + " with rate " + rate) - print("Wallet now: " + wallet2) + wallet[target_currency] = wallet[target_currency] + (ammount * rate - ammount * rate * fee / 100.0) + wallet[source_currency] = wallet[source_currency] - (ammount + ammount * fee / 100.0) + print("Buy " + str(ammount) + " of " + str(target_currency) + " for " + str(source_currency) + " with rate " + str(rate)) + print("Wallet now: " + str(wallet)) def sell(source_currency, target_currency, rate, ammount, fee): rev_rate = 1.0 / rate - wallet2[source_currency] = wallet2[source_currency] + (ammount * rev_rate - ammount * rev_rate * fee / 100.0) - wallet2[target_currency] = wallet2[target_currency] - (ammount + ammount * fee / 100.0) - print("Sell " + str(ammount) + " of " + target_currency + " for " + source_currency + " with rate " + rate) - print("Wallet now: " + str(wallet2)) + wallet[source_currency] = wallet[source_currency] + (ammount * rev_rate - ammount * rev_rate * fee / 100.0) + wallet[target_currency] = wallet[target_currency] - (ammount + ammount * fee / 100.0) + print("Sell " + str(ammount) + " of " + str(target_currency) + " for " + str(source_currency) + " with rate " + str(rate)) + print("Wallet now: " + str(wallet)) def count_average(arr): return sum(arr) / len(arr) @@ -177,6 +178,22 @@ def sum_errors(arr): def average_deviation(arr): return sum_errors(arr) / len(arr) + +#Moj algorytm +#Dla ustalonego marketu tworzy slownik, ktory dla kazdej pary walut zwraca pare list +#Listy te są historiami odpowiednio bid-ow i ask-ow dla danej pary w danym markecie +#Co sekunde uruchamia się pętla, ktora dodaje do historii aktualne najlepsze oferty +#Nastepnie sprawdza czy dlugosc tablic nie przekracza 1500 - wtedy usuwa 50 najstarszych wpisow +#Jezeli wpisow jest ponad 100 to algorytm moze zaczac wystawiac oferty +#Algorytm liczy jak bardzo funkcja jest "hustajaca sie" - liczy najpierw srednia wartosc funkcji +#a nastepnie dla kazdego punktu liczy odleglosc punktu od sredniej (blad) +#Wzgledne odchylenie to srednie odchylenie punktu od sredniej arytmetycznej podzielone jeszcze przez wartosc tej sredniej +#Algorytm liczy wzgledne odchylenie zarowno dla Bid-ow jak i Ask-ow a nastepnie ustala ich wspolne za pomoca +#Sredniej arytmetycznej obu odchylen +#Jezeli wzgledne odchylenie jest wystarczajaco duze, wieksze niz ustalona wartosc, ktora ustalilem przez analize rynku +#To znaczy ze rynek ten jest wystarczajaco zroznicowany i mozna na nim grac +#W takiej sytuacji sprawdzam czy wartosc, za ktora moge kupic jest minimalna wzgledem calej historii - wtedy kupuje +#lub, za ktora moge sprzedac maksymalna - wtedy sprzedaje def analyze_market(market): dict = {} for pair in currency_pairs: @@ -184,7 +201,7 @@ def analyze_market(market): #Z lewej jest tablica bid-ow, z prawej ask-ow zarejestrowanych while True: time.sleep(1) - print(str(dict)) +# print(str(dict)) for pair in currency_pairs: best_offers_pair = bid_ask_pair(market,pair) dict[pair][0].append(best_offers_pair[0]) @@ -201,7 +218,7 @@ def analyze_market(market): relative_dev_ask = average_dev_ask / count_average(dict[pair][1]) relative_dev_bid = average_dev_bid / count_average(dict[pair][0]) av_deviation = (relative_dev_ask+ relative_dev_bid) / 2.0 - print(str(av_deviation)) + # print("Average deviation on market " + market + " " + str(av_deviation) + " needs to be at least 0.00025 to commit action") if av_deviation > 0.00025: #Dzialam tylko jezeli funkcja ma wzgledne odchylenie powyzej tej wartosci # (patrzy wyzej #Wzgledne odchylenie (relative_dev_ask i bid) @@ -211,5 +228,7 @@ def analyze_market(market): if best_offers_pair[1] == max(dict[pair][1]): #Jesli aktualna cena, za która mozemy sprzedaz osiagnela maximum sell(pair[0],pair[1],best_offers_pair[1],ammounts[1],fees[market]) +print("Note: algorythm of analysis needs some data first, so wait few minutes for first output.") analyze_market("bitbay.net") +#To check arbitrages algorythm uncomment below line, and comment above one #run_arbitrages() From 71dbeaf945b95a7dc90501f00cb462594581b9a7 Mon Sep 17 00:00:00 2001 From: MichalEgier Date: Wed, 27 May 2020 20:10:05 +0200 Subject: [PATCH 10/17] L5 - init --- L4/__pycache__/copy.cpython-37.pyc | Bin 2991 -> 0 bytes L4/copy.py | 96 ---------- L4/copy.pyc | Bin 3825 -> 0 bytes L5/l5.py | 290 +++++++++++++++++++++++++++++ LICENSE | 21 --- README.md | 2 - l1 | 6 - l2 | 2 - 8 files changed, 290 insertions(+), 127 deletions(-) delete mode 100644 L4/__pycache__/copy.cpython-37.pyc delete mode 100644 L4/copy.py delete mode 100644 L4/copy.pyc create mode 100644 L5/l5.py delete mode 100644 LICENSE delete mode 100644 README.md delete mode 100644 l1 delete mode 100644 l2 diff --git a/L4/__pycache__/copy.cpython-37.pyc b/L4/__pycache__/copy.cpython-37.pyc deleted file mode 100644 index c8a5a862ac1d2a673bfd987f3b7cde111982b7b9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2991 zcmb7G&2JM&6rb4-d+qomKuSW|rfv^_i<$+BT2Vm*BveqPQA&c4Qrcj9HpyZqc4jBU zu{IJ?O3%IY(5i>z*#DsC-g@hKda1;vi2op`{@$$Zga}mF)x4Q`Z|BXM_kQoq-pJ>( z4A1kYe|+~-j z^m*~F7(-tO3OkI$k~vm>?-{IOGo5TTRMpDX_*$Sk0~jkAw8v}B)lLqRNL5x_MwF_7 z9X89Bwr|eg()QiCDH>1DPip(d{AAgZ7Sus__fB^#>HN!2o`3!O*pt5}mVfz~o$A80*^O!=tofay-;^Sd)n>Ck{xE8;y%>utz15XgIDRNdKIZh&B_s{z)&DFqP4Qnfv27K0Nh06bG?)H>FU8!F3r!Qd=Vsgo^HCtQb ztu1|w)bw4kxFH)uP!yd6VcawCAm|X<2-+Z*$02z+vSLVHfvod{tRpBnjIdh?!VL0& zGK0Jf(DOiK4SEK8=m8>g;I~EI@S&rNssd0|Oi(4$Fyu)1&ir5aR9LGA(w7-pdpOzq z0el4_bAGb)C2+jl+w?Wym?-ICQF>%X4@09pJ%=#VvzO{>nacs{9EsY>WS&TYNRbF3 zBO%8y(glimvYNvEK6o#LI|(y|+JyTABz7a$!(l*Yi9jX!9j+E4C z8MGReT0q%W5s`N4!B(W*CCn67ljpQ!(#?ijv<*etqvi8KTj?BDBNYSjB`I`7SW}Xc zL=F=<;^I8Ez7dM+QGFI`#_>fo0>XF}FL^b~9lSY=smarj^?gi5yI-s++4?@_Npj)* z){Mb8;!aC(k(jubFg|KZHVPVz#pcpdAg@3iQS`_Tc?SKP?n%}9HTKL@H@1>3uVKN# zmS<^8IvPDGwEi(4U_!@K1SMNpF+1tB*)ca#7gD;roY=(+=?L3)V_UGg z6-~!3^>UVOZe=T0cjSEmz?hrdp7~-PDMAOAB@pc_1wkaqs&Y!FlhS*kH@K)XRBn?3 z?2s3=jqicDjjf|jF4k6pT79u1Q6gkzIk*Xx-JGI$=Sz)r#lCHCv$iy&hugd@6bJ7<@(j+2d2H?2lxcEQ*#a}V#&JR8g2fm)lU(32 z^{HWoOay<2uJAOz;9ah3^nkm=Ia?pS$JPhYQupxl1&nz!_+!CYDd?sgC1o|+Tq`B6 zDs|k_Qd5>XL#4`^D3Oaw2f_oFM!L|uxQsU=bAIi%WVoh``%O#`nh$BKb3{rY`gq@= zi>+o9h1EuI)boQz$${siJ6IS|?Msp^3+FrB;_?%4`YtDNAA6&iw1*Vi#Xr#=9HA`w z_glBRZm?#;fAMYE){Y8SQ9YtY5VVZGL&lf_V9M)g7Yl1*@u+RzV5f+1&tMT!@G?f_ zqNLKGQz%j4+Oi~T diff --git a/L4/copy.py b/L4/copy.py deleted file mode 100644 index 7eb7e15a..00000000 --- a/L4/copy.py +++ /dev/null @@ -1,96 +0,0 @@ -#Najpierw zaimplementuje algorytm bioracy dane, ktorych pobieranie zaimplementuje -#pozniej - -#Bedzie 16 sprawdzen czy oferta sprzedazy jest mniejsza jak oferta kupna - -#Przy kalkulacjach brac pod uwage prowizje - -import requests -import string -import json -import time - -markets = ['bitbay.net','bittrex.com','bitstamp.net','cex.io'] - -currency_pairs = [("ETH","USD"),("LTC","BTC"),("ETH","EUR"),("ETH","BTC")] - -#Fees in percent values -fees = {'bitbay.net': 0.43,'bittrex.com': 0.2,'bitstamp.net': 0.5,'cex.io': 0.25} - -def get_orderbook_url(market, currency_pair): - source_currency = currency_pair[0] - target_currency = currency_pair[1] - if market == 'bitbay.net': - return 'https://bitbay.net/API/Public/' + source_currency + target_currency + '/orderbook.json' - if market == 'bittrex.com': - return 'https://api.bittrex.com/api/v1.1/public/getorderbook?market=' + source_currency + '-' + target_currency + "&type=both" - if market == 'bitstamp.net': - return 'https://www.bitstamp.net/api/v2/order_book/' + source_currency.lower() + target_currency.lower() + '/' - if market == 'cex.io': - return 'https://cex.io/api/order_book/' + source_currency + "/" + target_currency - return "" - -def get_ticker_url(market, currency_pair): - source_currency = currency_pair[0] - target_currency = currency_pair[1] - if market == 'bitstamp.net': - return 'https://www.bitstamp.net/api/v2/ticker/' + source_currency.lower() + target_currency.lower() + '/' - if market == 'bitbay.net': - return 'https://bitbay.net/API/Public/' + source_currency + target_currency + '/ticker.json' - if market == 'bittrex.com': - return 'https://api.bittrex.com/api/v1.1/public/getticker?market=' + source_currency + '-' + target_currency - if market == 'cex.io': - return 'https://cex.io/api/ticker/' + source_currency + '/' + target_currency - return "" - -def getBidAskPair(market, pair): - url = get_ticker_url(market,pair) - req = requests.get(url) - jsonText = req.json() - repairedJson = str(jsonText).replace("\'", "\"") - dict = json.loads(repairedJson) - bid = None - ask = None - if 'bid' in dict.keys(): - bid = dict['bid'] - if 'ask' in dict.keys(): - ask = dict['ask'] - return (float(bid),float(ask)) - -def sell_offer(market, pair): - pair = getBidAskPair(market, pair) - return pair[1] - -def buy_offer(market, pair): - pair = getBidAskPair(market, pair) - return pair[0] - - #Sprawdza tylko czy mozna kupic na pierwszym i sprzedac na drugim, nie na odwrot -def check_arbitrage(market1, market2, curr_pair): - sell = sell_offer(market1,pair) - fee = fees[market1] - sell = sell + sell * fee - buy = buy_offer(market2,pair) - fee = fees[market2] - buy = buy - buy * fee - if sell == None or buy == None: - return False - if buy_offer > sell_offer: - return True - return False - -def print_arbitrages(): - for market1 in markets: - for market2 in markets: - for pair in currency_pairs: - arbitrage_possible = check_arbitrage(market1,market2,pair) - if arbitrage_possible: - print("Buy" + pair[0] + "-" + pair[1] + "on market " + market1 + " for " + buy_offer(market1,pair) + " and sell on market " - + market2 + " for " + sell_offer(market2,pair)) - -def check_and_print_arbitrages(): - while True: - time.sleep(1000) - print_arbitrages() - -check_and_print_arbitrages() diff --git a/L4/copy.pyc b/L4/copy.pyc deleted file mode 100644 index be6e3da192251df15aa71cf47a9e50d0ee3bdd15..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3825 zcmcIm&u<$=6n<+vKb$6Mnua=Up>m68EkUzwsUiU_p=}B+Dp9*`RTQa2ws(_k?0B7> zF-=gyrBvdCI8=xq;t$}+1##xajXM`4jvV;|;QQX#iQ51|4S2n?Z{C}EGxOf}-ka?2 zBSYW(`onuQ>HPZeeFLxg4o!%^Ck>JLZQ7H0uglNKd`3e2vl8Yc?31OO%!4jSI4R*_ z36CfzCo!b^IC451=IH5ggfphYQO=s4?~`!9e1v8CB^*;?K*9q`3`#hzL|(#!N(@Oj zp#(HOqXcvwQUY2%DVL67>+v7>&6y#P)!0@m8&l25ntiTo(`bFFmaLj#*EhDZ+R_32 zVALRt6PpEj_4YOW-YL)O_r~oj`n}xwUcD16J^by~_s1UoJhSxW7ySJ=vxJHG{n90V znyF>b&*A0w3SRR$noStelfzpXr81zhvI#?HrJj-W3@x;ok-}zH3b0b4Oj*CmZb~?y zvT(2?&v)cQDqp9$F?U7ef#`@11@k*SBRcMpzyn-^e6CZ5AIhaMY;G<_Be93(Nh2Nu zZ`sYE)LnBL<$Xy`QEPiGF6kP^3J89t5Vew3EzZc8<8yLJR*t(~S(v$nC&s>G?K zkxbG~Ytceipgdbiao%lS3ByDia|V>ZoUBIvYFt~cG+^&WE4KbSrf8#tl zF*@h{TGHB>YHip9m_&Ws23%;Tje}sCLukYs!ZYlR;hn(ytkSyy`v^n-8L$^RfZYwc z$HDt<7rY8=09b*YS3p_`ha4dHbpT1w53B4`LDo>PLZ1WcD8Nc9_JVa+NT0%hE?oZ( z05-1Gqtp-Rucv@J*Yur^zsCA2J$v{USa+(rKo1D2UPK=0(bj{=?jZ&sRx}2KqzJ?y z&xXk`U6gtuoq`I2!6+YSQ9GcaUseXG zq24d)Cc9uB#)u}61&zJpuT-3ac#vY7m(2lcB>^3tEM|Z>x?|2T+)rtHLQ6t54)t3x z^^zKz_ObLp8m+Y>gRH}I!(upx2vedmj7=>)mPV~cr51HENF_8nY%W3B;`n;BVN|x* zNGi6Z{$!&mEI2F%mQwQ1^N%^RC8kix5NUpH~~EE6ym=3*0r_cg8$vM3A_Vx7Y;0! zn5^d1WS83;F*>59XXg@_G>gs$MMFOo7n8JTCP-D9VUdO}?hMg9+2bo?nGw4;9rc$9 zUg9F^eWJqEs*~iMVxu4#2eobWg;rurTx~>q^(Zr5D~+3W$D`&JczS^pBq%=PUVla% z3Bk_Yo!ebMO5df=(P{7sN`r?`d4N>0mhD*6<*Scz(<)^#BX|LgW^mJpqE>Jg-JL@y z^>p_;8mWWLX1MU=ndTwYyMuUn0MsQ+@FZXXb6xH<;2wLVjHI5fO6k9V*GawCqHx8{ zrGPidV2X{;=6N!c0sF^m`-&WvZq RvnMk75j>;$T)q$A{GUZN3sC?7 diff --git a/L5/l5.py b/L5/l5.py new file mode 100644 index 00000000..cd8103b1 --- /dev/null +++ b/L5/l5.py @@ -0,0 +1,290 @@ +#Najpierw zaimplementuje algorytm bioracy dane, ktorych pobieranie zaimplementuje +#pozniej + +#Bedzie 16 sprawdzen czy oferta sprzedazy jest mniejsza jak oferta kupna + +#Przy kalkulacjach brac pod uwage prowizje + +import requests +import string +import json +import time + +markets = ['bitbay.net','bittrex.com','bitstamp.net','cex.io'] + +currency_pairs = [("ETH","USD"),("LTC","BTC"),("ETH","EUR"),("ETH","BTC")] + + #Portfel sprawdza dla kazdej waluty osobno +wallet = {"ETH": 0.0, "USD": 0.0, "LTC": 0.0, "BTC": 0.0, "EUR": 0.0} + +#Fees in percent values +fees = {'bitbay.net': 0.43,'bittrex.com': 0.2,'bitstamp.net': 0.5,'cex.io': 0.25} + +def orderbook_url(market, currency_pair): + source_currency = currency_pair[0] + target_currency = currency_pair[1] + if market == 'bitbay.net': + return 'https://bitbay.net/API/Public/' + source_currency + target_currency + '/orderbook.json' + if market == 'bittrex.com': + return 'https://api.bittrex.com/api/v1.1/public/getorderbook?market=' + source_currency + '-' + target_currency + "&type=both" + if market == 'bitstamp.net': + return 'https://www.bitstamp.net/api/v2/order_book/' + source_currency.lower() + target_currency.lower() + '/' + if market == 'cex.io': + return 'https://cex.io/api/order_book/' + source_currency + "/" + target_currency + return "" + +def ticker_url(market, currency_pair): + source_currency = currency_pair[0] + target_currency = currency_pair[1] + if market == 'bitstamp.net': + return 'https://www.bitstamp.net/api/v2/ticker/' + source_currency.lower() + target_currency.lower() + '/' + if market == 'bitbay.net': + return 'https://bitbay.net/API/Public/' + source_currency + target_currency + '/ticker.json' + if market == 'bittrex.com': + return 'https://api.bittrex.com/api/v1.1/public/getticker?market=' + source_currency + '-' + target_currency + if market == 'cex.io': + return 'https://cex.io/api/ticker/' + source_currency + '/' + target_currency + return "" + +def bid_ask_pair(market, pair): + url = ticker_url(market,pair) + req = requests.get(url) +# print(req) + jsonText = req.json() + repairedJson = str(jsonText).replace("\'", "\"") + if "message" not in repairedJson: #jesli pojawia sie "message" to znaczy ze cos sie nie powiodlo +# print(repairedJson) + dict = json.loads(repairedJson) + bid = None + ask = None + if 'bid' in dict.keys(): + bid = float(dict['bid']) + if 'ask' in dict.keys(): + ask = float(dict['ask']) + return (bid,ask) + return (None, None) + +def sell_offer(market, pair): + pair = bid_ask_pair(market, pair) + return pair[0] + +def buy_offer(market, pair): + pair = bid_ask_pair(market, pair) + return pair[1] + + #Sprawdza tylko czy mozna sprzedac na pierwszym i kupic na drugim, nie na odwrot +def check_arbitrage(market1, market2, pair): + sell = sell_offer(market1,pair) #Sprzedac moge JA - czyli jest to czyjas chec KUPNA ode mnie + buy = buy_offer(market2,pair) #Kupic moge JA +# print("Without fee: Buy: " + str(buy) + " Sell: " + str(sell)) + if sell == None or buy == None: + return False + fee = fees[market2] + buy = buy + buy * (fee/100.0) + fee = fees[market1] + sell = sell - sell * (fee/100.0) + #print("With fee: Buy: " + str(buy) + " Sell: " + str(sell)) + if buy < sell: + return True + return False + #w market2 KUPUJEMY w market1 SPRZEDAJEMY +def ammount_of_arbitrage(market1, market2, pair): + return min(ammounts_of_best_offers(market1, market2, pair)) + + #w market2 KUPUJEMY w market1 SPRZEDAJEMY +def ammounts_of_best_offers(market1, market2, pair): + url = orderbook_url(market2, pair) + req = requests.get(url) + # print(req) + jsonText = req.json() + repairedJson = str(jsonText).replace("\'", "\"") + buy_ammount = 0.0 + sell_ammount = 0.0 + if "message" not in repairedJson: + # print(repairedJson) + dict = json.loads(repairedJson) + asks_ammount_pairs = None + buy_ammout_pairs = None + if 'asks' in dict.keys(): + asks_ammount_pairs = dict['asks'] + min_buy = asks_ammount_pairs[0][0] + buy_ammount = asks_ammount_pairs[0][1] + for pair in asks_ammount_pairs: + if pair[0] < min_buy: + min_buy = pair[0] + buy_ammount = pair[1] + if 'bids' in dict.keys(): + bids_ammount_pairs = dict['bids'] + max_sell = bids_ammount_pairs[0][0] + sell_ammount = bids_ammount_pairs[0][1] + for pair in bids_ammount_pairs: + if pair[0] > max_sell: + max_sell = pair[0] + sell_ammount = pair[1] + #print(str((buy_ammount,sell_ammount))) + return (buy_ammount,sell_ammount) + + +def loop_arbitrages(): + for market1 in markets: + for market2 in markets: + for pair in currency_pairs: + arbitrage_possible = check_arbitrage(market1,market2,pair) + if arbitrage_possible: + print("Arbitrage!") + ammount = ammount_of_arbitrage(market1,market2,pair) + print("Buy " + str(ammount) + " " + pair[0] + "-" + pair[1] + " on market " + market1 + " for " + str(buy_offer(market2,pair)) + " and sell on market " + + market2 + " for " + str(sell_offer(market1,pair)) + " (Including fees)") + buy(pair[0],pair[1],buy_offer(market2,pair),ammount,fees[market2]) + sell(pair[0],pair[1],sell_offer(market1,pair),ammount,fees[market1]) + +def run_arbitrages(): + while True: + time.sleep(1) + loop_arbitrages() + +#run_arbitrages() + +#Zad 4 + #Przyjalem tutaj zalozenie - ask to oferta sprzedazy tego co po prawej stronie za to co po lewej + #Ammount - to jest ilosc tego co po prawej do sprzedania przez kogos + # bid to oferta zakupu tego co po prawej za to co po lewej + # Ammount - to jest ilosc to co po lewej ktos chce sprzedac + #Czyli ask -> dajesz lewe dostajesz prawe (dostajesz tyle prawego co ammount) (tracisz tyle lewego do wyliczenia) + # bid -> dajesz prawe dostajesz lewe (tracisz tyle prawego ile ammount) (dostajesz tyle co przeliczenie) +def buy(source_currency, target_currency, rate, ammount, fee): + wallet[target_currency] = wallet[target_currency] + (ammount * rate - ammount * rate * fee / 100.0) + wallet[source_currency] = wallet[source_currency] - (ammount + ammount * fee / 100.0) + print("Buy " + str(ammount) + " of " + str(target_currency) + " for " + str(source_currency) + " with rate " + str(rate)) + print("Wallet now: " + str(wallet)) + +def sell(source_currency, target_currency, rate, ammount, fee): + rev_rate = 1.0 / rate + wallet[source_currency] = wallet[source_currency] + (ammount * rev_rate - ammount * rev_rate * fee / 100.0) + wallet[target_currency] = wallet[target_currency] - (ammount + ammount * fee / 100.0) + print("Sell " + str(ammount) + " of " + str(target_currency) + " for " + str(source_currency) + " with rate " + str(rate)) + print("Wallet now: " + str(wallet)) + +def count_average(arr): + return sum(arr) / len(arr) + +def sum_errors(arr): + sum_of_errors = 0.0 + average = count_average(arr) + for x in arr: + sum_of_errors = sum_of_errors + abs(x - average) + return sum_of_errors + +def average_deviation(arr): + return sum_errors(arr) / len(arr) + + +#Moj algorytm +#Dla ustalonego marketu tworzy slownik, ktory dla kazdej pary walut zwraca pare list +#Listy te są historiami odpowiednio bid-ow i ask-ow dla danej pary w danym markecie +#Co sekunde uruchamia się pętla, ktora dodaje do historii aktualne najlepsze oferty +#Nastepnie sprawdza czy dlugosc tablic nie przekracza 1500 - wtedy usuwa 50 najstarszych wpisow +#Jezeli wpisow jest ponad 100 to algorytm moze zaczac wystawiac oferty +#Algorytm liczy jak bardzo funkcja jest "hustajaca sie" - liczy najpierw srednia wartosc funkcji +#a nastepnie dla kazdego punktu liczy odleglosc punktu od sredniej (blad) +#Wzgledne odchylenie to srednie odchylenie punktu od sredniej arytmetycznej podzielone jeszcze przez wartosc tej sredniej +#Algorytm liczy wzgledne odchylenie zarowno dla Bid-ow jak i Ask-ow a nastepnie ustala ich wspolne za pomoca +#Sredniej arytmetycznej obu odchylen +#Jezeli wzgledne odchylenie jest wystarczajaco duze, wieksze niz ustalona wartosc, ktora ustalilem przez analize rynku +#To znaczy ze rynek ten jest wystarczajaco zroznicowany i mozna na nim grac +#W takiej sytuacji sprawdzam czy wartosc, za ktora moge kupic jest minimalna wzgledem calej historii - wtedy kupuje +#lub, za ktora moge sprzedac maksymalna - wtedy sprzedaje +def analyze_market(market): + dict = {} + for pair in currency_pairs: + dict[pair] = ([],[]) #Przypisanie do każdej pary walut pary pustych list + #Z lewej jest tablica bid-ow, z prawej ask-ow zarejestrowanych + while True: + time.sleep(1) +# print(str(dict)) + for pair in currency_pairs: + best_offers_pair = bid_ask_pair(market,pair) + dict[pair][0].append(best_offers_pair[0]) + dict[pair][1].append(best_offers_pair[1]) + if len(dict[pair][0]) > 1500: #Jezeli tablice maja juz dlugosc ponad 1500 to usun 50 elementow ostatnich + for x in range(50): + dict[pair][0].pop(0) + if len(dict[pair][1]) > 1500: + for x in range(50): + dict[pair][0].pop(0) + if len(dict[pair][0]) > 100: #Jezeli danych zebrano juz ponad 100 to mozna zaczac spekulacje + average_dev_ask = average_deviation(dict[pair][1]) + average_dev_bid = average_deviation(dict[pair][0]) + relative_dev_ask = average_dev_ask / count_average(dict[pair][1]) + relative_dev_bid = average_dev_bid / count_average(dict[pair][0]) + av_deviation = (relative_dev_ask+ relative_dev_bid) / 2.0 + # print("Average deviation on market " + market + " " + str(av_deviation) + " needs to be at least 0.00025 to commit action") + if av_deviation > 0.00025: #Dzialam tylko jezeli funkcja ma wzgledne odchylenie powyzej tej wartosci + # (patrzy wyzej + #Wzgledne odchylenie (relative_dev_ask i bid) + ammounts = ammounts_of_best_offers(market, market, pair) + if best_offers_pair[0] == min(dict[pair][0]): #Jesli aktualna cena, za która mozemy kupic osiagnela minimum + buy(pair[0],pair[1],best_offers_pair[0],ammounts[0],fees[market]) + if best_offers_pair[1] == max(dict[pair][1]): #Jesli aktualna cena, za która mozemy sprzedaz osiagnela maximum + sell(pair[0],pair[1],best_offers_pair[1],ammounts[1],fees[market]) + +#print("Note: algorythm of analysis needs some data first, so wait few minutes for first output.") +#analyze_market("bitbay.net") +#To check arbitrages algorythm uncomment below line, and comment above one +#run_arbitrages() + +#L5 + +def last_transaction(market, currency_pair): + if currency_pair[0] == currency_pair[1]: + return 1.0 #Jezeli chcemy konwersji np z BTC do BTC to nie liczymy tylko dajemy ze 1.0 mnoznik + url = ticker_url(market,currency_pair) + req = requests.get(url) + if str(req) != "": + return None #Jezeli nie mozna polaczyc sie z danym url to zwroc None + jsonText = req.json() + repairedJson = str(jsonText).replace("\'", "\"") + + # print(repairedJson) + dict = json.loads(repairedJson) + #print(float(dict['last'])) + if 'last' in dict.keys(): + return float(dict['last']) + return -1.0 #Jezeli wystapil inny blad (np. dostaniemy poprawna odpowiedz od API, ze nie ma takiej + # pary walut w systemie, to zwracamy -1.0 + + #Waluty musza byc zapisane w pliku wielkimi literami +def get_json_from_file(filename): + + #Funkcja odczytuje dane z pliku JSON o podanej ścieżce w argumencie wywołania funkcji +def summarize_wallet(market, filename): #Zwraca pare (Waluta, Wartosc), ktora mowi jaka jest waluta w ktorej podajew + sum = 0.0 #I ile posiadamy w tej walucie pieniedzy + jsonText = get_json_from_file(filename) + repairedJson = str(jsonText).replace("\'", "\"") + dict = json.loads(repairedJson) + if "base_currency" not in dict.keys(): + print("Error - no base currency specified in JSON file!") + return None + base_curr = dict['base_currency'] + dict.pop(base_curr) + #Dla kazdej waluty w jakiej mamy srodki (key = waluta) + for key in dict.keys(): + pair = (base_curr, key) + last_trans = last_transaction(market, key) + if last_trans == None: + print("Error - can't connect to API or no pair " + str(pair) + " in market " + market) + elif last_trans == -1.0: + print("No pair " + str(pair) + "in market" + market) + else: + sum = sum + dict[key] * last_transaction(market, (base_curr, key)) + return (base_curr, sum) + + repairedJson = str(jsonText).replace("\'", "\"") + + +#Pobrac liste walut w jakich mamy z pliku w formacie JSON +#Na samym poczatku jest pod kluczem base_currency waluta do ktorej chcemy przeliczac +#Sprawdzic tylko w jednym wybranym markecie wszystkie waluty +#Wszystko na biezaco przeliczac do wybranej wczesniej waluty +#Jezeli nie bedzie takiej pary walut w markecie to wyswietlamy wiadomosc odpowiednia (req != 200 OR "last" not in dict.keys) +# \ No newline at end of file diff --git a/LICENSE b/LICENSE deleted file mode 100644 index 1b31956e..00000000 --- a/LICENSE +++ /dev/null @@ -1,21 +0,0 @@ -MIT License - -Copyright (c) 2020 Mateusz Magda - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. diff --git a/README.md b/README.md deleted file mode 100644 index 6661a2ed..00000000 --- a/README.md +++ /dev/null @@ -1,2 +0,0 @@ -# MSiD -System Analysis and Decision Support Methods diff --git a/l1 b/l1 deleted file mode 100644 index 76140c26..00000000 --- a/l1 +++ /dev/null @@ -1,6 +0,0 @@ -1) Sforkować repozytorium na Wasze konto -2) Przejść na Waszego forka -3) Ściągnąć wasze repo na dysk i powiązać z repozytorium zdalnym (remote) -4) Napisać sortowanie liczb w dwoma znanymi Wam metodami(język jak ustalaliśmy na laboratorium). Starajcie się napisać funkcje w sposób zwarty, bez żadnych komentarzy czy śmieci w kodzie, w sposób optymalny, z użyciem najlepszych, znanych Wam struktur danych i metod przeglądania ich. Tworząc rozwiązania pracujcie z gitem- dodawajcie na stage, twórzcie commity. Pracujcie na branchu, stwórzcie na potrzeby zadania brancha i nazwijcie go np SortingMethods -5) wypchnijcie zmiany lokalne na repo zdalne -6) utwórzcie merge requesta z brancha SortingMethods do brancha master mojego repo (oryginalnego repo, z którego powstał fork) i nazwijcie go L1. diff --git a/l2 b/l2 deleted file mode 100644 index 89f8155e..00000000 --- a/l2 +++ /dev/null @@ -1,2 +0,0 @@ -Rozwinięcie zadania z listy 1. Do wybranych algorytmów sortowania z listy 1 dobrać 2 inne i zaimplementować je. Napisać funkcję służącą do porównywania algorytmów sortowania, która przyjmuje funkcję i mierzy czas / czasy sortowania. Za jej pomocą porównać algorytmy sortowania. -Pracujcie z gitem, proponuję zrobić osobnego brancha, nazwać go SortingComparison i w nim pracować. Na koniec - jak poprzednio - wysłać na repozytorium remote i wystawić pull request do mojego repozytorium, z którego pierwotnie forkowaliście. Nie akceptuję plików dodanych do gita przez „upload”. Wysyłanie plików na wasze remote repo odbywa się poprzez git push. From 51ad26bbfe365e4068d8c15834680e0a52e871f4 Mon Sep 17 00:00:00 2001 From: MichalEgier Date: Wed, 27 May 2020 23:31:58 +0200 Subject: [PATCH 11/17] First part done --- L5/input.json | 1 + L5/l5.py | 27 ++++++++++++++++++++++----- L5/output.json | 1 + 3 files changed, 24 insertions(+), 5 deletions(-) create mode 100644 L5/input.json create mode 100644 L5/output.json diff --git a/L5/input.json b/L5/input.json new file mode 100644 index 00000000..ecce1112 --- /dev/null +++ b/L5/input.json @@ -0,0 +1 @@ +{"base_currency": "LTC", "BTC": "0.123", "LTC": "1.345"} diff --git a/L5/l5.py b/L5/l5.py index cd8103b1..5df16287 100644 --- a/L5/l5.py +++ b/L5/l5.py @@ -255,7 +255,9 @@ def last_transaction(market, currency_pair): #Waluty musza byc zapisane w pliku wielkimi literami def get_json_from_file(filename): - + with open(filename) as f: + return json.load(f) + #Funkcja odczytuje dane z pliku JSON o podanej ścieżce w argumencie wywołania funkcji def summarize_wallet(market, filename): #Zwraca pare (Waluta, Wartosc), ktora mowi jaka jest waluta w ktorej podajew sum = 0.0 #I ile posiadamy w tej walucie pieniedzy @@ -266,7 +268,9 @@ def summarize_wallet(market, filename): #Zwraca pare (Waluta, Wartosc), print("Error - no base currency specified in JSON file!") return None base_curr = dict['base_currency'] - dict.pop(base_curr) + print(str(dict)) + dict.pop("base_currency") + print(str(dict)) #Dla kazdej waluty w jakiej mamy srodki (key = waluta) for key in dict.keys(): pair = (base_curr, key) @@ -276,15 +280,28 @@ def summarize_wallet(market, filename): #Zwraca pare (Waluta, Wartosc), elif last_trans == -1.0: print("No pair " + str(pair) + "in market" + market) else: - sum = sum + dict[key] * last_transaction(market, (base_curr, key)) + sum = sum + float(dict[key]) * last_transaction(market, (base_curr, key)) return (base_curr, sum) - repairedJson = str(jsonText).replace("\'", "\"") +def main(): + pair = summarize_wallet("bitbay.net","input.json") + dict = {"base_currency":pair[0],"ammount":pair[1]} + with open("output.json",'w') as f: + json.dump(dict,f) + + +main() + +#sample = {"BTC" : "0.123", "LTC" : "1.345"} + +#with open('result.json', 'w') as fp: +# json.dump(sample, fp) +#print(get_json_from_file("result.json")) #Pobrac liste walut w jakich mamy z pliku w formacie JSON #Na samym poczatku jest pod kluczem base_currency waluta do ktorej chcemy przeliczac #Sprawdzic tylko w jednym wybranym markecie wszystkie waluty #Wszystko na biezaco przeliczac do wybranej wczesniej waluty #Jezeli nie bedzie takiej pary walut w markecie to wyswietlamy wiadomosc odpowiednia (req != 200 OR "last" not in dict.keys) -# \ No newline at end of file +# diff --git a/L5/output.json b/L5/output.json new file mode 100644 index 00000000..b2ae930b --- /dev/null +++ b/L5/output.json @@ -0,0 +1 @@ +{"base_currency": "LTC", "ammount": 0.0} \ No newline at end of file From bda99258d96c9c69d56e51bc0c94396645f7685b Mon Sep 17 00:00:00 2001 From: MichalEgier Date: Thu, 28 May 2020 00:20:07 +0200 Subject: [PATCH 12/17] Second task - fixes --- L5/l5.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/L5/l5.py b/L5/l5.py index 5df16287..e6e5eb72 100644 --- a/L5/l5.py +++ b/L5/l5.py @@ -241,10 +241,11 @@ def last_transaction(market, currency_pair): url = ticker_url(market,currency_pair) req = requests.get(url) if str(req) != "": + print(str(req)) return None #Jezeli nie mozna polaczyc sie z danym url to zwroc None jsonText = req.json() repairedJson = str(jsonText).replace("\'", "\"") - + print(repairedJson) # print(repairedJson) dict = json.loads(repairedJson) #print(float(dict['last'])) @@ -284,7 +285,7 @@ def summarize_wallet(market, filename): #Zwraca pare (Waluta, Wartosc), return (base_curr, sum) def main(): - pair = summarize_wallet("bitbay.net","input.json") + pair = summarize_wallet("bittrex.com","input.json") dict = {"base_currency":pair[0],"ammount":pair[1]} with open("output.json",'w') as f: json.dump(dict,f) From f8ce0f6cb265248c29ec7c4251feff6c2dd3c447 Mon Sep 17 00:00:00 2001 From: MichalEgier Date: Thu, 28 May 2020 01:57:58 +0200 Subject: [PATCH 13/17] Done task 1 --- L5/README | 9 ++++++ L5/input.json | 2 +- L5/l5.py | 78 +++++++++----------------------------------------- L5/output.json | 2 +- 4 files changed, 25 insertions(+), 66 deletions(-) create mode 100644 L5/README diff --git a/L5/README b/L5/README new file mode 100644 index 00000000..7a6530de --- /dev/null +++ b/L5/README @@ -0,0 +1,9 @@ +Program pobiera dane z pliku JSON o nazwie input.json w folderze tym samym co plik l5.py. +W pliku JSON musi być zdefiniowana wybrana waluta docelowa jako tekst +pisany wielkimi literami, zawarta w słowniku pod kluczem "base_currency" (patrz przykladowy plik). + +Pozostałymi parami klucz - wartosc musza byc pisane wielkimi literami waluty w jakich mamy pieniadze, +np "BTC" albo "LTC" jako klucze oraz wartości rzeczywiste w cudzysłowach, np. "146.2356", które +oznaczaja z kolei ile pieniedzy posiadamy w danej walucie. Przykladowy plik znajduje sie w folderze +projektu. Program zapisuje wynik do pliku output.json rowniez w formacie json, gdzie zapisuje walute docelowa +i obliczona wartosc. diff --git a/L5/input.json b/L5/input.json index ecce1112..7aea958f 100644 --- a/L5/input.json +++ b/L5/input.json @@ -1 +1 @@ -{"base_currency": "LTC", "BTC": "0.123", "LTC": "1.345"} +{"base_currency": "BTC", "BTC": "1.0", "LTC": "1.0"} diff --git a/L5/l5.py b/L5/l5.py index e6e5eb72..53415b12 100644 --- a/L5/l5.py +++ b/L5/l5.py @@ -178,74 +178,22 @@ def sum_errors(arr): def average_deviation(arr): return sum_errors(arr) / len(arr) - -#Moj algorytm -#Dla ustalonego marketu tworzy slownik, ktory dla kazdej pary walut zwraca pare list -#Listy te są historiami odpowiednio bid-ow i ask-ow dla danej pary w danym markecie -#Co sekunde uruchamia się pętla, ktora dodaje do historii aktualne najlepsze oferty -#Nastepnie sprawdza czy dlugosc tablic nie przekracza 1500 - wtedy usuwa 50 najstarszych wpisow -#Jezeli wpisow jest ponad 100 to algorytm moze zaczac wystawiac oferty -#Algorytm liczy jak bardzo funkcja jest "hustajaca sie" - liczy najpierw srednia wartosc funkcji -#a nastepnie dla kazdego punktu liczy odleglosc punktu od sredniej (blad) -#Wzgledne odchylenie to srednie odchylenie punktu od sredniej arytmetycznej podzielone jeszcze przez wartosc tej sredniej -#Algorytm liczy wzgledne odchylenie zarowno dla Bid-ow jak i Ask-ow a nastepnie ustala ich wspolne za pomoca -#Sredniej arytmetycznej obu odchylen -#Jezeli wzgledne odchylenie jest wystarczajaco duze, wieksze niz ustalona wartosc, ktora ustalilem przez analize rynku -#To znaczy ze rynek ten jest wystarczajaco zroznicowany i mozna na nim grac -#W takiej sytuacji sprawdzam czy wartosc, za ktora moge kupic jest minimalna wzgledem calej historii - wtedy kupuje -#lub, za ktora moge sprzedac maksymalna - wtedy sprzedaje -def analyze_market(market): - dict = {} - for pair in currency_pairs: - dict[pair] = ([],[]) #Przypisanie do każdej pary walut pary pustych list - #Z lewej jest tablica bid-ow, z prawej ask-ow zarejestrowanych - while True: - time.sleep(1) -# print(str(dict)) - for pair in currency_pairs: - best_offers_pair = bid_ask_pair(market,pair) - dict[pair][0].append(best_offers_pair[0]) - dict[pair][1].append(best_offers_pair[1]) - if len(dict[pair][0]) > 1500: #Jezeli tablice maja juz dlugosc ponad 1500 to usun 50 elementow ostatnich - for x in range(50): - dict[pair][0].pop(0) - if len(dict[pair][1]) > 1500: - for x in range(50): - dict[pair][0].pop(0) - if len(dict[pair][0]) > 100: #Jezeli danych zebrano juz ponad 100 to mozna zaczac spekulacje - average_dev_ask = average_deviation(dict[pair][1]) - average_dev_bid = average_deviation(dict[pair][0]) - relative_dev_ask = average_dev_ask / count_average(dict[pair][1]) - relative_dev_bid = average_dev_bid / count_average(dict[pair][0]) - av_deviation = (relative_dev_ask+ relative_dev_bid) / 2.0 - # print("Average deviation on market " + market + " " + str(av_deviation) + " needs to be at least 0.00025 to commit action") - if av_deviation > 0.00025: #Dzialam tylko jezeli funkcja ma wzgledne odchylenie powyzej tej wartosci - # (patrzy wyzej - #Wzgledne odchylenie (relative_dev_ask i bid) - ammounts = ammounts_of_best_offers(market, market, pair) - if best_offers_pair[0] == min(dict[pair][0]): #Jesli aktualna cena, za która mozemy kupic osiagnela minimum - buy(pair[0],pair[1],best_offers_pair[0],ammounts[0],fees[market]) - if best_offers_pair[1] == max(dict[pair][1]): #Jesli aktualna cena, za która mozemy sprzedaz osiagnela maximum - sell(pair[0],pair[1],best_offers_pair[1],ammounts[1],fees[market]) - -#print("Note: algorythm of analysis needs some data first, so wait few minutes for first output.") -#analyze_market("bitbay.net") -#To check arbitrages algorythm uncomment below line, and comment above one -#run_arbitrages() - #L5 def last_transaction(market, currency_pair): if currency_pair[0] == currency_pair[1]: + print("Same: " + currency_pair[0] + " " + currency_pair[1]) return 1.0 #Jezeli chcemy konwersji np z BTC do BTC to nie liczymy tylko dajemy ze 1.0 mnoznik url = ticker_url(market,currency_pair) req = requests.get(url) if str(req) != "": - print(str(req)) +# print(str(req)) return None #Jezeli nie mozna polaczyc sie z danym url to zwroc None jsonText = req.json() repairedJson = str(jsonText).replace("\'", "\"") - print(repairedJson) + if "message" in repairedJson: + return -1.0 #Jezeli w wiadomosci jest fragment "message" to znaczy ze cos poszlo nie tak, nigdy go nie ma + print(repairedJson) #jak jest wszystko dobrze # print(repairedJson) dict = json.loads(repairedJson) #print(float(dict['last'])) @@ -269,23 +217,25 @@ def summarize_wallet(market, filename): #Zwraca pare (Waluta, Wartosc), print("Error - no base currency specified in JSON file!") return None base_curr = dict['base_currency'] - print(str(dict)) + #print(str(dict)) dict.pop("base_currency") - print(str(dict)) + #print(str(dict)) #Dla kazdej waluty w jakiej mamy srodki (key = waluta) for key in dict.keys(): - pair = (base_curr, key) - last_trans = last_transaction(market, key) + print("Key: " + key) + pair = (key, base_curr) + print("Pair: " + str(pair)) + last_trans = last_transaction(market, pair) if last_trans == None: print("Error - can't connect to API or no pair " + str(pair) + " in market " + market) elif last_trans == -1.0: - print("No pair " + str(pair) + "in market" + market) + print("No pair " + str(pair) + " in market " + market) else: - sum = sum + float(dict[key]) * last_transaction(market, (base_curr, key)) + sum = sum + float(dict[key]) * last_trans return (base_curr, sum) def main(): - pair = summarize_wallet("bittrex.com","input.json") + pair = summarize_wallet("bitbay.net","input.json") dict = {"base_currency":pair[0],"ammount":pair[1]} with open("output.json",'w') as f: json.dump(dict,f) diff --git a/L5/output.json b/L5/output.json index b2ae930b..c0ceb75b 100644 --- a/L5/output.json +++ b/L5/output.json @@ -1 +1 @@ -{"base_currency": "LTC", "ammount": 0.0} \ No newline at end of file +{"base_currency": "BTC", "ammount": 1.00478081} \ No newline at end of file From ff9f85e526bb11da5b2b720562a70f98ec00a9d2 Mon Sep 17 00:00:00 2001 From: MichalEgier Date: Thu, 28 May 2020 02:57:08 +0200 Subject: [PATCH 14/17] Second task started --- L5/l5.py | 71 ++++++++++++++++++++++++++++++++++++++++++++++++++++---- 1 file changed, 67 insertions(+), 4 deletions(-) diff --git a/L5/l5.py b/L5/l5.py index 53415b12..fc7d1002 100644 --- a/L5/l5.py +++ b/L5/l5.py @@ -206,9 +206,10 @@ def last_transaction(market, currency_pair): def get_json_from_file(filename): with open(filename) as f: return json.load(f) - - #Funkcja odczytuje dane z pliku JSON o podanej ścieżce w argumencie wywołania funkcji -def summarize_wallet(market, filename): #Zwraca pare (Waluta, Wartosc), ktora mowi jaka jest waluta w ktorej podajew + +#Funkcja z pierwszej czesci - bez sprawdzania dalszych marketow + #Funkcja odczytuje dane z pliku JSON o podanej ścieżce w argumencie wywołania funkcji +def old_summarize_wallet(market, filename): #Zwraca pare (Waluta, Wartosc), ktora mowi jaka jest waluta w ktorej podajew sum = 0.0 #I ile posiadamy w tej walucie pieniedzy jsonText = get_json_from_file(filename) repairedJson = str(jsonText).replace("\'", "\"") @@ -234,8 +235,70 @@ def summarize_wallet(market, filename): #Zwraca pare (Waluta, Wartosc), sum = sum + float(dict[key]) * last_trans return (base_curr, sum) + +#Task 2 + +def sort_tuples_list_by_first_elem(tup_l): + tup_l.sort(key = lambda x: x[0]) + return tup_l + + #Zwraca liste par (kurs, ilosc) posortowane wedlug kursu +def get_buy_offers_sorted(market, currency_pair): + url = orderbook_url(market,currency_pair) + req = requests.get(url) + if str(req) != "": +# print(str(req)) + return None #Jezeli nie mozna polaczyc sie z danym url to zwroc None + jsonText = req.json() + repairedJson = str(jsonText).replace("\'", "\"") + if "message" in repairedJson: + return None #Jezeli w wiadomosci jest fragment "message" to znaczy ze cos poszlo nie tak, nigdy go nie ma + print(repairedJson) #jak jest wszystko dobrze + dict = json.loads(repairedJson) + l1 = dict['asks'] + return sort_tuples_list_by_first_elem(l1) + + #Funkcja odczytuje dane z pliku JSON o podanej ścieżce w argumencie wywołania funkcji +def summarize_wallet(filename): #Zwraca pare (Waluta, Wartosc), ktora mowi jaka jest waluta w ktorej podajew + sum = 0.0 #I ile posiadamy w tej walucie pieniedzy + jsonText = get_json_from_file(filename) + repairedJson = str(jsonText).replace("\'", "\"") + dict = json.loads(repairedJson) + if "base_currency" not in dict.keys(): + print("Error - no base currency specified in JSON file!") + return None + base_curr = dict['base_currency'] + #print(str(dict)) + dict.pop("base_currency") + #print(str(dict)) + market = markets[0] + found = True + i = 0 #Licznik, ktory market teraz sprawdzamy - wazny, jezeli jakiejs waluty w jednym nie ma zawartej + #Dla kazdej waluty w jakiej mamy srodki (key = waluta) + for key in dict.keys(): + curr_left = dict[key] + pair = (key, base_curr) + offers_list = get_buy_offers_sorted(markets[i],pair) + if offers_list == None # ======== + i=i+1 + while i 0: # ======== + if offers_list[0][1] > curr_left: + sum = sum + curr_left * offers_list[0][0] + curr_left = 0 # W tych liniach zaimplementowane jest zamienianie walut + else: # z kolejnych najlepszych ofert + sum = sum + offers_list[0][1] * offers_list[0][0] # uwzgledniajac wolumen w ofercie + curr_left = curr_left - offers_list[0][1] + offers_list.pop[0] # ======== + + return (base_curr, sum) + + def main(): - pair = summarize_wallet("bitbay.net","input.json") + pair = summarize_wallet("input.json") dict = {"base_currency":pair[0],"ammount":pair[1]} with open("output.json",'w') as f: json.dump(dict,f) From 00473f91064c315a0855cf4299e7e4e7340d6a48 Mon Sep 17 00:00:00 2001 From: MichalEgier Date: Thu, 28 May 2020 15:53:10 +0200 Subject: [PATCH 15/17] Task 2 before testing --- L5/l5.py | 183 ++++++++----------------------------------------------- 1 file changed, 25 insertions(+), 158 deletions(-) diff --git a/L5/l5.py b/L5/l5.py index fc7d1002..8c2af79d 100644 --- a/L5/l5.py +++ b/L5/l5.py @@ -1,10 +1,3 @@ -#Najpierw zaimplementuje algorytm bioracy dane, ktorych pobieranie zaimplementuje -#pozniej - -#Bedzie 16 sprawdzen czy oferta sprzedazy jest mniejsza jak oferta kupna - -#Przy kalkulacjach brac pod uwage prowizje - import requests import string import json @@ -14,12 +7,6 @@ currency_pairs = [("ETH","USD"),("LTC","BTC"),("ETH","EUR"),("ETH","BTC")] - #Portfel sprawdza dla kazdej waluty osobno -wallet = {"ETH": 0.0, "USD": 0.0, "LTC": 0.0, "BTC": 0.0, "EUR": 0.0} - -#Fees in percent values -fees = {'bitbay.net': 0.43,'bittrex.com': 0.2,'bitstamp.net': 0.5,'cex.io': 0.25} - def orderbook_url(market, currency_pair): source_currency = currency_pair[0] target_currency = currency_pair[1] @@ -33,151 +20,6 @@ def orderbook_url(market, currency_pair): return 'https://cex.io/api/order_book/' + source_currency + "/" + target_currency return "" -def ticker_url(market, currency_pair): - source_currency = currency_pair[0] - target_currency = currency_pair[1] - if market == 'bitstamp.net': - return 'https://www.bitstamp.net/api/v2/ticker/' + source_currency.lower() + target_currency.lower() + '/' - if market == 'bitbay.net': - return 'https://bitbay.net/API/Public/' + source_currency + target_currency + '/ticker.json' - if market == 'bittrex.com': - return 'https://api.bittrex.com/api/v1.1/public/getticker?market=' + source_currency + '-' + target_currency - if market == 'cex.io': - return 'https://cex.io/api/ticker/' + source_currency + '/' + target_currency - return "" - -def bid_ask_pair(market, pair): - url = ticker_url(market,pair) - req = requests.get(url) -# print(req) - jsonText = req.json() - repairedJson = str(jsonText).replace("\'", "\"") - if "message" not in repairedJson: #jesli pojawia sie "message" to znaczy ze cos sie nie powiodlo -# print(repairedJson) - dict = json.loads(repairedJson) - bid = None - ask = None - if 'bid' in dict.keys(): - bid = float(dict['bid']) - if 'ask' in dict.keys(): - ask = float(dict['ask']) - return (bid,ask) - return (None, None) - -def sell_offer(market, pair): - pair = bid_ask_pair(market, pair) - return pair[0] - -def buy_offer(market, pair): - pair = bid_ask_pair(market, pair) - return pair[1] - - #Sprawdza tylko czy mozna sprzedac na pierwszym i kupic na drugim, nie na odwrot -def check_arbitrage(market1, market2, pair): - sell = sell_offer(market1,pair) #Sprzedac moge JA - czyli jest to czyjas chec KUPNA ode mnie - buy = buy_offer(market2,pair) #Kupic moge JA -# print("Without fee: Buy: " + str(buy) + " Sell: " + str(sell)) - if sell == None or buy == None: - return False - fee = fees[market2] - buy = buy + buy * (fee/100.0) - fee = fees[market1] - sell = sell - sell * (fee/100.0) - #print("With fee: Buy: " + str(buy) + " Sell: " + str(sell)) - if buy < sell: - return True - return False - #w market2 KUPUJEMY w market1 SPRZEDAJEMY -def ammount_of_arbitrage(market1, market2, pair): - return min(ammounts_of_best_offers(market1, market2, pair)) - - #w market2 KUPUJEMY w market1 SPRZEDAJEMY -def ammounts_of_best_offers(market1, market2, pair): - url = orderbook_url(market2, pair) - req = requests.get(url) - # print(req) - jsonText = req.json() - repairedJson = str(jsonText).replace("\'", "\"") - buy_ammount = 0.0 - sell_ammount = 0.0 - if "message" not in repairedJson: - # print(repairedJson) - dict = json.loads(repairedJson) - asks_ammount_pairs = None - buy_ammout_pairs = None - if 'asks' in dict.keys(): - asks_ammount_pairs = dict['asks'] - min_buy = asks_ammount_pairs[0][0] - buy_ammount = asks_ammount_pairs[0][1] - for pair in asks_ammount_pairs: - if pair[0] < min_buy: - min_buy = pair[0] - buy_ammount = pair[1] - if 'bids' in dict.keys(): - bids_ammount_pairs = dict['bids'] - max_sell = bids_ammount_pairs[0][0] - sell_ammount = bids_ammount_pairs[0][1] - for pair in bids_ammount_pairs: - if pair[0] > max_sell: - max_sell = pair[0] - sell_ammount = pair[1] - #print(str((buy_ammount,sell_ammount))) - return (buy_ammount,sell_ammount) - - -def loop_arbitrages(): - for market1 in markets: - for market2 in markets: - for pair in currency_pairs: - arbitrage_possible = check_arbitrage(market1,market2,pair) - if arbitrage_possible: - print("Arbitrage!") - ammount = ammount_of_arbitrage(market1,market2,pair) - print("Buy " + str(ammount) + " " + pair[0] + "-" + pair[1] + " on market " + market1 + " for " + str(buy_offer(market2,pair)) + " and sell on market " - + market2 + " for " + str(sell_offer(market1,pair)) + " (Including fees)") - buy(pair[0],pair[1],buy_offer(market2,pair),ammount,fees[market2]) - sell(pair[0],pair[1],sell_offer(market1,pair),ammount,fees[market1]) - -def run_arbitrages(): - while True: - time.sleep(1) - loop_arbitrages() - -#run_arbitrages() - -#Zad 4 - #Przyjalem tutaj zalozenie - ask to oferta sprzedazy tego co po prawej stronie za to co po lewej - #Ammount - to jest ilosc tego co po prawej do sprzedania przez kogos - # bid to oferta zakupu tego co po prawej za to co po lewej - # Ammount - to jest ilosc to co po lewej ktos chce sprzedac - #Czyli ask -> dajesz lewe dostajesz prawe (dostajesz tyle prawego co ammount) (tracisz tyle lewego do wyliczenia) - # bid -> dajesz prawe dostajesz lewe (tracisz tyle prawego ile ammount) (dostajesz tyle co przeliczenie) -def buy(source_currency, target_currency, rate, ammount, fee): - wallet[target_currency] = wallet[target_currency] + (ammount * rate - ammount * rate * fee / 100.0) - wallet[source_currency] = wallet[source_currency] - (ammount + ammount * fee / 100.0) - print("Buy " + str(ammount) + " of " + str(target_currency) + " for " + str(source_currency) + " with rate " + str(rate)) - print("Wallet now: " + str(wallet)) - -def sell(source_currency, target_currency, rate, ammount, fee): - rev_rate = 1.0 / rate - wallet[source_currency] = wallet[source_currency] + (ammount * rev_rate - ammount * rev_rate * fee / 100.0) - wallet[target_currency] = wallet[target_currency] - (ammount + ammount * fee / 100.0) - print("Sell " + str(ammount) + " of " + str(target_currency) + " for " + str(source_currency) + " with rate " + str(rate)) - print("Wallet now: " + str(wallet)) - -def count_average(arr): - return sum(arr) / len(arr) - -def sum_errors(arr): - sum_of_errors = 0.0 - average = count_average(arr) - for x in arr: - sum_of_errors = sum_of_errors + abs(x - average) - return sum_of_errors - -def average_deviation(arr): - return sum_errors(arr) / len(arr) - #L5 def last_transaction(market, currency_pair): @@ -297,9 +139,34 @@ def summarize_wallet(filename): #Zwraca pare (Waluta, Wartosc), ktora mo return (base_curr, sum) +#Dodatkowy feature - sprawdzanie ile mielibysmy w portfelu, jezeli wszystko kupowalibysmy po najlepszych dla nas ofertach +# zarejestrowanych w ciagu ostatnich 24h +def last_day_best_buy_offer(market, currency_pair): + if currency_pair[0] == currency_pair[1]: + print("Same: " + currency_pair[0] + " " + currency_pair[1]) + return 1.0 #Jezeli chcemy konwersji np z BTC do BTC to nie liczymy tylko dajemy ze 1.0 mnoznik + url = ticker_url(market,currency_pair) + req = requests.get(url) + if str(req) != "": +# print(str(req)) + return None #Jezeli nie mozna polaczyc sie z danym url to zwroc None + jsonText = req.json() + repairedJson = str(jsonText).replace("\'", "\"") + if "message" in repairedJson: + return -1.0 #Jezeli w wiadomosci jest fragment "message" to znaczy ze cos poszlo nie tak, nigdy go nie ma + print(repairedJson) #jak jest wszystko dobrze + # print(repairedJson) + dict = json.loads(repairedJson) + #print(float(dict['last'])) + if 'last' in dict.keys(): + return float(dict['last']) + return -1.0 #Jezeli wystapil inny blad (np. dostaniemy poprawna odpowiedz od API, ze nie ma takiej + + def main(): pair = summarize_wallet("input.json") dict = {"base_currency":pair[0],"ammount":pair[1]} + print(str(dict)) with open("output.json",'w') as f: json.dump(dict,f) From 7809980a993efb115ec2e7d928ea5ba87b578321 Mon Sep 17 00:00:00 2001 From: MichalEgier Date: Thu, 28 May 2020 22:20:01 +0200 Subject: [PATCH 16/17] Done --- L5/README | 11 ++++++ L5/input.json | 2 +- L5/l5.py | 102 ++++++++++++++++++++++++++++++++----------------- L5/output.json | 2 +- 4 files changed, 80 insertions(+), 37 deletions(-) diff --git a/L5/README b/L5/README index 7a6530de..bd49def9 100644 --- a/L5/README +++ b/L5/README @@ -7,3 +7,14 @@ np "BTC" albo "LTC" jako klucze oraz wartości rzeczywiste w cudzysłowach, np. oznaczaja z kolei ile pieniedzy posiadamy w danej walucie. Przykladowy plik znajduje sie w folderze projektu. Program zapisuje wynik do pliku output.json rowniez w formacie json, gdzie zapisuje walute docelowa i obliczona wartosc. + +UPDATE: + +Jako dodatkowy feature dodalem obliczenie ile hipotetycznie moglibysmy miec, jezeli +zamienialibysmy waluty w momencie najlepszego kursu w ciagu ostatnich 24h. W pliku +output.json jest teraz trzeci klucz - "best_potential_ammount", pod ktorym jest +ta wlasnie wartosc zapisana. + +WAZNE: + +Uruchamiac skrypt w python, nie python3 (u mnie coś się psuje wtedy). \ No newline at end of file diff --git a/L5/input.json b/L5/input.json index 7aea958f..6889f997 100644 --- a/L5/input.json +++ b/L5/input.json @@ -1 +1 @@ -{"base_currency": "BTC", "BTC": "1.0", "LTC": "1.0"} +{"base_currency": "BTC", "ETH": "1.0", "BTC": "1.0", "LTC": "1.0", "BlednaWaluta":"123"} diff --git a/L5/l5.py b/L5/l5.py index 8c2af79d..c0ddf4c5 100644 --- a/L5/l5.py +++ b/L5/l5.py @@ -20,8 +20,20 @@ def orderbook_url(market, currency_pair): return 'https://cex.io/api/order_book/' + source_currency + "/" + target_currency return "" -#L5 +def ticker_url(market, currency_pair): + source_currency = currency_pair[0] + target_currency = currency_pair[1] + if market == 'bitstamp.net': + return 'https://www.bitstamp.net/api/v2/ticker/' + source_currency.lower() + target_currency.lower() + '/' + if market == 'bitbay.net': + return 'https://bitbay.net/API/Public/' + source_currency + target_currency + '/ticker.json' + if market == 'bittrex.com': + return 'https://api.bittrex.com/api/v1.1/public/getticker?market=' + source_currency + '-' + target_currency + if market == 'cex.io': + return 'https://cex.io/api/ticker/' + source_currency + '/' + target_currency + return "" +#L5 def last_transaction(market, currency_pair): if currency_pair[0] == currency_pair[1]: print("Same: " + currency_pair[0] + " " + currency_pair[1]) @@ -35,7 +47,7 @@ def last_transaction(market, currency_pair): repairedJson = str(jsonText).replace("\'", "\"") if "message" in repairedJson: return -1.0 #Jezeli w wiadomosci jest fragment "message" to znaczy ze cos poszlo nie tak, nigdy go nie ma - print(repairedJson) #jak jest wszystko dobrze + #print(repairedJson) #jak jest wszystko dobrze # print(repairedJson) dict = json.loads(repairedJson) #print(float(dict['last'])) @@ -80,11 +92,13 @@ def old_summarize_wallet(market, filename): #Zwraca pare (Waluta, Wartos #Task 2 -def sort_tuples_list_by_first_elem(tup_l): - tup_l.sort(key = lambda x: x[0]) +def sort_tuples_list_by_first_elem(tup_l): #Porzadkuje oferty kupna danej waluty od najwiekszej + if tup_l == None: + return None + tup_l.sort(key = lambda x: x[0],reverse = True) return tup_l - #Zwraca liste par (kurs, ilosc) posortowane wedlug kursu + #Zwraca liste par (kurs, ilosc) posortowane wedlug kursu malejaco def get_buy_offers_sorted(market, currency_pair): url = orderbook_url(market,currency_pair) req = requests.get(url) @@ -95,14 +109,17 @@ def get_buy_offers_sorted(market, currency_pair): repairedJson = str(jsonText).replace("\'", "\"") if "message" in repairedJson: return None #Jezeli w wiadomosci jest fragment "message" to znaczy ze cos poszlo nie tak, nigdy go nie ma - print(repairedJson) #jak jest wszystko dobrze + #print(repairedJson) #jak jest wszystko dobrze dict = json.loads(repairedJson) - l1 = dict['asks'] + l1 = None + if 'bids' in dict.keys(): + l1 = dict['bids'] return sort_tuples_list_by_first_elem(l1) #Funkcja odczytuje dane z pliku JSON o podanej ścieżce w argumencie wywołania funkcji def summarize_wallet(filename): #Zwraca pare (Waluta, Wartosc), ktora mowi jaka jest waluta w ktorej podajew - sum = 0.0 #I ile posiadamy w tej walucie pieniedzy + real_sum = 0.0 #I ile posiadamy w tej walucie pieniedzy + best_sum = 0.0 #Ile bysmy posiadali pieniedzy w danej walucie sprzedajac po ostatnio najlepszych kursach jsonText = get_json_from_file(filename) repairedJson = str(jsonText).replace("\'", "\"") dict = json.loads(repairedJson) @@ -116,27 +133,37 @@ def summarize_wallet(filename): #Zwraca pare (Waluta, Wartosc), ktora mo market = markets[0] found = True i = 0 #Licznik, ktory market teraz sprawdzamy - wazny, jezeli jakiejs waluty w jednym nie ma zawartej - #Dla kazdej waluty w jakiej mamy srodki (key = waluta) - for key in dict.keys(): - curr_left = dict[key] - pair = (key, base_curr) - offers_list = get_buy_offers_sorted(markets[i],pair) - if offers_list == None # ======== - i=i+1 - while i 0: # ======== - if offers_list[0][1] > curr_left: - sum = sum + curr_left * offers_list[0][0] - curr_left = 0 # W tych liniach zaimplementowane jest zamienianie walut - else: # z kolejnych najlepszych ofert - sum = sum + offers_list[0][1] * offers_list[0][0] # uwzgledniajac wolumen w ofercie - curr_left = curr_left - offers_list[0][1] - offers_list.pop[0] # ======== - return (base_curr, sum) + for key in dict.keys(): #Dla kazdej waluty w jakiej mamy srodki (key = waluta) + i=0 + curr_left = float(dict[key]) + if key == base_curr: #Jezeli to ta sama waluta to po prostu dodaje ja + real_sum = real_sum + curr_left + best_sum = best_sum + curr_left + else: + pair = (key, base_curr) + offers_list = get_buy_offers_sorted(markets[i],pair) + if offers_list == None: # ======== + i=i+1 + while i 0: + best_sum = best_sum + curr_left * last_day_best_buy_offer(markets[i],pair) #Dodatkowy feature do zadania 2 + while curr_left > 0: # ======== + if offers_list[0][1] > curr_left: + real_sum = real_sum + curr_left * offers_list[0][0] + curr_left = 0 # W tych liniach zaimplementowane jest zamienianie walut + else: # z kolejnych najlepszych ofert + real_sum = real_sum + offers_list[0][1] * offers_list[0][0] # uwzgledniajac wolumen w ofercie + curr_left = curr_left - offers_list[0][1] + offers_list.pop[0] # ======== + + return (base_curr, real_sum, best_sum) #Dodatkowy feature - sprawdzanie ile mielibysmy w portfelu, jezeli wszystko kupowalibysmy po najlepszych dla nas ofertach @@ -154,23 +181,28 @@ def last_day_best_buy_offer(market, currency_pair): repairedJson = str(jsonText).replace("\'", "\"") if "message" in repairedJson: return -1.0 #Jezeli w wiadomosci jest fragment "message" to znaczy ze cos poszlo nie tak, nigdy go nie ma - print(repairedJson) #jak jest wszystko dobrze + #print(repairedJson) #jak jest wszystko dobrze # print(repairedJson) dict = json.loads(repairedJson) + #print(str(dict)) #print(float(dict['last'])) - if 'last' in dict.keys(): - return float(dict['last']) + if 'max' in dict.keys(): + return float(dict['max']) + if 'High' in dict.keys(): + return float(dict['High']) + if 'high' in dict.keys(): + return float(dict['high']) return -1.0 #Jezeli wystapil inny blad (np. dostaniemy poprawna odpowiedz od API, ze nie ma takiej def main(): - pair = summarize_wallet("input.json") - dict = {"base_currency":pair[0],"ammount":pair[1]} - print(str(dict)) + tup = summarize_wallet("input.json") + dict = {"base_currency":tup[0],"ammount":tup[1],"best_potential_ammount":tup[2]} + #print(str(dict)) with open("output.json",'w') as f: json.dump(dict,f) - +#print("Poczatek") main() #sample = {"BTC" : "0.123", "LTC" : "1.345"} diff --git a/L5/output.json b/L5/output.json index c0ceb75b..ae375585 100644 --- a/L5/output.json +++ b/L5/output.json @@ -1 +1 @@ -{"base_currency": "BTC", "ammount": 1.00478081} \ No newline at end of file +{"base_currency": "BTC", "ammount": 1.02735765, "best_potential_ammount": 1.02818402} \ No newline at end of file From 2bbd01e9f981a5df530a59bf06e288161fe13b16 Mon Sep 17 00:00:00 2001 From: MichalEgier Date: Thu, 28 May 2020 23:15:15 +0200 Subject: [PATCH 17/17] L5 --- L5/README | 1 - 1 file changed, 1 deletion(-) diff --git a/L5/README b/L5/README index bd49def9..3a20e437 100644 --- a/L5/README +++ b/L5/README @@ -16,5 +16,4 @@ output.json jest teraz trzeci klucz - "best_potential_ammount", pod ktorym jest ta wlasnie wartosc zapisana. WAZNE: - Uruchamiac skrypt w python, nie python3 (u mnie coś się psuje wtedy). \ No newline at end of file