154 lines
6.5 KiB
Python
154 lines
6.5 KiB
Python
'''
|
|
小果聚宽跟单系统
|
|
原理替代,继承聚宽的交易函数类
|
|
读取下单类的函数参数把交易数据发送到服务器
|
|
把下面的全部源代码复制到聚宽策略的开头就可以
|
|
实盘前先模拟盘测试一下数据
|
|
把下面的内容全部复制到策略的开头就可以
|
|
作者微信15117320079
|
|
'''
|
|
import requests
|
|
import json
|
|
import pandas as pd
|
|
from jqdata import *
|
|
url='http://117.72.149.251'
|
|
port=8888
|
|
#自定义服务器编码
|
|
url_code='63d85b6189e42cba63feea36381da615c31ad8e36ae420ed67f60f3598efc9ad'
|
|
#记得把这个改成自己的一个策略一个,策略的名称找作者建立
|
|
password='cls'
|
|
class joinquant_trader:
|
|
def __init__(self,url='http://117.72.149.251',
|
|
port=8888,
|
|
url_code='63d85b6189e42cba63feea36381da615c31ad8e36ae420ed67f60f3598efc9ad',
|
|
password='cls'):
|
|
'''
|
|
获取服务器数据
|
|
'''
|
|
self.url=url
|
|
self.port=port
|
|
self.url_code=url_code
|
|
self.password=password
|
|
def get_user_data(self,data_type='用户信息'):
|
|
'''
|
|
获取使用的数据
|
|
data_type='用户信息','实时数据',历史数据','清空实时数据','清空历史数据'
|
|
'''
|
|
url='{}:{}/_dash-update-component'.format(self.url,self.port)
|
|
headers={'Content-Type':'application/json'}
|
|
data={"output":"joinquant_trader_table.data@{}".format(self.url_code),
|
|
"outputs":{"id":"joinquant_trader_table","property":"data@{}".format(self.url_code)},
|
|
"inputs":[{"id":"joinquant_trader_password","property":"value","value":self.password},
|
|
{"id":"joinquant_trader_data_type","property":"value","value":data_type},
|
|
{"id":"joinquant_trader_text","property":"value","value":"\n {'状态': 'held', '订单添加时间': 'datetime.datetime(2024, 4, 23, 9, 30)', '买卖': 'False', '下单数量': '9400', '已经成交': '9400', '股票代码': '001.XSHE', '订单ID': '1732208241', '平均成交价格': '10.5', '持仓成本': '10.59', '多空': 'long', '交易费用': '128.31'}\n "},
|
|
{"id":"joinquant_trader_run","property":"value","value":"运行"},
|
|
{"id":"joinquant_trader_down_data","property":"value","value":"不下载数据"}],
|
|
"changedPropIds":["joinquant_trader_run.value"],"parsedChangedPropsIds":["joinquant_trader_run.value"]}
|
|
res=requests.post(url=url,data=json.dumps(data),headers=headers)
|
|
text=res.json()
|
|
df=pd.DataFrame(text['response']['joinquant_trader_table']['data'])
|
|
return df
|
|
def send_order(self,result):
|
|
'''
|
|
发送交易数据
|
|
'''
|
|
url='{}:{}/_dash-update-component'.format(self.url,self.port)
|
|
headers={'Content-Type':'application/json'}
|
|
data={"output":"joinquant_trader_table.data@{}".format(self.url_code),
|
|
"outputs":{"id":"joinquant_trader_table","property":"data@{}".format(self.url_code)},
|
|
"inputs":[{"id":"joinquant_trader_password","property":"value","value":self.password},
|
|
{"id":"joinquant_trader_data_type","property":"value","value":'发送信号'},
|
|
{"id":"joinquant_trader_text","property":"value","value":result},
|
|
{"id":"joinquant_trader_run","property":"value","value":"运行"},
|
|
{"id":"joinquant_trader_down_data","property":"value","value":"不下载数据"}],
|
|
"changedPropIds":["joinquant_trader_run.value"],"parsedChangedPropsIds":["joinquant_trader_run.value"]}
|
|
res=requests.post(url=url,data=json.dumps(data),headers=headers)
|
|
text=res.json()
|
|
df=pd.DataFrame(text['response']['joinquant_trader_table']['data'])
|
|
return df
|
|
#继承类
|
|
xg_data=joinquant_trader(url=url,port=port,password=password,)
|
|
def send_order(result):
|
|
'''
|
|
发送函数
|
|
status: 状态, 一个OrderStatus值
|
|
add_time: 订单添加时间, [datetime.datetime]对象
|
|
is_buy: bool值, 买还是卖,对于期货:
|
|
开多/平空 -> 买
|
|
开空/平多 -> 卖
|
|
amount: 下单数量, 不管是买还是卖, 都是正数
|
|
filled: 已经成交的股票数量, 正数
|
|
security: 股票代码
|
|
order_id: 订单ID
|
|
price: 平均成交价格, 已经成交的股票的平均成交价格(一个订单可能分多次成交)
|
|
avg_cost: 卖出时表示下卖单前的此股票的持仓成本, 用来计算此次卖出的收益. 买入时表示此次买入的均价(等同于price).
|
|
side: 多/空,'long'/'short'
|
|
action: 开/平, 'open'/'close'
|
|
commission交易费用(佣金、税费等)
|
|
'''
|
|
data={}
|
|
data['状态']=str(result.status)
|
|
data['订单添加时间']=str(result.add_time)
|
|
data['买卖']=str(result.is_buy)
|
|
data['下单数量']=str(result.amount)
|
|
data['已经成交']=str(result.filled)
|
|
data['股票代码']=str(result.security)
|
|
data['订单ID']=str(result.order_id)
|
|
data['平均成交价格']=str(result.price)
|
|
data['持仓成本']=str(result.avg_cost)
|
|
data['多空']=str(result.side)
|
|
data['交易费用']=str(result.commission)
|
|
result=str(data)
|
|
xg_data.send_order(result)
|
|
return data
|
|
def xg_order(func):
|
|
'''
|
|
继承order对象 数据交易函数
|
|
'''
|
|
def wrapper(*args, **kwargs):
|
|
result = func(*args, **kwargs)
|
|
if result == None:
|
|
return
|
|
send_order(result)
|
|
return result
|
|
return wrapper
|
|
def xg_order_target(func):
|
|
'''
|
|
继承order_target对象 百分比
|
|
'''
|
|
def wrapper(*args, **kwargs):
|
|
result = func(*args, **kwargs)
|
|
if result == None:
|
|
return
|
|
send_order(result)
|
|
return result
|
|
return wrapper
|
|
|
|
def xg_order_value(func):
|
|
'''
|
|
继承order_value对象 数量
|
|
'''
|
|
def wrapper(*args, **kwargs):
|
|
result = func(*args, **kwargs)
|
|
if result == None:
|
|
return
|
|
send_order(result)
|
|
return result
|
|
return wrapper
|
|
def xg_order_target_value(func):
|
|
'''
|
|
继承order_target_value对象 数量
|
|
'''
|
|
def wrapper(*args, **kwargs):
|
|
result = func(*args, **kwargs)
|
|
if result == None:
|
|
return
|
|
send_order(result)
|
|
return result
|
|
return wrapper
|
|
order = xg_order(order)
|
|
order_target = xg_order_target(order_target)
|
|
order_value = xg_order_value(order_value)
|
|
order_target_value = xg_order_target_value(order_target_value)
|
|
|