# 使用mySQL作为信息中转站
## 第一部分 Joinquant策略端
一、设置一个开关,便于调试。 比如:
```
OPEN_SQL = True
```
二、 初始化
```
def initialize(context):
......
if OPEN_SQL:
qmt_db_init() # 初始化qmt
......
```
三、 定义sql参数
```
def qmt_db_init():
g.order_idx = 0
#
g.sql_table_name = 'trades' # 数据库表名
#
_user = 'root' # 数据库账号
_pw = 'xxxxxx' # 密码
_host = '192.168.0.1' # 云服务器公网ip
_db = 'joinquant' # 数据库名称
#
sql_engine_str = "mysql+mysqldb://{username}:{password}@{host}:3306/{database}?charset=utf8"
g.sql_engine_str = sql_engine_str.format(username=_user, password=parse.quote_plus(_pw),
host=_host, database=_db)
```
四、 修改交易函数
```
# 交易模块-开仓
def open_position(context, security, value):
# type: (Context, str, float) -> bool
_order = order_target_value(security, value)
if _order is not None:
if OPEN_SQL:
push_order_tosql(context, _order)
return True
return False
# 交易模块-平仓
def close_position(context, security):
# type: (Context, str) -> bool
_order = order_target_value(security, 0)
if _order is not None:
if OPEN_SQL:
push_order_tosql(context, _order)
return True
return False
```
五、 向数据库写入交易详情
```
# 交易指令入库函数
def push_order_tosql(context, order_info):
# type: (Context, Order) -> None
g.order_idx += 1
#
order_dict = {
# 'pk': uuid.uuid1(),
'order_time': context.current_dt,
'order_type': 1 if order_info.action == 'open' else 0, # 买:1, 卖:0
'order_code': order_info.security.replace('XSHG', 'SH').replace('XSHE', 'SZ'),
'order_qty': order_info.amount,
# 'if_deal': False,
# 'insert_time': datetime.datetime.now(),
'order_idx': g.order_idx
}
df = pd.DataFrame(order_dict, index=[0])
df.to_sql(name=g.sql_table_name, con=create_engine(g.sql_engine_str), index=False, if_exists='append')
```
2023-09-29