ग्रिड प्रबंधन उपकरण

लेखक:कार्यक्रम, दिनांक: 2023-04-30 09:03:58
टैगः

पैरामीटर क्या यह आवश्यक है? वर्णन
upper_price नहीं नेट पर सीमा मूल्य
कम_मूल्य नहीं ग्रिड के नीचे सीमा मूल्य
grid_num नहीं ग्रिड की संख्या
अंतरंग नहीं ग्रिड अंतर (समान अनुपात)
पक्ष नहीं समर्थन प्रसारणlongshort...long
डेटा नहीं पहले से ही ग्रिड जानकारी, प्रकार शब्दकोश
# 创建了一个价格1000-800,数量为10的等差网格
GridPriceManager(upper_price=1000, lower_price=800, grid_num=10)

# 创建了一个价格1000-800,间隔为1%的等比网格
GridPriceManager(upper_price=1000, lower_price=800, interval=1)

# 传入已有网格信息
data = {
	"grid_list":    {99:None,100:None,101:None,102:None,103:None,104:None},
	"interval":     None,
	"upper_price":  104,
	"lower_price":  99,
	"grid_num":     6,
	"side":         "long",
	"grid_diff":    1,
	"type":         "等差",
}
GridPriceManager(Data=data)

डेटा संरचना

पैरामीटर क्या यह आवश्यक है? वर्णन
grid_list हाँ ग्रिड मूल्य और ऑर्डर जानकारी, जो की मान के रूप में संग्रहीत की जाती है, key के रूप में मूल्य, value के रूप में आदेश id
अंतरंग हाँ
upper_price हाँ
कम_मूल्य हाँ
grid_num हाँ
पक्ष हाँ
grid_diff हाँ
प्रकार हाँ बराबर या बराबर

फ़ंक्शन

  • get_nearest_buy_price ((वर्तमान_मूल्य)

    हाल ही में खरीदे गए मूल्य प्राप्त करें

    पैरामीटर क्या यह आवश्यक है? वर्णन
    वर्तमान_मूल्य हाँ सबसे हालिया खरीद मूल्य खोजने के लिए इनपुट मूल्य
  • get_nearest_sell_price ((वर्तमान_मूल्य)

    हाल ही में नेट बिक्री मूल्य प्राप्त करें

    पैरामीटर क्या यह आवश्यक है? वर्णन
    वर्तमान_मूल्य हाँ इनपुट मूल्य का उपयोग करके नवीनतम बिक्री मूल्य का पता लगाएं
  • आधार_स्थिति (टीकर)

    नीचे का खलिहान

    पैरामीटर क्या यह आवश्यक है? वर्णन
    टिक्कर हाँ खोलता है, ग्रिड को खोलता है, और यह फ़ंक्शन रिकॉल फ़ंक्शन को निष्पादित करता हैeventघटनाएंbase_position
  • add_order ((order_id)

    ग्रिड पर लटकने वाली सूची जोड़ें

    पैरामीटर क्या यह आवश्यक है? वर्णन
    order_id हाँ ग्रिड के ऊपर-नीचे लटकने वाली सूची जोड़ने के लिए, एक id फ़ंक्शन जो एक bottom-out या transactional order को पास करता है, उस id के ऊपर-नीचे ग्रिड को ढूंढता है, और यह फ़ंक्शन एक callback फ़ंक्शन निष्पादित करता हैeventघटनाएंadd_order
  • रद्द_आदेश (आदेश_आईडी)

    आदेश रद्द

    पैरामीटर क्या यह आवश्यक है? वर्णन
    order_id हाँ निर्दिष्ट आदेश को रद्द करें, यह फ़ंक्शन रिकॉल फ़ंक्शन चलाता हैeventघटनाएंcancel_order

घटनाएं

घटनाएँ फ़ंक्शन के निष्पादन के दौरान बुलाए जाने वाले निर्दिष्ट फ़ंक्शनों को संदर्भित करती हैं, जो निर्दिष्ट घटनाओं को, डेकोरेटर मोड में, घटना फ़ंक्शन का उपयोग करके भेजती हैं।

gm = GridPriceManager(1000, 800, 10)

# 底仓事件,在调用base_position方法时会触发此事件
@gm.event('base_position')
def base_position(price):
    # 传入最近的网格价格,以此价格作为买入价格参考
    print(price)
    return 123456	# 返回底仓订单,manger将订单记录
घटनाएं क्या यह आवश्यक है? प्रवेश लौटें
आधार_स्थिति हाँ मूल्य, खरीद मूल्य, फ्लोट प्रकार थोक आदेश आईडी
add_order जोड़ें नहीं price, इन-नेट कीमत, dict प्रकार, {up टंक: ऊपर ग्रिड कीमत,down टंक: नीचे ग्रिड कीमत} एक ही प्रारूप में भेजे जाने वाले dict के साथ, ऊपर के ग्रिड लेनदेन id, नीचे के ग्रिड लेनदेन id के अनुरूप
रद्द_आदेश नहीं order_id, रद्द किए जाने वाले ऑर्डर का id, int या str प्रकार निर्दिष्ट करता है bool, सफलतापूर्वक रद्द करें
परिवर्तन नहीं grid_list इस घटना को ग्रिड सूचना में बदलाव के कारण शुरू किया गया था।

class GridPriceManager:
    def __init__(self, Data=None, upper_price=None, lower_price=None, interval=None, grid_num=None, side: Literal['long','short']='long') -> dict:
        self.interval = interval
        self.upper_price = upper_price
        self.lower_price = lower_price
        self.grid_num = grid_num
        self.side = side
        self.grid_diff = None
        self.type = None    # 网格类型
        if self.grid_num is not None:
            self.grid_diff = (self.upper_price - self.lower_price) / (self.grid_num - 1)
        if Data is None: 
            if self.interval is None:
                self.grid_list = self._generate_grid_list_difference()
                self.type = "等差"
            else:
                self.grid_list = self._generate_grids_list_ratio()
                self.type = "等比"
        else:
            self.grid_list = Data["grid_list"]
            self.interval = Data["interval"]
            self.upper_price = Data["upper_price"]
            self.lower_price = Data["lower_price"]
            self.grid_num = Data["grid_num"]
            self.side = Data["side"]
            self.grid_diff = Data["grid_diff"]
            self.type = Data["type"]
        self.data = f"网格类型: {self.type}, 网格数量: {len(self.grid_list)}, 上下区间: [{self.upper_price}-{self.lower_price}, 方向: {self.side}]"
        self.callback = {}

    def event(self, event_name):
        """事件"""
        def decorator(func):
            self.callback[event_name] = func
            return func
        return decorator

    def _generate_grid_list_difference(self) -> dict:
        """等差网格生成"""
        grid_list = {}
        price = self.lower_price
        for _ in range(self.grid_num):
            grid_list[price] = None
            price += self.grid_diff
        grid_list[self.upper_price] = None
        return grid_list

    def _generate_grids_list_ratio(self) -> dict:
        """等比网格生成"""
        ratio = 1 + self.interval / 100
        grid = [self.lower_price * (ratio ** i) for i in range(-100, 101)]
        return {round(g, 8): None for g in grid if self.lower_price <= g <= self.upper_price}


    def get_nearest_buy_price(self, current_price) -> float:
        """获取最近网格买入价格"""
        nearest_price = None
        for price in sorted(self.grid_list.keys()):
            if price > current_price:
                break
            nearest_price = price
        return nearest_price

    def get_nearest_sell_price(self, current_price) -> float:
        """获取最近网格卖出价格"""
        nearest_price = None
        for price in sorted(self.grid_list.keys(), reverse=True):
            if price < current_price:
                break
            nearest_price = price
        return nearest_price
    
    def base_position(self, ticker) -> Union[str, int]:
        """底仓"""
        if self.side == "short":
            t = self.get_nearest_sell_price(ticker)
        else:
            t = self.get_nearest_buy_price(ticker)
        order_id = self.callback["base_position"](t)
        self.grid_list[t] = order_id
        self.callback["change"](self.grid_list)
        return order_id
    
    def add_order(self, order_id) -> Union[Dict, bool]:
        """增加网格上下挂单"""
        up_price = None
        down_price = None
        ticker = None
        keys = list(self.grid_list.keys())
        for i in range(len(keys)-1):
            if self.grid_list[keys[i]] == order_id:
                ticker = keys[i]
                try:
                    if self.side is None or self.side == "long":
                        up_price = keys[i+1]
                        down_price = keys[i-1]
                    else:
                        up_price = keys[i-1]
                        down_price = keys[i+1]
                except IndexError:
                    return False
                break

        PriceDict = {"up": up_price, "down": down_price}
        d = self.callback["add_order"](PriceDict)
        d = {"up": d["up"], "down": d["down"]}
        self.grid_list[up_price] = d["up"]
        self.grid_list[down_price] = d["down"]
        self.grid_list[ticker] = None
        self.callback["change"](self.grid_list)
        return d
    
    def cancel_order(self, order_id):
        """撤销订单"""
        result = self.callback["cancel_order"](order_id)
        if result == True:
            for items in self.grid_list.items():
                if items[1] == order_id:
                    self.grid_list[items[0]] = None
                    self.callback["change"](self.grid_list)
                    break

def main():
    gm = GridPriceManager(1000, 500, 10)

    @gm.event('add_order')
    def add_order(price):
        print(price)
        return {
            'up': 36543,
            'down': 87957,
        }

    @gm.event('cancel_order')
    def cancel_order(order_id):
        return True

    @gm.event('base_position')
    def base_position(price):
        print(price)
        return 123456

    a = gm.base_position(600)
    print(a)
    a = gm.add_order(123456)
    print(gm.grid_list)
    gm.cancel_order(87957)
    print(gm.grid_list)

अधिक