├── README.md ├── SUMMARY.md ├── appendix_source_code.md ├── assets ├── A99CTP.png ├── ImportInstrument.png ├── ImportInstumnetsRequest.png ├── OpenQuant2014GUI.png ├── OpenQuantLaunching.png ├── OpenQuantMainGUI.png ├── PortfolioStatisticsDemo.png ├── ProviderProperties.png ├── ProviderSetting02.png ├── ProviderSetting03.png ├── ProviderSettings01.png ├── SetCommission.png ├── Uninstall.png ├── commonly_strategy_event01.png ├── debug_function01.png ├── debug_function02.png ├── debug_function03.png ├── debug_function04.png ├── emit_ask_bid.png ├── equity_and_position_inquiries.png ├── first-strategy01.png ├── first-strategy02.png ├── first-strategy03.png ├── first-strategy04.png ├── first-strategy05.png ├── first-strategy06.png ├── importInstrumentDone.png ├── import_third_lib01.png ├── import_third_lib02.png ├── internal_market_data01.png ├── internal_market_data02.png ├── internal_market_data03.png ├── internal_market_data04.png ├── internal_market_data05.png ├── internal_market_data06.png ├── internal_market_data07.png ├── internal_market_data08.png ├── internal_market_data_csv01.png ├── internal_market_data_csv02.png ├── internal_market_data_csv03.png ├── internal_market_data_csv04.png ├── internal_market_data_csv05.png ├── internal_market_data_csv06.png ├── internal_market_data_csv07.png ├── internal_market_data_csv08.png ├── internal_market_data_csv09.png ├── internal_market_data_csv10.png ├── internal_market_data_csv11.png ├── internal_market_data_csv12.png ├── internal_market_data_csv13.png ├── internal_market_data_csv14.png ├── oq_providers.png ├── oq_providers_QuantBoxCTPse.png ├── oq_providers_QuantBoxCTPse_Configuration_AddMD.png ├── oq_providers_QuantBoxCTPse_Configuration_AddUser.png ├── oq_providers_QuantBoxCTPse_Configuration_ConnMD.png ├── oq_providers_QuantBoxCTPse_Configuration_MainWindow.png ├── oq_providers_QuantBoxCTPse_Connect.png ├── oq_providers_QuantBoxCTPse_QuoteMonitor.png ├── set_startup.png └── simulated_trading01.png ├── back_test.md ├── common_question_introduction.md ├── common_strategy_event.md ├── data_introduction.md ├── debug_function.md ├── debug_introduction.md ├── domestic_HistoricalData.md ├── domestic_market_data-Thanf.md ├── domestic_market_data.md ├── domestic_market_data_csv.md ├── download.md ├── emit_ask_bid.md ├── equity_and_position_inquiries.md ├── first_strategy.md ├── fok_fak.md ├── hot_key.md ├── import_third_party_lib.md ├── install_plugins.md ├── installing.md ├── introduction.md ├── load_historical_data_in_live_mode.md ├── open_and_close.md ├── plugin_introduction.md ├── practice_introduction.md ├── realtime_trading.md ├── simulated_trading.md ├── source_code_OpenQuantOutside.md ├── strategy_introduction.md └── whats_the_smartquant_or_openquant.md /README.md: -------------------------------------------------------------------------------- 1 | # OpenQuantBook - v1.2.1 20240603 2 | 3 | --- 4 | 5 | * ### 简介 6 | 7 | OpenQuant系列软件产品是SmartQuant公司研发的专业量化交易系统。OpenQuant面向专业量化策略研究员、交易员,提供强大的策略开发、回测、运行及监控功能。OpenQuant系统采用标准的C\#语言进行策略编程,不仅内置了众多量化金融函数、指标和算法,更可以让用户进行个性化的功能扩展。OpenQuant系统自1997年不断创新发展至今,被全球众多专业金融机构广泛应用。 8 | 9 | * ### Book 最近更新 10 | 11 | 日期:20170816 12 | 内容:在常见问题中添加OpenQuant中FOK指令的使用方法 13 | 14 | 日期:20170814 15 | 内容:在常见问题中添加CTP插件Ask和Bid事件无法触发的问题 16 | 17 | 日期:20170809 18 | 内容:在常见问题中添加权益和持仓的查询 19 | 20 | 日期:20170803 21 | 内容:在常见问题中添加如何实现限价单和市价单的开平仓 22 | 23 | ​ 日期:20240603 24 | ​ 内容:修订软件环境的安装及配置过程、历史数据获取 25 | 26 | 27 | 28 | ### 29 | 30 | * ### 目录 31 | 32 | * [0. Introduction](README.md) 33 | 34 | * [1. 简介](introduction.md) 35 | 36 | * [1.1 SmartQuant公司的OpenQuant系统](whats_the_smartquant_or_openquant.md) 37 | * [1.1.1 什么是SmartQuant](whats_the_smartquant_or_openquant.md/#What_is_SmartQuant) 38 | * [1.1.2 SmartQuant公司的软件产品](whats_the_smartquant_or_openquant.md/#SmartQuant_Products) 39 | * [1.1.3 什么是OpenQuant](whats_the_smartquant_or_openquant.md/#What_is_OpenQuant) 40 | * [1.1.4 OpenQuant系统特点](whats_the_smartquant_or_openquant.md/#OpenQuant_system_features) 41 | 42 | 43 | * [2 OpenQuant软件下载、安装、运行](installing.md) 44 | 45 | * [2.1 最新OpenQuant软件下载](installing.md/#2.1) 46 | 47 | * [2.2 OpenQuant软件运行环境](installing.md/#2.2) 48 | 49 | * [2.3 OpenQuant软件的安装](installing.md/#2.3) 50 | 51 | * [2.4 OpenQuant软件的卸载](installing.md/#2.4) 52 | 53 | * [2.5 OpenQuant软件的启动运行](installing.md/#2.5) 54 | 55 | * [2.6 配置OpenQuant对接国内期货交易通道](installing.md/#2.6) 56 | 57 | * [3. OpenQuant2014连接CTP柜台并获取实时数据](domestic_market_data.md) 58 | 59 | * [3.1 在OpenQuant中连接CTP柜台](domestic_market_data.md/#3.1) 60 | * [3.2 通过CTP实时获取CTP交易的合约信息](domestic_market_data.md/#3.2) 61 | * [3.3 通过CTP观察合约的实时数据](domestic_market_data.md/#3.3) 62 | * [3.4 查询CTP柜台的账户基本信息](domestic_market_data.md/#3.4) 63 | 64 | * [4. 导入历史数据](domestic_HistoricalData.md) 65 | 66 | * [4.1 通过QuantBox数据中心获取数据](domestic_HistoricalData.md/#4.1) 67 | * [4.2 导入csv或txt格式的数据](domestic_market_data_csv.md) 68 | 69 | * [5. 策略](strategy_introduction.md) 70 | 71 | * [5.1 开始第一个策略](first_strategy.md) 72 | * [5.1.1 新建策略](first_strategy.md/#New_Strategy) 73 | * [5.1.2 编写Hello OpenQuant策略](first_strategy.md/#Hello_OpenQuant_Strategy) 74 | * [5.2 导入第三方库](import_third_party_lib.md) 75 | * [5.3 常用的策略事件](common_strategy_event.md) 76 | 77 | * [6. 实战](practice_introduction.md) 78 | 79 | * [6.1 回测常见问题](back_test.md) 80 | * [6.1.1 回测的速度](back_test.md/#Back_test_speed) 81 | * [6.1.2 回测的相关菜单功能](back_test.md/#Back_test_menu) 82 | * [6.1.3 回测的各项指标展示说明](back_test.md/#Back_test_indicators) 83 | * [6.1.4 手续费和滑点的处理](back_test.md/#Commission_and_slip_points) 84 | * [6.1.5 分红派息](back_test.md/#Dividend) 85 | * [6.1.6 回测的成交原理](back_test.md/#Transaction_principle) 86 | * [6.2 如何进行模拟交易](simulated_trading.md) 87 | * [6.2.1 模拟交易的数据源是什么](simulated_trading.md/#Paper_data_source) 88 | * [6.2.2 模拟交易与和回测的数据差异](simulated_trading.md/#Paper_and_Backtest_data_diff) 89 | * [6.2.3 如何进行模拟交易](simulated_trading.md/#Paper) 90 | * [6.3 如何进行实盘交易](realtime_trading.md) 91 | 92 | * [7. 调试](debug_introduction.md) 93 | * [7.1 OpenQuant的调试功能](debug_function.md) 94 | 95 | * [8. 其它常见问题](common_question_introduction.md) 96 | * [8.1 如何在实盘模式下加载历史数据](load_historical_data_in_live_mode.md) 97 | * [8.2 如何实现限价单和市价单的开平仓](open_and_close.md) 98 | * [8.3 权益和持仓的查询](equity_and_position_inquiries.md) 99 | * [8.4 CTP插件Ask和Bid事件无法触发的问题](emit_ask_bid.md) 100 | * [8.5 OpenQuant中FOK指令的使用方法](fok_fak.md) 101 | * [8.6 OpenQuant快捷键](hot_key.md) 102 | 103 | * [9. 代码附录](appendix_source_code.md) 104 | 105 | * [9.1 OpenQuantOutside](source_code_OpenQuantOutside.md) 106 | 107 | * [补充:下载和安装插件](install_plugins.md) 108 | 109 | * ### 联系我们 110 | 111 | OpenQuant中文服务QQ群:50511635 112 | 113 | 114 | 115 | 116 | 117 | -------------------------------------------------------------------------------- /SUMMARY.md: -------------------------------------------------------------------------------- 1 | # Summary 2 | --- 3 | 4 | * [0. Introduction](README.md) 5 | 6 | * [1. 简介](introduction.md) 7 | 8 | * [1.1 SmartQuant公司的OpenQuant系统](whats_the_smartquant_or_openquant.md) 9 | * [1.1.1 什么是SmartQuant](whats_the_smartquant_or_openquant.md/#What_is_SmartQuant) 10 | * [1.1.2 SmartQuant公司的软件产品](whats_the_smartquant_or_openquant.md/#SmartQuant_Products) 11 | * [1.1.3 什么是OpenQuant](whats_the_smartquant_or_openquant.md/#What_is_OpenQuant) 12 | * [1.1.4 OpenQuant系统特点](whats_the_smartquant_or_openquant.md/#OpenQuant_system_features) 13 | 14 | * [2 OpenQuant软件下载、安装、运行](installing.md) 15 | 16 | * [2.1 最新OpenQuant软件下载](installing.md/#2.1) 17 | 18 | * [2.2 OpenQuant软件运行环境](installing.md/#2.2) 19 | 20 | * [2.3 OpenQuant软件的安装](installing.md/#2.3) 21 | 22 | * [2.4 OpenQuant软件的卸载](installing.md/#2.4) 23 | 24 | * [2.5 OpenQuant软件的启动运行](installing.md/#2.5) 25 | 26 | * [2.6 配置OpenQuant对接国内期货交易通道](installing.md/#2.6) 27 | 28 | * [3. OpenQuant2014连接CTP柜台并获取实时数据](domestic_market_data.md) 29 | 30 | * [3.1 在OpenQuant中连接CTP柜台](domestic_market_data.md/#3.1) 31 | * [3.2 通过CTP实时获取CTP交易的合约信息](domestic_market_data.md/#3.2) 32 | * [3.3 通过CTP观察合约的实时数据](domestic_market_data.md/#3.3) 33 | * [3.4 查询CTP柜台的账户基本信息](domestic_market_data.md/#3.4) 34 | 35 | * [4. 导入历史数据](domestic_HistoricalData.md) 36 | 37 | * [4.1 通过QuantBox数据中心获取数据](domestic_HistoricalData.md/#4.1) 38 | * [4.2 导入csv或txt格式的数据](domestic_market_data_csv.md) 39 | 40 | * [5. 策略](strategy_introduction.md) 41 | 42 | * [5.1 开始第一个策略](first_strategy.md) 43 | * [5.1.1 新建策略](first_strategy.md/#New_Strategy) 44 | * [5.1.2 编写Hello OpenQuant策略](first_strategy.md/#Hello_OpenQuant_Strategy) 45 | * [5.2 导入第三方库](import_third_party_lib.md) 46 | * [5.3 常用的策略事件](common_strategy_event.md) 47 | 48 | * [6. 实战](practice_introduction.md) 49 | 50 | * [6.1 回测常见问题](back_test.md) 51 | * [6.1.1 回测的速度](back_test.md/#Back_test_speed) 52 | * [6.1.2 回测的相关菜单功能](back_test.md/#Back_test_menu) 53 | * [6.1.3 回测的各项指标展示说明](back_test.md/#Back_test_indicators) 54 | * [6.1.4 手续费和滑点的处理](back_test.md/#Commission_and_slip_points) 55 | * [6.1.5 分红派息](back_test.md/#Dividend) 56 | * [6.1.6 回测的成交原理](back_test.md/#Transaction_principle) 57 | * [6.2 如何进行模拟交易](simulated_trading.md) 58 | * [6.2.1 模拟交易的数据源是什么](simulated_trading.md/#Paper_data_source) 59 | * [6.2.2 模拟交易与和回测的数据差异](simulated_trading.md/#Paper_and_Backtest_data_diff) 60 | * [6.2.3 如何进行模拟交易](simulated_trading.md/#Paper) 61 | * [6.3 如何进行实盘交易](realtime_trading.md) 62 | 63 | * [7. 调试](debug_introduction.md) 64 | 65 | * [7.1 OpenQuant的调试功能](debug_function.md) 66 | 67 | * [8. 其它常见问题](common_question_introduction.md) 68 | 69 | * [8.1 如何在实盘模式下加载历史数据](load_historical_data_in_live_mode.md) 70 | * [8.2 如何实现限价单和市价单的开平仓](open_and_close.md) 71 | * [8.3 权益和持仓的查询](equity_and_position_inquiries.md) 72 | * [8.4 CTP插件Ask和Bid事件无法触发的问题](emit_ask_bid.md) 73 | * [8.5 OpenQuant中FOK指令的使用方法](fok_fak.md) 74 | * [8.6 OpenQuant快捷键](hot_key.md) 75 | 76 | * [9. 代码附录](appendix_source_code.md) 77 | 78 | * [9.1 OpenQuantOutside](source_code_OpenQuantOutside.md) 79 | 80 | * [补充:下载和安装插件](install_plugins.md) 81 | 82 | * ### 联系我们 83 | 84 | OpenQuant中文服务QQ群:50511635 85 | 86 | 87 | -------------------------------------------------------------------------------- /appendix_source_code.md: -------------------------------------------------------------------------------- 1 | # 代码附录 2 | 3 | --- 4 | 5 | 6 | * [OpenQuantOutside](source_code_OpenQuantOutside.md) 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | -------------------------------------------------------------------------------- /assets/A99CTP.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/QuantBox/OpenQuantBook/85f1b7484532555528af8d566d6d4b69afc6a70a/assets/A99CTP.png -------------------------------------------------------------------------------- /assets/ImportInstrument.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/QuantBox/OpenQuantBook/85f1b7484532555528af8d566d6d4b69afc6a70a/assets/ImportInstrument.png -------------------------------------------------------------------------------- /assets/ImportInstumnetsRequest.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/QuantBox/OpenQuantBook/85f1b7484532555528af8d566d6d4b69afc6a70a/assets/ImportInstumnetsRequest.png -------------------------------------------------------------------------------- /assets/OpenQuant2014GUI.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/QuantBox/OpenQuantBook/85f1b7484532555528af8d566d6d4b69afc6a70a/assets/OpenQuant2014GUI.png -------------------------------------------------------------------------------- /assets/OpenQuantLaunching.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/QuantBox/OpenQuantBook/85f1b7484532555528af8d566d6d4b69afc6a70a/assets/OpenQuantLaunching.png -------------------------------------------------------------------------------- /assets/OpenQuantMainGUI.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/QuantBox/OpenQuantBook/85f1b7484532555528af8d566d6d4b69afc6a70a/assets/OpenQuantMainGUI.png -------------------------------------------------------------------------------- /assets/PortfolioStatisticsDemo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/QuantBox/OpenQuantBook/85f1b7484532555528af8d566d6d4b69afc6a70a/assets/PortfolioStatisticsDemo.png -------------------------------------------------------------------------------- /assets/ProviderProperties.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/QuantBox/OpenQuantBook/85f1b7484532555528af8d566d6d4b69afc6a70a/assets/ProviderProperties.png -------------------------------------------------------------------------------- /assets/ProviderSetting02.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/QuantBox/OpenQuantBook/85f1b7484532555528af8d566d6d4b69afc6a70a/assets/ProviderSetting02.png -------------------------------------------------------------------------------- /assets/ProviderSetting03.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/QuantBox/OpenQuantBook/85f1b7484532555528af8d566d6d4b69afc6a70a/assets/ProviderSetting03.png -------------------------------------------------------------------------------- /assets/ProviderSettings01.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/QuantBox/OpenQuantBook/85f1b7484532555528af8d566d6d4b69afc6a70a/assets/ProviderSettings01.png -------------------------------------------------------------------------------- /assets/SetCommission.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/QuantBox/OpenQuantBook/85f1b7484532555528af8d566d6d4b69afc6a70a/assets/SetCommission.png -------------------------------------------------------------------------------- /assets/Uninstall.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/QuantBox/OpenQuantBook/85f1b7484532555528af8d566d6d4b69afc6a70a/assets/Uninstall.png -------------------------------------------------------------------------------- /assets/commonly_strategy_event01.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/QuantBox/OpenQuantBook/85f1b7484532555528af8d566d6d4b69afc6a70a/assets/commonly_strategy_event01.png -------------------------------------------------------------------------------- /assets/debug_function01.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/QuantBox/OpenQuantBook/85f1b7484532555528af8d566d6d4b69afc6a70a/assets/debug_function01.png -------------------------------------------------------------------------------- /assets/debug_function02.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/QuantBox/OpenQuantBook/85f1b7484532555528af8d566d6d4b69afc6a70a/assets/debug_function02.png -------------------------------------------------------------------------------- /assets/debug_function03.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/QuantBox/OpenQuantBook/85f1b7484532555528af8d566d6d4b69afc6a70a/assets/debug_function03.png -------------------------------------------------------------------------------- /assets/debug_function04.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/QuantBox/OpenQuantBook/85f1b7484532555528af8d566d6d4b69afc6a70a/assets/debug_function04.png -------------------------------------------------------------------------------- /assets/emit_ask_bid.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/QuantBox/OpenQuantBook/85f1b7484532555528af8d566d6d4b69afc6a70a/assets/emit_ask_bid.png -------------------------------------------------------------------------------- /assets/equity_and_position_inquiries.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/QuantBox/OpenQuantBook/85f1b7484532555528af8d566d6d4b69afc6a70a/assets/equity_and_position_inquiries.png -------------------------------------------------------------------------------- /assets/first-strategy01.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/QuantBox/OpenQuantBook/85f1b7484532555528af8d566d6d4b69afc6a70a/assets/first-strategy01.png -------------------------------------------------------------------------------- /assets/first-strategy02.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/QuantBox/OpenQuantBook/85f1b7484532555528af8d566d6d4b69afc6a70a/assets/first-strategy02.png -------------------------------------------------------------------------------- /assets/first-strategy03.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/QuantBox/OpenQuantBook/85f1b7484532555528af8d566d6d4b69afc6a70a/assets/first-strategy03.png -------------------------------------------------------------------------------- /assets/first-strategy04.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/QuantBox/OpenQuantBook/85f1b7484532555528af8d566d6d4b69afc6a70a/assets/first-strategy04.png -------------------------------------------------------------------------------- /assets/first-strategy05.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/QuantBox/OpenQuantBook/85f1b7484532555528af8d566d6d4b69afc6a70a/assets/first-strategy05.png -------------------------------------------------------------------------------- /assets/first-strategy06.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/QuantBox/OpenQuantBook/85f1b7484532555528af8d566d6d4b69afc6a70a/assets/first-strategy06.png -------------------------------------------------------------------------------- /assets/importInstrumentDone.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/QuantBox/OpenQuantBook/85f1b7484532555528af8d566d6d4b69afc6a70a/assets/importInstrumentDone.png -------------------------------------------------------------------------------- /assets/import_third_lib01.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/QuantBox/OpenQuantBook/85f1b7484532555528af8d566d6d4b69afc6a70a/assets/import_third_lib01.png -------------------------------------------------------------------------------- /assets/import_third_lib02.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/QuantBox/OpenQuantBook/85f1b7484532555528af8d566d6d4b69afc6a70a/assets/import_third_lib02.png -------------------------------------------------------------------------------- /assets/internal_market_data01.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/QuantBox/OpenQuantBook/85f1b7484532555528af8d566d6d4b69afc6a70a/assets/internal_market_data01.png -------------------------------------------------------------------------------- /assets/internal_market_data02.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/QuantBox/OpenQuantBook/85f1b7484532555528af8d566d6d4b69afc6a70a/assets/internal_market_data02.png -------------------------------------------------------------------------------- /assets/internal_market_data03.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/QuantBox/OpenQuantBook/85f1b7484532555528af8d566d6d4b69afc6a70a/assets/internal_market_data03.png -------------------------------------------------------------------------------- /assets/internal_market_data04.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/QuantBox/OpenQuantBook/85f1b7484532555528af8d566d6d4b69afc6a70a/assets/internal_market_data04.png -------------------------------------------------------------------------------- /assets/internal_market_data05.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/QuantBox/OpenQuantBook/85f1b7484532555528af8d566d6d4b69afc6a70a/assets/internal_market_data05.png -------------------------------------------------------------------------------- /assets/internal_market_data06.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/QuantBox/OpenQuantBook/85f1b7484532555528af8d566d6d4b69afc6a70a/assets/internal_market_data06.png -------------------------------------------------------------------------------- /assets/internal_market_data07.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/QuantBox/OpenQuantBook/85f1b7484532555528af8d566d6d4b69afc6a70a/assets/internal_market_data07.png -------------------------------------------------------------------------------- /assets/internal_market_data08.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/QuantBox/OpenQuantBook/85f1b7484532555528af8d566d6d4b69afc6a70a/assets/internal_market_data08.png -------------------------------------------------------------------------------- /assets/internal_market_data_csv01.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/QuantBox/OpenQuantBook/85f1b7484532555528af8d566d6d4b69afc6a70a/assets/internal_market_data_csv01.png -------------------------------------------------------------------------------- /assets/internal_market_data_csv02.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/QuantBox/OpenQuantBook/85f1b7484532555528af8d566d6d4b69afc6a70a/assets/internal_market_data_csv02.png -------------------------------------------------------------------------------- /assets/internal_market_data_csv03.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/QuantBox/OpenQuantBook/85f1b7484532555528af8d566d6d4b69afc6a70a/assets/internal_market_data_csv03.png -------------------------------------------------------------------------------- /assets/internal_market_data_csv04.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/QuantBox/OpenQuantBook/85f1b7484532555528af8d566d6d4b69afc6a70a/assets/internal_market_data_csv04.png -------------------------------------------------------------------------------- /assets/internal_market_data_csv05.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/QuantBox/OpenQuantBook/85f1b7484532555528af8d566d6d4b69afc6a70a/assets/internal_market_data_csv05.png -------------------------------------------------------------------------------- /assets/internal_market_data_csv06.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/QuantBox/OpenQuantBook/85f1b7484532555528af8d566d6d4b69afc6a70a/assets/internal_market_data_csv06.png -------------------------------------------------------------------------------- /assets/internal_market_data_csv07.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/QuantBox/OpenQuantBook/85f1b7484532555528af8d566d6d4b69afc6a70a/assets/internal_market_data_csv07.png -------------------------------------------------------------------------------- /assets/internal_market_data_csv08.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/QuantBox/OpenQuantBook/85f1b7484532555528af8d566d6d4b69afc6a70a/assets/internal_market_data_csv08.png -------------------------------------------------------------------------------- /assets/internal_market_data_csv09.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/QuantBox/OpenQuantBook/85f1b7484532555528af8d566d6d4b69afc6a70a/assets/internal_market_data_csv09.png -------------------------------------------------------------------------------- /assets/internal_market_data_csv10.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/QuantBox/OpenQuantBook/85f1b7484532555528af8d566d6d4b69afc6a70a/assets/internal_market_data_csv10.png -------------------------------------------------------------------------------- /assets/internal_market_data_csv11.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/QuantBox/OpenQuantBook/85f1b7484532555528af8d566d6d4b69afc6a70a/assets/internal_market_data_csv11.png -------------------------------------------------------------------------------- /assets/internal_market_data_csv12.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/QuantBox/OpenQuantBook/85f1b7484532555528af8d566d6d4b69afc6a70a/assets/internal_market_data_csv12.png -------------------------------------------------------------------------------- /assets/internal_market_data_csv13.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/QuantBox/OpenQuantBook/85f1b7484532555528af8d566d6d4b69afc6a70a/assets/internal_market_data_csv13.png -------------------------------------------------------------------------------- /assets/internal_market_data_csv14.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/QuantBox/OpenQuantBook/85f1b7484532555528af8d566d6d4b69afc6a70a/assets/internal_market_data_csv14.png -------------------------------------------------------------------------------- /assets/oq_providers.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/QuantBox/OpenQuantBook/85f1b7484532555528af8d566d6d4b69afc6a70a/assets/oq_providers.png -------------------------------------------------------------------------------- /assets/oq_providers_QuantBoxCTPse.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/QuantBox/OpenQuantBook/85f1b7484532555528af8d566d6d4b69afc6a70a/assets/oq_providers_QuantBoxCTPse.png -------------------------------------------------------------------------------- /assets/oq_providers_QuantBoxCTPse_Configuration_AddMD.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/QuantBox/OpenQuantBook/85f1b7484532555528af8d566d6d4b69afc6a70a/assets/oq_providers_QuantBoxCTPse_Configuration_AddMD.png -------------------------------------------------------------------------------- /assets/oq_providers_QuantBoxCTPse_Configuration_AddUser.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/QuantBox/OpenQuantBook/85f1b7484532555528af8d566d6d4b69afc6a70a/assets/oq_providers_QuantBoxCTPse_Configuration_AddUser.png -------------------------------------------------------------------------------- /assets/oq_providers_QuantBoxCTPse_Configuration_ConnMD.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/QuantBox/OpenQuantBook/85f1b7484532555528af8d566d6d4b69afc6a70a/assets/oq_providers_QuantBoxCTPse_Configuration_ConnMD.png -------------------------------------------------------------------------------- /assets/oq_providers_QuantBoxCTPse_Configuration_MainWindow.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/QuantBox/OpenQuantBook/85f1b7484532555528af8d566d6d4b69afc6a70a/assets/oq_providers_QuantBoxCTPse_Configuration_MainWindow.png -------------------------------------------------------------------------------- /assets/oq_providers_QuantBoxCTPse_Connect.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/QuantBox/OpenQuantBook/85f1b7484532555528af8d566d6d4b69afc6a70a/assets/oq_providers_QuantBoxCTPse_Connect.png -------------------------------------------------------------------------------- /assets/oq_providers_QuantBoxCTPse_QuoteMonitor.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/QuantBox/OpenQuantBook/85f1b7484532555528af8d566d6d4b69afc6a70a/assets/oq_providers_QuantBoxCTPse_QuoteMonitor.png -------------------------------------------------------------------------------- /assets/set_startup.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/QuantBox/OpenQuantBook/85f1b7484532555528af8d566d6d4b69afc6a70a/assets/set_startup.png -------------------------------------------------------------------------------- /assets/simulated_trading01.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/QuantBox/OpenQuantBook/85f1b7484532555528af8d566d6d4b69afc6a70a/assets/simulated_trading01.png -------------------------------------------------------------------------------- /back_test.md: -------------------------------------------------------------------------------- 1 | # 回测常见问题 2 | 3 | --- 4 | 5 | ###
回测的速度 6 | 7 | OpenQuant采用基于事件总线概念的架构体系,允许用户有效的利用多线程、缓存、负载均衡来构建分布式交易系统。除此之外,OpenQuant在执行层用可以预定义的高校简洁的执行消息代替了Fix消息,能够显著增加回测速度和减少内存消耗。得益于事件驱动机制和这些设计优点,OpenQuant拥有每秒钟处理百万数量级别事件的能力。 8 | 9 | 10 | ###
回测的相关菜单功能 11 | 12 | 点击菜单栏View,具体功能如下: 13 | 14 | <a> Solution Explorer:解决方案资源管理器,策略的项目管理面板; 15 | 16 | <b> Instruments:合约面板,导入的合约历史数据会在该面板中显示,双击后即可在主界面中展开详细数据信息; 17 | 18 | <c> Account:当策略进行模拟交易或实盘交易时会显示交易的账户信息; 19 | 20 | <d> Order Manager:订单管理器,包括策略中未完成、已完成、已取消、被拒绝的所有订单分类明细; 21 | 22 | <e> Portfolios:投资组合管理,按照策略中交易的各个子策略分别进行权益、交易明细、权益和回撤的图形、绩效指标分析、子策略间相关性和权益比较等详细信息的展示; 23 | 24 | <f> Chart:策略运行行情图,包括行情、交易时间点、交易数量、权益等; 25 | 26 | <g> Chart\(Gapless\):无间隔策略运行行情图,与<f>不同的是,去除了未交易的时间段展示; 27 | 28 | <h> Strategy Monitor:策略监控,可以在运行策略前打开,运行策略时会显示相关信息; 29 | 30 | <i> Strategy Manager:策略管理,可以管理各个子策略的监控或属性展示; 31 | 32 | <j> Optimizers:优化,可以设置优化方案,包括暴力多核优化、传统多核优化、模拟退火多核优化、自适应模拟退火多核优化; 33 | 34 | <k> Optimization Results:优化结果展示; 35 | 36 | <l> Providers:插件面板,显示的是OQ自带的和您自行安装的第三方插件,主要用于提供交易接口、基础数据、历史数据、合约订阅、实时行情等; 37 | 38 | <m> Provider Errors:插件提示错误信息,运行策略时显示; 39 | 40 | <n> Quote Monitor:行情监控器; 41 | 42 | <o> Output:输出界面,用于显示系统错误信息、Provider提示信息以及您的策略自定义的显示信息; 43 | 44 | <p> Start Page:开始页面,每次打开OQ都会在代码编辑区显示出近期曾经使用的策略解决方案; 45 | 46 | <q> Properties:属性界面,单击合约面板、插件面板或解决方案资源管理器界面等中的任一内容,都会在该面板中显示详细的属性。 47 | 48 | ###
回测的各项指标展示说明 49 | 50 | 51 | OpenQuant提供了一系列的绩效指标,运行策略以后,打开View -> Portfolios,选择Statistics。 52 | 53 | ![](/assets/PortfolioStatisticsDemo.png) 54 | 55 | 按照顺序列出如下: 56 | 57 | **(1)Summary:** 58 | 59 | Net Profit: $$ 净利润 = 毛利 - 毛损 $$ 60 | 61 | Gross Profit:$$毛利=\sum{盈利}$$ 62 | 63 | Gross Loss: $$毛损=\sum{亏损}$$ 64 | 65 | Drawdown Percent:$$期末权益回撤百分比=\frac{投资组合总权益期末值-历史最高值}{历史最高值}$$ 66 | 67 | Average Drawdown Percent: $$平均回撤百分比$$ 68 | 69 | Maximun Drawdown Percent: $$最大回撤百分比=\frac{投资组合总权益最高值产生之后出现的最低值-历史最高值}{历史最高值}$$ 70 | 71 | Profit Factor: $$盈亏比=\frac{毛利}{毛损}$$ 72 | 73 | Recovery Factor: $$恢复因子=\frac{净利润}{权益最大回撤值}$$ 74 | 75 | **(2)Trades:** 76 | 77 | Num of Trades: $$总交易次数=\sum{交易次数}$$ 78 | 79 | Num of Winning Trades: $$总盈利交易次数=\sum{盈利次数}$$ 80 | 81 | Num of Losing Trades: $$总亏损交易次数=\sum{亏损次数}$$ 82 | 83 | Profitable Percent: $$盈利次数百分比=\frac{盈利交易次数}{总交易次数}$$ 84 | 85 | Averge Trade: $$平均收益=\frac{净利润}{总交易次数}$$ 86 | 87 | Averge Winning Trade: $$所有盈利交易的平均收益=\frac{毛利}{盈利交易次数}$$ 88 | 89 | Averge Losing Trade: $$所有亏损交易的平均收益=\frac{毛损}{亏损交易次数}$$ 90 | 91 | Payoff Ratio: $$平均盈亏比=\frac{盈利交易的平均收益值}{亏损交易的平均亏损值}$$ 92 | 93 | Average Maximun Adverse Excursion: $$多头为例:最大不利变动幅度均值=\frac{手数*(最低价-买入价)-手续费}{交易次数}$$ 94 | 95 | Average Maximun Favorable Excursion: $$多头为例:最大有利变动幅度均值=\frac{手数*(最高价-买入价)-手续费}{交易次数}$$ 96 | 97 | Average End Of Trade Drawdown: $$所有交易的回撤均值$$ 98 | 99 | Maximun Consecutive Winning Trades: $$最大连续盈利的交易次数$$ 100 | 101 | Maximun Consecutive Losing Trades: $$最大连续亏损的交易次数$$ 102 | 103 | Averge Trades Duration: $$平均持仓时间$$ 104 | 105 | **(3)Daily/Annual Returns:** 106 | 107 | Daily Return Percent: $$日收益率$$ 108 | 109 | Averge Daily Return Percent: $$日平均收益率$$ 110 | 111 | Averge Annual Return Percent: $$年平均收益率=日平均收益率*年交易日数$$ 112 | 113 | Daily Return Percent Standard Deviation: $$日收益率标准差$$ 114 | 115 | Annual Return Percent Standard Deviation: $$年收益率标准差$$ 116 | 117 | Daily Return Percent Downside Risk: $$日化下行波动率=\sqrt{\frac{\sum{日收益率为正数的收益率^2}}{日收益率为负数的天数}}$$ 118 | 119 | Annual Return Percent Downside Risk: $$年化下行波动率=日化下行波动率*\sqrt{年交易日数}$$ 120 | 121 | Sharpe Ratio: $$夏普比率=\frac{投资组合预期收益率-无风险利率}{投资组合的标准差}$$ 122 | 123 | Sortino Ratio: $$索提诺比率=\frac{\sqrt{年交易日数}*日超额收益率均值}{年化下行波动率}$$ 124 | 125 | Compound Annual Growth Rate: $$年复合增长率=(\frac{现有价值}{基础价值})^{\frac{1}{年数}}-1$$ 126 | 127 | MAR Ratio: $$MAR比率=\frac{预期收益率}{最大回撤}$$ 128 | 129 | Value At Risk: $$VaR=总资本*(抽样分位数*收益率标准差)+收益率平均值$$ 130 | 131 | **PS:OpenQuant中年交易日数为252天** 132 | 133 | ###
手续费和滑点的处理 134 | 135 | 可以通过设置ExecutionSimulator属性的CommissionProvider和SlippageProvider来设置手续费和滑点。 136 | 137 | ![](/assets/SetCommission.png) 138 | 139 | 也可以通过实现ICommissionProvider和ISlippageProvider接口来开发自己的手续费和滑点,或继承CommissionProvider和SlippageProvider类,重写GetCommission\(\)和GetPrice\(\)方法。默认的GetCommission\(\)和GetPrice\(\)方法如下。 140 | 141 | ``` 142 | public virtual double GetCommission(ExecutionReport report) 143 | { 144 | double value = 0; 145 | 146 | switch(type) 147 | { 148 | case CommissionType.Absolute: 149 | value = commission; 150 | break; 151 | case CommissionType.Percent: 152 | value = commission * report.cumQty * report.avgPx; 153 | break; 154 | case CommissionType.PerShare: 155 | value = commission * report.cumQty; 156 | break; 157 | default: 158 | throw new NotSupportedException("Unknown commission type"+ type); 159 | } 160 | 161 | if(value < minCommission) 162 | return minCommission 163 | 164 | return value; 165 | } 166 | 167 | public virtual double GetPrice(ExecutionReport report) 168 | { 169 | double price = report.AvgPx; 170 | 171 | switch(report.side) 172 | { 173 | case OrderSide.Buy: 174 | price += price * slippage; 175 | break; 176 | case OrderSide.Sell: 177 | price -= price * slippage; 178 | break; 179 | } 180 | return price; 181 | 182 | } 183 | ``` 184 | 185 | ###
分红派息 186 | 187 | 188 | Thanf提供的数据是已经过前复权预处理后的数据,前复权计算减去了相应的分红数据,这样回测会造成您在回测最开始的时间会默认已经取得所有回测时间段内的分红。建议提高手续费对冲这部分误差。 189 | 190 | 前复权后价格=\[\(复权前价格-现金红利\)+配\(新\)股价格×流通股份变动比例\]÷\(1+流通股份变动比例\) 191 | 192 | ###
回测的成交原理 193 | 194 | OpenQuant的回测成交原理是下单后见价成交,成交价取决于报单价以及滑点的设置。需要注意的是,如果报单量大于交易总量,则仅部分成交。 195 | 196 | 197 | 198 | 199 | 200 | -------------------------------------------------------------------------------- /common_question_introduction.md: -------------------------------------------------------------------------------- 1 | # 其它常见问题 2 | 3 | --- 4 | * [如何在实盘模式下加载历史数据](load_historical_data_in_live_mode.md) 5 | * [OpenQuant快捷键](hot_key.md) 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /common_strategy_event.md: -------------------------------------------------------------------------------- 1 | # 常用的策略事件 2 | 3 | --- 4 | 5 | OnStrategyStart – 在策略启动时调用,在第一笔行情到达之前 6 | 7 | OnStrategyStop – 在策略结束时调用,在最后一笔行情之后 8 | 9 | OnBarOpen – 在Bar行情最前沿调用(如,在日线数据开盘时买入) 10 | 11 | OnBar – 在所有行情的后沿调用(如,在日线数据收盘时买入) 12 | 13 | OnPositionOpened – 当一个新的交易开仓确认后调用 14 | 15 | OnPositionChanged – 当仓位增加或减少时调用 16 | 17 | OnTrade – 当市场中有成交时调用 18 | 19 | OnAsk – 当盘口ask有变化时调用 20 | 21 | OnBid – 当盘口bid有变化时调用 22 | 23 | OnOrderCancelled– 当撤单确认后调用 24 | 25 | OnOrderFilled– 当报单全部成交后调用 26 | 27 | OnOrderPartiallyFilled– 当报单部分成交后调用 28 | 29 | OnFill – 当报单后有成交时调用OnStopExecuted 30 | 31 | OnReminder– 当到达指定时间时调用(定时器) 32 | 33 | OnStopExecuted– 当到达指定止损条件时调用 34 | 35 | 在策略代码编辑环境下输入override on...会有智能提示,可以看到更多事件处理函数 36 | 37 | ![](/assets/commonly_strategy_event01.png) 38 | 39 | ### **OnStrategyStart** 40 | 41 | 策略启动前OnStrategyStart方法被调用,整个策略运行期只会被调用一次。OnStrategyStart事件处理中可以创建新对象,并赋值给类中声明的变量。 42 | 43 | 例如为默认Bars创建SMA对象的例子 44 | 45 | ``` 46 | using System; 47 | using SmartQuant; 48 | using SmartQuant.Indicators; 49 | namespace OpenQuant 50 | { 51 | public class MyStrategy : InstrumentStrategy 52 | { 53 | private SMA sma1; 54 | private SMA sma2; 55 | private int Length1 = 5; 56 | private int Length2 = 10; 57 | protected override void OnStrategyStart() 58 | { 59 | sma1 = new SMA(Bars, Length1); 60 | sma2 = new SMA(Bars, Length2); 61 | } 62 | } 63 | } 64 | ``` 65 | 66 | ### **OnBar** 67 | 68 | OnBar是在有新的完整bar到来后被触发的。每个行情包括过去一个时间段的OHLCV(开盘价、最高价、最低价、收盘价、成交量)数据。因此OnBar事件是在行情后延触发的。如果需要在行情到来前处理一些动作则需要使用OnBarOpen事件。 69 | 70 | 例如交易从9:00开始,5分钟bar。OnBar会在9:05、9:10...触发,如果用的是日线数据,那么不能在OnBar中报单,因为触发OnBar的时候已经收盘了。 71 | 72 | ``` 73 | protected override void OnBar(Instrument instrument, Bar bar) 74 | { 75 | //把最新的bar添加到Bars序列 76 | Bars.Add(bar); 77 | } 78 | ``` 79 | 80 | ### **OnPositionOpened** 81 | 82 | OnPositionOpened是在交易完成时有新的头寸建立时触发的。只有交易订单被执行后才会有新头寸生成。所有的持仓数据都是大于0的。当仓位减到0时(被平仓),头寸对象被销毁。剩下的只有开仓(包括尝试开仓)的交易记录以及平仓的交易记录。 83 | 84 | 这里是一个以新开仓位持仓数量、按照5个最小价格变动单位止盈下平仓单的例子。 85 | 86 | ``` 87 | protected override void OnPositionOpened(SmartQuant.Position position) 88 | { 89 | if(position.Side == PositionSide.Long) 90 | {//持有多头仓位 91 | Order sellOrder = SellLimitOrder(position.Instrument,position.Qty,position.Price+position.Instrument.TickSize*5); 92 | Send(sellOrder); 93 | } 94 | else 95 | {//持有空头仓位 96 | Order buyOrder = BuyLimitOrder(position.Instrument,position.Qty,position.Price-position.Instrument.TickSize*5); 97 | Send(buyOrder ); 98 | } 99 | } 100 | ``` 101 | 102 | ### **OnPositionChanged** 103 | 104 | OnPositionChanged是在持仓发生变化时触发的。比如当有部分成交导致持仓变化时该事件会被触发。OnPositionChanged是一个需要必须跟踪部分成交后调整止损单数量的好地方。每当新的部分成交确认到来时,你可以添加未完成止损单的数量,这样,你的止损单会更准确的反映原始订单状态。 105 | 106 | ``` 107 | protected override void OnPositionChanged(SmartQuant.Position position) 108 | { 109 | } 110 | ``` 111 | 112 | ### **OnTrade** 113 | 114 | OnTrade是在市场中有成交就会触发。例如国内普通期货行情是1秒2个行情数据包,在每次接受到行情后,如果有成交数据就会触发OnTrade。 115 | 116 | ``` 117 | protected override void OnTrade(SmartQuant.Instrument instrument, SmartQuant.Trade trade) 118 | { 119 | string symbol = instrument.Symbol;//成交的合约代码 120 | string time = trade.DateTime.ToString("yyyy-MM-dd HH:mm:ss.fff");//成交时间 121 | double price = trade.Price;//成交价格 122 | int size = trade.Size;//成交数量 123 | } 124 | ``` 125 | 126 | ### **OnAsk** 127 | 128 | OnAsk是盘口ask数据发生变化就会触发。比较适用于对于需要监控盘口数据的策略。 129 | 130 | ``` 131 | protected override void OnAsk(SmartQuant.Instrument instrument, SmartQuant.Ask ask) 132 | { 133 | double askPrice = ask.Price;//盘口卖盘价格 134 | int askSize = ask.Size;//卖盘挂单量 135 | } 136 | ``` 137 | 138 | ### **OnBid** 139 | 140 | OnBid是盘口bid数据发生变化就会触发。比较适用于对于需要监控盘口数据的策略。 141 | 142 | ``` 143 | protected override void OnBid(SmartQuant.Instrument instrument, SmartQuant.Bid bid) 144 | { 145 | double bidPrice = bid.Price;//盘口买盘价格 146 | int bidSize = bid.Size;//盘口买盘挂单量 147 | } 148 | ``` 149 | 150 | ### **OnReminder** 151 | 152 | OnReminder定时器,在具体的一个时间点触发。需要先通过AddReminder函数添加定时器,到指定时间则触发OnReminder函数。例如日内交易策略,想在收盘前10分钟就不再允许开新的仓位,假设9点开盘15点收盘。 153 | 154 | ``` 155 | bool allowOpenFlag = true;//是否允许开仓标志,true允许,false不允许 156 | DateTime myCloseTime;//尾盘禁止开仓的时间 157 | protected override void OnStrategyStart() 158 | { 159 | System.Console.WriteLine("Hello OpenQuant"); 160 | myCloseTime = new DateTime(DateTime.Now.Year,DateTime.Now.Month,DateTime.Now.Day,14,50,0); 161 | AddReminder(myCloseTime, "my close time");//添加第一个尾盘定时器 162 | } 163 | protected override void OnReminder(DateTime dateTime, object data) 164 | { 165 | //通过时间和data参数判断是否是尾盘定时器触发 166 | if (dateTime == myCloseTime && data.ToString() == "my close time") 167 | { 168 | allowOpenFlag = false;//设置开仓标志为false,不允许开仓 169 | myCloseTime = myCloseTime.AddDays(1);//尾盘禁止开仓时间加1天,变为下个交易日的尾盘禁止交易时间 170 | AddReminder(myCloseTime, "my close time");//添加下个交易日尾盘定时器 171 | } 172 | } 173 | protected override void OnBarOpen(Instrument instrument, Bar bar) 174 | { 175 | if (bar.OpenDateTime.Hour == 9 && allowOpenFlag == false) 176 | { 177 | allowOpenFlag = true;//开盘设置允许开仓标志为 true 178 | } 179 | } 180 | ``` 181 | 182 | ### **OnStopExecuted** 183 | 184 | OnStopExecuted当达到设置的止损条件时调用,需要先通过AddStop函数设置止损条件。 185 | 186 | 使用AddStop函数,需要构造一个Stop止损对象做为参数传入,Stop止损条件对象又分两种触发模式,一是定时触发,二是根据行情触发。 187 | 188 | Stop\(Strategy strategy,Position position,DateTime time\) 在到达time时触发止损 189 | 190 | Stop\(Strategy strategy,Position position,double level,StopType type,StopMode mode\) 根据行情触发止损 191 | 192 | strategy:策略对象 193 | 194 | position:持仓对象 195 | 196 | time:具体时间,达到这个时间就调用OnStopExecuted 197 | 198 | level:具体数值结合type、mode使用 199 | 200 | Stoptype:止损方式,固定StopType.Fixed还是跟踪StopType.Trailing,Fixed就表示价格回撤固定的level点(百分比)就调用OnStopExecuted,Trailing就表示行情从AddStop之后的最高(低)点回落(回升)level点(百分比)就调用OnStopExecuted 201 | 202 | StopMode:level的取值方式(单位),StopMode.Absolute-level按照报价加减level计算止损点位,StopMode.Percent-level按照百分比计算止损点位。 203 | 204 | Stop\(strategy,position,10,StopType.Fixed,StopMode.Absolute\)- 从当前价位回撤10点则调用OnStopExecuted 205 | 206 | Stop\(strategy,position,10,StopType.Trailing,StopMode.Absolute\)- 从之后最优价位回撤10点则调用OnStopExecuted 207 | 208 | Stop\(strategy,position,0.02,StopType.Fixed,StopMode.Percent\)- 从当前价位回撤2%则调用OnStopExecuted 209 | 210 | Stop\(strategy,position,0.02,StopType.Trailing,StopMode.Percent\)- 从之后最优价位回撤2%则调用OnStopExecuted 211 | 212 | 下面是一个跟踪止损的示例 213 | 214 | ``` 215 | protected override void OnPositionOpened(Position position) 216 | { 217 | Stop s = new Stop(this, position, position.Instrument.TickSize * 10, StopType.Trailing, StopMode.Absolute); 218 | AddStop(s);//从AddStop之后,价格从最优回落10跳则调用OnStopExecuted 219 | } 220 | protected override void OnStopExecuted(Stop stop) 221 | { 222 | if (stop.Side == PositionSide.Long) 223 | { 224 | Order closeOrder = SellOrder(stop.Instrument, stop.Qty, "close long position"); 225 | Send(closeOrder); 226 | } 227 | else 228 | { 229 | Order closeOrder = BuyOrder(stop.Instrument, stop.Qty, "close short position"); 230 | Send(closeOrder); 231 | } 232 | } 233 | ``` 234 | 235 | 236 | 237 | -------------------------------------------------------------------------------- /data_introduction.md: -------------------------------------------------------------------------------- 1 | # 数据 2 | 3 | --- 4 | 5 | 6 | * [获取国内市场数据](domestic_market_data.md) 7 | * [支持股票、基金、外汇、期权、期货吗](domestic_market_data.md/#Data_Support) 8 | * [提供什么数据](domestic_market_data.md/#What_data_is_available) 9 | * [数据每天什么时候更新](domestic_market_data.md/#Data_Update) 10 | * [我们提供的数据和其他平台数据有差异的原因](domestic_market_data.md/#The_Reason_Of_Data_Difference) 11 | * [数据如何接入](domestic_market_data.md/#Data_access) 12 | * [导入csv或txt格式的数据](domestic_market_data_csv.md) -------------------------------------------------------------------------------- /debug_function.md: -------------------------------------------------------------------------------- 1 | # 如何调试一个策略 2 | 3 | --- 4 | 5 | 简单的策略调试可以在代码中使用Console.WriteLine\(\)输出调试信息。如果需要高级调试功能可以通过Visual Studio来进行, OpenQuant的策略工程是一个标准的Visual Studio解决方案,可以使用Visual Studio打开、运行、调试OpenQuant的策略。需要注意的是由于运行环境的变化,当需要在Visual Studio中开发调试策略时要对策略项目配置进行一些调整: 6 | 7 | 修改策略项目中的场景工程\(Backtest、Realtime、Optimization\)的程序集信息,需要将信息中的公司属性设置成” SmartQuant Ltd。 8 | 9 | ![](/assets/debug_function01.png) 10 | 11 | ![](/assets/debug_function02.png) 12 | 13 | 修改工程生成属性,将工程编译64位程序。注意要同时修改Debug和Release两种配置方式。 14 | 15 | ![](/assets/debug_function03.png) 16 | 17 | 在Visual Studio中运行调试策略时,默认配置下策略程序并不生成在OpenQuant的安装目录,这就带来了策略引用的模块无法找到的问题,有两种方式解决这个问题: 18 | 19 | 20 | * 将策略工程的输出目录改成OpenQuant的安装目录,由于OpenQuant安装在C:\Program Files\目录下,在这个目录下输出程序需要以管理员身份运行Visual Studio。 21 | 22 | ![](/assets/debug_function04.png) 23 | 24 | * 修改Program.cs在Main入口函数中添加OpenQuantOutside.Init 函数调用。这个函数可以解决策略程序在OpenQuant安装目录外运行时遇到的问题。 25 | 26 | ``` 27 | class Program 28 | { 29 | static void Main(string[] args) 30 | { 31 | OpenQuantOutside.Init(); 32 | var scenario = new BacktestScenario(Framework.Current); 33 | scenario.Run(); 34 | } 35 | } 36 | ``` 37 | OpenQuantOutside 类的源代码见代码附录:[OpenQuantOutside](source_code_OpenQuantOutside.md) 38 | 39 | -------------------------------------------------------------------------------- /debug_introduction.md: -------------------------------------------------------------------------------- 1 | # 调试 2 | 3 | --- 4 | 5 | 6 | * [OpenQuant的调试功能](debug_function.md) 7 | -------------------------------------------------------------------------------- /domestic_HistoricalData.md: -------------------------------------------------------------------------------- 1 | 2 | 3 | # 4. 导入历史数据 4 | 5 | 在进行策略开发、数据研究及策略回测的时候,需要使用大量的历史数据。OpenQuant支持从数据中心或本地文件中导入历史数据。 6 | 7 | 8 | 9 | ##
4.1 通过QuantBox数据中心获取数据 10 | 11 | ### 4.1.1 连接QuantBox数据中心 12 | 13 | 在OpenQuant中,打开View菜单栏,显示Providers面板,展开Historical Data菜单,找到**QuantBoxData**并鼠标右键点击Connect。如果连接成功,QuantBoxData前面的信号灯图标会由红色变为绿色。 14 | 15 | 特别需要注意的是,QuantBoxData属性面板(View -> Properties)中的DataCenterHost字段,应该确保填写的是[http://data.quantbox.com](http://data.quantbox.com) 16 | 17 | ### 4.1.2 获取历史合约信息 18 | 19 | QuantBoxData连接成功后,在菜单栏选择Data -> Import -> Instruments -> QuantBoxData,会弹出“Import Instruments [QuantBoxData]”窗口,点击右侧Request按钮后,会显示QuantBoxData提供的所有合约列表。 20 | 21 | 👽建议使用Filter按照合约类型、交易所、字符等过滤合约后,再点击Request,以高效获取数据。 22 | 23 | 获取合约列表后,选择您想要导入本地使用的合约,点击右侧Import按钮,导入完成后,OpenQuant就会将已选的合约添加进Instruments面板(View -> Instruments)。 24 | 25 | ### 4.1.3 获取期货行情的历史数据 26 | 27 | 目前QuantBoxData提供的期货合约数据是自2012年8月至今的Trade和Quote类型的Tick数据,提供的股票合约数据是已经前复权处理过的股市开盘至今的Bar Time类型并且Bar Size设置为86400的日线数据。 28 | 29 | 获取方法为:在成功获取合约信息后,便可以开始导入历史数据。在菜单栏选择Data -> Import -> Historical -> QuantBoxData,会弹出“Import Historical Data[QuantBoxData]”界面。将左侧Instruments面板栏中的合约拖至导入列表框中,此时合约状态为Pending等待状态,设置数据类型和时间段。 30 | 31 | 32 | 33 | 设置完成后,再点击导入界面的绿色箭头按钮,开始导入。导入过程中,合约状态为Processing,导入成功后,合约的状态会变为Completed,此时,双击Instruments栏中的该合约,即可查看导入的历史数据列表详细信息。 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | -------------------------------------------------------------------------------- /domestic_market_data-Thanf.md: -------------------------------------------------------------------------------- 1 | # 获取国内市场数据 2 | 3 | --- 4 | 5 | ##
支持股票、基金、外汇、期权、期货吗? 6 | 7 | OpenQuant功能上支持以上所有标的。 8 | 9 | 数据上,目前暂时已接入了中国大陆的A股、期货数据。 10 | 11 | 其他的数据,例如中国大陆的B股、基金、期权也在接入的计划中;美股、港股、外汇数据会在上述三种数据接入完成再逐步接入。 12 | 13 | ##
提供什么数据? 14 | 15 | 目前提供的数据有: 16 | 17 | 股票开盘至今的A股前复权日线数据 18 | 19 | 2012年8月至今的期货tick数据 20 | 21 | A股、指数、期货的标的信息 22 | 23 | ##
数据每天什么时候更新? 24 | 25 | 目前的A股数据、期货数据均是在18:00 ~ 20:00 更新。 26 | 27 | ##
我们提供的数据和其他平台数据有差异的原因? 28 | 29 | 目前存在差异的地方有: 30 | 31 | 股票的前复权计算,我们的前复权计算减去了相应的分红数据,这样回测会造成您在回测最开始的时间会默认已经取得所有回测时间段内的分红。建议提高手续费对冲这部分误差。 32 | 33 | 主力连续合约的计算方式,我们采用的是加减法的方式对主力合约进行复权。 34 | 35 | ##
数据如何接入? 36 | 37 | 可以通过官方发布的Provider ThanfData下载数据。 38 | 39 | ### 1.Thanf数据接口的连接 40 | 41 | 打开View菜单栏,显示Providers面板,展开Historical Data菜单,找到ThanfData并右键,如下图1所示,点击Connect,如果连接成功,ThanfData前面的图标会由红色变为绿色。 42 | 43 | 特别需要注意的是,如图1右侧属性面板(View -> Properties)中的DataCenterHost字段,应该确保填写的是[http://data.thanf.com/。](http://data.thanf.com/。) 44 | 45 | ![](/assets/internal_market_data01.png) 46 | 47 | ``` 48 | 图 1 连接Thanf数据接口 49 | ``` 50 | 51 | ### 2.获取Thanf合约信息 52 | 53 | ThanfData连接成功后,在菜单栏选择Data -> Import -> Instruments -> ThanfData,会弹出如图2所示界面,点击右侧Request按钮后,会显示Thanf提供的所有合约列表。 54 | 55 | 您也可以使用Filter按照合约类型、交易所、字符等过滤合约后,再点击Request,如图3所示。 56 | 57 | 获取合约列表后,选择您想要导入本地使用的合约,点击右侧Import按钮,导入完成后,OQ就会将已选的合约添加进Instruments面板(View -> Instruments),如图4所示。 58 | 59 | ![](/assets/internal_market_data02.png) 60 | 61 | ``` 62 | 图 2 导入Thanf合约初始界面 63 | ``` 64 | 65 | ![](/assets/internal_market_data03.png) 66 | 67 | ``` 68 | 图 3 请求订阅合约 69 | ``` 70 | 71 | ![](/assets/internal_market_data04.png) 72 | 73 | ``` 74 | 图 4 导入Thanf合约完成界面 75 | ``` 76 | 77 | ### 3.获取Thanf历史数据 78 | 79 | 成功获取合约信息后,便可以开始导入历史数据。在菜单栏选择Data -> Import -> Historical -> ThanfData,会弹出如图5所示界面。 80 | 81 | ![](/assets/internal_market_data05.png) 82 | 83 | ``` 84 | 图 5 导入Thanf合约历史数据初始界面 85 | ``` 86 | 87 | 将左侧Instruments面板栏中的合约拖至导入列表框中,此时合约状态为Pending等待状态,设置数据类型和时间段,如图6所示。 88 | 89 | 目前Thanf提供的期货合约数据是自2012年8月至今的Trade和Quote类型的Tick数据,提供的股票合约数据是已经前复权处理过的股市开盘至今的Bar Time类型并且Bar Size设置为86400的日线数据。 90 | 91 | 设置完成后,再点击导入界面的绿色箭头按钮,开始导入。 92 | 93 | ![](/assets/internal_market_data06.png) 94 | 95 | ``` 96 | 图 6 开始导入合约历史数据 97 | ``` 98 | 99 | ![](/assets/internal_market_data07.png) 100 | 101 | ``` 102 | 图 7 Thanf合约历史数据导入完成界面 103 | ``` 104 | 105 | 导入过程中,合约状态为Processing,导入成功后,合约的状态会变为Completed,如图7所示。 106 | 107 | 此时,双击Instruments栏中的该合约,即可查看导入的历史数据列表详细信息,如图8所示。 108 | 109 | ![](/assets/internal_market_data08.png) 110 | 111 | ``` 112 | 图 8 查看合约历史数据 113 | ``` 114 | 115 | 116 | 117 | 118 | 119 | -------------------------------------------------------------------------------- /domestic_market_data.md: -------------------------------------------------------------------------------- 1 | # 3. OpenQuant2014连接CTP柜台并获取实时数据 2 | 3 | ##
3.1 在OpenQuant中连接CTP柜台 4 | 5 | OpenQuant交易通道配置完成后,在Providers窗口中,鼠标右击QuantBoxCtpse这个通道,并选择连接。 6 | 7 | ![](/assets/oq_providers_QuantBoxCTPse_Connect.png) 8 | 9 | 连接成功后,Output窗口应该有柜台信息的输出,此时通道连接成功。如果不成功,也可以查看Output窗口中的输出并检查问题。 10 | 11 | 12 | 13 | 14 | 15 | ##
3.2 通过CTP实时获取CTP交易的合约信息 16 | 17 | 在OpenQuant2014已经连接到CTP柜台后,可以从CTP交易柜台实时导入当前交易合约的信息,包括合约代码,报价单位,基础价差,合约乘数等基础信息。 18 | 19 | 点击OpenQuant2014菜单并依次选择:Data - Import - Instruments - QuantBoxCtpse ,打开在Import Instruments [QuantBoxCtpse]窗口中,筛选类型、交易所、代码等信息后,按Request按钮获取合约信息,然后按Import进行导入即可。 20 | 21 | 👽目前期货合约及期权合约数量众多,建议导入时可以按照合约代码的关键字进行过滤。 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | ##
3.3 通过CTP观察合约的实时数据 30 | 31 | 在CTP正常连接,并且在连续交易的盘中时段,在OpenQuant菜单中依次点击选择:View-QuoteMonitor - QuantBoxCtpse ,在打开的QuoteMonitor窗口中, 用鼠标拖动合约窗口中的代码,拖入QuoteMonitor窗口,此时就可以看到市场这些合约的报价情况,鼠标右键这些市场中的合约代码,可以选择直接下单交易。 32 | 33 | ![](/assets/oq_providers_QuantBoxCTPse_QuoteMonitor.png) 34 | 35 | 36 | 37 | ##
3.4 查询CTP柜台的账户基本信息 38 | 39 | 在OpenQuant菜单中依次选择:View-Account ,即可查看自己账户的资金信息。 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | -------------------------------------------------------------------------------- /domestic_market_data_csv.md: -------------------------------------------------------------------------------- 1 | # 如何导入csv或txt格式的第三方数据? 2 | 3 | --- 4 | 5 | ### 1. 数据准备 6 | 7 | 请提前准备好需要导入的数据,数据格式参考下图1: 8 | 9 | ![](/assets/internal_market_data_csv01.png) 10 | 11 | ``` 12 | 图 1 数据格式 13 | ``` 14 | 15 | ### 2.数据导入过程 16 | 17 | ### 2.1添加数据 18 | 19 | 打开OpenQuant2014,点击Data->Import->CSV or Text Files 进入到数据导入界面,如图2: 20 | 21 | ![](/assets/internal_market_data_csv02.png) 22 | 23 | ``` 24 | 图 2 导入菜单入口 25 | ``` 26 | 27 | 点击界面右侧的Add File,选择要添加的数据(可同时选择多个文件),然后点击Next进入到数据格式设置页面,如下图3: 28 | 29 | ![](/assets/internal_market_data_csv03.png) 30 | 31 | ``` 32 | 图 3 添加文件界面 33 | ``` 34 | 35 | 导入数据格式设置有五部分,如下图: 36 | 37 | ![](/assets/internal_market_data_csv04.png) 38 | 39 | ``` 40 | 图 4 数据格式设置 41 | ``` 42 | 43 | 第一部分:CSV部分 44 | 45 | A.Separator 分隔符选择,共有Tab制表符/Comma 逗号/Semicolon分号/Space空格四个选项,根据导入数据的格式来选择,如下图5,分隔符为逗号,则选择Comma。 46 | 47 | ![](/assets/internal_market_data_csv05.png) 48 | 49 | ``` 50 | 图 5 分隔符示例 51 | ``` 52 | 53 | B.Header with以第几行为开头的选择,导入的第一行必须是数据,非数据行需跳过,如果导入的第一行是数据,则Header with后的选项框填0,如果导入的数据第一行为列名(如下图),则填写1,即Header with \( 1 \) line。 54 | 55 | ![](/assets/internal_market_data_csv06.png) 56 | 57 | ``` 58 | 图 6 表头示例 59 | ``` 60 | 61 | 第二部分:Data 数据类型选择 62 | 63 | 类型选择分为Bar\(Time\)/Trade/Quote三种,如果数据是Bar 格式的就选择Bar(Time),可选择Bar的时间;如果是Trade 就选择Trade,策略里需用报价需再导一次Quote ,即Trade 数据和 Quote数据需分别导入。 64 | 65 | ![](/assets/internal_market_data_csv07.png) 66 | 67 | ``` 68 | 图 7 数据类型选择 69 | ``` 70 | 71 | 第三部分:Date时间索引选择 72 | 73 | A.column,按列导入,时间索引以数据文件中的时间列为准。 74 | 75 | B.manually,手动导入,可手动导入具体某一天的数据。应用后时间索引不包含日期信息,只包含分时信息。 76 | 77 | 第四部分:标的标签选择 78 | 79 | 类型选择分为column /file/manually三种,此部分主要是确定标的名称,如是以数据文件中的某列为标的名称,则选Column;如是以文件名为标的名称,则选file(适用于批量文件导入);也可自定义标的名称即通过manually来设置。 80 | 81 | 第五部分:设置导入的列标签 82 | 83 | 给导入的每一列设置一个标签,点击skipped根据弹出的选项设置即可。 84 | 85 | 导入K线\(Type – Bar\)数据列设置建议有以下选项: 86 | 87 | DataTime、Open、High、Low、Close、Volumn。 88 | 89 | 导入交易\(Type – Trade\)数据列设置建议有以下选项: 90 | 91 | DataTime、Price\(成交价\)、Size\(成交量\)、Direction\(方向\)。 92 | 93 | 导入报价\(Type –Quote\)数据列设置建议有以下选项: 94 | 95 | DataTime、Bid、BidSize、Ask、AskSize。 96 | 97 | 例:时间设置 98 | 99 | 点击时间列的skipped,选择Date Time,可选择列表中弹出的时间格式,也可点击Custom 自行设置时间格式。时间格式可参考时间设置页面的Format help,如下图8和图9: 100 | 101 | ![](/assets/internal_market_data_csv08.png) 102 | 103 | ``` 104 | 图 8 时间格式设置1 105 | ``` 106 | 107 | ![](/assets/internal_market_data_csv09.png) 108 | 109 | ``` 110 | 图 9 时间格式设置2 111 | ``` 112 | 113 | 也可通过Advanced进行高级设置,点击Advanced,进入设置界面,通过 Other-Create instrument 可设置导入的数据存放在哪个分类下(默认为Stock),如下图10: 114 | 115 | ![](/assets/internal_market_data_csv10.png) 116 | 117 | ``` 118 | 图 10 高级设置 119 | ``` 120 | 121 | 全部设置好后,可点击Template右侧的Save ,将之前的设置存为模板。之后设置同样格式的数据文件时可选择模板然后点击Apply即可使用模版。然后点击Next,进入数据导入界面。 122 | 123 | ### 2.2导入数据 124 | 125 | 在数据导入页面,点击左上角的绿色小三角开始导入,等待导入完成后点击Close即可,如下图11: 126 | 127 | ![](/assets/internal_market_data_csv11.png) 128 | 129 | ``` 130 | 图 11 导入数据 131 | ``` 132 | 133 | ### 3.查看导入数据 134 | 135 | 选择View-Instruments,点击导入数据存放的文件类,找到导入的数据,右键单击,在弹出菜单选择 Data,即可看到所导入的数据。如下图12、13、14: 136 | 137 | ![](/assets/internal_market_data_csv12.png) 138 | 139 | ``` 140 | 图 12 查看数据菜单入口 141 | ``` 142 | 143 | ![](/assets/internal_market_data_csv13.png) 144 | 145 | ``` 146 | 图 13 查看数据 147 | ``` 148 | 149 | ![](/assets/internal_market_data_csv14.png) 150 | 151 | ``` 152 | 图 14 数据显示 153 | ``` 154 | 155 | 156 | 157 | -------------------------------------------------------------------------------- /download.md: -------------------------------------------------------------------------------- 1 | # 最新OpenQuant系统软件的下载 2 | 3 | 在SmartQuant的官方网站中,您可以下载到OpenQuant最新版进行全功能的限时测试,测试期为30天。下载地址为: 4 | 5 | [http://www.smartquant.com/downloads.html ](http://www.smartquant.com/downloads.html) 6 | 7 | 也可以注册在线版本QuantWeb直接进行在线测试。 8 | 9 | -------------------------------------------------------------------------------- /emit_ask_bid.md: -------------------------------------------------------------------------------- 1 | # CTP插件Ask和Bid事件无法触发的问题 2 | --- 3 | 在CTP插件的属性配置选项: Settings - MarketData 4 | 5 | ![](/assets/emit_ask_bid.png) 6 | 7 | EmitBidAsk: 8 | true:触发OnBid和OnAsk事件(如果想要触发OnAsk或OnBid,此项必须为true) 9 | false:不触发OnBid和OnAsk事件 10 | 11 | EmitBidAskFirst: 12 | true:先触发OnBid和OnAsk事件,再触发OnTrade事件 13 | false:先触发OnTrade事件,再触发OnBid和OnAsk事件 14 | 15 | 16 | 17 | -------------------------------------------------------------------------------- /equity_and_position_inquiries.md: -------------------------------------------------------------------------------- 1 | # 权益和持仓的查询 2 | --- 3 | 4 | 在策略中,可以通过调用AccountDataManager.GetSnapshots()方法获取所有providerID下的账户权益和持仓的明细,或GetSnapshot(byte providerId, byte route)获取指定providerID下的账户权益和持仓的明细,调用示例如下: 5 | 6 | ``` 7 | 8 | private void AccountInfo() 9 | { 10 | System.Console.WriteLine("AccountInfo ... .. . .. "); 11 | //查询所有providerID的账户 12 | AccountDataSnapshot[] ads = this.AccountDataManager.GetSnapshots(); 13 | System.Console.WriteLine("ads.Length=" + ads.Length); 14 | 15 | //AccountDataSnapshot ads_ctp = AccountDataManager.GetSnapshot(99,99); //查询CTP通道的账户 16 | 17 | foreach (AccountDataSnapshot item in ads) 18 | { 19 | AccountDataEntry[] ades = item.Entries; 20 | foreach (AccountDataEntry ade in ades) 21 | { 22 | AccountDataFieldList fields = ade.Values.Fields; 23 | foreach (AccountDataField field in fields) 24 | { 25 | Console.WriteLine("{0} = {1}" , field.Name, field.Value); 26 | } 27 | 28 | AccountData[] pos = ade.Positions; 29 | foreach (var po in pos) 30 | { 31 | Console.WriteLine("----------------------------------------"); 32 | var ad = (AccountData)po; 33 | foreach (AccountDataField field in ad.Fields) 34 | { 35 | Console.WriteLine("{0} = {1}", field.Name, field.Value); 36 | } 37 | } 38 | } 39 | } 40 | } 41 | ``` 42 | 43 | 查询结果如下: 44 | 45 | ![](/assets/equity_and_position_inquiries.png) 46 | 47 | 48 | -------------------------------------------------------------------------------- /first_strategy.md: -------------------------------------------------------------------------------- 1 | # 开始第一个策略 2 | 3 | --- 4 | 5 | Solution:解决方案 6 | 7 | Project:项目 8 | 9 | 一个解决方案下可以有多个项目,但是只有一个启动项 10 | 11 | 双击cs文件可以打开编辑代码 12 | 13 | ###
新建策略 14 | 15 | 在菜单栏File->New->Solution,新建一个解决方案 16 | 17 | ![](/assets/first-strategy01.png) 18 | 19 | ![](/assets/first-strategy02.png) 20 | 21 | 选择新建SmartQuant Instrument Strategy Solution模式的解决方案 22 | 23 | |Solution的类型|说明| 24 | |--------|--------| 25 | |SmartQuant Instrument Strategy Solution|合约标的策略解决方案:为订阅的每个合约创建一个实例,每个实例处理一个合约的数据,互不干扰。| 26 | |SmartQuant Strategy Solution|策略解决方案:可以在一个策略实例中处理多个合约的数据。| 27 | |SmartQuant Sell Side Strategy Solution|卖方策略解决方案:新建后,除了 Backtest 以外,会有 2 个策略项目,MySellSideStrategy卖方策略可以理解为是 MyBuySideStrategy 买方策略的一个插件,在买方策略和经纪服务商之间添加了一个策略接口,实现一些可以解耦的功能。| 28 | |Empty Solution|空解决方案:新建后可以自行创建策略项目。| 29 | |Class Library|新建类库:可以供策略使用。| 30 | |Console Application|控制台应用程序:功能与 VisualStudio 的控制台应用程序相同。| 31 | 32 | 33 | 34 | Name是解决方案的名称 35 | 36 | Location 是解决方案(代码)保存的位置 37 | 38 | 单击OK按钮即新建完成,在解决方案资源管理器我们看到新建好的解决方案,而且也可以在相应的目录下找到代码文件 39 | 40 | ![](/assets/first-strategy03.png) 41 | 42 | ![](/assets/first-strategy04.png) 43 | 44 | ###
编写Hello OpenQuant策略 45 | 46 | OpenQaunt代码编辑器支持语法高亮、格式化、自动完成,如下所示(自动完成) 47 | 48 | ![](/assets/first-strategy05.png) 49 | 50 | ### 1. 编写场景 51 | 52 | 在解决方案资源管理器中,可以看到Backtest项目名称是黑体加粗(右键项目名称->Set as StartUP Project可以设置启动项,每个解决方案只有一个启动项),这表示Backtest项目为启动项,而Backtest项目又以Program.cs中的Main函数为入口。 53 | 54 | Program.cs->Main函数: 55 | 56 | ``` 57 | static void Main(string[] args) 58 | 59 | { 60 | 61 | Scenario scenario = new MyScenario(Framework.Current); 62 | 63 | scenario.Run(); 64 | 65 | } 66 | ``` 67 | 68 | 上面代码可以看出,Main函数会调用MyScenario.cs里面的Run函数。 69 | 70 | 打开Backtest项目中MyScenario.cs(场景文件),找到Run函数,添加订阅合约的代码, 71 | 72 | 我们以订阅IF1705为例。场景文件主要目的就是订阅合约、设置Bar周期等作用。 73 | 74 | ``` 75 | public override void Run() 76 | 77 | { 78 | 79 | //这里的合约是需要在Instruments中存在的合约 80 | 81 | Instrument instrument = InstrumentManager.Instruments["IF1705"]; 82 | 83 | strategy = new MyStrategy(framework, "Backtest"); 84 | 85 | //订阅合约 86 | 87 | strategy.AddInstrument(instrument); 88 | 89 | Initialize(); 90 | 91 | StartStrategy(); 92 | 93 | } 94 | ``` 95 | 96 | strategy = new MyStrategy\(framework, "Backtest"\);这行代码就代表了我们的策略代码是MyStartegy.cs文件中的MyStrategy类 97 | 98 | ### 2. 编写策略代码 99 | 100 | 在已经编写好的场景文件中,可以看到Run函数new了MyStrategy实例,并且调用了StartStrategy\(\)函数,这就表示开始启动MyStrategy策略了。OpenQuant的策略执行机制是事件机制,即触发了某事件则会调用相应的处理函数,具体各个事件和相应的处理函数后面会详细介绍,在编写实际交易策略时,这些事件和处理函数是必须了解的。 101 | 102 | 打开MyStrategy.cs,可以看到如下代码: 103 | 104 | ``` 105 | using System; 106 | 107 | using SmartQuant; 108 | 109 | namespace OpenQuant 110 | 111 | { 112 | 113 | public class MyStrategy : InstrumentStrategy 114 | 115 | { 116 | 117 | public MyStrategy(Framework framework, string name) 118 | 119 | : base(framework, name) 120 | 121 | { 122 | 123 | } 124 | 125 | protected override void OnStrategyStart() 126 | 127 | { 128 | 129 | System.Console.WriteLine("Hello OpenQuant"); 130 | 131 | } 132 | 133 | protected override void OnBar(Instrument instrument, Bar bar) 134 | 135 | { 136 | 137 | } 138 | 139 | } 140 | 141 | } 142 | ``` 143 | 144 | 我们在OnStrategyStart\(\)函数中,添加System.Console.WriteLine\("Hello OpenQuant"\),至此我们第一个策略完成,运行策略可以看到结果。 145 | 146 | ![](/assets/first-strategy06.png) 147 | 148 | -------------------------------------------------------------------------------- /fok_fak.md: -------------------------------------------------------------------------------- 1 | # OpenQuant中FOK指令的使用方法 2 | --- 3 | 4 | FOK指令:立即全部成交否则自动撤销指令,指在限定价位下达指令,如果该指令下所有申报手数未能全部成交,该指令下所有申报手数自动被系统撤销。在OpenQuant中可以通过设置order的TimeInForce = TimeInForce.FOK实现。 5 | 6 | FAK指令:立即成交剩余否则自动撤销指令,指在限定价位下达指令,如果该指令下部分申报手数成交,该指令下剩余申报手数自动被系统撤销。在OpenQuant中可以通过设置order的TimeInForce = TimeInForce.IOC实现。 7 | 8 | 以下代码是在SimNow环境下测试通过的示例: 9 | 10 | ``` 11 | protected override void OnTrade(Instrument instrument, Trade trade) 12 | { 13 | if (i == 0) 14 | { 15 | Order buyOrder = BuyLimitOrder(instrument, 10, trade.Price - 30 * instrument.TickSize, "buyopen"); 16 | buyOrder.TimeInForce = TimeInForce.FOK; 17 | Send(buyOrder); 18 | System.Console.WriteLine("OnTrade "+instrument.Symbol+" FOK order "); 19 | } 20 | 21 | if (i == 1) 22 | { 23 | Order buyOrder = BuyLimitOrder(instrument, 100, trade.Price - 30 * instrument.TickSize, "buyopen"); 24 | buyOrder.TimeInForce = TimeInForce.IOC;//FAK 25 | buyOrder.MinQty = 50; 26 | Send(buyOrder); 27 | System.Console.WriteLine("OnTrade " + instrument.Symbol + " IOC order "); 28 | } 29 | 30 | i++; 31 | } 32 | ``` 33 | -------------------------------------------------------------------------------- /hot_key.md: -------------------------------------------------------------------------------- 1 | # OpenQuant快捷键 2 | 3 | --- 4 | 5 | \[Ctrl+S\]组合键:保存 6 | 7 | \[ALT+F4\]组合键:退出 8 | 9 | \[Ctrl+Z\] 组合键:复原 10 | 11 | \[Ctrl+Shift+Z\] 组合键:重做 12 | 13 | \[Ctrl+X\] 组合键:剪切 14 | 15 | \[Ctrl+C\] 组合键:拷贝 16 | 17 | \[Ctrl+V\] 组合键:粘贴 18 | 19 | \[Ctrl+F\] 组合键:查找 20 | 21 | \[Ctrl+H\] 组合键:替换 22 | 23 | \[Ctrl+G\] 组合键:定位 24 | 25 | 26 | 27 | -------------------------------------------------------------------------------- /import_third_party_lib.md: -------------------------------------------------------------------------------- 1 | # 如何导入第三方库 2 | 3 | --- 4 | 5 | 展开需要添加第三方库的工程,右键References->Add,会看到提供三种方式添加,分别是Global Assembly Cache、Browse、Solution。 6 | 7 | ![](/assets/import_third_lib01.png) 8 | 9 | **<a>Global Assembly Cache: 在已经安装的.net framework中选择引入** 10 | 11 | **<b>Browse: 通过文件浏览方式选择引入** 12 | 13 | **<c>Solution: 添加项目方式引入** 14 | 15 | 以添加.net framework中System.IO为例Add->Global Assembly Cache,选择System.IO,单击OK按钮,添加完成 16 | 17 | ![](/assets/import_third_lib02.png) 18 | 19 | -------------------------------------------------------------------------------- /install_plugins.md: -------------------------------------------------------------------------------- 1 | # 下载、安装、使用插件 2 | 3 | --- 4 | 5 | ### 下载、安装国内期货交易插件 6 | 7 | OpenQuant系统中可以由第三方服务商或者开发者自行进行扩展,例如行情源的接入、交易通道的接入、历史数据源的接入等等,这些扩展我们称之为插件(Plugins)。 8 | 9 | 上期技术公司的CTP系统是获取国内期货实时行情、进行交易的主要平台。各个主流期货经纪商均支持客户通过CTP柜台进行期货、期权的交易。您可以在SmartQuant中文网站\([http://www.smartquant.cn](http://www.smartquant.cn)\)下载64位的CTP插件安装程序,并以默认过程安装完成后,打开OpenQuant,就可以在Providers面板找到CTP插件。 10 | 11 | ![](/assets/A99CTP.png) 12 | 13 | 14 | 15 | CTP插件提供了合约管理、交易接口和获取实时行情的接口功能。 16 | 17 | ### 使用期货交易插件 18 | 19 | * #### 配置插件 20 | 21 | 安装CTP插件后,先需要配置交易通道的IP地址及端口号,交易者账户及密码等信息,使得CTP插件可以正常连接和工作。 22 | 23 | 鼠标右键点击Providers面板中的A99CTP插件,选择Properties属性: 24 | 25 | ![](/assets/ProviderProperties.png) 26 | 27 | 28 | 29 | 在CTP插件中,用户可以配置多套服务器及账户信息,但需要指定使用哪套账户信息(账号及密码)及指定哪套交易服务器、行情服务器,这些服务器使用哪个账户。 30 | 31 | 在Properties窗口中,选择Settings选项中的AllConfig,按照下列图片过程进行设置,即可以完成CTP插件的交易账号和相关信息的配置。 32 | 33 | ![](/assets/ProviderSettings01.png) 34 | 35 | ![](/assets/ProviderSetting02.png) 36 | 37 | ![](/assets/ProviderSetting03.png) 38 | 39 | * #### 添加合约 40 | 41 | 当CTP插件(Provider A99CTP)与CTP交易柜台正常连接后,即可为你的OpenQuant系统添加合约信息。在菜单栏中选择Data -> Import -> Instruments -> A99CTP ,下图所示: 42 | 43 | ![](/assets/ImportInstrument.png) 44 | 45 | 46 | 弹出如下图所示界面,点击右侧Request按钮后,会显示您所连接的CTP柜台中提供的所有合约列表。您也可以使用Filter按照合约类型、交易所、字符等过滤合约后,再点击Request。 47 | 48 | ![](/assets/ImportInstumnetsRequest.png) 49 | 50 | 获取合约列表后,选择您想要导入本地使用的合约,点击右侧Import按钮,导入完成后,OpenQuant就会将已选的合约添加进Instruments面板(View -> Instruments),如下图所示。 51 | 52 | ![](/assets/importInstrumentDone.png) 53 | 54 | -------------------------------------------------------------------------------- /installing.md: -------------------------------------------------------------------------------- 1 | # 2. OpenQuant软件下载与安装 2 | 3 | --- 4 | 5 | ###
2.1 最新OpenQuant软件下载 6 | 7 | 在SmartQuant的官方网站中,您可以下载到OpenQuant最新版进行全功能的限时测试,测试期为30天。下载地址为: 8 | 9 | [http://www.smartquant.com/downloads.html ](http://www.smartquant.com/downloads.html) 10 | 11 | 也可以注册在线版本QuantWeb直接进行在线测试。 12 | 13 | 14 | 15 | 国内期货CTP插件及历史数据插件下载 16 | 17 | http://www.quantbox.cn/openquant 18 | 19 | ###
2.2 OpenQuant软件运行环境 20 | 21 | OpenQuant系统运行在微软Windows操作系统,最新版本的OpenQuant支持Windows7,Windows8,Windows10及Windows Server 2008,Windows Server 2012等主流的Windows 64位操作系统。安装OpenQuant软件时,OpenQuant安装程序会自动检测是否有合适的.NET Framework基础软件,如果需要安装程序会自动进行升级安装。 22 | 23 | **在2024年**,安装OpenQuant2014软件之前的准备工作: 24 | 25 | 建议的运行平台为Windows 2022 server 或者 Windows 10,并且依次安装了如下软件 26 | 27 | 安装DotNet Framework 4.8.1 28 | 29 | 安装Visual Studio 2022 社区版 30 | 31 | 安装Git,TortoiseGit 32 | 33 | 可选安装Mysql连接程序 mysql-connector-net-8.4.0 for windows 34 | 35 | 36 | 37 | ###
2.3 OpenQuant软件的安装 38 | 39 | 40 | 41 | 将下载的OpenQuant软件包存入D:\install\OpenQuant,这些软件包括: 42 | 43 | * OpenQuant2014 Openquant主软件 44 | * QuantBoxCtpse CTP插件 45 | * QuantBoxHisData QuantBox历史数据插件 46 | 47 | 在Windows 2016 或者Windows 10 的环境依次安装OpenQuant2014,QuantBoxCtpse及QuantBoxHisData 48 | 49 | 👽 **注意**:在开始安装OpenQuant前,需要在windows系统中,安装Git与TortoiseGit工具,Git安装也会在Windows系统中安装VC runtime 库,这个也是运行OpenQuant插件的必要基础环境。 50 | 51 | 52 | 53 | 54 | 55 | 运行OpenQuant安装程序,按照默认步骤进行安装即可轻松完成安装过程。 56 | 57 | OpenQuant 应用程序会被安装在标准的 Program Files \(x86\)\SmartQuant Ltd\OpenQuant 2014 目录中。 58 | 59 | 安装插件后,在OpenQuant主界面的Providers中可以看到Execution Provider中出现QuantBoxCtpse,在Historical Data的Providers中出现QuantBoxData , 这样安装就完成了。 60 | 61 | ![](/assets/oq_providers.png) 62 | 63 | 64 | 65 | 系统的数据文件\(data.quant 和 instruments.quant\)可以在 AppData\Roaming SmartQuant Ltd\OpenQuant 2014\data 目录中找到。 66 | 67 | 系统的配置文件可以在 AppData\Roaming\SmartQuant Ltd\OpenQuant 2014 目录中找到。 68 | 69 | 系统的示例项目可以在 Documents\OpenQuant 2014\Solutions 目录中找到。 70 | 71 | 如果你用过早先的OpenQuant软件,你一定注意到了新版本已经不再使用 Access 数据库的 instrument.sdf 来存储合约的定义。从OpenQuant 2014 版本开始,软件系统采用了新的数据文件,允许存储多种类型的对象,比如,合约、定单、还有策略的状态。 72 | 73 | 74 | 75 | 76 | 77 | ###
2.4 OpenQuant软件的卸载 78 | 79 | 卸载软件可以通过控制面板或软件自带的 Uninstall 工具卸载。 80 | 81 | ![](/assets/Uninstall.png) 82 | 83 | 除了运行Uninstall工具进行OpenQuant.exe程序卸载 以外,还需要手动删除系统盘 Users 目录下两个路径的文件夹: 84 | 85 | 1. ...\AppData\Roaming\SmartQuant Ltd 数据和配置文件 86 | 2. ...\Documents\OpenQuant 2014 策略的项目代码 87 | 88 | ###
2.5 OpenQuant软件的启动运行 89 | 90 | 双击OpenQuant图标,经过短暂的启动加载, 91 | 92 | ![](/assets/OpenQuantLaunching.png) 93 | 94 | 你就进入OpenQuant的集成开发环境了,这是我们熟悉的Windows软件风格,StartPage中显示最近打开的项目,第一次打开时,显示的是OpenQuant的策略示例。 95 | 96 | ![](/assets/OpenQuantMainGUI.png) 97 | 98 | 99 | 100 | ###
2.6 OpenQuant配置国内期货交易通道 101 | 102 | 国内期货的主流通道是上期技术公司的CTP,我们使用QuantBoxCtpse CTP插件连接期货经纪商的CTP交易通道。配置过程如下: 103 | 104 | 在Providers窗口中,选择QuantBoxCtpse ,在Properties中的Configuration项中,选择“..."的按钮,然后打开QuantBoxCtpse的配置界面,进行交易通道的增加。 105 | 106 | 在增加前,你应该从开户的期货经纪商获得了CTP柜台的API连接信息,并按照国内监管要求向经纪商报备了程序化交易系统,并为OpenQuant获得了OpenQuant的软件认证码。如果有任何以为可以咨询你的开户客户经理,如果遇到技术问题,可以进入QQ群,微信群咨询。 107 | 108 | ``` 109 | CTP柜台API链接信息举例: 110 | 111 | 渤海期货 CTP仿真柜台: 112 | 接口信息为: 113 | 接入IP: 114 | 电信 180.169.116.120 115 | 联通 211.95.26.214 116 | 117 | 端口信息: 118 | 交易 43205 119 | 行情 43213 120 | 121 | BrockID:4080 122 | ``` 123 | 124 | 125 | 126 | 在Providers窗口中,选择QuantBoxCtpse ,在Properties中的Configuration项中,选择“..."的按钮,然后打开QuantBoxCtpse的配置界面,进行交易通道的增加: 127 | 128 | ![](/assets/oq_providers_QuantBoxCTPse.png) 129 | 130 | 配置Provider:QuantBoxCtpse 131 | 132 | QuantBoxCtpse的配置窗口如下: 133 | 134 | ![](/assets/oq_providers_QuantBoxCTPse_Configuration_MainWindow.png) 135 | 136 | QuantBoxCtpse配置窗口 137 | 138 | #### 2.6.1. 添加账户信息 Users 139 | 140 | 注意密码和账户名的顺序 141 | 142 | ![](/assets/oq_providers_QuantBoxCTPse_Configuration_AddUser.png) 143 | 144 | #### 2.6.2. 添加期货公司交易及行情服务器信息 Servers 145 | 146 | ##### 2.6.2.1 添加行情服务器 147 | 148 | 添加行情服务器时需要填写如下信息: 149 | 150 | **客户端认证:** 151 | 目前行情服务器不需要客户端认证 152 | 153 | **服务器信息:** 154 | 服务器地址 address,tcp://180.169.116.120:43213 155 | 经纪商ID:BrokerID,4080 156 | 157 | **标签:** 158 | 名称:渤海仿真 159 | 服务类别:Trade, Instrument, Query 160 | 标识:渤海仿真-电信行情 161 | 162 | **流重传方式:** 163 | 选择默认的 Resume 164 | 165 | **行情:** 166 | IsMulticast: 默认为False 167 | IsUsingUdp: 默认为False 168 | 169 | ![](/assets/oq_providers_QuantBoxCTPse_Configuration_AddMD.png) 170 | 171 | 172 | 173 | ##### 2.6.2.2 添加交易服务器 174 | 175 | 添加行情服务器时需要填写如下信息: 176 | 177 | **客户端认证:** 178 | 连接交易服务器需要客户端认证,符合看穿式监管的技术要求: 179 | 需要填写: 180 | AuthCode:期货公司给出的客户端认证代码: XXXXXXXXXXXXXX 181 | UserProductInfo:这个默认使用OpenQuant即可 182 | 客户端标识(看穿式监管):向期货公司进行软件报备时上报的软件标志信息:格式一般为:软件厂商名_软件产品名_版本 183 | 例如: QuantBox_OpenQuant_2014 184 | 185 | 【参考阅读资料】 [关于期货市场启用看穿式监管公告](https://www.gov.cn/xinwen/2018-09/14/content_5322111.htm#1) 186 | 187 | **服务器信息:** 188 | 服务器地址 address,tcp://180.169.116.120:43205 189 | 经纪商ID:BrokerID,4080 190 | 191 | **标签:** 192 | 名称:渤海仿真-电信交易 193 | 服务类别:MarketData 194 | 标识:渤海仿真-电信交易 195 | 196 | **流重传方式:** 197 | 选择默认的 Resume 198 | 199 | **行情:** 200 | IsMulticast: 默认为False 201 | IsUsingUdp: 默认为False 202 | 203 | #### 2.6.2.3. 添加默认连接通道信息 Connections 204 | 205 | 配置Connections时, 206 | 207 | ##### 1) 添加行情连接,指定ApiPath 208 | 209 | **ApiPath** 210 | 选择 C:\Users\Administrator\AppData\Roaming\SmartQuant Ltd\OpenQuant 2014\XAPI\x64\CTPSE\SfitCtpse.Quote.dll 211 | 正确选择API路径后,Infomation项目的Name和Version信息会自动显示 212 | 213 | **Active** 214 | 选择 True 215 | 216 | **LogPrefix** 217 | 可以填写 md, 这样在日志中,前端会显示md字串,用于区分是行情连接产生的日志,在大量显示日志时,利于阅读 218 | 219 | **Server** 220 | 选择刚刚配置的行情服务器信息:渤海仿真-电信行情 221 | 222 | **User** 223 | 选择对应的Users信息:渤海仿真测试 224 | 225 | **Type的UseType** 226 | 选择MarketData,Type会自动显示MarketData 227 | 228 | ![](/assets/oq_providers_QuantBoxCTPse_Configuration_ConnMD.png) 229 | 230 | 231 | 232 | ##### 2) 添加交易连接,指定相应的ApiPath 233 | 234 | **ApiPath** 235 | 选择C:\Users\Administrator\AppData\Roaming\SmartQuant Ltd\OpenQuant 2014\XAPI\x64\CTPSE\SfitCtpse.Trader.dll 236 | 237 | 正确选择API路径后,Infomation项目的Name和Version信息会自动显示 238 | 239 | **Active** 240 | 选择 True 241 | 242 | **LogPrefix** 243 | 可以填写 ts, 这样在日志中,前端会显示ts字串,用于区分是交易连接产生的日志,在大量显示日志时,利于阅读 244 | 245 | **Server** 246 | 选择刚刚配置的交易服务器信息:渤海仿真-电信交易 247 | 248 | **User** 249 | 选择对应的Users信息:渤海仿真测试 250 | 251 | **Type的UseType** 252 | 选择Trade,Instrument,Query三项,Type会自动显示Trade,Instrument及Query 253 | 254 | 255 | 256 | 上述过程完成后,就已经配置好了CTP柜台插件的全部信息。现在OpenQuant 2014软件可以从CTP订阅和接收交易合约及行情信息,也可以通过交易通道的进行报单及回报的接收了。 257 | 258 | -------------------------------------------------------------------------------- /introduction.md: -------------------------------------------------------------------------------- 1 | # 简介 2 | 3 | --- 4 | 5 | 6 | * [SmartQuant公司的OpenQuant系统](whats_the_smartquant_or_openquant.md) 7 | * [什么是SmartQuant](whats_the_smartquant_or_openquant.md/#What_is_SmartQuant) 8 | * [SmartQuant公司的软件产品](whats_the_smartquant_or_openquant.md/#SmartQuant_Products) 9 | * [什么是OpenQuant](whats_the_smartquant_or_openquant.md/#What_is_OpenQuant) 10 | * [OpenQuant系统特点](whats_the_smartquant_or_openquant.md/#OpenQuant_system_features) 11 | * [OpenQuant软件下载、安装、运行](installing.md) 12 | 13 | 14 | -------------------------------------------------------------------------------- /load_historical_data_in_live_mode.md: -------------------------------------------------------------------------------- 1 | # 如何在实盘模式下加载历史数据 2 | 3 | --- 4 | 5 | 用户在编写一些趋势策略时经常需要在策略启动时导入历史数据做初始化,例如,加载前20个交易日的日线数据等。要实现这个功能最直接的办法是使用“回测转实盘”的策略运行模式,所谓“回测转实盘”的策略运行模式就是策略先在回测模式下处理历史数据,等到历史数据处理完成后,再进入实盘模式下运行。这种模式可以让策略一种非常自然的模式处理数据,不用区分回测还是实盘。 6 | 7 | 下面就用实例来说明如何实现“回测转实盘”。首先要修改实盘场景的Scenario文件,在Run方法中添加需要加载的历史数据区间 \(设置DataSimulator的DataTime1和DateTime2属性\),然后调用 StartBacktest\(\) 进入回测模式,在回测模式完成后设置实盘交易通道,调用 StartLive\(\) 进入实盘模式。这里需要注意的是,为了解决“回测转实盘”后策略的 OnTrade、OnAsk、OnBid 不能触发的问题,需要在进入实盘模式前调用 OpenQuantOutside.Resubscribe 重新设置行情订阅。 8 | 9 | ``` 10 | public override void Run() 11 | { 12 | strategy = new TurtleStrategy(framework, "main"); 13 | BarFactory.Clear(); 14 | var inst = InstrumentManager.Instruments[“rb1710”]; 15 | strategy.AddInstrument(inst); 16 | BarFactory.Add(inst, BarType.Time, 60); 17 | DataSimulator.DateTime1 = new DateTime(2017, 06, 25); 18 | DataSimulator.DateTime2 = new DateTime(2017, 06, 27); 19 | StartBacktest(); 20 | strategy.DataProvider = ProviderManager.GetDataProvider("A99CTP"); 21 | strategy.ExecutionProvider = ProviderManager.GetExecutionProvider("A99CTP"); 22 | OpenQuantOutside.Resubscribe(strategy); 23 | StartLive(); 24 | } 25 | ``` 26 | 27 | OpenQuantOutside 类的源代码见代码附录:[OpenQuantOutside](source_code_OpenQuantOutside.md) 28 | 29 | -------------------------------------------------------------------------------- /open_and_close.md: -------------------------------------------------------------------------------- 1 | # 如何实现限价单和市价单的开平仓 2 | 3 | --- 4 | 5 | OpenQuant支持的订单类型很多,但是国内交易市场很多不支持。下面主要介绍几种国内市场支持的订单类型,限价单和市价单的开平仓。 6 | 想要实现国内开平仓操作,需要下载安装64位CTP插件,并在项目中引用 QuantBox.OQ,下载地址:http://www.smartquant.cn/rjxz.html 7 | 8 | 这里有个简单的例子描述如何开多和平多,并直接下单(开空和平空和这个类似,方向相反而已)。 9 | 10 | 11 | ``` 12 | using QuantBox; 13 | 14 | Order openLimitOrder; 15 | Order openMarketOrder; 16 | private Order closeLimitOrder; 17 | 18 | private void OnBar(Instrument instrument,Bar bar) 19 | { 20 | //开仓买限价单 21 | openLimitOrder = BuyLimitOrder(instrument, 1, bar.Open, "buy limit order"); 22 | openLimitOrder.Open(); 23 | Send(openLimitOrder); 24 | 25 | AddReminder(Clock.DateTime.AddMinutes(1),"cancel buy limit order");//添加定时器,下单1分钟后还未成交的话做撤单处理 26 | 27 | //开仓买市价单 28 | openMarketOrder = BuyOrder(instrument, 2, "buy market order");//买市价单 29 | openMarketOrder.Open(); 30 | Send(openMarketOrder); 31 | } 32 | 33 | protected override void OnOrderFilled(Order order) 34 | { 35 | if (order.Text == "buy market order") 36 | { 37 | //平仓卖限价单 38 | closeLimitOrder = SellLimitOrder(order.Instrument, order.Qty, order.Price + order.Instrument.TickSize * 2); 39 | closeLimitOrder.Close(); 40 | Send(closeLimitOrder); 41 | } 42 | } 43 | 44 | protected override void OnReminder(DateTime dateTime, object data) 45 | { 46 | if (data != null && data.ToString() == "cancel buy limit order") 47 | { //是撤单定时器触发的 48 | if (!openLimitOrder.IsDone) 49 | {//openLimitOrder还未成交 50 | Cancel(openLimitOrder); 51 | } 52 | } 53 | } 54 | ``` 55 | 56 | 57 | 58 | -------------------------------------------------------------------------------- /plugin_introduction.md: -------------------------------------------------------------------------------- 1 | # 插件 2 | 3 | --- 4 | 5 | 6 | * [下载和安装插件](install_plugins.md) 7 | -------------------------------------------------------------------------------- /practice_introduction.md: -------------------------------------------------------------------------------- 1 | # 实战 2 | 3 | --- 4 | 5 | * [回测常见问题](back_test.md) 6 | * [回测的速度](back_test.md/#Back_test_speed) 7 | * [回测的相关菜单功能](back_test.md/#Back_test_menu) 8 | * [回测的各项指标展示说明](back_test.md/#Back_test_indicators) 9 | * [手续费和滑点的处理](back_test.md/#Commission_and_slip_points) 10 | * [分红派息](back_test.md/#Dividend) 11 | * [回测的成交原理](back_test.md/#Transaction_principle) 12 | * [如何进行模拟交易](simulated_trading.md) 13 | * [模拟交易的数据源是什么](simulated_trading.md/#Paper_data_source) 14 | * [模拟交易与和回测的数据差异](simulated_trading.md/#Paper_and_Backtest_data_diff) 15 | * [如何进行模拟交易](simulated_trading.md/#Paper) 16 | * [如何进行实盘交易](realtime_trading.md) 17 | -------------------------------------------------------------------------------- /realtime_trading.md: -------------------------------------------------------------------------------- 1 | # 如何进行实盘交易 2 | 3 | --- 4 | 5 | 通过一个实例来说明如何在OpenQuant中进行实盘交易。 6 | 7 | 在OpenQuant 中打开SMACrossover策略项目,把Realtime工程设置成启动项。 8 | 9 | ![](/assets/set_startup.png) 10 | 11 | 打开场景文件\(Scenario.cs\),把使用的合约修改成国内上市交易的合约。 12 | 13 | > ```java 14 | > public override void Run() 15 | > { 16 | > Instrument instrument1=InstrumentManager.Instruments["rb1710"]; 17 | > Instrument instrument2=InstrumentManager.Instruments["cu1708"]; 18 | > //... 19 | > //... 20 | > } 21 | > ``` 22 | 23 | 修改策略使用的行情通道\(Data Provider\)和交易通道\(ExecutionProvider\),连接CTP交易行情通道,在Run函数最后以StartLive方式启动策略。 24 | 25 | > ```java 26 | > public override void Run() 27 | > { 28 | > Instrument instrument1 = InstrumentManager.Instruments["rb1710"]; 29 | > Instrument instrument2 = InstrumentManager.Instruments["cu1708"]; 30 | > // Create SMA Crossover strategy 31 | > strategy = new MyStrategy(framework, "SMACrossover"); 32 | > // Add instruments 33 | > strategy.AddInstrument(instrument1); 34 | > strategy.AddInstrument(instrument2); 35 | > strategy.DataProvider = ProviderManager.GetDataProvider("A99CTP"); 36 | > strategy.ExecutionProvider = ProviderManager.GetExecutionProvider("A99CTP"); 37 | > // Add 1 minute bars 38 | > BarFactory.Clear(); 39 | > BarFactory.Add(instrument1, BarType.Time, barSize); 40 | > BarFactory.Add(instrument2, BarType.Time, barSize); 41 | > // Run the strategy 42 | > //StartStrategy(); 43 | > StartLive(); 44 | > } 45 | > ``` 46 | 47 | 48 | 49 | -------------------------------------------------------------------------------- /simulated_trading.md: -------------------------------------------------------------------------------- 1 | # 如何进行模拟交易 2 | 3 | --- 4 | 5 | ###
模拟交易的数据源是什么 6 | 7 | Paper\(模拟\)模式下连接是真实的行情数据。 8 | 9 | ###
模拟交易与和回测的数据差异 10 | 11 | 模拟交易和回测的差异在于接入的行情不一样,模拟交易使用的是真实行情,回测使用的是历史行情。 12 | 13 | ###
如何进行模拟交易 14 | 15 | 要进行模拟交易先要理解什么是模拟交易。OpenQuant包含三种工作模式,Backtest\(回测\)、Paper\(模拟\)、Live\(实盘\),而在系统内核里只有两种运行模式:Real-time、Simulation分别对应Live\(实盘\)和Backtest\(回测\)模式。这就出现了一个问题,既然系统内核中并不存在一种和Paper\(模拟\) 相对应的运行模式,那么当策略运行在Paper\(模拟\)模式时,系统内核到底发生了什么? 16 | 17 | 实际上当策略运行在Paper\(模拟\)模式时,系统内核的运行模式是Realtime。这就表示Live\(实盘\)和Paper\(模拟\)内核运行模式是相同的,那Live\(实盘\)和Paper\(模拟\)不同的运行效果是如何实现的呢,关键就是策略运行时指定的交易通道不同。Live\(实盘\)模式下策略都会连接真实的交易通道向交易所或代理商发送订单接收行情,而在Paper\(模拟\)模式下虽然也会连接真实的交易通道接收行情,但是报单并不发送给交易所或代理商而是使用系统自带的模拟交易引擎进行模拟撮合。 18 | 19 | 通过一个实例来说明如何在OpenQuant中进行模拟交易。 20 | 21 | 在OpenQuant 中打开SMACrossover策略项目,把Realtime工程设置成启动项。 22 | 23 | ![](/assets/simulated_trading01.png) 24 | 25 | 打开场景文件\(Scenario.cs\),把使用的合约修改成国内上市交易的合约。 26 | 27 | ``` 28 | public override void Run() 29 | { 30 | Instrument instrument1=InstrumentManager.Instruments["rb1710"]; 31 | Instrument instrument2=InstrumentManager.Instruments["cu1708"]; 32 | ... 33 | ... 34 | } 35 | ``` 36 | 37 | 修改策略使用的行情通道 \(Data Provider\) 连接 CTP 行情通道,在Run函数最后以 StartPaper 方式启动策略。 38 | 39 | ``` 40 | public override void Run() 41 | { 42 | Instrument instrument1 = InstrumentManager.Instruments["rb1710"]; 43 | Instrument instrument2 = InstrumentManager.Instruments["cu1708"]; 44 | // Create SMA Crossover strategy 45 | strategy = new MyStrategy(framework, "SMACrossover"); 46 | // Add instruments 47 | strategy.AddInstrument(instrument1); 48 | strategy.AddInstrument(instrument2); 49 | strategy.DataProvider = ProviderManager.GetDataProvider("A99CTP"); 50 | //strategy.ExecutionProvider = ProviderManager.GetExecutionProvider("A99CTP"); 51 | // Add 1 minute bars 52 | BarFactory.Clear(); 53 | BarFactory.Add(instrument1, BarType.Time, barSize); 54 | BarFactory.Add(instrument2, BarType.Time, barSize); 55 | // Run the strategy 56 | // StartStrategy(); 57 | StartPaper(); 58 | } 59 | ``` 60 | 61 | 62 | 63 | -------------------------------------------------------------------------------- /source_code_OpenQuantOutside.md: -------------------------------------------------------------------------------- 1 | ``` 2 | using System; 3 | using System.Collections.Generic; 4 | using System.Diagnostics; 5 | using System.IO; 6 | using System.Reflection; 7 | using System.Threading; 8 | using Microsoft.Win32; 9 | using System.Linq; 10 | 11 | namespace SmartQuant 12 | { 13 | public class OpenQuantOutside 14 | { 15 | private static readonly string SmartQuantPath; 16 | 17 | private static string GetSmartQuantPath() 18 | { 19 | var key = Registry.LocalMachine.OpenSubKey(@"SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\{C224DA18-4901-433D-BD94-82D28B640B2C}"); 20 | if (key != null) { 21 | var names = new List(key.GetSubKeyNames()); 22 | names.Sort(); 23 | return key.GetValue("InstallLocation").ToString(); 24 | } 25 | return Directory.GetParent(Path.GetDirectoryName(Assembly.GetEntryAssembly().Location)).FullName; 26 | } 27 | 28 | private static Assembly DomainOnAssemblyResolve(object sender, ResolveEventArgs args) 29 | { 30 | var assemblyName = new AssemblyName(args.Name); 31 | var path = Path.Combine(SmartQuantPath, assemblyName.Name + ".dll"); 32 | if (File.Exists(path)) { 33 | return Assembly.LoadFile(path); 34 | } 35 | Console.WriteLine(@"Not Found: " + assemblyName.Name); 36 | return null; 37 | } 38 | 39 | private static void OpenFileServer() 40 | { 41 | var file = Path.Combine(SmartQuantPath, "FileServer.exe"); 42 | if (Process.GetProcessesByName("FileServer").Length == 0) { 43 | try { 44 | Process.Start(new ProcessStartInfo { 45 | UseShellExecute = false, 46 | FileName = file, 47 | WindowStyle = ProcessWindowStyle.Hidden, 48 | CreateNoWindow = true, 49 | Arguments = "-auto" 50 | }); 51 | new EventWaitHandle(false, EventResetMode.AutoReset, "DataFileServerHandle").WaitOne(); 52 | } 53 | catch (Exception ex) { 54 | Console.WriteLine(string.Concat("Framework::Init Can not start ", file, " ", ex)); 55 | } 56 | } 57 | } 58 | 59 | static OpenQuantOutside() 60 | { 61 | SmartQuantPath = GetSmartQuantPath(); 62 | AppDomain.CurrentDomain.AssemblyResolve += DomainOnAssemblyResolve; 63 | } 64 | 65 | public static void Init() 66 | { 67 | OpenFileServer(); 68 | } 69 | 70 | private static void Resubscribe(Strategy root, FieldInfo subscriptionListfield, IDataProvider provider) 71 | { 72 | foreach (var child in root.Strategies) { 73 | var subscriptionList = (SubscriptionList)subscriptionListfield.GetValue(child); 74 | if (subscriptionList != null) { 75 | var items = subscriptionList.ToList(); 76 | foreach (var item in items) { 77 | subscriptionList.Remove(item); 78 | subscriptionList.Add(item.Instrument, provider); 79 | } 80 | } 81 | if (child.Strategies.Count > 0) Resubscribe(child, subscriptionListfield, provider); 82 | } 83 | } 84 | 85 | public static void Resubscribe(Strategy root) 86 | { 87 | Resubscribe(root, null); 88 | } 89 | 90 | public static void Resubscribe(Strategy root, IDataProvider provider) 91 | { 92 | var fields = typeof(Strategy).GetFields(BindingFlags.Instance | BindingFlags.NonPublic); 93 | FieldInfo subscriptionListField = null; 94 | FieldInfo providerField = null; 95 | foreach (var field in fields) { 96 | if (field.FieldType.Name == "SubscriptionList") { 97 | subscriptionListField = field; 98 | } 99 | if (field.FieldType.Name == "IDataProvider") { 100 | providerField = field; 101 | } 102 | } 103 | 104 | if (subscriptionListField == null) 105 | return; 106 | if (provider == null && providerField == null) { 107 | return; 108 | } 109 | Resubscribe(root, subscriptionListField, provider ?? (IDataProvider)providerField.GetValue(root)); 110 | } 111 | } 112 | } 113 | 114 | ``` 115 | 116 | 117 | -------------------------------------------------------------------------------- /strategy_introduction.md: -------------------------------------------------------------------------------- 1 | # 策略 2 | 3 | --- 4 | 5 | * [开始第一个策略](first_strategy.md) 6 | * [新建策略](first_strategy.md/#New_Strategy) 7 | * [编写Hello OpenQuant策略](first_strategy.md/#Hello_OpenQuant_Strategy) 8 | * [导入第三方库](import_third_party_lib.md) 9 | * [常用的策略事件](common_strategy_event.md) 10 | * [订单类型](order_type.md) 11 | 12 | -------------------------------------------------------------------------------- /whats_the_smartquant_or_openquant.md: -------------------------------------------------------------------------------- 1 | # SmartQuant公司的OpenQuant系统 2 | 3 | --- 4 | 5 | ###
什么是SmartQuant? 6 | 7 | 2003年成立于美国的SmartQuant有限责任公司,是一家专业量化金融软件提供商。SmartQuant公司专门面向对冲基金和专业交易机构,开发端到端程序化交易解决方案。为新兴和不断成长的量化交易机构提供成本可控,具备工业级强度的量化策略研发、策略回测及优化、交易策略自动化执行的综合平台,并以可靠的质量,速度和适应性来助力机构的成长。 8 | 9 | SmartQuant公司开发的基于微软C\#和.NET技术的完整量化交易解决方案,核心产品是量化交易集成开发执行系统OpenQuant,及交易报单路由管理QuantRouter、高性能市场数据系统QuantBase、策略执行系统QuantTrader及分布式构架交易管理系统Quant Controller 等一系列量化金融软件。随着产品不断的发展和完善,OpenQuant系列产品充分经过市场及客户的验证,公司已经拥有大量的专业机构类量化投资客户。 10 | 11 | ###
SmartQuant公司的软件产品 12 | 13 | 14 | SmartQuant公司围绕量化交易提供全面的解决方案,目前SmartQuant公司的主要产品有: 15 | 16 | **OpenQuant**:SmartQuant旗舰产品,用于量化交易的策略开发、策略测试、策略优化、执行和监控。 17 | 18 | **QuantRouter**:交易定单路由系统,可以分拆、合并,并管理交易定单的路由。 19 | 20 | **QuantBase**:高性能市场数据处理系统,可集中管理实时行情及海量历史行情数据。 21 | 22 | **QuantTrader**:成熟策略上线后的高效执行系统。 23 | 24 | **QuantController**:用于构架及管理分布式构架的交易体系。 25 | 26 | 更多的产品信息请访问SmartQuant公司网站及SmartQuant中文网站 27 | 28 | [http://www.smartquant.com ](http://www.smartquant.com) 29 | 30 | [http://www.smartquant.cn ](http://www.smartquant.cn) 31 | 32 | ###
什么是OpenQuant? 33 | 34 | OpenQuant系列软件产品是SmartQuant公司研发的专业量化交易系统。OpenQuant面向专业量化策略研究员、交易员,提供强大的策略开发、回测、运行及监控功能。OpenQuant系统采用标准的C\#语言进行策略编程,不仅内置了众多量化金融函数、指标和算法,更可以让用户进行个性化的功能扩展。OpenQuant系统自1997年不断创新发展至今,被全球众多专业金融机构广泛应用。 35 | 36 | ![](/assets/OpenQuant2014GUI.png) 37 | 38 | ###
OpenQuant系统特点 39 | 40 | * #### 面向专业交易机构,完善的量化交易平台 41 | 42 | OpenQuant是SmartQuant公司旗舰产品,专业金融机构用户可以根据需要,配合SmartQuant其他产品组成大型对冲基金级量化交易解决方案,而OpenQuant是系统的核心,是多种应用场景中最为关键的部分。能够使用户构架完整的策略开发、策略回测、策略执行及监控系统。 43 | 44 | * #### 采用标准的微软.NET框架及C\#编程语言 45 | 46 | OpenQuant采用标准的微软Windows .NET框架体系及C\#语言开发策略,开发者可以采用OpenQuant内置的策略集成开发环境,更可以使用标准的微软Virtual Studio集成开发环境进行开发,并对策略进行断点设置,单步执行策略代码,对各类变量进行跟踪,让调试工作方便而高效。 47 | 48 | * #### 无限的功能扩展可能 49 | 50 | 由于采用通用标准的软件开发框架,有编程经验的用户更可以基于OpenQuant底层框架,将各类金融工具或组建进行集成,更可以发挥技术想象力,独立扩展出全新的功能,定制化一个完全独特的量化交易管理系统。 51 | 52 | * #### 丰富的金融函数及专业软件对接能力 53 | 54 | OpenQuant提供丰富的内置金融指标, 可以扩展开发更多个性化指标,更可以拓展调用大型专业分析软件动态连接库。 55 | 56 | * #### 强大的数据处理能力及广泛的市场连接 57 | 58 | Tick行情的驱动机制,可以精细扑捉市场的每一个细节。支持中国的期货、现货、期权各类交易,支持众多外盘交易通道。 59 | 60 | --------------------------------------------------------------------------------