Python中怎么实现一个网格策略
发表于:2025-12-03 作者:千家信息网编辑
千家信息网最后更新 2025年12月03日,今天就跟大家聊聊有关Python中怎么实现一个网格策略,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。策略代码'''backteststart:
千家信息网最后更新 2025年12月03日Python中怎么实现一个网格策略
今天就跟大家聊聊有关Python中怎么实现一个网格策略,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。
策略代码
'''backteststart: 2019-07-01 00:00:00end: 2020-01-03 00:00:00period: 1mexchanges: [{"eid":"OKEX","currency":"BTC_USDT"}]'''import json# 参数beginPrice = 5000 # 网格区间开始价格endPrice = 8000 # 网格区间结束价格distance = 20 # 每个网格节点的价格距离pointProfit = 50 # 每个网格节点的利润差价amount = 0.01 # 每个网格节点的挂单量minBalance = 300 # 账户最小资金余额(买入时)# 全局变量arrNet = []arrMsg = []acc = Nonedef findOrder (orderId, NumOfTimes, ordersList = []) : for j in range(NumOfTimes) : orders = None if len(ordersList) == 0: orders = _C(exchange.GetOrders) else : orders = ordersList for i in range(len(orders)): if orderId == orders[i]["Id"]: return True Sleep(1000) return Falsedef cancelOrder (price, orderType) : orders = _C(exchange.GetOrders) for i in range(len(orders)) : if price == orders[i]["Price"] and orderType == orders[i]["Type"]: exchange.CancelOrder(orders[i]["Id"]) Sleep(500)def checkOpenOrders (orders, ticker) : global arrNet, arrMsg for i in range(len(arrNet)) : if not findOrder(arrNet[i]["id"], 1, orders) and arrNet[i]["state"] == "pending" : orderId = exchange.Sell(arrNet[i]["coverPrice"], arrNet[i]["amount"], arrNet[i], ticker) if orderId : arrNet[i]["state"] = "cover" arrNet[i]["id"] = orderId else : # 撤销 cancelOrder(arrNet[i]["coverPrice"], ORDER_TYPE_SELL) arrMsg.append("挂单失败!" + json.dumps(arrNet[i]) + ", time:" + _D())def checkCoverOrders (orders, ticker) : global arrNet, arrMsg for i in range(len(arrNet)) : if not findOrder(arrNet[i]["id"], 1, orders) and arrNet[i]["state"] == "cover" : arrNet[i]["id"] = -1 arrNet[i]["state"] = "idle" Log(arrNet[i], "节点平仓,重置为空闲状态。", "#FF0000")def onTick () : global arrNet, arrMsg, acc ticker = _C(exchange.GetTicker) # 每次获取当前最新的行情 for i in range(len(arrNet)): # 遍历所有网格节点,根据当前行情,找出需要挂单的位置,挂买单。 if i != len(arrNet) - 1 and arrNet[i]["state"] == "idle" and ticker.Sell > arrNet[i]["price"] and ticker.Sell < arrNet[i + 1]["price"]: acc = _C(exchange.GetAccount) if acc.Balance < minBalance : # 如果钱不够了,只能跳出,什么都不做了。 arrMsg.append("资金不足" + json.dumps(acc) + "!" + ", time:" + _D()) break orderId = exchange.Buy(arrNet[i]["price"], arrNet[i]["amount"], arrNet[i], ticker) # 挂买单 if orderId : arrNet[i]["state"] = "pending" # 如果买单挂单成功,更新网格节点状态等信息 arrNet[i]["id"] = orderId else : # 撤单 cancelOrder(arrNet[i]["price"], ORDER_TYPE_BUY) # 使用撤单函数撤单 arrMsg.append("挂单失败!" + json.dumps(arrNet[i]) + ", time:" + _D()) Sleep(1000) orders = _C(exchange.GetOrders) checkOpenOrders(orders, ticker) # 检测所有买单的状态,根据变化做出处理。 Sleep(1000) orders = _C(exchange.GetOrders) checkCoverOrders(orders, ticker) # 检测所有卖单的状态,根据变化做出处理。 # 以下为构造状态栏信息,可以查看FMZ API 文档。 tbl = { "type" : "table", "title" : "网格状态", "cols" : ["节点索引", "详细信息"], "rows" : [], } for i in range(len(arrNet)) : tbl["rows"].append([i, json.dumps(arrNet[i])]) errTbl = { "type" : "table", "title" : "记录", "cols" : ["节点索引", "详细信息"], "rows" : [], } orderTbl = { "type" : "table", "title" : "orders", "cols" : ["节点索引", "详细信息"], "rows" : [], } while len(arrMsg) > 20 : arrMsg.pop(0) for i in range(len(arrMsg)) : errTbl["rows"].append([i, json.dumps(arrMsg[i])]) for i in range(len(orders)) : orderTbl["rows"].append([i, json.dumps(orders[i])]) LogStatus(_D(), "\n", acc, "\n", "arrMsg length:", len(arrMsg), "\n", "`" + json.dumps([tbl, errTbl, orderTbl]) + "`")def main (): # 策略执行从这里开始 global arrNet for i in range(int((endPrice - beginPrice) / distance)): # for 这个循环根据参数构造了网格的数据结构,是一个列表,储存每个网格节点,每个网格节点的信息如下: arrNet.append({ "price" : beginPrice + i * distance, # 该节点的价格 "amount" : amount, # 订单数量 "state" : "idle", # pending / cover / idle # 节点状态 "coverPrice" : beginPrice + i * distance + pointProfit, # 节点平仓价格 "id" : -1, # 节点当前相关的订单的ID }) while True: # 构造好网格数据结构后,进入策略主要循环 onTick() # 主循环上的处理函数,主要处理逻辑 Sleep(500) # 控制轮询频率策略主要设计思路是,根据自己维护的这个网格数据结构,对比GetOrders接口返回的当前挂单列表。分析挂出的订单变化(成交与否),更新网格数据结构,做出后续操作。并且挂出的订单不会撤销,直到成交,即使价格偏离也不撤销,因为数字货币市场经常有插针的情况,这些挂单也有可能接到插针的单子(如果交易所有挂单数量限制,那就要调整了)。
策略数据可视化,使用了LogStatus函数把数据实时显示在状态栏上。
tbl = { "type" : "table", "title" : "网格状态", "cols" : ["节点索引", "详细信息"], "rows" : [], } for i in range(len(arrNet)) : tbl["rows"].append([i, json.dumps(arrNet[i])]) errTbl = { "type" : "table", "title" : "记录", "cols" : ["节点索引", "详细信息"], "rows" : [], } orderTbl = { "type" : "table", "title" : "orders", "cols" : ["节点索引", "详细信息"], "rows" : [], }构造了三个表格,第一个表格显示当前网格数据结构中每个节点的信息,第二个表格显示异常信息,第三个表格显示交易所实际挂单信息。
回测测试


看完上述内容,你们对Python中怎么实现一个网格策略有进一步的了解吗?如果还想了解更多知识或者相关内容,请关注行业资讯频道,感谢大家的支持。
网格
节点
信息
数据
价格
策略
数据结构
结构
状态
表格
订单
内容
索引
循环
三个
函数
区间
参数
平仓
数量
数据库的安全要保护哪些东西
数据库安全各自的含义是什么
生产安全数据库录入
数据库的安全性及管理
数据库安全策略包含哪些
海淀数据库安全审计系统
建立农村房屋安全信息数据库
易用的数据库客户端支持安全管理
连接数据库失败ssl安全错误
数据库的锁怎样保障安全
宝山区通用软件开发产品介绍
共享充电器软件开发
软件开发怎么样啊
联盟哪个服务器好玩
打电话无法连接到服务器
惠州市惠城区软件开发公司
cmd查询数据库
如何管理web服务器
数据库主键的语法
重庆oa软件开发代码
软件开发模型适用分析
信息化网络安全教育主题
构建日志集中管理服务器
him入侵服务器原视频
通信服务器是什么意思
网络安全实验室排名
计算机网络技术基础电子
安徽服务器虚拟化优化云服务器
三大举措网络安全
网络异常服务器熔断
古交软件开发电话多少
网信办举办网络安全技能竞赛
苏州吱嘎网络技术
网络安全 人人有责任
惠州市惠城区软件开发公司
土地利用分类数据库
网络安全图片文件大全
计算机网络技术基础电子
三大举措网络安全
h620-g30服务器安装