| | |
| | | |
| | | # mode: 0-普通交易 1-快速交易 |
| | | def __init__(self, buy_single_index=None, buy_exec_index=-1, buy_compute_index=None, num=0, count=0, |
| | | max_num_set=None, buy_volume_rate=None, sell_info=None, threshold_money=None, mode=0, |
| | | max_num_set=None, buy_volume_rate=None, sell_info=None, threshold_money=None, mode=0, mode_desc=None, |
| | | at_limit_up=False): |
| | | self.buy_single_index = buy_single_index |
| | | self.buy_exec_index = buy_exec_index |
| | |
| | | self.buy_volume_rate = buy_volume_rate |
| | | self.sell_info = sell_info |
| | | self.mode = mode |
| | | self.mode_desc = mode_desc |
| | | # 是否是板上买 |
| | | self.at_limit_up = at_limit_up |
| | | |
| | |
| | | cls.__buy(code, 0, last_data, last_data_index, is_first_code) |
| | | |
| | | @classmethod |
| | | def get_active_buy_blocks(cls, code): |
| | | """ |
| | | 获取激进买入的板块 |
| | | @param code: |
| | | @return: |
| | | """ |
| | | can_buy_result = CodePlateKeyBuyManager.can_buy(code) |
| | | if can_buy_result: |
| | | return can_buy_result[5] |
| | | return None |
| | | |
| | | @classmethod |
| | | def __buy(cls, code, capture_timestamp, last_data, last_data_index, is_first_code): |
| | | # 添加买入锁 |
| | | if code not in cls.__buy_lock_dict: |
| | |
| | | |
| | | info = cls.__trade_log_placr_order_info_dict[code] |
| | | info.mode = order_begin_pos.mode |
| | | info.mode_desc = order_begin_pos.mode_desc |
| | | info.set_buy_index(order_begin_pos.buy_single_index, order_begin_pos.buy_exec_index) |
| | | info.set_sell_info(order_begin_pos.sell_info) |
| | | if jx_blocks: |
| | |
| | | fast_msg = None |
| | | if has_single: |
| | | order_begin_pos.mode = mode |
| | | order_begin_pos.mode_desc = f"委托触发: {single_msg}" |
| | | order_begin_pos.sell_info = sell_info |
| | | fast_msg = sell_info |
| | | # 用了信号就必须清除掉原有信号 |
| | |
| | | max_num_set=max_num_set_new, |
| | | buy_volume_rate=cls.volume_rate_info[code][0], |
| | | mode=order_begin_pos.mode, |
| | | mode_desc=order_begin_pos.mode_desc, |
| | | sell_info=order_begin_pos.sell_info, |
| | | threshold_money=threshold_money)) |
| | | cls.__LimitUpTimeManager.save_limit_up_time(code, total_datas[new_buy_exec_index]["val"]["time"]) |
| | |
| | | cls.__save_order_begin_data(code, OrderBeginPosInfo(buy_single_index=buy_single_index, buy_exec_index=-1, |
| | | buy_compute_index=compute_end_index, num=buy_nums, |
| | | count=buy_count, |
| | | mode_desc=order_begin_pos.mode_desc, |
| | | max_num_set=max_num_set_new, mode=order_begin_pos.mode, |
| | | sell_info=order_begin_pos.sell_info, |
| | | threshold_money=threshold_money)) |
| | |
| | | # 获取最近的总卖信息 |
| | | # (time_str, round(money), volume, sell_1_info) |
| | | refer_sell_data = cls.__L2MarketSellManager.get_refer_sell_data(code, start_time_str) |
| | | active_buy_blocks = cls.get_active_buy_blocks(code) |
| | | if code.find("60") == 0: |
| | | if refer_sell_data is None: |
| | | # 设置默认卖信息 |
| | |
| | | # 金额要大于50万 |
| | | if _val["num"] * float(_val["price"]) < 5000: |
| | | continue |
| | | return True, i, [refer_sell_data[0], 0], '上证买入', OrderBeginPosInfo.MODE_FAST |
| | | |
| | | return True, i, [refer_sell_data[0], 0], '上证买入', OrderBeginPosInfo.MODE_ACTIVE if active_buy_blocks else OrderBeginPosInfo.MODE_FAST |
| | | return False, -1, "未获取到激进买的起始信号", '', OrderBeginPosInfo.MODE_NORMAL |
| | | else: |
| | | # 深证 |
| | |
| | | valid_single=False) |
| | | if buy_single_index is not None: |
| | | return True, buy_single_index, [refer_sell_data[0], |
| | | threshold_money], "上板无涨停卖", OrderBeginPosInfo.MODE_NORMAL |
| | | threshold_money], "上板无涨停卖", OrderBeginPosInfo.MODE_ACTIVE if active_buy_blocks else OrderBeginPosInfo.MODE_NORMAL |
| | | |
| | | else: |
| | | # 按照成交买入信号计算 |
| | | buy_single_index = cls.__get_active_single_start_index(code, start_index, end_index, continue_count, |
| | | valid_single=True) |
| | | if buy_single_index is not None: |
| | | return True, buy_single_index, [refer_sell_data[0], 0], "上板有成交买入信号", OrderBeginPosInfo.MODE_FAST |
| | | return True, buy_single_index, [refer_sell_data[0], 0], "上板有成交买入信号", OrderBeginPosInfo.MODE_ACTIVE if active_buy_blocks else OrderBeginPosInfo.MODE_FAST |
| | | else: |
| | | # 板上放量:只需要一笔涨停买可作为信号 |
| | | buy_single_index = cls.__get_active_single_start_index(code, start_index, end_index, continue_count, |
| | | valid_single=False) |
| | | if buy_single_index is not None: |
| | | return True, buy_single_index, [refer_sell_data[0], 0], "板上放量", OrderBeginPosInfo.MODE_NORMAL |
| | | return True, buy_single_index, [refer_sell_data[0], 0], "板上放量", OrderBeginPosInfo.MODE_ACTIVE if active_buy_blocks else OrderBeginPosInfo.MODE_NORMAL |
| | | |
| | | return False, -1, "未获取到激进买的起始信号", '', OrderBeginPosInfo.MODE_NORMAL |
| | | |
| | |
| | | # 不下单的信息 |
| | | not_buy_msg = "" |
| | | max_buy_num_set = set(max_num_set) |
| | | active_buy_blocks = cls.get_active_buy_blocks(code) |
| | | for i in range(compute_start_index, compute_end_index + 1): |
| | | data = total_datas[i] |
| | | _val = total_datas[i]["val"] |
| | |
| | | continue |
| | | |
| | | safe_count = 1 |
| | | if total_sell_money <= 0: |
| | | # 板上下单需要安全笔数3笔 |
| | | safe_count = 3 |
| | | elif code.find("00") == 0: |
| | | # 深证非板上放量 |
| | | safe_count = 2 |
| | | if code.find("60") == 0: |
| | | # 上证安全笔数为3 |
| | | safe_count = 3 |
| | | if active_buy_blocks: |
| | | # 有激进板块 |
| | | safe_count = 1 |
| | | else: |
| | | # 无激进下单板块 |
| | | if total_sell_money <= 0: |
| | | # 所有的板上放量都需要3笔 |
| | | # 板上下单需要安全笔数3笔 |
| | | safe_count = 3 |
| | | else: |
| | | if code.find("00") == 0: |
| | | # 深证上板 |
| | | safe_count = 2 |
| | | elif code.find("60") == 0: |
| | | # 上证安全笔数为3 |
| | | safe_count = 3 |
| | | if buy_count < safe_count: |
| | | not_buy_msg = f"【{i}】安全笔数不足,{buy_count}/{safe_count}" |
| | | continue |
| | |
| | | @param active_data: 主动卖成交逐笔 |
| | | @return: |
| | | """ |
| | | # 暂时不需要生效 |
| | | l2_log.info(code, logger_l2_trade_buy, f"被动卖变主动卖:{passive_data} => {active_data}") |
| | | deal_time = l2_huaxin_util.convert_time(passive_data[3], True) |
| | | # 生效时间在1s以内 |
| | | cls.__latest_sell_active_deal_data_dict[code] = ( |
| | | active_data, tool.trade_time_add_millionsecond(deal_time, 1000)) |
| | | if cls.__callback: |
| | | cls.__callback.OnTradeSingle(code, 0, cls.TYPE_ACTIVE, cls.__latest_sell_active_deal_data_dict[code]) |
| | | # deal_time = l2_huaxin_util.convert_time(passive_data[3], True) |
| | | # # 生效时间在1s以内 |
| | | # cls.__latest_sell_active_deal_data_dict[code] = ( |
| | | # active_data, tool.trade_time_add_millionsecond(deal_time, 1000)) |
| | | # if cls.__callback: |
| | | # cls.__callback.OnTradeSingle(code, 0, cls.TYPE_ACTIVE, cls.__latest_sell_active_deal_data_dict[code]) |
| | | |
| | | @classmethod |
| | | def get_valid_trade_single(cls, code, latest_time_with_ms): |
| | |
| | | |
| | | records_new_data.append((time_, "", "-------------------------", [])) |
| | | mode = data.get('mode') |
| | | mode_desc = data.get('mode_desc') |
| | | if mode == OrderBeginPosInfo.MODE_ACTIVE: |
| | | records_new_data.append((time_, "激进下单", |
| | | f"【{format_l2_data(total_datas[data['buy_single_index']])}】-【{format_l2_data(total_datas[data['buy_exec_index']])}】", |
| | | mode_desc, |
| | | extra_datas)) |
| | | elif mode == OrderBeginPosInfo.MODE_FAST: |
| | | records_new_data.append((time_, "闪电下单", |
| | | f"【{format_l2_data(total_datas[data['buy_single_index']])}】-【{format_l2_data(total_datas[data['buy_exec_index']])}】", |
| | | mode_desc, |
| | | extra_datas)) |
| | | else: |
| | | records_new_data.append((time_, "常规下单", |
| | | f"【{format_l2_data(total_datas[data['buy_single_index']])}】-【{format_l2_data(total_datas[data['buy_exec_index']])}】", |
| | | mode_desc, |
| | | extra_datas)) |
| | | elif type == trade_record_log_util.TYPE_REAL_PLACE_ORDER_POSITION: |
| | | _datas = [] |
| | |
| | | def get_limit_up(): |
| | | while True: |
| | | try: |
| | | if (tool.is_trade_time() and int(tool.get_now_time_str().replace(':', '')) > int("092530")): |
| | | if (tool.is_trade_time() and int(tool.get_now_time_str().replace(':', '')) > int("092530")) or True: |
| | | results = kpl_api.getLimitUpInfoNew() |
| | | result = json.loads(results) |
| | | start_time = time.time() |
| | |
| | | l2_log.debug(code, "成交触发买入计算 触发模式:{} 大单数量:{}", _type, big_buy_order_count) |
| | | |
| | | total_datas = l2_data_util.local_today_datas.get(code) |
| | | if _type == L2TradeSingleDataManager.TYPE_PASSIVE and big_buy_order_count > 0: |
| | | # 被动下单且大单数量大于0就可以激进下单 |
| | | |
| | | mode_descs = [] |
| | | if big_buy_order_count > 0: |
| | | mode_descs.append("300w") |
| | | if l2_data_manager_new.L2TradeDataProcessor.get_active_buy_blocks(code): |
| | | mode_descs.append("身位") |
| | | |
| | | if _type == L2TradeSingleDataManager.TYPE_PASSIVE and mode_descs: |
| | | # 被动下单且大单数量大于0/激进下单板块就可以激进下单 |
| | | mode_descs.insert(0, "成交触发") |
| | | last_index = total_datas[-1]["index"] |
| | | volume_rate = code_volumn_manager.get_volume_rate(code) |
| | | order_begin_pos = OrderBeginPosInfo(buy_single_index=last_index, |
| | |
| | | max_num_set=set(), |
| | | buy_volume_rate=volume_rate, |
| | | mode=OrderBeginPosInfo.MODE_ACTIVE, |
| | | mode_desc=",".join(mode_descs), |
| | | sell_info=None, |
| | | threshold_money=0) |
| | | l2_data_manager_new.L2TradeDataProcessor.save_order_begin_data(code, order_begin_pos) |
| | |
| | | max_num_set=set(), |
| | | buy_volume_rate=volume_rate, |
| | | mode=OrderBeginPosInfo.MODE_FAST, |
| | | mode_desc="成交触发", |
| | | sell_info=None, |
| | | threshold_money=0) |
| | | l2_data_manager_new.L2TradeDataProcessor.save_order_begin_data(code, order_begin_pos) |
| | |
| | | |
| | | class PlaceOrderInfo(object): |
| | | def __init__(self, buy_single_index=None, buy_exec_index=None, m_val=None, safe_count=None, big_num_indexes=None, |
| | | kpl_blocks=None, kpl_match_blocks=None, mode=None, sell_info = None): |
| | | kpl_blocks=None, kpl_match_blocks=None, mode=None, mode_desc=None, sell_info = None): |
| | | self.buy_single_index = buy_single_index |
| | | self.buy_exec_index = buy_exec_index |
| | | self.m_val = m_val |
| | |
| | | self.kpl_blocks = kpl_blocks |
| | | self.kpl_match_blocks = kpl_match_blocks |
| | | self.mode = mode |
| | | self.mode_desc = mode_desc |
| | | self.sell_info = sell_info |
| | | |
| | | def set_buy_index(self, buy_single_index, buy_exec_index): |