Administrator
6 小时以前 2f2516749615da866e96d8d24e499b7ecbb63a3e
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
"""
卖票管理器
"""
import concurrent.futures
 
from log_module import async_log_util
from log_module.log import logger_trade, logger_trade_position_api_request
from trade.huaxin.huaxin_trade_record_manager import DealRecordManager, DelegateRecordManager
 
__cancel_sell_thread_pool = concurrent.futures.ThreadPoolExecutor(max_workers=8)
 
 
# 人工卖票管理器
class HumanSellManager:
    __code_sell_way_dict = {}
    __DealRecordManager = DealRecordManager()
 
    def set_code_sell_way(self, data):
        fdata = {}
        code = data["code"]
        mode = data["mode"]
        if mode == 1:
            mode1_rate_index = data["mode1_rate_index"]
            fdata["mode1_rate_index"] = mode1_rate_index
        elif mode == 2:
            # 第一笔卖的索引
            mode2_first_index = data["mode2_first_index"]
            # 剩下几笔卖的索引
            mode2_left_index = data["mode2_left_index"]
            fdata["mode2_first_index"] = mode2_first_index
            fdata["mode2_left_index"] = mode2_left_index
        fdata["code"] = code
        fdata["mode"] = mode
        self.__code_sell_way_dict[code] = fdata
        # 保存卖的方式
        async_log_util.info(logger_trade_position_api_request, f"设置卖出方式:{fdata}")
 
    def __get_deal_nums(self, code):
        deal_order_system_id_infos = {}
        # 获取已经卖的单数
        deal_list = self.__DealRecordManager.list_sell_by_code_cache(code)
        if deal_list:
            for d in deal_list:
                if d["orderSysID"] not in deal_order_system_id_infos:
                    deal_order_system_id_infos[d["orderSysID"]] = [d["volume"], d["tradeTime"]]
                else:
                    deal_order_system_id_infos[d["orderSysID"]][0] += d["volume"]
        # 获取9:30之前的卖委托
        current_delegates = DelegateRecordManager().list_current_delegates(code)
        if current_delegates:
            for d in current_delegates:
                if d["orderSysID"] not in deal_order_system_id_infos:
                    deal_order_system_id_infos[d["orderSysID"]] = [d["volume"], d["insertTime"]]
        deal_list = [deal_order_system_id_infos[k] for k in deal_order_system_id_infos]
        deal_list.sort(key=lambda x: x[1])
        sell_order_nums = [k[0] for k in deal_list]
        return sell_order_nums
 
    def distribute_sell_volume(self, code, total_volume):
        def average_volume(_total_volume, count):
            total_volume_100 = _total_volume // 100
            _base_100 = total_volume_100 // count
            _left_100 = total_volume_100 % count
            temp_list = []
            for i in range(count):
                if i + 1 <= _left_100:
                    temp_list.append((_base_100 + 1) * 100)
                else:
                    temp_list.append(_base_100 * 100)
            return temp_list
 
        if code not in self.__code_sell_way_dict:
            raise Exception("还没设置卖出方式")
 
        sell_way = self.__code_sell_way_dict.get(code)
        volumeList = []
        if sell_way["mode"] == 1:
            # 平均卖
            mode1_rate_index = sell_way["mode1_rate_index"]
            volumeList = average_volume(total_volume, mode1_rate_index)
        elif sell_way["mode"] == 2:
            # 按百分比卖
            mode2_first_index = sell_way["mode2_first_index"]
            # 剩下几笔卖的索引
            mode2_left_index = sell_way["mode2_left_index"]
            first_percent = (mode2_first_index + 1) * 10
            second_count = mode2_left_index + 1
            first = first_percent * total_volume // 100
            if first_percent * total_volume % 100 != 0:
                first += 100
            volumeList.append(first)
            total_left = total_volume - first
            left_volumes = average_volume(total_left, second_count)
            volumeList.extend(left_volumes)
        return volumeList
 
    # 计算卖出量
    def compute_sell_volume(self, code, total_volume):
        volumeList = self.distribute_sell_volume(code, total_volume)
        # 获取已卖和已挂单的数据
        sell_order_nums = self.__get_deal_nums(code)
        if len(sell_order_nums) >= len(volumeList):
            raise Exception(f"挂单已超过设置数量:{sell_order_nums}/{volumeList}")
        return volumeList[len(sell_order_nums)]
 
 
if __name__ == '__main__':
    code = "000333"
    __HumanSellManager = HumanSellManager()
    __HumanSellManager.set_code_sell_way({"code": code, "mode": 1, "mode1_rate_index": 3})
    # __HumanSellManager.set_code_sell_way({"code": code, "mode": 2, "mode2_first_index": 1, "mode2_left_index": 4})
 
    f = __HumanSellManager.distribute_sell_volume(code, 2000)
    print(f)