Python中怎么实现一个网格策略
发表于:2024-11-24 作者:千家信息网编辑
千家信息网最后更新 2024年11月24日,今天就跟大家聊聊有关Python中怎么实现一个网格策略,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。策略代码'''backteststart:
千家信息网最后更新 2024年11月24日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安全错误
数据库的锁怎样保障安全
中兴广播服务器
微信 sae 数据库
腾讯云17元轻量服务器
高科技软件开发厂家供应
泰拉瑞亚1.3多人服务器手机版
数据库怎么用代码建外键
静安区网络软件开发销售方法
三级计算机网络技术培训
苏州戴尔服务器运营方式
网络安全硬件平台
易点缘网络技术app
重启web服务器iis命令
php迭代生成器 数据库
iphone和服务器有什么区别
中央网络技术和领导
黄浦区网络技术服务包括什么
网络安全要怎么做
西安哪个打车软件开发
苏州网络营销软件开发供应
鲲鹏920双路服务器
观看网络安全教育简报
数据库的数据怎么获取出来
鲲游网络技术
数据库默认大小设置吗
数据库 回滚
会计网络技术有前途吗
江苏网络技术工资
戴尔服务器r240开关
五常市科技网络技术
互联网科技公司名称