当前位置:首页>python>可转债网格交易Python实战:手把手教你写出自动化交易代码

可转债网格交易Python实战:手把手教你写出自动化交易代码

  • 2026-01-11 18:05:31
可转债网格交易Python实战:手把手教你写出自动化交易代码
最近后台收到很多读者留言,问可转债网格交易的具体实现方法。今天我们就用Python写一个完整的网格交易策略,包含参数设置、自动下单、风险控制等核心功能,代码可直接运行(需配合券商接口)。

一、网格交易原理:像渔网一样捕捉波动

网格交易的核心是“低买高卖”,通过在价格波动区间内设置固定间距的买卖档位,自动执行交易。例如:设定某转债价格区间为100-120元,每跌2元买入1手,每涨2元卖出1手。当价格在100-120元之间波动时,反复赚取差价;若价格突破区间,则停止交易或调整策略。
可转债天然适合网格交易:
T+0交易:当日可多次买卖,资金利用率高;
波动适中:多数转债日内波动1%-3%,符合网格间距要求;
债底保护:即使短期被套,到期还本付息的特性降低了长期风险。

二、代码实现:从参数设置到自动下单

以下是基于easytrader(模拟券商接口)的网格交易代码,支持自定义参数、实时监控和自动交易。
import pandas as pd
import sqlite3
from datetime import datetime
from datetime import time
import datetime
import json

class NewTaskInfo(object):
def __init__(self):
self.ID = 0
self.szTaskName = ""
self.szNickName = ""
self.lStatus = 1
self.lCur = 0
self.lGridPrice = 0.0
self.lGridValue = 0.0
self.lMaxSell = 0
self.lMaxPrice = 0.0
self.lFallPrice = 0.0
self.lGridCount = 10
self.lSzGridCount = 10
self.lNewPrice = 0.0
self.lDealPrice = 0.0
self.lVol = 0.0
self.lOweCount = 0

self.lMaxOweCount=0
self.lMinOweCount=0

#0无 1买 2卖 3取消
self.lDoCount=0
self.lBuyCount=0
self.lSellCount=0
self.lDoType=0
self.lBonusDate = datetime.datetime.now()+datetime.timedelta(seconds=-90000)
self.lDoTime = datetime.datetime.now()+datetime.timedelta(seconds=-90000)
self.lTradeTime = datetime.datetime.now()+datetime.timedelta(seconds=-90000)
self.lCancelTime = datetime.datetime.now()+datetime.timedelta(seconds=-90000)
self.lLastPriceTime = datetime.datetime.now()+datetime.timedelta(seconds=-90000)
self.lLastSaveTime = datetime.datetime.now()
self.lLastTime=0
self.lDoPrice = 0.0

self.lMaxPrice=0.0
self.lMaxTime=datetime.datetime.now()+datetime.timedelta(seconds=-90000)

self.sh=0
self.debt=0
self.show_count = 0
self.lNewTask=0
self.have_count = 0
pass

def initialize(context):
# 初始化策略
# 是否交易
g.err = 0
g.is_trade = 0
g.is_auto = 1
#是否融
g.margin = 0
#是否盘后
g.do_end = 1
# 当天最大买或卖数
g.max_buy_count = 40
g.max_trade_count = 15

#最大倍数
g.max_mul = 2
# 资金少于则不买入
g.limit_money = 1000
# 买卖少于则不操作
g.min_buy_money = 700
g.max_buy_money = 3000
# 留多少钱不回购
g.out_money = 1000
# 放大量
g.more_vol = 3
# 时间状态 0未开始 1交易中 2交易中快结束 9盘后
g.time_state = 1
g.money = 0
g.buy_money = 0.0
g.buy_str = ''
g.last_money = 0
g.need_money = 0.0
g.done = 0
g.sell_count = 0
g.trade_count = 0
g.last_name = ""
g.have_count = 0

g.TaskList = []
g.bLastTrade = 0
g.last_log_time = datetime.datetime.now()+datetime.timedelta(days=-1)
g.last_trade_log_time = datetime.datetime.now()

g.last_save_money_time = datetime.datetime.now()+datetime.timedelta(days=-1)
g.last_read_json_time = datetime.datetime.now()
g.lCheckOweTime=datetime.datetime.now()+datetime.timedelta(seconds=-90000)
g.money = context.portfolio.cash

# 文件
g.file_path = get_research_path() + 'upload_file/UserGridS.db'
g.file_json_path = get_research_path() + 'upload_file/UserGridJson.txt'

log.info(g.file_path)

print("初始资金=",context.portfolio.cash,"留=",g.out_money)
# 创建数据库引擎对象
#LoadTradeLog()
LoadTaskList()
ClearTradeLog(720,180)
do_one_task(context,1)

# 定义一个周期处理函数,每3秒执行一次
if g.is_trade>0 or get_position_count(context)>0:
run_interval(context, interval_handle, seconds = 3)
run_daily(context, after_trading_order_test, time="15:02")
run_daily(context, after_trading_order_test, time="15:10")
run_daily(context, after_trading_order_test, time="15:15")
run_daily(context, after_trading_order_test, time="15:20")
run_daily(context, after_trading_order_test, time="15:25")
run_daily(context, after_trading_order_test, time="15:29")
g.is_trade = 1
else:
g.is_trade = 0

g.security = "600570.SS"
set_universe(g.security)

pass
def do_one_task(context,first):

print("执行一次开始 卖出",first)

#非初始化
if first<=0:
g.done = 1

CheckUserOrderList()
CheckBonusList()

g.have_count=0
CheckOweTaskList(context)
WriteUserMoney()

for TaskInfo in g.TaskList:
#SaveTaskInfo(TaskInfo);
#IsTaskStart(TaskInfo)
CheckTaskInfo(TaskInfo,first)
SaveTaskPrice(TaskInfo)
# if TaskInfo.szTaskName=="113549.SS":
# SaveTradeLog(TaskInfo,TaskInfo.lGridPrice,10,",test")

if g.is_trade<=0:

StartList = []

StopList = []
#000001 启动
StartList.append("0")
StopList.append("123099")
print(StartList)
for info in StartList:

print(info)
StartStopTask(info,1)
for info in StopList:

StartStopTask(info,0)
ReadJsonFile()

PrintTaskList(0)
log.info("执行一次结束")

pass
def do_end_task(context):

CheckOweTaskList(context)
for TaskInfo in g.TaskList:
SaveTaskPrice(TaskInfo)
GetTaskItemPrice(context,TaskInfo)
def StartStopTask(szTaskName,dwStart = 1):
if dwStart>0:
TaskInfo=FindTaskInfoByID(szTaskName)
if TaskInfo is not None and TaskInfo.lStatus<9:
TaskInfo.lGridValue = 1
TaskInfo.lStatus = 9
if abs(TaskInfo.lNewPrice-TaskInfo.lGridPrice)>0.4:
TaskInfo.lGridPrice = TaskInfo.lNewPrice
if TaskInfo.lMaxOweCount<=0:
TaskInfo.lMaxOweCount = 250
if TaskInfo.lOweCount>=150 :
TaskInfo.lMaxOweCount = TaskInfo.lOweCount+150
if TaskInfo.lOweCount>=10000 :
TaskInfo.lGridValue = 0.01*int(TaskInfo.lNewPrice*10)/10
if(TaskInfo.lGridValue<=0):
TaskInfo.lGridValue = 0.01
TaskInfo.lGridCount = 1000
TaskInfo.lMaxOweCount = TaskInfo.lOweCount+10000
SaveTaskStatus(TaskInfo)
else:
TaskInfo=FindTaskInfoByID(szTaskName)
if TaskInfo is not None and TaskInfo.lStatus!=1:
TaskInfo.lStatus = 1
SaveTaskStatus(TaskInfo)

def handle_data(context, data):

#log.info(('handle_time{}'.format(datetime.datetime.now()))
#print("handle_time:",datetime.datetime.now())
#print(datetime.datetime.now())

#interval_handle(context)
if g.done==0:
do_one_task(context,0)

pass

def interval_handle(context):

current_time = context.current_dt.time()
# ready_time = time(9, 30)
# end_time = time(15, 0)

if(current_time <= time(9, 30)):
g.time_state = 0
elif (current_time > time(15, 0)):
g.time_state = 9
elif (current_time > time(14, 30)):
g.time_state = 2
else:
g.time_state = 1

#print("interval_time:",datetime.datetime.now())

if g.done==0:
do_one_task(context,0)

#执行任务
DoTaskList(context)
pass

def before_trading_start(context, data):
if g.is_trade<=0:
return
print("每日开始 检测取消任务")
for TaskInfo in g.TaskList:
CheckCancelTask(TaskInfo)
ResetDayTask(TaskInfo)

pass

def after_trading_order_test(context):
print("盘后交易 留=",g.out_money)
do_end_task(context)
if g.do_end<=0:
return
if g.margin>0:
return
#g.security = "131810.SZ"

g.security = "204001.SS"
stock = g.security
snapshot = get_snapshot(g.security)
print("盘后交易 =",snapshot)
g.money = context.portfolio.cash

WriteUserMoney()
CheckOweTaskList(context,1)
def on_order_response(context, order_list):
print("订单产生 开始")

pass

def on_trade_response(context, trade_list):
log.info("订单成交 开始")
WriteUserMoney()
for trade in trade_list:
print(trade)
amount = trade['business_amount']
stock = trade['stock_code']
price = trade['business_price']
status = trade['status']
if not(status =="7" or status =="8"):
return
#print("订单成交",stock,"价格",price,"数量",amount)

str = ""
if amount>0:
str = "订单成交 买入:{},价格{},数量{}".format(stock,price,amount)
#print("订单成交 买入:","代码=",stock,"价格",price,"数量=",amount)
elif amount<0:
str = "订单成交 卖出:{},价格{},数量{}".format(stock,price,amount)
#print("订单成交 卖出:","代码=",stock,"价格",price,"数量=",amount)
log.info(str)
TaskInfo = FindTaskInfoByID(stock)

if TaskInfo is not None :
TaskInfo.lDealPrice = price
if IsTaskStart(TaskInfo):
TradeTaskInfo(TaskInfo,amount)
TaskInfo.lDoType = 0
TaskInfo.lDoCount += 1
TaskInfo.lTradeTime = datetime.datetime.now()

g.trade_count += 1
g.last_name = TaskInfo.szNickName
if amount>0:
TaskInfo.lBuyCount += 1
g.last_name += "-买"
else:
g.sell_count += 1
TaskInfo.lSellCount += 1
g.last_name += "-卖"
SaveTaskInfo(TaskInfo)
SaveTradeLog(TaskInfo,price,amount,",trade log")
else:
SaveTaskInfo(TaskInfo)
pass
def after_trading_end(context, data):
do_one_task(context,1)
print("盘后交易结束")

pass
def WriteUserMoney():
str = "UPDATE UserList SET UseMoney={}".format(g.money+g.buy_money)
WriteSql(str,1)

pass

def LoadTaskList(TaskName=""):

#g.file_path = get_research_path() + 'upload_file/test.db'
conn = sqlite3.connect(g.file_path)

# 创建一个Cursor:
cursor = conn.cursor()
# 执行一条SQL语句,创建user表:
#cursor.execute('create table user (id varchar(20) primary key, name varchar(20))')

# 继续执行一条SQL语句,插入一条记录:
#cursor.execute('insert into user (id, name) values (\'1\', \'Michael\')')

# 通过rowcount获得插入的行数:
#print(cursor.rowcount)

#cursor.execute("select name from sqlite_master where type='table'")
#tab_name=cursor.fetchall()
#print(tab_name)

cursor.execute('pragma table_info({})'.format("TaskList"))
col_name=cursor.fetchall()
#print(col_name)
col_name=[x[1] for x in col_name]

#cursor = conn.execute("SELECT * from user")
str = "SELECT * from TaskList order by sort,Status desc,TaskName"
if TaskName is not None and len(TaskName)>0:
print("加载=",TaskName)
str= "SELECT * from TaskList where TaskName='"+TaskName+"'"
cursor = conn.execute(str)

#for row in cursor:
#print("{}\t{}\t{}\t{}\t{}".format(row[1],row[2],row[3],row[4],row[5]))
#print("任务行数=",cursor.rowcount)

allData = cursor.fetchall()
print("直接获取全部记录:")
for item in allData:
#print(item)
#print(item[GetTableIndex(col_name,"TaskName")])
#print(item[GetTableIndex(col_name,"GridValue")])
szTaskName = item[GetTableIndex(col_name,"TaskName")]
TaskInfo = FindTaskInfoByID(szTaskName)
bHave = 1
if TaskInfo is None:
TaskInfo = NewTaskInfo()
bHave = 0
TaskInfo.ID = item[GetTableIndex(col_name,"ID")]
TaskInfo.szTaskName = szTaskName
TaskInfo.szNickName = item[GetTableIndex(col_name,"NickName")]
TaskInfo.lGridValue = item[GetTableIndex(col_name,"GridValue")]
TaskInfo.lGridPrice = item[GetTableIndex(col_name,"GridPrice")]
TaskInfo.lDealPrice = item[GetTableIndex(col_name,"DealPrice")]
TaskInfo.lGridPrice = round(TaskInfo.lGridPrice,3)
TaskInfo.lNewPrice = item[GetTableIndex(col_name,"NewPrice")]
TaskInfo.lStatus = item[GetTableIndex(col_name,"Status")]
TaskInfo.lDoType = item[GetTableIndex(col_name,"DoType")]
TaskInfo.lOweCount = item[GetTableIndex(col_name,"OweCount")]
TaskInfo.lMaxOweCount = item[GetTableIndex(col_name,"MaxOweCount")]
TaskInfo.lBonusDate = datetime.datetime.strptime(item[GetTableIndex(col_name,"BonusDate")], "%Y-%m-%d %H:%M:%S")
if TaskInfo.szTaskName.find("SS")>=0:
TaskInfo.sh=1
elif TaskInfo.lSzGridCount>0:
TaskInfo.lGridCount = TaskInfo.lSzGridCount
if bHave<=0:
g.TaskList.append(TaskInfo)
#print("超时",IsTimeCancelTask(TaskInfo,400))

#print("任务行数=",len(g.TaskList))
PrintTaskList(0)
#for TaskInfo in g.TaskList:
# print("任务:",TaskInfo.szTaskName,"网格价:",TaskInfo.lGridPrice,"格点:",TaskInfo.lGridValue)

lValue = 5
#for TaskInfo in g.TaskList:
#TaskInfo.lGridValue = lValue
#UpdateTaskInfo(TaskInfo)

# 关闭Cursor:
cursor.close()
# 提交事务:
conn.commit()
# 关闭Connection:
conn.close()
pass
def WriteSql(str,bLog =0):
conn = sqlite3.connect(g.file_path)
cursor = conn.cursor()
if bLog>0:
print(str)
cursor.execute(str)
cursor.close()
conn.commit()
conn.close()
pass

def InsertTaskInfo(TaskInfo):
conn = sqlite3.connect(g.file_path)
cursor = conn.cursor()

str = " insert into TaskList (TaskName, Status,DoType,OweCount,GridValue,GridPrice,NewPrice) "
str += " values (\'{}\', {},{},{},{},{},{})".format(TaskInfo.szTaskName, TaskInfo.lStatus,TaskInfo.lDoType,TaskInfo.lOweCount\
,TaskInfo.lGridValue,TaskInfo.lGridPrice,TaskInfo.lNewPrice)
print(str)
cursor.execute(str)

cursor.close()
conn.commit()
conn.close()
pass

def SaveTaskInfo(TaskInfo):
conn = sqlite3.connect(g.file_path)
cursor = conn.cursor()

str = " UPDATE TaskList SET "
str += " Status={}".format(TaskInfo.lStatus)
str += " ,DoType={}".format(TaskInfo.lDoType)
str += " ,OweCount={}".format(TaskInfo.lOweCount)
str += " ,GridPrice={}".format(TaskInfo.lGridPrice)
if(TaskInfo.lNewPrice>0):
str += " ,NewPrice={}".format(TaskInfo.lNewPrice)
str += " ,DealPrice={}".format(TaskInfo.lDealPrice)
str += " ,Updatedate=\'{}\'".format(datetime.datetime.now())
str += " where TaskName=\'{}\'".format(TaskInfo.szTaskName)
cursor.execute(str)

cursor.close()
conn.commit()
conn.close()
pass

def SaveTaskPrice(TaskInfo,bBonus=0,bGridPrice=0):
conn = sqlite3.connect(g.file_path)
cursor = conn.cursor()

str = " UPDATE TaskList SET "
if(TaskInfo.lNewPrice>0):
str += " NewPrice={}".format(TaskInfo.lNewPrice)
if bBonus>0:
str += " ,BonusDate=\'{}\'".format(TaskInfo.lBonusDate)
if bGridPrice>0:
str += " ,GridPrice={}".format(TaskInfo.lGridPrice)
str += " ,Updatedate=\'{}\'".format(datetime.datetime.now())
str += " where TaskName=\'{}\'".format(TaskInfo.szTaskName)
cursor.execute(str)

cursor.close()
conn.commit()
conn.close()
pass

def SaveTaskStatus(TaskInfo):
conn = sqlite3.connect(g.file_path)
cursor = conn.cursor()

str = " UPDATE TaskList SET "
str += " Status={}".format(TaskInfo.lStatus)
str += " ,GridValue={}".format(TaskInfo.lGridValue)
str += " ,MaxOweCount={}".format(TaskInfo.lMaxOweCount)
str += " ,GridPrice={}".format(TaskInfo.lGridPrice)
str += " ,DealPrice={}".format(TaskInfo.lGridPrice)
str += " ,Updatedate=\'{}\'".format(datetime.datetime.now())
str += " where TaskName=\'{}\'".format(TaskInfo.szTaskName)
cursor.execute(str)

cursor.close()
conn.commit()
conn.close()
pass

def SaveTaskInfoByID(TaskInfo):
conn = sqlite3.connect(g.file_path)
cursor = conn.cursor()

str = " UPDATE TaskList SET "
str += " TaskName=\'{}\'".format(TaskInfo.szTaskName)
str += " ,NickName=\'{}\'".format(TaskInfo.szNickName)
str += " ,Updatedate=\'{}\'".format(datetime.datetime.now())
str += " where ID={}".format(TaskInfo.ID)
cursor.execute(str)

cursor.close()
conn.commit()
conn.close()

pass

def DelTaskInfoByID(TaskInfo):
conn = sqlite3.connect(g.file_path)

cursor = conn.cursor()

str = "DELETE FROM TaskList"
str += " where ID={}".format(TaskInfo.ID)
print(str)
cursor = conn.execute(str)

cursor.close()
conn.commit()
conn.close()
pass

def DelTaskInfoByTaskName(szTaskName):
conn = sqlite3.connect(g.file_path)

cursor = conn.cursor()

str = "DELETE FROM TaskList"
str += " where TaskName=\'{}\'".format(szTaskName)
print(str)
cursor = conn.execute(str)

cursor.close()
conn.commit()
conn.close()
pass

def TradeTaskInfo(TaskInfo,amount):
TaskInfo.lOweCount += amount
num = abs(amount)
if num>TaskInfo.lGridCount*g.max_mul:
num = TaskInfo.lGridCount*g.max_mul

lGridValue = TaskInfo.lGridValue*((num)/TaskInfo.lGridCount)
if TaskInfo.lDoType>0 and abs(amount)<=TaskInfo.lGridCount*g.max_mul:

if amount>0:
TaskInfo.lGridPrice -= lGridValue
elif amount<0:
TaskInfo.lGridPrice += lGridValue
TaskInfo.lGridPrice = round(TaskInfo.lGridPrice,3)

pass
def SaveTradeLog(TaskInfo,lPrice,lNum,note):
conn = sqlite3.connect(g.file_path)
cursor = conn.cursor()

Status = 1
szNote = "buy"
if lNum<0:
Status=2
szNote = "sell"
szNote += note

str = " insert into ListTradeLog (TaskName,NickName, Status,OweCount,Price,Count,Note,GridValue,GridPrice,MaxOweCount) "
str += " values (\'{}\',\'{}\', {},{} ,{},{},\'{}\' ,{},{},{})".format(TaskInfo.szTaskName,TaskInfo.szNickName, Status,TaskInfo.lOweCount\
,lPrice,lNum,szNote \
,TaskInfo.lGridValue,TaskInfo.lGridPrice,TaskInfo.lMaxOweCount)
#print(str)
cursor.execute(str)

cursor.close()
conn.commit()
conn.close()

pass
def LoadTradeLog():
conn = sqlite3.connect(g.file_path)

cursor = conn.cursor()

cursor = conn.execute("SELECT * from ListTradeLog order by Updatedate desc limit 5;")

allData = cursor.fetchall()
for item in allData:
print(item)

cursor.close()
conn.commit()
conn.close()
def ClearTradeLog(log_day,ask_day):
conn = sqlite3.connect(g.file_path)

cursor = conn.cursor()

lTime = datetime.datetime.now()+datetime.timedelta(days=-log_day)
str = "DELETE FROM ListTradeLog WHERE Updatedate <= "
str += "\'{}\'".format(lTime)
print(str)
cursor = conn.execute(str)

lTime = datetime.datetime.now()+datetime.timedelta(days=-ask_day)
str = "DELETE FROM ListTradeAskLog WHERE Updatedate <= "
str += "\'{}\'".format(lTime)
print(str)
cursor = conn.execute(str)

cursor.close()
conn.commit()
conn.close()
#获得表字段名索引
def GetTableIndex(col_name,find_name):
index = 0
for name in col_name:
if name==find_name:
return index
else:
index+= 1

return 1000

def PrintTaskInfo(TaskInfo,index):
dif = TaskInfo.lNewPrice-TaskInfo.lGridPrice
dif = round(dif,2)
strBuy = ""
if(dif<=-TaskInfo.lGridValue ):
if TaskInfo.lOweCount<TaskInfo.lMaxOweCount:
strBuy = "-buy"
if TaskInfo.lOweCount>=TaskInfo.lMaxOweCount:
if (dif<=-TaskInfo.lGridValue ):
strBuy += "-BM"
else:
strBuy += "-M"
str = "{}:{}任务:{}-{}{},点{},状态{}-{},持{}/{},格价{},新{}-{}差{}{},量{}".format(index,TaskInfo.ID,TaskInfo.szTaskName,TaskInfo.szNickName,TaskInfo.sh\
,TaskInfo.lGridValue,TaskInfo.lStatus,TaskInfo.lDoType\
,TaskInfo.lOweCount,TaskInfo.lMaxOweCount\
,TaskInfo.lGridPrice ,TaskInfo.lCur,TaskInfo.lNewPrice,dif,strBuy,TaskInfo.lVol)
str += ')'
if(TaskInfo.lSellCount>0 or TaskInfo.lBuyCount):
str2 = "卖{}买{}".format(TaskInfo.lSellCount,TaskInfo.lBuyCount)
str += str2

print(str)

pass

def PrintTaskList(dwType,bShow=1):
if bShow:
print("任务输出行数=",len(g.TaskList))
status = 9
index = 1

if dwType>0:
for TaskInfo in g.TaskList:
if TaskInfo.lStatus==dwType:
PrintTaskInfo(TaskInfo,index)
index += 1
else:
for TaskInfo in g.TaskList:
if TaskInfo.lStatus>=9:
PrintTaskInfo(TaskInfo,index)
index += 1
print("----")
for TaskInfo in g.TaskList:
if TaskInfo.lStatus<9:
PrintTaskInfo(TaskInfo,index)
index += 1

if bShow:
print("任务输出结束")
pass
def isDebt(TaskName):
if TaskName[0:2] == '11':
return 1
elif TaskName[0:2] == '12':
return 2
return 0
def isFund(TaskName):
strF = TaskName[0:2]
strF1 = TaskName[0:1]
if strF == '51' or strF == '50' or strF == '52' or strF1 == '5':
return 1
elif strF == '15' or strF == '16':
return 2
return 0
def IsTaskInfo(TaskName):

for info in g.TaskList:
if info.szTaskName == TaskName:
return 1
return 0
def FindTaskInfoByName(TaskName):
for info in g.TaskList:
if info.szTaskName == TaskName:
return info
return None

def FindTaskInfoByID(TaskName):
taskID = TaskName[0:6]
for info in g.TaskList:
if info.szTaskName[0:6] == taskID:
return info
return None

def UpdateTaskInfo(TaskInfo):

for info in g.TaskList:
if info.szTaskName == TaskInfo.szTaskName:
info = TaskInfo
pass
def ClearDataTaskInfo(TaskInfo):
if(TaskInfo is None):
return

pass
def ResetDayTask(TaskInfo):
TaskInfo.lDoCount = 0
TaskInfo.lBuyCount = 0
TaskInfo.lSellCount = 0
TaskInfo.lDoType = 0

g.trade_count = 0
g.sell_count = 0

def GetLastTime(last_time):

return (datetime.datetime.now()-last_time).total_seconds()
pass

def AskUserMoney(context):
pass

def ask_position_list():
order_list=get_positions()
return [x for x in order_list if order_list[x].amount != 0]


结语:让代码为你“打工”

网格交易的本质是利用市场波动赚钱,而Python代码能帮我们实现7×24小时的自动化执行。通过本文的代码框架,你可以快速搭建自己的可转债网格策略,在控制风险的同时捕捉每一个小波段收益。
投资不是“预测涨跌”,而是“应对涨跌”。希望这份代码能成为你投资路上的好帮手,让生活因投资更美好!
(注:代码仅为示例,实盘前请充分测试,并根据自身风险承受能力调整参数。)

最新文章

随机文章

基本 文件 流程 错误 SQL 调试
  1. 请求信息 : 2026-02-08 21:42:35 HTTP/2.0 GET : https://f.mffb.com.cn/a/460714.html
  2. 运行时间 : 0.100830s [ 吞吐率:9.92req/s ] 内存消耗:4,638.42kb 文件加载:140
  3. 缓存信息 : 0 reads,0 writes
  4. 会话信息 : SESSION_ID=aa2d94ff3475f2d5921d02c834174242
  1. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/public/index.php ( 0.79 KB )
  2. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/autoload.php ( 0.17 KB )
  3. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/composer/autoload_real.php ( 2.49 KB )
  4. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/composer/platform_check.php ( 0.90 KB )
  5. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/composer/ClassLoader.php ( 14.03 KB )
  6. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/composer/autoload_static.php ( 4.90 KB )
  7. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-helper/src/helper.php ( 8.34 KB )
  8. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-validate/src/helper.php ( 2.19 KB )
  9. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/helper.php ( 1.47 KB )
  10. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/stubs/load_stubs.php ( 0.16 KB )
  11. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Exception.php ( 1.69 KB )
  12. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-container/src/Facade.php ( 2.71 KB )
  13. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/symfony/deprecation-contracts/function.php ( 0.99 KB )
  14. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/symfony/polyfill-mbstring/bootstrap.php ( 8.26 KB )
  15. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/symfony/polyfill-mbstring/bootstrap80.php ( 9.78 KB )
  16. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/symfony/var-dumper/Resources/functions/dump.php ( 1.49 KB )
  17. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-dumper/src/helper.php ( 0.18 KB )
  18. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/symfony/var-dumper/VarDumper.php ( 4.30 KB )
  19. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/App.php ( 15.30 KB )
  20. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-container/src/Container.php ( 15.76 KB )
  21. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/psr/container/src/ContainerInterface.php ( 1.02 KB )
  22. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/app/provider.php ( 0.19 KB )
  23. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Http.php ( 6.04 KB )
  24. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-helper/src/helper/Str.php ( 7.29 KB )
  25. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Env.php ( 4.68 KB )
  26. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/app/common.php ( 0.03 KB )
  27. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/helper.php ( 18.78 KB )
  28. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Config.php ( 5.54 KB )
  29. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/app.php ( 0.95 KB )
  30. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/cache.php ( 0.78 KB )
  31. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/console.php ( 0.23 KB )
  32. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/cookie.php ( 0.56 KB )
  33. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/database.php ( 2.48 KB )
  34. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/facade/Env.php ( 1.67 KB )
  35. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/filesystem.php ( 0.61 KB )
  36. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/lang.php ( 0.91 KB )
  37. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/log.php ( 1.35 KB )
  38. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/middleware.php ( 0.19 KB )
  39. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/route.php ( 1.89 KB )
  40. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/session.php ( 0.57 KB )
  41. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/trace.php ( 0.34 KB )
  42. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/view.php ( 0.82 KB )
  43. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/app/event.php ( 0.25 KB )
  44. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Event.php ( 7.67 KB )
  45. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/app/service.php ( 0.13 KB )
  46. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/app/AppService.php ( 0.26 KB )
  47. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Service.php ( 1.64 KB )
  48. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Lang.php ( 7.35 KB )
  49. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/lang/zh-cn.php ( 13.70 KB )
  50. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/initializer/Error.php ( 3.31 KB )
  51. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/initializer/RegisterService.php ( 1.33 KB )
  52. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/services.php ( 0.14 KB )
  53. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/service/PaginatorService.php ( 1.52 KB )
  54. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/service/ValidateService.php ( 0.99 KB )
  55. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/service/ModelService.php ( 2.04 KB )
  56. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-trace/src/Service.php ( 0.77 KB )
  57. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Middleware.php ( 6.72 KB )
  58. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/initializer/BootService.php ( 0.77 KB )
  59. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/Paginator.php ( 11.86 KB )
  60. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-validate/src/Validate.php ( 63.20 KB )
  61. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/Model.php ( 23.55 KB )
  62. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/model/concern/Attribute.php ( 21.05 KB )
  63. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/model/concern/AutoWriteData.php ( 4.21 KB )
  64. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/model/concern/Conversion.php ( 6.44 KB )
  65. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/model/concern/DbConnect.php ( 5.16 KB )
  66. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/model/concern/ModelEvent.php ( 2.33 KB )
  67. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/model/concern/RelationShip.php ( 28.29 KB )
  68. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-helper/src/contract/Arrayable.php ( 0.09 KB )
  69. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-helper/src/contract/Jsonable.php ( 0.13 KB )
  70. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/model/contract/Modelable.php ( 0.09 KB )
  71. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Db.php ( 2.88 KB )
  72. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/DbManager.php ( 8.52 KB )
  73. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Log.php ( 6.28 KB )
  74. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Manager.php ( 3.92 KB )
  75. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/psr/log/src/LoggerTrait.php ( 2.69 KB )
  76. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/psr/log/src/LoggerInterface.php ( 2.71 KB )
  77. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Cache.php ( 4.92 KB )
  78. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/psr/simple-cache/src/CacheInterface.php ( 4.71 KB )
  79. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-helper/src/helper/Arr.php ( 16.63 KB )
  80. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/cache/driver/File.php ( 7.84 KB )
  81. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/cache/Driver.php ( 9.03 KB )
  82. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/contract/CacheHandlerInterface.php ( 1.99 KB )
  83. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/app/Request.php ( 0.09 KB )
  84. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Request.php ( 55.78 KB )
  85. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/app/middleware.php ( 0.25 KB )
  86. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Pipeline.php ( 2.61 KB )
  87. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-trace/src/TraceDebug.php ( 3.40 KB )
  88. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/middleware/SessionInit.php ( 1.94 KB )
  89. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Session.php ( 1.80 KB )
  90. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/session/driver/File.php ( 6.27 KB )
  91. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/contract/SessionHandlerInterface.php ( 0.87 KB )
  92. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/session/Store.php ( 7.12 KB )
  93. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Route.php ( 23.73 KB )
  94. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/route/RuleName.php ( 5.75 KB )
  95. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/route/Domain.php ( 2.53 KB )
  96. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/route/RuleGroup.php ( 22.43 KB )
  97. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/route/Rule.php ( 26.95 KB )
  98. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/route/RuleItem.php ( 9.78 KB )
  99. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/route/app.php ( 1.72 KB )
  100. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/facade/Route.php ( 4.70 KB )
  101. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/route/dispatch/Controller.php ( 4.74 KB )
  102. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/route/Dispatch.php ( 10.44 KB )
  103. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/app/controller/Index.php ( 4.81 KB )
  104. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/app/BaseController.php ( 2.05 KB )
  105. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/facade/Db.php ( 0.93 KB )
  106. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/connector/Mysql.php ( 5.44 KB )
  107. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/PDOConnection.php ( 52.47 KB )
  108. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/Connection.php ( 8.39 KB )
  109. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/ConnectionInterface.php ( 4.57 KB )
  110. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/builder/Mysql.php ( 16.58 KB )
  111. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/Builder.php ( 24.06 KB )
  112. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/BaseBuilder.php ( 27.50 KB )
  113. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/Query.php ( 15.71 KB )
  114. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/BaseQuery.php ( 45.13 KB )
  115. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/concern/TimeFieldQuery.php ( 7.43 KB )
  116. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/concern/AggregateQuery.php ( 3.26 KB )
  117. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/concern/ModelRelationQuery.php ( 20.07 KB )
  118. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/concern/ParamsBind.php ( 3.66 KB )
  119. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/concern/ResultOperation.php ( 7.01 KB )
  120. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/concern/WhereQuery.php ( 19.37 KB )
  121. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/concern/JoinAndViewQuery.php ( 7.11 KB )
  122. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/concern/TableFieldInfo.php ( 2.63 KB )
  123. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/concern/Transaction.php ( 2.77 KB )
  124. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/log/driver/File.php ( 5.96 KB )
  125. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/contract/LogHandlerInterface.php ( 0.86 KB )
  126. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/log/Channel.php ( 3.89 KB )
  127. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/event/LogRecord.php ( 1.02 KB )
  128. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-helper/src/Collection.php ( 16.47 KB )
  129. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/facade/View.php ( 1.70 KB )
  130. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/View.php ( 4.39 KB )
  131. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Response.php ( 8.81 KB )
  132. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/response/View.php ( 3.29 KB )
  133. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Cookie.php ( 6.06 KB )
  134. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-view/src/Think.php ( 8.38 KB )
  135. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/contract/TemplateHandlerInterface.php ( 1.60 KB )
  136. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-template/src/Template.php ( 46.61 KB )
  137. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-template/src/template/driver/File.php ( 2.41 KB )
  138. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-template/src/template/contract/DriverInterface.php ( 0.86 KB )
  139. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/runtime/temp/067d451b9a0c665040f3f1bdd3293d68.php ( 11.98 KB )
  140. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-trace/src/Html.php ( 4.42 KB )
  1. CONNECT:[ UseTime:0.000388s ] mysql:host=127.0.0.1;port=3306;dbname=f_mffb;charset=utf8mb4
  2. SHOW FULL COLUMNS FROM `fenlei` [ RunTime:0.000596s ]
  3. SELECT * FROM `fenlei` WHERE `fid` = 0 [ RunTime:0.003267s ]
  4. SELECT * FROM `fenlei` WHERE `fid` = 63 [ RunTime:0.000298s ]
  5. SHOW FULL COLUMNS FROM `set` [ RunTime:0.000564s ]
  6. SELECT * FROM `set` [ RunTime:0.000259s ]
  7. SHOW FULL COLUMNS FROM `article` [ RunTime:0.000600s ]
  8. SELECT * FROM `article` WHERE `id` = 460714 LIMIT 1 [ RunTime:0.000643s ]
  9. UPDATE `article` SET `lasttime` = 1770558155 WHERE `id` = 460714 [ RunTime:0.004335s ]
  10. SELECT * FROM `fenlei` WHERE `id` = 66 LIMIT 1 [ RunTime:0.000283s ]
  11. SELECT * FROM `article` WHERE `id` < 460714 ORDER BY `id` DESC LIMIT 1 [ RunTime:0.000433s ]
  12. SELECT * FROM `article` WHERE `id` > 460714 ORDER BY `id` ASC LIMIT 1 [ RunTime:0.001804s ]
  13. SELECT * FROM `article` WHERE `id` < 460714 ORDER BY `id` DESC LIMIT 10 [ RunTime:0.011195s ]
  14. SELECT * FROM `article` WHERE `id` < 460714 ORDER BY `id` DESC LIMIT 10,10 [ RunTime:0.006036s ]
  15. SELECT * FROM `article` WHERE `id` < 460714 ORDER BY `id` DESC LIMIT 20,10 [ RunTime:0.002393s ]
0.102387s