如何写策略(C++)

一个简单的策略

与其他纯web端的量化平台相比,本平台提供的方式支持本地化代码,无需上传到平台上,确保用户策略隐私。c++策略用户只需完成两个文件的编写,json格式的配置文件和cpp格式的策略文件,当然本平台会提供精简的模板保证用户2分钟可完成一个策略。

详见策略示例(C++)

完整的策略工程

使用c++版本的sdk需要创建一个策略分析器,该分析器主要是对基类strategyAnalyzer的回调函数进行重写。

下面为StrategyAnalyzer派生类实现的一个示例:

class MyMulAnalyzer : public StrategyAnalyzer
{
public:
    //初始化函数
    void on_initialize(StrategyApi *sApi) final
    {
        std::cout << "on_initialize is called back" << std::endl;
    }

    //Timer回调,定时器事件,模拟盘响应,回测时可忽略
    void on_timer(StrategyApi *sApi) final
    {
        std::cout << "on_timer is called back"<< std::endl;
    }

    //开盘前准备,必须设置要关注的标的
    void on_before_market_open(StrategyApi *sApi, const MarketParam & marketParam) final
    {

        auto symbols = sApi->get_symbol_pool();
        cout << symbols.size() << endl;

        sApi->set_focus_symbols(set<string>(symbols.begin(), symbols.end()));
    }

    void on_bar(StrategyApi *sApi, const Bar & bar) final
    {
        cout << "---------on_bar---------" << endl;
        vector<SymbolPosition> symbol_positions = sApi->get_symbol_positions();

        //如果有持仓
        if(symbol_positions.size() > 0)
        {
            //平仓
            sApi->target_position(bar.symbol,0,bar.close);
        }
        else
        {
            //市价目标仓位50000股
            sApi->target_position(bar.symbol,50000,bar.close);
        }
    }

    void on_handle_data(StrategyApi *sApi ,int64_t timeExch)
    {
        cout << "------on_handle_data------" << endl;
    }

    void on_terminate(StrategyApi *sApi, const StrategyExitInfo& exitInfo) final
    {
        cout << "----on_terminate----------" << endl;
    }

    void on_order_update(StrategyApi* sApi, const OrderUpdate& orderUpdate) final
    {
        cout << "-----on_order_update-------" << endl;
    }

    void on_first_tick(StrategyApi *sApi, const Quote &quote)
    {
        cout << "------on_first_tick-------" << 
            endl;
        cout << "quote : " << quote << endl;
    }

};

配置config文件(必要)

参考python部分配置文件config

on_initialize-初始化(可选)

函数原型:

virtual void on_initialize(std::shared_ptr<StrategyApi> sApi)
{
    std::cout << "multi do nothing" << std::endl;
}

on_before_market_open-盘前运行(必选)

函数原型:

virtual void on_before_market_open(std::shared_ptr<StrategyApi> sApi, const MarketParam &marketParam)
{
    std::cout << " onBeforeMarketBegin do nothing" << std::endl;
}

盘中运行(必要)

on_bar-K线响应回调

  • 创建实例时设置撮合周期,bar产生时会调用。为了提高效率,只有在关注列表(即在on_initialize回调函数中通过set_symbol_pool进行设置)中和有持仓的标的才会响应行情回调。当group_modesingle_only或者 both时响应。

函数原型:

virtual void on_bar(StrategyAPI *sApi, const Bar &bar)
{
    std::cout << "multi on bar do noting" << std::endl;
}

on_handle_data-数据到齐响应回调

  • 针对某一周期的bar数据或者tick数据,搜集齐后再统一响应回调,, group_modegroup_only或者 both时响应

函数原型:

virtual void on_handle_data(StrategyAPI *sApi, int64_t timeExch)
{
    std::cout << "on handle bar do noting" << std::endl;
}

on_terminate-运行终止(可选)

  • 运行终止时会调用一次。

函数原型:

virtual void on_bar(StrategyAPI *sApi, const Bar &bar)
{
    std::cout << "multi on bar do noting" << std::endl;
}

on_timer-定时器(可选)

  • 每隔timeCycle毫秒会响应一次,在配置文件realtime中设置timer_cycle来设置,参数默认为0不响应on_timer。该参数针对模拟盘,回测可忽略。

函数原型:

virtual void on_timer(StrategyAPI *sApi)
{
    std::cout << "multi on timer do noting" << std::endl;
}

on_order_update-订单状态更新回调(可选)

  • 订单状态更新时会响应一次,OrderUpdate为委托更新信息。

函数原型:

virtual void on_order_update(StrategyAPI *sApi, const OrderUpdate &orderUpdate)
{
    std::cout << "on_order_update but do nothing" << std::endl;
}

策略api

create_strategy_api-创建StrategyApi

函数原型:

static std::shared_ptr<StrategyApi> create_strategy_api();

参数:

reg_analyzer-注册分析器

函数原型:

virtual void reg_analyzer(StrategyAnalyzer *analyzer) = 0;

参数:

参数 类型 是否必填 说明
analyzer StrategyAnalyzer * 自己创建的分析器的指针

init-StrategyApi初始化

函数原型:

virtual int init(int argc, char *argv[]);

参数:

参数 类型 是否必填 说明
argc int 传入的命令行参数个数
argv char ** 传入的命令行参数字符串数组

wait_for_shutdown-策略主循环

  • 分析器创建好,并且注册到strategyApi中,在StrategyApi初始化完成之后就可以进行策略的主循环:根据回测或是模拟的时间逻辑来对应执行分析器中相应的回调函数。

函数原型:

virtual void wait_for_shutdown() = 0;

参数:

交易函数

set_focus_symbols-设置关注的标的池-盘前

  • 调用该函数的位置是在on_before_market_open回调中,只有设置了关注的标的,才能进行下单操作。
  • 由于K线数据采用的是表格方式输出,而不同交易市场的标的交易时间不同,因此暂时不能保证表对齐,所以目前策略中只支持相同交易市场的标的同时被关注。否则会报错,后续会进行优化。(get_bars_history获取K线添加了market_mode参数,该参数目前只能支持single模式)。

函数原型:

virtual void set_focus_symbols(const std::set<std::string> &symbols) = 0;

参数:

参数 类型 是否必填 说明
symbols std::set<std::string> 一组关注的标的

返回值:

示例:

sApi->set_focus_symbols({"000001.SZ", "000002.SZ"});

get_focus_and_position_symbols-获取关注的和持仓的标的

函数原型:

virtual std::vector<std::string> get_focus_and_position_symbols() const = 0;

参数:

返回值:返回symbol的vector

示例:

auto symbols = sApi->get_focus_and_position_symbols();

target_position-目标仓位数量下单

  • 调整标的仓位,即根据需要进行下撤单,无直接操作下单接口

函数原型:

virtual std::string target_position(const std::string &symbol, double qty, double price,const std::string &price_type = "",const std::string &side = "long",const std::string &remark = "") = 0;

参数:

参数 类型 是否必填 说明
symbol string 策略中的标的代码
qty int 目标仓位
price double 下单价格
price_type string 价格类型 支持以下下单模式,可缺省为空,
部成部撤:FAK
当日有效限价单:DAY
立即全部成交否则自动撤销:FOK
side string 多空方向,支持方向为多/空,默认为多。
多:long
空:short
remark string 下单原因说明,填写后可以在客户端管理平台展示

返回值:orderID。类型为string ,orderID作为对此条下单操作的标识。

示例:


//以11元限价单买入100股000001
sApi->target_position("000001.SZ",100,11);

//以11元限价买入000001股票至持仓为100股 若不能立马成交自动撤单
sApi->target_position ("000001.SZ",100,11,"FOK""long", "");

target_percent-按比例下单

函数原型:

virtual std::string target_percent(const std::string &symbol, double percent, double price,const std::string &price_type = "",const std::string &side = "long",const std::string &remark = "") = 0;

参数:

参数 类型 是否必填 说明
symbol string 策略中的标的代码
percent double 交易量为占总资产的比例
price double 下单价格
price_type string 价格类型 支持以下下单模式,可缺省为空,
部成部撤:FAK
当日有效限价单:DAY
立即全部成交否则自动撤销:FOK
side string 多空方向,支持方向为多/空,默认为多。
多:long
空:short
remark string 下单原因说明,填写后可以在客户端管理平台展示

返回值:类型为string的订单id ,订单id作为对此条下单操作的标识

示例:

//以11元限价单买入总资产的20%
sApi->target_percent("000001.SZ", 0.2 ,11);

cancel_order-撤单

函数原型:

virtual void cancel_order(const std::string &symbol, const std::string &side = "long", const std::string &remark = "") = 0;

参数:

参数 类型 是否必填 说明
symbol string 标的代码
side string 多空方向,支持方向为多/空,默认为多。
多:long
空:short
remark string 撤单原因说明,填写后可以在web端展示。

示例:

//撤销股票000001.CS的挂单
sApi->cancel_order("000001.SZ", "long","撤销000001.CS的挂单");

//撤销期货rb1901.CF的空头挂单
sApi->cancel_order ("rb1901.CF", "short");

get_symbol_position-获取单个标的仓位信息

函数原型:

virtual const SymbolPosition &get_symbol_position(const std::string &symbol, const std::string &side = "long") = 0;

参数:

参数 类型 是否必填 说明
symbol string 标的代码
side string 多空方向,支持方向为多/空,默认为多。
多:long
空:short

返回值:SymbolPosition对象。

示例:

//获取股票000001.SZ仓位信息
sApi->get_symbol_position ("000001.SZ");

//获取期货IM2306.CFE多仓的仓位信息
sApi->get_symbol_position ("IM2306.CFE", "long");

//获取期货IM2306.CFE空仓的仓位信息
sApi->get_symbol_position ("IM2306.CFE""short");

get_symbol_positions-获取所有持仓标的仓位信息

函数原型:

virtual std::vector<SymbolPosition> get_symbol_positions() = 0;

参数:

返回值:元素为SymbolPosition对象的vector容器。

示例:

//获取所有标的的仓位信息
sApi->get_symbol_positions();

get_account-获取标的或者市场所属账户信息

  • 获取标的所属账号信息,由于账号获取是异步的,所以下完单立即获取账户数据会有延迟。

函数原型:

virtual const Account &get_account(const std::string &symbol, const std::string &market = "") = 0;

参数:

参数 类型 是否必填 说明
symbol string 标的代码,不可缺省
market string 市场,可选值有A股市场/期货市场/指数市场/港股市场
A股市场:CS
期货市场:CF
指数市场:IDX
港股市场:HK

返回值: 标的所属证券的市场账号信息,Account结构体。

  • Account结构体
属性 类型 说明
id string 账户 id(userId-market)
market string 市场
currency string 账户币种(CNY)
daily_pnl double 当天盈亏 - 清算时候清零
ur_last_pnl double 浮动盈亏 - 按最后价算
all_time_pnl double 盈亏
cash_deposited double 存入现金(所有加入的现金)
cash_available double 可用现金
cash double 现金
unit_value double 账户基金价值
margin double 现金分红
bonus double 持仓占用资金
market_value double 持仓市值
tot_assets double 总资产
total_commission double 总手续费

示例:

//用标的获取A股账号的信息
sApi->get_account("000001.SZ", "CS");

//同时填入标的和市场时,返回通过市场获取的账号信息,如下返回期货账号信息
sApi->get_account("000001.SZ", "CF");

get_overall_position-获取标的汇总仓位

由于多个策略可以共享账户资金,因此可能会存在多个策略中都持有某个标的的情况,账户中会将多个策略中标的信息进行汇总。本函数用来获取某个标的在账户中汇总后的仓位信息。

函数原型:

virtual const OverallPosition &get_overall_position(const std::string &symbol) = 0;

参数:

参数 类型 是否必填 说明
symbol string 标的代码

返回值: 该标的在其所属账户中的总仓位信息,OverallPosition对象结构体。

  • OverPosition结构体
属性 类型 说明
account_id string 账户ID
symbol string 合约
buy_price double 加权平均买价(开仓/平仓所有数据加权平均)
sell_price double 加权平均卖价
buy_qty double 买数量
sell_qty double 卖数量
last_ur_pnl double 最后成交价算的盈亏(以OpenPosition计算)
long_available_qty double 多仓可以平仓数量(计算出来)
short_available_qty double 空仓可以平仓数量(计算出来)
long_qty double 多仓数量
short_qty double 空仓数量
long_price double 多仓开仓均价
short_price double 空仓开仓均价
long_last_ur_pnl double 多仓浮动盈亏
short_last_ur_pnl double 空仓浮动盈亏
long_margin double 多仓占用保证金
short_margin double 空仓占用保证金
long_market_value double 多仓持仓市值
short_market_value double 空仓持仓市值

示例:

//获取账户下000001.CS的汇总仓位信息
sApi->get_overall_position("000001.SZ");

交易日期函数

get_trade_day_interval-取交易日间隔数

获取某时间区间交易日数,起止时间只能是回测区间内的

函数原型:

virtual int get_trade_day_interval(int start_date, int end_date, const std::string &symbol) = 0;

参数:

参数 类型 是否必填 说明
start_date int 开始时间,格式为YYYYMMDD
end_date int 结束时间,格式为YYYYMMDD
symbol string 标的代码

返回值:返回值为交易日数

示例:

//获取一段时间内的交易日数,包含所传起止日期
[In]:
    sApi->get_trade_day_interval(20200907, 20200909, "000001.SZ");
[Out]:
    3

get_last_trade_date-取最近交易日

  • 获取最近一个交易日(向前延伸)

函数原型:

virtual int get_last_trade_date(int trade_date, const std::string &symbol) = 0;

参数:

参数 类型 是否必填 说明
trade_date int 给定日期
symbol string 标的代码

返回值:返回最近一个交易日(向前延伸)

示例:

[In]:
    sApi->get_last_trade_date(20200101, "000001.SZ");
[Out]:
    20191231

get_next_trade_date-取下一个交易日

  • 获取最近一个交易日(向后延伸)

函数原型:

virtual int get_next_trade_date(int date, const std::string &symbol) = 0;

参数:

参数 类型 是否必填 说明
trade_date int 开始时间,格式为YYYYMMDD
symbol string 标的代码

返回值:返回最近一个交易日(向后延伸)

示例:

[In]:
    sApi->get_next_trade_date(20200101, "000001.SZ");
[Out]:
    20200102

get_trade_dates-取某时间内交易日

  • 指定起止日期,获取某个市场一段时间的交易日,包含所传起止日期

函数原型:

virtual std::vector<int> get_trade_dates(int start_date, int end_date, const std::string &market) = 0;

参数:

参数 类型 是否必填 说明
start_date int 开始时间(含当天),格式为YYYYMMDD
end_date int 结束时间(含当天),格式为YYYYMMDD
market string 市场,可选值有A股市场/期货市场/指数市场/港股市场
A股市场:CS
期货市场:CF
指数市场:IDX
港股市场:HK

返回值:类型为int 的 vector容器,日期格式YYMMDD

示例:

//获取一段时间内的交易日期,包含所传起止日期
[In]:
    sApi->get_trade_dates(20200601, 20200611, "CS");
[Out]:
    {20200601, 20200602, 20200603, 20200604, 20200605, 20200608, 20200609, 20200610, 20200611}

get_prev_trade_dates-取前N个交易日

  • 获取指定日期的前N个交易日,不包含指定日期。

函数原型:

virtual std::vector<int> get_prev_trade_dates(int trade_date, int count, const std::string& market) = 0;

参数:

参数 类型 是否必填 说明
trade_date int 交易日,格式为YYYYMMDD
count int N个交易日
market string 市场,可选值有A股市场/期货市场/指数市场/港股市场
A股市场:CS
期货市场:CF
指数市场:IDX
港股市场:HK

返回值:返回前N个交易日的日期

示例:

//取20150101前5个交易日
[In]:
    sApi->get_prev_trade_dates(20200101, 5, "CS");
[Out]:
    {20191225, 20191226, 20191227, 20191230, 20191231}

get_next_trade_dates-取后N个交易日

  • 获取指定日期后的N个交易日,不包含指定日期

函数原型:

virtual std::vector<int> get_next_trade_dates(int trade_date, int count, const std::string &market) = 0;

参数:

参数 类型 是否必填 说明
trade_date int 交易日,格式为YYYYMMDD
count int N个交易日
market string 市场,可选值有A股市场/期货市场/指数市场/港股市场
A股市场:CS
期货市场:CF
指数市场:IDX
港股市场:HK

返回值:返回后N个交易日

示例:

//获取20200101之后的5个交易日
[In]:
    sApi->get_next_trade_dates(20200101, 5, "CS");
[Out]:
    {20200102, 20200103, 20200106, 20200107, 20200108}

date_now-取当前交易日

  • 获取当前的交易日。回测情况下是回测历史当天,模拟交易情况下是当前交易日。

函数原型:

virtual int date_now() = 0;

返回值:返回历史当天的交易日期

示例:

[In]:
    sApi->date_now();
[Out]:
    20200907

time_now-取当前交易时间

  • 获取当前的交易时间。回测情况下是回测历史当天,交易情况下是当前交易日。

函数原型:

virtual int64_t time_now() = 0;

参数:

返回值:返回历史当前的时间戳,精确到毫秒。类型:int64_t。

示例:

[In]:
    sApi->time_now();
[Out]:
    1596783600000

标的信息函数

get_ref_data-取标的信息

函数原型:

virtual RefData get_ref_data(const std::string &symbol) = 0;

参数:

参数 类型 是否必填 说明
symbol string 标的代码

返回值:证券基本信息,RefData

示例:

sApi->get_ref_data("000001.SZ");

get_constituent_symbols-取成分股

  • 获取股票指数或者行业板块的成分股数据。获取期货某品种当前可交易的标的数据。
  • 获取指数成分股权重数据 :get_table_data-取表格数据

函数原型:

virtual std::vector<std::string> get_constituent_symbols(const std::string &instset, int trade_date) = 0;

参数:

参数 类型 是否必填 说明
instset string 指数代码、板块代码、指数代码列表或者行业板块代码列表,为列表时表示获取的股票同时属于这些指数或者行业。
trade_date int 交易日,形式为YYYYMMDD,支持获取历史成分股信息

返回值: 返回股票代码的vector容器

示例:

[In]:
    sApi->get_constituent_symbols("000300.SH", 20200916);
[Out]:            {'000001.SZ', '000002.SZ', '000063.SZ', '000066.SZ', '000069.SZ', '000100.SZ', '000157.SZ', '000166.SZ', '000333.SZ', '000338.SZ', '000425.SZ', '000538.SZ', '000568.SZ', '000596.SZ', '000625.SZ', '000627.SZ', '000651.SZ', '000656.SZ', '000661.SZ', '000671.SZ', '000703.SZ', '000708.SZ', '000709.SZ', '000723.SZ', '000725.SZ', '000728.SZ', '000768.SZ', '000776.SZ', '000783.SZ', '000786.SZ', '000858.SZ', '000860.SZ', '000876.SZ', '000895.SZ', '000938.SZ', '000961.SZ', '000963.SZ', '000977.SZ', '001979.SZ', '002001.SZ', '002007.SZ', '002008.SZ', '002024.SZ', '002027.SZ', '002032.SZ', '002044.SZ', '002050.SZ', '002120.SZ', '002129.SZ', '002142.SZ', '002146.SZ', '002153.SZ', '002157.SZ', '002179.SZ', '002202.SZ', '002230.SZ', '002236.SZ', '002241.SZ', '002252.SZ', '002271.SZ', '002304.SZ', '002311.SZ', '002352.SZ', '002371.SZ', '002410.SZ', '002415.SZ', '002422.SZ', '002456.SZ', '002460.SZ', '002463.SZ', '002466.SZ', '002468.SZ', '002475.SZ', '002493.SZ', '002508.SZ', '002555.SZ', '002558.SZ', '002594.SZ', '002601.SZ', '002602.SZ', '002607.SZ', '002624.SZ', '002673.SZ', '002714.SZ', '002736.SZ', '002739.SZ', '002773.SZ', '002841.SZ', '002916.SZ', '002938.SZ', '002939.SZ', '002945.SZ', '002958.SZ', '003816.SZ', '300003.SZ', '300014.SZ', '300015.SZ', '300033.SZ', '300059.SZ', '300122.SZ', '300124.SZ', '300136.SZ', '300142.SZ', '300144.SZ', '300347.SZ', '300408.SZ', '300413.SZ', '300433.SZ', '300498.SZ', '300601.SZ', '300628.SZ', '600000.SH', '600004.SH', '600009.SH', '600010.SH', '600011.SH', '600015.SH', '600016.SH', '600018.SH', '600019.SH', '600025.SH', '600027.SH', '600028.SH', '600029.SH', '600030.SH', '600031.SH', '600036.SH', '600038.SH', '600048.SH', '600050.SH', '600061.SH', '600066.SH', '600068.SH', '600085.SH', '600089.SH', '600104.SH', '600109.SH', '600111.SH', '600115.SH', '600118.SH', '600170.SH', '600176.SH', '600177.SH', '600183.SH', '600188.SH', '600196.SH', '600208.SH', '600219.SH', '600221.SH', '600233.SH', '600271.SH', '600276.SH', '600297.SH', '600299.SH', '600309.SH', '600332.SH', '600340.SH', '600346.SH', '600352.SH', '600362.SH', '600369.SH', '600372.SH', '600383.SH', '600390.SH', '600398.SH', '600406.SH', '600436.SH', '600438.SH', '600482.SH', '600487.SH', '600489.SH', '600498.SH', '600516.SH', '600519.SH', '600522.SH', '600547.SH', '600570.SH', '600583.SH', '600585.SH', '600588.SH', '600606.SH', '600637.SH', '600655.SH', '600660.SH', '600674.SH', '600690.SH', '600703.SH', '600705.SH', '600741.SH', '600745.SH', '600760.SH', '600795.SH', '600809.SH', '600837.SH', '600848.SH', '600867.SH', '600886.SH', '600887.SH', '600893.SH', '600900.SH', '600919.SH', '600926.SH', '600928.SH', '600958.SH', '600968.SH', '600977.SH', '600989.SH', '600998.SH', '600999.SH', '601006.SH', '601009.SH', '601012.SH', '601018.SH', '601021.SH', '601066.SH', '601077.SH', '601088.SH', '601100.SH', '601108.SH', '601111.SH', '601117.SH', '601138.SH', '601155.SH', '601162.SH', '601166.SH', '601169.SH', '601186.SH', '601198.SH', '601211.SH', '601212.SH', '601216.SH', '601225.SH', '601229.SH', '601231.SH', '601236.SH', '601238.SH', '601288.SH', '601298.SH', '601318.SH', '601319.SH', '601328.SH', '601336.SH', '601360.SH', '601377.SH', '601390.SH', '601398.SH', '601555.SH', '601577.SH', '601600.SH', '601601.SH', '601607.SH', '601618.SH', '601628.SH', '601633.SH', '601658.SH', '601668.SH', '601669.SH', '601688.SH', '601698.SH', '601727.SH', '601766.SH', '601788.SH', '601800.SH', '601808.SH', '601816.SH', '601818.SH', '601828.SH', '601838.SH', '601857.SH', '601877.SH', '601878.SH', '601881.SH', '601888.SH', '601898.SH', '601899.SH', '601901.SH', '601916.SH', '601919.SH', '601933.SH', '601939.SH', '601985.SH', '601988.SH', '601989.SH', '601992.SH', '601997.SH', '601998.SH', '603019.SH', '603156.SH', '603160.SH', '603259.SH', '603260.SH', '603288.SH', '603369.SH', '603501.SH', '603658.SH', '603799.SH', '603833.SH', '603899.SH', '603986.SH', '603993.SH'}

get_continuous_symbol-取连续合约标的

  • 传入连续合约代码,获取对应的实际的标的代码。期货专用。

函数原型:

virtual std::string get_continuous_symbol(const std::string &maincfs, int trade_date) = 0;

参数:

参数 类型 是否必填 说明
maincfs string 连续合约的代码,包括主力、次主力合约,当月、次月、下季、隔季连续合约
trade_date int 指定某个交易日,不填则默认为回测当天。形式为YYYYMMDD

返回值:连续合约对应的期货代码。

示例:

//获取主力合约在某交易日对应的标准合约
[In]:
    sApi->get_continuous_symbol("jmZ0.CF", 20180820);
[Out]:
    jm1901.CF

get_appointed_symbols-取某合约集合

  • 获取指定合约集合,如主力合约集合,次主力合约集合。

函数原型:

virtual std::vector<std::string> get_appointed_symbols(const std::string &appoint_type, int trade_date) = 0;

参数:

参数 类型 是否必填 说明
appoint_type string 指定合约的类型
Z0:主力合约;Z1:次主力合约
M0:当月连续;M1:下月连续;M3:下季连续;M6:隔季连续
trade_date int 交易日 ,形式为YYYYMMDD

返回值: 返回指定合约集合的vector容器

示例:

//获取Z0合约集合
[In]:
    sApi->get_appointed_symbols("Z0", 20200910);
[Out]:    {'APZ0.CZC', 'CFZ0.CZC', 'CJZ0.CZC', 'CYZ0.CZC', 'FGZ0.CZC', 'ICZ0.CFE', 'IFZ0.CFE', 'IHZ0.CFE', 'JRZ0.CZC', 'LRZ0.CZC', 'MAZ0.CZC', 'OIZ0.CZC', 'PMZ0.CZC', 'RIZ0.CZC', 'RMZ0.CZC', 'RSZ0.CZC', 'SFZ0.CZC', 'SMZ0.CZC', 'SRZ0.CZC', 'TAZ0.CZC', 'TFZ0.CFE', 'TSZ0.CFE', 'TZ0.CFE', 'URZ0.CZC', 'WHZ0.CZC', 'ZCZ0.CZC', 'aZ0.DCE', 'agZ0.SHF', 'alZ0.SHF', 'auZ0.SHF', 'bZ0.DCE', 'bbZ0.DCE', 'buZ0.SHF', 'cZ0.DCE', 'csZ0.DCE', 'cuZ0.SHF', 'ebZ0.DCE', 'egZ0.DCE', 'fbZ0.DCE', 'fuZ0.SHF', 'hcZ0.SHF', 'iZ0.DCE', 'jZ0.DCE', 'jdZ0.DCE', 'jmZ0.DCE', 'lZ0.DCE', 'mZ0.DCE', 'niZ0.SHF', 'nrZ0.INE', 'pZ0.DCE', 'pbZ0.SHF', 'ppZ0.DCE', 'rbZ0.SHF', 'rrZ0.DCE', 'ruZ0.SHF', 'scZ0.INE', 'snZ0.SHF', 'spZ0.SHF', 'ssZ0.SHF', 'vZ0.DCE', 'wrZ0.SHF', 'yZ0.DCE', 'znZ0.SHF'}

//获取Y1合约集合
[In]:
    sApi->get_appointed_symbols("Y1", 20200910);
[Out]:    {'ag2101.SHF', 'cu2101.SHF', 'rb2101.SHF', 'ru2101.SHF', 'zn2101.SHF', 'm2101.DCE', 'i2101.DCE', 'l2101.DCE', 'y2101.DCE', 'pp2101.DCE', 'p2101.DCE', 'j2101.DCE', 'jd2101.DCE', 'FG2101.CZC', 'RM2101.CZC', 'TA2101.CZC', 'SR2101.CZC', 'MA2101.CZC', 'ni2101.SHF', 'al2101.SHF', 'bu2101.SHF', 'pb2101.SHF', 'hc2101.SHF', 'sn2101.SHF', 'wr2101.SHF', 'jm2101.DCE', 'c2101.DCE', 'cs2101.DCE', 'v2101.DCE', 'bb2101.DCE', 'a2101.DCE', 'b2101.DCE', 'fb2101.DCE', 'ZC2101.CZC', 'RI2101.CZC', 'SF2101.CZC', 'LR2101.CZC', 'SM2101.CZC', 'JR2101.CZC', 'WH2101.CZC', 'PM2101.CZC', 'OI2101.CZC', 'CF2101.CZC', 'AP2101.CZC', 'CY2101.CZC', 'sc2101.INE', 'fu2101.SHF', 'sp2101.SHF', 'eg2101.DCE', 'rr2101.DCE', 'nr2101.INE', 'UR2101.CZC', 'CJ2101.CZC', 'ss2101.SHF', 'eb2101.DCE', 'SA2101.CZC'}

is_suspend-是否停牌

  • 判断标的当日是否停止交易。所传日期若为非交易日则返回True。

  • 如若所传symbol是港股,所传日期是A股的交易日,而不是港股的交易日,返回值是True;

  • 如若所传symbol是A股,所传日期是港股的交易日,而不是A股的交易日,返回值也是True;

函数原型:

virtual bool is_suspend(const std::string &symbol, int trade_date) = 0;

参数:

参数 类型 是否必填 说明
symbol string 策略中的证券代码
trade_date int 交易日,形式为YYYYMMDD,可以查询历史上的状态

返回值:返回True表示停牌,返回False表示未停牌

示例:

//获取000001.SZ在20200904是否停牌
[In]:
    sApi->is_suspend("000001.SZ", 20200904);
[Out]:
    0

is_ST-是否ST股

  • 判断标的指定日期时是否ST股

函数原型:

virtual bool is_ST(const std::string &symbol, int trade_date) = 0;

参数:

参数 类型 是否必填 说明
symbol string 策略中的证券代码
trade_date int 交易日,形式为YYYYMMDD,可以查询历史上的状态

返回值:返回True表示ST股,返回False表示非ST股

示例:

//获取000001.SZ在20180104是否ST
[In]:
    sApi->is_ST("000001.SZ", 20180104);    
[Out]:
    0

is_listed-是否上市

  • 判断标的指定日期时是否上市

函数原型:

virtual bool is_listed(const std::string &symbol, int trade_date) = 0;

参数:

参数 类型 是否必填 说明
symbol string 策略中的证券代码
trade_date int 交易日,形式为YYYYMMDD,可以查询历史上的状态

返回值:返回True表示上市,返回False表示未上市或者已退市

示例:

//获取000001.SZ在20180104是否上市
[In]:
     sApi->is_listed("000001.SZ",20180104);
[Out]:
    1

is_trading_now-标的是否正处于交易时间

函数原型:

virtual bool is_trading_now(const std::string &symbol) = 0;

参数:

参数 类型 是否必填 说明
symbol string 策略中的证券代码

示例:

[In]:
    sApi->is_trading_now("IFZ0.CFE"); 
[Out]:
    1

is_focus_symbol-标的是否被关注

函数原型:

virtual bool is_focus_symbol(const std::string &symbol) = 0;

参数:

参数 类型 是否必填 说明
symbol string 标的代码

返回值:如果该symbol被关注则返回true;否则返回false。

示例:

[In]:
    sApi->is_focus_symbol("000001.SZ");
[Out]:
    1

get_symbol_pool-获取当前标的池所有标的

函数原型:

virtual std::vector<std::string> get_symbol_pool() = 0;

参数:

返回值:返回symbol的vector容器

示例:

//获取当前标的池中所有的标的(关注的上证50成分股)
[In]:
    sApi->get_symbol_pool()
[Out]:    {600000.SH,600009.SH,600016.SH,600028.SH,600030.SH,600031.SH,600036.SH,600048.SH,600050.SH,600104.SH,600196.SH,600276.SH,600309.SH,600519.SH,600547.SH,600585.SH,600588.SH,600690.SH,600703.SH,600745.SH,
600837.SH,600887.SH,601012.SH,601066.SH,601088.SH,601138.SH,601166.SH,601186.SH,601211.SH,601236.SH,601288.SH,601318.SH,601319.SH,601328.CS,601336.CS,601398.CS,601601.CS,601628.SH,601658.SH,601668.SH,
601688.SH,601816.SH,601818.SH,601857.SH,601888.SH,601988.SH,601989.SH,603160.SH,603259.SH,603993.SH}

数据函数

get_bars_history-取历史K线数据-单标的

  • 获取历史K线数据是从调用on_before_market_open/on_bar/on_handle_data这几个回调函数所处时刻开始向前的获取K线的数据,这样可以确保不能获取到未来数据,保证回测的科学性。
  • 调用此api之前需在config文件中设置好需要下载的K线类型/标的/因子/缓存条数,否则可能取不到字段值。
  • 单symbol返回的通用数据结果集的表格式是固定的,所输出的列是固定的。用户在配置BarOptions,只需设置复权模式。

函数原型:

virtual DataFramePtr
get_bars_history(const std::string &symbol, const std::string &timespan, int count, const BarOptions &options = BarOptions()) = 0;

参数:

参数 类型 是否必填 说明
symbol string 标的代码
timespan string k线类型,支持的K线类型有日K/一分钟K/五分钟K/十五分钟K/三十分钟K/小时K,对应的参数如下:
日K: 1day
一分钟K:1min
五分钟K:5min
十五分钟:15min
三十分钟:30min
小时K:60min
count int 获取历史数据条数,超过缓存的数据根据预定的规则。
options BarOptions 获取K线配置参数,可缺省。默认为前复权,支持的全部field:"high", "low", "open", "close", "pre_close", "settle", "pre_settle", "volume", "turnover", "total_volume", "total_turnover", "position"
单symbol取K线时只用设置复权模式:
前复权:BarOptions("pre")
后复权:BarOptions("post")
不复权:BarOptions("real")
是否跳过停牌:
跳过停牌:true,默认为true,前值填充
不跳过停牌:false,Nan填充
详见BarOptions

返回值: 类型为DataFramePtr(std::shared_ptr<FactorDataFrame>),使用该返回值之前需要判断指针是否为nullptr,直接使用可能会报错,采用这种返回值的类型的好处:

  1. 输出结果成表格式输出,清晰明了。

  2. 可以按列取值,相同属性比较更加方便。

TIPS:

  • KBar的字段对应的类型:

    double: high、low、open、close、pre_close、settle、pre_settle、volume、turnover、total_volume、total_turnover、position

    string: symbol

    int64_t: trade_date、time_stop

    需要注意的是:time_stop虽然存储的格式是int64_t,但是为了方便用户查看,故意打印成time_str的格式:20200803-150000-000。

    详见Bar

示例1:

//获取000850.SZ前复权的数据,其中20200807是除权除息日,BarOptions取默认配置
[In]:
    string symbols = "000850.SZ"; 
    auto etaBars2 = sApi->get_bars_history(symbols, "1day", 5);
    cout << etaBars2->print() << endl;
[Out]:
      symbol      trade_date              time_stop            high             low            open           close       pre_close          settle      pre_settle          volume        turnover    total_volume    total_turnover        position         suspend    
   000850.SZ        20200803    20200803-150000-000         3.91871         3.67194         3.67194         3.89897             3.7               0               0     2.42597e+07     9.40994e+07     2.42597e+07     9.40994e+07               0               0    
   000850.SZ        20200804    20200804-150000-000         3.87922         3.80026         3.83974            3.82            3.95               0               0     2.14445e+07     8.33882e+07     2.14445e+07     8.33882e+07               0               0    
   000850.SZ        20200805    20200805-150000-000         3.86935         3.76078            3.82         3.85948            3.87               0               0     1.18386e+07     4.57471e+07     1.18386e+07     4.57471e+07               0               0    
   000850.SZ        20200806    20200806-150000-000         3.87922         3.76078         3.87922            3.82            3.91               0               0     1.06162e+07     4.09787e+07     1.06162e+07     4.09787e+07               0               0    
   000850.SZ        20200807    20200807-150000-000            3.83             3.7            3.83            3.75            3.82               0               0     7.17645e+06     2.69941e+07     7.17645e+06     2.69941e+07               0               0    
[5 rows x 16 kbar_columns]

示例2:

//获取000850.SZ不复权的数据,其中20200807是除权除息日
//配置options参数为不复权
[In]:
    string symbols = "000850.SZ"; 
    auto etaBars2 = sApi->get_bars_history(symbols, "1day", 5, BarOptions("real"));
    cout << etaBars2->print() << endl;
[Out]:
      symbol      trade_date              time_stop            high             low            open           close       pre_close          settle      pre_settle          volume        turnover    total_volume    total_turnover        position         suspend    
   000850.SZ        20200803    20200803-150000-000            3.97            3.72            3.72            3.95             3.7               0               0     2.42597e+07     9.40994e+07     2.42597e+07     9.40994e+07               0               0    
   000850.SZ        20200804    20200804-150000-000            3.93            3.85            3.89            3.87            3.95               0               0     2.14445e+07     8.33882e+07     2.14445e+07     8.33882e+07               0               0    
   000850.SZ        20200805    20200805-150000-000            3.92            3.81            3.87            3.91            3.87               0               0     1.18386e+07     4.57471e+07     1.18386e+07     4.57471e+07               0               0    
   000850.SZ        20200806    20200806-150000-000            3.93            3.81            3.93            3.87            3.91               0               0     1.06162e+07     4.09787e+07     1.06162e+07     4.09787e+07               0               0    
   000850.SZ        20200807    20200807-150000-000            3.83             3.7            3.83            3.75            3.82               0               0     7.17645e+06     2.69941e+07     7.17645e+06     2.69941e+07               0               0    
[5 rows x 16 kbar_columns]

示例3:

//获取表格中symbol字段的值
[In]:
    etaBars2->get_string_column("symbol"));
[Out]:
    {000850.SZ, 000850.SZ, 000850.SZ, 000850.SZ, 000850.SZ}

//获取表格中time_stop字段的值,字段的值是int64_t类型,以表格式打印时显示的time_str的类型
[In]:
    etaBars2->get_int_column("time_stop"));
[Out]:
    {1595919600000, 1596006000000, 1596092400000, 1596178800000, 1596438000000}

//获取表格中open字段的值
[In]:
    etaBars2->get_double_column("open"));
[Out]:
    {3.59, 3.62, 3.71, 3.66, 3.72}

get_bars_history-取历史K线数据-多标的

  • 获取历史K线数据是从调用on_before_market_open/on_bar/on_handle_data这几个回调函数所处时刻开始向前的获取K线的数据,这样可以确保不能获取到未来数据,保证回测的科学性。
  • 调用此api之前需在config文件中设置好需要下载的K线类型/标的/因子/缓存条数,否则可能取不到字段值。
  • 一组symbols返回的通用数据结果集的表格式是比较灵活的,所输出的列是根据用户配置来决定的。BarOptions中可以配置复权模式和所需要的列。
  • 建议在取较多symbol时,尽量只取需要的字段,这样可以减少数据的处理从而提高回测的速度,模拟盘的话相应不大。

函数原型:

virtual std::map<std::string, DataFramePtr>
get_bars_history(const std::vector<std::string> &symbols, const std::string &timespan, int count, const BarOptions &options = BarOptions()) = 0;

参数:

参数 类型 是否必填 说明
symbols std::vector<std::string> 一组symbol
timespan EBarTimespan k线类型,支持的K线类型有日K/一分钟K/五分钟K/十五分钟K/三十分钟K/小时K,对应的参数如下:
日K: 1day
一分钟K:1min
五分钟K:5min
十五分钟:15min
三十分钟:30min
小时K:60min
count int 获取历史数据条数,超过缓存的数据根据预定的规则。
options BarOptions 获取K线配置参数,可缺省。默认为前复权,支持的全部field:"high", "low", "open", "close", "pre_close", "settle", "pre_settle", "volume", "turnover", "total_volume", "total_turnover", "position"
配置BarOptions,只用设置复权模式和所需的字段:
前复权所有字段:BarOptions("pre")
后复权所有字段:BarOptions("post")
不复权所有字段:BarOptions("real")
前复权开盘价:BarOptions("pre",{"open"})
后复权收盘价:BarOptions("post",{"close"})
不复权最高价:BarOptions("real",{"high"})
前复权开盘价/收盘价/最高价/最低价:BarOptions("pre",{"open", "close", "high", "low"})
后复权开盘价/收盘价/最高价/最低价:BarOptions("post",{"open", "close", "high", "low"})
不复权开盘价/收盘价/最高价/最低价:BarOptions("real",{"open", "close", "high", "low"})
是否跳过停牌:
跳过停牌:true,默认为true,前值填充
不跳过停牌:false,Nan填充
详见BarOptions

返回值: std::map,其中DataFramePtr为std::shared_ptr<FactorDataFrame>,使用该返回值时需要对map中的指针判断是否为nullptr,直接使用可能会报错。此处返回fieldDataFramePtr组成map,其中field对应字段名。每个表的数据默认包含两个公共字段:time_stoptrade_date,另外每个symbol的代码作为列名,值对应的field都是相同的,这样便于比较不同symbol相同时刻的K线的某个属性。

TIPS:

  • KBar的字段对应的类型:

    double: high、low、open、close、pre_close、settle、pre_settle、volume、turnover、total_volume、total_turnover、position

    string: symbol

    int64_t: trade_date、time_stop

    需要注意的是:time_stop虽然存储的格式是int64_t,但是为了方便用户查看,故意打印成time_str的格式:20200803-150000-000。

    详见Bar

示例1:

//获取000001.SZ、000005.SZ、000850.SZ,BarOptions取默认配置。

[In]:
    sApi->get_bars_history({"000001.SZ", "000005.SZ", "000850.SZ"}, "1day", 5);

[Out]:
close:
          time_stop      trade_date       000001.SZ       000005.SZ       000850.SZ    
20200804-150000-000        20200804           14.04            3.03            3.82    
20200805-150000-000        20200805           13.76            3.07         3.85948    
20200806-150000-000        20200806            13.9            3.02            3.82    
20200807-150000-000        20200807            13.7            2.94            3.75    
20200810-150000-000        20200810           13.95            2.99            3.84    
[5 rows x 5 kbar_columns]

high:
          time_stop      trade_date       000001.SZ       000005.SZ       000850.SZ    
20200804-150000-000        20200804           14.15            3.07         3.87922    
20200805-150000-000        20200805           13.85             3.1         3.86935    
20200806-150000-000        20200806           13.96            3.07         3.87922    
20200807-150000-000        20200807            13.9            3.01            3.83    
20200810-150000-000        20200810           14.02               3            3.86    
[5 rows x 5 kbar_columns]

·
·    //取全部的字段结果太长,此处只显示部分
·       

turnover:
          time_stop      trade_date       000001.SZ       000005.SZ       000850.SZ    
20200804-150000-000        20200804               0               0               0    
20200805-150000-000        20200805               0               0               0    
20200806-150000-000        20200806               0               0               0    
20200807-150000-000        20200807               0               0               0    
20200810-150000-000        20200810               0               0               0    
[5 rows x 5 kbar_columns]

volume:
          time_stop      trade_date       000001.SZ       000005.SZ       000850.SZ    
20200804-150000-000        20200804           13.59            3.04            3.95    
20200805-150000-000        20200805           14.04            3.03            3.87    
20200806-150000-000        20200806           13.76            3.07            3.91    
20200807-150000-000        20200807            13.9            3.02            3.82    
20200810-150000-000        20200810            13.7            2.94            3.75    
[5 rows x 5 kbar_columns]

示例2:

//获取000001.SZ、000005.SZ、000850.SZ,BarOptions配置成前复权,取开盘价和收盘价两个字段。
[In]:
    sApi->get_bars_history({"000001.SZ", "000005.SZ", "000850.SZ"}, "1day", 5, BarOptions("pre", {"close", "open"}));

[Out]:
close:
          time_stop      trade_date       000001.SZ       000005.SZ       000850.SZ    
20200804-150000-000        20200804           14.04            3.03            3.82    
20200805-150000-000        20200805           13.76            3.07         3.85948    
20200806-150000-000        20200806            13.9            3.02            3.82    
20200807-150000-000        20200807            13.7            2.94            3.75    
20200810-150000-000        20200810           13.95            2.99            3.84    
[5 rows x 5 kbar_columns]

open:
          time_stop      trade_date       000001.SZ       000005.SZ       000850.SZ    
20200804-150000-000        20200804           13.66            3.06         3.83974    
20200805-150000-000        20200805           13.82               3            3.82    
20200806-150000-000        20200806           13.82            3.07         3.87922    
20200807-150000-000        20200807            13.8               3            3.83    
20200810-150000-000        20200810           13.67            2.97            3.76    
[5 rows x 5 kbar_columns]

示例3:

//获取表格中time_stop字段的值,字段的值是int64_t类型,以表格式打印时显示的time_str的类型
[In]:
    df->get_int_column("time_stop"));
[Out]:
    {1596524400000, 1596610800000, 1596697200000, 1596783600000, 1597042800000}

//获取open对应的表格中000001.CS标的的open字段值
[In]:
    df->get_double_column("000001.SZ"));
[Out]:
    {13.66, 13.82, 13.82, 13.8, 13.67}

get_one_field-取单个因子数据

函数原型:

virtual DataFramePtr get_one_field(const std::string &field, const std::vector<std::string> &symbols, int start_date, int end_date, int count, bool strict = false) = 0;

参数:

参数 类型 是否必填 说明
field std::vector<std::string> 选取的股票属性,可以选择多个,需要预下载
symbols std::vector<std::string> 股票代码vector
start_date int 开始日期,形式为YYYYMMDD
end_date int 结束日期,形式为YYYYMMDD
count int 向前提取的数量,当count= 0时,取的是从开始日期到结束日期之间的数据。当count!= 0 时,取的是从结束日期开始往前取的count条数据。
strict bool 报告期是否严格对齐,采用默认值就行。

返回值:类型为DataFramePtr(std::shared_ptr<FactorDataFrame>),使用该返回值时需要判断是否为nullptr,直接使用可能会报错。

示例1:

//获取000001.SZ/000002.SZ在20200901~20200909时间段的净利润
//根据区间来取数据,count=0
[In]:
    sApi->get_one_field("NET_PROFIT", {"000001.SZ", "000002.SZ"}, 20200901, 20200909, 0);
[Out]:
  trade_date       000002.SZ       000001.SZ    
    20200901     1.86292e+10      1.3678e+10    
    20200902     1.86292e+10      1.3678e+10    
    20200903     1.86292e+10      1.3678e+10    
    20200904     1.86292e+10      1.3678e+10    
    20200907     1.86292e+10      1.3678e+10    
    20200908     1.86292e+10      1.3678e+10    
    20200909     1.86292e+10      1.3678e+10    
[7 rows x 3 kbar_columns]

示例2:

//获取000001.SZ/000002.SZ从20200909往前的count条净利润的数据
//根据count来取数据,start_date = 0
[In]:
    sApi->get_one_field("NET_PROFIT", {"000001.SZ", "000002.SZ"}, 0, 20200909, 5);
[Out]:
  trade_date       000002.SZ       000001.SZ    
    20200903     1.86292e+10      1.3678e+10    
    20200904     1.86292e+10      1.3678e+10    
    20200907     1.86292e+10      1.3678e+10    
    20200908     1.86292e+10      1.3678e+10    
    20200909     1.86292e+10      1.3678e+10

示例3:

//获取表格中000001.CS标的的近利润
[In]:
    df->get_double_column("000001.SZ"));
[Out]:
    {1.3678e+10, 1.3678e+10, 1.3678e+10, 1.3678e+10, 1.3678e+10}

get_field_one_day-取某天因子数据

函数原型:

virtual DataFramePtr get_field_one_day(const std::vector<std::string> &fields, const std::vector<std::string> &symbols, int trade_date) = 0;

参数:

参数 类型 是否必填 说明
fields std::vector<std::string> 选取的股票属性,可以选择多个,需要预下载
symbols std::vector<std::string> 股票代码vector
trade_date int 交易日,形式为YYYYMMDD

返回值:类型为DataFramePtr(std::shared_ptr<FactorDataFrame>),使用该返回值时需要判断是否为nullptr,直接使用可能会报错。

示例1:

//获取000001.SZ/000002.SZ在20200901这一天的净利润和营业收入
[In]:
sApi->get_field_one_day({"NET_PROFIT","REVENUE"}, {"000001.SZ", "000002.SZ"}, 20200901);

[Out]:
      symbol      NET_PROFIT         REVENUE    
   000001.SZ      1.3678e+10      7.8328e+10    
   000002.SZ     1.86292e+10      1.4635e+11

示例2:

//获取表格中REVENUE字段的值
[In]:
    df->get_double_column("REVENUE");
[Out]:
    {7.8328e+10, 1.4635e+11}

//获取表格中NET_PROFIT字段的值
[In]:
    df->get_double_column("NET_PROFIT");
[Out]:
    {1.3678e+10, 1.86292e+10}

get_field_one_symbol-取单个标的因子数据

函数原型:

virtual DataFramePtr get_field_one_symbol(const std::vector<std::string> &fields,  const std::string &symbol, int start_date, int end_date, int count, bool strict = false) = 0;

参数:

参数 类型 是否必填 说明
fields std::vector<std::string> 选取的股票属性,可以选择多个
symbol string 股票代码
start_date int 开始日期,形式为YYYYMMDD
end_date int 结束日期,形式为YYYYMMDD
count int 向前提取的数量,当count= 0时,取的是从开始日期到结束日期之间的数据。当count!= 0 时,取的是从结束日期开始往前取的count条数据。
strict bool 报告期是否严格对齐,直接采用默认值就行

返回值:类型为DataFramePtr(std::shared_ptr<FactorDataFrame>),使用该返回值时需要判断是否为nullptr,直接使用可能会报错。

示例1:

//获取000001.CS从20200901到20200909时间段的净利润和营业收入的数据
//根据区间来取数据,count=0
[In]:
    sApi->get_field_one_symbol({"NET_PROFIT", "REVENUE"}, "000001.SZ", 20200901, 20200909, 0);    
[Out]:
  trade_date         REVENUE      NET_PROFIT    
    20200901      7.8328e+10      1.3678e+10    
    20200902      7.8328e+10      1.3678e+10    
    20200903      7.8328e+10      1.3678e+10    
    20200904      7.8328e+10      1.3678e+10    
    20200907      7.8328e+10      1.3678e+10    
    20200908      7.8328e+10      1.3678e+10    
    20200909      7.8328e+10      1.3678e+10    
[7 rows x 3 kbar_columns]

示例2:

//获取000001.CS从20200909往前的count条净利润和营业收入的数据
//根据count来取数据,start_date = 0
[In]:
    sApi->get_field_one_symbol({"NET_PROFIT", "REVENUE"}, "000001.SZ", 0, 20200909, 5);

[Out]:
  trade_date         REVENUE      NET_PROFIT    
    20200903      7.8328e+10      1.3678e+10    
    20200904      7.8328e+10      1.3678e+10    
    20200907      7.8328e+10      1.3678e+10    
    20200908      7.8328e+10      1.3678e+10    
    20200909      7.8328e+10      1.3678e+10

示例3:

//获取表格中REVENUE字段的值
[In]:
    df->get_string_column("REVENUE");

[Out]:
    {7.8328e+10, 7.8328e+10, 7.8328e+10, 7.8328e+10, 7.8328e+10}

//获取表格中NET_PROFIT字段的值
[In]:
    df->get_string_column("NET_PROFIT");

[Out]:
    {1.3678e+10, 1.3678e+10, 1.3678e+10, 1.3678e+10, 1.3678e+10}

get_table_data-取表格数据

函数原型:

virtual DataFramePtr get_table_data( const std::string &field, const std::vector<std::string> &symbols, int start_date, int end_date, int count, const std::vector<std::string> &columns = std::vector<std::string>()) = 0;

参数:

参数 类型 是否必填 说明
field string 因子名
symbols std::vector<std::string> 一组股票代码
start_date int 开始日期,形式为YYYYMMDD
end_date int 结束日期,形式为YYYYMMDD
count int 向前提取的数量,当count= 0时,取的是从开始日期到结束日期之间的数据。当count!= 0 时,取的是从结束日期开始往前取的count条数据。
columns std::vector<std::string> 表内字段,默认获取因子数据的所有字段。

返回值:类型为DataFramePtr(std::shared_ptr<FactorDataFrame>),使用该返回值时需要判断是否为nullptr,直接使用可能会报错。

示例1:

//根据时间区段来获取主力期货排名数据,count=0
[In]:
    sApi->get_table_data("FUT_SHORT_RANK", {"rb1910.SHF"}, 20190301, 20190304, 0);
[Out]:
  trade_date          symbol            rank            name          volume      volumeDiff    
    20190301       rb1910.SHF               1    鲁证期货             51326            -828    
    20190301       rb1910.SHF               2    银河期货             40790            6459    
    20190301       rb1910.SHF               3    永安期货             26222           -1200    
    20190301       rb1910.SHF               4    方正中期             21602           -7821    
    20190301       rb1910.SHF               5    国泰君安             21375             -48    
    20190301       rb1910.SHF               6    信达期货             16654              25    
    20190301       rb1910.SHF               7    中信期货             16331           -1127    
    20190301       rb1910.SHF               8    中粮期货             14786             395    
    20190301       rb1910.SHF               9    东海期货             11557              25    
    20190301       rb1910.SHF              10    东证期货              9716            -188    
    20190301       rb1910.SHF              11    五矿经易              9200            -926    
    20190301       rb1910.SHF              12    天风期货              6930           -1675    
    20190301       rb1910.SHF              13    国贸期货              6593              39    
    20190301       rb1910.SHF              14    新湖期货              6261            -199    
    20190301       rb1910.SHF              15    光大期货              6018             208    
    20190301       rb1910.SHF              16    东吴期货              5740            -980    
    20190301       rb1910.SHF              17    华泰期货              5138            -669    
    20190301       rb1910.SHF              18    浙商期货              4331            -805    
    20190301       rb1910.SHF              19    海证期货              3965             614    
    20190301       rb1910.SHF              20    海通期货              3845              -5    
    20190304       rb1910.SHF               1    鲁证期货             51219            -107    
    20190304       rb1910.SHF               2    银河期货             36857           -3933    
    20190304       rb1910.SHF               3    永安期货             26257              35    
    20190304       rb1910.SHF               4    国泰君安             21804             429    
    20190304       rb1910.SHF               5    方正中期             19561           -2041    
    20190304       rb1910.SHF               6    中信期货             18407            2076    
    20190304       rb1910.SHF               7    信达期货             16668              14    
    20190304       rb1910.SHF               8    中粮期货             14687             -99    
    20190304       rb1910.SHF               9    东海期货             12171             614    
    20190304       rb1910.SHF              10    五矿经易             11466            2266    
    20190304       rb1910.SHF              11    东证期货             10220             504    
    20190304       rb1910.SHF              12    天风期货              9043            2113    
    20190304       rb1910.SHF              13    海通期货              7491            3646    
    20190304       rb1910.SHF              14    光大期货              6724             706    
    20190304       rb1910.SHF              15    国贸期货              6690              97    
    20190304       rb1910.SHF              16    新湖期货              6370             109    
    20190304       rb1910.SHF              17    东吴期货              5993             253    
    20190304       rb1910.SHF              18    华泰期货              4750            -388    
    20190304       rb1910.SHF              19    浙商期货              4237             -94    
    20190304       rb1910.SHF              20    海证期货              4093             128      
[40 rows x 6 kbar_columns]

示例2:

//根据count来获取期货主力排名数据,start_date = 0
[In]:
    sApi->get_table_data("FUT_SHORT_RANK", {"rb1910.SHF"}, 0, 20190305, 1);
[Out]:
  trade_date          symbol            rank            name          volume      volumeDiff    
    20190305       rb1910.SHF               1    鲁证期货             49779           -1440    
    20190305       rb1910.SHF               2    银河期货             36840             -17    
    20190305       rb1910.SHF               3    永安期货             26227             -30    
    20190305       rb1910.SHF               4    国泰君安             24864            3060    
    20190305       rb1910.SHF               5    中信期货             20030            1623    
    20190305       rb1910.SHF               6    信达期货             19373            2705    
    20190305       rb1910.SHF               7    方正中期             18976            -585    
    20190305       rb1910.SHF               8    中粮期货             14457            -230    
    20190305       rb1910.SHF               9    东海期货             12381             210    
    20190305       rb1910.SHF              10    东证期货             10303              83    
    20190305       rb1910.SHF              11    五矿经易              9823           -1643    
    20190305       rb1910.SHF              12    天风期货              8848            -195    
    20190305       rb1910.SHF              13    海通期货              7150            -341    
    20190305       rb1910.SHF              14    国贸期货              6679             -11    
    20190305       rb1910.SHF              15    新湖期货              6364              -6    
    20190305       rb1910.SHF              16    东吴期货              5907             -86    
    20190305       rb1910.SHF              17    光大期货              5701           -1023    
    20190305       rb1910.SHF              18    华泰期货              5650             900    
    20190305       rb1910.SHF              19    申万期货              5490            1630    
    20190305       rb1910.SHF              20    国富期货              4559             666    
[20 rows x 6 kbar_columns]

示例3:

//获取指定column字段的主力期货排名数据
[In]:
    sApi->get_table_data("FUT_SHORT_RANK", {"rb1910.SHF"}, 0, 20190305, 1, {"trade_date", "symbol", "rank", "name"});    
[Out]:
trade_date          symbol            rank            name    
    20190305       rb1910.SHF               1    鲁证期货      
    20190305       rb1910.SHF               2    银河期货      
    20190305       rb1910.SHF               3    永安期货      
    20190305       rb1910.SHF               4    国泰君安      
    20190305       rb1910.SHF               5    中信期货      
    20190305       rb1910.SHF               6    信达期货      
    20190305       rb1910.SHF               7    方正中期      
    20190305       rb1910.SHF               8    中粮期货      
    20190305       rb1910.SHF               9    东海期货      
    20190305       rb1910.SHF              10    东证期货      
    20190305       rb1910.SHF              11    五矿经易      
    20190305       rb1910.SHF              12    天风期货      
    20190305       rb1910.SHF              13    海通期货      
    20190305       rb1910.SHF              14    国贸期货      
    20190305       rb1910.SHF              15    新湖期货      
    20190305       rb1910.SHF              16    东吴期货      
    20190305       rb1910.SHF              17    光大期货      
    20190305       rb1910.SHF              18    华泰期货      
    20190305       rb1910.SHF              19    申万期货      
    20190305       rb1910.SHF              20    国富期货      
[20 rows x 4 kbar_columns]

其他函数

get_strategy_info-获取策略信息

函数原型:

virtual StrategyInfo get_strategy_info() = 0;

参数:

返回值:策略信息StrategyInfo

示例:

auto stratety_info = sApi->get_strategy_info();

is_back_test-是否是回测模式

函数原型:

virtual bool is_back_test() = 0;

参数:

返回值:如果是回测模式则返回true;否则返回false。

示例:

auto is_back_test = sApi->is_back_test();

is_real_env-是否是实盘环境

函数原型:

virtual bool is_real_env() = 0;

参数:

返回值:如果是模拟盘返回true;否则返回false。

示例:

auto is_real_env = sApi->is_real_env();

get_value_type-获取动态运行参数类型

函数原型:

virtual std::string get_value_type(const std::string &dynamic_param) = 0;

参数:

参数 类型 是否必填 说明
dynamic_param string 动态参数名称

返回值:返回string类型的参数类型(int64_t、double、string)

示例:

auto param_type = sApi->get_value_type("ABC");

get_value_as_string-获取动态运行参数1

  • 使用此接口时需要先在web界面上创建策略参数,该参数是动态可修改的。

函数原型:

virtual std::string get_value_as_string(const std::string &dynamic_param) = 0;

参数:

参数 类型 是否必填 说明
dynamic_param string 动态参数名称

返回值:返回string类型的动态策略参数

示例:

auto dparam = sApi->get_value_as_string("ABC");

get_value_as_long-获取动态运行参数2

  • 使用此接口时需要先在web界面上创建策略参数,该参数是动态可修改的。

函数原型:

virtual int64_t get_value_as_long(const std::string &dynamic_param) = 0;

参数:

参数 类型 是否必填 说明
dynamic_param string 动态参数名称

返回值:返回int64_t类型的动态策略参数

示例:

auto dparam = sApi->get_value_as_long("ABC");

get_value_as_double-获取动态运行参数3

  • 使用此接口时需要先在web界面上创建策略参数,该参数是动态可修改的。

函数原型:

virtual double get_value_as_double(const std::string &dynamic_param) = 0;

参数:

参数 类型 是否必填 说明
dynamic_param string 动态参数名称

返回值:返回double类型的动态策略参数

示例:

auto dparam = sApi->get_value_as_double("ABC");

get_version-获取当前sdk的版本号

获取当前sdk的版本信息

函数原型:

virtual std::string get_version() = 0;

参数:

示例:

cout << "sdk version: " << sApi->get_version() << endl;

send_custom_message-设置用户消息

  • 设置用户自定义运行消息,会显示在web界面上的日志中

函数原型:

void send_custom_message(const std::string &msg);

参数:

参数 类型 说明
msg string 内容

示例:

sApi->send_custom_message("this is a test message from sdk to web!");

数据结构

BarOptions-获取K线配置参数

struct ETA_DLL_API BarOptions
{
    std::string price_mode = "pre";              // 默认为前复权,支持pre, post, real
    bool pre_fill = true;                        // 默认为前值填充
    std::vector<std::string> fields = {"high", "low", "open", "close", "pre_close", "settle", "pre_settle", "volume", "turnover", "total_volume", "total_turnover", "position"};           //需要的字段
    std::string alignment;                       // 默认不对齐,多个symbol的对齐方式

    BarOptions(std::string price_mode, bool pre_fill, std::vector<std::string> fields, std::string alignment = "") : price_mode(std::move(price_mode)), pre_fill(std::move(pre_fill)), fields(std::move(fields)), alignment(std::move(alignment)) {};

    explicit BarOptions(std::string price_mode, bool pre_fill = true) : price_mode(std::move(price_mode)), pre_fill(std::move(pre_fill)) {};

    BarOptions() = default;

};

RefData-股票基础信息

struct RefData
{
    std::string             symbol          = "";       //标的
    std::string             exchange        = "";       //交易所
    std::string             market             = "";       //市场名称

    std::string             currency        = "";       //币种
    double                  lot_size        = 0;        //一手数目
    std::string             name            = "";       //标的默认名字

    std::string             exchange_symbol = "";       //交易所原始symbol名称
    std::string             trade_market    = "";       //该标的对应的交易市场

    int32_t                 max_order_vol   = 0;        //最大委托数量
    int32_t                 min_order_vol   = 0;        //最小委托数量

    int32_t                 list_date       = 0;        //上市日
    int32_t                 last_trade_date = 0;        //最后交易日
    int32_t                 tplus           = 0;        //成交T+n
    double                  price_tick      = 0;        //标的价格浮动最小单位值
    bool                    is_expired      = false;    //是否已经过期的标的,比如退市,合约交割完毕
    bool                    short_sellable  = false;    //是否可以卖空

    //期货专属
    std::string             product_name    = "";       //品种名称
    int32_t                 value_per_unit  = 0;        //每单位价值
    double                  margin_rate     = 0;        //担保金比例%
    double                  long_margin_rate = 0;       //多头担保金 0~1
    double                  short_margin_rate = 0;      //空头担保金 0~1
    double                  setting_margin_rate = 0;    //当前合约保证金比例,如何没有设置则以交易所最低为准 0~1

    bool                    is_standard     = false;    //是否是交易所标准标的, 比如主力合约就不是(量化平台自己算的)

    //A股
};

Bar-K线数据

struct Bar
{
    std::string             symbol          = "";   //交易日
    int32_t                 trade_date      = 0;    //时间戳
    int64_t                 time_stop       = 0;    //K线区间的秒数,目前支持 60(1min), 300(5min),1800(30min), 3600(60min), 86400(day)
    std::string             timespan        = 0;    //k线类型
    double                  high            = 0;    //交易日最低价
    double                  low             = 0;    //交易日开盘价
    double                  open            = 0;    //交易日收盘价
    double                  close           = 0;    //成交量
    double                  volume          = 0;    //成交额
    double                  turnover        = 0;    //累计成交量
    double                  total_volume    = 0;    //累计成交额
    double                  total_turnover  = 0;    //昨收
    double                  pre_close       = 0;    //持仓
    double                  position        = 0;    //结算价(期货)
    double                  settle          = 0;    //昨结价(期货)
    double                  pre_settle      = 0;    //无交易期间是否填充的(默认不填充)
    bool                    is_suspended    = false;//标准时间
    std::string             timestamp       = "";
};

SymbolPosition-策略的标的持仓

  • 某一个策略中某只标的的仓位信息。
struct SymbolPosition
{
    PositionSide position_side;
    std::string symbol;                             //标的
    double pos_qty = 0;                             //仓位股数 (double)
    double pos_daily_qty = 0;                       //今日仓位股数 (double)
    double pos_price = 0;                           //仓位进仓价 (double)
    double pos_high = 0;                            // 持仓最高价 (double)
    double pos_low = 0;                             // 持仓最低价 (double)
    int64_t pos_time = 0;                           // 持仓时间 (double)
    double pos_ur_pnl = 0;                          // 仓位浮动盈亏 (double)
    double available_qty = 0;                       // 可平仓数量(计算出来,目前因为多账户问题意义不明确)
    double daily_ur_pnl = 0;                        // 今日浮动盈亏,现价-昨收价(结算价-期货),每日结算清零
    int pos_trade_date = 0;                         //持仓交易日(20170101)
    double pos_margin = 0;                          // 仓位保证金
    double pos_market_value = 0;                    // 仓位市值
    double pos_daily_overall_pnl = 0;               // 当日盈亏
};

StrategyPnL-策略的盈亏信息

  • 策略的整体盈亏信息。
struct StrategyPnL
{
    std::string id;                 //策略id
    double overall_pnl = 0;         //策略盈亏
    double ur_pnl = 0;              //策略的浮动盈亏
    double daily_pnl = 0;           //策略当日盈亏
    double total_commission = 0;    //总手续费
};

OverallPosition-账户的标的持仓

  • 由于多个策略可以共享账户资金,因此可能会存在多个策略中都持有某个标的的情况,账户中会将多个策略中标的信息进行汇总。
struct OverallPosition
{
    std::string account_id;                 //账户ID
    std::string symbol;                     //合约
    double buy_price = 0;                   //加权平均买价(开仓/平仓所有数据加权平均)
    double sell_price = 0;                  //加权平均卖价
    double buy_qty = 0;                     //买数量
    double sell_qty = 0;                    //卖数量
    double last_ur_pnl = 0;                 //最后成交价算的盈亏(以OpenPosition计算)
    double long_available_qty = 0;          //多仓可以平仓数量(计算出来)
    double short_available_qty = 0;         //空仓可以平仓数量(计算出来)
    double long_qty = 0;                    //多仓数量
    double short_qty = 0;                   //空仓数量
    double long_price = 0;                  //多仓开仓均价
    double short_price = 0;                 //空仓开仓均价
    double long_last_ur_pnl = 0;            //多仓浮动盈亏
    double short_last_ur_pnl = 0;           //空仓浮动盈亏
    double long_margin = 0;                 //多仓占用保证金
    double short_margin = 0;                //空仓占用保证金
    double long_market_value = 0;           //多仓持仓市值
    double short_market_value = 0;          //空仓持仓市值
};

Account-账户信息

struct Account
{
    std::string id;                            //账户 id(userId-market)
    std::string market;                        //市场
    std::string currency;                      //账户币种(CNY)
    double daily_pnl = 0;                      //当天盈亏 - 清算时候清零
    double ur_last_pnl = 0;                    //浮动盈亏 - 按最后价算
    double all_time_pnl = 0;                   //盈亏
    double cash_deposited = 0;                 //存入现金(所有加入的现金)
    double cash_available = 0;                 //可用现金
    double cash           = 0;                 //现金
    double unit_value = 0;                     //账户基金价值
    double margin = 0;                         //现金分红
    double bonus = 0;                          //持仓占用资金
    double market_value = 0;                   //持仓市值
    double tot_assets = 0;                     //总资产
    double total_commission = 0;               //总手续费
};

TradeOrder-订单委托信息

struct TradeOrder
{
    std::string             symbol          = "";       //证券代码
    std::string             channel_id      = "";       //渠道号
    std::string             serial_id       = "";       //序列号
    int32_t                 qty             = 0;        //量
    double                  price           = 0;        //价
    EOrderSide              direction;                  //买卖方向
    EOrderType              order_type;                 //下单类型
    int64_t                 timestamp       = 0;        //下单时间
    std::vector<SubTrans>   trans;                      //相匹配的成交单数据
};

OrderUpdate-订单更新信息

struct OrderUpdate
{
    std::string symbol;
    std::string trade_account;

    OrderSide side;
    PositionSide position_side;
    PositionEffect position_effect;
    OrderType order_type;
    OrderStatus order_status;
    TimeInForce tif;
    ExecType exec_type;

    double qty;
    double price;
    double cum_qty;
    double avg_px;
    double commission;

    std::string id;
    std::string user_id;
    std::string account_id;
    std::string strategy_id;
    std::string portfolio_id;
    std::string external_order_id;

    int32_t trade_date;
    int64_t created;
    int64_t modified;
};

OrderStatusUpdate-订单状态更新

struct ETA_DLL_API OrderStatusUpdate
{
    std::string symbol;
    std::string trade_account;

    OrderSide side;
    PositionSide position_side;
    PositionEffect position_effect;
    OrderType order_type;
    OrderStatus order_status;
    TimeInForce tif;

    double qty;
    double price;
    double cum_qty;
    double avg_px;
    double commission;

    std::string id;
    std::string user_id;
    std::string account_id;
    std::string strategy_id;
    std::string portfolio_id;
    std::string external_order_id;

    int32_t trade_date;
    int64_t created;
    int64_t modified;

    bool has_execution;
};

SymbolPositionList-标的策略仓位方向

struct SymbolPositionList
{
    SymbolPosition long_position;
    SymbolPosition short_position;
};

BackTestParam-回测信息

struct BackTestParam
{
    int start_date = 0;             //交易日 开始日期-20170629
    int end_date = 0;               //交易日 结束日期-20170729
    int64_t start_timestamp = 0;    //绝对时间 开始日期-20170628-20:00:00 转换成ms
    int64_t end_timestamp = 0;      //绝对时间 结束日期-20170629-15:30:00 转换成ms
};

StrategyExitInfo-策略结束信息

struct StrategyExitInfo
{
    int32_t code = 0;                 //退出代码
    std::string msg;                  //消息
    BackTestResult result;            //回测结果
};

BackTestResult-回测结果

struct BackTestResult
{
    std::string back_test_id;                   //回测ID
    double annualized_return = 0;               //年化收益率
    double maximum_drawdown = 0;                //最大回撤
    double sharpe_ratio = 0;                    //夏普比率
    double standard_annualized_return = 0;      //基准年化收益率
    int day_count = 0;                          //回测天数
    double volatility = 0;                      //策略波动率
    double strategy_return = 0;                 //策略收益
    double ur_asset = 0;                        //策略资产
    int64_t quote_count = 0;                    //回测行情数
    int64_t cost_time = 0;                      //回测耗时
    double win_ratio = 0;                       //胜率
};

ValueField-因子字段

struct ValueField
{
    int date = 0;
    int report = 0;
    double value = std::numeric_limits<double>::quiet_NaN();        // 扩展字段
    void* ptr = nullptr;                                            // 任意对象指针

    bool operator==(const ValueField &value) const;
    friend std::ostream &operator<< (std::ostream& oss, const ValueField& o);
    std::string print();
};

MarketParam-开盘数据

struct MarketParam
{
    int trade_date;         //当前交易日
};

FactorDataFrame-通用数据结果集

class FactorDataFrame {
public:
    virtual ~FactorDataFrame() = default;

    static size_t PRINT_LINE_SIZE;              //打印数据的最大行数,默认100行,其他由省略号代替
    virtual std::string print() const = 0;      //打印函数
    virtual ColumnType get_column_type(const std::string& name) const = 0;      //根据列名获取对应列的值类型
    virtual std::vector<std::string> get_columns() const = 0;                   //获取列名
    virtual const std::string & get_index_name() const = 0;                     //获取索引的名称
    virtual const std::vector<double>& get_double_column(const std::string& name) const = 0;        //根据列名获取类型为double的一列值
    virtual const std::vector<int64_t>& get_int_column(const std::string& name) const = 0;          //根据列名获取类型为double的一列值
    virtual const std::vector<std::string>& get_string_column(const std::string& name) const  = 0;  //根据列名获取类型为double的一列值
};

typedef std::shared_ptr<gQuant::FactorDataFrame> DataFramePtr;

参数可选项

市场类型

  • 类型:string
说明
CS A股市场
CF 期货
IDX 指数
HK 港股

订单执行状态

  • 类型:int
说明
1 新单
2 部成
3 已成
4 今日完结
5 撤单
6 改单
7 正在撤单
8 终止
9 拒单
10 挂起
11 报单
12 正在计算
13 过期单
14 restarted
15 正在改单

订单开平仓标志

  • 类型:int
说明
1 开仓
2 平仓
3 平今仓
4 平昨仓

订单状态

  • 类型:int
说明
0 none
1 new
2 partially_filled
3 filled
4 done_for_day
5 caceled
6 replaced
7 pending_cacel
8 stopped
9 rejected
10 suspended
11 pending_new
12 calculated
13 expired
14 accepted_for_bidding
15 pending_replace

订单时间状态

  • 类型:string
说明
DAY 订单在交易日内有效
FAK 订单必须立即执行,不能被立即执行的部分将被取消
FOK 订单必须被完全执行或者完全不执行

买卖方向

  • 类型:char
说明
buy
sell

持仓方向

  • 类型:char
说明
long 持多
short 持空

下单类型

  • 类型:int
说明
1 市价单
2 限价单

level2成交状态

  • 类型:char
说明
4 成交
F 撤单

表格数据类型

  • 类型:int
说明
2 double
3 int
4 string
5 char
6 timestamp

K线类型

  • 类型:string
说明
1day 日K
1min 1分钟K
5min 5分钟K
15min 15分钟K
30min 30分钟K
60min 60分钟K

报价列表

  • 类型:string
说明
bid1 买1价
bid2 买2价
bid3 买3价
bid4 买4价
bid5 买5价
bid6 买6价
bid7 买7价
bid8 买8价
bid9 买9价
bid10 买10价
ask1 卖1价
ask2 卖2价
ask3 卖3价
ask4 卖4价
ask5 卖5价
ask6 卖6价
ask7 卖7价
ask8 卖8价
ask9 卖9价
ask10 卖10价

订阅模式

  • 类型:string
说明
single_only 独立推送
group_only 组推送
both 两种同时推送

results matching ""

    No results matching ""