def add_position(self, ticker): global positions, N try: # 加仓&止损 if len(positions) > 0: last = float(ticker['last']) print('当前仓位: %d, 仓位信息:' % len(positions)) for i in range(len(positions)): cur = positions[i] if cur.side == 'more': profit = (last - cur.price) / cur.price * 100 else: profit = (cur.price - last) / cur.price * 100 print( '第%d个仓位: 委托价: %.3f, 数量: %.2f, 方向: %s, 止损价: %.3f, 买入时间: %s, 当前盈利: %.2f%%' % (i + 1, cur.price, cur.amount, cur.side, cur.stop_loss, cur.time, profit)) prev_position = positions[-1] last_buy_price = prev_position.price side = prev_position.side amount = int(position_unit * 2 * last) last_stop_loss_price = prev_position.stop_loss if side == 'more': if last - last_buy_price >= 0.5 * N: ret = futureAPI.take_order('', self.instrument_id, 1, last, amount, 1, 20) if ret and ret['result']: new_order_id = ret['order_id'] print('多仓加仓,order_id: %s' % new_order_id) time.sleep(WAIT_DEAL) info = futureAPI.get_order_info( new_order_id, self.instrument_id) print('订单信息: %s' % info) status = info['status'] if status == '2': deal_price = float(info['price_avg']) filled_qty = int(info['filled_qty']) coin_amount = float(filled_qty * 10 / deal_price) stop_loss = deal_price - 0.5 * N position = Position(price=deal_price, amount=coin_amount, stop_loss=stop_loss, time=timestamp2string( time.time()), side='more') positions.append(position) else: futureAPI.revoke_order(self.instrument_id, new_order_id) elif last <= last_stop_loss_price or last <= lowest: sell_more_batch(futureAPI, self.instrument_id, last) thread.start_new_thread(ensure_sell_more, ( futureAPI, self.coin_name, self.instrument_id, last, last_buy_price, )) positions = [] if side == 'less': if last < last_buy_price - 0.5 * N: ret = futureAPI.take_order('', self.instrument_id, 2, last, amount, 1, 20) if ret and ret['result']: new_order_id = ret['order_id'] print('空仓加仓,order_id: %s' % new_order_id) time.sleep(WAIT_DEAL) info = futureAPI.get_order_info( new_order_id, self.instrument_id) print('订单信息: %s' % info) status = info['status'] if status == '2': deal_price = float(info['price_avg']) filled_qty = int(info['filled_qty']) coin_amount = float(filled_qty * 10 / deal_price) stop_loss = deal_price + 0.5 * N position = Position(price=deal_price, amount=coin_amount, stop_loss=stop_loss, time=timestamp2string( time.time()), side='less') positions.append(position) else: futureAPI.revoke_order(self.instrument_id, new_order_id) elif last >= last_stop_loss_price or last >= highest: sell_less_batch(futureAPI, self.instrument_id, last) thread.start_new_thread(ensure_sell_less, ( futureAPI, self.coin_name, self.instrument_id, last, last_buy_price, )) positions = [] except Exception as e: print('加仓出错:%s' % repr(e)) traceback.print_exc()
def on_message(ws, message): message = bytes.decode(inflate(message), 'utf-8') # data decompress if 'pong' in message or 'addChannel' in message: return global latest_price, last_avg_price, buy_price, more, less, deque_3s, deque_10s, deque_min, \ deque_5m, ind_3s, ind_10s, ind_1min, ind_5m, write_lines, last_5min_macd, last_5min_macd_ts, moreless jmessage = json.loads(message) ts = time.time() now_time = timestamp2string(ts) if int(ts) - int(last_5min_macd_ts) >= 60: last_5min_macd_ts = int(ts) print(ts, last_5min_macd_ts) if more == 0 and less == 0 and moreless == 0: ret = futureAPI.get_specific_position(time_type) print(ret) if len(ret["holding"]) > 0: buy_available = int(ret["holding"][0]["long_avail_qty"]) sell_available = int(ret["holding"][0]["short_avail_qty"]) if buy_available > 0: thread.start_new_thread(ensure_sell_more, ( futureAPI, coin.name, time_type, latest_price, buy_price, )) if sell_available > 0: thread.start_new_thread(ensure_sell_less, ( futureAPI, coin.name, time_type, latest_price, buy_price, )) else: print("确认未持仓") for each_message in jmessage: for jdata in each_message['data']: latest_price = float(jdata[1]) deal_entity = DealEntity(jdata[0], float(jdata[1]), round(float(jdata[2]), 3), ts, jdata[4]) handle_deque(deque_3s, deal_entity, ts, ind_3s) handle_deque(deque_10s, deal_entity, ts, ind_10s) handle_deque(deque_min, deal_entity, ts, ind_1min) handle_deque(deque_5m, deal_entity, ts, ind_5m) # price_5m_ago = cal_price_ago(deque_5m) # print("price_5m_ago: %.4f" % price_5m_ago) avg_3s_price = ind_3s.cal_avg_price() avg_10s_price = ind_10s.cal_avg_price() avg_min_price = ind_1min.cal_avg_price() avg_5m_price = ind_5m.cal_avg_price() price_10s_change = cal_rate(avg_3s_price, avg_10s_price) price_1m_change = cal_rate(avg_3s_price, avg_min_price) price_5m_change = cal_rate(avg_3s_price, avg_5m_price) # price_5m_ago_change = cal_rate(latest_price, price_5m_ago) if more == 1: # 盈利中,放宽卖出条件,盈利最大化 if latest_price > buy_price: if price_1m_change <= -0.1 and price_5m_change <= 0: if sell_more_batch(futureAPI, time_type, latest_price): more = 0 thread.start_new_thread(ensure_sell_more, ( futureAPI, coin.name, time_type, latest_price, buy_price, )) else: if price_1m_change <= -0.2 or price_5m_change <= 0: if sell_more_batch(futureAPI, time_type, latest_price): more = 0 thread.start_new_thread(ensure_sell_more, ( futureAPI, coin.name, time_type, latest_price, buy_price, )) elif less == 1: # 盈利中,放宽卖出条件,盈利最大化 if latest_price < buy_price: if price_1m_change >= 0.1 and price_5m_change >= 0: if sell_less_batch(futureAPI, time_type, latest_price): less = 0 thread.start_new_thread(ensure_sell_less, ( futureAPI, coin.name, time_type, latest_price, buy_price, )) else: if price_1m_change >= 0.2 or price_5m_change >= 0: if sell_less_batch(futureAPI, time_type, latest_price): less = 0 thread.start_new_thread(ensure_sell_less, ( futureAPI, coin.name, time_type, latest_price, buy_price, )) if price_1m_change >= 0.2 and price_5m_change >= 0.3: btc_change = coin_recent_change_rate("btc") eth_change = coin_recent_change_rate("eth") print('btc_change: %.2f%%, eth change: %.2f%%' % (btc_change, eth_change)) write_lines.append( 'btc_change: %.2f%%, eth change: %.2f%% \r\n' % (btc_change, eth_change)) if btc_change >= 0.5 and eth_change >= 0.5: if buyin_more(futureAPI, coin.name, time_type, latest_price + 0.01): more = 1 thread.start_new_thread(ensure_buyin_more, ( futureAPI, coin.name, time_type, latest_price, )) buy_price = latest_price info = u'发出做多信号!!!买入价格:' + str( buy_price) + u', ' + now_time with codecs.open(file_transaction, 'a+', 'utf-8') as f: f.writelines(info + '\n') elif price_1m_change <= -0.2 and price_5m_change <= -0.3: btc_change = coin_recent_change_rate("btc") eth_change = coin_recent_change_rate("eth") print('btc_change: %.2f%%, eth change: %.2f%%' % (btc_change, eth_change)) write_lines.append( 'btc_change: %.2f%%, eth change: %.2f%% \r\n' % (btc_change, eth_change)) if btc_change <= -0.6 and eth_change <= -0.6: if buyin_less(futureAPI, coin.name, time_type, latest_price - 0.01): less = 1 thread.start_new_thread(ensure_buyin_less, ( futureAPI, coin.name, time_type, latest_price, )) buy_price = latest_price info = u'发出做空信号!!!买入价格:' + str( buy_price) + u', ' + now_time with codecs.open(file_transaction, 'a+', 'utf-8') as f: f.writelines(info + '\n') last_avg_price = latest_price price_info = deal_entity.type + u' now_price: %.4f, 3s_price: %.4f, 10s_price: %.4f, 1m_price: %.4f, ' \ u'5min_price: %.4f' \ % (latest_price, avg_3s_price, avg_10s_price, avg_min_price, avg_5m_price) vol_info = u'cur_vol: %.3f, 3s vol: %.3f, 10s vol: %.3f, 1min vol: %.3f, ask_vol: %.3f, bid_vol: %.3f, 3s_ask_vol: %.3f, 3s_bid_vol: %.3f' \ % (deal_entity.amount, ind_3s.vol, ind_10s.vol, ind_1min.vol, ind_1min.ask_vol, ind_1min.bid_vol, ind_3s.ask_vol, ind_3s.bid_vol) rate_info = u'10s_rate: %.2f%%, 1min_rate: %.2f%%, 5min_rate: %.2f%%' \ % (price_10s_change, price_1m_change, price_5m_change) write_info = price_info + u', ' + vol_info + u', ' + rate_info + u', ' + now_time + '\r\n' write_lines.append(write_info) if len(write_lines) >= 100: with codecs.open(file_deal, 'a+', 'UTF-8') as f: f.writelines(write_lines) write_lines = [] print(price_info + '\r\n' + vol_info + '\r\n' + rate_info + u', ' + now_time)
def on_message(ws, message): message = bytes.decode(inflate(message), 'utf-8') # data decompress if 'pong' in message or 'addChannel' in message: return global latest_price, buy_price, more, less, write_lines, last_5min_macd_ts, \ btc_30s_change, eth_30s_change, ltc_30s_change, etc_30s_change, eos_30s_change, xrp_30s_change, \ btc_5min_change, eth_5min_change, ltc_5min_change, etc_5min_change, eos_5min_change, xrp_5min_change jmessage = json.loads(message) ts = time.time() now_time = timestamp2string(ts) try: if int(ts) - int(last_5min_macd_ts) >= 60: last_5min_macd_ts = int(ts) print(ts, last_5min_macd_ts) if more == 0 and less == 0: ret = futureAPI.get_specific_position(time_type) print(ret) if len(ret["holding"]) > 0: buy_available = int(ret["holding"][0]["long_avail_qty"]) sell_available = int(ret["holding"][0]["short_avail_qty"]) if buy_available > 0: thread.start_new_thread(ensure_sell_more, ( futureAPI, coin_eos.name, time_type, latest_price, buy_price, )) if sell_available > 0: thread.start_new_thread(ensure_sell_less, ( futureAPI, coin_eos.name, time_type, latest_price, buy_price, )) else: print("确认未持仓") each_message = jmessage[0] channel = each_message['channel'] jdata = each_message['data'][0] latest_price = float(jdata[1]) deal_entity = DealEntity(jdata[0], latest_price, round(float(jdata[2]), 3), ts, jdata[4]) if channel == 'ok_sub_spot_btc_usdt_deals': coin_btc.process_entity(deal_entity, ts) btc_30s_change = cal_rate(coin_btc.get_avg_price_3s(), coin_btc.get_avg_price_60s()) btc_5min_change = cal_rate(coin_btc.get_avg_price_3s(), coin_btc.get_avg_price_5min()) coin_change_info = 'btc 30s change: %.3f%%, 5min change: %.3f%%\r\n' % ( btc_30s_change, btc_5min_change) write_lines.append(coin_change_info) print(coin_change_info) elif channel == 'ok_sub_spot_etc_usdt_deals': coin_etc.process_entity(deal_entity, ts) etc_30s_change = cal_rate(coin_etc.get_avg_price_3s(), coin_etc.get_avg_price_60s()) etc_5min_change = cal_rate(coin_etc.get_avg_price_3s(), coin_etc.get_avg_price_5min()) coin_change_info = 'etc 30s change: %.3f%%, 5min change: %.3f%%\r\n' % ( etc_30s_change, etc_5min_change) write_lines.append(coin_change_info) print(coin_change_info) elif channel == 'ok_sub_spot_ltc_usdt_deals': coin_ltc.process_entity(deal_entity, ts) ltc_30s_change = cal_rate(coin_ltc.get_avg_price_3s(), coin_ltc.get_avg_price_60s()) ltc_5min_change = cal_rate(coin_ltc.get_avg_price_3s(), coin_ltc.get_avg_price_5min()) coin_change_info = 'ltc 30s change: %.3f%%, 5min change: %.3f%%\r\n' % ( ltc_30s_change, ltc_5min_change) write_lines.append(coin_change_info) print(coin_change_info) elif channel == 'ok_sub_spot_eos_usdt_deals': coin_eos.process_entity(deal_entity, ts) eos_30s_change = cal_rate(coin_eos.get_avg_price_3s(), coin_eos.get_avg_price_60s()) eos_5min_change = cal_rate(coin_eos.get_avg_price_3s(), coin_eos.get_avg_price_5min()) coin_change_info = 'eos 30s change: %.3f%%, 5min change: %.3f%%\r\n' % ( eos_30s_change, eos_5min_change) write_lines.append(coin_change_info) print(coin_change_info) elif channel == 'ok_sub_spot_eth_usdt_deals': coin_eth.process_entity(deal_entity, ts) eth_30s_change = cal_rate(coin_eth.get_avg_price_3s(), coin_eth.get_avg_price_60s()) eth_5min_change = cal_rate(coin_eth.get_avg_price_3s(), coin_eth.get_avg_price_5min()) coin_change_info = 'eth 30s change: %.3f%%, 5min change: %.3f%%\r\n' % ( eth_30s_change, eth_5min_change) write_lines.append(coin_change_info) print(coin_change_info) elif channel == 'ok_sub_spot_xrp_usdt_deals': coin_xrp.process_entity(deal_entity, ts) xrp_30s_change = cal_rate(coin_xrp.get_avg_price_3s(), coin_xrp.get_avg_price_60s()) xrp_5min_change = cal_rate(coin_xrp.get_avg_price_3s(), coin_xrp.get_avg_price_5min()) coin_change_info = 'xrp 30s change: %.3f%%, 5min change: %.3f%%\r\n' % ( xrp_30s_change, xrp_5min_change) write_lines.append(coin_change_info) print(coin_change_info) prices_30s = [ btc_30s_change, eth_30s_change, ltc_30s_change, etc_30s_change, eos_30s_change, xrp_30s_change ] prices_5min = [ btc_5min_change, eth_5min_change, ltc_5min_change, etc_5min_change, eos_5min_change, xrp_5min_change ] weights = [0.2, 0.15, 0.15, 0.15, 0.2, 0.15] weighted_30s_change = cal_weighted(prices_30s, weights) weighted_5min_change = cal_weighted(prices_5min, weights) if more == 1: if weighted_30s_change < -0.2 or weighted_5min_change < 0: if sell_more_batch(futureAPI, time_type, latest_price): more = 0 thread.start_new_thread(ensure_sell_more, ( futureAPI, coin_eos.name, time_type, latest_price, buy_price, )) elif less == 1: if weighted_30s_change > 0.2 or weighted_5min_change > 0: if sell_less_batch(futureAPI, time_type, latest_price): less = 0 thread.start_new_thread(ensure_sell_less, ( futureAPI, coin_eos.name, time_type, latest_price, buy_price, )) elif more == 0 and weighted_30s_change > 0.2 and weighted_5min_change > 0.3: if buyin_more(futureAPI, coin_eos.name, time_type): more = 1 thread.start_new_thread(ensure_buyin_more, ( futureAPI, coin_eos.name, time_type, latest_price, )) buy_price = latest_price info = u'发出做多信号!!!买入价格:' + str(buy_price) + u', ' + now_time with codecs.open(file_transaction, 'a+', 'utf-8') as f: f.writelines(info + '\n') elif less == 0 and weighted_30s_change < -0.2 and weighted_5min_change < -0.3: if buyin_less(futureAPI, coin_eos.name, time_type): less = 1 thread.start_new_thread(ensure_buyin_less, ( futureAPI, coin_eos.name, time_type, latest_price, )) buy_price = latest_price info = u'发出做空信号!!!买入价格:' + str(buy_price) + u', ' + now_time with codecs.open(file_transaction, 'a+', 'utf-8') as f: f.writelines(info + '\n') rate_info = u'weighted 30s_rate: %.3f%%, 5min_rate: %.3f%%' % ( weighted_30s_change, weighted_5min_change) write_info = rate_info + u', ' + now_time + '\r\n' write_lines.append(write_info) if len(write_lines) >= 100: with codecs.open(file_deal, 'a+', 'UTF-8') as f: f.writelines(write_lines) write_lines = [] print(rate_info + u', ' + now_time) except Exception as e: print(repr(e)) traceback.print_exc()