Công cụ quản lý lưới

Tác giả:chương trình, Ngày: 2023-04-30 09:03:58
Tags:

Các tham số Có cần thiết không Mô tả
upper_price Không Giá trên biên giới mạng
giá thấp hơn Không Giá bên dưới đường lưới
grid_num Không Số lưới (độ khác nhau)
khoảng thời gian Không Khoảng cách lưới (tương đương)
mặt Không Hỗ trợ truyền tảilongshortKhông điền là mặc địnhlong
Dữ liệu Không Có thông tin lưới, kiểu là từ điển
# 创建了一个价格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)

Cấu trúc dữ liệu

Các tham số Có cần thiết không Mô tả
grid_list Vâng Giá lưới và thông tin đặt hàng được lưu trữ với giá trị khóa, key là giá, value là id đặt hàng
khoảng thời gian Vâng
upper_price Vâng
giá thấp hơn Vâng
grid_num Vâng
mặt Vâng
grid_diff Vâng
loại Vâng Tỷ lệ tương đương

Chức năng

  • get_nearest_buy_price (giá hiện tại)

    Nhận giá mua gần đây

    Các tham số Có cần thiết không Mô tả
    giá hiện tại Vâng Nhập giá để tìm giá mua gần đây nhất
  • get_nearest_sell_price (giá hiện tại)

    Nhận giá bán gần đây

    Các tham số Có cần thiết không Mô tả
    giá hiện tại Vâng Nhập giá để tìm giá bán gần đây nhất
  • base_position ((ticker))

    Lỗ dưới

    Các tham số Có cần thiết không Mô tả
    ticker Vâng Mở khoang cuối để mở lưới, chức năng này sẽ thực hiện chức năng gọi lạieventSự kiệnbase_position
  • add_order ((order_id)

    Thêm các danh sách trên và dưới lưới

    Các tham số Có cần thiết không Mô tả
    order_id Vâng Chức năng id của việc thêm hàng đính kèm lên và xuống lưới, chuyển vào kho lưu trữ hoặc giao dịch sẽ tìm kiếm lưới lên và xuống của id này, và chức năng này sẽ thực hiện hàm gọi lạieventSự kiệnadd_order
  • hủy_định lệnh (định lệnh)

    Lệnh bị hủy

    Các tham số Có cần thiết không Mô tả
    order_id Vâng Quay lại lệnh được chỉ định, chức năng này thực hiện chức năng gọi lạieventSự kiệncancel_order

Sự kiện

Sự kiện là một hàm gọi lại được chỉ định được gọi trong quá trình thực hiện hàm, ở đây liên tục sử dụng hàm event để truyền các sự kiện được chỉ định, chế độ trang trí

gm = GridPriceManager(1000, 800, 10)

# 底仓事件,在调用base_position方法时会触发此事件
@gm.event('base_position')
def base_position(price):
    # 传入最近的网格价格,以此价格作为买入价格参考
    print(price)
    return 123456	# 返回底仓订单,manger将订单记录
Sự kiện Có cần thiết không Bị lây lan Trở lại
base_position Vâng giá, giá mua, loại float Đơn đặt hàng
add_order Không price, buy into grid price, dict type, {up: giá lên lưới,down: giá xuống lưới} Với dict nhập cùng định dạng, tương ứng với id giao dịch lưới trên, id giao dịch lưới dưới
cancel_order Không order_id, chỉ định loại lệnh id, int hoặc str để hủy bool, có hủy thành công không
thay đổi Không grid_list Một sự thay đổi thông tin mạng đã gây ra sự cố này.

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)

Thêm nữa