def handle_depth(self, timestamp, depth): bp = depth['buy'][0][0] #price buy ba = depth['buy'][0][1] #amount buy sp = depth['sell'][0][0] #price sell sa = depth['sell'][0][1] #amount sell self.n_depth_handle += 1 gap = gaps(bp, sp) if gap > 0.3: log.dbg("gap=%f low volume, don't operate!"%(gap)) sslot.robot_log("gap=%f low volume, don't operate!"%(gap)) return indicator = cfg.get_indicator() if indicator == 'bbands': self.bbands.ta_signal(timestamp, (bp+sp)/2) signal = self.stoch.sig elif indicator == 'macd': self.macd.ta_signal(timestamp, (bp+sp)/2) signal = self.macd.sig elif indicator == 'stoch': self.stoch.ta_signal(timestamp, (bp+sp)/2) signal = self.stoch.sig else: signal = 'standby' #log.dbg("get signal! %s"%signal) self.trade(timestamp, signal, bp, ba, sp, sa) self.update_profit((bp+sp)/2) if self.testing == False and self.n_depth_handle%12 == 0: sslot.robot_status(1)
def signed_request(self, method, api_url, **payload): """request a signed url""" param = '' payload['access_id'] = cfg.get_cfg('id') payload['tonce'] = int(time.time()*1000) if payload: sort_pay = sorted(payload.items()) for k in sort_pay: param += '&' + str(k[0]) + '=' + str(k[1]) param = param.lstrip('&') sig_str = param + '&' + 'secret_key=' + cfg.get_cfg('secret_key') signature = self.get_signed_md5(sig_str) r_url = cfg.get_cfg('base_url') + api_url if method == 'GET' or method == 'DELETE': if param: r_url = r_url + '?' + param log.dbg(r_url) try: headers = cfg.get_cfg_header() headers['authorization'] = signature #log.dbg(headers) except: log.err("Fail load section from config file") return try: r = requests.request(method, r_url, headers = headers, json=payload,timeout=20) r.raise_for_status() except requests.exceptions.HTTPError as err: log.err(err) log.err(r.text) if r.status_code == 200: return r.json()
def testback(self): self.testing = True self.trade_history.drop(self.trade_history.index, inplace=True) #clear history days = 10 kl_1hour = fwk.get_kline(cfg.get_pair(), dtype="1hour", limit=min(days*24, 2000)) if kl_1hour.size > 0: self.bbands.handle_data(kl_1hour) self.macd.handle_data(kl_1hour) self.stoch.handle_data(kl_1hour) if True: kl_5min = fwk.get_kline(cfg.get_pair(), dtype="5min", limit=min(days*24*60/5, 2000)) if(kl_5min.size <= 0): return p = kl_5min['c'] t = kl_5min['t'] else: p = kl_1hour['c'] t = kl_1hour['t'] for i in range(t.size): dummy_depth = {'buy':[[p[i]*0.999, 1000]],'sell':[[p[i]*1.001, 1000]]} self.handle_depth(t[i], dummy_depth) log.dbg("test done... user_info:%s"%(self.user_info)) log.dbg("test done... future_position:%s"%(self.future_position)) sslot.trade_history(self.trade_history) sslot.robot_status(1) self.testing = False
def stop(self): if self.running == 1: log.dbg("robot stopping...") mkt.unregister_handle('depth', self.handle_depth) self.bbands.stop() self.macd.stop() self.stoch.stop() self.running = 0
def unregister_handle(self, dtype, func): log.dbg("unregister_handle %s %s"%(dtype, func)) handles = self.data_handles[dtype] if func in handles['func']: handles['func'].remove(func) handles['reg'] -= 1 if handles['reg'] == 0: handles['thandle'].cancel()
def unregister_handle(self, dtype, func): log.dbg("unregister_handle %s %s" % (dtype, func)) handles = self.data_handles[dtype] if func in handles['func']: handles['func'].remove(func) handles['reg'] -= 1 if handles['reg'] == 0: handles['thandle'].cancel()
def start(self): if self.running == 0: log.dbg("robot starting...") self.running = 1 self.bbands.start() self.macd.start() self.stoch.start() mkt.register_handle('depth', self.handle_depth) else: log.dbg("robot already running!")
def register_handle(self, dtype, func): log.dbg("register_handle %s %s"%(dtype, func)) handles = self.data_handles[dtype] if func in handles['func']: log.war(" %s already handled!"%(func)) return #as kline have long period, the newly obj callback func can't been called immediately. #so call it when first register. if dtype == 'kline' and handles['data'].size > 0: func(handles['data']) handles['func'].append(func) handles['reg'] += 1 #print("register_handle", handles) if handles['reg'] == 1: handles['thandle'] = threading.Timer(1, handles['tfunc']) #first start timer 1s period handles['thandle'].start()
def register_handle(self, dtype, func): log.dbg("register_handle %s %s" % (dtype, func)) handles = self.data_handles[dtype] if func in handles['func']: log.war(" %s already handled!" % (func)) return #as kline have long period, the newly obj callback func can't been called immediately. #so call it when first register. if dtype == 'kline' and handles['data'].size > 0: func(handles['data']) handles['func'].append(func) handles['reg'] += 1 #print("register_handle", handles) if handles['reg'] == 1: handles['thandle'] = threading.Timer( 1, handles['tfunc']) #first start timer 1s period handles['thandle'].start()
def signed_request(self, method, api_url, **payload): """request a signed url""" param = '' payload['access_id'] = cfg.get_cfg('id') payload['tonce'] = int(time.time() * 1000) if payload: sort_pay = sorted(payload.items()) for k in sort_pay: param += '&' + str(k[0]) + '=' + str(k[1]) param = param.lstrip('&') sig_str = param + '&' + 'secret_key=' + cfg.get_cfg('secret_key') signature = self.get_signed_md5(sig_str) r_url = cfg.get_cfg('base_url') + api_url if method == 'GET' or method == 'DELETE': if param: r_url = r_url + '?' + param log.dbg(r_url) try: headers = cfg.get_cfg_header() headers['authorization'] = signature #log.dbg(headers) except: log.err("Fail load section from config file") return try: r = requests.request(method, r_url, headers=headers, json=payload, timeout=20) r.raise_for_status() except requests.exceptions.HTTPError as err: log.err(err) log.err(r.text) if r.status_code == 200: return r.json()
def update_variables(self, trade_param): if self.trade_history.index.size > 100: self.trade_history = self.trade_history.drop(0) self.trade_history.loc[self.trade_history.index.size] = trade_param ##may need use append instead if self.testing == False: sslot.trade_history(self.trade_history) hist.info("%s"%(trade_param)) if self.simulate: param = self.trade_history.iloc[-1] a = param['amount'] * (1-0.001) ##take off trans fee info_contracts = self.user_info[cfg.get_coin1()]['contracts'][0] position = self.future_position if param['type'] == 'open_buy': if cfg.is_future(): oldfund = position['buy_amount'] * position['buy_price_avg'] newfund = a * param['price'] position['buy_amount'] += a position['buy_available'] += a position['buy_price_avg'] = (oldfund + newfund) / position['buy_amount'] position['buy_bond'] += a/position['lever_rate'] info_contracts['available'] -= param['amount']/position['lever_rate'] info_contracts['bond'] += a/position['lever_rate'] if param['type'] == 'margin_buy': if cfg.is_future(): position['buy_amount'] -= param['amount'] position['buy_available'] -= param['amount'] position['buy_bond'] -= param['amount']/position['lever_rate'] info_contracts['available'] += a/position['lever_rate'] info_contracts['bond'] -= param['amount']/position['lever_rate'] profit = (param['price'] - position['buy_price_avg'])/position['buy_price_avg'] * a info_contracts['profit'] += profit info_contracts['available'] += profit self.update_profit(param['price']) if param['type'] == 'open_sell': if cfg.is_future(): oldfund = position['sell_amount'] * position['sell_price_avg'] newfund = param['amount'] * param['price'] position['sell_amount'] += a position['sell_available'] += a position['sell_price_avg'] = (oldfund + newfund) / position['sell_amount'] position['sell_bond'] += a/position['lever_rate'] info_contracts['available'] -= param['amount']/position['lever_rate'] info_contracts['bond'] += a/position['lever_rate'] if param['type'] == 'margin_sell': if cfg.is_future(): position['sell_amount'] -= param['amount'] position['sell_available'] -= param['amount'] position['sell_bond'] -= param['amount']/position['lever_rate'] info_contracts['available'] += a/position['lever_rate'] info_contracts['bond'] -= param['amount']/position['lever_rate'] profit = (position['sell_price_avg'] - param['price'])/position['sell_price_avg'] * a info_contracts['profit'] += profit info_contracts['available'] += profit self.update_profit(param['price']) log.dbg("user_info:%s"%(self.user_info)) log.dbg("future_position:%s"%(self.future_position)) else: if cfg.get_cfg_plat() == '': #reserve pass else: if cfg.is_future(): self.user_info = fwk.get_user_info() self.future_position = fwk.get_future_position(cfg.get_pair()) log.dbg("user_info:%s"%(self.user_info)) log.dbg("future_position:%s"%(self.future_position)) else: pass