| | |
| | | from trade.huaxin import huaxin_trade_api, huaxin_trade_data_update, \ |
| | | huaxin_trade_record_manager, huaxin_trade_order_processor, huaxin_sell_util |
| | | from trade.huaxin.huaxin_trade_record_manager import PositionManager, DealRecordManager, DelegateRecordManager |
| | | from trade.buy_radical.radical_buy_data_manager import RadicalBuyBlockManager, BeforeSubDealBigOrderManager |
| | | from trade.buy_radical.radical_buy_data_manager import RadicalBuyBlockManager, BeforeSubDealBigOrderManager, \ |
| | | TotalDealBigOrderThresholdMoneyManager |
| | | from trade.sell import sell_manager |
| | | from trade.sell.sell_rule_manager import TradeRuleManager, SellRule |
| | | from trade.trade_data_manager import RadicalBuyDealCodesManager |
| | |
| | | if volumes_data: |
| | | is_new_top = code_nature_analyse.is_new_top(code, |
| | | gpcode_manager.get_limit_up_price_by_preprice(code, |
| | | volumes_data[0]["close"]), |
| | | volumes_data[ |
| | | 0][ |
| | | "close"]), |
| | | volumes_data) |
| | | |
| | | data = { |
| | |
| | | client_id, |
| | | request_id) |
| | | |
| | | |
| | | |
| | | elif ctype == "set_total_deal_big_order_threshold_money": |
| | | code = data.get("code") |
| | | money = data.get("money") |
| | | if not code or not money: |
| | | self.send_response({"code": 1, "data": {}, "msg": "code/money为空"}, |
| | | client_id, |
| | | request_id) |
| | | return |
| | | TotalDealBigOrderThresholdMoneyManager().set_money(code, int(money)) |
| | | self.send_response({"code": 0, "data": {}}, |
| | | client_id, |
| | | request_id) |
| | | except Exception as e: |
| | | logging.exception(e) |
| | | logger_debug.exception(e) |
| | |
| | | )) |
| | | |
| | | |
| | | def extract_big_order_of_code(dir_path, code): |
| | | def extract_big_order_of_code(dir_path, code=None): |
| | | """ |
| | | 提取代码的大单 |
| | | @param dir_path: 数据目录 |
| | | @param code: 为空表示导出全部 |
| | | @return: |
| | | """ |
| | | |
| | | def first_last(group): |
| | | """ |
| | | 获取第一条数据与最后一条 |
| | | @param group: |
| | | @return: |
| | | """ |
| | | return pd.Series({ |
| | | 'SecurityID': group['SecurityID'].iloc[0], |
| | | 'BuyNo': group['BuyNo'].iloc[0], |
| | | 'TotalVolume': group['TotalVolume'].sum(), |
| | | 'TotalAmount': group['TotalAmount'].sum(), |
| | | 'EndTime': group['EndTime'].iloc[-1], |
| | | 'EndPrice': group['EndPrice'].iloc[-1], |
| | | 'StartTime': group['StartTime'].iloc[0], |
| | | 'StartPrice': group['StartPrice'].iloc[0] |
| | | }) |
| | | |
| | | combined_path = os.path.join(dir_path, 'combined.csv') |
| | | if not os.path.exists(combined_path): |
| | | print("拼接数据不存在") |
| | | return |
| | | df = pd.read_csv(combined_path) |
| | | df_copy = df.copy() |
| | | if code: |
| | | df_copy = df_copy[df_copy["SecurityID"] == int(code)] |
| | | if df_copy.empty: |
| | | print("目标代码对应成交数据为空") |
| | | return |
| | | df_copy["SecurityID"] = df_copy["SecurityID"].apply(BigOrderDealParser.code_format) |
| | | # 按SecurityID和BuyNo分组 |
| | | grouped = df_copy.groupby(['SecurityID', 'BuyNo']) |
| | | grouped_result = grouped.apply(first_last) |
| | | grouped_result = grouped_result[grouped_result["TotalAmount"] > 500000] |
| | | # print(grouped_result) |
| | | # 遍历内容 |
| | | if code: |
| | | grouped_result.to_csv(os.path.join(dir_path, f"big_buy_{code}.csv"), index=False) |
| | | else: |
| | | grouped_result.to_csv(os.path.join(dir_path, f"big_buy.csv"), index=False) |
| | | print("保存成功") |
| | | |
| | | |
| | | def extract_big_order_codes(dir_path): |
| | | """ |
| | | 导出大单代码 |
| | | @param dir_path: 数据目录 |
| | | @param code: |
| | | @return: |
| | | """ |
| | |
| | | @return: |
| | | """ |
| | | return pd.Series({ |
| | | 'TotalAmount': group['TotalAmount'].sum(), |
| | | 'TotalVolume': group['TotalVolume'].sum(), |
| | | 'StartTime': group['StartTime'].iloc[0], |
| | | 'StartPrice': group['StartPrice'].iloc[0], |
| | | 'EndTime': group['EndTime'].iloc[-1], |
| | | 'EndPrice': group['EndPrice'].iloc[-1] |
| | | }) |
| | | |
| | | combined_path = os.path.join(dir_path, 'combined.csv') |
| | |
| | | return |
| | | df = pd.read_csv(combined_path) |
| | | df_copy = df.copy() |
| | | df_copy = df_copy[df_copy["SecurityID"] == int(code)] |
| | | if df_copy.empty: |
| | | print("目标代码对应成交数据为空") |
| | | return |
| | | df_copy["SecurityID"] = df_copy["SecurityID"].apply(BigOrderDealParser.code_format) |
| | | # 按SecurityID和BuyNo分组 |
| | | grouped = df_copy.groupby(['SecurityID', 'BuyNo']) |
| | | grouped_result = grouped.apply(first_last) |
| | | grouped_result = grouped_result[grouped_result["TotalAmount"] > 500000] |
| | | grouped_result.to_csv(os.path.join(dir_path, f"{code}.csv")) |
| | | print("保存成功") |
| | | grouped = df_copy.groupby(['SecurityID']) |
| | | return set(grouped.groups.keys()) |
| | | |
| | | |
| | | if __name__ == "__main__": |
| | | # pre_process_transactions("E:/测试数据/Transaction_Test.csv") |
| | | # pre_process_ngtsticks("E:/测试数据/NGTSTick_Test.csv") |
| | | # concat_pre_transactions("E:/测试数据/Transaction_Test") |
| | | extract_big_order_of_code("E:/测试数据/Transaction_Test", "000017") |
| | | # extract_big_order_codes("E:/测试数据/Transaction_Test") |
| | | extract_big_order_of_code("E:/测试数据/Transaction_Test") |
| | |
| | | |
| | | |
| | | @tool.singleton |
| | | class TotalDealBigOrderThresholdMoneyManager: |
| | | """ |
| | | 累计成交大单阈值管理(人为设置) |
| | | """ |
| | | __db = 3 |
| | | __total_big_order_threshold = {} |
| | | |
| | | def __init__(self): |
| | | self.__load_data() |
| | | |
| | | def __load_data(self): |
| | | keys = redis_manager.RedisUtils.keys(self.__get_redis(), "total_radical_big_order_threshold-*") |
| | | for k in keys: |
| | | code = k.split("-")[1] |
| | | val = redis_manager.RedisUtils.get(self.__get_redis(), k) |
| | | val = int(val) |
| | | self.__total_big_order_threshold[code] = val |
| | | |
| | | def set_money(self, code, money): |
| | | """ |
| | | 设置金额 |
| | | @param code: |
| | | @param money: |
| | | @return: |
| | | """ |
| | | self.__total_big_order_threshold[code] = money |
| | | redis_manager.RedisUtils.setex_async(self.__db, f"total_radical_big_order_threshold-{code}", tool.get_expire(), |
| | | money) |
| | | |
| | | def get_money_cache(self, code): |
| | | """ |
| | | 获取缓存 |
| | | @param code: |
| | | @return: |
| | | """ |
| | | return self.__total_big_order_threshold.get(code) |
| | | |
| | | |
| | | @tool.singleton |
| | | class RadicalCodeMarketInfoManager: |
| | | """ |
| | | 激进买的票行情数据管理 |
| | |
| | | code) |
| | | if deal_money >= 2 * THRESHOLD_MONEY: |
| | | gpcode_manager.WhiteListCodeManager().add_code(code) |
| | | trade_record_log_util.add_common_msg(code, "加白", f"{code}大单成交足够加白, 本批次成交金额-{deal_money}/{THRESHOLD_MONEY * 2} 累计大单金额:{total_deal_big_order_result[1]}/{total_deal_big_order_result[2]}") |
| | | trade_record_log_util.add_common_msg(code, "加白", |
| | | f"{code}大单成交足够加白, 本批次成交金额-{deal_money}/{THRESHOLD_MONEY * 2} 累计大单金额:{total_deal_big_order_result[1]}/{total_deal_big_order_result[2]}") |
| | | else: |
| | | async_log_util.info(logger_debug, |
| | | f"{code}-成交大单少({deal_money}/{2 * THRESHOLD_MONEY},最小订单号-{order_begin_pos.min_order_no}),不能加白") |
| | | |
| | | except Exception as e: |
| | | logger_debug.exception(e) |
| | | async_log_util.info(logger_debug, f"处理成交大单足够加白的问题:{str(e)}") |
| | |
| | | if tool.is_ge_code(code): |
| | | TOTAL_BIG_DEAL_MONEY_THRESHOLD_COUNT *= 3.3 |
| | | |
| | | TOTAL_BIG_DEAL_MONEY_THRESHOLD_MONEY = TOTAL_BIG_DEAL_MONEY_THRESHOLD_COUNT * THRESHOLD_MONEY |
| | | human_setting_money = TotalDealBigOrderThresholdMoneyManager().get_money_cache(code) |
| | | if human_setting_money is not None: |
| | | TOTAL_BIG_DEAL_MONEY_THRESHOLD_MONEY = int(human_setting_money) |
| | | else: |
| | | TOTAL_BIG_DEAL_MONEY_THRESHOLD_MONEY = TOTAL_BIG_DEAL_MONEY_THRESHOLD_COUNT * THRESHOLD_MONEY |
| | | |
| | | # if is_for_buy and is_temp_threshold_money: |
| | | # # 首次上板买入,大单阈值打3折 |