运行模式

PowerGate支持以两种模式运行交易策略:
一是策略以动态链接库(.dll或.so)形式存在,PowerGate网关直接将其加载到进程内部。

            +--------------------------+
            |              +--------+  |
            |              |Strategy|  |
            |              +--------+  |
            |              +--------+  |
            | PowerGate    |Strategy|  |
            |              +--------+  |
            |              +--------+  |
            |              |Strategy|  |
            |              +--------+  |
            +--------------------------+

二是策略以独立进程存在,PowerGate网关通过网络为策略提供运行环境,也就是典型的Client/Server模式。

            +------------+
            |            |          +--------+
            |            |<-------->|Strategy|
            |            |          +--------+
            |            |          +--------+
            | PowerGate  |<-------->|Strategy|
            |            |          +--------+
            |            |          +--------+
            |            |<-------->|Strategy|
            |            |          +--------+
            +------------+

PowerGate默认以第二种模式运行。网关程序的默认监听端口为5501,用户可以通过登录界面的“设置”按钮修改监听端口。

事件驱动

策略以“事件驱动”的方式运行。用户继承SDK提供的策略父类之后,根据需要实现相应的事件接口,当对应的事件发生时,策略的事件接口会被调用。
例如用户对Tick行情数据感兴趣,只要实现onTick()接口,当有Tick数据到来时,onTick()就会被调用。
用户可以在PowerGate的界面上控制策略的运行与停止,当策略启动或停止时,对应的回调函数也会被调用。
在事件驱动的模式下,一个交易策略的典型生命周期如下:

    +-------+         +-----------+                                    +-----------+
    | User  |         | PowerGate |                                    | Strategy  |
    +-------+         +-----------+                                    +-----------+
        |                   |                                                |
        | 加载策略           |                                                |
        |----------------->>|                                                |
        |                   |                                                |
        |                   |                                    onCreate()  |
        |                   |---------------------------------------------->>|
        |                   |                                                |
        | 启动策略           |                                                |
        |----------------->>|                                                |
        |                   |                                                |
        |                   |                              onSetParameter()  |
        |                   |---------------------------------------------->>|
        |                   |                                                |
        |                   |                                     onStart()  |
        |                   |---------------------------------------------->>|
        |                   |                                                |
        |                   |                                      onTick()  |  # 如果策略订阅了Tick
        |                   |---------------------------------------------->>|
        |                   |                                                |
        |                   |                                       onBar()  |  # 如果策略订阅了Bar
        |                   |---------------------------------------------->>|
        |                   |                                                |
        |                   |  buy()/sell()/sellShort()/cover()              |  # 策略发送报单
        |                   |<<----------------------------------------------|
        |                   |                                                |
        |                   |                            onOrderSubmitted()  |
        |                   |---------------------------------------------->>|
        |                   |                                                |
        |                   |            onOrderUpdated()/onOrderRejected()  |
        |                   |---------------------------------------------->>|
        |                   |                                                |
        |                   |                           onExecutionReport()  |
        |                   |---------------------------------------------->>|
        |                   |                                                |
        |                   |      onOrderPartiallyFilled()/onOrderFilled()  |
        |                   |---------------------------------------------->>|
        |                   |                                                |
        | 停止策略           |                                                |
        |----------------->>|                                                |
        |                   |                                                |
        |                   |                                      onStop()  |
        |                   |---------------------------------------------->>|
        |                   |                                                |
        |                   |                                    onDestory() |
        |                   |----------------------------------------------->|
        |                   |                                                |

数据序列

PowerGate为用户提供了一个有用的抽象:数据时间序列(DataSeries)。
例如,用户需要订阅某合约的一分钟数据,只要在策略配置中写:

config.subscribe("ABC", Resolution.MINUTE, 1)

系统会为策略自动生成一个周期为1分钟的"ABC"合约的时间序列,这个序列会被自动填充。当有分钟数据生成时,序列的第0个数据就是最新数据。
这个时间序列能被用于各种运算,如:判断相互穿越,用于传递给技术指标如MA、EMA等。
例如,我们可以在一个数据序列上计算周期为10的SMA指标:

from PowerGate import SMA
sma = SMA()
sma.init(series, 10)

当有新数据被填充进序列时,数据序列会自动触发指标进行计算。用户在初始化完指标之后,指标会自动接收数据计算最新值。

策略持仓

PowerGate支持同时运行多个策略,不同于账户持仓,每个策略都有属于自己的持仓。
当策略开仓时,所开的仓位会被分配给这个策略。PowerGate网关记录每个策略的持仓数量,策略默认只能平掉属于自己的持仓。
用户可以在网关界面上或者在策略内部为策略分配持仓。