##一、redistrade.py
下载附件redistrade.py,上传至"研究"的根目录下;然后打开该文件,修改参数:
```
host = '你的host'
port = 12798
password = '你的pwd'
pattern = 1 # 0:PUBSUB模式,1:STREAM模式
mode = 1 # 0: 测试,1:正式
```
1)host, port, password:这是你自己的Redis账号。如果你还没有,可以按[《带你入门免费的Redis Cloud》](https://www.joinquant.com/view/community/detail/f9fc4087f51431f00d6028298d0bcb84?type=1)的步骤,申请一个免费的。
2)pattern:redistrade支持redis的PubSub模式,也支持Stream模式,选择一下pattern即可。
3)mode:mode = 0, 测试:策略历史回测(back_test)时,发送Redis信号;mode = 1, 正式:策略模拟交易(sim_trade)时,发送Redis信号。
mode=0选项,是为了让你立即体会redis消息的暴爽,也是为了让你调试客户端程序。
`Note`: 2023-11-7 修改了redistrade.py. 第38行加了一条语句:
```
if my_order is not None:
# 第39-68行缩进一层。
```
也可以重新下载一下附件里面的redistrade.py
## 二、修改你的策略
你的策略需要修改4个地方:
1) `from redistrade import *`
引入"研究"中的redistrade.py中包括的类和函数。
2)策略initialize中,增加一个全局变量:`g.strategy`,例如:
```
g.strategy = 'smallgo' # 策略名
```
这一策略名,将作为PubSub模式下的频道(Channel),或者Stream模式下的Stream Name。推荐用英文而非汉字。
3)增加一个定时运行:`after_market_close`,用于休市时关闭掉Redis。
```
# 收盘后运行
run_daily(after_market_close, time='after_close', reference_security='000300.XSHG')
def after_market_close(context):
RedisTrade.close()
```
4)修改策略的`下单函数order系列`。例如:
```
order_target(stock, 0) 修改为: order_target_(context, stock, 0)
order_target_value(stock, value) 修改为: order_target_value_(context, stock, value)
```
具体的修改规则是:给order系列下单函数加个小尾巴下划线`_`, 并增加一个参数`context`。如果用到其它order系列函数,都这样改:`order...(` --> `order..._(context,`。
修改下单函数order系列,其目的是为了调用redistrade.py中的对应函数。redistrade的对应函数在完成下单后,将返回的Order对象转换成交易信号并通过redis发送出去,是redistrade最核心的函数。
至此,准备工作做完了,可以开始体验Redis发送交易信号了。
如果你来不及去修改自己的策略,就想体会Redis发送交易信号的暴爽,可以克隆我的示例策略,也可以到[用Redis的Stream模式发布JQ模拟交易信号](https://www.joinquant.com/view/community/detail/2fc51dc97d36659e5442cc0a3d470208?type=1)去复制策略实例源代码。
##三、体会Redis的PubSub模式发送的JQ交易信号
###3.1)本地机
3.1.1)在你本地机的Python环境中安装walrus库
```
pip install walrus
```
walrus are Lightweight Python utilities for working with Redis.
walrus的文档:https://walrus.readthedocs.io/en/latest/index.html
3.1.2)复制如下代码,修改后运行
a) 修改host,port,password为你自己的redis账号
b) 修改`@db.listener(channels=['smallgo'], is_async=True)`中的频道smallgo为你自己的频道(即策略中指定的策略名`g.strategy = 'smallgo' # 策略名`)
c) 然后在你本地机的Python环境中`运行`,等待JoinQuant给你发送过来交易信号。
```
import json
from walrus import Database
db = Database(
host='你的host', port=你的port,
password='你的password', decode_responses=True)
@db.listener(channels=['smallgo'], is_async=True)
def on_redis_message(**item):
if item['type'] == 'message':
msg = json.loads(item['data'])
if msg['action'] == 'exit':
raise StopIteration
else:
order_handle(msg)
def order_handle(msg):
# 请在此处自己coding, 根据msg给交易端下单
print(msg)
if __name__ == '__main__':
on_redis_message()
print('wait for message to handle')
```
### 3.2)JoinQuant端
3.2.1)修改redistrade中的参数
在"研究"中打开redistrade.py,修改参数为:
```
pattern = 0 # 0:PUBSUB模式,1:STREAM模式
mode = 0 # 0: 测试,1:正式
```
即以PubSub模式进行测试。此时策略回测过程中,将会publish交易信号。
3.2.2)按照“二、修改你的策略”的要求修改过的策略,进行`回测`。或者你直接`回测`的我示例策略。
在JoinQuant策略回测的过程中,你可以看到`你的本地机上`,交易信号同步地往外吐......
```
wait for message to handle
{'time': '2023-10-30 14:40:00', 'action': 'BUY', 'code': '003036.XSHE', 'pct': 0.1891, 'strategy': 'smallgo'}
{'time': '2023-10-30 14:40:00', 'action': 'BUY', 'code': '003033.XSHE', 'pct': 0.2303, 'strategy': 'smallgo'}
{'time': '2023-10-30 14:40:00', 'action': 'BUY', 'code': '003018.XSHE', 'pct': 0.3118, 'strategy': 'smallgo'}
{'time': '2023-10-30 14:40:00', 'action': 'BUY', 'code': '003001.XSHE', 'pct': 0.4437, 'strategy': 'smallgo'}
{'time': '2023-10-30 14:40:00', 'action': 'BUY', 'code': '003004.XSHE', 'pct': 0.8166, 'strategy': 'smallgo'}
{'time': '2023-10-31 14:40:00', 'action': 'SELL', 'code': '003004.XSHE', 'pct': 1.0, 'strategy': 'smallgo'}
{'time': '2023-10-31 14:40:00', 'action': 'BUY', 'code': '002830.XSHE', 'pct': 0.9443, 'strategy': 'smallgo'}
```
## 四、体会Redis的Stream模式发送的JQ交易信号
### 4.1)本地机
参照如下图片中的代码,修改后运行
a) 修改host,port,password为你自己的redis账号
b) 修改`stream = db.Stream('smallgo')`中的消息流smallgo为你自己的stream name(即策略中指定的策略名`g.strategy = 'smallgo' # 策略名`)
c) `等JoinQuant发出交易信号后`,去Read一下看看。

### 4.2)JoinQuant端
4.2.1)修改redistrade中的参数
在"研究"中打开redistrade.py,修改参数为:
```
pattern = 1 # 0:PUBSUB模式,1:STREAM模式
mode = 0 # 0: 测试,1:正式
```
即以Stream模式进行测试。此时策略回测过程中,将会发送交易信号。
4.2.2)按照“二、修改你的策略”的要求修改过的策略,进行`回测`。或者你直接`回测`的我示例策略。
4.2.3)回到本地机上,运行上述Read Stream的代码,可以看到, 交易信号已经在存储在Stream中了,正在等待你的消费。
##五、正式运行策略模拟交易
正式运行策略模拟交易前,务必修改redistrade.py中的参数:
```
mode = 1 # 0: 测试,1:正式
```
将mode参数设为1,即模拟交易(sim_trade)时,会发送交易信号。
## 六、展望
至此,JoinQuant端的问题,已经全部解决,剩下的,就是`客户端接收信号并下单`的问题了。
近日,我将推出:`Redis信号驱动PTrade下单示例`。
也欢迎使用QMT的宽客,@geass , @量化致富 推出`Redis信号驱动QMT下单示例`,`Redis信号驱动miniQMT下单示例`。

哈哈
2023-11-06