Python中怎么实现一个网格策略
发表于:2025-01-23 作者:千家信息网编辑
千家信息网最后更新 2025年01月23日,今天就跟大家聊聊有关Python中怎么实现一个网格策略,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。策略代码'''backteststart:
千家信息网最后更新 2025年01月23日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安全错误
数据库的锁怎样保障安全
数据库一个字段存多个名字
中国的电信网络技术
广安软件开发应用范围
华强九阳网络技术有限
政府网络安全等级保护制度
学校信息网络安全管理规定
嵌入式软件开发工程师应届生薪资
50万并发服务器大吗
小联网络技术有限公司怎么样
软件开发学徒高薪包住
linux服务器太卡怎么排查
网络安全课进校园小报
公司级网络安全
数据库订阅号
科脉数据库怎么启动
数据库管理系统 答案
软件开发平台运营
碟中谍4网络安全
淮南通信软件开发费用
软件开发c模式
武汉网络安全人才薪酬排名
最新网络安全知识竞答题目及答案
启迪网络安全
乡村数据库指标
三维数据库技术
火山鼠软件开发
用saas软件服务器安全吗
趣步软件开发时间为
婕斯公司的服务器
叁叁玖厦门互联网科技有限公司