def test_valid(self): valid_price_queue = [] valid_price_dict = {} for market in self.market_weight: if market not in self.orderbook: continue if len(self.orderbook[market]["bids"]) == 0 or \ len(self.orderbook[market]["asks"]) == 0: continue _price = (self.orderbook[market]["bids"][0][0] + self.orderbook[market]["asks"][0][0]) / 2 if self.market_weight[market]: valid_price_queue.append(_price) valid_price_dict[market] = _price valid_price = get_median(valid_price_queue) for market in list(self.orderbook.keys()): if market not in valid_price_dict: del self.orderbook[market] continue change = fabs( (valid_price_dict[market] - valid_price) / valid_price) # if offset more than 20%, this market is invalid if change > 0.2: del self.orderbook[market] # all market is invalid if we got valid market less than 2 if len(self.orderbook) < 2: return False else: return True
def compute_rate_cny(self): btc_ticker = self.data["ticker"].copy() # print(btc_ticker) self.remove_timeout(btc_ticker) rate_cny = {"CNY": 1.0} # rate_cny["BTC"] = price_btc["CNY"] # rate_cny["USD"] = price_btc["CNY"] / price_btc["USD"] rate = self.data["rate"] if len(rate) == 0: return rate_cny["USD"] = self.get_rate_cny_usd(rate) # rate_cny["BTC"] = 0.0 # for asset in price_btc: # rate_cny["BTC"] += price_btc[asset] * rate_cny[asset] # rate_cny["BTC"] /= len(price_btc) rate_source = {} for quote in ["CNY", "USD"]: for source in list(rate): for base in rate[source][quote]: if base in rate_cny: continue if base not in rate_source: rate_source[base] = [] _rate = rate[source][quote][base] * rate_cny[quote] rate_source[base].append(_rate) for asset in rate_source: asset_rate = sum(rate_source[asset]) / float( len(rate_source[asset])) for _rate in list(rate_source[asset]): if fabs((_rate - asset_rate) / asset_rate) > 0.1: asset_rate = None break if asset_rate: rate_cny[asset] = asset_rate rate_cny["TCNY"] = rate_cny["CNY"] rate_cny["TUSD"] = rate_cny["USD"] # rate_cny["CNY1.0"] = rate_cny["CNY"] # rate_cny["USD1.0"] = rate_cny["USD"] # print("rate_cny",rate_cny) # price_btc_queue = {"CNY": [], "USD": []} price_btc_queue = [] price_btc = {} for name in btc_ticker: quote = btc_ticker[name]["quote"] if quote not in rate_cny: continue price_btc_queue.append(btc_ticker[name]["last"] * rate_cny[quote]) if len(price_btc_queue) == 0: return price_btc = get_median(price_btc_queue) # print(price_btc, price_btc_queue) rate_cny["BTC"] = price_btc self.rate_cny = rate_cny
def compute_rate_cny(self): btc_ticker = self.data["ticker"].copy() self.remove_timeout(btc_ticker) # price_btc_queue = {"CNY": [], "USD": []} price_btc_queue = {"USD": []} price_btc = {} for name in btc_ticker: quote = btc_ticker[name]["quote"] price_btc_queue[quote].append(btc_ticker[name]["last"]) for asset in price_btc_queue: if len(price_btc_queue[asset]) == 0: return price_btc[asset] = get_median(price_btc_queue[asset]) rate_cny = {"CNY": 1.0} # rate_cny["BTC"] = price_btc["CNY"] # rate_cny["USD"] = price_btc["CNY"] / price_btc["USD"] rate = self.data["rate"] if len(rate) == 0: return rate_yahoo = rate["yahoo"] rate_cny["USD"] = 1/rate_yahoo["USD"]["CNY"] rate_cny["BTC"] = price_btc["USD"] * rate_cny["USD"] _change = fabs(price_btc["USD"] - rate_yahoo["USD"]["BTC"]) / \ rate_yahoo["USD"]["BTC"] if _change >= 0.1: # BTC price different more than 10% return _change = fabs(rate_cny["USD"] - 1/rate_yahoo["USD"]["CNY"]) / \ rate_cny["USD"] if _change >= 0.1: # rate USD/CNY different more than 10% return rate_source = {} for quote in ["CNY", "USD"]: for source in list(rate): for base in rate[source][quote]: if base in rate_cny: continue if base not in rate_source: rate_source[base] = [] _rate = rate[source][quote][base] * rate_cny[quote] rate_source[base].append(_rate) for asset in rate_source: asset_rate = sum(rate_source[asset])/float(len(rate_source[asset])) for _rate in list(rate_source[asset]): if fabs((_rate - asset_rate)/asset_rate) > 0.1: asset_rate = None break if asset_rate: rate_cny[asset] = asset_rate rate_cny["TCNY"] = rate_cny["CNY"] rate_cny["TUSD"] = rate_cny["USD"] self.rate_cny = rate_cny
def get_match_result(self, order_bids, order_asks, price_list): bid_volume = ask_volume = 0 median_price = get_median(price_list) for order in order_bids: if order[0] < median_price: break bid_volume += order[1] for order in order_asks: if order[0] > median_price: break ask_volume += order[1] return ([bid_volume, ask_volume, median_price])
def get_match_result(self, order_bids, order_asks, price_list): bid_volume = ask_volume = 0 median_price = get_median(price_list) for order in order_bids: if order[0] < median_price: break bid_volume += order[1] for order in order_asks: if order[0] > median_price: break ask_volume += order[1] return ([bid_volume, ask_volume, median_price])
def get_rate_cny_usd(self, rate): rate_list = [] if self.config['only_c2c_rate'] == True: for source in list(rate): if 'CNY' in rate[source]["USD"] and (source == "Binance" or source == "Okex"): rate_list.append(1 / rate[source]["USD"]["CNY"]) if len(rate_list) == 0: for source in list(rate): if 'CNY' in rate[source]["USD"]: rate_list.append(1 / rate[source]["USD"]["CNY"]) else: for source in list(rate): if 'CNY' in rate[source]["USD"]: rate_list.append(1 / rate[source]["USD"]["CNY"]) return get_median(rate_list)
def test_valid(self): valid_price_queue = [] valid_price_dict = {} for market in self.market_weight: if market not in self.orderbook: continue _price = ( self.orderbook[market]["bids"][0][0] + self. orderbook[market]["asks"][0][0])/2 if self.market_weight[market]: valid_price_queue.append(_price) valid_price_dict[market] = _price valid_price = get_median(valid_price_queue) for market in list(self.orderbook.keys()): change = fabs((valid_price_dict[market] - valid_price)/valid_price) # if offset more than 10%, this market is invalid if change > 0.1: del self.orderbook[market] # all market is invalid if we got valid market less than 2 if len(self.orderbook) < 2: return False else: return True
def compute_rate_cny(self): btc_ticker = self.data["ticker"].copy() self.remove_timeout(btc_ticker) price_btc_queue = {"CNY": [], "USD": []} price_btc = {} for name in btc_ticker: quote = btc_ticker[name]["quote"] price_btc_queue[quote].append(btc_ticker[name]["last"]) for asset in price_btc_queue: if len(price_btc_queue[asset]) == 0: return price_btc[asset] = get_median(price_btc_queue[asset]) rate_cny = {"CNY": 1.0} rate_cny["BTC"] = price_btc["CNY"] rate_cny["USD"] = price_btc["CNY"] / price_btc["USD"] rate = self.data["rate"] if len(rate) == 0: return rate_yahoo = rate["yahoo"] _change = fabs(price_btc["USD"] - rate_yahoo["USD"]["BTC"]) / \ rate_yahoo["USD"]["BTC"] if _change >= 0.1: # BTC price different more than 10% return _change = fabs(rate_cny["USD"] - 1/rate_yahoo["USD"]["CNY"]) / \ rate_cny["USD"] if _change >= 0.1: # rate USD/CNY different more than 10% return for quote in ["CNY", "USD"]: for base in rate_yahoo[quote]: if base not in rate_cny: rate_cny[base] = rate_cny[quote] * rate_yahoo[quote][base] rate_cny["TCNY"] = rate_cny["CNY"] rate_cny["TUSD"] = rate_cny["USD"] self.rate_cny = rate_cny
def get_rate_cny_usd(self, rate): rate_list = [] for source in list(rate): if 'CNY' in rate[source]["USD"]: rate_list.append(1 / rate[source]["USD"]["CNY"]) return get_median(rate_list)
def test_get_median(self): assert get_median([1, 2, 3, 4]) == 2.5 assert get_median([1, 2, 3]) == 2 assert get_median([1]) == 1 assert get_median([]) is None