本帖最后由 资深技术05 于 2025-5-12 13:05 编辑
追撤单
通过对未成交属性的获取,直接拼接出追单函数名称,从全局环境中直接获取到这个函数。代码更加简洁~
[Python] 复制代码 # 本Python代码主要用于策略交易
# 可以自己import我们平台支持的第三方python模块,比如pandas、numpy等。
from PythonApi import *
import datetime
import sys
def init(context):
pass
def handle_bar(context):
order_list = get_orders("all", 0)
current_time = datetime.datetime.now()
if order_list:
for order in order_list:
seconds_difference = (current_time - order.datetime ).total_seconds()
#10秒未成交,追撤单
if seconds_difference>=10:
Chase_withdraw(context,order)
def Chase_withdraw(context,order):
vol = order.unfilled_quantity
order_id = order.order_id
book_id = order.order_book_id
side = order.side # 订单方向 "buy"买:"sell"卖
#拼接函数名称
position_effect = order.position_effect # 开平标志 "open"开仓 "close"平仓
#撤单语句
cancel_order(order_id)
function_name = side+"_"+position_effect
# 从全局环境中直接获取到 具体的函数,这样就可以避免写四条不同的追单语句
function_object = getattr(sys.modules[__name__], function_name)
try:
function_object(book_id,"Market",volume = vol)
except Exception as ex:
raise
结算价
注意该函数是一个生成器函数,返回结果是一个生成器,不是直接的数值列表.
[Python] 复制代码 # 该Python代码用于模块定义,供其他Python代码或VBA调用。
import pandas as pd
from PythonApi import *
import datetime
import numpy as np
def calculate_settle(stklabel,datalen):
dt = history_bars(stklabel,datalen,'1m',['datetime','close','volume'])
if dt is None:
return
#Point是最小变动价位的小数位
point = round(get_dynainf(stklabel,208),7)
if int(point)>0:
point = 0
else:
point = len(str(point).split(".")[1])
#对close做 指定到小数位的四舍五入处理,降低累计的浮点误差值
dt[:, 1] = np.around(dt[:, 1], decimals=point)
sum_cmulv = 0
sum_v = 0
currentdate = 0
for item in dt:
datetime,close,volume = item
if (datetime // 1000000)*1000000 != currentdate:
currentdate = (datetime // 1000000)*1000000
sum_cmulv = 0
sum_v = 0
sum_cmulv = sum_cmulv + close*volume
sum_v = sum_v + volume
yield (datetime,round(sum_cmulv/sum_v,point))
时间类型转换
系统默认的数据接口返回的 日期数值类型都是float类型(numpy数组值类型必须一致),因此我们经常需要做一些类型转换。
但是需要注意,不建议大批量的进行这种日期类型转换,只在需要使用的地方进行即可。
[Python] 复制代码
import pandas as pd
from PythonApi import *
import datetime
import itertools
import numpy as np
# float类型转为datetime类型
def convert_to_datetime(date):
int_value = int(date)
year = int_value // 10000000000
month = (int_value % 10000000000) // 100000000
day = (int_value % 100000000) // 1000000
hour = (int_value % 1000000) // 10000
minute = (int_value % 10000) // 100
second = int_value % 100
return datetime.datetime(year,month ,day, hour, minute, second)
# float类型转为datetime.time类型
def convert_to_time(date):
int_value = int(date)
hour = (int_value % 1000000) // 10000
minute = (int_value % 10000) // 100
second = int_value % 100
return datetime.time(hour, minute, second)
# float类型转为格式化的str类型
def convert_to_str(timestamp):
timestamp_str = str(int(timestamp))
formatted_date = f"{timestamp_str[:4]}-{timestamp_str[4:6]}-{timestamp_str[6:8]} {timestamp_str[8:10]}:{timestamp_str[10:12]}:{timestamp_str[12:14]}"
return formatted_date
|