您正在查看: 2020年12月

基于Python的开源量化交易系统开发框架

开源地址: https://github.com/vnpy/vnpy

功能特点

  1. 全功能量化交易平台(vnpy.trader),整合了多种交易接口,并针对具体策略算法和功能开发提供了简洁易用的API,用于快速构建交易员所需的量化交易应用。

  2. 覆盖国内外所有交易品种的交易接口(vnpy.gateway):

    • 国内市场

      • CTP(ctp):国内期货、期权

      • CTP Mini(mini):国内期货、期权

      • CTP证券(sopt):ETF期权

      • 飞马(femas):国内期货

      • 恒生UFT(uft):国内期货、ETF期权

      • 飞创证券(sec):ETF期权

      • 宽睿(oes):国内证券(A股)、ETF期权

      • 中泰XTP(xtp):国内证券(A股)、ETF期权

      • 恒生期权(hsoption):ETF期权

      • 华鑫奇点(tora):国内证券(A股)、ETF期权

      • 飞鼠(sgit):黄金TD、国内期货

      • 金仕达黄金(ksgold):黄金TD

      • 鑫管家(xgj):期货资管

      • 融航(rohon):期货资管

      • 中汇亿达(comstar):银行间市场

    • 海外市场

      • 富途证券(futu):港股、美股

      • 老虎证券(tiger):全球证券、期货、期权、外汇等

      • Interactive Brokers(ib):全球证券、期货、期权、外汇等

      • 易盛9.0外盘(tap):全球期货

      • 直达期货(da):全球期货

      • MetaTrader 5(mt5):外汇、CFD、期货、股票

      • Alpaca(alpaca):美股(零佣金)

      • 佳兆业投资(kasia):港股

    • 数字货币

      • BitMEX(bitmex):数字货币期货、期权、永续合约

      • Bybit(bybit):数字货币永续合约

      • 币安(binance):数字货币现货

      • 币安永续(binances):数字货币永续合约

      • OKEX(okex):数字货币现货

      • OKEX永续(okexs):数字货币永续合约

      • OKEX期货(okexf):数字货币期货

      • OKEX期权(okexo):数字货币期权

      • 火币(huobi):数字货币现货

      • 火币期货(huobif):数字货币期货

      • 火币永续(huobis):数字货币永续

      • 火币期权(huobio):数字货币期权

      • Gate.io永续(gateios):数字货币永续合约

      • Deribit(deribit),数字货币期权、永续合约

      • Bitfinex(bitfinex):数字货币现货

      • Coinbase(coinbase):数字货币现货

      • Bitstamp(bitstamp):数字货币现货

      • 1Token(onetoken):数字货币券商(现货、期货)

    • 特殊应用

      • RPC服务(rpc):跨进程通讯接口,用于分布式架构
  3. 开箱即用的各类量化策略交易应用(vnpy.app):

    • cta_strategy:CTA策略引擎模块,在保持易用性的同时,允许用户针对CTA类策略运行过程中委托的报撤行为进行细粒度控制(降低交易滑点、实现高频策略)

    • cta_backtester:CTA策略回测模块,无需使用Jupyter Notebook,直接使用图形界面直接进行策略回测分析、参数优化等相关工作

    • spread_trading:价差交易模块,支持自定义价差,实时计算价差行情和持仓,支持半自动价差算法交易以及全自动价差策略交易两种模式

    • option_master:期权交易模块,针对国内期权市场设计,支持多种期权定价模型、隐含波动率曲面计算、希腊值风险跟踪等功能

    • portfolio_strategy:组合策略模块,面向同时交易多合约的量化策略(Alpha、期权套利等),提供历史数据回测和实盘自动交易功能

    • algo_trading:算法交易模块,提供多种常用的智能交易算法:TWAP、Sniper、Iceberg、BestLimit等,支持对接外部智能算法交易服务(如金纳算法)

    • script_trader:脚本策略模块,针对多标的组合类交易策略设计,同时也可以直接在命令行中实现REPL指令形式的交易,不支持回测功能

    • market_radar:市场雷达模块,允许用户基于自定义的公式实时计算任意合约组合数据,公式支持标准Python运算语法以及内置函数

    • paper_account:模拟交易模块,纯本地化实现的模拟交易功能,基于交易接口获取的实时行情进行委托撮合,提供委托成交推送以及持仓记录

    • chart_wizard:K线图表模块,基于RQData数据服务(期货)或者交易接口(数字货币)获取历史数据,并结合Tick推送显示实时行情变化

    • portfolio_manager:投资组合模块,面向各类基本面交易策略,以独立的策略子账户为基础,提供交易仓位的自动跟踪以及盈亏实时统计功能

    • rpc_service:RPC服务模块,允许将某一VN Trader进程启动为服务端,作为统一的行情和交易路由通道,允许多客户端同时连接,实现多进程分布式系统

    • data_manager:历史数据管理模块,通过树形目录查看数据库中已有的数据概况,选择任意时间段数据查看字段细节,支持CSV文件的数据导入和导出

    • data_recorder:行情记录模块,基于图形界面进行配置,根据需求实时录制Tick或者K线行情到数据库中,用于策略回测或者实盘初始化

    • excel_rtd:Excel RTD(Real Time Data)实时数据服务,基于pyxll模块实现在Excel中获取各类数据(行情、合约、持仓等)的实时推送更新

    • risk_manager:风险管理模块,提供包括交易流控、下单数量、活动委托、撤单总数等规则的统计和限制,有效实现前端风控功能

get_table对于time_point类型得定位查询

根据场景需求需要对已存储得数据做更新查询,所以需要对update_timepoint做查询索引

struct [[eosio::table, eosio::contract("bcskill.com")]] xxxx_info {
        uint64_t id;                                        // 记录id
        eosio::checksum256 trx_id;                          // 交易id
        ....
        time_point create_timepoint;                        // 创建时间
        time_point update_timepoint;                        // 更新时间

        uint64_t primary_key() const { return id; }
        eosio::checksum256 second_key() const { return trx_id; }
        uint64_t third_key() const { return update_timepoint.time_since_epoch().count();} // 把time_point类型转换成微妙(1/1000000 秒)
    };

table中测试数据如下

{
  "rows": [{
      "id": 0,
      "trx_id": "d78c4da408a4d9c75ba03af4a481d79fa80e2b8e215e68a1fe1865fd866cc7bc",
      ...
      "create_timepoint": "2020-12-17T11:24:07.500",
      "update_timepoint": "2020-12-17T11:27:18.500"
    },{
      "id": 1,
      "trx_id": "7bb0038be49b171f8a394bfdd7da15f9a005908b25ca1b6aed31b2975d721730",
      ...
      "create_timepoint": "2020-12-17T11:29:01.500",
      "update_timepoint": "2020-12-17T11:30:01.500"
    },{
      "id": 2,
      "trx_id": "8cf1c32d38692dd93870c7a2376d617f85efa4f093588dbce94f9981d4e1818e",
      ...
      "create_timepoint": "2020-12-17T11:30:01.500",
      "update_timepoint": "2020-12-17T11:30:01.500"
    }
  ],
  "more": false
}

UTC时间转时间戳,目前没有找到现成的工具可以直接转换,
https://tool.lu/timestamp/ 只找到这个北京时间转时间戳的工具(稍后找到其他直接工具,或者单独开发个工具再做文章更新)

UTC 转北京时间(+8)

暂时先将UTC时间加8小时转换成本地时间,测试的UTC时间为2020-12-17T11:27:18.500,转换为本地时间为2020-12-17 19:27:18 其中的.500为0.5秒,后面再单独加上。

北京时间转时间戳

利用上面的在线工具2020-12-17 19:27:18得到1608204438,加上上面的0.500得到1608204438.5

根据合约类型需要转换为微妙

1608204438.5 * 1000000 得到 1608204438500000

根据测试数据演示下查询

cleos get table bcskillsurou bcskillsurou ammtb --index 3 --key-type i64 -L 1608204438500000 -U 1608204438500000

得到指定的记录

{
  "rows": [{
      "id": 0,
      "trx_id": "d78c4da408a4d9c75ba03af4a481d79fa80e2b8e215e68a1fe1865fd866cc7bc",
      ...
      "create_timepoint": "2020-12-17T11:24:07.500",
      "update_timepoint": "2020-12-17T11:27:18.500"
    }
  ],
  "more": false
}

EOSIO v2.1.0 动作返回值

昨晚期待已久的2.1.0 rc 版本终于发版了,
https://github.com/EOSIO/eos/releases/tag/v2.1.0-rc1
新的协议功能:ACTION_RETURN_VALUE。
https://github.com/EOSIO/eos/pull/8327
激活后,此功能提供了一种方法,该方法可以将返回的值在操作中的块头中严格落实到外部进程中,而不必依赖get_table或通过print语句使用调试控制台。这使智能合约开发人员能够直接处理操作的返回值。进一步简化智能合约开发流程。一个例子可以在这里看到。

演示例子

合约代码

[[eosio::action]]
int sum(int valueA, int valueB) {
    return valueA + valueB; // 合约返回结果
}

前端推送完交易后,直接获取返回值

 const transactionResult = await api.transact({
        actions: [{
          account: 'returnvalue',
          name: 'sum',
          authorization: [{
            actor: 'returnvalue',
            permission: 'active',
          }],
          data: {
            valueA: numbers.first,
            valueB: numbers.second
          }
        }]
      }, {
        blocksBehind: 3,
        expireSeconds: 30
      }) as any
      setResult(transactionResult.processed.action_traces[0].return_value_data) // 直接获取返回值

ERROR: Couldn't connect to Docker daemon at http+docker://localunixsocket - is it running?

sudo gpasswd -a ${USER} docker
sudo su
su 当前账户
docker-compose up -d

EOS 合约 hex 字符串与checksum256互转

hex to checksum256

eosio::checksum256 hex_to_checksum256(const std::string& in) {
    eosio::check(in.length() == 64, "checksum size is error");
    std::string hex{"0123456789abcdef"};
    eosio::checksum256 out;
    for (int i = 0; i < 32; i++) {
      auto d1 = hex.find(in[2 * i]);
      auto d2 = hex.find(in[2 * i + 1]);
      eosio::check(d1 != std::string::npos || d2 != std::string::npos,
                  "invalid sha256");

      // checksum256 is composed of little endian int128_t
      reinterpret_cast<char*>(out.data())[i / 16 * 16 + 15 - (i % 16)] =
          (d1 << 4) + d2;
    }
    return out;
}

checksum256 to hex string

static string to_hex(const checksum256 &hashed) {
    // Construct variables
    string result;
    const char *hex_chars = "0123456789abcdef";
    const auto bytes = hashed.extract_as_byte_array();
    // Iterate hash and build result
    for (uint32_t i = 0; i < bytes.size(); ++i) {
        (result += hex_chars[(bytes.at(i) >> 4)]) += hex_chars[(bytes.at(i) & 0x0f)];
    }
    // Return string
    return result;
}

参考

https://github.com/EOSIO/eos/issues/4012