पैरामीटर | क्या यह आवश्यक है? | वर्णन |
---|---|---|
upper_price | नहीं | नेट पर सीमा मूल्य |
कम_मूल्य | नहीं | ग्रिड के नीचे सीमा मूल्य |
grid_num | नहीं | ग्रिड की संख्या |
अंतरंग | नहीं | ग्रिड अंतर (समान अनुपात) |
पक्ष | नहीं | समर्थन प्रसारणlong ,short ...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 प्रकार, { |
एक ही प्रारूप में भेजे जाने वाले 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)