Administrator
2023-11-24 8723789759c6e1c4b97ef6ed9a50de05eba9eed4
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
"""
卖出规则管理
"""
import json
from db import mysql_data_delegate as mysql_data
from utils import tool
 
 
class SellRule:
    def __init__(self, id_=None, code=None, buy1_volume=None, sell_volume=None, day=None, create_time=None, excuted=0,
                 end_time=None):
        self.day = day
        self.create_time = create_time
        self.sell_volume = sell_volume
        self.buy1_volume = buy1_volume
        self.code = code
        self.id_ = id_
        self.excuted = 0
        self.end_time = end_time
 
    def to_json_str(self):
        return json.dumps(vars(self))
 
    def to_dict(self):
        return vars(self)
 
    @classmethod
    def to_object(cls, json_str: str):
        d = json.loads(json_str)
        return SellRule(**d)
 
    @property
    def id(self):
        return self.id_
 
 
class SellRuleManager:
    __instance = None
    __sell_rules_dict_cache = {}
 
    def __new__(cls, *args, **kwargs):
        if not cls.__instance:
            cls.__instance = super(SellRuleManager, cls).__new__(cls, *args, **kwargs)
            cls.__instance.__load_datas()
        return cls.__instance
 
    def __load_datas(self):
        rules = self.list_rules()
        self.__sell_rules_dict_cache.clear()
        for rule in rules:
            self.__sell_rules_dict_cache[rule.id_] = rule
 
    def list_rules(self, day=tool.get_now_date_str()):
        results = mysql_data.Mysqldb().select_all(f"select * from sell_rules r where r.day='{day}'")
        fresults = []
        if results:
            for r in results:
                rule = SellRule()
                rule.id_ = r[0]
                rule.code = r[1]
                rule.buy1_volume = r[2]
                rule.sell_volume = r[3]
                rule.day = r[4]
                rule.create_time = r[5]
                rule.excuted = r[6]
                rule.end_time = r[7]
                fresults.append(rule)
        return fresults
 
    # 添加规则
    def add_rule(self, rule: SellRule):
        _id = tool.get_now_date_str('%Y%m%d') + tool.get_now_time_str().replace(":", "") + "_" + rule.code
        if not rule.id:
            rule.id_ = _id
        if not rule.day:
            rule.day = tool.get_now_date_str()
        mysql_data.Mysqldb().execute(
            "insert into sell_rules(_id,code,buy1_volume,sell_volume,day,create_time,excuted,end_time) values ('%s','%s','%s','%s','%s',now() ,'%s','%s') " % (
                rule.id_, rule.code, rule.buy1_volume, rule.sell_volume, rule.day, rule.excuted, rule.end_time))
        self.__sell_rules_dict_cache[_id] = rule
 
    # 删除规则
    def del_rule(self, _id):
        mysql_data.Mysqldb().execute(f"delete from sell_rules where _id='{_id}'")
        if _id in self.__sell_rules_dict_cache:
            self.__sell_rules_dict_cache.pop(_id)
 
    def list_rules_cache(self):
        return [self.__sell_rules_dict_cache[k] for k in self.__sell_rules_dict_cache]
 
    # 获取可以执行的规则
    def list_can_excut_rules_cache(self, code=None):
        rules = []
        for k in self.__sell_rules_dict_cache:
            rule = self.__sell_rules_dict_cache[k]
            if code and code != rule.code:
                continue
            if rule.excuted == 0 and rule.day == tool.get_now_date_str() and tool.trade_time_sub(rule.end_time,
                                                                                                 tool.get_now_time_str()) > 0:
                rules.append(rule)
        return rules
 
    # 执行卖
    def excute_sell(self, _id):
        if _id in self.__sell_rules_dict_cache:
            self.__sell_rules_dict_cache[_id].excuted = 1
        mysql_data.Mysqldb().execute(f"update sell_rules r set r.excuted=1 where r._id='{_id}'")
 
 
if __name__ == "__main__":
    SellRuleManager().del_rule("20231123142639_000333")
    SellRuleManager().excute_sell("20231123142919_000333")