定时任务

以下的范例代码片段是一个非常简单的例子, 在每个交易日的14:50:00 市价购买200股浦发银行股票:

  1. # coding=utf-8
  2. from __future__ import print_function, absolute_import, unicode_literals
  3. from gm.api import *
  4. def init(context):
  5. schedule(schedule_func=algo, date_rule='1d', time_rule='14:50:00')
  6. def algo(context):
  7. # 购买200股浦发银行股票
  8. order_volume(symbol='SHSE.600000', volume=200, side=OrderSide_Buy, order_type=OrderType_Market, position_effect=PositionEffect_Open, price=0)
  9. if __name__ == '__main__':
  10. run(strategy_id='strategy_1', filename='main.py', mode=MODE_BACKTEST, token='token_id',
  11. backtest_start_time='2016-06-17 13:00:00', backtest_end_time='2017-08-21 15:00:00')

整个策略需要三步:

  1. 设置初始化函数: init , 使用 schedule 函数进行定时任务配置
  2. 配置任务, 到点会执行该任务
  3. 执行策略

数据事件驱动

策略订阅的每个代码的每一个bar, 都会触发策略逻辑

以下的范例代码片段是一个非常简单的例子, 订阅浦发银行的日线bar, bar数据的更新会自动触发on_bar的调用:

  1. # coding=utf-8
  2. from __future__ import print_function, absolute_import, unicode_literals
  3. from gm.api import *
  4. def init(context):
  5. subscribe(symbols='SHSE.600000', frequency='1d')
  6. def on_bar(context, bars):
  7. # 打印当前获取的bar信息
  8. bar = bars[0]
  9. # 执行策略逻辑操作
  10. print(bar)
  11. if __name__ == '__main__':
  12. run(strategy_id='strategy_1', filename='main.py', mode=MODE_BACKTEST, token='token_id',
  13. backtest_start_time='2016-06-17 13:00:00', backtest_end_time='2017-08-21 15:00:00')

整个策略需要三步:

  1. 设置初始化函数: init, 使用subscribe函数进行数据订阅
  2. 实现一个函数: on_bar, 来根据数据推送进行逻辑处理
  3. 执行策略

时间序列数据事件驱动

策略订阅代码时指定数据窗口大小与周期, 平台创建数据滑动窗口, 加载初始数据, 并在新的bar到来时自动刷新数据。

on_bar事件触发时, 策略可以取到订阅代码的准备好的时间序列数据。

以下的范例代码片段是一个非常简单的例子, 订阅浦发银行的日线bar, bar数据的更新会自动触发on_bar的调用, 每次调用context.data来获取最新的50条日线bar信息:

  1. # coding=utf-8
  2. from __future__ import print_function, absolute_import, unicode_literals
  3. from gm.api import *
  4. def init(context):
  5. subscribe(symbols='SHSE.600000', frequency='1d', count=50)
  6. def on_bar(context, bars):
  7. print(context.data(symbol='SHSE.600000', frequency='1d', count=50, fields='close,bob'))
  8. if __name__ == '__main__':
  9. run(strategy_id='strategy_1', filename='main.py', mode=MODE_BACKTEST, token='token_id',
  10. backtest_start_time='2016-06-17 13:00:00', backtest_end_time='2017-08-21 15:00:00')

整个策略需要三步:

  1. 设置初始化函数: init , 使用 subscribe 函数进行数据订阅
  2. 实现一个函数: on_bar , 来根据数据推送进行逻辑处理, 通过 context.data 获取数据滑窗
  3. 执行策略

多个代码数据事件驱动

策略订阅多个代码, 并且要求同一频度的数据到齐后, 再触发事件.

以下的范例代码片段是一个非常简单的例子, 订阅浦发银行和平安银行的日线bar, 在浦发银行bar和平安银行bar到齐后会自动触发on_bar的调用:

  1. # coding=utf-8
  2. from __future__ import print_function, absolute_import, unicode_literals
  3. from gm.api import *
  4. def init(context):
  5. subscribe(symbols='SHSE.600000,SZSE.000001', frequency='1d', count=5, wait_group=True)
  6. def on_bar(context, bars):
  7. for bar in bars:
  8. print(bar['symbol'], bar['eob'])
  9. if __name__ == '__main__':
  10. run(strategy_id='strategy_1', filename='main.py', mode=MODE_BACKTEST, token='token_id',
  11. backtest_start_time='2016-06-17 13:00:00', backtest_end_time='2017-08-21 15:00:00')

整个策略需要三步:

  1. 设置初始化函数: init , 使用 subscribe 函数进行数据订阅多个代码, 设置wait_group=True
  2. 实现一个函数: on_bar , 来根据数据推送(多个代码行情)进行逻辑处理
  3. 执行策略

默认账户交易

如果策略只关联一个账户,该账户是策略的默认账户。

进行交易时可以不指定交易账户, 以默认账户进行交易。

  1. # coding=utf-8
  2. from __future__ import print_function, absolute_import, unicode_literals
  3. from gm.api import *
  4. def init(context):
  5. subscribe(symbols='SHSE.600000,SZSE.000001', frequency='1d')
  6. def on_bar(context, bars):
  7. for bar in bars:
  8. order_volume(symbol=bar['symbol'], volume=200, side=OrderSide_Buy,
  9. order_type=OrderType_Market,
  10. position_effect=PositionEffect_Open, price=0)
  11. if __name__ == '__main__':
  12. run(strategy_id='strategy_1', filename='main.py', mode=MODE_BACKTEST, token='token_id',
  13. backtest_start_time='2016-06-17 13:00:00', backtest_end_time='2017-08-21 15:00:00')

指定账户交易

如果策略在多个账户交易,需要显式指定交易账户。

以下的范例代码片段是一个非常简单的例子, 在下单时使用指定账户account='account_1'(参数为账户名称或账户ID)来进行交易:

  1. # coding=utf-8
  2. from __future__ import print_function, absolute_import, unicode_literals
  3. from gm.api import *
  4. def init(context):
  5. subscribe(symbols='SHSE.600000,SZSE.000001', frequency='1m')
  6. def on_bar(context, bars):
  7. for bar in bars:
  8. order_volume(symbol=bar['symbol'], volume=200, side=OrderSide_Buy,
  9. order_type=OrderType_Market,
  10. position_effect=PositionEffect_Open, price=0, account='account_1')
  11. if __name__ == '__main__':
  12. run(strategy_id='strategy_1', filename='main.py', mode=MODE_BACKTEST, token='token_id',
  13. backtest_start_time='2016-06-17 13:00:00', backtest_end_time='2017-08-21 15:00:00')

回测模式与实时模式

掘金3策略只有两种模式, 回测模式(backtest)与实时模式(live)。在加载策略时指定mode参数。

回测模式

  1. # coding=utf-8
  2. from __future__ import print_function, absolute_import, unicode_literals
  3. run(strategy_id='strategy_1', filename='main.py', mode=MODE_BACKTEST, token='token_id',
  4. backtest_start_time='2016-06-17 13:00:00', backtest_end_time='2017-08-21 15:00:00')

mode=MODE_BACKTEST 表示回测模式。

实时模式

掘金3策略只有两种模式, 回测模式(backtest)与实时模式(live)。在加载策略时指定mode参数。

  1. # coding=utf-8
  2. from __future__ import print_function, absolute_import, unicode_literals
  3. from gm.api import *
  4. run(strategy_id='strategy_id', filename='main.py', mode=MODE_LIVE, token='token_id')

mode=MODE_LIVE 表示实时模式。

提取数据研究

如果只想提取数据,无需实时数据驱动策略, 无需交易下单可以直接通过数据查询函数来进行查询。

  1. # coding=utf-8
  2. from __future__ import print_function, absolute_import, unicode_literals
  3. from gm.api import *
  4. set_token('xxxx')
  5. data = history(symbol='SHSE.600000', frequency='1d', start_time='2015-01-01', end_time='2015-12-31', fields='open,high,low,close')

整个过程只需要两步:

  1. set_token 设置用户token, 如果token不正确, 函数调用会抛出异常
  2. 调用数据查询函数, 直接进行数据查询