From 6659ff3b2989978d79cdd567b9e032a7af7edce2 Mon Sep 17 00:00:00 2001 From: qiujoe Date: Thu, 7 Jan 2016 17:17:19 +0800 Subject: [PATCH] Initial commit --- .gitattributes | 63 + .gitignore | 212 ++ DemoStrategy/DemoStrategy.csproj | 83 + DemoStrategy/DemoStrategyActor.cs | 33 + DemoStrategy/Properties/AssemblyInfo.cs | 36 + DemoStrategy/packages.config | 5 + Quanter.Akka.sln | 115 + Quanter.BusinessEntity/EAccount.cs | 28 + Quanter.BusinessEntity/ECube.cs | 17 + Quanter.BusinessEntity/EStockHolder.cs | 22 + Quanter.BusinessEntity/EStrategy.cs | 34 + Quanter.BusinessEntity/EStrategy.hbm.xml | 18 + Quanter.BusinessEntity/EntrustRecord.hbm.xml | 22 + .../Properties/AssemblyInfo.cs | 36 + .../Quanter.BusinessEntity.csproj | 80 + Quanter.BusinessEntity/StockHolder.hbm.xml | 25 + .../SubTradingAccount.hbm.xml | 21 + .../TransactionRecord.hbm.xml | 22 + Quanter.BusinessEntity/hibernate.cfg.xml | 17 + Quanter.BusinessEntity/packages.config | 5 + Quanter.BusinessEntity/stock.db3 | Bin 0 -> 19456 bytes Quanter.Common/BarData.cs | 12 + Quanter.Common/BidCacheQueue.cs | 70 + Quanter.Common/DllUtils.cs | 30 + Quanter.Common/HttpClient.cs | 161 + Quanter.Common/Properties/AssemblyInfo.cs | 36 + Quanter.Common/Quanter.Common.csproj | 108 + Quanter.Common/QuoteData.cs | 143 + Quanter.Common/Securities.cs | 58 + Quanter.Common/SecuritiesTypes.cs | 24 + Quanter.Common/StockUtil.cs | 98 + Quanter.Common/TickData.cs | 115 + Quanter.Common/TraderResult.cs | 32 + Quanter.Common/packages.config | 13 + Quanter.Domain/Properties/AssemblyInfo.cs | 36 + Quanter.Domain/Quanter.Domain.csproj | 75 + Quanter.Domain/StrategyDesc.cs | 23 + Quanter.Domain/User.cs | 15 + Quanter.Domain/config/StockHolder.hbm.xml | 25 + Quanter.Domain/config/StrategyDesc.hbm.xml | 19 + .../config/SubTradingAccount.hbm.xml | 21 + .../config/TransactionRecord.hbm.xml | 22 + Quanter.Domain/config/XueQiuCube.hbm.xml | 16 + Quanter.Domain/config/hibernate.cfg.xml | 22 + .../Properties/AssemblyInfo.cs | 36 + .../Quanter.Market.Sina.csproj | 83 + Quanter.Market.Sina/SinaQuotationActor.cs | 136 + Quanter.Market.Sina/packages.config | 6 + Quanter.Persistence/App.config | 24 + Quanter.Persistence/PersistenceActor.cs | 164 + .../Properties/AssemblyInfo.cs | 36 + .../Quanter.Persistence.Server.csproj | 110 + Quanter.Persistence/packages.config | 12 + Quanter.Strategy/Class1.cs | 12 + Quanter.Strategy/Properties/AssemblyInfo.cs | 36 + Quanter.Strategy/Quanter.Strategy.csproj | 61 + Quanter.Trader.Connector/BaseStockTrader.cs | 182 + Quanter.Trader.Connector/Enums.cs | 1492 ++++++++ Quanter.Trader.Connector/IStockTrader.cs | 60 + Quanter.Trader.Connector/ITrader.cs | 17 + .../Properties/AssemblyInfo.cs | 36 + .../Quanter.Trader.Connector.csproj | 99 + Quanter.Trader.Connector/Structs.cs | 512 +++ Quanter.Trader.Connector/ThsStockTrader.cs | 657 ++++ Quanter.Trader.Connector/ThsTraderActor.cs | 60 + Quanter.Trader.Connector/TradeManagerActor.cs | 24 + Quanter.Trader.Connector/TraderResult.cs | 28 + Quanter.Trader.Connector/Win32API.cs | 340 ++ Quanter.Trader.Connector/Win32Code.cs | 247 ++ Quanter.Trader.Connector/packages.config | 7 + Quanter.Trader.Gui/App.config | 116 + Quanter.Trader.Gui/CHANGES.txt | 99 + Quanter.Trader.Gui/MainForm.Designer.cs | 125 + Quanter.Trader.Gui/MainForm.cs | 138 + Quanter.Trader.Gui/MainForm.resx | 120 + Quanter.Trader.Gui/Program.cs | 22 + Quanter.Trader.Gui/Properties/AssemblyInfo.cs | 36 + .../Properties/Resources.Designer.cs | 63 + Quanter.Trader.Gui/Properties/Resources.resx | 117 + .../Properties/Settings.Designer.cs | 26 + .../Properties/Settings.settings | 7 + Quanter.Trader.Gui/Quanter.Trader.Gui.csproj | 193 + Quanter.Trader.Gui/licenses/license.txt | 31 + .../licenses/protoc-license.txt | 36 + Quanter.Trader.Gui/packages.config | 15 + .../google/protobuf/csharp_options.proto | 115 + .../protos/google/protobuf/descriptor.proto | 533 +++ .../protos/tutorial/addressbook.proto | 31 + Quanter.Trader.Indicator/IComplexIndicator.cs | 14 + Quanter.Trader.Indicator/IIndicator.cs | 13 + Quanter.Trader.Indicator/IIndicatorValue.cs | 14 + .../IIndicatorValueList.cs | 12 + .../Properties/AssemblyInfo.cs | 36 + .../Quanter.Trader.Indicator.csproj | 57 + .../BaseQuotationActor.cs | 61 + Quanter.Trader.MarketServer/CHANGES.txt | 99 + .../MarketReceiverConfigurationSection.cs | 77 + .../Properties/AssemblyInfo.cs | 36 + .../Quanter.MarketServer.csproj | 120 + .../SecuritiesMarketManagerActor.cs | 153 + .../SecuritiesQuotationActor.cs | 120 + .../licenses/license.txt | 31 + .../licenses/protoc-license.txt | 36 + Quanter.Trader.MarketServer/packages.config | 9 + .../google/protobuf/csharp_options.proto | 115 + .../protos/google/protobuf/descriptor.proto | 533 +++ .../protos/tutorial/addressbook.proto | 31 + ...stock_list - \345\244\215\345\210\266.csv" | 3145 +++++++++++++++++ Quanter.Trader.MarketServer/stock_list.csv | 6 + Quanter.Trader.MarketServer/stocklist.csv | 3095 ++++++++++++++++ Quanter.Trader.Messages/CHANGES.txt | 99 + Quanter.Trader.Messages/ClientMessages.cs | 56 + Quanter.Trader.Messages/Constants.cs | 16 + Quanter.Trader.Messages/ErrorMessages.cs | 12 + Quanter.Trader.Messages/MarketMessages.cs | 115 + .../PersistenceMessages.cs | 25 + .../Properties/AssemblyInfo.cs | 36 + .../Quanter.Trader.Messages.csproj | 108 + .../SecuritiesQuotationMessages.cs | 40 + Quanter.Trader.Messages/StrategyMessages.cs | 88 + Quanter.Trader.Messages/TradeMessages.cs | 75 + Quanter.Trader.Messages/UserMessages.cs | 31 + Quanter.Trader.Messages/app.manifest | 48 + Quanter.Trader.Messages/licenses/license.txt | 31 + .../licenses/protoc-license.txt | 36 + Quanter.Trader.Messages/packages.config | 8 + .../google/protobuf/csharp_options.proto | 115 + .../protos/google/protobuf/descriptor.proto | 533 +++ .../protos/tutorial/addressbook.proto | 31 + .../BaseStrategyActor.cs | 307 ++ Quanter.Trader.StrategyServer/CHANGES.txt | 99 + .../ClassDiagram1.cd | 26 + Quanter.Trader.StrategyServer/IAccount.cs | 21 + Quanter.Trader.StrategyServer/IStrategy.cs | 59 + .../Properties/AssemblyInfo.cs | 36 + .../Quanter.StrategyServer.csproj | 149 + .../Risk/IRiskRule.cs | 21 + .../Risk/RiskActions.cs | 13 + .../Risk/RiskManager.cs | 12 + .../Risk/RiskRules.cs | 34 + .../StrategyActor.cs | 118 + .../StrategyManagerActor.cs | 118 + Quanter.Trader.StrategyServer/TradeMode.cs | 12 + Quanter.Trader.StrategyServer/app.config | 27 + .../licenses/license.txt | 31 + .../licenses/protoc-license.txt | 36 + Quanter.Trader.StrategyServer/packages.config | 17 + .../google/protobuf/csharp_options.proto | 115 + .../protos/google/protobuf/descriptor.proto | 533 +++ .../protos/tutorial/addressbook.proto | 31 + .../PersistenceActorSpec.cs | 28 + .../Properties/AssemblyInfo.cs | 36 + .../Tests.Quanter.Persistence.csproj | 113 + Tests.Quanter.Persistence/packages.config | 13 + 154 files changed, 19689 insertions(+) create mode 100644 .gitattributes create mode 100644 .gitignore create mode 100644 DemoStrategy/DemoStrategy.csproj create mode 100644 DemoStrategy/DemoStrategyActor.cs create mode 100644 DemoStrategy/Properties/AssemblyInfo.cs create mode 100644 DemoStrategy/packages.config create mode 100644 Quanter.Akka.sln create mode 100644 Quanter.BusinessEntity/EAccount.cs create mode 100644 Quanter.BusinessEntity/ECube.cs create mode 100644 Quanter.BusinessEntity/EStockHolder.cs create mode 100644 Quanter.BusinessEntity/EStrategy.cs create mode 100644 Quanter.BusinessEntity/EStrategy.hbm.xml create mode 100644 Quanter.BusinessEntity/EntrustRecord.hbm.xml create mode 100644 Quanter.BusinessEntity/Properties/AssemblyInfo.cs create mode 100644 Quanter.BusinessEntity/Quanter.BusinessEntity.csproj create mode 100644 Quanter.BusinessEntity/StockHolder.hbm.xml create mode 100644 Quanter.BusinessEntity/SubTradingAccount.hbm.xml create mode 100644 Quanter.BusinessEntity/TransactionRecord.hbm.xml create mode 100644 Quanter.BusinessEntity/hibernate.cfg.xml create mode 100644 Quanter.BusinessEntity/packages.config create mode 100644 Quanter.BusinessEntity/stock.db3 create mode 100644 Quanter.Common/BarData.cs create mode 100644 Quanter.Common/BidCacheQueue.cs create mode 100644 Quanter.Common/DllUtils.cs create mode 100644 Quanter.Common/HttpClient.cs create mode 100644 Quanter.Common/Properties/AssemblyInfo.cs create mode 100644 Quanter.Common/Quanter.Common.csproj create mode 100644 Quanter.Common/QuoteData.cs create mode 100644 Quanter.Common/Securities.cs create mode 100644 Quanter.Common/SecuritiesTypes.cs create mode 100644 Quanter.Common/StockUtil.cs create mode 100644 Quanter.Common/TickData.cs create mode 100644 Quanter.Common/TraderResult.cs create mode 100644 Quanter.Common/packages.config create mode 100644 Quanter.Domain/Properties/AssemblyInfo.cs create mode 100644 Quanter.Domain/Quanter.Domain.csproj create mode 100644 Quanter.Domain/StrategyDesc.cs create mode 100644 Quanter.Domain/User.cs create mode 100644 Quanter.Domain/config/StockHolder.hbm.xml create mode 100644 Quanter.Domain/config/StrategyDesc.hbm.xml create mode 100644 Quanter.Domain/config/SubTradingAccount.hbm.xml create mode 100644 Quanter.Domain/config/TransactionRecord.hbm.xml create mode 100644 Quanter.Domain/config/XueQiuCube.hbm.xml create mode 100644 Quanter.Domain/config/hibernate.cfg.xml create mode 100644 Quanter.Market.Sina/Properties/AssemblyInfo.cs create mode 100644 Quanter.Market.Sina/Quanter.Market.Sina.csproj create mode 100644 Quanter.Market.Sina/SinaQuotationActor.cs create mode 100644 Quanter.Market.Sina/packages.config create mode 100644 Quanter.Persistence/App.config create mode 100644 Quanter.Persistence/PersistenceActor.cs create mode 100644 Quanter.Persistence/Properties/AssemblyInfo.cs create mode 100644 Quanter.Persistence/Quanter.Persistence.Server.csproj create mode 100644 Quanter.Persistence/packages.config create mode 100644 Quanter.Strategy/Class1.cs create mode 100644 Quanter.Strategy/Properties/AssemblyInfo.cs create mode 100644 Quanter.Strategy/Quanter.Strategy.csproj create mode 100644 Quanter.Trader.Connector/BaseStockTrader.cs create mode 100644 Quanter.Trader.Connector/Enums.cs create mode 100644 Quanter.Trader.Connector/IStockTrader.cs create mode 100644 Quanter.Trader.Connector/ITrader.cs create mode 100644 Quanter.Trader.Connector/Properties/AssemblyInfo.cs create mode 100644 Quanter.Trader.Connector/Quanter.Trader.Connector.csproj create mode 100644 Quanter.Trader.Connector/Structs.cs create mode 100644 Quanter.Trader.Connector/ThsStockTrader.cs create mode 100644 Quanter.Trader.Connector/ThsTraderActor.cs create mode 100644 Quanter.Trader.Connector/TradeManagerActor.cs create mode 100644 Quanter.Trader.Connector/TraderResult.cs create mode 100644 Quanter.Trader.Connector/Win32API.cs create mode 100644 Quanter.Trader.Connector/Win32Code.cs create mode 100644 Quanter.Trader.Connector/packages.config create mode 100644 Quanter.Trader.Gui/App.config create mode 100644 Quanter.Trader.Gui/CHANGES.txt create mode 100644 Quanter.Trader.Gui/MainForm.Designer.cs create mode 100644 Quanter.Trader.Gui/MainForm.cs create mode 100644 Quanter.Trader.Gui/MainForm.resx create mode 100644 Quanter.Trader.Gui/Program.cs create mode 100644 Quanter.Trader.Gui/Properties/AssemblyInfo.cs create mode 100644 Quanter.Trader.Gui/Properties/Resources.Designer.cs create mode 100644 Quanter.Trader.Gui/Properties/Resources.resx create mode 100644 Quanter.Trader.Gui/Properties/Settings.Designer.cs create mode 100644 Quanter.Trader.Gui/Properties/Settings.settings create mode 100644 Quanter.Trader.Gui/Quanter.Trader.Gui.csproj create mode 100644 Quanter.Trader.Gui/licenses/license.txt create mode 100644 Quanter.Trader.Gui/licenses/protoc-license.txt create mode 100644 Quanter.Trader.Gui/packages.config create mode 100644 Quanter.Trader.Gui/protos/google/protobuf/csharp_options.proto create mode 100644 Quanter.Trader.Gui/protos/google/protobuf/descriptor.proto create mode 100644 Quanter.Trader.Gui/protos/tutorial/addressbook.proto create mode 100644 Quanter.Trader.Indicator/IComplexIndicator.cs create mode 100644 Quanter.Trader.Indicator/IIndicator.cs create mode 100644 Quanter.Trader.Indicator/IIndicatorValue.cs create mode 100644 Quanter.Trader.Indicator/IIndicatorValueList.cs create mode 100644 Quanter.Trader.Indicator/Properties/AssemblyInfo.cs create mode 100644 Quanter.Trader.Indicator/Quanter.Trader.Indicator.csproj create mode 100644 Quanter.Trader.MarketServer/BaseQuotationActor.cs create mode 100644 Quanter.Trader.MarketServer/CHANGES.txt create mode 100644 Quanter.Trader.MarketServer/MarketReceiverConfigurationSection.cs create mode 100644 Quanter.Trader.MarketServer/Properties/AssemblyInfo.cs create mode 100644 Quanter.Trader.MarketServer/Quanter.MarketServer.csproj create mode 100644 Quanter.Trader.MarketServer/SecuritiesMarketManagerActor.cs create mode 100644 Quanter.Trader.MarketServer/SecuritiesQuotationActor.cs create mode 100644 Quanter.Trader.MarketServer/licenses/license.txt create mode 100644 Quanter.Trader.MarketServer/licenses/protoc-license.txt create mode 100644 Quanter.Trader.MarketServer/packages.config create mode 100644 Quanter.Trader.MarketServer/protos/google/protobuf/csharp_options.proto create mode 100644 Quanter.Trader.MarketServer/protos/google/protobuf/descriptor.proto create mode 100644 Quanter.Trader.MarketServer/protos/tutorial/addressbook.proto create mode 100644 "Quanter.Trader.MarketServer/stock_list - \345\244\215\345\210\266.csv" create mode 100644 Quanter.Trader.MarketServer/stock_list.csv create mode 100644 Quanter.Trader.MarketServer/stocklist.csv create mode 100644 Quanter.Trader.Messages/CHANGES.txt create mode 100644 Quanter.Trader.Messages/ClientMessages.cs create mode 100644 Quanter.Trader.Messages/Constants.cs create mode 100644 Quanter.Trader.Messages/ErrorMessages.cs create mode 100644 Quanter.Trader.Messages/MarketMessages.cs create mode 100644 Quanter.Trader.Messages/PersistenceMessages.cs create mode 100644 Quanter.Trader.Messages/Properties/AssemblyInfo.cs create mode 100644 Quanter.Trader.Messages/Quanter.Trader.Messages.csproj create mode 100644 Quanter.Trader.Messages/SecuritiesQuotationMessages.cs create mode 100644 Quanter.Trader.Messages/StrategyMessages.cs create mode 100644 Quanter.Trader.Messages/TradeMessages.cs create mode 100644 Quanter.Trader.Messages/UserMessages.cs create mode 100644 Quanter.Trader.Messages/app.manifest create mode 100644 Quanter.Trader.Messages/licenses/license.txt create mode 100644 Quanter.Trader.Messages/licenses/protoc-license.txt create mode 100644 Quanter.Trader.Messages/packages.config create mode 100644 Quanter.Trader.Messages/protos/google/protobuf/csharp_options.proto create mode 100644 Quanter.Trader.Messages/protos/google/protobuf/descriptor.proto create mode 100644 Quanter.Trader.Messages/protos/tutorial/addressbook.proto create mode 100644 Quanter.Trader.StrategyServer/BaseStrategyActor.cs create mode 100644 Quanter.Trader.StrategyServer/CHANGES.txt create mode 100644 Quanter.Trader.StrategyServer/ClassDiagram1.cd create mode 100644 Quanter.Trader.StrategyServer/IAccount.cs create mode 100644 Quanter.Trader.StrategyServer/IStrategy.cs create mode 100644 Quanter.Trader.StrategyServer/Properties/AssemblyInfo.cs create mode 100644 Quanter.Trader.StrategyServer/Quanter.StrategyServer.csproj create mode 100644 Quanter.Trader.StrategyServer/Risk/IRiskRule.cs create mode 100644 Quanter.Trader.StrategyServer/Risk/RiskActions.cs create mode 100644 Quanter.Trader.StrategyServer/Risk/RiskManager.cs create mode 100644 Quanter.Trader.StrategyServer/Risk/RiskRules.cs create mode 100644 Quanter.Trader.StrategyServer/StrategyActor.cs create mode 100644 Quanter.Trader.StrategyServer/StrategyManagerActor.cs create mode 100644 Quanter.Trader.StrategyServer/TradeMode.cs create mode 100644 Quanter.Trader.StrategyServer/app.config create mode 100644 Quanter.Trader.StrategyServer/licenses/license.txt create mode 100644 Quanter.Trader.StrategyServer/licenses/protoc-license.txt create mode 100644 Quanter.Trader.StrategyServer/packages.config create mode 100644 Quanter.Trader.StrategyServer/protos/google/protobuf/csharp_options.proto create mode 100644 Quanter.Trader.StrategyServer/protos/google/protobuf/descriptor.proto create mode 100644 Quanter.Trader.StrategyServer/protos/tutorial/addressbook.proto create mode 100644 Tests.Quanter.Persistence/PersistenceActorSpec.cs create mode 100644 Tests.Quanter.Persistence/Properties/AssemblyInfo.cs create mode 100644 Tests.Quanter.Persistence/Tests.Quanter.Persistence.csproj create mode 100644 Tests.Quanter.Persistence/packages.config diff --git a/.gitattributes b/.gitattributes new file mode 100644 index 0000000..1ff0c42 --- /dev/null +++ b/.gitattributes @@ -0,0 +1,63 @@ +############################################################################### +# Set default behavior to automatically normalize line endings. +############################################################################### +* text=auto + +############################################################################### +# Set default behavior for command prompt diff. +# +# This is need for earlier builds of msysgit that does not have it on by +# default for csharp files. +# Note: This is only used by command line +############################################################################### +#*.cs diff=csharp + +############################################################################### +# Set the merge driver for project and solution files +# +# Merging from the command prompt will add diff markers to the files if there +# are conflicts (Merging from VS is not affected by the settings below, in VS +# the diff markers are never inserted). Diff markers may cause the following +# file extensions to fail to load in VS. An alternative would be to treat +# these files as binary and thus will always conflict and require user +# intervention with every merge. To do so, just uncomment the entries below +############################################################################### +#*.sln merge=binary +#*.csproj merge=binary +#*.vbproj merge=binary +#*.vcxproj merge=binary +#*.vcproj merge=binary +#*.dbproj merge=binary +#*.fsproj merge=binary +#*.lsproj merge=binary +#*.wixproj merge=binary +#*.modelproj merge=binary +#*.sqlproj merge=binary +#*.wwaproj merge=binary + +############################################################################### +# behavior for image files +# +# image files are treated as binary by default. +############################################################################### +#*.jpg binary +#*.png binary +#*.gif binary + +############################################################################### +# diff behavior for common document formats +# +# Convert binary document formats to text before diffing them. This feature +# is only available from the command line. Turn it on by uncommenting the +# entries below. +############################################################################### +#*.doc diff=astextplain +#*.DOC diff=astextplain +#*.docx diff=astextplain +#*.DOCX diff=astextplain +#*.dot diff=astextplain +#*.DOT diff=astextplain +#*.pdf diff=astextplain +#*.PDF diff=astextplain +#*.rtf diff=astextplain +#*.RTF diff=astextplain diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..b06e864 --- /dev/null +++ b/.gitignore @@ -0,0 +1,212 @@ +## Ignore Visual Studio temporary files, build results, and +## files generated by popular Visual Studio add-ons. + +# User-specific files +*.suo +*.user +*.userosscache +*.sln.docstates + +# User-specific files (MonoDevelop/Xamarin Studio) +*.userprefs + +# Build results +[Dd]ebug/ +[Dd]ebugPublic/ +[Rr]elease/ +[Rr]eleases/ +x64/ +x86/ +build/ +bld/ +[Bb]in/ +[Oo]bj/ + +# Visual Studio 2015 cache/options directory +.vs/ + +# MSTest test Results +[Tt]est[Rr]esult*/ +[Bb]uild[Ll]og.* + +# NUNIT +*.VisualState.xml +TestResult.xml + +# Build Results of an ATL Project +[Dd]ebugPS/ +[Rr]eleasePS/ +dlldata.c + +# DNX +project.lock.json +artifacts/ + +*_i.c +*_p.c +*_i.h +*.ilk +*.meta +*.obj +*.pch +*.pdb +*.pgc +*.pgd +*.rsp +*.sbr +*.tlb +*.tli +*.tlh +*.tmp +*.tmp_proj +*.log +*.vspscc +*.vssscc +.builds +*.pidb +*.svclog +*.scc + +# Chutzpah Test files +_Chutzpah* + +# Visual C++ cache files +ipch/ +*.aps +*.ncb +*.opensdf +*.sdf +*.cachefile + +# Visual Studio profiler +*.psess +*.vsp +*.vspx + +# TFS 2012 Local Workspace +$tf/ + +# Guidance Automation Toolkit +*.gpState + +# ReSharper is a .NET coding add-in +_ReSharper*/ +*.[Rr]e[Ss]harper +*.DotSettings.user + +# JustCode is a .NET coding add-in +.JustCode + +# TeamCity is a build add-in +_TeamCity* + +# DotCover is a Code Coverage Tool +*.dotCover + +# NCrunch +_NCrunch_* +.*crunch*.local.xml + +# MightyMoose +*.mm.* +AutoTest.Net/ + +# Web workbench (sass) +.sass-cache/ + +# Installshield output folder +[Ee]xpress/ + +# DocProject is a documentation generator add-in +DocProject/buildhelp/ +DocProject/Help/*.HxT +DocProject/Help/*.HxC +DocProject/Help/*.hhc +DocProject/Help/*.hhk +DocProject/Help/*.hhp +DocProject/Help/Html2 +DocProject/Help/html + +# Click-Once directory +publish/ + +# Publish Web Output +*.[Pp]ublish.xml +*.azurePubxml +## TODO: Comment the next line if you want to checkin your +## web deploy settings but do note that will include unencrypted +## passwords +#*.pubxml + +*.publishproj + +# NuGet Packages +*.nupkg +# The packages folder can be ignored because of Package Restore +**/packages/* +# except build/, which is used as an MSBuild target. +!**/packages/build/ +# Uncomment if necessary however generally it will be regenerated when needed +#!**/packages/repositories.config + +# Windows Azure Build Output +csx/ +*.build.csdef + +# Windows Store app package directory +AppPackages/ + +# Visual Studio cache files +# files ending in .cache can be ignored +*.[Cc]ache +# but keep track of directories ending in .cache +!*.[Cc]ache/ + +# Others +ClientBin/ +[Ss]tyle[Cc]op.* +~$* +*~ +*.dbmdl +*.dbproj.schemaview +*.pfx +*.publishsettings +node_modules/ +orleans.codegen.cs + +# RIA/Silverlight projects +Generated_Code/ + +# Backup & report files from converting an old project file +# to a newer Visual Studio version. Backup files are not needed, +# because we have git ;-) +_UpgradeReport_Files/ +Backup*/ +UpgradeLog*.XML +UpgradeLog*.htm + +# SQL Server files +*.mdf +*.ldf + +# Business Intelligence projects +*.rdl.data +*.bim.layout +*.bim_*.settings + +# Microsoft Fakes +FakesAssemblies/ + +# Node.js Tools for Visual Studio +.ntvs_analysis.dat + +# Visual Studio 6 build log +*.plg + +# Visual Studio 6 workspace options file +*.opt + +# LightSwitch generated files +GeneratedArtifacts/ +_Pvt_Extensions/ +ModelManifest.xml diff --git a/DemoStrategy/DemoStrategy.csproj b/DemoStrategy/DemoStrategy.csproj new file mode 100644 index 0000000..ea99b4f --- /dev/null +++ b/DemoStrategy/DemoStrategy.csproj @@ -0,0 +1,83 @@ + + + + + Debug + AnyCPU + {9A3793DB-03DE-4C99-9525-C7C7BEE9CB93} + Library + Properties + Quanter.Strategy + Quanter.Strategy.Demo + v4.5.2 + 512 + + + true + full + false + bin\Debug\ + DEBUG;TRACE + prompt + 4 + + + pdbonly + true + bin\Release\ + TRACE + prompt + 4 + + + + ..\packages\Akka.1.0.5\lib\net45\Akka.dll + True + + + ..\packages\Newtonsoft.Json.7.0.1\lib\net45\Newtonsoft.Json.dll + True + + + + + + + + + + + + + + + + + {34db14a6-e4ed-4c4a-8ca6-939201a572be} + Quanter.BusinessEntity + + + {a3fa3c71-a7b0-4bb6-bd32-0aee20493593} + Quanter.Common + + + {dde08214-ec3a-4dd7-8cee-49973e17ae8f} + Quanter.Trader.Messages + + + {f0e12b5e-7012-4345-b4a4-be4cedce5e91} + Quanter.StrategyServer + + + + + + + + \ No newline at end of file diff --git a/DemoStrategy/DemoStrategyActor.cs b/DemoStrategy/DemoStrategyActor.cs new file mode 100644 index 0000000..afe3af0 --- /dev/null +++ b/DemoStrategy/DemoStrategyActor.cs @@ -0,0 +1,33 @@ +using Akka.Actor; +using Akka.Event; +using Quanter.BusinessEntity; +using Quanter.Common; +using Quanter.Trader.Messages; +using System; + +namespace Quanter.Strategy.Demo +{ + public class DemoStrategyActor : BaseStrategyActor + { + private readonly ILoggingAdapter _log = Logging.GetLogger(Context); + + public DemoStrategyActor(EStrategy strategy) : base(strategy) + { + _log.Debug("创建编码为 {0} StrategyActor实例", strategy.Id); + } + + protected override void init() + { + _log.Debug("初始化编号为{0}Strategy", Desc.Id); + AddSecurities(new Securities(SecuritiesTypes.Stock, MarketType.XSHE, "000002")); + AddSecurities(new Securities(SecuritiesTypes.Stock, MarketType.XSHG, "603998")); + } + + + protected override void onQuoteData(QuoteData data) + { + _log.Debug("Demo策略处理{0}报价数据", data.Symbol); + this.buySecurities(new Securities( SecuritiesTypes.Stock, data.Symbol), data.SellPrice1, 100); + } + } +} diff --git a/DemoStrategy/Properties/AssemblyInfo.cs b/DemoStrategy/Properties/AssemblyInfo.cs new file mode 100644 index 0000000..0c21d79 --- /dev/null +++ b/DemoStrategy/Properties/AssemblyInfo.cs @@ -0,0 +1,36 @@ +using System.Reflection; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; + +// 有关程序集的一般信息由以下 +// 控制。更改这些特性值可修改 +// 与程序集关联的信息。 +[assembly: AssemblyTitle("DemoStrategy")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("")] +[assembly: AssemblyProduct("DemoStrategy")] +[assembly: AssemblyCopyright("Copyright © 2015")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +//将 ComVisible 设置为 false 将使此程序集中的类型 +//对 COM 组件不可见。 如果需要从 COM 访问此程序集中的类型, +//请将此类型的 ComVisible 特性设置为 true。 +[assembly: ComVisible(false)] + +// 如果此项目向 COM 公开,则下列 GUID 用于类型库的 ID +[assembly: Guid("9a3793db-03de-4c99-9525-c7c7bee9cb93")] + +// 程序集的版本信息由下列四个值组成: +// +// 主版本 +// 次版本 +// 生成号 +// 修订号 +// +//可以指定所有这些值,也可以使用“生成号”和“修订号”的默认值, +// 方法是按如下所示使用“*”: : +// [assembly: AssemblyVersion("1.0.*")] +[assembly: AssemblyVersion("1.0.0.0")] +[assembly: AssemblyFileVersion("1.0.0.0")] diff --git a/DemoStrategy/packages.config b/DemoStrategy/packages.config new file mode 100644 index 0000000..1d83c1c --- /dev/null +++ b/DemoStrategy/packages.config @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/Quanter.Akka.sln b/Quanter.Akka.sln new file mode 100644 index 0000000..3788dda --- /dev/null +++ b/Quanter.Akka.sln @@ -0,0 +1,115 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio 14 +VisualStudioVersion = 14.0.23107.0 +MinimumVisualStudioVersion = 10.0.40219.1 +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Quanter.StrategyServer", "Quanter.Trader.StrategyServer\Quanter.StrategyServer.csproj", "{F0E12B5E-7012-4345-B4A4-BE4CEDCE5E91}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Quanter.Trader.Messages", "Quanter.Trader.Messages\Quanter.Trader.Messages.csproj", "{DDE08214-EC3A-4DD7-8CEE-49973E17AE8F}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Quanter.Trader.Indicator", "Quanter.Trader.Indicator\Quanter.Trader.Indicator.csproj", "{44A87744-BF18-4658-A45C-FC4CBACA7E0F}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Quanter.Common", "Quanter.Common\Quanter.Common.csproj", "{A3FA3C71-A7B0-4BB6-BD32-0AEE20493593}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Quanter.Trader.Gui", "Quanter.Trader.Gui\Quanter.Trader.Gui.csproj", "{C37DE5A0-3069-4ECA-8560-7FF207A93CAD}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Quanter.MarketServer", "Quanter.Trader.MarketServer\Quanter.MarketServer.csproj", "{6D5C9C0A-3C0F-47F3-9BFF-2621CB1C5F10}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Quanter.Market.Sina", "Quanter.Market.Sina\Quanter.Market.Sina.csproj", "{EE7D7C04-1126-4C3F-8E24-A7A6008ED8A1}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Quanter.Persistence.Server", "Quanter.Persistence\Quanter.Persistence.Server.csproj", "{351AAA08-F483-403C-B4A4-A5725381C5E4}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "strategies", "strategies", "{24893ABE-9BBF-44DD-89FA-170DEAA59E4B}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "market", "market", "{B2FB459D-0E52-4ACB-98E9-B7DF7F7B4CD8}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "persistence", "persistence", "{4280B15A-5CC0-49D0-A1FC-39A45FDA384C}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "trader", "trader", "{2C415701-2C13-452D-A6BD-48A89F125FF6}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Quanter.Trader.Connector", "Quanter.Trader.Connector\Quanter.Trader.Connector.csproj", "{5DC68754-1D48-41A0-A3EE-BF91B336EF93}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "DemoStrategy", "DemoStrategy\DemoStrategy.csproj", "{9A3793DB-03DE-4C99-9525-C7C7BEE9CB93}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "tests", "tests", "{88FAA4F4-0FE2-4C1E-A593-AEF83F35BC56}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Tests.Quanter.Persistence", "Tests.Quanter.Persistence\Tests.Quanter.Persistence.csproj", "{86C3100A-2B80-4232-972B-4AA2AC97FD81}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Quanter.BusinessEntity", "Quanter.BusinessEntity\Quanter.BusinessEntity.csproj", "{34DB14A6-E4ED-4C4A-8CA6-939201A572BE}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "tests", "tests", "{6FDC62DC-8096-4BB4-A1A4-180AB6A83090}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "tests", "tests", "{67A9170D-BBBF-45BF-B2E3-EF8D1B1BF809}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Any CPU = Debug|Any CPU + Release|Any CPU = Release|Any CPU + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {F0E12B5E-7012-4345-B4A4-BE4CEDCE5E91}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {F0E12B5E-7012-4345-B4A4-BE4CEDCE5E91}.Debug|Any CPU.Build.0 = Debug|Any CPU + {F0E12B5E-7012-4345-B4A4-BE4CEDCE5E91}.Release|Any CPU.ActiveCfg = Release|Any CPU + {F0E12B5E-7012-4345-B4A4-BE4CEDCE5E91}.Release|Any CPU.Build.0 = Release|Any CPU + {DDE08214-EC3A-4DD7-8CEE-49973E17AE8F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {DDE08214-EC3A-4DD7-8CEE-49973E17AE8F}.Debug|Any CPU.Build.0 = Debug|Any CPU + {DDE08214-EC3A-4DD7-8CEE-49973E17AE8F}.Release|Any CPU.ActiveCfg = Release|Any CPU + {DDE08214-EC3A-4DD7-8CEE-49973E17AE8F}.Release|Any CPU.Build.0 = Release|Any CPU + {44A87744-BF18-4658-A45C-FC4CBACA7E0F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {44A87744-BF18-4658-A45C-FC4CBACA7E0F}.Debug|Any CPU.Build.0 = Debug|Any CPU + {44A87744-BF18-4658-A45C-FC4CBACA7E0F}.Release|Any CPU.ActiveCfg = Release|Any CPU + {44A87744-BF18-4658-A45C-FC4CBACA7E0F}.Release|Any CPU.Build.0 = Release|Any CPU + {A3FA3C71-A7B0-4BB6-BD32-0AEE20493593}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {A3FA3C71-A7B0-4BB6-BD32-0AEE20493593}.Debug|Any CPU.Build.0 = Debug|Any CPU + {A3FA3C71-A7B0-4BB6-BD32-0AEE20493593}.Release|Any CPU.ActiveCfg = Release|Any CPU + {A3FA3C71-A7B0-4BB6-BD32-0AEE20493593}.Release|Any CPU.Build.0 = Release|Any CPU + {C37DE5A0-3069-4ECA-8560-7FF207A93CAD}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {C37DE5A0-3069-4ECA-8560-7FF207A93CAD}.Debug|Any CPU.Build.0 = Debug|Any CPU + {C37DE5A0-3069-4ECA-8560-7FF207A93CAD}.Release|Any CPU.ActiveCfg = Release|Any CPU + {C37DE5A0-3069-4ECA-8560-7FF207A93CAD}.Release|Any CPU.Build.0 = Release|Any CPU + {6D5C9C0A-3C0F-47F3-9BFF-2621CB1C5F10}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {6D5C9C0A-3C0F-47F3-9BFF-2621CB1C5F10}.Debug|Any CPU.Build.0 = Debug|Any CPU + {6D5C9C0A-3C0F-47F3-9BFF-2621CB1C5F10}.Release|Any CPU.ActiveCfg = Release|Any CPU + {6D5C9C0A-3C0F-47F3-9BFF-2621CB1C5F10}.Release|Any CPU.Build.0 = Release|Any CPU + {EE7D7C04-1126-4C3F-8E24-A7A6008ED8A1}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {EE7D7C04-1126-4C3F-8E24-A7A6008ED8A1}.Debug|Any CPU.Build.0 = Debug|Any CPU + {EE7D7C04-1126-4C3F-8E24-A7A6008ED8A1}.Release|Any CPU.ActiveCfg = Release|Any CPU + {EE7D7C04-1126-4C3F-8E24-A7A6008ED8A1}.Release|Any CPU.Build.0 = Release|Any CPU + {351AAA08-F483-403C-B4A4-A5725381C5E4}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {351AAA08-F483-403C-B4A4-A5725381C5E4}.Debug|Any CPU.Build.0 = Debug|Any CPU + {351AAA08-F483-403C-B4A4-A5725381C5E4}.Release|Any CPU.ActiveCfg = Release|Any CPU + {351AAA08-F483-403C-B4A4-A5725381C5E4}.Release|Any CPU.Build.0 = Release|Any CPU + {5DC68754-1D48-41A0-A3EE-BF91B336EF93}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {5DC68754-1D48-41A0-A3EE-BF91B336EF93}.Debug|Any CPU.Build.0 = Debug|Any CPU + {5DC68754-1D48-41A0-A3EE-BF91B336EF93}.Release|Any CPU.ActiveCfg = Release|Any CPU + {5DC68754-1D48-41A0-A3EE-BF91B336EF93}.Release|Any CPU.Build.0 = Release|Any CPU + {9A3793DB-03DE-4C99-9525-C7C7BEE9CB93}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {9A3793DB-03DE-4C99-9525-C7C7BEE9CB93}.Debug|Any CPU.Build.0 = Debug|Any CPU + {9A3793DB-03DE-4C99-9525-C7C7BEE9CB93}.Release|Any CPU.ActiveCfg = Release|Any CPU + {9A3793DB-03DE-4C99-9525-C7C7BEE9CB93}.Release|Any CPU.Build.0 = Release|Any CPU + {86C3100A-2B80-4232-972B-4AA2AC97FD81}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {86C3100A-2B80-4232-972B-4AA2AC97FD81}.Debug|Any CPU.Build.0 = Debug|Any CPU + {86C3100A-2B80-4232-972B-4AA2AC97FD81}.Release|Any CPU.ActiveCfg = Release|Any CPU + {86C3100A-2B80-4232-972B-4AA2AC97FD81}.Release|Any CPU.Build.0 = Release|Any CPU + {34DB14A6-E4ED-4C4A-8CA6-939201A572BE}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {34DB14A6-E4ED-4C4A-8CA6-939201A572BE}.Debug|Any CPU.Build.0 = Debug|Any CPU + {34DB14A6-E4ED-4C4A-8CA6-939201A572BE}.Release|Any CPU.ActiveCfg = Release|Any CPU + {34DB14A6-E4ED-4C4A-8CA6-939201A572BE}.Release|Any CPU.Build.0 = Release|Any CPU + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection + GlobalSection(NestedProjects) = preSolution + {F0E12B5E-7012-4345-B4A4-BE4CEDCE5E91} = {24893ABE-9BBF-44DD-89FA-170DEAA59E4B} + {6D5C9C0A-3C0F-47F3-9BFF-2621CB1C5F10} = {B2FB459D-0E52-4ACB-98E9-B7DF7F7B4CD8} + {EE7D7C04-1126-4C3F-8E24-A7A6008ED8A1} = {B2FB459D-0E52-4ACB-98E9-B7DF7F7B4CD8} + {351AAA08-F483-403C-B4A4-A5725381C5E4} = {4280B15A-5CC0-49D0-A1FC-39A45FDA384C} + {5DC68754-1D48-41A0-A3EE-BF91B336EF93} = {2C415701-2C13-452D-A6BD-48A89F125FF6} + {9A3793DB-03DE-4C99-9525-C7C7BEE9CB93} = {24893ABE-9BBF-44DD-89FA-170DEAA59E4B} + {88FAA4F4-0FE2-4C1E-A593-AEF83F35BC56} = {4280B15A-5CC0-49D0-A1FC-39A45FDA384C} + {86C3100A-2B80-4232-972B-4AA2AC97FD81} = {88FAA4F4-0FE2-4C1E-A593-AEF83F35BC56} + {34DB14A6-E4ED-4C4A-8CA6-939201A572BE} = {4280B15A-5CC0-49D0-A1FC-39A45FDA384C} + {6FDC62DC-8096-4BB4-A1A4-180AB6A83090} = {24893ABE-9BBF-44DD-89FA-170DEAA59E4B} + {67A9170D-BBBF-45BF-B2E3-EF8D1B1BF809} = {B2FB459D-0E52-4ACB-98E9-B7DF7F7B4CD8} + EndGlobalSection +EndGlobal diff --git a/Quanter.BusinessEntity/EAccount.cs b/Quanter.BusinessEntity/EAccount.cs new file mode 100644 index 0000000..5086b6f --- /dev/null +++ b/Quanter.BusinessEntity/EAccount.cs @@ -0,0 +1,28 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Quanter.BusinessEntity +{ + public class EAccount + { + public virtual int Id { get; set; } + public virtual EStrategy Strategy { get; set; } // 策略 + public virtual float CurrentBalance { get; set; } // 资金余额 + public virtual float EnableBalance { get; set; } // 可用金额 + public virtual float FetchBalance { get; set; } // 可取金额 + public virtual float FrozenBalance { get; set; } // 冻结金额 + public virtual float MarketValue { get; set; } // 股票市值 + public virtual float AssetBalance { get; set; } // 总资产 + public virtual DateTime Date { get; set; } // 最新资产的时间 + + //private List holders = new List(); + //public virtual List Holders + //{ + // get { return this.holders; } + // set { } + //} + } +} diff --git a/Quanter.BusinessEntity/ECube.cs b/Quanter.BusinessEntity/ECube.cs new file mode 100644 index 0000000..631ee87 --- /dev/null +++ b/Quanter.BusinessEntity/ECube.cs @@ -0,0 +1,17 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Quanter.BusinessEntity +{ + public class ECube + { + public virtual int Id { get; set; } + public virtual EStrategy Strategy { get; set; } // 策略ID + public virtual String Cube { get; set; } // 组合代码 + public virtual long PreAdjustmentId { get; set; } //调整ID + + } +} diff --git a/Quanter.BusinessEntity/EStockHolder.cs b/Quanter.BusinessEntity/EStockHolder.cs new file mode 100644 index 0000000..8448c73 --- /dev/null +++ b/Quanter.BusinessEntity/EStockHolder.cs @@ -0,0 +1,22 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Quanter.BusinessEntity +{ + public class EStockHolder + { + public EStrategy Strategy { get; set; } + public virtual String Symbol { get; set; } + public virtual String Name { get; set; } + public virtual float MarketValue { get { return LastPrice * CurrentAmount; } } + public virtual float CostPrice { get; set; } + public virtual int CurrentAmount { get; set; } + public virtual int EnableAmount { get; set; } + public virtual int IncomeAmount { get; set; } // 冻结 + public virtual float LastPrice { get; set; } + + } +} diff --git a/Quanter.BusinessEntity/EStrategy.cs b/Quanter.BusinessEntity/EStrategy.cs new file mode 100644 index 0000000..462db04 --- /dev/null +++ b/Quanter.BusinessEntity/EStrategy.cs @@ -0,0 +1,34 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Quanter.BusinessEntity +{ + public class EStrategy + { + public virtual int Id { get; set; } + public virtual String Name { get; set; } + public virtual String Desc { get; set; } + public virtual String Type { get; set; } + + // public virtual bool Enabled { get; set; } + // public virtual float CurrentBalance { get; set; } // 资金余额 + // public virtual float FetchBalance { get; set; } // 可取金额 + public virtual float EnableBalance { get; set; } // 可用金额 + public virtual float FrozenBalance { get; set; } // 冻结金额 + public virtual float MarketValue { get; set; } // 股票市值 + public virtual float AssetBalance { get; set; } // 总资产 + + public virtual DateTime Date { get; set; } + + private List holders = new List(); + public virtual List Holders + { + get { return this.holders; } + set { } + } + + } +} diff --git a/Quanter.BusinessEntity/EStrategy.hbm.xml b/Quanter.BusinessEntity/EStrategy.hbm.xml new file mode 100644 index 0000000..705379f --- /dev/null +++ b/Quanter.BusinessEntity/EStrategy.hbm.xml @@ -0,0 +1,18 @@ + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Quanter.BusinessEntity/EntrustRecord.hbm.xml b/Quanter.BusinessEntity/EntrustRecord.hbm.xml new file mode 100644 index 0000000..74133d8 --- /dev/null +++ b/Quanter.BusinessEntity/EntrustRecord.hbm.xml @@ -0,0 +1,22 @@ + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Quanter.BusinessEntity/Properties/AssemblyInfo.cs b/Quanter.BusinessEntity/Properties/AssemblyInfo.cs new file mode 100644 index 0000000..63bae96 --- /dev/null +++ b/Quanter.BusinessEntity/Properties/AssemblyInfo.cs @@ -0,0 +1,36 @@ +using System.Reflection; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; + +// 有关程序集的一般信息由以下 +// 控制。更改这些特性值可修改 +// 与程序集关联的信息。 +[assembly: AssemblyTitle("Stock.BusinessEntity")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("")] +[assembly: AssemblyProduct("Stock.BusinessEntity")] +[assembly: AssemblyCopyright("Copyright © 2015")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +//将 ComVisible 设置为 false 将使此程序集中的类型 +//对 COM 组件不可见。 如果需要从 COM 访问此程序集中的类型, +//请将此类型的 ComVisible 特性设置为 true。 +[assembly: ComVisible(false)] + +// 如果此项目向 COM 公开,则下列 GUID 用于类型库的 ID +[assembly: Guid("34db14a6-e4ed-4c4a-8ca6-939201a572be")] + +// 程序集的版本信息由下列四个值组成: +// +// 主版本 +// 次版本 +// 生成号 +// 修订号 +// +//可以指定所有这些值,也可以使用“生成号”和“修订号”的默认值, +// 方法是按如下所示使用“*”: : +// [assembly: AssemblyVersion("1.0.*")] +[assembly: AssemblyVersion("1.0.0.0")] +[assembly: AssemblyFileVersion("1.0.0.0")] diff --git a/Quanter.BusinessEntity/Quanter.BusinessEntity.csproj b/Quanter.BusinessEntity/Quanter.BusinessEntity.csproj new file mode 100644 index 0000000..6271a46 --- /dev/null +++ b/Quanter.BusinessEntity/Quanter.BusinessEntity.csproj @@ -0,0 +1,80 @@ + + + + + Debug + AnyCPU + {34DB14A6-E4ED-4C4A-8CA6-939201A572BE} + Library + Properties + Quanter.BusinessEntity + Quanter.BusinessEntity + v4.5.2 + 512 + + + true + full + false + bin\Debug\ + DEBUG;TRACE + prompt + 4 + + + pdbonly + true + bin\Release\ + TRACE + prompt + 4 + + + + ..\packages\Iesi.Collections.4.0.0.4000\lib\net40\Iesi.Collections.dll + True + + + ..\packages\NHibernate.4.0.4.4000\lib\net40\NHibernate.dll + True + + + + + + + + + + + + + + + + + + + + + + + + PreserveNewest + + + + PreserveNewest + + + + + + + \ No newline at end of file diff --git a/Quanter.BusinessEntity/StockHolder.hbm.xml b/Quanter.BusinessEntity/StockHolder.hbm.xml new file mode 100644 index 0000000..3555ad4 --- /dev/null +++ b/Quanter.BusinessEntity/StockHolder.hbm.xml @@ -0,0 +1,25 @@ + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Quanter.BusinessEntity/SubTradingAccount.hbm.xml b/Quanter.BusinessEntity/SubTradingAccount.hbm.xml new file mode 100644 index 0000000..6a6664e --- /dev/null +++ b/Quanter.BusinessEntity/SubTradingAccount.hbm.xml @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Quanter.BusinessEntity/TransactionRecord.hbm.xml b/Quanter.BusinessEntity/TransactionRecord.hbm.xml new file mode 100644 index 0000000..fbd5433 --- /dev/null +++ b/Quanter.BusinessEntity/TransactionRecord.hbm.xml @@ -0,0 +1,22 @@ + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Quanter.BusinessEntity/hibernate.cfg.xml b/Quanter.BusinessEntity/hibernate.cfg.xml new file mode 100644 index 0000000..b870a5e --- /dev/null +++ b/Quanter.BusinessEntity/hibernate.cfg.xml @@ -0,0 +1,17 @@ + + + + + NHibernate.Connection.DriverConnectionProvider + NHibernate.Driver.SQLite20Driver + Data Source=stock.db3;Version=3; + NHibernate.Dialect.SQLiteDialect + true=1;false=0 + true + + + \ No newline at end of file diff --git a/Quanter.BusinessEntity/packages.config b/Quanter.BusinessEntity/packages.config new file mode 100644 index 0000000..30a8e96 --- /dev/null +++ b/Quanter.BusinessEntity/packages.config @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/Quanter.BusinessEntity/stock.db3 b/Quanter.BusinessEntity/stock.db3 new file mode 100644 index 0000000000000000000000000000000000000000..4bcd6ee6369dedb42029abcdde842d5bf08c7938 GIT binary patch literal 19456 zcmeHP3ve98neLumX;-p^thH?8hs@Ymk+n$9%=GM&_&m~Tv1CcR(rRU7C)`?*HbPj) zSe7xym@u+^yh7qUAP}HpUqKZ~6~wuO@*A9(x^e3aJjpG zp8J^bM7r2uSM6x0x2O02|L^a=AJg;yJ?iQ17#`2CpW8Bad;d5~kqcprB$h>}>S=_~ zTsRpxs}ORH!M6)en@f@kZe+N=Ughdi#c(NW%%5}5c3+n3dM8$ajXGb!r zbYE|*yRA1J?QM?bUCfFmV@;_Tn`&zAfHaqmUD-CsPV{-)6Df~-L47^mJD>~eNhPA~ z>DEL?ODvg6!xbtmam%|(+zT2T@t%5}Di%*AdwWvpWGtFUwxrVe*QEu(xxaQXr3-Gj z0dG(RZQD8m225|uY~7w29mo`1k~}d5Kdv0@zdh3cob_PjyB925h9?%ARY*d$*KSbM z*K)2rN!fDM4D9gecxEUw#@;bDe0%@cPIhxY$e9Q3Yz*y$?%;`tQD5&&T4by_*w>4xm;VKuJ<BHgv@{u{zYIRBtk#SRYG5i6L`S4-A0gYV+NAr8gf` zO0Q4P_}K915HzQH%z;!nmGSO{^BOoS;e>IIO5mIgX9b+I;4FjF17|6m<#4*;%$*nD zvUn6NaD`i77vn*-{F-zb-Pp=ej(_+0$KHMP+4E0+``!I}rVf8|>d3dXlAiG`1DjXD zXz7O;cIT?T?V0Z3?W+byM(lq`jr9*?G$MmX;CO!{&o}av6=+1H5r0^AV-KP<)?Y>^ zPaK;P8(Vpf6FKhk!_z=S z3;_I&g*mmq{IF`Rcb9-bV1VJRjl22&KD;(FM=n|H$O=W6%en1BSwv_5Kg0 zP;UMae+Wj{Lm%h;KfrQfbtMw2KvS@YKa9{}{2&u%Dwy-kNqh?~!7pN-yixdv9!BXI z%?`eK

jxhY&&;bh^v@n2RDXiWq@)5f}DVPoMUa*r0Xi$d%4LcW4vnmm}P$C;k^y zb5TWnk|B*yucG2F-_}w?kf8P)Ar$dbUvrkW+N=&_G+Lv_!(<}_d~33_RSNCzQ(9`u z)n+9j;un44EG@C4TT2%$SjeB3!U4P+{r{h?L_5K5+Kvp~-#ElD*Qp54zt0U2_4sh(8F^ z*WAGDTs~O*!Hr+zE2)-h&wXxFE+0(2qH?biDT&N7`CLW~H9oM-it4)+yrmERSD%UL zSMGCuW!kO^l$*SuD`0Yd9n(D`MPjO5^Z7(E;^$m}vRpo>BhQH%CT@^Ac0O?+S67kc z0Su;_K#AX@@?ottz%;>tpz#e#z3uy0TQblENuc!q z!6$IUeE$C)C{#R(7ARWaO1D5e14Dfob~6lJ=*GMsyqDtS15chk@{Os9gUy3$-g^2U zSg1qusz}P5&?w7s5%r@@CQ|b@DghD1=6;R{dJ~~HaUJs>^WH}hn*-d-dtCYeoxGB` zubu$i5;f47$p+|hJU)dUpb~3fE{A#sK{+iE@=6rg%;S?xtj7 zV=Qhd?rci7L+E#XQ%7$$TG!Om17#Kou~f9xQmTb4EyZ~uz50ntJqX;b+a}*fR_HTx z3IZovW?&m79_7*pY37GHFBZ@=T!hd{5Ws|>aeW2;Hwf^b zLFf!w5812sm{?xwE{3J^!_v?*lsyDmV?!`piQNw?J0j{PGwH+gGsu%ZLQKJl=Z)x+=a;R$svdVzD=GY50JaaYUA&!oe+wO z7cFqPEkK?^i5ibbiCqXmF$|Yd4K^=l!!?(4JqxZ`oVwoSqPP&qoL=$l?I&}TB|}o4)u8% zy-bUB5cK1LKPsDhF!_^WsS5HZ=0zsWRN~Wk2d+gwLpx9{ly}Ps`OZp&7lKoY@i6Yn zN;j0Q2(GR` zSkzMK=#Kw=2jodz9j~2&@4-PM2U7JiQ>v&qdH7(24=~?Fu5Ni;mke$&Q&*0LL03qn zsr!GeO78v-Rbxs22Dy69Ms7mhX4IcCWpY6QlvPsiKT4eDn8OX=6w>n`QO{W=`rG6& zRia064{2Je4|0N*uK6F$nPq%8HX1owSz8NbfnH$>t)ryUtk0;syo_(qOE0mJ)hXYh z*VJqmup2KzcvMNzx7K`EzWP43MT{KirkB~sOUV5NmLrN*LP$%aqY_Tq8F(?iGO6`WQPCjGgL8M-4h~$H+NC-^u37Idbwk8s44I;S~ zQR-Z%dJfeNqvt`Qp0km-zDf~To7K^!j1){%4P$L`R;IK9y3vpry~0 zJ|o@unyNL&8Ks(BUK@yD$l3Cp73g)?+*gapb7VasF#d-u;~$}`X8fm%<6obhuaNN% zoy?=$Ioi#6z#Osm^MEn(9p`}J_;=I4di+NqzQIBKANHP;&mi&wB*mj>fuaR2nFSK^ zUB)UvUpB)sg$vQ3mWGhT|4t1A5|*$=9wt7$)K~>5n@?chPylwxB;*|h602arDDcX% z5z^~ZYu?wEXEldv4jFk^py{Q#5@CBt2tLaA_oB6kyh(|jkS z@GL<;%;ocOFce$&&LK2n{ETj_;)df)b&3p zg-r1%THp${K#x42u7EFv;~1QZ@CZ!d?SvlrvxQP&`5}g=mP#i)nmbx|5raGW;%;Nr zRSA0ldEwGKKNIpMWBvbEIigh^DLeuMmGM6xh2XU!@BrRJy2uLV1Lig605i_CGE4Bk z<5%$Gcmzwh8eSAQf%c<8Acn(tLv}m0!^VEV@bf<3v}rkC{d8%0zi;KVX+>Y%3}`0qynErWJh4XF$7b2DI$7X?fpuGoW2MZCcJ(GhJF<@GY4(E$>@A z1KLH?rsaGKXFz-HbZOz`m<2PSoj*NVnE5#E`TwT;=l@5TKIVG-9zKfq;sjoVCeb0Z z3*B__+XCI_^ysm++c#M7yb^@Xh;)O~L(b6Kx6QX>>T^PhoZj79z!ZRo9D1`8QsXVR zHQO<*cS4HRCBJE93ejFCq=6T{(rw3-azbi4Y@$+t#0A!Ze4&I5QxB|U}4x-J-Z;pQ|&vDYv|HQwR7C^yk3L=#&ofKS2e`3BY zqB{vSu4|mIR{#0%EmkZ_fJ7I-? z@$1K}Ts)P_oUk^2`nq+tTplN^Pt$#(m5ZaY+X-veu~*L7a+Nw^-Sbu7Pc2+DOyv?M zteQo)?Xl%@Ibpdjpp{mx5S57&R_(oO{>he$al%@64=Qw>!n=V%Dq| + /// 股票价格队列, 当价格发生变动时,发送给观察者 + /// + public class BidCacheQueue + { + ///

+ /// 定义一个委托类型 + /// + /// + /// + public delegate void BidChangeHandler(object sender, TickData bid); + + /// 定义一个事件 + public event BidChangeHandler OnBidChange; + + private TickData lastData; + private Queue queue = new Queue(); + + private String code = null; + // private String name = null; + + public BidCacheQueue(String code) + { + this.code = code; + } + + public String Code { get { return code; } } + // public String Name {get {return name;}} + + public TickData LastData + { + get + { + if (lastData == null) + lastData = new TickData(); + return lastData; + } + } + + List bids = new List(); + public List BidList + { + get { return this.bids; } + } + + public void Enqueue(TickData obj) + { + bids.Insert(0, obj); + queue.Enqueue(obj); + lastData = obj; + if (OnBidChange != null) + { + OnBidChange(this, obj); + } + } + + public TickData Dequeue() + { + return queue.Dequeue(); + } + } +} diff --git a/Quanter.Common/DllUtils.cs b/Quanter.Common/DllUtils.cs new file mode 100644 index 0000000..fbdace8 --- /dev/null +++ b/Quanter.Common/DllUtils.cs @@ -0,0 +1,30 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Reflection; +using System.Text; +using System.Threading.Tasks; + +namespace Quanter.Common +{ + public class DllUtils + { + public static T CreateInstance(string dllPath, String className) + { + Assembly ass = Assembly.LoadFrom(dllPath); + + Type type = ass.GetType(className); + try + { + object obj = Activator.CreateInstance(type); + return (T)obj; + } + catch (Exception e) + { + return default(T); + } + + } + + } +} diff --git a/Quanter.Common/HttpClient.cs b/Quanter.Common/HttpClient.cs new file mode 100644 index 0000000..d9c03be --- /dev/null +++ b/Quanter.Common/HttpClient.cs @@ -0,0 +1,161 @@ +using System; +using System.Collections.Generic; +using System.IO; +using System.Linq; +using System.Net; +using System.Net.Security; +using System.Security.Cryptography.X509Certificates; +using System.Text; +using System.Threading.Tasks; + +namespace Quanter.Common +{ + public class HttpClient : WebClient + { + public string Post(string url, string body) + { + HttpWebRequest httpWebRequest = (HttpWebRequest)WebRequest.Create(url); + + httpWebRequest.ContentType = "application/x-www-form-urlencoded"; + httpWebRequest.Method = "POST"; + httpWebRequest.Timeout = 20000; + + byte[] btBodys = Encoding.UTF8.GetBytes(body); + httpWebRequest.ContentLength = btBodys.Length; + httpWebRequest.GetRequestStream().Write(btBodys, 0, btBodys.Length); + + HttpWebResponse httpWebResponse = (HttpWebResponse)httpWebRequest.GetResponse(); + StreamReader streamReader = new StreamReader(httpWebResponse.GetResponseStream()); + string responseContent = streamReader.ReadToEnd(); + + httpWebResponse.Close(); + streamReader.Close(); + httpWebRequest.Abort(); + httpWebResponse.Close(); + + return responseContent; + } + + public string Get(String address) + { + return Get(address, Encoding.Default); + } + + public string Get(string address, Encoding encoding) + { + HttpWebRequest httpWebRequest = null; + httpWebRequest = (HttpWebRequest)WebRequest.Create(address); + httpWebRequest.Accept = "text/html,application/xhtml+xml,application/xml;*/*;q=0.8"; + httpWebRequest.Headers.Add("Accept-Language", "zh-CN,zh;q=0.8"); + httpWebRequest.Headers.Add("UA-CPU", "x86"); + httpWebRequest.Headers.Add("Accept-Charset", "utf8;q=0.8;"); + httpWebRequest.ContentType = "application/json"; + httpWebRequest.Method = "GET"; + httpWebRequest.Timeout = 2000; + httpWebRequest.KeepAlive = true; + httpWebRequest.CookieContainer = this.Cookies; + + HttpWebResponse httpWebResponse = null; + StreamReader streamReader = null; + string responseContent = null; + try + { + httpWebResponse = (HttpWebResponse)httpWebRequest.GetResponse(); + streamReader = new StreamReader(httpWebResponse.GetResponseStream(), encoding); + responseContent = streamReader.ReadToEnd(); + } + catch (Exception e) + { + Console.WriteLine(e.StackTrace); + } + finally + { + if (httpWebResponse != null) httpWebResponse.Close(); + if (streamReader != null) streamReader.Close(); + } + + + return responseContent; + } + //private int _timeOut; + //private CookieContainer cookieContainer; + private string Referer; + + public HttpClient() : this(new CookieContainer()) + { + } + + public HttpClient(CookieContainer cookies) + { + this.Timeout = 0xea00; + this.Referer = ""; + this.Cookies = cookies; + this.Proxy = null; + ServicePointManager.DefaultConnectionLimit = 100; + ServicePointManager.ServerCertificateValidationCallback = new RemoteCertificateValidationCallback(this.CheckValidationResult); + } + + public bool CheckValidationResult(object sender, X509Certificate certificate, X509Chain chain, SslPolicyErrors errors) + { + return true; + } + + protected override WebRequest GetWebRequest(Uri address) + { + ServicePointManager.ServerCertificateValidationCallback = new RemoteCertificateValidationCallback(this.CheckValidationResult); + WebRequest webRequest = base.GetWebRequest(address); + webRequest.Timeout = this.Timeout; + if (webRequest is HttpWebRequest) + { + HttpWebRequest request2 = webRequest as HttpWebRequest; + request2.Headers.Clear(); + request2.CookieContainer = this.Cookies; ; + request2.Accept = "text/html,application/xhtml+xml,application/xml;*/*;q=0.8"; + request2.Headers.Add("Accept-Language", "zh-CN,zh;q=0.8"); + request2.Headers.Add("UA-CPU", "x86"); + request2.Headers.Add("Accept-Charset", "utf8;q=0.8;"); + if (this.IsGzip) + { + request2.Headers.Add("Accept-Encoding", "gzip, deflate, sdch"); + } + if (this.Referer != "") + { + request2.Referer = this.Referer; + } + // request2.UserAgent = "Baiduspider + (+http://www.baidu.com/search/spider.htm)"; + request2.UserAgent = "Mozilla/5.0 (Windows; U; Windows NT 6.0; zh-CN; rv:1.9.0.5) Gecko/2008120122 Firefox/3.0.5)"; + if (this.Referer != "") + { + request2.Referer = this.Referer; + } + if (webRequest.Method.ToLower() == "post") + { + request2.ContentType = "application/x-www-form-urlencoded"; + } + this.Referer = address.ToString(); + } + + return webRequest; + } + + + /// + /// 超时的操作 + /// + /// + private void _timer_TimeOver(object userdata) + { + CancelAsync(); + if (DownloadStringTimeout != null) + DownloadStringTimeout(this); + } + + public delegate void DownloadStringTimeoutEventHandler(object sender); + public event DownloadStringTimeoutEventHandler DownloadStringTimeout; + + // Properties + public CookieContainer Cookies { get; set; } + public bool IsGzip { get; set; } + public int Timeout { get; set; } + } +} diff --git a/Quanter.Common/Properties/AssemblyInfo.cs b/Quanter.Common/Properties/AssemblyInfo.cs new file mode 100644 index 0000000..601fc08 --- /dev/null +++ b/Quanter.Common/Properties/AssemblyInfo.cs @@ -0,0 +1,36 @@ +using System.Reflection; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; + +// 有关程序集的一般信息由以下 +// 控制。更改这些特性值可修改 +// 与程序集关联的信息。 +[assembly: AssemblyTitle("Stock.Common")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("")] +[assembly: AssemblyProduct("Stock.Common")] +[assembly: AssemblyCopyright("Copyright © 2015")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +//将 ComVisible 设置为 false 将使此程序集中的类型 +//对 COM 组件不可见。 如果需要从 COM 访问此程序集中的类型, +//请将此类型的 ComVisible 特性设置为 true。 +[assembly: ComVisible(false)] + +// 如果此项目向 COM 公开,则下列 GUID 用于类型库的 ID +[assembly: Guid("a3fa3c71-a7b0-4bb6-bd32-0aee20493593")] + +// 程序集的版本信息由下列四个值组成: +// +// 主版本 +// 次版本 +// 生成号 +// 修订号 +// +//可以指定所有这些值,也可以使用“生成号”和“修订号”的默认值, +// 方法是按如下所示使用“*”: : +// [assembly: AssemblyVersion("1.0.*")] +[assembly: AssemblyVersion("1.0.0.0")] +[assembly: AssemblyFileVersion("1.0.0.0")] diff --git a/Quanter.Common/Quanter.Common.csproj b/Quanter.Common/Quanter.Common.csproj new file mode 100644 index 0000000..eaa1c12 --- /dev/null +++ b/Quanter.Common/Quanter.Common.csproj @@ -0,0 +1,108 @@ + + + + + Debug + AnyCPU + {A3FA3C71-A7B0-4BB6-BD32-0AEE20493593} + Library + Properties + Quanter.Common + Quanter.Common + v4.5.2 + 512 + + + true + full + false + bin\Debug\ + DEBUG;TRACE + prompt + 4 + + + pdbonly + true + bin\Release\ + TRACE + prompt + 4 + + + + ..\packages\Akka.1.0.5\lib\net45\Akka.dll + True + + + ..\packages\Common.Logging.1.2.0\lib\1.0\Common.Logging.dll + True + + + ..\packages\Iesi.Collections.4.0.0.4000\lib\net40\Iesi.Collections.dll + True + + + ..\packages\Newtonsoft.Json.7.0.1\lib\net45\Newtonsoft.Json.dll + True + + + ..\packages\NHibernate.4.0.4.4000\lib\net40\NHibernate.dll + True + + + ..\packages\Quartz.1.0.3\lib\3.5\Quartz.dll + True + + + ..\packages\Spring.Aop.1.3.2\lib\net40\Spring.Aop.dll + True + + + ..\packages\Spring.Core.1.3.2\lib\net40\Spring.Core.dll + True + + + ..\packages\Spring.Data.1.3.2\lib\net40\Spring.Data.dll + True + + + ..\packages\Spring.Scheduling.Quartz.1.3.2\lib\net40\Spring.Scheduling.Quartz.dll + True + + + + + + + + + + + + + + + + + + Component + + + + + + + + + + + + + \ No newline at end of file diff --git a/Quanter.Common/QuoteData.cs b/Quanter.Common/QuoteData.cs new file mode 100644 index 0000000..2b128cb --- /dev/null +++ b/Quanter.Common/QuoteData.cs @@ -0,0 +1,143 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Quanter.Common +{ + public class QuoteData + { + //public class GoodsData : ICloneable + //{ + // public float Price { get; set; } + // public int OrderAmount { get; set; } + + // public GoodsData(float price, int amount) + // { + // Price = price; + // OrderAmount = amount; + // } + + // public GoodsData DeepClone() + // { + // return (GoodsData)Clone(); + // } + // public object Clone() + // { + // GoodsData data = new GoodsData(Price, OrderAmount); + + // return data; + // } + //} + + public String Symbol { get; set; } // 证券代码 国际标准 + public String Alias { get; set; } // 证券代码 + public string Name { get; set; } // 名称 + + public float LastClose { get; set; } + public float Open { get; set; } + public float High { get; set; } + public float Low { get; set; } + + public float CurrentPrice { get; set; } // 成交价 + public long Volume { get; set; } // 成交量 + public float Turnover { get; set; } // 成交金额 + public String PushTime { get; set; } // 推送时间 + + //private ICollection buyList = new List(); + //private ICollection sellList = new List(); + + //public GoodsData[] BuyList + //{ + // get + // { + // if (buyList.Count == 0) return new GoodsData[5] { new GoodsData(0, 0), new GoodsData(0, 0), new GoodsData(0, 0), new GoodsData(0, 0), new GoodsData(0, 0) }; + // return this.buyList.ToArray(); + // } + //} + + //public GoodsData[] SellList + //{ + // get + // { + // if (sellList.Count == 0) return new GoodsData[5] { new GoodsData(0, 0), new GoodsData(0, 0), new GoodsData(0, 0), new GoodsData(0, 0), new GoodsData(0, 0) }; + + // return this.sellList.ToArray(); + // } + //} + + #region 买卖5档 + public long SellVolume { get; set; } + public long BuyVolume { get; set; } + public float SellPrice1 { get; set; } + public long SellVolume1 { get; set; } + public float SellPrice2 { get; set; } + public long SellVolume2 { get; set; } + public float SellPrice3 { get; set; } + public long SellVolume3 { get; set; } + public float SellPrice4 { get; set; } + public long SellVolume4 { get; set; } + public float SellPrice5 { get; set; } + public long SellVolume5 { get; set; } + public float BuyPrice1 { get; set; } + public long BuyVolume1 { get; set; } + public float BuyPrice2 { get; set; } + public long BuyVolume2 { get; set; } + public float BuyPrice3 { get; set; } + public long BuyVolume3 { get; set; } + public float BuyPrice4 { get; set; } + public long BuyVolume4 { get; set; } + public float BuyPrice5 { get; set; } + public long BuyVolume5 { get; set; } + #endregion + + public float PE { get; set; } + public float Amplitude { get; set; } + public float HighLimit { get; set; } + public float LowLimit { get; set; } + + //public void AddBuyGoodsData(GoodsData data) + //{ + // this.buyList.Add(data); + //} + + //public void AddSellGoodsData(GoodsData data) + //{ + // this.sellList.Add(data); + //} + + //public TickData DeepClone() + //{ + // return (TickData)Clone(); + //} + //public object Clone() + //{ + // QuoteData bid = new QuoteData(); + // bid.Symbol = Symbol; + // bid.High = High; + // bid.Low = Low; + // bid.Open = Open; + // bid.LastClose = LastClose; + + // bid.CurrentPrice = CurrentPrice; + // bid.Turnover = Turnover; + // bid.Volumn = Volumn; + // bid.PushTime = PushTime; + + // bid.buyList = new List(); + // buyList.AsParallel().ForAll(d => + // { + // bid.buyList.Add(d.DeepClone()); + // }); + + // bid.sellList = new List(); + // sellList.AsParallel().ForAll(d => + // { + // bid.sellList.Add(d.DeepClone()); + // }); + + // return bid; + //} + } +} diff --git a/Quanter.Common/Securities.cs b/Quanter.Common/Securities.cs new file mode 100644 index 0000000..585aa91 --- /dev/null +++ b/Quanter.Common/Securities.cs @@ -0,0 +1,58 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Runtime.Serialization; +using System.Text; +using System.Threading.Tasks; + +namespace Quanter.Common +{ + [Serializable] + public class Securities : ISerializable + { + public SecuritiesTypes Type { get; private set; } + public MarketType MarketType { get; private set; } + + public String Symbol { get; private set; } + public String Alias { + get + { + String alias = string.Empty; + switch(MarketType) + { + case MarketType.XSHG: + alias = "sh" + Symbol.Substring(0,6); + break; + case MarketType.XSHE: + alias = "sz" + Symbol.Substring(0, 6); + break; + default: + break; + } + + return alias; + } + } + + public Securities(SecuritiesTypes secType, MarketType marketType, String code) + { + this.Type = secType; + this.MarketType = marketType; + this.Symbol = code + "." + marketType.ToString(); + } + + public Securities(SecuritiesTypes secType, String symbol) + { + this.Type = secType; + this.Symbol = symbol; + int index = symbol.IndexOf("."); + this.MarketType = (MarketType)Enum.Parse(MarketType.GetType(), symbol.Substring(index+1)); + } + + public void GetObjectData(SerializationInfo info, StreamingContext context) + { + info.AddValue("Type", Type); + info.AddValue("MarketType", MarketType); + } + } +} diff --git a/Quanter.Common/SecuritiesTypes.cs b/Quanter.Common/SecuritiesTypes.cs new file mode 100644 index 0000000..4e71907 --- /dev/null +++ b/Quanter.Common/SecuritiesTypes.cs @@ -0,0 +1,24 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Quanter.Common +{ + public enum SecuritiesTypes + { + Stock, + Future, + Option, + Commodity, + Cfd, + Swap + } + + public enum MarketType + { + XSHG, // 上交所 + XSHE, // 深交所 + } +} diff --git a/Quanter.Common/StockUtil.cs b/Quanter.Common/StockUtil.cs new file mode 100644 index 0000000..055b015 --- /dev/null +++ b/Quanter.Common/StockUtil.cs @@ -0,0 +1,98 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Quanter.Common +{ + public class StockUtil + { + private static Random random = new Random(); + public static string getCode(String code) + { + if (code.Length == 6) + return code; + else if (code.Length == 8) + return code.Substring(2); + + return code; + } + + public static string GetFullCode(String stockCode) + { + if (stockCode.Length == 6) + { + switch (stockCode.Substring(0, 2)) + { + case "51": + case "50": + case "60": + stockCode = "sh" + stockCode; + return stockCode; + + case "00": + case "15": + case "16": + case "30": + stockCode = "sz" + stockCode; + return stockCode; + } + } + return stockCode; + } + + public static int GetExchangeType(String code) + { + if (GetFullCode(code).StartsWith("sz")) return 2; + else if (GetFullCode(code).StartsWith("sh")) return 1; + + return 0; + } + + public static string Base64Encode(String s, Encoding e) + { + byte[] bytes = e.GetBytes(s); + + return Convert.ToBase64String(bytes); + } + + public static string Base64Decode(String s, Encoding e) + { + byte[] bytes = Convert.FromBase64String(s); + return e.GetString(bytes); + } + + public static string RandomString + { + get + { + return random.Next().ToString(); + } + } + + public static string GetFundCode(string code) + { + if (code.Length == 6) + return "f_" + code; + else if (code.Length == 8) + return "f_" + code.Substring(2, 6); + else return code; + } + + public static string GetShortCode(string code) + { + switch (code.Length) + { + case 6: + return code; + case 7: + return code.Substring(1); + case 8: + return code.Substring(2); + default: + return code; + } + } + } +} diff --git a/Quanter.Common/TickData.cs b/Quanter.Common/TickData.cs new file mode 100644 index 0000000..79e8ff6 --- /dev/null +++ b/Quanter.Common/TickData.cs @@ -0,0 +1,115 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Quanter.Common +{ + public class TickData : ICloneable + { + /// + /// 每价格挂单的数据 + /// + public class GoodsData : ICloneable + { + public float Price { get; set; } + public int OrderAmount { get; set; } + + public GoodsData(float price, int amount) + { + Price = price; + OrderAmount = amount; + } + + public GoodsData DeepClone() + { + return (GoodsData)Clone(); + } + public object Clone() + { + GoodsData data = new GoodsData(Price, OrderAmount); + + return data; + } + } + + public String Code { get; set; } // 证券代码 + public string Name { get; set; } // 名称 + + public float LastClose { get; set; } + public float Open { get; set; } + public float High { get; set; } + public float Low { get; set; } + + public float CurrentPrice { get; set; } // 成交价 + public long Volumn { get; set; } // 成交量 + public float Turnover { get; set; } // 成交金额 + public String PushTime { get; set; } // 推送时间 + + private ICollection buyList = new List(); + private ICollection sellList = new List(); + + public GoodsData[] BuyList + { + get + { + if (buyList.Count == 0) return new GoodsData[5] { new GoodsData(0, 0), new GoodsData(0, 0), new GoodsData(0, 0), new GoodsData(0, 0), new GoodsData(0, 0) }; + return this.buyList.ToArray(); + } + } + + public GoodsData[] SellList + { + get + { + if (sellList.Count == 0) return new GoodsData[5] { new GoodsData(0, 0), new GoodsData(0, 0), new GoodsData(0, 0), new GoodsData(0, 0), new GoodsData(0, 0) }; + + return this.sellList.ToArray(); + } + } + + public void AddBuyGoodsData(GoodsData data) + { + this.buyList.Add(data); + } + + public void AddSellGoodsData(GoodsData data) + { + this.sellList.Add(data); + } + + public TickData DeepClone() + { + return (TickData)Clone(); + } + public object Clone() + { + TickData bid = new TickData(); + bid.Code = Code; + bid.High = High; + bid.Low = Low; + bid.Open = Open; + bid.LastClose = LastClose; + + bid.CurrentPrice = CurrentPrice; + bid.Turnover = Turnover; + bid.Volumn = Volumn; + bid.PushTime = PushTime; + + bid.buyList = new List(); + buyList.AsParallel().ForAll(d=> + { + bid.buyList.Add(d.DeepClone()); + }); + + bid.sellList = new List(); + sellList.AsParallel().ForAll(d => + { + bid.sellList.Add(d.DeepClone()); + }); + + return bid; + } + } +} diff --git a/Quanter.Common/TraderResult.cs b/Quanter.Common/TraderResult.cs new file mode 100644 index 0000000..3e0c9f3 --- /dev/null +++ b/Quanter.Common/TraderResult.cs @@ -0,0 +1,32 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Quanter.Common +{ + public enum TraderResultEnum + { + SUCCESS, // 成功 + ERROR, // 错误 + UNLOGIN, // 未登录 + TIMEOUT // 超时 + } + + public class TraderResult + { + /// + /// -1: 表示调用不成功 + /// + public TraderResultEnum Code { get; set; } + public string Message { get; set; } + public int EntrustNo { get; set; } + public object Result { get; set; } + + public TraderResult() + { + Code = TraderResultEnum.TIMEOUT; + } + } +} diff --git a/Quanter.Common/packages.config b/Quanter.Common/packages.config new file mode 100644 index 0000000..4a2e796 --- /dev/null +++ b/Quanter.Common/packages.config @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/Quanter.Domain/Properties/AssemblyInfo.cs b/Quanter.Domain/Properties/AssemblyInfo.cs new file mode 100644 index 0000000..d5d1fd8 --- /dev/null +++ b/Quanter.Domain/Properties/AssemblyInfo.cs @@ -0,0 +1,36 @@ +using System.Reflection; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; + +// 有关程序集的一般信息由以下 +// 控制。更改这些特性值可修改 +// 与程序集关联的信息。 +[assembly: AssemblyTitle("Stock.Domain")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("")] +[assembly: AssemblyProduct("Stock.Domain")] +[assembly: AssemblyCopyright("Copyright © 2015")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +//将 ComVisible 设置为 false 将使此程序集中的类型 +//对 COM 组件不可见。 如果需要从 COM 访问此程序集中的类型, +//请将此类型的 ComVisible 特性设置为 true。 +[assembly: ComVisible(false)] + +// 如果此项目向 COM 公开,则下列 GUID 用于类型库的 ID +[assembly: Guid("ec87bcae-62f6-46dd-90df-68f39a475752")] + +// 程序集的版本信息由下列四个值组成: +// +// 主版本 +// 次版本 +// 生成号 +// 修订号 +// +//可以指定所有这些值,也可以使用“生成号”和“修订号”的默认值, +// 方法是按如下所示使用“*”: : +// [assembly: AssemblyVersion("1.0.*")] +[assembly: AssemblyVersion("1.0.0.0")] +[assembly: AssemblyFileVersion("1.0.0.0")] diff --git a/Quanter.Domain/Quanter.Domain.csproj b/Quanter.Domain/Quanter.Domain.csproj new file mode 100644 index 0000000..a8c5ee7 --- /dev/null +++ b/Quanter.Domain/Quanter.Domain.csproj @@ -0,0 +1,75 @@ + + + + + Debug + AnyCPU + {EC87BCAE-62F6-46DD-90DF-68F39A475752} + Library + Properties + Quanter.Domain + Quanter.Domain + v4.5.2 + 512 + + + true + full + false + bin\Debug\ + DEBUG;TRACE + prompt + 4 + + + pdbonly + true + bin\Release\ + TRACE + prompt + 4 + + + + + + + + + + + + + + + + + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + + + \ No newline at end of file diff --git a/Quanter.Domain/StrategyDesc.cs b/Quanter.Domain/StrategyDesc.cs new file mode 100644 index 0000000..a4c9871 --- /dev/null +++ b/Quanter.Domain/StrategyDesc.cs @@ -0,0 +1,23 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Quanter.Domain +{ + /// + /// 策略的种类 + /// + public class StrategyDesc + { + public virtual int Id { get; set; } + public virtual String Dll { get; set; } + public virtual String Clazz { get; set; } + public virtual String Name { get; set; } + public virtual String Desc { get; set; } + public virtual DateTime Date { get; set; } + public virtual bool Enabled { get; set; } + + } +} diff --git a/Quanter.Domain/User.cs b/Quanter.Domain/User.cs new file mode 100644 index 0000000..aeedcaa --- /dev/null +++ b/Quanter.Domain/User.cs @@ -0,0 +1,15 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Quanter.Domain +{ + public class User + { + public virtual int Id { get; set; } + public virtual String Username { get; set; } + public virtual String Password { get; set; } + } +} diff --git a/Quanter.Domain/config/StockHolder.hbm.xml b/Quanter.Domain/config/StockHolder.hbm.xml new file mode 100644 index 0000000..3555ad4 --- /dev/null +++ b/Quanter.Domain/config/StockHolder.hbm.xml @@ -0,0 +1,25 @@ + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Quanter.Domain/config/StrategyDesc.hbm.xml b/Quanter.Domain/config/StrategyDesc.hbm.xml new file mode 100644 index 0000000..0c46ea9 --- /dev/null +++ b/Quanter.Domain/config/StrategyDesc.hbm.xml @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Quanter.Domain/config/SubTradingAccount.hbm.xml b/Quanter.Domain/config/SubTradingAccount.hbm.xml new file mode 100644 index 0000000..6a6664e --- /dev/null +++ b/Quanter.Domain/config/SubTradingAccount.hbm.xml @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Quanter.Domain/config/TransactionRecord.hbm.xml b/Quanter.Domain/config/TransactionRecord.hbm.xml new file mode 100644 index 0000000..fbd5433 --- /dev/null +++ b/Quanter.Domain/config/TransactionRecord.hbm.xml @@ -0,0 +1,22 @@ + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Quanter.Domain/config/XueQiuCube.hbm.xml b/Quanter.Domain/config/XueQiuCube.hbm.xml new file mode 100644 index 0000000..6fa476d --- /dev/null +++ b/Quanter.Domain/config/XueQiuCube.hbm.xml @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Quanter.Domain/config/hibernate.cfg.xml b/Quanter.Domain/config/hibernate.cfg.xml new file mode 100644 index 0000000..be05be1 --- /dev/null +++ b/Quanter.Domain/config/hibernate.cfg.xml @@ -0,0 +1,22 @@ + + + + + NHibernate.Connection.DriverConnectionProvider + NHibernate.Driver.SQLite20Driver + Data Source=stock.db3;Version=3; + NHibernate.Dialect.SQLiteDialect + true=1;false=0 + true + + + + + + + + \ No newline at end of file diff --git a/Quanter.Market.Sina/Properties/AssemblyInfo.cs b/Quanter.Market.Sina/Properties/AssemblyInfo.cs new file mode 100644 index 0000000..5e84bf3 --- /dev/null +++ b/Quanter.Market.Sina/Properties/AssemblyInfo.cs @@ -0,0 +1,36 @@ +using System.Reflection; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; + +// 有关程序集的一般信息由以下 +// 控制。更改这些特性值可修改 +// 与程序集关联的信息。 +[assembly: AssemblyTitle("Stock.Market.Sina")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("")] +[assembly: AssemblyProduct("Stock.Market.Sina")] +[assembly: AssemblyCopyright("Copyright © 2015")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +//将 ComVisible 设置为 false 将使此程序集中的类型 +//对 COM 组件不可见。 如果需要从 COM 访问此程序集中的类型, +//请将此类型的 ComVisible 特性设置为 true。 +[assembly: ComVisible(false)] + +// 如果此项目向 COM 公开,则下列 GUID 用于类型库的 ID +[assembly: Guid("ee7d7c04-1126-4c3f-8e24-a7a6008ed8a1")] + +// 程序集的版本信息由下列四个值组成: +// +// 主版本 +// 次版本 +// 生成号 +// 修订号 +// +//可以指定所有这些值,也可以使用“生成号”和“修订号”的默认值, +// 方法是按如下所示使用“*”: : +// [assembly: AssemblyVersion("1.0.*")] +[assembly: AssemblyVersion("1.0.0.0")] +[assembly: AssemblyFileVersion("1.0.0.0")] diff --git a/Quanter.Market.Sina/Quanter.Market.Sina.csproj b/Quanter.Market.Sina/Quanter.Market.Sina.csproj new file mode 100644 index 0000000..5d26108 --- /dev/null +++ b/Quanter.Market.Sina/Quanter.Market.Sina.csproj @@ -0,0 +1,83 @@ + + + + + Debug + AnyCPU + {EE7D7C04-1126-4C3F-8E24-A7A6008ED8A1} + Library + Properties + Quanter.Market.Sina + Quanter.Market.Sina + v4.5.2 + 512 + + + true + full + false + bin\Debug\ + DEBUG;TRACE + prompt + 4 + + + pdbonly + true + bin\Release\ + TRACE + prompt + 4 + + + + ..\packages\Akka.1.0.5\lib\net45\Akka.dll + True + + + ..\packages\Newtonsoft.Json.7.0.1\lib\net45\Newtonsoft.Json.dll + True + + + ..\packages\NLog.3.0.0.0\lib\net45\NLog.dll + True + + + + + + + + + + + + + + + + + {a3fa3c71-a7b0-4bb6-bd32-0aee20493593} + Quanter.Common + + + {6d5c9c0a-3c0f-47f3-9bff-2621cb1c5f10} + Quanter.MarketServer + + + {dde08214-ec3a-4dd7-8cee-49973e17ae8f} + Quanter.Trader.Messages + + + + + + + + \ No newline at end of file diff --git a/Quanter.Market.Sina/SinaQuotationActor.cs b/Quanter.Market.Sina/SinaQuotationActor.cs new file mode 100644 index 0000000..7f5761a --- /dev/null +++ b/Quanter.Market.Sina/SinaQuotationActor.cs @@ -0,0 +1,136 @@ +using Quanter.Common; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Net; +using System.Text; +using System.Threading; +using System.Threading.Tasks; +using Akka.Actor; +using Akka.Event; +using Quanter.Trader.Messages; + +namespace Quanter.Market.Sina +{ + public class SinaQuotationActor : BaseQuotationActor + { + private CookieContainer Cookie = new CookieContainer(); + + private const string dataurl = "http://hq.sinajs.cn/list={0}"; + private HttpClient client = null; + private List symbols = new List(); + + protected override void PreStart() + { + client = new HttpClient(); + } + protected override void run() + { + _run(); + } + + private List t_ReqSymbols = new List(); + + private void _run() + { + _log.Info("sina level1 行情接收器开始运行"); + int n = 150; + bool isSent = false; + while (true) + { + if (aliases.Count != 0) + { + StringBuilder sb = new StringBuilder(); + for (int i = 0; i < aliases.Count; i++) + { + isSent = false; + sb.Append(aliases[i]); + sb.Append(","); + + if (i % n == (n - 1)) + { + sb.Remove(sb.Length - 1, 1); + t_ReqSymbols.Add(sb.ToString()); + sb.Clear(); + isSent = true; + } + } + if (!isSent) + { + sb.Remove(sb.Length - 1, 1); + t_ReqSymbols.Add(sb.ToString()); + } + } + + foreach (string item in t_ReqSymbols) + { + _sendRequest(item); + } + + Thread.Sleep(2500); + } + } + + private void _sendRequest(String s) + { + string resp = client.Get(String.Format(dataurl, s)); + if (resp == null) + { + _log.Warning("没有获取到数据 {0}", s); + return; + } + string[] respData = resp.Split(new char[] { '\n' }); + for (int i = 0; i < respData.Length; i++) + { + if (respData[i].Length != 0) + { + QuoteData qdata = _parseQuoteData(respData[i]); + newQuoteDataArrived(qdata); + } + } + } + + private QuoteData _parseQuoteData(string data) + { + String[] items = data.Split(new char[] { ',' }); + if (items.Length < 10) return null; + + QuoteData bid = new QuoteData(); + + bid.Alias = data.Substring(11, 8); + if (bid.Alias.StartsWith("sz")) { + bid.Symbol = bid.Alias.Substring(2, 6) + ".XSHE"; + } else + { + bid.Symbol = bid.Alias.Substring(2, 6) + ".XSHG"; + } + bid.Name = items[0].Substring(21, items[0].Length - 21); // var hq_str_sz150023="深成指B + bid.Open = float.Parse(items[1]); + bid.LastClose = float.Parse(items[2]); + bid.CurrentPrice = float.Parse(items[3]); + bid.High = float.Parse(items[4]); + bid.Low = float.Parse(items[5]); + //bid.Buy = decimal.Parse(items[6]); + //bid.Sell = decimal.Parse(items[7]); + bid.Volume = long.Parse(items[8]); + bid.Turnover = float.Parse(items[9]); + + //bid.AddBuyGoodsData(new TickData.GoodsData(float.Parse(items[BUY_1_P]), int.Parse(items[BUY_1_A]))); + //bid.AddBuyGoodsData(new TickData.GoodsData(float.Parse(items[BUY_2_P]), int.Parse(items[BUY_2_A]))); + //bid.AddBuyGoodsData(new TickData.GoodsData(float.Parse(items[BUY_3_P]), int.Parse(items[BUY_3_A]))); + //bid.AddBuyGoodsData(new TickData.GoodsData(float.Parse(items[BUY_4_P]), int.Parse(items[BUY_4_A]))); + //bid.AddBuyGoodsData(new TickData.GoodsData(float.Parse(items[BUY_5_P]), int.Parse(items[BUY_5_A]))); + + + //bid.AddSellGoodsData(new TickData.GoodsData(float.Parse(items[SELL_1_P]), int.Parse(items[SELL_1_A]))); + //bid.AddSellGoodsData(new TickData.GoodsData(float.Parse(items[SELL_2_P]), int.Parse(items[SELL_2_A]))); + //bid.AddSellGoodsData(new TickData.GoodsData(float.Parse(items[SELL_3_P]), int.Parse(items[SELL_3_A]))); + //bid.AddSellGoodsData(new TickData.GoodsData(float.Parse(items[SELL_4_P]), int.Parse(items[SELL_4_A]))); + //bid.AddSellGoodsData(new TickData.GoodsData(float.Parse(items[SELL_5_P]), int.Parse(items[SELL_5_A]))); + + bid.PushTime = items[31]; + return bid; + } + + } +} diff --git a/Quanter.Market.Sina/packages.config b/Quanter.Market.Sina/packages.config new file mode 100644 index 0000000..297630f --- /dev/null +++ b/Quanter.Market.Sina/packages.config @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/Quanter.Persistence/App.config b/Quanter.Persistence/App.config new file mode 100644 index 0000000..764bdd3 --- /dev/null +++ b/Quanter.Persistence/App.config @@ -0,0 +1,24 @@ + + + + +
+ + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Quanter.Persistence/PersistenceActor.cs b/Quanter.Persistence/PersistenceActor.cs new file mode 100644 index 0000000..19c854d --- /dev/null +++ b/Quanter.Persistence/PersistenceActor.cs @@ -0,0 +1,164 @@ +using Akka.Actor; +using Akka.Event; +using NHibernate; +using NHibernate.Cfg; +using NHibernate.Tool.hbm2ddl; +using Quanter.Trader.Messages; +using System; +using System.Collections; +using System.Linq; +using System.Reflection; +using System.Text; +using System.Threading.Tasks; + +namespace Quanter.Persistence +{ + /// + /// 处理的消息有 + /// + public class PersistenceActor : UntypedActor + { + private readonly ILoggingAdapter _log = Logging.GetLogger(Context); + + private ISessionFactory factory = null; + private Configuration configuration = null; + private ISession session = null; + + + protected override void OnReceive(object message) + { + PersistenceRequest pr = message as PersistenceRequest; + if(pr != null) + { + switch(pr.Type) + { + case PersistenceType.OPEN: + _log.Debug("初始化,并打开Session"); + // _init(); + // _openSession(); + break; + case PersistenceType.SAVE: + _save(pr.Body); + break; + case PersistenceType.LOAD: + break; + case PersistenceType.CLOSE: + _log.Debug("关闭Session"); + // _closeSession(); + break; + default: + break; + } + } + } + + private void _createTables() { + try { + Configuration _cfg = new Configuration().Configure(); + SchemaExport export = new SchemaExport(_cfg); + export.SetOutputFile("./db/create_tables.sql"); + export.Drop(true, true); + export.Create(true, true); + } catch (Exception e) + { + _log.Error("创建数据库语句发生异常。 {0}", e.StackTrace); + } + } + + private void _init() + { + _log.Info("初始化Persistence"); + try + { + configuration = new Configuration(); + configuration.Configure(); + configuration.AddAssembly(Assembly.GetExecutingAssembly()); + factory = configuration.BuildSessionFactory(); + } + catch (Exception e) + { + _log.Error("初始化HIBERNATE,发生异常:{0}", e.StackTrace); + } + } + + private void _save(Object obj) + { + _log.Debug("保存对象 {0}", obj.GetType().ToString()); + session.Save(obj); + } + + private void _update(Object obj) + { + _log.Debug("更新对象 {0}", obj.GetType().ToString()); + // session.Update(obj); + } + + private void _delete(Type theType, int id) + { + Object obj = _load(theType, id); + _delete(obj); + } + + private void _delete(Object obj) + { + session.Delete(obj); + } + + private object _load(Type theType, int id) + { + return session.Load(theType, id); + } + + private Object _find(String where) + { + IList objs = session.CreateQuery(where).List(); + if (objs == null || objs.Count == 0) return null; + + return objs[0]; + } + + private IList _list(string where) + { + try + { + IQuery q = session.CreateQuery(where); + return q.List(); + } + catch (Exception e) + { + // TODO: LOG + _log.Debug("发生异常 {0}", e.StackTrace); + return null; + } + } + + private ISession _openSession() + { + if (session == null) + session = factory.OpenSession(); + + session.FlushMode = FlushMode.Always; + return session; + } + + private void _closeSession() + { + if (session != null) + { + session.Close(); + session = null; + } + } + + protected override void PreStart() + { + base.PreStart(); + } + + protected override void PostStop() + { + base.PostStop(); + } + + } +} diff --git a/Quanter.Persistence/Properties/AssemblyInfo.cs b/Quanter.Persistence/Properties/AssemblyInfo.cs new file mode 100644 index 0000000..15dd3f8 --- /dev/null +++ b/Quanter.Persistence/Properties/AssemblyInfo.cs @@ -0,0 +1,36 @@ +using System.Reflection; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; + +// 有关程序集的一般信息由以下 +// 控制。更改这些特性值可修改 +// 与程序集关联的信息。 +[assembly: AssemblyTitle("Stock.Persistence")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("")] +[assembly: AssemblyProduct("Stock.Persistence")] +[assembly: AssemblyCopyright("Copyright © 2015")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +//将 ComVisible 设置为 false 将使此程序集中的类型 +//对 COM 组件不可见。 如果需要从 COM 访问此程序集中的类型, +//请将此类型的 ComVisible 特性设置为 true。 +[assembly: ComVisible(false)] + +// 如果此项目向 COM 公开,则下列 GUID 用于类型库的 ID +[assembly: Guid("351aaa08-f483-403c-b4a4-a5725381c5e4")] + +// 程序集的版本信息由下列四个值组成: +// +// 主版本 +// 次版本 +// 生成号 +// 修订号 +// +//可以指定所有这些值,也可以使用“生成号”和“修订号”的默认值, +// 方法是按如下所示使用“*”: : +// [assembly: AssemblyVersion("1.0.*")] +[assembly: AssemblyVersion("1.0.0.0")] +[assembly: AssemblyFileVersion("1.0.0.0")] diff --git a/Quanter.Persistence/Quanter.Persistence.Server.csproj b/Quanter.Persistence/Quanter.Persistence.Server.csproj new file mode 100644 index 0000000..5a90aca --- /dev/null +++ b/Quanter.Persistence/Quanter.Persistence.Server.csproj @@ -0,0 +1,110 @@ + + + + + Debug + AnyCPU + {351AAA08-F483-403C-B4A4-A5725381C5E4} + Library + Properties + Quanter.Persistence + Quanter.Persistence.Server + v4.5.2 + 512 + + + + + true + full + false + bin\Debug\ + DEBUG;TRACE + prompt + 4 + + + pdbonly + true + bin\Release\ + TRACE + prompt + 4 + + + + ..\packages\Akka.1.0.5\lib\net45\Akka.dll + True + + + ..\packages\EntityFramework.6.0.0\lib\net45\EntityFramework.dll + True + + + ..\packages\EntityFramework.6.0.0\lib\net45\EntityFramework.SqlServer.dll + True + + + ..\packages\Iesi.Collections.4.0.0.4000\lib\net40\Iesi.Collections.dll + True + + + ..\packages\Newtonsoft.Json.7.0.1\lib\net45\Newtonsoft.Json.dll + True + + + ..\packages\NHibernate.4.0.4.4000\lib\net40\NHibernate.dll + True + + + + + + ..\packages\System.Data.SQLite.Core.1.0.99.0\lib\net451\System.Data.SQLite.dll + True + + + ..\packages\System.Data.SQLite.EF6.1.0.99.0\lib\net451\System.Data.SQLite.EF6.dll + True + + + ..\packages\System.Data.SQLite.Linq.1.0.99.0\lib\net451\System.Data.SQLite.Linq.dll + True + + + + + + + + + + + + + + + + + + + {dde08214-ec3a-4dd7-8cee-49973e17ae8f} + Quanter.Trader.Messages + + + + + + + 此项目引用这台计算机上缺少的 NuGet 程序包。使用 NuGet 程序包还原可下载这些程序包。有关详细信息,请参阅 http://go.microsoft.com/fwlink/?LinkID=322105。缺少的文件是 {0}。 + + + + + \ No newline at end of file diff --git a/Quanter.Persistence/packages.config b/Quanter.Persistence/packages.config new file mode 100644 index 0000000..35b5cef --- /dev/null +++ b/Quanter.Persistence/packages.config @@ -0,0 +1,12 @@ + + + + + + + + + + + + \ No newline at end of file diff --git a/Quanter.Strategy/Class1.cs b/Quanter.Strategy/Class1.cs new file mode 100644 index 0000000..9062f43 --- /dev/null +++ b/Quanter.Strategy/Class1.cs @@ -0,0 +1,12 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Quanter.Strategy +{ + public class Class1 + { + } +} diff --git a/Quanter.Strategy/Properties/AssemblyInfo.cs b/Quanter.Strategy/Properties/AssemblyInfo.cs new file mode 100644 index 0000000..93d33e1 --- /dev/null +++ b/Quanter.Strategy/Properties/AssemblyInfo.cs @@ -0,0 +1,36 @@ +using System.Reflection; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; + +// 有关程序集的一般信息由以下 +// 控制。更改这些特性值可修改 +// 与程序集关联的信息。 +[assembly: AssemblyTitle("Quanter.Strategy")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("")] +[assembly: AssemblyProduct("Quanter.Strategy")] +[assembly: AssemblyCopyright("Copyright © 2016")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +//将 ComVisible 设置为 false 将使此程序集中的类型 +//对 COM 组件不可见。 如果需要从 COM 访问此程序集中的类型, +//请将此类型的 ComVisible 特性设置为 true。 +[assembly: ComVisible(false)] + +// 如果此项目向 COM 公开,则下列 GUID 用于类型库的 ID +[assembly: Guid("fb1fe6c9-329e-440c-ae97-2218a961d30f")] + +// 程序集的版本信息由下列四个值组成: +// +// 主版本 +// 次版本 +// 生成号 +// 修订号 +// +//可以指定所有这些值,也可以使用“生成号”和“修订号”的默认值, +// 方法是按如下所示使用“*”: : +// [assembly: AssemblyVersion("1.0.*")] +[assembly: AssemblyVersion("1.0.0.0")] +[assembly: AssemblyFileVersion("1.0.0.0")] diff --git a/Quanter.Strategy/Quanter.Strategy.csproj b/Quanter.Strategy/Quanter.Strategy.csproj new file mode 100644 index 0000000..ccddbd2 --- /dev/null +++ b/Quanter.Strategy/Quanter.Strategy.csproj @@ -0,0 +1,61 @@ + + + + + Debug + AnyCPU + fb1fe6c9-329e-440c-ae97-2218a961d30f + Library + Properties + Quanter.Strategy + Quanter.Strategy + v4.5.2 + 512 + + + true + full + false + bin\Debug\ + DEBUG;TRACE + prompt + 4 + + + pdbonly + true + bin\Release\ + TRACE + prompt + 4 + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Quanter.Trader.Connector/BaseStockTrader.cs b/Quanter.Trader.Connector/BaseStockTrader.cs new file mode 100644 index 0000000..1840ffc --- /dev/null +++ b/Quanter.Trader.Connector/BaseStockTrader.cs @@ -0,0 +1,182 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Quanter.Trader.Connector +{ + public abstract class BaseStockTrader : IStockTrader + { + public event TurnoverReturnHandler OnTurnoverReturn; + + protected void StockTrader_OnTurnOverReturn(int entrustNo, String code, float price, int amount) + { + if (OnTurnoverReturn != null) + OnTurnoverReturn(entrustNo, code, price, amount); + } + + public virtual void Init() + { + throw new NotImplementedException(); + } + + protected virtual void Login() + { + } + + public TraderResult SellStock(string code, float price, int num) + { + lock (this) + { + TraderResult ret = internalSellStock(code, price, num); + switch (ret.Code) + { + case TraderResultEnum.TIMEOUT: + return SellStock(code, price, num); + case TraderResultEnum.UNLOGIN: + Login(); + return SellStock(code, price, num); + case TraderResultEnum.ERROR: + case TraderResultEnum.SUCCESS: + return ret; + default: + return null; + } + } + } + + protected virtual TraderResult internalSellStock(string code, float price, int num) + { + return null; + } + + public TraderResult BuyStock(string code, float price, int num) + { + lock (this) + { + TraderResult ret = internalBuyStock(code, price, num); + switch (ret.Code) + { + case TraderResultEnum.TIMEOUT: + return BuyStock(code, price, num); + case TraderResultEnum.UNLOGIN: + Login(); + return BuyStock(code, price, num); + case TraderResultEnum.ERROR: + case TraderResultEnum.SUCCESS: + return ret; + default: + return null; + } + } + } + + protected virtual TraderResult internalBuyStock(string code, float price, int num) + { + return null; + } + + public TraderResult CancelStock(int entrustNo) + { + TraderResult ret = internalCancelStock(entrustNo); + switch (ret.Code) + { + case TraderResultEnum.TIMEOUT: + return CancelStock(entrustNo); + case TraderResultEnum.UNLOGIN: + Login(); + return CancelStock(entrustNo); + case TraderResultEnum.ERROR: + case TraderResultEnum.SUCCESS: + return ret; + default: + return null; + } + } + + protected virtual TraderResult internalCancelStock(int entrustNo) + { + return null; + } + + public TraderResult GetTodayTradeList() + { + TraderResult ret = internalGetTodayTradeList(); + switch (ret.Code) + { + case TraderResultEnum.TIMEOUT: + return GetTodayTradeList(); + case TraderResultEnum.UNLOGIN: + Login(); + return GetTodayTradeList(); + case TraderResultEnum.ERROR: + case TraderResultEnum.SUCCESS: + return ret; + default: + return null; + } + } + + protected virtual TraderResult internalGetTodayTradeList() + { + return null; + } + + public TraderResult GetTodayEntrustList() + { + TraderResult ret = internalGetTodayEntrustList(); + switch (ret.Code) + { + case TraderResultEnum.TIMEOUT: + return GetTodayEntrustList(); + case TraderResultEnum.UNLOGIN: + Login(); + return GetTodayEntrustList(); + case TraderResultEnum.ERROR: + case TraderResultEnum.SUCCESS: + return ret; + default: + return null; + } + } + + protected virtual TraderResult internalGetTodayEntrustList() + { + return null; + } + + public void Keep() + { + internalKeep(); + } + + protected virtual void internalKeep() + { + return; + } + + public TraderResult GetTradingAccountInfo() + { + TraderResult ret = internalGetTradingAccountInfo(); + switch (ret.Code) + { + case TraderResultEnum.TIMEOUT: + return GetTradingAccountInfo(); + case TraderResultEnum.UNLOGIN: + Login(); + return GetTradingAccountInfo(); + case TraderResultEnum.ERROR: + case TraderResultEnum.SUCCESS: + return ret; + default: + return null; + } + } + + protected virtual TraderResult internalGetTradingAccountInfo() + { + return null; + } + } +} diff --git a/Quanter.Trader.Connector/Enums.cs b/Quanter.Trader.Connector/Enums.cs new file mode 100644 index 0000000..a825357 --- /dev/null +++ b/Quanter.Trader.Connector/Enums.cs @@ -0,0 +1,1492 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Quanter.Trader.Connector +{ + /// + /// Window API enumerations + /// + + #region Peek Message Flags + public enum PeekMessageFlags + { + PM_NOREMOVE = 0, + PM_REMOVE = 1, + PM_NOYIELD = 2 + } + #endregion + + #region Windows Messages + public enum WinMsg + { + WM_NULL = 0x0000, + WM_CREATE = 0x0001, + WM_DESTROY = 0x0002, + WM_MOVE = 0x0003, + WM_SIZE = 0x0005, + WM_ACTIVATE = 0x0006, + WM_SETFOCUS = 0x0007, + WM_KILLFOCUS = 0x0008, + WM_ENABLE = 0x000A, + WM_SETREDRAW = 0x000B, + WM_SETTEXT = 0x000C, + WM_GETTEXT = 0x000D, + WM_GETTEXTLENGTH = 0x000E, + WM_PAINT = 0x000F, + WM_CLOSE = 0x0010, + WM_QUERYENDSESSION = 0x0011, + WM_QUIT = 0x0012, + WM_QUERYOPEN = 0x0013, + WM_ERASEBKGND = 0x0014, + WM_SYSCOLORCHANGE = 0x0015, + WM_ENDSESSION = 0x0016, + WM_SHOWWINDOW = 0x0018, + WM_CTLCOLOR = 0x0019, + WM_WININICHANGE = 0x001A, + WM_SETTINGCHANGE = 0x001A, + WM_DEVMODECHANGE = 0x001B, + WM_ACTIVATEAPP = 0x001C, + WM_FONTCHANGE = 0x001D, + WM_TIMECHANGE = 0x001E, + WM_CANCELMODE = 0x001F, + WM_SETCURSOR = 0x0020, + WM_MOUSEACTIVATE = 0x0021, + WM_CHILDACTIVATE = 0x0022, + WM_QUEUESYNC = 0x0023, + WM_GETMINMAXINFO = 0x0024, + WM_PAINTICON = 0x0026, + WM_ICONERASEBKGND = 0x0027, + WM_NEXTDLGCTL = 0x0028, + WM_SPOOLERSTATUS = 0x002A, + WM_DRAWITEM = 0x002B, + WM_MEASUREITEM = 0x002C, + WM_DELETEITEM = 0x002D, + WM_VKEYTOITEM = 0x002E, + WM_CHARTOITEM = 0x002F, + WM_SETFONT = 0x0030, + WM_GETFONT = 0x0031, + WM_SETHOTKEY = 0x0032, + WM_GETHOTKEY = 0x0033, + WM_QUERYDRAGICON = 0x0037, + WM_COMPAREITEM = 0x0039, + WM_GETOBJECT = 0x003D, + WM_COMPACTING = 0x0041, + WM_COMMNOTIFY = 0x0044, + WM_WINDOWPOSCHANGING = 0x0046, + WM_WINDOWPOSCHANGED = 0x0047, + WM_POWER = 0x0048, + WM_COPYDATA = 0x004A, + WM_CANCELJOURNAL = 0x004B, + WM_NOTIFY = 0x004E, + WM_INPUTLANGCHANGEREQUEST = 0x0050, + WM_INPUTLANGCHANGE = 0x0051, + WM_TCARD = 0x0052, + WM_HELP = 0x0053, + WM_USERCHANGED = 0x0054, + WM_NOTIFYFORMAT = 0x0055, + WM_CONTEXTMENU = 0x007B, + WM_STYLECHANGING = 0x007C, + WM_STYLECHANGED = 0x007D, + WM_DISPLAYCHANGE = 0x007E, + WM_GETICON = 0x007F, + WM_SETICON = 0x0080, + WM_NCCREATE = 0x0081, + WM_NCDESTROY = 0x0082, + WM_NCCALCSIZE = 0x0083, + WM_NCHITTEST = 0x0084, + WM_NCPAINT = 0x0085, + WM_NCACTIVATE = 0x0086, + WM_GETDLGCODE = 0x0087, + WM_SYNCPAINT = 0x0088, + WM_NCMOUSEMOVE = 0x00A0, + WM_NCLBUTTONDOWN = 0x00A1, + WM_NCLBUTTONUP = 0x00A2, + WM_NCLBUTTONDBLCLK = 0x00A3, + WM_NCRBUTTONDOWN = 0x00A4, + WM_NCRBUTTONUP = 0x00A5, + WM_NCRBUTTONDBLCLK = 0x00A6, + WM_NCMBUTTONDOWN = 0x00A7, + WM_NCMBUTTONUP = 0x00A8, + WM_NCMBUTTONDBLCLK = 0x00A9, + WM_KEYDOWN = 0x0100, + WM_KEYUP = 0x0101, + WM_CHAR = 0x0102, + WM_DEADCHAR = 0x0103, + WM_SYSKEYDOWN = 0x0104, + WM_SYSKEYUP = 0x0105, + WM_SYSCHAR = 0x0106, + WM_SYSDEADCHAR = 0x0107, + WM_KEYLAST = 0x0108, + WM_IME_STARTCOMPOSITION = 0x010D, + WM_IME_ENDCOMPOSITION = 0x010E, + WM_IME_COMPOSITION = 0x010F, + WM_IME_KEYLAST = 0x010F, + WM_INITDIALOG = 0x0110, + WM_COMMAND = 0x0111, + WM_SYSCOMMAND = 0x0112, + WM_TIMER = 0x0113, + WM_HSCROLL = 0x0114, + WM_VSCROLL = 0x0115, + WM_INITMENU = 0x0116, + WM_INITMENUPOPUP = 0x0117, + WM_MENUSELECT = 0x011F, + WM_MENUCHAR = 0x0120, + WM_ENTERIDLE = 0x0121, + WM_MENURBUTTONUP = 0x0122, + WM_MENUDRAG = 0x0123, + WM_MENUGETOBJECT = 0x0124, + WM_UNINITMENUPOPUP = 0x0125, + WM_MENUCOMMAND = 0x0126, + WM_CTLCOLORWinMsgBOX = 0x0132, + WM_CTLCOLOREDIT = 0x0133, + WM_CTLCOLORLISTBOX = 0x0134, + WM_CTLCOLORBTN = 0x0135, + WM_CTLCOLORDLG = 0x0136, + WM_CTLCOLORSCROLLBAR = 0x0137, + WM_CTLCOLORSTATIC = 0x0138, + WM_MOUSEMOVE = 0x0200, + WM_LBUTTONDOWN = 0x0201, + WM_LBUTTONUP = 0x0202, + WM_LBUTTONDBLCLK = 0x0203, + WM_RBUTTONDOWN = 0x0204, + WM_RBUTTONUP = 0x0205, + WM_RBUTTONDBLCLK = 0x0206, + WM_MBUTTONDOWN = 0x0207, + WM_MBUTTONUP = 0x0208, + WM_MBUTTONDBLCLK = 0x0209, + WM_MOUSEWHEEL = 0x020A, + WM_PARENTNOTIFY = 0x0210, + WM_ENTERMENULOOP = 0x0211, + WM_EXITMENULOOP = 0x0212, + WM_NEXTMENU = 0x0213, + WM_SIZING = 0x0214, + WM_CAPTURECHANGED = 0x0215, + WM_MOVING = 0x0216, + WM_DEVICECHANGE = 0x0219, + WM_MDICREATE = 0x0220, + WM_MDIDESTROY = 0x0221, + WM_MDIACTIVATE = 0x0222, + WM_MDIRESTORE = 0x0223, + WM_MDINEXT = 0x0224, + WM_MDIMAXIMIZE = 0x0225, + WM_MDITILE = 0x0226, + WM_MDICASCADE = 0x0227, + WM_MDIICONARRANGE = 0x0228, + WM_MDIGETACTIVE = 0x0229, + WM_MDISETMENU = 0x0230, + WM_ENTERSIZEMOVE = 0x0231, + WM_EXITSIZEMOVE = 0x0232, + WM_DROPFILES = 0x0233, + WM_MDIREFRESHMENU = 0x0234, + WM_IME_SETCONTEXT = 0x0281, + WM_IME_NOTIFY = 0x0282, + WM_IME_CONTROL = 0x0283, + WM_IME_COMPOSITIONFULL = 0x0284, + WM_IME_SELECT = 0x0285, + WM_IME_CHAR = 0x0286, + WM_IME_REQUEST = 0x0288, + WM_IME_KEYDOWN = 0x0290, + WM_IME_KEYUP = 0x0291, + WM_MOUSEHOVER = 0x02A1, + WM_MOUSELEAVE = 0x02A3, + WM_CUT = 0x0300, + WM_COPY = 0x0301, + WM_PASTE = 0x0302, + WM_CLEAR = 0x0303, + WM_UNDO = 0x0304, + WM_RENDERFORMAT = 0x0305, + WM_RENDERALLFORMATS = 0x0306, + WM_DESTROYCLIPBOARD = 0x0307, + WM_DRAWCLIPBOARD = 0x0308, + WM_PAINTCLIPBOARD = 0x0309, + WM_VSCROLLCLIPBOARD = 0x030A, + WM_SIZECLIPBOARD = 0x030B, + WM_ASKCBFORMATNAME = 0x030C, + WM_CHANGECBCHAIN = 0x030D, + WM_HSCROLLCLIPBOARD = 0x030E, + WM_QUERYNEWPALETTE = 0x030F, + WM_PALETTEISCHANGING = 0x0310, + WM_PALETTECHANGED = 0x0311, + WM_HOTKEY = 0x0312, + WM_PRINT = 0x0317, + WM_PRINTCLIENT = 0x0318, + WM_HANDHELDFIRST = 0x0358, + WM_HANDHELDLAST = 0x035F, + WM_AFXFIRST = 0x0360, + WM_AFXLAST = 0x037F, + WM_PENWINFIRST = 0x0380, + WM_PENWINLAST = 0x038F, + WM_APP = 0x8000, + WM_USER = 0x0400, + WM_REFLECT = WM_USER + 0x1c00 + } + #endregion + + #region Window Styles + public enum WindowStyles : uint + { + WS_OVERLAPPED = 0x00000000, + WS_POPUP = 0x80000000, + WS_CHILD = 0x40000000, + WS_MINIMIZE = 0x20000000, + WS_VISIBLE = 0x10000000, + WS_DISABLED = 0x08000000, + WS_CLIPSIBLINGS = 0x04000000, + WS_CLIPCHILDREN = 0x02000000, + WS_MAXIMIZE = 0x01000000, + WS_CAPTION = 0x00C00000, + WS_BORDER = 0x00800000, + WS_DLGFRAME = 0x00400000, + WS_VSCROLL = 0x00200000, + WS_HSCROLL = 0x00100000, + WS_SYSMENU = 0x00080000, + WS_THICKFRAME = 0x00040000, + WS_GROUP = 0x00020000, + WS_TABSTOP = 0x00010000, + WS_MINIMIZEBOX = 0x00020000, + WS_MAXIMIZEBOX = 0x00010000, + WS_TILED = 0x00000000, + WS_ICONIC = 0x20000000, + WS_SIZEBOX = 0x00040000, + WS_POPUPWINDOW = 0x80880000, + WS_OVERLAPPEDWINDOW = 0x00CF0000, + WS_TILEDWINDOW = 0x00CF0000, + WS_CHILDWINDOW = 0x40000000 + } + #endregion + + #region Window Extended Styles + public enum WindowExStyles + { + WS_EX_DLGMODALFRAME = 0x00000001, + WS_EX_NOPARENTNOTIFY = 0x00000004, + WS_EX_TOPMOST = 0x00000008, + WS_EX_ACCEPTFILES = 0x00000010, + WS_EX_TRANSPARENT = 0x00000020, + WS_EX_MDICHILD = 0x00000040, + WS_EX_TOOLWINDOW = 0x00000080, + WS_EX_WINDOWEDGE = 0x00000100, + WS_EX_CLIENTEDGE = 0x00000200, + WS_EX_CONTEXTHELP = 0x00000400, + WS_EX_RIGHT = 0x00001000, + WS_EX_LEFT = 0x00000000, + WS_EX_RTLREADING = 0x00002000, + WS_EX_LTRREADING = 0x00000000, + WS_EX_LEFTSCROLLBAR = 0x00004000, + WS_EX_RIGHTSCROLLBAR = 0x00000000, + WS_EX_CONTROLPARENT = 0x00010000, + WS_EX_STATICEDGE = 0x00020000, + WS_EX_APPWINDOW = 0x00040000, + WS_EX_OVERLAPPEDWINDOW = 0x00000300, + WS_EX_PALETTEWINDOW = 0x00000188, + WS_EX_LAYERED = 0x00080000 + } + #endregion + + #region ShowWindow Styles + public enum ShowWindowStyles : short + { + SW_HIDE = 0, + SW_SHOWNORMAL = 1, + SW_NORMAL = 1, + SW_SHOWMINIMIZED = 2, + SW_SHOWMAXIMIZED = 3, + SW_MAXIMIZE = 3, + SW_SHOWNOACTIVATE = 4, + SW_SHOW = 5, + SW_MINIMIZE = 6, + SW_SHOWMINNOACTIVE = 7, + SW_SHOWNA = 8, + SW_RESTORE = 9, + SW_SHOWDEFAULT = 10, + SW_FORCEMINIMIZE = 11, + SW_MAX = 11 + } + + #endregion + + #region SetWindowPos Z Order + public enum SetWindowPosZOrder + { + HWND_TOP = 0, + HWND_BOTTOM = 1, + HWND_TOPMOST = -1, + HWND_NOTOPMOST = -2 + } + #endregion + + #region SetWindowPosFlags + public enum SetWindowPosFlags : uint + { + SWP_NOSIZE = 0x0001, + SWP_NOMOVE = 0x0002, + SWP_NOZORDER = 0x0004, + SWP_NOREDRAW = 0x0008, + SWP_NOACTIVATE = 0x0010, + SWP_FRAMECHANGED = 0x0020, + SWP_SHOWWINDOW = 0x0040, + SWP_HIDEWINDOW = 0x0080, + SWP_NOCOPYBITS = 0x0100, + SWP_NOOWNERZORDER = 0x0200, + SWP_NOSENDCHANGING = 0x0400, + SWP_DRAWFRAME = 0x0020, + SWP_NOREPOSITION = 0x0200, + SWP_DEFERERASE = 0x2000, + SWP_ASYNCWINDOWPOS = 0x4000 + } + #endregion + + #region Virtual Keys + public enum VirtualKeys + { + VK_LBUTTON = 0x01, + VK_CANCEL = 0x03, + VK_BACK = 0x08, + VK_TAB = 0x09, + VK_CLEAR = 0x0C, + VK_RETURN = 0x0D, + VK_SHIFT = 0x10, + VK_CONTROL = 0x11, + VK_MENU = 0x12, + VK_CAPITAL = 0x14, + VK_ESCAPE = 0x1B, + VK_SPACE = 0x20, + VK_PRIOR = 0x21, + VK_NEXT = 0x22, + VK_END = 0x23, + VK_HOME = 0x24, + VK_LEFT = 0x25, + VK_UP = 0x26, + VK_RIGHT = 0x27, + VK_DOWN = 0x28, + VK_SELECT = 0x29, + VK_EXECUTE = 0x2B, + VK_SNAPSHOT = 0x2C, + VK_HELP = 0x2F, + VK_0 = 0x30, + VK_1 = 0x31, + VK_2 = 0x32, + VK_3 = 0x33, + VK_4 = 0x34, + VK_5 = 0x35, + VK_6 = 0x36, + VK_7 = 0x37, + VK_8 = 0x38, + VK_9 = 0x39, + VK_A = 0x41, + VK_B = 0x42, + VK_C = 0x43, + VK_D = 0x44, + VK_E = 0x45, + VK_F = 0x46, + VK_G = 0x47, + VK_H = 0x48, + VK_I = 0x49, + VK_J = 0x4A, + VK_K = 0x4B, + VK_L = 0x4C, + VK_M = 0x4D, + VK_N = 0x4E, + VK_O = 0x4F, + VK_P = 0x50, + VK_Q = 0x51, + VK_R = 0x52, + VK_S = 0x53, + VK_T = 0x54, + VK_U = 0x55, + VK_V = 0x56, + VK_W = 0x57, + VK_X = 0x58, + VK_Y = 0x59, + VK_Z = 0x5A, + VK_NUMPAD0 = 0x60, + VK_NUMPAD1 = 0x61, + VK_NUMPAD2 = 0x62, + VK_NUMPAD3 = 0x63, + VK_NUMPAD4 = 0x64, + VK_NUMPAD5 = 0x65, + VK_NUMPAD6 = 0x66, + VK_NUMPAD7 = 0x67, + VK_NUMPAD8 = 0x68, + VK_NUMPAD9 = 0x69, + VK_MULTIPLY = 0x6A, + VK_ADD = 0x6B, + VK_SEPARATOR = 0x6C, + VK_SUBTRACT = 0x6D, + VK_DECIMAL = 0x6E, + VK_DIVIDE = 0x6F, + VK_ATTN = 0xF6, + VK_CRSEL = 0xF7, + VK_EXSEL = 0xF8, + VK_EREOF = 0xF9, + VK_PLAY = 0xFA, + VK_ZOOM = 0xFB, + VK_NONAME = 0xFC, + VK_PA1 = 0xFD, + VK_OEM_CLEAR = 0xFE, + VK_LWIN = 0x5B, + VK_RWIN = 0x5C, + VK_APPS = 0x5D, + VK_LSHIFT = 0xA0, + VK_RSHIFT = 0xA1, + VK_LCONTROL = 0xA2, + VK_RCONTROL = 0xA3, + VK_LMENU = 0xA4, + VK_RMENU = 0xA5 + } + #endregion + + #region PatBlt Types + public enum PatBltTypes + { + SRCCOPY = 0x00CC0020, + SRCPAINT = 0x00EE0086, + SRCAND = 0x008800C6, + SRCINVERT = 0x00660046, + SRCERASE = 0x00440328, + NOTSRCCOPY = 0x00330008, + NOTSRCERASE = 0x001100A6, + MERGECOPY = 0x00C000CA, + MERGEPAINT = 0x00BB0226, + PATCOPY = 0x00F00021, + PATPAINT = 0x00FB0A09, + PATINVERT = 0x005A0049, + DSTINVERT = 0x00550009, + BLACKNESS = 0x00000042, + WHITENESS = 0x00FF0062 + } + #endregion + + #region Clipboard Formats + public enum ClipboardFormats : uint + { + CF_TEXT = 1, + CF_BITMAP = 2, + CF_METAFILEPICT = 3, + CF_SYLK = 4, + CF_DIF = 5, + CF_TIFF = 6, + CF_OEMTEXT = 7, + CF_DIB = 8, + CF_PALETTE = 9, + CF_PENDATA = 10, + CF_RIFF = 11, + CF_WAVE = 12, + CF_UNICODETEXT = 13, + CF_ENHMETAFILE = 14, + CF_HDROP = 15, + CF_LOCALE = 16, + CF_MAX = 17, + CF_OWNERDISPLAY = 0x0080, + CF_DSPTEXT = 0x0081, + CF_DSPBITMAP = 0x0082, + CF_DSPMETAFILEPICT = 0x0083, + CF_DSPENHMETAFILE = 0x008E, + CF_PRIVATEFIRST = 0x0200, + CF_PRIVATELAST = 0x02FF, + CF_GDIOBJFIRST = 0x0300, + CF_GDIOBJLAST = 0x03FF + } + #endregion + + #region Common Controls Initialization flags + public enum CommonControlInitFlags + { + ICC_LISTVIEW_CLASSES = 0x00000001, + ICC_TREEVIEW_CLASSES = 0x00000002, + ICC_BAR_CLASSES = 0x00000004, + ICC_TAB_CLASSES = 0x00000008, + ICC_UPDOWN_CLASS = 0x00000010, + ICC_PROGRESS_CLASS = 0x00000020, + ICC_HOTKEY_CLASS = 0x00000040, + ICC_ANIMATE_CLASS = 0x00000080, + ICC_WIN95_CLASSES = 0x000000FF, + ICC_DATE_CLASSES = 0x00000100, + ICC_USEREX_CLASSES = 0x00000200, + ICC_COOL_CLASSES = 0x00000400, + ICC_INTERNET_CLASSES = 0x00000800, + ICC_PAGESCROLLER_CLASS = 0x00001000, + ICC_NATIVEFNTCTL_CLASS = 0x00002000 + } + #endregion + + #region Common Controls Styles + public enum CommonControlStyles + { + CCS_TOP = 0x00000001, + CCS_NOMOVEY = 0x00000002, + CCS_BOTTOM = 0x00000003, + CCS_NORESIZE = 0x00000004, + CCS_NOPARENTALIGN = 0x00000008, + CCS_ADJUSTABLE = 0x00000020, + CCS_NODIVIDER = 0x00000040, + CCS_VERT = 0x00000080, + CCS_LEFT = (CCS_VERT | CCS_TOP), + CCS_RIGHT = (CCS_VERT | CCS_BOTTOM), + CCS_NOMOVEX = (CCS_VERT | CCS_NOMOVEY) + } + #endregion + + #region ToolBar Styles + public enum ToolBarStyles + { + TBSTYLE_BUTTON = 0x0000, + TBSTYLE_SEP = 0x0001, + TBSTYLE_CHECK = 0x0002, + TBSTYLE_GROUP = 0x0004, + TBSTYLE_CHECKGROUP = (TBSTYLE_GROUP | TBSTYLE_CHECK), + TBSTYLE_DROPDOWN = 0x0008, + TBSTYLE_AUTOSIZE = 0x0010, + TBSTYLE_NOPREFIX = 0x0020, + TBSTYLE_TOOLTIPS = 0x0100, + TBSTYLE_WRAPABLE = 0x0200, + TBSTYLE_ALTDRAG = 0x0400, + TBSTYLE_FLAT = 0x0800, + TBSTYLE_LIST = 0x1000, + TBSTYLE_CUSTOMERASE = 0x2000, + TBSTYLE_REGISTERDROP = 0x4000, + TBSTYLE_TRANSPARENT = 0x8000, + TBSTYLE_EX_DRAWDDARROWS = 0x00000001 + } + #endregion + + #region ToolBar Ex Styles + public enum ToolBarExStyles + { + TBSTYLE_EX_DRAWDDARROWS = 0x1, + TBSTYLE_EX_HIDECLIPPEDBUTTONS = 0x10, + TBSTYLE_EX_DOUBLEBUFFER = 0x80 + } + #endregion + + #region ToolBar Messages + public enum ToolBarMessages + { + WM_USER = 0x0400, + TB_ENABLEBUTTON = (WM_USER + 1), + TB_CHECKBUTTON = (WM_USER + 2), + TB_PRESSBUTTON = (WM_USER + 3), + TB_HIDEBUTTON = (WM_USER + 4), + TB_INDETERMINATE = (WM_USER + 5), + TB_MARKBUTTON = (WM_USER + 6), + TB_ISBUTTONENABLED = (WM_USER + 9), + TB_ISBUTTONCHECKED = (WM_USER + 10), + TB_ISBUTTONPRESSED = (WM_USER + 11), + TB_ISBUTTONHIDDEN = (WM_USER + 12), + TB_ISBUTTONINDETERMINATE = (WM_USER + 13), + TB_ISBUTTONHIGHLIGHTED = (WM_USER + 14), + TB_SETSTATE = (WM_USER + 17), + TB_GETSTATE = (WM_USER + 18), + TB_ADDBITMAP = (WM_USER + 19), + TB_ADDBUTTONSA = (WM_USER + 20), + TB_INSERTBUTTONA = (WM_USER + 21), + TB_ADDBUTTONS = (WM_USER + 20), + TB_INSERTBUTTON = (WM_USER + 21), + TB_DELETEBUTTON = (WM_USER + 22), + TB_GETBUTTON = (WM_USER + 23), + TB_BUTTONCOUNT = (WM_USER + 24), + TB_COMMANDTOINDEX = (WM_USER + 25), + TB_SAVERESTOREA = (WM_USER + 26), + TB_CUSTOMIZE = (WM_USER + 27), + TB_ADDSTRINGA = (WM_USER + 28), + TB_GETITEMRECT = (WM_USER + 29), + TB_BUTTONSTRUCTSIZE = (WM_USER + 30), + TB_SETBUTTONSIZE = (WM_USER + 31), + TB_SETBITMAPSIZE = (WM_USER + 32), + TB_AUTOSIZE = (WM_USER + 33), + TB_GETTOOLTIPS = (WM_USER + 35), + TB_SETTOOLTIPS = (WM_USER + 36), + TB_SETPARENT = (WM_USER + 37), + TB_SETROWS = (WM_USER + 39), + TB_GETROWS = (WM_USER + 40), + TB_GETBITMAPFLAGS = (WM_USER + 41), + TB_SETCMDID = (WM_USER + 42), + TB_CHANGEBITMAP = (WM_USER + 43), + TB_GETBITMAP = (WM_USER + 44), + TB_GETBUTTONTEXTA = (WM_USER + 45), + TB_GETBUTTONTEXTW = (WM_USER + 75), + TB_REPLACEBITMAP = (WM_USER + 46), + TB_SETINDENT = (WM_USER + 47), + TB_SETIMAGELIST = (WM_USER + 48), + TB_GETIMAGELIST = (WM_USER + 49), + TB_LOADIMAGES = (WM_USER + 50), + TB_GETRECT = (WM_USER + 51), + TB_SETHOTIMAGELIST = (WM_USER + 52), + TB_GETHOTIMAGELIST = (WM_USER + 53), + TB_SETDISABLEDIMAGELIST = (WM_USER + 54), + TB_GETDISABLEDIMAGELIST = (WM_USER + 55), + TB_SETSTYLE = (WM_USER + 56), + TB_GETSTYLE = (WM_USER + 57), + TB_GETBUTTONSIZE = (WM_USER + 58), + TB_SETBUTTONWIDTH = (WM_USER + 59), + TB_SETMAXTEXTROWS = (WM_USER + 60), + TB_GETTEXTROWS = (WM_USER + 61), + TB_GETOBJECT = (WM_USER + 62), + TB_GETBUTTONINFOW = (WM_USER + 63), + TB_SETBUTTONINFOW = (WM_USER + 64), + TB_GETBUTTONINFOA = (WM_USER + 65), + TB_SETBUTTONINFOA = (WM_USER + 66), + TB_INSERTBUTTONW = (WM_USER + 67), + TB_ADDBUTTONSW = (WM_USER + 68), + TB_HITTEST = (WM_USER + 69), + TB_SETDRAWTEXTFLAGS = (WM_USER + 70), + TB_GETHOTITEM = (WM_USER + 71), + TB_SETHOTITEM = (WM_USER + 72), + TB_SETANCHORHIGHLIGHT = (WM_USER + 73), + TB_GETANCHORHIGHLIGHT = (WM_USER + 74), + TB_SAVERESTOREW = (WM_USER + 76), + TB_ADDSTRINGW = (WM_USER + 77), + TB_MAPACCELERATORA = (WM_USER + 78), + TB_GETINSERTMARK = (WM_USER + 79), + TB_SETINSERTMARK = (WM_USER + 80), + TB_INSERTMARKHITTEST = (WM_USER + 81), + TB_MOVEBUTTON = (WM_USER + 82), + TB_GETMAXSIZE = (WM_USER + 83), + TB_SETEXTENDEDSTYLE = (WM_USER + 84), + TB_GETEXTENDEDSTYLE = (WM_USER + 85), + TB_GETPADDING = (WM_USER + 86), + TB_SETPADDING = (WM_USER + 87), + TB_SETINSERTMARKCOLOR = (WM_USER + 88), + TB_GETINSERTMARKCOLOR = (WM_USER + 89) + } + #endregion + + #region ToolBar Notifications + public enum ToolBarNotifications + { + TTN_NEEDTEXTA = ((0 - 520) - 0), + TTN_NEEDTEXTW = ((0 - 520) - 10), + TBN_QUERYINSERT = ((0 - 700) - 6), + TBN_DROPDOWN = ((0 - 700) - 10), + TBN_HOTITEMCHANGE = ((0 - 700) - 13) + } + #endregion + + #region Reflected Messages + public enum ReflectedMessages + { + OCM__BASE = (WinMsg.WM_USER + 0x1c00), + OCM_COMMAND = (OCM__BASE + WinMsg.WM_COMMAND), + OCM_CTLCOLORBTN = (OCM__BASE + WinMsg.WM_CTLCOLORBTN), + OCM_CTLCOLOREDIT = (OCM__BASE + WinMsg.WM_CTLCOLOREDIT), + OCM_CTLCOLORDLG = (OCM__BASE + WinMsg.WM_CTLCOLORDLG), + OCM_CTLCOLORLISTBOX = (OCM__BASE + WinMsg.WM_CTLCOLORLISTBOX), + OCM_CTLCOLORWinMsgBOX = (OCM__BASE + WinMsg.WM_CTLCOLORWinMsgBOX), + OCM_CTLCOLORSCROLLBAR = (OCM__BASE + WinMsg.WM_CTLCOLORSCROLLBAR), + OCM_CTLCOLORSTATIC = (OCM__BASE + WinMsg.WM_CTLCOLORSTATIC), + OCM_CTLCOLOR = (OCM__BASE + WinMsg.WM_CTLCOLOR), + OCM_DRAWITEM = (OCM__BASE + WinMsg.WM_DRAWITEM), + OCM_MEASUREITEM = (OCM__BASE + WinMsg.WM_MEASUREITEM), + OCM_DELETEITEM = (OCM__BASE + WinMsg.WM_DELETEITEM), + OCM_VKEYTOITEM = (OCM__BASE + WinMsg.WM_VKEYTOITEM), + OCM_CHARTOITEM = (OCM__BASE + WinMsg.WM_CHARTOITEM), + OCM_COMPAREITEM = (OCM__BASE + WinMsg.WM_COMPAREITEM), + OCM_HSCROLL = (OCM__BASE + WinMsg.WM_HSCROLL), + OCM_VSCROLL = (OCM__BASE + WinMsg.WM_VSCROLL), + OCM_PARENTNOTIFY = (OCM__BASE + WinMsg.WM_PARENTNOTIFY), + OCM_NOTIFY = (OCM__BASE + WinMsg.WM_NOTIFY) + } + #endregion + + #region Notification Messages + public enum NotificationMessages + { + NM_FIRST = (0 - 0), + NM_CUSTOMDRAW = (NM_FIRST - 12), + NM_NCHITTEST = (NM_FIRST - 14) + } + #endregion + + #region ToolTip Flags + public enum ToolTipFlags + { + TTF_CENTERTIP = 0x0002, + TTF_RTLREADING = 0x0004, + TTF_SUBCLASS = 0x0010, + TTF_TRACK = 0x0020, + TTF_ABSOLUTE = 0x0080, + TTF_TRANSPARENT = 0x0100, + TTF_DI_SETITEM = 0x8000 + } + #endregion + + #region Custom Draw Return Flags + public enum CustomDrawReturnFlags + { + CDRF_DODEFAULT = 0x00000000, + CDRF_NEWFONT = 0x00000002, + CDRF_SKIPDEFAULT = 0x00000004, + CDRF_NOTIFYPOSTPAINT = 0x00000010, + CDRF_NOTIFYITEMDRAW = 0x00000020, + CDRF_NOTIFYSUBITEMDRAW = 0x00000020, + CDRF_NOTIFYPOSTERASE = 0x00000040 + } + #endregion + + #region Custom Draw Item State Flags + public enum CustomDrawItemStateFlags + { + CDIS_SELECTED = 0x0001, + CDIS_GRAYED = 0x0002, + CDIS_DISABLED = 0x0004, + CDIS_CHECKED = 0x0008, + CDIS_FOCUS = 0x0010, + CDIS_DEFAULT = 0x0020, + CDIS_HOT = 0x0040, + CDIS_MARKED = 0x0080, + CDIS_INDETERMINATE = 0x0100 + } + #endregion + + #region Custom Draw Draw State Flags + public enum CustomDrawDrawStateFlags + { + CDDS_PREPAINT = 0x00000001, + CDDS_POSTPAINT = 0x00000002, + CDDS_PREERASE = 0x00000003, + CDDS_POSTERASE = 0x00000004, + CDDS_ITEM = 0x00010000, + CDDS_ITEMPREPAINT = (CDDS_ITEM | CDDS_PREPAINT), + CDDS_ITEMPOSTPAINT = (CDDS_ITEM | CDDS_POSTPAINT), + CDDS_ITEMPREERASE = (CDDS_ITEM | CDDS_PREERASE), + CDDS_ITEMPOSTERASE = (CDDS_ITEM | CDDS_POSTERASE), + CDDS_SUBITEM = 0x00020000 + } + #endregion + + #region Toolbar button info flags + public enum ToolBarButtonInfoFlags + { + TBIF_IMAGE = 0x00000001, + TBIF_TEXT = 0x00000002, + TBIF_STATE = 0x00000004, + TBIF_STYLE = 0x00000008, + TBIF_LPARAM = 0x00000010, + TBIF_COMMAND = 0x00000020, + TBIF_SIZE = 0x00000040, + I_IMAGECALLBACK = -1, + I_IMAGENONE = -2 + } + #endregion + + #region Toolbar button styles + public enum ToolBarButtonStyles + { + TBSTYLE_BUTTON = 0x0000, + TBSTYLE_SEP = 0x0001, + TBSTYLE_CHECK = 0x0002, + TBSTYLE_GROUP = 0x0004, + TBSTYLE_CHECKGROUP = (TBSTYLE_GROUP | TBSTYLE_CHECK), + TBSTYLE_DROPDOWN = 0x0008, + TBSTYLE_AUTOSIZE = 0x0010, + TBSTYLE_NOPREFIX = 0x0020, + TBSTYLE_TOOLTIPS = 0x0100, + TBSTYLE_WRAPABLE = 0x0200, + TBSTYLE_ALTDRAG = 0x0400, + TBSTYLE_FLAT = 0x0800, + TBSTYLE_LIST = 0x1000, + TBSTYLE_CUSTOMERASE = 0x2000, + TBSTYLE_REGISTERDROP = 0x4000, + TBSTYLE_TRANSPARENT = 0x8000, + TBSTYLE_EX_DRAWDDARROWS = 0x00000001 + } + #endregion + + #region Toolbar button state + public enum ToolBarButtonStates + { + TBSTATE_CHECKED = 0x01, + TBSTATE_PRESSED = 0x02, + TBSTATE_ENABLED = 0x04, + TBSTATE_HIDDEN = 0x08, + TBSTATE_INDETERMINATE = 0x10, + TBSTATE_WRAP = 0x20, + TBSTATE_ELLIPSES = 0x40, + TBSTATE_MARKED = 0x80 + } + #endregion + + #region Windows Hook Codes + public enum WindowsHookCodes + { + WH_MSGFILTER = (-1), + WH_JOURNALRECORD = 0, + WH_JOURNALPLAYBACK = 1, + WH_KEYBOARD = 2, + WH_GETMESSAGE = 3, + WH_CALLWNDPROC = 4, + WH_CBT = 5, + WH_SYSMSGFILTER = 6, + WH_MOUSE = 7, + WH_HARDWARE = 8, + WH_DEBUG = 9, + WH_SHELL = 10, + WH_FOREGROUNDIDLE = 11, + WH_CALLWNDPROCRET = 12, + WH_KEYBOARD_LL = 13, + WH_MOUSE_LL = 14 + } + + #endregion + + #region Mouse Hook Filters + public enum MouseHookFilters + { + MSGF_DIALOGBOX = 0, + MSGF_MESSAGEBOX = 1, + MSGF_MENU = 2, + MSGF_SCROLLBAR = 5, + MSGF_NEXTWINDOW = 6 + } + + #endregion + + #region Draw Text format flags + public enum DrawTextFormatFlags + { + DT_TOP = 0x00000000, + DT_LEFT = 0x00000000, + DT_CENTER = 0x00000001, + DT_RIGHT = 0x00000002, + DT_VCENTER = 0x00000004, + DT_BOTTOM = 0x00000008, + DT_WORDBREAK = 0x00000010, + DT_SINGLELINE = 0x00000020, + DT_EXPANDTABS = 0x00000040, + DT_TABSTOP = 0x00000080, + DT_NOCLIP = 0x00000100, + DT_EXTERNALLEADING = 0x00000200, + DT_CALCRECT = 0x00000400, + DT_NOPREFIX = 0x00000800, + DT_INTERNAL = 0x00001000, + DT_EDITCONTROL = 0x00002000, + DT_PATH_ELLIPSIS = 0x00004000, + DT_END_ELLIPSIS = 0x00008000, + DT_MODIFYSTRING = 0x00010000, + DT_RTLREADING = 0x00020000, + DT_WORD_ELLIPSIS = 0x00040000 + } + + #endregion + + #region Rebar Styles + public enum RebarStyles + { + RBS_TOOLTIPS = 0x0100, + RBS_VARHEIGHT = 0x0200, + RBS_BANDBORDERS = 0x0400, + RBS_FIXEDORDER = 0x0800, + RBS_REGISTERDROP = 0x1000, + RBS_AUTOSIZE = 0x2000, + RBS_VERTICALGRIPPER = 0x4000, + RBS_DBLCLKTOGGLE = 0x8000, + } + #endregion + + #region Rebar Notifications + public enum RebarNotifications + { + RBN_FIRST = (0 - 831), + RBN_HEIGHTCHANGE = (RBN_FIRST - 0), + RBN_GETOBJECT = (RBN_FIRST - 1), + RBN_LAYOUTCHANGED = (RBN_FIRST - 2), + RBN_AUTOSIZE = (RBN_FIRST - 3), + RBN_BEGINDRAG = (RBN_FIRST - 4), + RBN_ENDDRAG = (RBN_FIRST - 5), + RBN_DELETINGBAND = (RBN_FIRST - 6), + RBN_DELETEDBAND = (RBN_FIRST - 7), + RBN_CHILDSIZE = (RBN_FIRST - 8), + RBN_CHEVRONPUSHED = (RBN_FIRST - 10) + } + #endregion + + #region Rebar Messages + public enum RebarMessages + { + CCM_FIRST = 0x2000, + WM_USER = 0x0400, + RB_INSERTBANDA = (WM_USER + 1), + RB_DELETEBAND = (WM_USER + 2), + RB_GETBARINFO = (WM_USER + 3), + RB_SETBARINFO = (WM_USER + 4), + RB_GETBANDINFO = (WM_USER + 5), + RB_SETBANDINFOA = (WM_USER + 6), + RB_SETPARENT = (WM_USER + 7), + RB_HITTEST = (WM_USER + 8), + RB_GETRECT = (WM_USER + 9), + RB_INSERTBANDW = (WM_USER + 10), + RB_SETBANDINFOW = (WM_USER + 11), + RB_GETBANDCOUNT = (WM_USER + 12), + RB_GETROWCOUNT = (WM_USER + 13), + RB_GETROWHEIGHT = (WM_USER + 14), + RB_IDTOINDEX = (WM_USER + 16), + RB_GETTOOLTIPS = (WM_USER + 17), + RB_SETTOOLTIPS = (WM_USER + 18), + RB_SETBKCOLOR = (WM_USER + 19), + RB_GETBKCOLOR = (WM_USER + 20), + RB_SETTEXTCOLOR = (WM_USER + 21), + RB_GETTEXTCOLOR = (WM_USER + 22), + RB_SIZETORECT = (WM_USER + 23), + RB_SETCOLORSCHEME = (CCM_FIRST + 2), + RB_GETCOLORSCHEME = (CCM_FIRST + 3), + RB_BEGINDRAG = (WM_USER + 24), + RB_ENDDRAG = (WM_USER + 25), + RB_DRAGMOVE = (WM_USER + 26), + RB_GETBARHEIGHT = (WM_USER + 27), + RB_GETBANDINFOW = (WM_USER + 28), + RB_GETBANDINFOA = (WM_USER + 29), + RB_MINIMIZEBAND = (WM_USER + 30), + RB_MAXIMIZEBAND = (WM_USER + 31), + RB_GETDROPTARGET = (CCM_FIRST + 4), + RB_GETBANDBORDERS = (WM_USER + 34), + RB_SHOWBAND = (WM_USER + 35), + RB_SETPALETTE = (WM_USER + 37), + RB_GETPALETTE = (WM_USER + 38), + RB_MOVEBAND = (WM_USER + 39), + RB_SETUNICODEFORMAT = (CCM_FIRST + 5), + RB_GETUNICODEFORMAT = (CCM_FIRST + 6) + } + #endregion + + #region Rebar Info Mask + public enum RebarInfoMask + { + RBBIM_STYLE = 0x00000001, + RBBIM_COLORS = 0x00000002, + RBBIM_TEXT = 0x00000004, + RBBIM_IMAGE = 0x00000008, + RBBIM_CHILD = 0x00000010, + RBBIM_CHILDSIZE = 0x00000020, + RBBIM_SIZE = 0x00000040, + RBBIM_BACKGROUND = 0x00000080, + RBBIM_ID = 0x00000100, + RBBIM_IDEALSIZE = 0x00000200, + RBBIM_LPARAM = 0x00000400, + BBIM_HEADERSIZE = 0x00000800 + } + #endregion + + #region Rebar Styles + public enum RebarStylesEx + { + RBBS_BREAK = 0x1, + RBBS_CHILDEDGE = 0x4, + RBBS_FIXEDBMP = 0x20, + RBBS_GRIPPERALWAYS = 0x80, + RBBS_USECHEVRON = 0x200 + } + #endregion + + #region Object types + public enum ObjectTypes + { + OBJ_PEN = 1, + OBJ_BRUSH = 2, + OBJ_DC = 3, + OBJ_METADC = 4, + OBJ_PAL = 5, + OBJ_FONT = 6, + OBJ_BITMAP = 7, + OBJ_REGION = 8, + OBJ_METAFILE = 9, + OBJ_MEMDC = 10, + OBJ_EXTPEN = 11, + OBJ_ENHMETADC = 12, + OBJ_ENHMETAFILE = 13 + } + #endregion + + #region WM_MENUCHAR return values + public enum MenuCharReturnValues + { + MNC_IGNORE = 0, + MNC_CLOSE = 1, + MNC_EXECUTE = 2, + MNC_SELECT = 3 + } + #endregion + + #region Background Mode + public enum BackgroundMode + { + TRANSPARENT = 1, + OPAQUE = 2 + } + #endregion + + #region ListView Messages + public enum ListViewMessages + { + LVM_FIRST = 0x1000, + LVM_GETSUBITEMRECT = (LVM_FIRST + 56), + LVM_GETITEMSTATE = (LVM_FIRST + 44), + LVM_GETITEMTEXTW = (LVM_FIRST + 115) + } + #endregion + + #region Header Control Messages + public enum HeaderControlMessages : int + { + HDM_FIRST = 0x1200, + HDM_GETITEMRECT = (HDM_FIRST + 7), + HDM_HITTEST = (HDM_FIRST + 6), + HDM_SETIMAGELIST = (HDM_FIRST + 8), + HDM_GETITEMW = (HDM_FIRST + 11), + HDM_ORDERTOINDEX = (HDM_FIRST + 15) + } + #endregion + + #region Header Control Notifications + public enum HeaderControlNotifications + { + HDN_FIRST = (0 - 300), + HDN_BEGINTRACKW = (HDN_FIRST - 26), + HDN_ENDTRACKW = (HDN_FIRST - 27), + HDN_ITEMCLICKW = (HDN_FIRST - 22), + } + #endregion + + #region Header Control HitTest Flags + public enum HeaderControlHitTestFlags : uint + { + HHT_NOWHERE = 0x0001, + HHT_ONHEADER = 0x0002, + HHT_ONDIVIDER = 0x0004, + HHT_ONDIVOPEN = 0x0008, + HHT_ABOVE = 0x0100, + HHT_BELOW = 0x0200, + HHT_TORIGHT = 0x0400, + HHT_TOLEFT = 0x0800 + } + #endregion + + #region List View sub item portion + public enum SubItemPortion + { + LVIR_BOUNDS = 0, + LVIR_ICON = 1, + LVIR_LABEL = 2 + } + #endregion + + #region Cursor Type + public enum CursorType : uint + { + IDC_ARROW = 32512U, + IDC_IBEAM = 32513U, + IDC_WAIT = 32514U, + IDC_CROSS = 32515U, + IDC_UPARROW = 32516U, + IDC_SIZE = 32640U, + IDC_ICON = 32641U, + IDC_SIZENWSE = 32642U, + IDC_SIZENESW = 32643U, + IDC_SIZEWE = 32644U, + IDC_SIZENS = 32645U, + IDC_SIZEALL = 32646U, + IDC_NO = 32648U, + IDC_HAND = 32649U, + IDC_APPSTARTING = 32650U, + IDC_HELP = 32651U + } + #endregion + + #region Tracker Event Flags + public enum TrackerEventFlags : uint + { + TME_HOVER = 0x00000001, + TME_LEAVE = 0x00000002, + TME_QUERY = 0x40000000, + TME_CANCEL = 0x80000000 + } + #endregion + + #region Mouse Activate Flags + public enum MouseActivateFlags + { + MA_ACTIVATE = 1, + MA_ACTIVATEANDEAT = 2, + MA_NOACTIVATE = 3, + MA_NOACTIVATEANDEAT = 4 + } + #endregion + + #region Dialog Codes + public enum DialogCodes + { + DLGC_WANTARROWS = 0x0001, + DLGC_WANTTAB = 0x0002, + DLGC_WANTALLKEYS = 0x0004, + DLGC_WANTMESSAGE = 0x0004, + DLGC_HASSETSEL = 0x0008, + DLGC_DEFPUSHBUTTON = 0x0010, + DLGC_UNDEFPUSHBUTTON = 0x0020, + DLGC_RADIOBUTTON = 0x0040, + DLGC_WANTCHARS = 0x0080, + DLGC_STATIC = 0x0100, + DLGC_BUTTON = 0x2000 + } + #endregion + + #region Update Layered Windows Flags + public enum UpdateLayeredWindowsFlags + { + ULW_COLORKEY = 0x00000001, + ULW_ALPHA = 0x00000002, + ULW_OPAQUE = 0x00000004 + } + #endregion + + #region Alpha Flags + public enum AlphaFlags : byte + { + AC_SRC_OVER = 0x00, + AC_SRC_ALPHA = 0x01 + } + #endregion + + #region ComboBox messages + public enum ComboBoxMessages + { + CB_GETDROPPEDSTATE = 0x0157 + } + #endregion + + #region SetWindowLong indexes + public enum SetWindowLongOffsets + { + GWL_WNDPROC = (-4), + GWL_HINSTANCE = (-6), + GWL_HWNDPARENT = (-8), + GWL_STYLE = (-16), + GWL_EXSTYLE = (-20), + GWL_USERDATA = (-21), + GWL_ID = (-12) + } + #endregion + + #region TreeView Messages + public enum TreeViewMessages + { + TV_FIRST = 0x1100, + TVM_GETITEMRECT = (TV_FIRST + 4), + TVM_GETITEMW = (TV_FIRST + 62) + } + #endregion + + #region TreeViewItem Flags + public enum TreeViewItemFlags + { + TVIF_TEXT = 0x0001, + TVIF_IMAGE = 0x0002, + TVIF_PARAM = 0x0004, + TVIF_STATE = 0x0008, + TVIF_HANDLE = 0x0010, + TVIF_SELECTEDIMAGE = 0x0020, + TVIF_CHILDREN = 0x0040, + TVIF_INTEGRAL = 0x0080 + } + #endregion + + #region ListViewItem flags + public enum ListViewItemFlags + { + LVIF_TEXT = 0x0001, + LVIF_IMAGE = 0x0002, + LVIF_PARAM = 0x0004, + LVIF_STATE = 0x0008, + LVIF_INDENT = 0x0010, + LVIF_NORECOMPUTE = 0x0800 + } + #endregion + + #region HeaderItem flags + public enum HeaderItemFlags + { + HDI_WIDTH = 0x0001, + HDI_HEIGHT = HDI_WIDTH, + HDI_TEXT = 0x0002, + HDI_FORMAT = 0x0004, + HDI_LPARAM = 0x0008, + HDI_BITMAP = 0x0010, + HDI_IMAGE = 0x0020, + HDI_DI_SETITEM = 0x0040, + HDI_ORDER = 0x0080 + } + #endregion + + #region GetDCExFlags + public enum GetDCExFlags + { + DCX_WINDOW = 0x00000001, + DCX_CACHE = 0x00000002, + DCX_NORESETATTRS = 0x00000004, + DCX_CLIPCHILDREN = 0x00000008, + DCX_CLIPSIBLINGS = 0x00000010, + DCX_PARENTCLIP = 0x00000020, + DCX_EXCLUDERGN = 0x00000040, + DCX_INTERSECTRGN = 0x00000080, + DCX_EXCLUDEUPDATE = 0x00000100, + DCX_INTERSECTUPDATE = 0x00000200, + DCX_LOCKWINDOWUPDATE = 0x00000400, + DCX_VALIDATE = 0x00200000 + } + #endregion + + #region HitTest + public enum HitTest + { + HTERROR = (-2), + HTTRANSPARENT = (-1), + HTNOWHERE = 0, + HTCLIENT = 1, + HTCAPTION = 2, + HTSYSMENU = 3, + HTGROWBOX = 4, + HTSIZE = HTGROWBOX, + HTMENU = 5, + HTHSCROLL = 6, + HTVSCROLL = 7, + HTMINBUTTON = 8, + HTMAXBUTTON = 9, + HTLEFT = 10, + HTRIGHT = 11, + HTTOP = 12, + HTTOPLEFT = 13, + HTTOPRIGHT = 14, + HTBOTTOM = 15, + HTBOTTOMLEFT = 16, + HTBOTTOMRIGHT = 17, + HTBORDER = 18, + HTREDUCE = HTMINBUTTON, + HTZOOM = HTMAXBUTTON, + HTSIZEFIRST = HTLEFT, + HTSIZELAST = HTBOTTOMRIGHT, + HTOBJECT = 19, + HTCLOSE = 20, + HTHELP = 21 + } + #endregion + + #region ActivateFlags + public enum ActivateState + { + WA_INACTIVE = 0, + WA_ACTIVE = 1, + WA_CLICKACTIVE = 2 + } + #endregion + + #region StrechModeFlags + public enum StrechModeFlags + { + BLACKONWHITE = 1, + WHITEONBLACK = 2, + COLORONCOLOR = 3, + HALFTONE = 4, + MAXSTRETCHBLTMODE = 4 + } + #endregion + + #region ScrollBarFlags + public enum ScrollBarFlags + { + SBS_HORZ = 0x0000, + SBS_VERT = 0x0001, + SBS_TOPALIGN = 0x0002, + SBS_LEFTALIGN = 0x0002, + SBS_BOTTOMALIGN = 0x0004, + SBS_RIGHTALIGN = 0x0004, + SBS_SIZEBOXTOPLEFTALIGN = 0x0002, + SBS_SIZEBOXBOTTOMRIGHTALIGN = 0x0004, + SBS_SIZEBOX = 0x0008, + SBS_SIZEGRIP = 0x0010 + } + #endregion + + #region System Metrics Codes + public enum SystemMetricsCodes + { + SM_CXSCREEN = 0, + SM_CYSCREEN = 1, + SM_CXVSCROLL = 2, + SM_CYHSCROLL = 3, + SM_CYCAPTION = 4, + SM_CXBORDER = 5, + SM_CYBORDER = 6, + SM_CXDLGFRAME = 7, + SM_CYDLGFRAME = 8, + SM_CYVTHUMB = 9, + SM_CXHTHUMB = 10, + SM_CXICON = 11, + SM_CYICON = 12, + SM_CXCURSOR = 13, + SM_CYCURSOR = 14, + SM_CYMENU = 15, + SM_CXFULLSCREEN = 16, + SM_CYFULLSCREEN = 17, + SM_CYKANJIWINDOW = 18, + SM_MOUSEPRESENT = 19, + SM_CYVSCROLL = 20, + SM_CXHSCROLL = 21, + SM_DEBUG = 22, + SM_SWAPBUTTON = 23, + SM_RESERVED1 = 24, + SM_RESERVED2 = 25, + SM_RESERVED3 = 26, + SM_RESERVED4 = 27, + SM_CXMIN = 28, + SM_CYMIN = 29, + SM_CXSIZE = 30, + SM_CYSIZE = 31, + SM_CXFRAME = 32, + SM_CYFRAME = 33, + SM_CXMINTRACK = 34, + SM_CYMINTRACK = 35, + SM_CXDOUBLECLK = 36, + SM_CYDOUBLECLK = 37, + SM_CXICONSPACING = 38, + SM_CYICONSPACING = 39, + SM_MENUDROPALIGNMENT = 40, + SM_PENWINDOWS = 41, + SM_DBCSENABLED = 42, + SM_CMOUSEBUTTONS = 43, + SM_CXFIXEDFRAME = SM_CXDLGFRAME, + SM_CYFIXEDFRAME = SM_CYDLGFRAME, + SM_CXSIZEFRAME = SM_CXFRAME, + SM_CYSIZEFRAME = SM_CYFRAME, + SM_SECURE = 44, + SM_CXEDGE = 45, + SM_CYEDGE = 46, + SM_CXMINSPACING = 47, + SM_CYMINSPACING = 48, + SM_CXSMICON = 49, + SM_CYSMICON = 50, + SM_CYSMCAPTION = 51, + SM_CXSMSIZE = 52, + SM_CYSMSIZE = 53, + SM_CXMENUSIZE = 54, + SM_CYMENUSIZE = 55, + SM_ARRANGE = 56, + SM_CXMINIMIZED = 57, + SM_CYMINIMIZED = 58, + SM_CXMAXTRACK = 59, + SM_CYMAXTRACK = 60, + SM_CXMAXIMIZED = 61, + SM_CYMAXIMIZED = 62, + SM_NETWORK = 63, + SM_CLEANBOOT = 67, + SM_CXDRAG = 68, + SM_CYDRAG = 69, + SM_SHOWSOUNDS = 70, + SM_CXMENUCHECK = 71, + SM_CYMENUCHECK = 72, + SM_SLOWMACHINE = 73, + SM_MIDEASTENABLED = 74, + SM_MOUSEWHEELPRESENT = 75, + SM_XVIRTUALSCREEN = 76, + SM_YVIRTUALSCREEN = 77, + SM_CXVIRTUALSCREEN = 78, + SM_CYVIRTUALSCREEN = 79, + SM_CMONITORS = 80, + SM_SAMEDISPLAYFORMAT = 81, + SM_CMETRICS = 83 + } + #endregion + + #region ScrollBarTypes + public enum ScrollBarTypes + { + SB_HORZ = 0, + SB_VERT = 1, + SB_CTL = 2, + SB_BOTH = 3 + } + #endregion + + #region SrollBarInfoFlags + public enum ScrollBarInfoFlags + { + SIF_RANGE = 0x0001, + SIF_PAGE = 0x0002, + SIF_POS = 0x0004, + SIF_DISABLENOSCROLL = 0x0008, + SIF_TRACKPOS = 0x0010, + SIF_ALL = (SIF_RANGE | SIF_PAGE | SIF_POS | SIF_TRACKPOS) + } + #endregion + + #region Enable ScrollBar flags + public enum EnableScrollBarFlags + { + ESB_ENABLE_BOTH = 0x0000, + ESB_DISABLE_BOTH = 0x0003, + ESB_DISABLE_LEFT = 0x0001, + ESB_DISABLE_RIGHT = 0x0002, + ESB_DISABLE_UP = 0x0001, + ESB_DISABLE_DOWN = 0x0002, + ESB_DISABLE_LTUP = ESB_DISABLE_LEFT, + ESB_DISABLE_RTDN = ESB_DISABLE_RIGHT + } + #endregion + + #region Scroll Requests + public enum ScrollBarRequests + { + SB_LINEUP = 0, + SB_LINELEFT = 0, + SB_LINEDOWN = 1, + SB_LINERIGHT = 1, + SB_PAGEUP = 2, + SB_PAGELEFT = 2, + SB_PAGEDOWN = 3, + SB_PAGERIGHT = 3, + SB_THUMBPOSITION = 4, + SB_THUMBTRACK = 5, + SB_TOP = 6, + SB_LEFT = 6, + SB_BOTTOM = 7, + SB_RIGHT = 7, + SB_ENDSCROLL = 8 + } + #endregion + + #region SrollWindowEx flags + public enum ScrollWindowExFlags + { + SW_SCROLLCHILDREN = 0x0001, + SW_INVALIDATE = 0x0002, + SW_ERASE = 0x0004, + SW_SMOOTHSCROLL = 0x0010 + } + #endregion + + #region ImageListFlags + public enum ImageListFlags + { + ILC_MASK = 0x0001, + ILC_COLOR = 0x0000, + ILC_COLORDDB = 0x00FE, + ILC_COLOR4 = 0x0004, + ILC_COLOR8 = 0x0008, + ILC_COLOR16 = 0x0010, + ILC_COLOR24 = 0x0018, + ILC_COLOR32 = 0x0020, + ILC_PALETTE = 0x0800 + } + #endregion + + #region List View Notifications + public enum ListViewNotifications + { + LVN_FIRST = (0 - 100), + LVN_GETDISPINFOW = (LVN_FIRST - 77), + LVN_SETDISPINFOA = (LVN_FIRST - 51) + } + #endregion + + +} diff --git a/Quanter.Trader.Connector/IStockTrader.cs b/Quanter.Trader.Connector/IStockTrader.cs new file mode 100644 index 0000000..c34b9fc --- /dev/null +++ b/Quanter.Trader.Connector/IStockTrader.cs @@ -0,0 +1,60 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Quanter.Trader.Connector +{ + public delegate void TurnoverReturnHandler(int entrustNo, String code, float price, int amount); + public interface IStockTrader + { + event TurnoverReturnHandler OnTurnoverReturn; + void Init(); + + /// + /// 卖股票 + /// + /// + /// + /// + /// 合同号 + TraderResult SellStock(String code, float price, int num); + + /// + /// 买股票 + /// + /// + /// + /// + /// 合同号 + TraderResult BuyStock(String code, float price, int num); + + /// + /// 撤单 + /// + /// 合约号 + /// 合同号 + TraderResult CancelStock(int entrustNo); + + /// + /// 获取成交信息 + /// + TraderResult GetTodayTradeList(); + + /// + /// 获取成交信息 + /// + TraderResult GetTodayEntrustList(); + + /// + /// 保持连接 + /// + void Keep(); + + /// + /// 获取资金信息 + /// + TraderResult GetTradingAccountInfo(); + } +} diff --git a/Quanter.Trader.Connector/ITrader.cs b/Quanter.Trader.Connector/ITrader.cs new file mode 100644 index 0000000..976e73b --- /dev/null +++ b/Quanter.Trader.Connector/ITrader.cs @@ -0,0 +1,17 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Quanter.Trader.Connector +{ + public interface ITrader + { + void Connection(); + + void Login(); + + void Trade(); + } +} diff --git a/Quanter.Trader.Connector/Properties/AssemblyInfo.cs b/Quanter.Trader.Connector/Properties/AssemblyInfo.cs new file mode 100644 index 0000000..2fd802e --- /dev/null +++ b/Quanter.Trader.Connector/Properties/AssemblyInfo.cs @@ -0,0 +1,36 @@ +using System.Reflection; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; + +// 有关程序集的一般信息由以下 +// 控制。更改这些特性值可修改 +// 与程序集关联的信息。 +[assembly: AssemblyTitle("Stock.Trader.Connector")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("")] +[assembly: AssemblyProduct("Stock.Trader.Connector")] +[assembly: AssemblyCopyright("Copyright © 2015")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +//将 ComVisible 设置为 false 将使此程序集中的类型 +//对 COM 组件不可见。 如果需要从 COM 访问此程序集中的类型, +//请将此类型的 ComVisible 特性设置为 true。 +[assembly: ComVisible(false)] + +// 如果此项目向 COM 公开,则下列 GUID 用于类型库的 ID +[assembly: Guid("5dc68754-1d48-41a0-a3ee-bf91b336ef93")] + +// 程序集的版本信息由下列四个值组成: +// +// 主版本 +// 次版本 +// 生成号 +// 修订号 +// +//可以指定所有这些值,也可以使用“生成号”和“修订号”的默认值, +// 方法是按如下所示使用“*”: : +// [assembly: AssemblyVersion("1.0.*")] +[assembly: AssemblyVersion("1.0.0.0")] +[assembly: AssemblyFileVersion("1.0.0.0")] diff --git a/Quanter.Trader.Connector/Quanter.Trader.Connector.csproj b/Quanter.Trader.Connector/Quanter.Trader.Connector.csproj new file mode 100644 index 0000000..c5a3c10 --- /dev/null +++ b/Quanter.Trader.Connector/Quanter.Trader.Connector.csproj @@ -0,0 +1,99 @@ + + + + + Debug + AnyCPU + {5DC68754-1D48-41A0-A3EE-BF91B336EF93} + Library + Properties + Quanter.Trader.Connector + Quanter.Trader.Connector + v4.5.2 + 512 + + + true + full + false + bin\Debug\ + DEBUG;TRACE + prompt + 4 + + + pdbonly + true + bin\Release\ + TRACE + prompt + 4 + + + + ..\packages\Akka.1.0.5\lib\net45\Akka.dll + True + + + ..\packages\Akka.Logger.slf4net.1.0.5\lib\net45\Akka.Logger.slf4net.dll + True + + + ..\packages\Newtonsoft.Json.7.0.1\lib\net45\Newtonsoft.Json.dll + True + + + ..\packages\slf4net.0.1.32.1\lib\net35\slf4net.dll + True + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + {34db14a6-e4ed-4c4a-8ca6-939201a572be} + Quanter.BusinessEntity + + + {a3fa3c71-a7b0-4bb6-bd32-0aee20493593} + Quanter.Common + + + {dde08214-ec3a-4dd7-8cee-49973e17ae8f} + Quanter.Trader.Messages + + + + + \ No newline at end of file diff --git a/Quanter.Trader.Connector/Structs.cs b/Quanter.Trader.Connector/Structs.cs new file mode 100644 index 0000000..2c98214 --- /dev/null +++ b/Quanter.Trader.Connector/Structs.cs @@ -0,0 +1,512 @@ +using System; +using System.Collections.Generic; +using System.Drawing; +using System.Linq; +using System.Runtime.InteropServices; +using System.Text; +using System.Threading.Tasks; + +namespace Quanter.Trader.Connector +{ + /// + /// Structures to interoperate with the Windows 32 API + /// + + #region SIZE + [StructLayout(LayoutKind.Sequential)] + public struct SIZE + { + public int cx; + public int cy; + } + #endregion + + #region RECT + [StructLayout(LayoutKind.Sequential)] + public struct RECT + { + public int left; + public int top; + public int right; + public int bottom; + } + #endregion + + #region INITCOMMONCONTROLSEX + [StructLayout(LayoutKind.Sequential, Pack = 1)] + public class INITCOMMONCONTROLSEX + { + public int dwSize; + public int dwICC; + } + #endregion + + #region TBBUTTON + [StructLayout(LayoutKind.Sequential, Pack = 1)] + public struct TBBUTTON + { + public int iBitmap; + public int idCommand; + public byte fsState; + public byte fsStyle; + public byte bReserved0; + public byte bReserved1; + public int dwData; + public int iString; + } + #endregion + + #region POINT + [StructLayout(LayoutKind.Sequential)] + public struct POINT + { + public int x; + public int y; + } + #endregion + + #region NMHDR + [StructLayout(LayoutKind.Sequential)] + public struct NMHDR + { + public IntPtr hwndFrom; + public int idFrom; + public int code; + } + #endregion + + #region TOOLTIPTEXTA + [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi)] + public struct TOOLTIPTEXTA + { + public NMHDR hdr; + public IntPtr lpszText; + [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 80)] + public string szText; + public IntPtr hinst; + public int uFlags; + } + #endregion + + #region TOOLTIPTEXT + [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Auto)] + public struct TOOLTIPTEXT + { + public NMHDR hdr; + public IntPtr lpszText; + [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 80)] + public string szText; + public IntPtr hinst; + public int uFlags; + } + #endregion + + #region NMCUSTOMDRAW + [StructLayout(LayoutKind.Sequential)] + public struct NMCUSTOMDRAW + { + public NMHDR hdr; + public int dwDrawStage; + public IntPtr hdc; + public RECT rc; + public int dwItemSpec; + public int uItemState; + public int lItemlParam; + } + #endregion + + #region NMTBCUSTOMDRAW + [StructLayout(LayoutKind.Sequential)] + public struct NMTBCUSTOMDRAW + { + public NMCUSTOMDRAW nmcd; + public IntPtr hbrMonoDither; + public IntPtr hbrLines; + public IntPtr hpenLines; + public int clrText; + public int clrMark; + public int clrTextHighlight; + public int clrBtnFace; + public int clrBtnHighlight; + public int clrHighlightHotTrack; + public RECT rcText; + public int nStringBkMode; + public int nHLStringBkMode; + } + #endregion + + #region NMLVCUSTOMDRAW + [StructLayout(LayoutKind.Sequential)] + public struct NMLVCUSTOMDRAW + { + public NMCUSTOMDRAW nmcd; + public uint clrText; + public uint clrTextBk; + public int iSubItem; + } + #endregion + + #region TBBUTTONINFO + [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Auto)] + public struct TBBUTTONINFO + { + public int cbSize; + public int dwMask; + public int idCommand; + public int iImage; + public byte fsState; + public byte fsStyle; + public short cx; + public IntPtr lParam; + public IntPtr pszText; + public int cchText; + } + #endregion + + #region REBARBANDINFO + [StructLayout(LayoutKind.Sequential)] + public struct REBARBANDINFO + { + public int cbSize; + public int fMask; + public int fStyle; + public int clrFore; + public int clrBack; + public IntPtr lpText; + public int cch; + public int iImage; + public IntPtr hwndChild; + public int cxMinChild; + public int cyMinChild; + public int cx; + public IntPtr hbmBack; + public int wID; + public int cyChild; + public int cyMaxChild; + public int cyIntegral; + public int cxIdeal; + public int lParam; + public int cxHeader; + } + #endregion + + #region MOUSEHOOKSTRUCT + [StructLayout(LayoutKind.Sequential)] + public struct MOUSEHOOKSTRUCT + { + public POINT pt; + public IntPtr hwnd; + public int wHitTestCode; + public IntPtr dwExtraInfo; + } + #endregion + + #region NMTOOLBAR + [StructLayout(LayoutKind.Sequential)] + public struct NMTOOLBAR + { + public NMHDR hdr; + public int iItem; + public TBBUTTON tbButton; + public int cchText; + public IntPtr pszText; + public RECT rcButton; + } + #endregion + + #region NMREBARCHEVRON + [StructLayout(LayoutKind.Sequential)] + public struct NMREBARCHEVRON + { + public NMHDR hdr; + public int uBand; + public int wID; + public int lParam; + public RECT rc; + public int lParamNM; + } + #endregion + + #region BITMAP + [StructLayout(LayoutKind.Sequential)] + public struct BITMAP + { + public long bmType; + public long bmWidth; + public long bmHeight; + public long bmWidthBytes; + public short bmPlanes; + public short bmBitsPixel; + public IntPtr bmBits; + } + #endregion + + #region BITMAPINFO_FLAT + [StructLayout(LayoutKind.Sequential)] + public struct BITMAPINFO_FLAT + { + public int bmiHeader_biSize; + public int bmiHeader_biWidth; + public int bmiHeader_biHeight; + public short bmiHeader_biPlanes; + public short bmiHeader_biBitCount; + public int bmiHeader_biCompression; + public int bmiHeader_biSizeImage; + public int bmiHeader_biXPelsPerMeter; + public int bmiHeader_biYPelsPerMeter; + public int bmiHeader_biClrUsed; + public int bmiHeader_biClrImportant; + [MarshalAs(System.Runtime.InteropServices.UnmanagedType.ByValArray, SizeConst = 1024)] + public byte[] bmiColors; + } + #endregion + + #region RGBQUAD + public struct RGBQUAD + { + public byte rgbBlue; + public byte rgbGreen; + public byte rgbRed; + public byte rgbReserved; + } + #endregion + + #region BITMAPINFOHEADER + [StructLayout(LayoutKind.Sequential)] + public class BITMAPINFOHEADER + { + public int biSize = Marshal.SizeOf(typeof(BITMAPINFOHEADER)); + public int biWidth; + public int biHeight; + public short biPlanes; + public short biBitCount; + public int biCompression; + public int biSizeImage; + public int biXPelsPerMeter; + public int biYPelsPerMeter; + public int biClrUsed; + public int biClrImportant; + } + #endregion + + #region BITMAPINFO + [StructLayout(LayoutKind.Sequential)] + public class BITMAPINFO + { + public BITMAPINFOHEADER bmiHeader = new BITMAPINFOHEADER(); + [MarshalAs(System.Runtime.InteropServices.UnmanagedType.ByValArray, SizeConst = 1024)] + public byte[] bmiColors; + } + #endregion + + #region PALETTEENTRY + [StructLayout(LayoutKind.Sequential)] + public struct PALETTEENTRY + { + public byte peRed; + public byte peGreen; + public byte peBlue; + public byte peFlags; + } + #endregion + + #region MSG + [StructLayout(LayoutKind.Sequential)] + public struct MSG + { + public IntPtr hwnd; + public int message; + public IntPtr wParam; + public IntPtr lParam; + public int time; + public int pt_x; + public int pt_y; + } + #endregion + + #region HD_HITTESTINFO + [StructLayout(LayoutKind.Sequential)] + public struct HD_HITTESTINFO + { + public POINT pt; + public uint flags; + public int iItem; + } + #endregion + + #region DLLVERSIONINFO + [StructLayout(LayoutKind.Sequential)] + public struct DLLVERSIONINFO + { + public int cbSize; + public int dwMajorVersion; + public int dwMinorVersion; + public int dwBuildNumber; + public int dwPlatformID; + } + #endregion + + #region PAINTSTRUCT + [StructLayout(LayoutKind.Sequential)] + public struct PAINTSTRUCT + { + public IntPtr hdc; + public int fErase; + public Rectangle rcPaint; + public int fRestore; + public int fIncUpdate; + public int Reserved1; + public int Reserved2; + public int Reserved3; + public int Reserved4; + public int Reserved5; + public int Reserved6; + public int Reserved7; + public int Reserved8; + } + #endregion + + #region BLENDFUNCTION + [StructLayout(LayoutKind.Sequential, Pack = 1)] + public struct BLENDFUNCTION + { + public byte BlendOp; + public byte BlendFlags; + public byte SourceConstantAlpha; + public byte AlphaFormat; + } + + #endregion + + #region TRACKMOUSEEVENTS + [StructLayout(LayoutKind.Sequential)] + public struct TRACKMOUSEEVENTS + { + public uint cbSize; + public uint dwFlags; + public IntPtr hWnd; + public uint dwHoverTime; + } + #endregion + + #region STRINGBUFFER + [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Auto)] + public struct STRINGBUFFER + { + [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 512)] + public string szText; + } + #endregion + + #region NMTVCUSTOMDRAW + [StructLayout(LayoutKind.Sequential)] + public struct NMTVCUSTOMDRAW + { + public NMCUSTOMDRAW nmcd; + public uint clrText; + public uint clrTextBk; + public int iLevel; + } + #endregion + + #region TVITEM + [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Auto)] + public struct TVITEM + { + public uint mask; + public IntPtr hItem; + public uint state; + public uint stateMask; + public IntPtr pszText; + public int cchTextMax; + public int iImage; + public int iSelectedImage; + public int cChildren; + public int lParam; + } + #endregion + + #region LVITEM + [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Auto)] + public struct LVITEM + { + public uint mask; + public int iItem; + public int iSubItem; + public uint state; + public uint stateMask; + public IntPtr pszText; + public int cchTextMax; + public int iImage; + public int lParam; + public int iIndent; + } + #endregion + + #region HDITEM + [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Auto)] + public struct HDITEM + { + public uint mask; + public int cxy; + public IntPtr pszText; + public IntPtr hbm; + public int cchTextMax; + public int fmt; + public int lParam; + public int iImage; + public int iOrder; + } + #endregion + + #region WINDOWPLACEMENT + [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Auto)] + public struct WINDOWPLACEMENT + { + public uint length; + public uint flags; + public uint showCmd; + public POINT ptMinPosition; + public POINT ptMaxPosition; + public RECT rcNormalPosition; + } + #endregion + + #region SCROLLINFO + [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Auto)] + public struct SCROLLINFO + { + public uint cbSize; + public uint fMask; + public int nMin; + public int nMax; + public uint nPage; + public int nPos; + public int nTrackPos; + } + #endregion + + #region MouseHookStruct + [StructLayout(LayoutKind.Sequential)] + public class MouseHookStruct + { + public POINT pt; + public int hwnd; + public int wHitTestCode; + public int dwExtraInfo; + } + #endregion + + #region KeyBoardHook + [StructLayout(LayoutKind.Sequential)] + public class KeyboardHookStruct + { + public int vkCode; //Specifies a virtual-key code. The code must be a value in the range 1 to 254. + public int scanCode; // Specifies a hardware scan code for the key. + public int flags; // Specifies the extended-key flag, event-injected flag, context code, and transition-state flag. + public int time; // Specifies the time stamp for this message. + public int dwExtraInfo; // Specifies extra information associated with the message. + } + #endregion + +} diff --git a/Quanter.Trader.Connector/ThsStockTrader.cs b/Quanter.Trader.Connector/ThsStockTrader.cs new file mode 100644 index 0000000..434b3ce --- /dev/null +++ b/Quanter.Trader.Connector/ThsStockTrader.cs @@ -0,0 +1,657 @@ +using System; +using System.Collections.Generic; +using System.Windows.Forms; + +using System.Threading; + +using System.Linq; +using System.Text; +using System.Threading; +using System.Threading.Tasks; + +namespace Quanter.Trader.Connector +{ + public class ThsStockTrader : BaseStockTrader, IStockTrader + { + const int MDI_FRAME = 0xE900; + + const int CMD_BUY = 161; + const int CMD_SELL = 162; + const int CMD_QUERY = 165; + const int CMD_TODAY_TRANSACTION = 167; + const int CMD_TODAY_ENTRUST = 168; + + public ThsStockTrader() { } + + IntPtr hWnd; // 窗口句柄 + + /// + /// 获取右侧主面板句柄 + /// + /// + private IntPtr GetDetailPanel() + { + const int PANEL_DLG = 0xE901; + IntPtr h1 = Win32API.GetDlgItem(hWnd, MDI_FRAME); + h1 = Win32API.GetDlgItem(h1, PANEL_DLG); + + return h1; + } + + /// + /// 获取持仓列表信息控件 + /// + /// + private IntPtr GetPositonList() + { + const int HEXIN_SCROLL_WND = 0x0417; + const int HEXIN_SCROLL_WND_2 = 0x00C8; + const int LIST_VIEW = 0x0417; + + IntPtr h1 = GetDetailPanel(); + Thread.Sleep(1000); + h1 = Win32API.GetDlgItem(h1, HEXIN_SCROLL_WND); + h1 = Win32API.GetDlgItem(h1, HEXIN_SCROLL_WND_2); + h1 = Win32API.GetDlgItem(h1, LIST_VIEW); + + return h1; + } + + #region 点击各个功能菜单 + + private void ClickSellTreeViewItem() + { + SendCommand(CMD_SELL); + } + + private void ClickBuyTreeViewItem() + { + SendCommand(CMD_BUY); + } + + public void SendCommand(int cmd) + { + Win32API.SendMessage(hWnd, Win32Code.WM_COMMAND, cmd, 0); + Thread.Sleep(50); + } + + private void ClickQueryTreeViewItem() + { + SendCommand(CMD_QUERY); + } + + private void ClickQueryDrwtTreeViewItem() + { + SendCommand(CMD_TODAY_ENTRUST); + } + + private void ClickQueryDrcjTreeViewItem() + { + SendCommand(CMD_TODAY_TRANSACTION); + } + + #endregion + + + #region 接口实现 + + //WebStockTrader wst = null; + /// + /// 检测 + /// + public override void Init() + { + hWnd = Win32API.FindWindow(null, @"网上股票交易系统5.0"); + } + + protected override TraderResult internalSellStock(string code, float price, int amount) + { + ClickSellTreeViewItem(); + + const int ID_TXT_CODE = 0x0408; + const int ID_TXT_PRICE = 0x0409; + const int ID_TXT_NUM = 0x040A; + const int ID_BTN_SELL = 0x3EE; + + // 设定代码,价格,数量 + IntPtr hSellPanel = GetDetailPanel(); + Win32API.SendDlgItemMessage(hSellPanel, ID_TXT_CODE, Win32Code.WM_SETTEXT, 0, code); + PeekAndDelay(50); + Win32API.SendDlgItemMessage(hSellPanel, ID_TXT_PRICE, Win32Code.WM_SETTEXT, 0, price.ToString()); + Win32API.SendDlgItemMessage(hSellPanel, ID_TXT_NUM, Win32Code.WM_SETTEXT, 0, amount.ToString()); + + // 点击卖出按钮 + Win32API.PostMessage(hSellPanel, Win32Code.WM_COMMAND, ID_BTN_SELL, 0); + + int no = waitAndGetTradeID(hSellPanel, code, price, amount); + + TraderResult result = new TraderResult(); + result.Code = TraderResultEnum.SUCCESS; + result.EntrustNo = no; + return result; + } + + protected override TraderResult internalBuyStock(string code, float price, int amount) + { + const int ID_TXT_CODE = 0x0408; + const int ID_TXT_PRICE = 0x0409; + const int ID_TXT_NUM = 0x040A; + const int ID_BTN_BUY = 0x3EE; + + ClickBuyTreeViewItem(); + + // 设定代码,价格,数量 + IntPtr hBuySell = GetDetailPanel(); + Win32API.SendDlgItemMessage(hBuySell, ID_TXT_CODE, Win32Code.WM_SETTEXT, 0, code); + PeekAndDelay(50); + Win32API.SendDlgItemMessage(hBuySell, ID_TXT_PRICE, Win32Code.WM_SETTEXT, 0, price.ToString()); + Win32API.SendDlgItemMessage(hBuySell, ID_TXT_NUM, Win32Code.WM_SETTEXT, 0, amount.ToString()); + + // 点击买入按钮 + Win32API.PostMessage(hBuySell, Win32Code.WM_COMMAND, ID_BTN_BUY, 0); + + int no = waitAndGetTradeID(hBuySell, code, price, amount); + + TraderResult result = new TraderResult(); + result.Code = TraderResultEnum.SUCCESS; + result.EntrustNo = no; + return result; + } + + protected override TraderResult internalCancelStock(int entrustNo) + { + return null; + //return wst.CancelStock(entrustNo); + // ClickCancelTreeViewItem(); + } + + protected override void internalKeep() + { + // 刷新 + Win32API.SendMessage(hWnd, Win32Code.WM_KEYDOWN, Win32Code.VK_F4, 0); + } + + private IntPtr findWndClass(IntPtr hWnd, IntPtr child) + { + IntPtr hc = Win32API.FindWindowEx(hWnd, child, "CLIPBRDWNDCLASS", null); + STRINGBUFFER sb; + Win32API.GetClassName(hc, out sb, 15); + if (sb.szText.ToUpper().Equals("CLIPBRDWNDCLASS")) + { + MessageBox.Show(sb.szText); + } + else + { + findWndClass(hWnd, hc); + } + Console.WriteLine(sb.szText); + + return hc; + } + + protected override TraderResult internalGetTradingAccountInfo() + { + //ClickQueryTreeViewItem(); + + //IntPtr list = GetPositonList(); + + //String s = readListData(list); + //String[] ps = s.Split(new string[] { "\r\n" }, StringSplitOptions.None); + + //TradingAccount account = new TradingAccount(); + //GetStocks(account, ps); + + //IntPtr hPanel = GetDetailPanel(); + //Win32API.SendMessage(hPanel, Win32Code.WM_COMMAND, 32790, 0); // refresh + + //TradingAccount.FundInfo fund = new TradingAccount.FundInfo(); + //account.fundInfo = fund; + //fund.MoneyName = "人民币"; + + //account.fundInfo.CurrentBalance = GetDlgItemPrice(hPanel, 0x03F4); + //account.fundInfo.EnableBalance = GetDlgItemPrice(hPanel, 0x03F8); + //account.fundInfo.FetchBalance = GetDlgItemPrice(hPanel, 0x03F9); + //account.fundInfo.AssetBalance = GetDlgItemPrice(hPanel, 0x03F7); + //account.fundInfo.MarketValue = GetDlgItemPrice(hPanel, 0x03F6); + + //TraderResult result = new TraderResult(); + //result.Code = TraderResultEnum.SUCCESS; + //result.Result = account; + + //return result; + return null; + + } + + protected override TraderResult internalGetTodayTradeList() + { + //ClickQueryDrcjTreeViewItem(); + //IntPtr list = GetPositonList(); + + //String s = readListData(list); + + //String[] ps = s.Split(new string[] { "\r\n" }, StringSplitOptions.None); + //List records = GetTransactionList(ps); + + //TraderResult result = new TraderResult(); + //result.Code = TraderResultEnum.SUCCESS; + //result.Result = records; + + //return result; + + return null; + } + + protected override TraderResult internalGetTodayEntrustList() + { + return base.internalGetTodayEntrustList(); + } + + #endregion + + private void lookupTurnoverReturn() + { + while (true) + { + if (true) // 发现回报 + { + base.StockTrader_OnTurnOverReturn(0, "000", 0, 0); + } + } + } + + //private List GetEntrustList(String[] ps) + //{ + // List records = new List(); + // for (int i = 1; i < ps.Length; i++) + // { + // Console.WriteLine(ps[i]); + // String[] stocks = ps[i].Split(new string[] { "\t" }, StringSplitOptions.None); + // EntrustRecord rec = new EntrustRecord + // { + // Date = DateTime.Parse(stocks[0] + " " + stocks[6]), + // StockCode = stocks[1], + // StockName = stocks[2], + // OperType = stocks[3], + // Price = float.Parse(stocks[4]), + // Amount = int.Parse(stocks[5]), + // TransactAmount = int.Parse(stocks[7]), + // TransactPrice = float.Parse(stocks[8]), + // No = int.Parse(stocks[1]), + // }; + // records.Add(rec); + // } + + // return records; + //} + + //private List GetTransactionList(String[] ps) + //{ + // List records = new List(); + // for (int i = 1; i < ps.Length; i++) + // { + // Console.WriteLine(ps[i]); + // String[] stocks = ps[i].Split(new string[] { "\t" }, StringSplitOptions.None); + // TransactionRecord rec = new TransactionRecord + // { + // Date = DateTime.ParseExact(stocks[0], "yyyyMMdd", null), + // EntrustNo = int.Parse(stocks[1]), + // StockCode = stocks[2], + // StockName = stocks[3], + // OperType = stocks[4], + // Amount = int.Parse(stocks[5]), + // Price = float.Parse(stocks[6]), + // Turnover = float.Parse(stocks[7]), + // TransactionNo = int.Parse(stocks[10]) + // }; + // records.Add(rec); + // } + + // return records; + //} + + //private void GetStocks(TradingAccount account, String[] ps) + //{ + // for (int i = 1; i < ps.Length; i++) + // { + // String[] stocks = ps[i].Split(new string[] { "\t" }, StringSplitOptions.None); + // StockHolderInfo shi = new StockHolderInfo + // { + // StockCode = stocks[0], + // StockName = stocks[1], + // CurrentAmount = int.Parse(stocks[2]), + // EnableAmount = int.Parse(stocks[3]), + // IncomeAmount = int.Parse(stocks[4]), + // CostPrice = float.Parse(stocks[5]), + // KeepCostPrice = float.Parse(stocks[6]), + // LastPrice = float.Parse(stocks[7]), + // MarketValue = float.Parse(stocks[10]), + // ExchangeName = stocks[11], + // StockAccount = stocks[12] + // }; + // account.AddStockHolder(shi); + // } + //} + + /// + /// + /// + /// + /// + /// + /// + /// + private int waitAndGetTradeID(IntPtr hWndTrade, String code, float price, int amount) + { + const int ID_TXT_CODE = 0x0408; + const int ID_TXT_PRICE = 0x0409; + const int ID_TXT_NUM = 0x040A; + + uint dwTick = Win32API.GetTickCount(); + int entrustNo = 0; + + #region callback + /* + Win32API.EnumWindowsProc EnumWindowsProc = delegate (IntPtr hTip, int lParam) + { + String clazz = GetClassName(hTip); + + // 不是对话框的基类,继续扫描 + if ("#32770" != clazz) + return true; + + // 不含有0x0555 组件,就不用管 + IntPtr hCaption = Win32API.GetDlgItem(hTip, 0x0555); + if (hCaption == IntPtr.Zero) + return true; + + // + IntPtr hCap = Win32API.GetDlgItem(hTip, 0x0555); + String sCap = GetWindowText(hCap, 10); + switch (sCap.Substring(0, 1)) + { + case "委": + Win32API.SendMessage(hTip, Win32Code.WM_COMMAND, 0x0006, 0); + break; + case "提": + if ("提示" == sCap) + { + String s = GetDlgItemTextEx(hTip, 0x03EC); + Console.WriteLine("提示内容:" + s); + if (s.Contains("成功提交")) + { + int i = s.IndexOf("。"); + entrustNo = int.Parse(s.Substring(17, i - 17)); + + Win32API.SendMessage(hTip, Win32Code.WM_COMMAND, 0X0002, 0); + return false; + } + else if (s == "请输入委托价格") + { + Win32API.SendMessage(hTip, Win32Code.WM_COMMAND, 0X0002, 0); + + Win32API.SendDlgItemMessage(hWndTrade, 0x0409, Win32Code.WM_SETTEXT, 0, price.ToString()); + Win32API.PostMessage(hWndTrade, Win32Code.WM_COMMAND, 0x03EE, 0); + } + else if (s == "请输入委托数量") + { + Win32API.SendMessage(hTip, Win32Code.WM_COMMAND, 0X0002, 0); + + Win32API.SendDlgItemMessage(hWndTrade, 0x040A, Win32Code.WM_SETTEXT, 0, amount.ToString()); + Win32API.PostMessage(hWndTrade, Win32Code.WM_COMMAND, 0x03EE, 0); + } + else if (s == "提交失败") + { + Win32API.SendMessage(hTip, Win32Code.WM_COMMAND, 0X0002, 0); + entrustNo = 0; + return false; + } + else if (s == "正在连接委托主站...") + { + PeekAndDelay(1000); + } + else if (s == "正在验证用户身份...") + { + PeekAndDelay(1000); + } + else + { + Console.WriteLine("未获取到值"); + } + } + else if ("提示信息" == sCap) + { + // 委托价格不在 + // TODO: 确定0x006是否正确 + Win32API.SendMessage(hTip, Win32Code.WM_COMMAND, 0X0006, 0); + } + break; + default: + break; + } + + return true; + }; + */ + #endregion callback + + while (true) + { + if (Win32API.GetTickCount() - dwTick > 3 * 1000 || entrustNo != 0) + { + break; + } + PeekAndDelay(40); + IntPtr hTip = IntPtr.Zero; + // IntPtr hTip = Win32API.EnumWindows(EnumWindowsProc, ref ptr); + Win32API.EnumWindows(enumTipWindowProc, ref hTip); + + // 获取窗口标题 + IntPtr hCaption = Win32API.GetDlgItem(hTip, 0x0555); + if (hCaption == IntPtr.Zero) + continue; + + String sCap = GetWindowText(hCaption, 10); + switch (sCap.Substring(0, 1)) + { + case "委": + Win32API.SendMessage(hTip, Win32Code.WM_COMMAND, 0x0006, 0); + break; + case "提": + if ("提示" == sCap) + { + String s = GetDlgItemTextEx(hTip, 0x03EC); + Console.WriteLine("提示内容:" + s); + if (s.Contains("成功提交")) + { + int i = s.IndexOf("。"); + entrustNo = int.Parse(s.Substring(17, i - 17)); + + Win32API.SendMessage(hTip, Win32Code.WM_COMMAND, 0X0002, 0); + + return entrustNo; + } + else if (s == "请输入委托价格") + { + Win32API.SendMessage(hTip, Win32Code.WM_COMMAND, 0X0002, 0); + + Win32API.SendDlgItemMessage(hWndTrade, 0x0409, Win32Code.WM_SETTEXT, 0, price.ToString()); + Win32API.PostMessage(hWndTrade, Win32Code.WM_COMMAND, 0x03EE, 0); + } + else if (s == "请输入委托数量") + { + Win32API.SendMessage(hTip, Win32Code.WM_COMMAND, 0X0002, 0); + + Win32API.SendDlgItemMessage(hWndTrade, 0x040A, Win32Code.WM_SETTEXT, 0, amount.ToString()); + Win32API.PostMessage(hWndTrade, Win32Code.WM_COMMAND, 0x03EE, 0); + } + else if (s == "提交失败") + { + Win32API.SendMessage(hTip, Win32Code.WM_COMMAND, 0X0002, 0); + entrustNo = 0; + return entrustNo; + } + else if (s == "正在连接委托主站...") + { + //LogHelper.Instance.WriteLog(null, s, true); + PeekAndDelay(1000); + } + else if (s == "正在验证用户身份...") + { + //LogHelper.Instance.WriteLog(null, s, true); + PeekAndDelay(1000); + } + else if (s.StartsWith("提交失败")) + { + Console.WriteLine("发生提交失败{0}", s); + Win32API.SendMessage(hTip, Win32Code.WM_COMMAND, 0X0002, 0); + + Win32API.SendDlgItemMessage(hWndTrade, ID_TXT_CODE, Win32Code.WM_SETTEXT, 0, code); + PeekAndDelay(50); + Win32API.SendDlgItemMessage(hWndTrade, ID_TXT_PRICE, Win32Code.WM_SETTEXT, 0, price.ToString()); + Win32API.SendDlgItemMessage(hWndTrade, ID_TXT_NUM, Win32Code.WM_SETTEXT, 0, amount.ToString()); + Win32API.PostMessage(hWndTrade, Win32Code.WM_COMMAND, 0x03EE, 0); + + } + } + else if ("提示信息" == sCap) + { + // 委托价格不在 + // TODO: 确定0x006是否正确 + Win32API.SendMessage(hTip, Win32Code.WM_COMMAND, 0X0006, 0); + } + break; + default: + break; + } + } + return entrustNo; + + } + + private bool enumTipWindowProc(IntPtr hTip, ref IntPtr lParam) + { + String clazz = GetClassName(hTip); + + // 不是对话框的基类,继续扫描 + if ("#32770" != clazz) + return true; + + //// 是否处于活动状态 + //// 非活动状态的不处理 + //LONG wndStype = GetWindowLong(hWndChild, GWL_STYLE); + //if ((wndStype & WS_VISIBLE) == 0) + // return TRUE; + + // 不含有0x0555 组件,就不用管 + IntPtr hCaption = Win32API.GetDlgItem(hTip, 0x0555); + if (hCaption == IntPtr.Zero) + return true; + + String sCap = GetWindowText(hCaption, 10); + switch (sCap.Substring(0, 1)) + { + case "委": + if ("委托确认" == sCap) + { + lParam = hTip; + return false; + } + break; + case "提": + if ("提示" == sCap || "提示信息" == sCap) + { + lParam = hTip; + return false; + } + break; + default: + break; + } + + return true; + } + private String readListData(IntPtr hwnd) + { + uint dwTick = Win32API.GetTickCount(); + String s = ""; + while (true) + { + // 发送复制命令 + Win32API.SendMessage(hwnd, Win32Code.WM_COMMAND, 57634, 0); + // 延时等对方处理 + PeekAndDelay(40); + s = Clipboard.GetText(); + if (s != null && s.Length != 0) break; + + // 是否超时未响应 + if (Win32API.GetTickCount() - dwTick > 3000) + return ""; + } + + return s; + } + + private String GetWindowText(IntPtr hWnd, int len) + { + STRINGBUFFER sb; + Win32API.GetWindowText(hWnd, out sb, len); + + return sb.szText; + } + + private float GetDlgItemPrice(IntPtr hWnd, int dlgId) + { + IntPtr h = Win32API.GetDlgItem(hWnd, dlgId); + string s = GetWindowText(h, 10); + + if (s == null || s.Length == 0) return 0; + + return float.Parse(s); + } + + private String GetDlgItemText(IntPtr hWnd, int dlgId) + { + IntPtr h = Win32API.GetDlgItem(hWnd, dlgId); + STRINGBUFFER sb; + Win32API.GetWindowText(hWnd, out sb, 100); + + return sb.szText; + } + private String GetDlgItemTextEx(IntPtr hWnd, int dlgId) + { + IntPtr h = Win32API.GetDlgItem(hWnd, dlgId); + //STRINGBUFFER sb; + //Win32API.GetWindowText(hWnd, out sb, 100); + + byte[] lParamStr = new byte[120]; + Win32API.SendMessage(h, Win32Code.WM_GETTEXT, 120, lParamStr); + String sText = Encoding.Unicode.GetString(lParamStr); + + return sText; + } + + private void PeekAndDelay(int delay) + { + uint dwTick = Win32API.GetTickCount(); + MSG msg = new MSG(); + while (Win32API.GetTickCount() - dwTick < delay) + { + if (Win32API.PeekMessage(ref msg, 0, 0, 0, Win32Code.PM_REMOVE)) + { + Win32API.TranslateMessage(ref msg); + Win32API.DispatchMessage(ref msg); + } + Thread.Sleep(1); + } + } + + private String GetClassName(IntPtr hWnd) + { + STRINGBUFFER sb; + Win32API.GetClassName(hWnd, out sb, 40); + + return sb.szText; + } + } +} diff --git a/Quanter.Trader.Connector/ThsTraderActor.cs b/Quanter.Trader.Connector/ThsTraderActor.cs new file mode 100644 index 0000000..22f6a4f --- /dev/null +++ b/Quanter.Trader.Connector/ThsTraderActor.cs @@ -0,0 +1,60 @@ +using Akka.Actor; +using Akka.Event; +using Quanter.Common; +using Quanter.Trader.Messages; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Quanter.Trader.Connector +{ + + public class ThsTraderActor : TypedActor + { + private readonly ILoggingAdapter _log = Logging.GetLogger(Context); + private IStockTrader trader = new ThsStockTrader(); + + /// + /// 限价买入 + /// + private void _buy( Order order, Securities sec) + { + _log.Debug("保存到策略账户 委买单 策略ID:{0}, 代码:{1}, 证券类别: {2}, 价格:{3}, 数量:{4}",order.StrategyId, order.Symbol, sec.Type, order.Price, order.Amount); + + } + + /// + /// 限价卖出 + /// + private void _sell(Order order, Securities sec) + { + _log.Debug("保存到策略账户 委卖单 策略ID:{0}, 代码:{1}, 证券类别: {2}, 价格:{3}, 数量:{4}", order.StrategyId, order.Symbol, sec.Type, order.Price, order.Amount); + } + + /// + /// 获取持仓信息 + /// + private void _getPositionInfo() + { + + } + + /// + /// 获取资金信息 + /// + private void _getFundInfo() + { + + } + + /// + /// 保持在线 + /// + private void _keep() + { + + } + } +} diff --git a/Quanter.Trader.Connector/TradeManagerActor.cs b/Quanter.Trader.Connector/TradeManagerActor.cs new file mode 100644 index 0000000..dd9afab --- /dev/null +++ b/Quanter.Trader.Connector/TradeManagerActor.cs @@ -0,0 +1,24 @@ +using Akka.Actor; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Quanter.Trader.Connector +{ + class TradeManagerActor : UntypedActor + { + protected override void OnReceive(object message) + { + throw new NotImplementedException(); + } + + private void _createTradeActor() + { + // 读取数据库, exe的位置,交易软件ths|tdx + + // + } + } +} diff --git a/Quanter.Trader.Connector/TraderResult.cs b/Quanter.Trader.Connector/TraderResult.cs new file mode 100644 index 0000000..fa3701d --- /dev/null +++ b/Quanter.Trader.Connector/TraderResult.cs @@ -0,0 +1,28 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Quanter.Trader.Connector +{ + public enum TraderResultEnum + { + SUCCESS, // 成功 + ERROR, // 错误 + UNLOGIN, // 未登录 + TIMEOUT // 超时 + } + public class TraderResult + { + public TraderResultEnum Code { get; set; } + public string Message { get; set; } + public int EntrustNo { get; set; } + public object Result { get; set; } + + public TraderResult() + { + Code = TraderResultEnum.TIMEOUT; + } + } +} diff --git a/Quanter.Trader.Connector/Win32API.cs b/Quanter.Trader.Connector/Win32API.cs new file mode 100644 index 0000000..84c3aac --- /dev/null +++ b/Quanter.Trader.Connector/Win32API.cs @@ -0,0 +1,340 @@ +using System; +using System.Drawing; +using System.Runtime.InteropServices; +using System.Text; + +namespace Quanter.Trader.Connector +{ + public class Win32API + { + #region .ctor() + // No need to construct this object + private Win32API() + { + } + #endregion + + #region CallBacks + public delegate IntPtr HookProc(int nCode, IntPtr wParam, IntPtr lParam); + public delegate bool EnumWindowsProc(IntPtr hWnd, int lParam); + public delegate bool EnumWindowsProc1(IntPtr hWnd, ref IntPtr lParam); + #endregion + + #region Kernel32.dll functions + [DllImport("kernel32.dll", ExactSpelling = true, CharSet = CharSet.Auto)] + public static extern int GetCurrentThreadId(); + [DllImport("kernel32.dll")] + public static extern IntPtr LoadLibrary(string path); + [DllImport("kernel32.dll")] + public static extern IntPtr GetProcAddress(IntPtr lib, string funcName); + + #endregion + + #region Gdi32.dll functions + [DllImport("gdi32.dll")] + static public extern bool StretchBlt(IntPtr hDCDest, int XOriginDest, int YOriginDest, int WidthDest, int HeightDest, + IntPtr hDCSrc, int XOriginScr, int YOriginSrc, int WidthScr, int HeightScr, uint Rop); + [DllImport("gdi32.dll")] + static public extern IntPtr CreateCompatibleDC(IntPtr hDC); + [DllImport("gdi32.dll")] + static public extern IntPtr CreateCompatibleBitmap(IntPtr hDC, int Width, int Heigth); + [DllImport("gdi32.dll")] + static public extern IntPtr SelectObject(IntPtr hDC, IntPtr hObject); + [DllImport("gdi32.dll")] + static public extern bool BitBlt(IntPtr hDCDest, int XOriginDest, int YOriginDest, int WidthDest, int HeightDest, + IntPtr hDCSrc, int XOriginScr, int YOriginSrc, uint Rop); + [DllImport("gdi32.dll")] + static public extern IntPtr DeleteDC(IntPtr hDC); + [DllImport("gdi32.dll")] + static public extern bool PatBlt(IntPtr hDC, int XLeft, int YLeft, int Width, int Height, uint Rop); + [DllImport("gdi32.dll")] + static public extern bool DeleteObject(IntPtr hObject); + [DllImport("gdi32.dll")] + static public extern uint GetPixel(IntPtr hDC, int XPos, int YPos); + [DllImport("gdi32.dll")] + static public extern int SetMapMode(IntPtr hDC, int fnMapMode); + [DllImport("gdi32.dll")] + static public extern int GetObjectType(IntPtr handle); + [DllImport("gdi32")] + public static extern IntPtr CreateDIBSection(IntPtr hdc, ref BITMAPINFO_FLAT bmi, + int iUsage, ref int ppvBits, IntPtr hSection, int dwOffset); + [DllImport("gdi32")] + public static extern int GetDIBits(IntPtr hDC, IntPtr hbm, int StartScan, int ScanLines, int lpBits, BITMAPINFOHEADER bmi, int usage); + [DllImport("gdi32")] + public static extern int GetDIBits(IntPtr hdc, IntPtr hbm, int StartScan, int ScanLines, int lpBits, ref BITMAPINFO_FLAT bmi, int usage); + + [DllImport("kernel32.dll")] + public static extern uint GetTickCount(); + + [DllImport("gdi32")] + public static extern IntPtr GetPaletteEntries(IntPtr hpal, int iStartIndex, int nEntries, byte[] lppe); + [DllImport("gdi32")] + public static extern IntPtr GetSystemPaletteEntries(IntPtr hdc, int iStartIndex, int nEntries, byte[] lppe); + [DllImport("gdi32")] + public static extern uint SetDCBrushColor(IntPtr hdc, uint crColor); + [DllImport("gdi32")] + public static extern IntPtr CreateSolidBrush(uint crColor); + [DllImport("gdi32")] + public static extern int SetBkMode(IntPtr hDC, BackgroundMode mode); + [DllImport("gdi32")] + public static extern int SetViewportOrgEx(IntPtr hdc, int x, int y, int param); + [DllImport("gdi32")] + public static extern uint SetTextColor(IntPtr hDC, uint colorRef); + [DllImport("gdi32")] + public static extern int SetStretchBltMode(IntPtr hDC, int StrechMode); + #endregion + + #region Uxtheme.dll functions + [DllImport("uxtheme.dll")] + static public extern int SetWindowTheme(IntPtr hWnd, string AppID, string ClassID); + #endregion + + #region User32.dll functions + [DllImport("User32.dll", EntryPoint = "FindWindow")] + public static extern IntPtr FindWindow(string lpClassName, string lpWindowName); + [DllImport("User32.dll", EntryPoint = "FindWindowEx")] + public static extern IntPtr FindWindowEx(IntPtr hWnd, IntPtr hwndChildAfter, string lpClassName, string lpWindowName); + [DllImport("User32.dll", EntryPoint = "EnumWindows")] + public static extern IntPtr EnumWindows(EnumWindowsProc ewp, int lParam); + [DllImport("User32.dll", EntryPoint = "EnumWindows")] + public static extern IntPtr EnumWindows(EnumWindowsProc1 ewp, ref IntPtr lParam); + [DllImport("user32.dll")] + [return: MarshalAs(UnmanagedType.Bool)] + public static extern bool EnumChildWindows(IntPtr hwndParent, EnumWindowsProc lpEnumFunc, IntPtr lParam); + [DllImport("user32.dll", CharSet = CharSet.Auto)] + public static extern IntPtr GetDC(IntPtr hWnd); + [DllImport("user32.dll", CharSet = CharSet.Auto)] + public static extern int ReleaseDC(IntPtr hWnd, IntPtr hDC); + [DllImport("user32.dll", CharSet = CharSet.Auto)] + static public extern IntPtr GetDesktopWindow(); + [DllImport("user32.dll", CharSet = CharSet.Auto)] + static public extern bool ShowWindow(IntPtr hWnd, short State); + [DllImport("user32.dll", CharSet = CharSet.Auto)] + static public extern bool UpdateWindow(IntPtr hWnd); + [DllImport("user32.dll", CharSet = CharSet.Auto)] + static public extern bool SetForegroundWindow(IntPtr hWnd); + [DllImport("user32.dll", CharSet = CharSet.Auto)] + static public extern bool SetWindowPos(IntPtr hWnd, IntPtr hWndInsertAfter, int x, int y, int Width, int Height, uint flags); + [DllImport("user32.dll", CharSet = CharSet.Auto)] + static public extern bool OpenClipboard(IntPtr hWndNewOwner); + [DllImport("user32.dll", CharSet = CharSet.Auto)] + static public extern IntPtr GetClipboardData(int p); + [DllImport("user32.dll", CharSet = CharSet.Auto)] + static public extern bool CloseClipboard(); + [DllImport("user32.dll", CharSet = CharSet.Auto)] + static public extern bool EmptyClipboard(); + [DllImport("user32.dll", CharSet = CharSet.Auto)] + static public extern IntPtr SetClipboardData(uint Format, IntPtr hData); + [DllImport("user32.dll", CharSet = CharSet.Auto)] + static public extern bool GetMenuItemRect(IntPtr hWnd, IntPtr hMenu, uint Item, ref RECT rc); + [DllImport("user32.dll", ExactSpelling = true, CharSet = CharSet.Auto)] + public static extern IntPtr GetParent(IntPtr hWnd); + + [DllImport("user32.dll", EntryPoint = "keybd_event")] + public static extern void keybd_event( + byte bVk, //虚拟键值 + byte bScan,// 一般为0 + int dwFlags, //这里是整数类型 0 为按下,2为释放 + int dwExtraInfo //这里是整数类型 一般情况下设成为 0 + ); + [DllImport("User32.dll", CharSet = CharSet.Auto)] + public static extern int GetWindowThreadProcessId(IntPtr hwnd, out int ID); + + [DllImport("user32.dll", CharSet = CharSet.Auto)] + public static extern int SendMessage(IntPtr hWnd, int msg, int wParam, int lParam); + [DllImport("user32.dll", CharSet = CharSet.Auto)] + public static extern int SendMessage(IntPtr hWnd, int msg, int wParam, byte[] lParam); + [DllImport("user32.dll", CharSet = CharSet.Auto)] + public static extern int SendMessage(IntPtr hWnd, int msg, int wParam, StringBuilder lParam); + [DllImport("user32.dll", CharSet = CharSet.Auto)] + public static extern int SendMessage(IntPtr hWnd, int msg, int wParam, string lParam); + [DllImport("user32.dll", CharSet = CharSet.Auto)] + public static extern IntPtr SendMessage(IntPtr hWnd, int msg, int wParam, IntPtr lParam); + [DllImport("user32.dll", CharSet = CharSet.Auto)] + public static extern void SendMessage(IntPtr hWnd, int msg, int wParam, ref RECT lParam); + [DllImport("user32.dll", CharSet = CharSet.Auto)] + public static extern int SendMessage(IntPtr hWnd, int msg, int wParam, ref POINT lParam); + [DllImport("user32.dll", CharSet = CharSet.Auto)] + public static extern void SendMessage(IntPtr hWnd, int msg, int wParam, ref TBBUTTON lParam); + [DllImport("user32.dll", CharSet = CharSet.Auto)] + public static extern void SendMessage(IntPtr hWnd, int msg, int wParam, ref TBBUTTONINFO lParam); + [DllImport("user32.dll", CharSet = CharSet.Auto)] + public static extern int SendMessage(IntPtr hWnd, int msg, int wParam, ref REBARBANDINFO lParam); + [DllImport("user32.dll", CharSet = CharSet.Auto)] + public static extern void SendMessage(IntPtr hWnd, int msg, int wParam, ref TVITEM lParam); + [DllImport("user32.dll", CharSet = CharSet.Auto)] + public static extern void SendMessage(IntPtr hWnd, int msg, int wParam, ref LVITEM lParam); + [DllImport("user32.dll", CharSet = CharSet.Auto)] + public static extern void SendMessage(IntPtr hWnd, int msg, int wParam, ref HDITEM lParam); + [DllImport("user32.dll", CharSet = CharSet.Auto)] + public static extern void SendMessage(IntPtr hWnd, int msg, int wParam, ref HD_HITTESTINFO hti); + [DllImport("user32.dll", CharSet = CharSet.Auto)] + public static extern IntPtr PostMessage(IntPtr hWnd, int msg, int wParam, int lParam); + [DllImport("user32.dll", CharSet = CharSet.Auto)] + public static extern int PostMessage(IntPtr hWnd, int msg, int wParam, string lParam); + [DllImport("user32.dll", CharSet = CharSet.Auto)] + public static extern int PostMessage(IntPtr hWnd, int msg, int wParam, ref POINT lParam); + [DllImport("user32.dll", CharSet = CharSet.Auto)] + public static extern IntPtr SetWindowsHookEx(int hookid, HookProc pfnhook, IntPtr hinst, int threadid); + [DllImport("user32.dll", CharSet = CharSet.Auto, ExactSpelling = true)] + public static extern bool UnhookWindowsHookEx(IntPtr hhook); + [DllImport("user32.dll", CharSet = CharSet.Auto, ExactSpelling = true)] + public static extern IntPtr CallNextHookEx(IntPtr hhook, int code, IntPtr wparam, IntPtr lparam); + [DllImport("user32.dll", CharSet = CharSet.Auto)] + public static extern IntPtr SetFocus(IntPtr hWnd); + [DllImport("user32.dll", CharSet = CharSet.Auto)] + public extern static int DrawText(IntPtr hdc, string lpString, int nCount, ref RECT lpRect, int uFormat); + [DllImport("user32.dll", CharSet = CharSet.Auto)] + public extern static IntPtr SetParent(IntPtr hChild, IntPtr hParent); + [DllImport("user32.dll", CharSet = CharSet.Auto)] + public extern static IntPtr GetDlgItem(IntPtr hDlg, int nControlID); + [DllImport("user32.dll", CharSet = CharSet.Auto)] + public extern static int GetClientRect(IntPtr hWnd, ref RECT rc); + [DllImport("user32.dll", CharSet = CharSet.Auto)] + public extern static int InvalidateRect(IntPtr hWnd, IntPtr rect, int bErase); + [DllImport("User32.dll", CharSet = CharSet.Auto)] + public static extern bool WaitMessage(); + [DllImport("User32.dll", CharSet = CharSet.Auto)] + public static extern bool PeekMessage(ref MSG msg, int hWnd, uint wFilterMin, uint wFilterMax, uint wFlag); + [DllImport("User32.dll", CharSet = CharSet.Auto)] + public static extern bool GetMessage(ref MSG msg, int hWnd, uint wFilterMin, uint wFilterMax); + [DllImport("User32.dll", CharSet = CharSet.Auto)] + public static extern bool TranslateMessage(ref MSG msg); + [DllImport("User32.dll", CharSet = CharSet.Auto)] + public static extern bool DispatchMessage(ref MSG msg); + [DllImport("User32.dll", CharSet = CharSet.Auto)] + public static extern IntPtr LoadCursor(IntPtr hInstance, uint cursor); + [DllImport("User32.dll", CharSet = CharSet.Auto)] + public static extern IntPtr SetCursor(IntPtr hCursor); + [DllImport("User32.dll", CharSet = CharSet.Auto)] + public static extern IntPtr GetFocus(); + [DllImport("User32.dll", CharSet = CharSet.Auto)] + public static extern bool ReleaseCapture(); + [DllImport("User32.dll", CharSet = CharSet.Auto)] + public static extern IntPtr BeginPaint(IntPtr hWnd, ref PAINTSTRUCT ps); + [DllImport("User32.dll", CharSet = CharSet.Auto)] + public static extern bool EndPaint(IntPtr hWnd, ref PAINTSTRUCT ps); + [DllImport("User32.dll", CharSet = CharSet.Auto)] + public static extern bool UpdateLayeredWindow(IntPtr hwnd, IntPtr hdcDst, ref POINT pptDst, ref SIZE psize, IntPtr hdcSrc, ref POINT pprSrc, Int32 crKey, ref BLENDFUNCTION pblend, Int32 dwFlags); + [DllImport("User32.dll", CharSet = CharSet.Auto)] + public static extern bool GetWindowRect(IntPtr hWnd, ref RECT rect); + [DllImport("User32.dll", CharSet = CharSet.Auto)] + public static extern bool ClientToScreen(IntPtr hWnd, ref POINT pt); + [DllImport("User32.dll", CharSet = CharSet.Auto)] + public static extern bool TrackMouseEvent(ref TRACKMOUSEEVENTS tme); + [DllImport("User32.dll", CharSet = CharSet.Auto)] + public static extern bool SetWindowRgn(IntPtr hWnd, IntPtr hRgn, bool redraw); + [DllImport("User32.dll", CharSet = CharSet.Auto)] + public static extern ushort GetKeyState(int virtKey); + [DllImport("User32.dll", CharSet = CharSet.Auto)] + public static extern bool MoveWindow(IntPtr hWnd, int x, int y, int width, int height, bool repaint); + [DllImport("User32.dll", CharSet = CharSet.Auto)] + public static extern int GetClassName(IntPtr hWnd, out STRINGBUFFER ClassName, int nMaxCount); + [DllImport("User32.dll", CharSet = CharSet.Auto)] + public static extern int SetWindowLong(IntPtr hWnd, int nIndex, int dwNewLong); + [DllImport("User32.dll", CharSet = CharSet.Auto)] + public static extern IntPtr GetDCEx(IntPtr hWnd, IntPtr hRegion, uint flags); + [DllImport("User32.dll", CharSet = CharSet.Auto)] + public static extern IntPtr GetWindowDC(IntPtr hWnd); + [DllImport("User32.dll", CharSet = CharSet.Auto)] + public static extern int FillRect(IntPtr hDC, ref RECT rect, IntPtr hBrush); + [DllImport("User32.dll", CharSet = CharSet.Auto)] + public static extern int GetWindowPlacement(IntPtr hWnd, ref WINDOWPLACEMENT wp); + [DllImport("User32.dll", CharSet = CharSet.Auto)] + public static extern int SetWindowText(IntPtr hWnd, string text); + [DllImport("User32.dll", CharSet = CharSet.Auto)] + public static extern int GetWindowText(IntPtr hWnd, out STRINGBUFFER text, int maxCount); + [DllImport("user32.dll", CharSet = CharSet.Auto)] + static public extern int SendMessage(IntPtr hWnd, int Msg, IntPtr wParam, IntPtr lParam); + + [DllImport("user32.dll", CharSet = CharSet.Auto)] + public static extern int SendDlgItemMessage(IntPtr hPanel, int id, int Msg, int wParam, string lParam); + + [DllImport("user32.dll", CharSet = CharSet.Auto)] + static public extern IntPtr SetClipboardViewer(IntPtr hWndNewViewer); + [DllImport("user32.dll", CharSet = CharSet.Auto)] + static public extern int ChangeClipboardChain(IntPtr hWndRemove, IntPtr hWndNewNext); + [DllImport("user32.dll", CharSet = CharSet.Auto)] + static public extern int GetSystemMetrics(int nIndex); + [DllImport("user32.dll", CharSet = CharSet.Auto)] + static public extern int SetScrollInfo(IntPtr hwnd, int bar, ref SCROLLINFO si, int fRedraw); + [DllImport("user32.dll", CharSet = CharSet.Auto)] + public static extern int ShowScrollBar(IntPtr hWnd, int bar, int show); + [DllImport("user32.dll", CharSet = CharSet.Auto)] + public static extern int EnableScrollBar(IntPtr hWnd, uint flags, uint arrows); + [DllImport("user32.dll", CharSet = CharSet.Auto)] + public static extern int BringWindowToTop(IntPtr hWnd); + [DllImport("user32.dll", CharSet = CharSet.Auto)] + public static extern int GetScrollInfo(IntPtr hwnd, int bar, ref SCROLLINFO si); + [DllImport("user32.dll", CharSet = CharSet.Auto)] + static public extern int ScrollWindowEx(IntPtr hWnd, int dx, int dy, + ref RECT rcScroll, ref RECT rcClip, IntPtr UpdateRegion, ref RECT rcInvalidated, uint flags); + [DllImport("user32.dll", CharSet = CharSet.Auto)] + public static extern int IsWindow(IntPtr hWnd); + [DllImport("user32", CharSet = CharSet.Auto)] + public static extern int GetKeyboardState(byte[] pbKeyState); + [DllImport("user32")] + public static extern int ToAscii(int uVirtKey, //[in] Specifies the virtual-key code to be translated. + int uScanCode, // [in] Specifies the hardware scan code of the key to be translated. The high-order bit of this value is set if the key is up (not pressed). + byte[] lpbKeyState, // [in] Pointer to a 256-byte array that contains the current keyboard state. Each element (byte) in the array contains the state of one key. If the high-order bit of a byte is set, the key is down (pressed). The low bit, if set, indicates that the key is toggled on. In this function, only the toggle bit of the CAPS LOCK key is relevant. The toggle state of the NUM LOCK and SCROLL LOCK keys is ignored. + byte[] lpwTransKey, // [out] Pointer to the buffer that receives the translated character or characters. + int fuState); // [in] Specifies whether a menu is active. This parameter must be 1 if a menu is active, or 0 otherwise. + #endregion + + #region Common Controls functions + [DllImport("comctl32.dll")] + public static extern bool InitCommonControlsEx(INITCOMMONCONTROLSEX icc); + [DllImport("comctl32.dll")] + public static extern bool InitCommonControls(); + [DllImport("comctl32.dll", EntryPoint = "DllGetVersion")] + public extern static int GetCommonControlDLLVersion(ref DLLVERSIONINFO dvi); + [DllImport("comctl32.dll")] + public static extern IntPtr ImageList_Create(int width, int height, uint flags, int count, int grow); + [DllImport("comctl32.dll")] + public static extern bool ImageList_Destroy(IntPtr handle); + [DllImport("comctl32.dll")] + public static extern int ImageList_Add(IntPtr imageHandle, IntPtr hBitmap, IntPtr hMask); + [DllImport("comctl32.dll")] + public static extern bool ImageList_Remove(IntPtr imageHandle, int index); + [DllImport("comctl32.dll")] + public static extern bool ImageList_BeginDrag(IntPtr imageHandle, int imageIndex, int xHotSpot, int yHotSpot); + [DllImport("comctl32.dll")] + public static extern bool ImageList_DragEnter(IntPtr hWndLock, int x, int y); + [DllImport("comctl32.dll")] + public static extern bool ImageList_DragMove(int x, int y); + [DllImport("comctl32.dll")] + public static extern bool ImageList_DragLeave(IntPtr hWndLock); + [DllImport("comctl32.dll")] + public static extern void ImageList_EndDrag(); + #endregion + + #region Win32 Macro-Like helpers + public static int GET_X_LPARAM(int lParam) + { + return (lParam & 0xffff); + } + + + public static int GET_Y_LPARAM(int lParam) + { + return (lParam >> 16); + } + + public static Point GetPointFromLPARAM(int lParam) + { + return new Point(GET_X_LPARAM(lParam), GET_Y_LPARAM(lParam)); + } + + public static int LOW_ORDER(int param) + { + return (param & 0xffff); + } + + public static int HIGH_ORDER(int param) + { + return (param >> 16); + } + + #endregion + } + } \ No newline at end of file diff --git a/Quanter.Trader.Connector/Win32Code.cs b/Quanter.Trader.Connector/Win32Code.cs new file mode 100644 index 0000000..179c6bf --- /dev/null +++ b/Quanter.Trader.Connector/Win32Code.cs @@ -0,0 +1,247 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Quanter.Trader.Connector +{ + public class Win32Code + { + #region .ctor() + // No need to construct this object + private Win32Code() + { + } + #endregion + + #region tree view + + public const int TV_FIRST = 0x1100; + public const int TVM_GETCOUNT = TV_FIRST + 5; + public const int TVM_GETNEXTITEM = TV_FIRST + 10; + public const int TVM_SELECTITEM = TV_FIRST + 11; + public const int TVM_GETITEMA = TV_FIRST + 12; + public const int TVM_GETITEMW = TV_FIRST + 62; + + public const int TVGN_ROOT = 0x0000; + public const int TVGN_NEXT = 0x0001; + public const int TVGN_PREVIOUS = 0x0002; + public const int TVGN_PARENT = 0x0003; + public const int TVGN_CHILD = 0x0004; + public const int TVGN_FIRSTVISIBLE = 0x0005; + public const int TVGN_NEXTVISIBLE = 0x0006; + public const int TVGN_PREVIOUSVISIBLE = 0x0007; + public const int TVGN_DROPHILITE = 0x0008; + public const int TVGN_CARET = 0x0009; + public const int TVGN_LASTVISIBLE = 0x000A; + + public const int TVIF_TEXT = 0x0001; + public const int TVIF_IMAGE = 0x0002; + public const int TVIF_PARAM = 0x0004; + public const int TVIF_STATE = 0x0008; + public const int TVIF_HANDLE = 0x0010; + public const int TVIF_SELECTEDIMAGE = 0x0020; + public const int TVIF_CHILDREN = 0x0040; + public const int TVIF_INTEGRAL = 0x0080; + + #endregion + + public const string TOOLBARCLASSNAME = "ToolbarWindow32"; + public const string REBARCLASSNAME = "ReBarWindow32"; + public const string PROGRESSBARCLASSNAME = "msctls_progress32"; + public const string SCROLLBAR = "SCROLLBAR"; + + public const int WM_SETFOCUS = 0x0007; + public const int WM_KILLFOCUS = 0x0008; + public const int WM_SETTEXT = 0x000C; + public const int WM_GETTEXT = 0x000D; + public const int WM_KEYDOWN = 0x0100; + public const int WM_KEYUP = 0x0101; + public const int WM_CHAR = 0x00102; + public const int WM_SYSKEYDOWN = 0x0104; + public const int WM_SYSKEYUP = 0x0105; + public const int WM_SYSCHAR = 0x0106; + + + public const int WM_COPY = 0x0301; + public const int WM_RENDERFORMAT = 0x0305; + public const int CF_UNICODETEXT = 13; + public const int WM_COPYDATA = 0x004A; + + // MOUSE EVENT + public const int WM_MOUSEMOVE = 0x0200; + public const int WM_LBUTTONDOWN = 0x0201; + public const int WM_LBUTTONUP = 0x0202; + public const int WM_LBUTTONDBLCLK = 0x0203; + public const int WM_RBUTTONDOWN = 0x0204; + public const int WM_RBUTTONUP = 0x0205; + public const int WM_RBUTTONDBLCLK = 0x0206; + public const int WM_MBUTTONDOWN = 0x0207; + public const int WM_MBUTTONUP = 0x0208; + public const int WM_MBUTTONDBLCLK = 0x0209; + public const int WM_MOUSEWHEEL = 0x020A; + + #region 256 virtual key + public const int VK_LBUTTON = 0x1; + public const int VK_RBUTTON = 0x2; + public const int VK_CANCEL = 0x3; + public const int VK_MBUTTON = 0x4; + public const int VK_BACK = 0x8; + public const int VK_TAB = 0x9; + public const int VK_CLEAR = 0xC; + public const int VK_RETURN = 0xD; + public const int VK_SHIFT = 0x10; + public const int VK_CONTROL = 0x11; + public const int VK_MENU = 0x12; + public const int VK_ALT = 0X12; + public const int VK_PAUSE = 0x13; + public const int VK_CAPITAL = 0x14; + public const int VK_ESCAPE = 0x1B; + public const int VK_SPACE = 0x20; + public const int VK_PRIOR = 0x21; + public const int VK_NEXT = 0x22; + public const int VK_END = 0x23; + public const int VK_HOME = 0x24; + public const int VK_LEFT = 0x25; + public const int VK_UP = 0x26; + public const int VK_RIGHT = 0x27; + public const int VK_DOWN = 0x28; + public const int VK_Select = 0x29; + public const int VK_PRINT = 0x2A; + public const int VK_EXECUTE = 0x2B; + public const int VK_SNAPSHOT = 0x2C; + public const int VK_Insert = 0x2D; + public const int VK_Delete = 0x2E; + public const int VK_HELP = 0x2F; + public const int VK_0 = 0x30; + public const int VK_1 = 0x31; + public const int VK_2 = 0x32; + public const int VK_3 = 0x33; + public const int VK_4 = 0x34; + public const int VK_5 = 0x35; + public const int VK_6 = 0x36; + public const int VK_7 = 0x37; + public const int VK_8 = 0x38; + public const int VK_9 = 0x39; + public const int VK_A = 0x41; + public const int VK_B = 0x42; + public const int VK_C = 0x43; + public const int VK_D = 0x44; + public const int VK_E = 0x45; + public const int VK_F = 0x46; + public const int VK_G = 0x47; + public const int VK_H = 0x48; + public const int VK_I = 0x49; + public const int VK_J = 0x4A; + public const int VK_K = 0x4B; + public const int VK_L = 0x4C; + public const int VK_M = 0x4D; + public const int VK_N = 0x4E; + public const int VK_O = 0x4F; + public const int VK_P = 0x50; + public const int VK_Q = 0x51; + public const int VK_R = 0x52; + public const int VK_S = 0x53; + public const int VK_T = 0x54; + public const int VK_U = 0x55; + public const int VK_V = 0x56; + public const int VK_W = 0x57; + public const int VK_X = 0x58; + public const int VK_Y = 0x59; + public const int VK_Z = 0x5A; + //public const int VK_STARTKEY = 0x5B + //public const int VK_CONTEXTKEY = 0x5D + //public const int VK_NUMPAD0 = 0x60 + //public const int VK_NUMPAD1 = 0x61 + //public const int VK_NUMPAD2 = 0x62 + //public const int VK_NUMPAD3 = 0x63 + //public const int VK_NUMPAD4 = 0x64 + //public const int VK_NUMPAD5 = 0x65 + //public const int VK_NUMPAD6 = 0x66 + //public const int VK_NUMPAD7 = 0x67 + //public const int VK_NUMPAD8 = 0x68 + //public const int VK_NUMPAD9 = 0x69 + //public const int VK_MULTIPLY = 0x6A + //public const int VK_ADD = 0x6B + //public const int VK_SEPARATOR = 0x6C + //public const int VK_SUBTRACT = 0x6D + //public const int VK_DECIMAL = 0x6E + //public const int VK_DIVIDE = 0x6F + public const int VK_F1 = 0x70; + public const int VK_F2 = 0x71; + public const int VK_F3 = 0x72; + public const int VK_F4 = 0x73; + public const int VK_F5 = 0x74; + public const int VK_F6 = 0x75; + public const int VK_F7 = 0x76; + public const int VK_F8 = 0x77; + public const int VK_F9 = 0x78; + public const int VK_F10 = 0x79; + public const int VK_F11 = 0x7A; + public const int VK_F12 = 0x7B; + //public const int VK_F13 = 0x7C; + //public const int VK_F14 = 0x7D; + //public const int VK_F15 = 0x7E; + //public const int VK_F16 = 0x7F; + //public const int VK_F17 = 0x80; + //public const int VK_F18 = 0x81; + //public const int VK_F19 = 0x82 + //public const int VK_F20 = 0x83 + //public const int VK_F21 = 0x84 + //public const int VK_F22 = 0x85 + //public const int VK_F23 = 0x86 + //public const int VK_F24 = 0x87 + //public const int VK_NUMLOCK = 0x90 + //public const int VK_OEM_SCROLL = 0x91 + //public const int VK_OEM_1 = 0xBA + //public const int VK_OEM_PLUS = 0xBB + //public const int VK_OEM_COMMA = 0xBC + //public const int VK_OEM_MINUS = 0xBD + //public const int VK_OEM_PERIOD = 0xBE + //public const int VK_OEM_2 = 0xBF + //public const int VK_OEM_3 = 0xC0 + //public const int VK_OEM_4 = 0xDB + //public const int VK_OEM_5 = 0xDC + //public const int VK_OEM_6 = 0xDD + //public const int VK_OEM_7 = 0xDE + //public const int VK_OEM_8 = 0xDF + //public const int VK_ICO_F17 = 0xE0 + //public const int VK_ICO_F18 = 0xE1 + //public const int VK_OEM102 = 0xE2 + //public const int VK_ICO_HELP = 0xE3 + //public const int VK_ICO_00 = 0xE4 + //public const int VK_ICO_CLEAR = 0xE6 + //public const int VK_OEM_RESET = 0xE9 + //public const int VK_OEM_JUMP = 0xEA + //public const int VK_OEM_PA1 = 0xEB + //public const int VK_OEM_PA2 = 0xEC + //public const int VK_OEM_PA3 = 0xED + //public const int VK_OEM_WSCTRL = 0xEE + //public const int VK_OEM_CUSEL = 0xEF + //public const int VK_OEM_ATTN = 0xF0 + //public const int VK_OEM_FINNISH = 0xF1 + //public const int VK_OEM_COPY = 0xF2 + //public const int VK_OEM_AUTO = 0xF3 + //public const int VK_OEM_ENLW = 0xF4 + //public const int VK_OEM_BACKTAB = 0xF5 + //public const int VK_ATTN = 0xF6 + //public const int VK_CRSEL = 0xF7 + //public const int VK_EXSEL = 0xF8 + //public const int VK_EREOF = 0xF9 + //public const int VK_PLAY = 0xFA + //public const int VK_ZOOM = 0xFB + //public const int VK_NONAME = 0xFC + //public const int VK_PA1 = 0xFD + //public const int VK_OEM_CLEAR = 0xFE + #endregion + + public const int MK_LBUTTON = 0x01; + public const int MK_RBUTTON = 0x02; + public const int MK_SHIFT = 0x04; + public const int MK_CONTROL = 0x08; + public const int MK_MBUTTON = 0x10; + public const int WM_COMMAND = 0x0111; + public const uint PM_REMOVE = 0x0001; + } +} diff --git a/Quanter.Trader.Connector/packages.config b/Quanter.Trader.Connector/packages.config new file mode 100644 index 0000000..b6ff2dd --- /dev/null +++ b/Quanter.Trader.Connector/packages.config @@ -0,0 +1,7 @@ + + + + + + + \ No newline at end of file diff --git a/Quanter.Trader.Gui/App.config b/Quanter.Trader.Gui/App.config new file mode 100644 index 0000000..1e0c0dc --- /dev/null +++ b/Quanter.Trader.Gui/App.config @@ -0,0 +1,116 @@ + + + +
+
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Quanter.Trader.Gui/CHANGES.txt b/Quanter.Trader.Gui/CHANGES.txt new file mode 100644 index 0000000..d80368c --- /dev/null +++ b/Quanter.Trader.Gui/CHANGES.txt @@ -0,0 +1,99 @@ +=============================================================================== +Welcome to the C# port of Google Protocol Buffers, written by Jon Skeet +(skeet@pobox.com) based on the work of many talented people. + +For more information about this port, visit its homepage: +http://protobuf-csharp-port.googlecode.com + +For more information about Protocol Buffers in general, visit the project page +for the C++, Java and Python project: +http://protobuf.googlecode.com +=============================================================================== +RELEASE NOTES - Version 2.4.1.473 +=============================================================================== + +Features: +- Added option service_generator_type to control service generation with + NONE, GENERIC, INTERFACE, or IRPCDISPATCH +- Added interfaces IRpcDispatch and IRpcServerStub to provide for blocking + services and implementations. +- Added ProtoGen.exe command-line argument "--protoc_dir=" to specify the + location of protoc.exe. +- Extracted interfaces for ICodedInputStream and ICodedOutputStream to allow + custom implementation of writers with both speed and size optimizations. +- Addition of the "Google.ProtoBuffers.Serialization" assembly to support + reading and writing messages to/from XML, JSON, IDictionary<,> and others. +- Several performance related fixes and tweeks +- Issue 3: Add option to mark generated code with attribute +- Issue 20: Support for decorating classes [Serializable] +- Issue 21: Decorate fields with [deprecated=true] as [System.Obsolete] +- Issue 22: Reusable Builder classes +- Issue 24: Support for using Json/Xml formats with ICodedInputStream +- Issue 25: Added support for NuGet packages +- Issue 31: Upgraded protoc.exe and descriptor to 2.4.1 + +Fixes: +- Issue 13: Message with Field same name as message causes uncompilable .cs +- Issue 16: Does not integrate well with other tooling +- Issue 19: Support for negative enum values +- Issue 26: AddRange in GeneratedBuilder iterates twice. +- Issue 27: Remove XML documentation output from test projects to clear + warnings/errors. +- Issue 28: Circular message dependencies result in null default values for + Message fields. +- Issue 29: Message classes generated have a public default constructor. You + can disable private ctor generation with the option generate_private_ctor. +- Issue 35: Fixed a bug in ProtoGen handling of arguments with trailing \ +- Big-endian support for float, and double on Silverlight +- Packed and Unpacked parsing allow for all repeated, as per version 2.3 +- Fix for leaving Builder a public ctor on internal classes for use with + generic "where T: new()" constraints. + +Other: +- Changed the code signing key to a privately held key +- Reformatted all code and line-endings to C# defaults +- Reworking of performance benchmarks to produce reliable results, option /v2 +- Issue 34: Silverlight assemblies are now unit tested + +=============================================================================== +RELEASE NOTES - Version 2.3.0.277 +=============================================================================== + +Features: +- Added cls_compliance option to generate attributes indicating + non-CLS-compliance. +- Added file_extension option to control the generated output file's extension. +- Added umbrella_namespace option to place the umbrella class into a nested + namespace to address issues with proto files having the same name as a + message it contains. +- Added output_directory option to set the output path for the source file(s). +- Added ignore_google_protobuf option to avoid generating code for includes + from the google.protobuf package. +- Added the LITE framework (Google.ProtoBuffersLite.dll) and the ability to + generate code with "option optimize_for = LITE_RUNTIME;". +- Added ability to invoke protoc.exe from within ProtoGen.exe. +- Upgraded to protoc.exe (2.3) compiler. + +Fixes: +- Issue 9: Class cannot be static and sealed error +- Issue 12: default value for enumerate fields must be filled out + +Other: +- Rewrite of build using MSBbuild instead of NAnt +- Moved to NUnit Version 2.2.8.0 +- Changed to using secure .snk for releases + +=============================================================================== +RELEASE NOTES - Version 0.9.1 +=============================================================================== + +Fixes: +- issue 10: Incorrect encoding of packed fields when serialized + +=============================================================================== +RELEASE NOTES - Version 0.9.0 +=============================================================================== + +- Initial release + +=============================================================================== \ No newline at end of file diff --git a/Quanter.Trader.Gui/MainForm.Designer.cs b/Quanter.Trader.Gui/MainForm.Designer.cs new file mode 100644 index 0000000..88a12b9 --- /dev/null +++ b/Quanter.Trader.Gui/MainForm.Designer.cs @@ -0,0 +1,125 @@ +namespace Quanter.Trader.Gui +{ + partial class MainForm + { + /// + /// 必需的设计器变量。 + /// + private System.ComponentModel.IContainer components = null; + + /// + /// 清理所有正在使用的资源。 + /// + /// 如果应释放托管资源,为 true;否则为 false。 + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows 窗体设计器生成的代码 + + /// + /// 设计器支持所需的方法 - 不要修改 + /// 使用代码编辑器修改此方法的内容。 + /// + private void InitializeComponent() + { + this.btnStartMarket = new System.Windows.Forms.Button(); + this.btnInit = new System.Windows.Forms.Button(); + this.btnStartStrategy = new System.Windows.Forms.Button(); + this.btnRegStrategy = new System.Windows.Forms.Button(); + this.btnInitPersistence = new System.Windows.Forms.Button(); + this.btnStopMarket = new System.Windows.Forms.Button(); + this.SuspendLayout(); + // + // btnStartMarket + // + this.btnStartMarket.Location = new System.Drawing.Point(131, 36); + this.btnStartMarket.Name = "btnStartMarket"; + this.btnStartMarket.Size = new System.Drawing.Size(75, 23); + this.btnStartMarket.TabIndex = 0; + this.btnStartMarket.Text = "启动市场"; + this.btnStartMarket.UseVisualStyleBackColor = true; + this.btnStartMarket.Click += new System.EventHandler(this.btnStartMarket_Click); + // + // btnInit + // + this.btnInit.Location = new System.Drawing.Point(12, 36); + this.btnInit.Name = "btnInit"; + this.btnInit.Size = new System.Drawing.Size(75, 23); + this.btnInit.TabIndex = 0; + this.btnInit.Text = "初始化市场"; + this.btnInit.UseVisualStyleBackColor = true; + this.btnInit.Click += new System.EventHandler(this.btnInit_Click); + // + // btnStartStrategy + // + this.btnStartStrategy.Location = new System.Drawing.Point(131, 80); + this.btnStartStrategy.Name = "btnStartStrategy"; + this.btnStartStrategy.Size = new System.Drawing.Size(75, 23); + this.btnStartStrategy.TabIndex = 0; + this.btnStartStrategy.Text = "启动策略"; + this.btnStartStrategy.UseVisualStyleBackColor = true; + this.btnStartStrategy.Click += new System.EventHandler(this.btnStartStrategy_Click); + // + // btnRegStrategy + // + this.btnRegStrategy.Location = new System.Drawing.Point(12, 80); + this.btnRegStrategy.Name = "btnRegStrategy"; + this.btnRegStrategy.Size = new System.Drawing.Size(75, 23); + this.btnRegStrategy.TabIndex = 0; + this.btnRegStrategy.Text = "注册策略"; + this.btnRegStrategy.UseVisualStyleBackColor = true; + this.btnRegStrategy.Click += new System.EventHandler(this.btnRegStrategy_Click); + // + // btnInitPersistence + // + this.btnInitPersistence.Location = new System.Drawing.Point(12, 124); + this.btnInitPersistence.Name = "btnInitPersistence"; + this.btnInitPersistence.Size = new System.Drawing.Size(75, 23); + this.btnInitPersistence.TabIndex = 0; + this.btnInitPersistence.Text = "初始化持久化"; + this.btnInitPersistence.UseVisualStyleBackColor = true; + // + // btnStopMarket + // + this.btnStopMarket.Location = new System.Drawing.Point(255, 36); + this.btnStopMarket.Name = "btnStopMarket"; + this.btnStopMarket.Size = new System.Drawing.Size(75, 23); + this.btnStopMarket.TabIndex = 0; + this.btnStopMarket.Text = "停止市场"; + this.btnStopMarket.UseVisualStyleBackColor = true; + this.btnStopMarket.Click += new System.EventHandler(this.btnStopMarket_Click); + // + // MainForm + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 12F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.ClientSize = new System.Drawing.Size(608, 337); + this.Controls.Add(this.btnInitPersistence); + this.Controls.Add(this.btnRegStrategy); + this.Controls.Add(this.btnInit); + this.Controls.Add(this.btnStartStrategy); + this.Controls.Add(this.btnStopMarket); + this.Controls.Add(this.btnStartMarket); + this.Name = "MainForm"; + this.Text = "Form1"; + this.ResumeLayout(false); + + } + + #endregion + + private System.Windows.Forms.Button btnStartMarket; + private System.Windows.Forms.Button btnInit; + private System.Windows.Forms.Button btnStartStrategy; + private System.Windows.Forms.Button btnRegStrategy; + private System.Windows.Forms.Button btnInitPersistence; + private System.Windows.Forms.Button btnStopMarket; + } +} + diff --git a/Quanter.Trader.Gui/MainForm.cs b/Quanter.Trader.Gui/MainForm.cs new file mode 100644 index 0000000..80d4b81 --- /dev/null +++ b/Quanter.Trader.Gui/MainForm.cs @@ -0,0 +1,138 @@ +using Akka.Actor; +using Quanter.BusinessEntity; +using Quanter.Market; +using Quanter.Persistence; +using Quanter.Strategy; +using Quanter.Trader.Messages; +using System; +using System.ComponentModel; +using System.Windows.Forms; + +namespace Quanter.Trader.Gui +{ + public partial class MainForm : Form + { + + private event EventHandler strategiesDataAvailable; // 所有的策略列表,我的策略列表, + + private ActorSystem actorSystem; + private IActorRef persistenceActor; + private IActorRef strategyActor; + private IActorRef marketActor; + private IActorRef userActor; + + public MainForm() + { + InitializeComponent(); + + //actorSystem = ActorSystem.Create("strategies"); + //var clientActor = actorSystem.ActorOf(Props.Create()); + + // 登录 + //ClientRequest loginReq = new ClientRequest() + //{ + // Action = RequestType.LOGIN, + // Body = new User() { Username = "joe", Password = "123456" } + //}; + //Stopwatch watch = new Stopwatch(); + //watch.Start(); + //var resp0 = clientActor.Ask(loginReq, TimeSpan.FromSeconds(15)); + //resp0.Wait(); + //Console.WriteLine("返回:{0}, 耗时:{1}", resp0.Result.Body, watch.ElapsedMilliseconds); + + //// 获取所有的策略列表 + //var resp = clientActor.Ask(new ClientRequest() { Action = RequestType.GET_ALL_STRATEGIES }, TimeSpan.FromSeconds(5)); + //resp.Wait(); + //StrategiesResponse rep = (StrategiesResponse)(resp.Result.Body); + //rep.Strategies.AsParallel().ForAll(sd => Console.WriteLine("策略 {0}", sd.Name)); + + // 启动行情 + //clientActor.Tell(new ClientRequest() { Action = RequestType.START_MARKET }); + + //// 获取我的策略 + //clientActor.Tell(new ClientRequest() { Action = RequestType.GET_MY_STRATEGIES }); + + //// 启动我的策略 + //clientActor.Tell(new ClientRequest() { Action = RequestType.START_MY_STRATEGIES }); + //Thread.Sleep(1000); + //clientActor.Tell(new ClientRequest() { Action = RequestType.STOP_MY_STRATEGIES }); + + //// 停止行情 + //clientActor.Tell(new ClientRequest() { Action = RequestType.STOP_MARKET }); + btnInit_Click(null, null); + } + + private void _init() + { + actorSystem = ActorSystem.Create("strategiesServer"); + + strategyActor = actorSystem.ActorOf(Props.Create(), ConstantsHelper.AKKA_PATH_STRATEGY_MANAGER); + persistenceActor = actorSystem.ActorOf(Props.Create(), ConstantsHelper.AKKA_PATH_PERSISTENCE); + marketActor = actorSystem.ActorOf(Props.Create(), ConstantsHelper.AKKA_PATH_MARKET_MANAGER); + + } + + protected override void OnClosing(CancelEventArgs e) + { + actorSystem.Shutdown(); + base.OnClosing(e); + } + + private void btnInit_Click(object sender, EventArgs e) + { + _init(); + } + + private void btnStartMarket_Click(object sender, EventArgs e) + { + marketActor.Tell(new MarketRequest() { Type = MarketRequest.RequestType.START }); + } + + private void btnStopMarket_Click(object sender, EventArgs e) + { + marketActor.Tell(new MarketRequest() { Type = MarketRequest.RequestType.STOP }); + } + + private void btnStartStrategy_Click(object sender, EventArgs e) + { + + } + + private void btnRegStrategy_Click(object sender, EventArgs e) + { + // Load一个新的策略实例 + EStrategy strategy1 = new EStrategy() + { + Id = 1, + Type = "Quanter.Strategy.Demo.DemoStrategyActor, Quanter.Strategy.Demo", + Name= "Demo示例", + Desc = "Demo实例" + }; + + EStrategy strategy2 = new EStrategy() + { + Id = 2, + Type = "Quanter.Strategy.XueQiuStrategy.TraceXueQiuStrategyActor, Quanter.Strategy.XueQiuStrategy", + Name = "雪球策略", + Desc = "雪球实例" + }; + + EStrategy strategy3 = new EStrategy() + { + Id = 3, + Type = "Quanter.Strategy.RationBStrategyActor, Quanter.Strategy.RationB", + Name = "分级策略", + Desc = "雪球实例" + }; + + StrategyRequest req = new StrategyRequest() { Type = StrategyRequestType.CREATE, Body = strategy1 }; + strategyActor.Tell(req); + //req = new StrategyRequest() { Type = StrategyRequestType.CREATE, Body = strategy2 }; + //strategyActor.Tell(req); + //req = new StrategyRequest() { Type = StrategyRequestType.CREATE, Body = strategy3 }; + //strategyActor.Tell(req); + + } + } + +} diff --git a/Quanter.Trader.Gui/MainForm.resx b/Quanter.Trader.Gui/MainForm.resx new file mode 100644 index 0000000..1af7de1 --- /dev/null +++ b/Quanter.Trader.Gui/MainForm.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/Quanter.Trader.Gui/Program.cs b/Quanter.Trader.Gui/Program.cs new file mode 100644 index 0000000..bf73ed3 --- /dev/null +++ b/Quanter.Trader.Gui/Program.cs @@ -0,0 +1,22 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Threading.Tasks; +using System.Windows.Forms; + +namespace Quanter.Trader.Gui +{ + static class Program + { + /// + /// 应用程序的主入口点。 + /// + [STAThread] + static void Main() + { + Application.EnableVisualStyles(); + Application.SetCompatibleTextRenderingDefault(false); + Application.Run(new MainForm()); + } + } +} diff --git a/Quanter.Trader.Gui/Properties/AssemblyInfo.cs b/Quanter.Trader.Gui/Properties/AssemblyInfo.cs new file mode 100644 index 0000000..c3a2457 --- /dev/null +++ b/Quanter.Trader.Gui/Properties/AssemblyInfo.cs @@ -0,0 +1,36 @@ +using System.Reflection; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; + +// 有关程序集的一般信息由以下 +// 控制。更改这些特性值可修改 +// 与程序集关联的信息。 +[assembly: AssemblyTitle("Stock.Trader.Gui")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("")] +[assembly: AssemblyProduct("Stock.Trader.Gui")] +[assembly: AssemblyCopyright("Copyright © 2015")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +//将 ComVisible 设置为 false 将使此程序集中的类型 +//对 COM 组件不可见。 如果需要从 COM 访问此程序集中的类型, +//请将此类型的 ComVisible 特性设置为 true。 +[assembly: ComVisible(false)] + +// 如果此项目向 COM 公开,则下列 GUID 用于类型库的 ID +[assembly: Guid("c37de5a0-3069-4eca-8560-7ff207a93cad")] + +// 程序集的版本信息由下列四个值组成: +// +// 主版本 +// 次版本 +// 生成号 +// 修订号 +// +//可以指定所有这些值,也可以使用“生成号”和“修订号”的默认值, +// 方法是按如下所示使用“*”: : +// [assembly: AssemblyVersion("1.0.*")] +[assembly: AssemblyVersion("1.0.0.0")] +[assembly: AssemblyFileVersion("1.0.0.0")] diff --git a/Quanter.Trader.Gui/Properties/Resources.Designer.cs b/Quanter.Trader.Gui/Properties/Resources.Designer.cs new file mode 100644 index 0000000..7a5aa40 --- /dev/null +++ b/Quanter.Trader.Gui/Properties/Resources.Designer.cs @@ -0,0 +1,63 @@ +//------------------------------------------------------------------------------ +// +// 此代码由工具生成。 +// 运行时版本:4.0.30319.42000 +// +// 对此文件的更改可能会导致不正确的行为,并且如果 +// 重新生成代码,这些更改将会丢失。 +// +//------------------------------------------------------------------------------ + +namespace Quanter.Trader.Gui.Properties { + using System; + + + /// + /// 一个强类型的资源类,用于查找本地化的字符串等。 + /// + // 此类是由 StronglyTypedResourceBuilder + // 类通过类似于 ResGen 或 Visual Studio 的工具自动生成的。 + // 若要添加或移除成员,请编辑 .ResX 文件,然后重新运行 ResGen + // (以 /str 作为命令选项),或重新生成 VS 项目。 + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "4.0.0.0")] + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] + internal class Resources { + + private static global::System.Resources.ResourceManager resourceMan; + + private static global::System.Globalization.CultureInfo resourceCulture; + + [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] + internal Resources() { + } + + /// + /// 返回此类使用的缓存的 ResourceManager 实例。 + /// + [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] + internal static global::System.Resources.ResourceManager ResourceManager { + get { + if (object.ReferenceEquals(resourceMan, null)) { + global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("Quanter.Trader.Gui.Properties.Resources", typeof(Resources).Assembly); + resourceMan = temp; + } + return resourceMan; + } + } + + /// + /// 使用此强类型资源类,为所有资源查找 + /// 重写当前线程的 CurrentUICulture 属性。 + /// + [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] + internal static global::System.Globalization.CultureInfo Culture { + get { + return resourceCulture; + } + set { + resourceCulture = value; + } + } + } +} diff --git a/Quanter.Trader.Gui/Properties/Resources.resx b/Quanter.Trader.Gui/Properties/Resources.resx new file mode 100644 index 0000000..af7dbeb --- /dev/null +++ b/Quanter.Trader.Gui/Properties/Resources.resx @@ -0,0 +1,117 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/Quanter.Trader.Gui/Properties/Settings.Designer.cs b/Quanter.Trader.Gui/Properties/Settings.Designer.cs new file mode 100644 index 0000000..9db138f --- /dev/null +++ b/Quanter.Trader.Gui/Properties/Settings.Designer.cs @@ -0,0 +1,26 @@ +//------------------------------------------------------------------------------ +// +// 此代码由工具生成。 +// 运行时版本:4.0.30319.42000 +// +// 对此文件的更改可能会导致不正确的行为,并且如果 +// 重新生成代码,这些更改将会丢失。 +// +//------------------------------------------------------------------------------ + +namespace Quanter.Trader.Gui.Properties { + + + [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "14.0.0.0")] + internal sealed partial class Settings : global::System.Configuration.ApplicationSettingsBase { + + private static Settings defaultInstance = ((Settings)(global::System.Configuration.ApplicationSettingsBase.Synchronized(new Settings()))); + + public static Settings Default { + get { + return defaultInstance; + } + } + } +} diff --git a/Quanter.Trader.Gui/Properties/Settings.settings b/Quanter.Trader.Gui/Properties/Settings.settings new file mode 100644 index 0000000..3964565 --- /dev/null +++ b/Quanter.Trader.Gui/Properties/Settings.settings @@ -0,0 +1,7 @@ + + + + + + + diff --git a/Quanter.Trader.Gui/Quanter.Trader.Gui.csproj b/Quanter.Trader.Gui/Quanter.Trader.Gui.csproj new file mode 100644 index 0000000..05d19b4 --- /dev/null +++ b/Quanter.Trader.Gui/Quanter.Trader.Gui.csproj @@ -0,0 +1,193 @@ + + + + + Debug + AnyCPU + {C37DE5A0-3069-4ECA-8560-7FF207A93CAD} + WinExe + Properties + Quanter.Trader.Gui + Quanter.Trader.Gui + v4.5.2 + 512 + true + + + + + AnyCPU + true + full + false + bin\Debug\ + DEBUG;TRACE + prompt + 4 + + + AnyCPU + pdbonly + true + bin\Release\ + TRACE + prompt + 4 + + + + ..\packages\Akka.1.0.5\lib\net45\Akka.dll + True + + + ..\packages\Akka.Logger.NLog.1.0.5\lib\net45\Akka.Logger.NLog.dll + True + + + ..\packages\Akka.Logger.slf4net.1.0.5\lib\net45\Akka.Logger.slf4net.dll + True + + + ..\packages\Akka.Remote.1.0.5\lib\net45\Akka.Remote.dll + True + + + ..\packages\Google.ProtocolBuffers.2.4.1.521\lib\net40\Google.ProtocolBuffers.dll + True + + + ..\packages\Google.ProtocolBuffers.2.4.1.521\lib\net40\Google.ProtocolBuffers.Serialization.dll + True + + + ..\packages\Helios.1.4.1\lib\net45\Helios.dll + True + + + ..\packages\Newtonsoft.Json.7.0.1\lib\net45\Newtonsoft.Json.dll + True + + + ..\packages\NLog.3.0.0.0\lib\net45\NLog.dll + True + + + ..\packages\slf4net.0.1.32.1\lib\net35\slf4net.dll + True + + + + + + + + + + + + + + ..\packages\Unofficial.CefGlue.Core.3.2272.2035\lib\Xilium.CefGlue.dll + True + + + ..\packages\Unofficial.CefGlue.WindowsForm.3.2272.2035\lib\Xilium.CefGlue.WindowsForms.dll + True + + + + + Form + + + MainForm.cs + + + + + MainForm.cs + + + ResXFileCodeGenerator + Resources.Designer.cs + Designer + + + True + Resources.resx + True + + + + SettingsSingleFileGenerator + Settings.Designer.cs + + + True + Settings.settings + True + + + + + + + + Designer + + + + + {9a3793db-03de-4c99-9525-c7c7bee9cb93} + DemoStrategy + + + {34db14a6-e4ed-4c4a-8ca6-939201a572be} + Quanter.BusinessEntity + + + {a3fa3c71-a7b0-4bb6-bd32-0aee20493593} + Quanter.Common + + + {ee7d7c04-1126-4c3f-8e24-a7a6008ed8a1} + Quanter.Market.Sina + + + {351aaa08-f483-403c-b4a4-a5725381c5e4} + Quanter.Persistence.Server + + + {6d5c9c0a-3c0f-47f3-9bff-2621cb1c5f10} + Quanter.MarketServer + + + {dde08214-ec3a-4dd7-8cee-49973e17ae8f} + Quanter.Trader.Messages + + + {f0e12b5e-7012-4345-b4a4-be4cedce5e91} + Quanter.StrategyServer + + + + + + + + + + + + 此项目引用这台计算机上缺少的 NuGet 程序包。使用 NuGet 程序包还原可下载这些程序包。有关详细信息,请参阅 http://go.microsoft.com/fwlink/?LinkID=322105。缺少的文件是 {0}。 + + + + + \ No newline at end of file diff --git a/Quanter.Trader.Gui/licenses/license.txt b/Quanter.Trader.Gui/licenses/license.txt new file mode 100644 index 0000000..b8e773b --- /dev/null +++ b/Quanter.Trader.Gui/licenses/license.txt @@ -0,0 +1,31 @@ +Protocol Buffers - Google's data interchange format +Copyright 2008-2010 Google Inc. All rights reserved. +http://github.com/jskeet/dotnet-protobufs/ +Original C++/Java/Python code: +http://code.google.com/p/protobuf/ + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + + * Redistributions of source code must retain the above copyright +notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above +copyright notice, this list of conditions and the following disclaimer +in the documentation and/or other materials provided with the +distribution. + * Neither the name of Google Inc. nor the names of its +contributors may be used to endorse or promote products derived from +this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/Quanter.Trader.Gui/licenses/protoc-license.txt b/Quanter.Trader.Gui/licenses/protoc-license.txt new file mode 100644 index 0000000..c779cb0 --- /dev/null +++ b/Quanter.Trader.Gui/licenses/protoc-license.txt @@ -0,0 +1,36 @@ +protoc.exe was built from the original source at http://code.google.com/p/protobuf/ +The licence for this code is as follows: + +Copyright 2008, Google Inc. +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + + * Redistributions of source code must retain the above copyright +notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above +copyright notice, this list of conditions and the following disclaimer +in the documentation and/or other materials provided with the +distribution. + * Neither the name of Google Inc. nor the names of its +contributors may be used to endorse or promote products derived from +this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +Code generated by the Protocol Buffer compiler is owned by the owner +of the input file used when generating it. This code is not +standalone and requires a support library to be linked with it. This +support library is itself covered by the above license. \ No newline at end of file diff --git a/Quanter.Trader.Gui/packages.config b/Quanter.Trader.Gui/packages.config new file mode 100644 index 0000000..1250d4c --- /dev/null +++ b/Quanter.Trader.Gui/packages.config @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Quanter.Trader.Gui/protos/google/protobuf/csharp_options.proto b/Quanter.Trader.Gui/protos/google/protobuf/csharp_options.proto new file mode 100644 index 0000000..152df76 --- /dev/null +++ b/Quanter.Trader.Gui/protos/google/protobuf/csharp_options.proto @@ -0,0 +1,115 @@ +// Extra options for C# generator + +import "google/protobuf/descriptor.proto"; + +package google.protobuf; + +message CSharpFileOptions { + + // Namespace for generated classes; defaults to the package. + optional string namespace = 1; + + // Name of the "umbrella" class used for metadata about all + // the messages within this file. Default is based on the name + // of the file. + optional string umbrella_classname = 2; + + // Whether classes should be public (true) or internal (false) + optional bool public_classes = 3 [default = true]; + + // Whether to generate a single file for everything within the + // .proto file (false), or one file per message (true). + // This option is not currently honored; please log a feature + // request if you really want it. + optional bool multiple_files = 4; + + // Whether to nest messages within a single umbrella class (true) + // or create the umbrella class as a peer, with messages as + // top-level classes in the namespace (false) + optional bool nest_classes = 5; + + // Generate appropriate support for Code Contracts + // (Ongoing; support should improve over time) + optional bool code_contracts = 6; + + // Create subdirectories for namespaces, e.g. namespace "Foo.Bar" + // would generate files within [output directory]/Foo/Bar + optional bool expand_namespace_directories = 7; + + // Generate attributes indicating non-CLS-compliance + optional bool cls_compliance = 8 [default = true]; + + // Generate messages/builders with the [Serializable] attribute + optional bool add_serializable = 9 [default = false]; + + // Generates a private ctor for Message types + optional bool generate_private_ctor = 10 [default = true]; + + // The extension that should be appended to the umbrella_classname when creating files. + optional string file_extension = 221 [default = ".cs"]; + + // A nested namespace for the umbrella class. Helpful for name collisions caused by + // umbrella_classname conflicting with an existing type. This will be automatically + // set to 'Proto' if a collision is detected with types being generated. This value + // is ignored when nest_classes == true + optional string umbrella_namespace = 222; + + // The output path for the source file(s) generated + optional string output_directory = 223 [default = "."]; + + // Will ignore the type generations and remove dependencies for the descriptor proto + // files that declare their package to be "google.protobuf" + optional bool ignore_google_protobuf = 224 [default = false]; + + // Controls how services are generated, GENERIC is the deprecated original implementation + // INTERFACE generates service interfaces only, RPCINTEROP generates interfaces and + // implementations using the included Windows RPC interop libarary. + optional CSharpServiceType service_generator_type = 225 [default = NONE]; + + // Used to add the System.Runtime.CompilerServices.CompilerGeneratedAttribute and + // System.CodeDom.Compiler.GeneratedCodeAttribute attributes to generated code. + optional bool generated_code_attributes = 226 [default = false]; +} + +enum CSharpServiceType { + // Services are ignored by the generator + NONE = 0; + // Generates the original Java generic service implementations + GENERIC = 1; + // Generates an interface for the service and nothing else + INTERFACE = 2; + // Generates an interface for the service and client/server wrappers for the interface + IRPCDISPATCH = 3; +} + +extend FileOptions { + optional CSharpFileOptions csharp_file_options = 1000; +} + +extend FieldOptions { + optional CSharpFieldOptions csharp_field_options = 1000; +} + +message CSharpFieldOptions { + // Provides the ability to override the name of the property + // generated for this field. This is applied to all properties + // and methods to do with this field, including HasFoo, FooCount, + // FooList etc. + optional string property_name = 1; +} + +message CSharpServiceOptions { + optional string interface_id = 1; +} + +extend ServiceOptions { + optional CSharpServiceOptions csharp_service_options = 1000; +} + +message CSharpMethodOptions { + optional int32 dispatch_id = 1; +} + +extend MethodOptions { + optional CSharpMethodOptions csharp_method_options = 1000; +} \ No newline at end of file diff --git a/Quanter.Trader.Gui/protos/google/protobuf/descriptor.proto b/Quanter.Trader.Gui/protos/google/protobuf/descriptor.proto new file mode 100644 index 0000000..233f879 --- /dev/null +++ b/Quanter.Trader.Gui/protos/google/protobuf/descriptor.proto @@ -0,0 +1,533 @@ +// Protocol Buffers - Google's data interchange format +// Copyright 2008 Google Inc. All rights reserved. +// http://code.google.com/p/protobuf/ +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// Author: kenton@google.com (Kenton Varda) +// Based on original Protocol Buffers design by +// Sanjay Ghemawat, Jeff Dean, and others. +// +// The messages in this file describe the definitions found in .proto files. +// A valid .proto file can be translated directly to a FileDescriptorProto +// without any other information (e.g. without reading its imports). + + + +package google.protobuf; +option java_package = "com.google.protobuf"; +option java_outer_classname = "DescriptorProtos"; + +// descriptor.proto must be optimized for speed because reflection-based +// algorithms don't work during bootstrapping. +option optimize_for = SPEED; + +// The protocol compiler can output a FileDescriptorSet containing the .proto +// files it parses. +message FileDescriptorSet { + repeated FileDescriptorProto file = 1; +} + +// Describes a complete .proto file. +message FileDescriptorProto { + optional string name = 1; // file name, relative to root of source tree + optional string package = 2; // e.g. "foo", "foo.bar", etc. + + // Names of files imported by this file. + repeated string dependency = 3; + + // All top-level definitions in this file. + repeated DescriptorProto message_type = 4; + repeated EnumDescriptorProto enum_type = 5; + repeated ServiceDescriptorProto service = 6; + repeated FieldDescriptorProto extension = 7; + + optional FileOptions options = 8; + + // This field contains optional information about the original source code. + // You may safely remove this entire field whithout harming runtime + // functionality of the descriptors -- the information is needed only by + // development tools. + optional SourceCodeInfo source_code_info = 9; +} + +// Describes a message type. +message DescriptorProto { + optional string name = 1; + + repeated FieldDescriptorProto field = 2; + repeated FieldDescriptorProto extension = 6; + + repeated DescriptorProto nested_type = 3; + repeated EnumDescriptorProto enum_type = 4; + + message ExtensionRange { + optional int32 start = 1; + optional int32 end = 2; + } + repeated ExtensionRange extension_range = 5; + + optional MessageOptions options = 7; +} + +// Describes a field within a message. +message FieldDescriptorProto { + enum Type { + // 0 is reserved for errors. + // Order is weird for historical reasons. + TYPE_DOUBLE = 1; + TYPE_FLOAT = 2; + TYPE_INT64 = 3; // Not ZigZag encoded. Negative numbers + // take 10 bytes. Use TYPE_SINT64 if negative + // values are likely. + TYPE_UINT64 = 4; + TYPE_INT32 = 5; // Not ZigZag encoded. Negative numbers + // take 10 bytes. Use TYPE_SINT32 if negative + // values are likely. + TYPE_FIXED64 = 6; + TYPE_FIXED32 = 7; + TYPE_BOOL = 8; + TYPE_STRING = 9; + TYPE_GROUP = 10; // Tag-delimited aggregate. + TYPE_MESSAGE = 11; // Length-delimited aggregate. + + // New in version 2. + TYPE_BYTES = 12; + TYPE_UINT32 = 13; + TYPE_ENUM = 14; + TYPE_SFIXED32 = 15; + TYPE_SFIXED64 = 16; + TYPE_SINT32 = 17; // Uses ZigZag encoding. + TYPE_SINT64 = 18; // Uses ZigZag encoding. + }; + + enum Label { + // 0 is reserved for errors + LABEL_OPTIONAL = 1; + LABEL_REQUIRED = 2; + LABEL_REPEATED = 3; + // TODO(sanjay): Should we add LABEL_MAP? + }; + + optional string name = 1; + optional int32 number = 3; + optional Label label = 4; + + // If type_name is set, this need not be set. If both this and type_name + // are set, this must be either TYPE_ENUM or TYPE_MESSAGE. + optional Type type = 5; + + // For message and enum types, this is the name of the type. If the name + // starts with a '.', it is fully-qualified. Otherwise, C++-like scoping + // rules are used to find the type (i.e. first the nested types within this + // message are searched, then within the parent, on up to the root + // namespace). + optional string type_name = 6; + + // For extensions, this is the name of the type being extended. It is + // resolved in the same manner as type_name. + optional string extendee = 2; + + // For numeric types, contains the original text representation of the value. + // For booleans, "true" or "false". + // For strings, contains the default text contents (not escaped in any way). + // For bytes, contains the C escaped value. All bytes >= 128 are escaped. + // TODO(kenton): Base-64 encode? + optional string default_value = 7; + + optional FieldOptions options = 8; +} + +// Describes an enum type. +message EnumDescriptorProto { + optional string name = 1; + + repeated EnumValueDescriptorProto value = 2; + + optional EnumOptions options = 3; +} + +// Describes a value within an enum. +message EnumValueDescriptorProto { + optional string name = 1; + optional int32 number = 2; + + optional EnumValueOptions options = 3; +} + +// Describes a service. +message ServiceDescriptorProto { + optional string name = 1; + repeated MethodDescriptorProto method = 2; + + optional ServiceOptions options = 3; +} + +// Describes a method of a service. +message MethodDescriptorProto { + optional string name = 1; + + // Input and output type names. These are resolved in the same way as + // FieldDescriptorProto.type_name, but must refer to a message type. + optional string input_type = 2; + optional string output_type = 3; + + optional MethodOptions options = 4; +} + +// =================================================================== +// Options + +// Each of the definitions above may have "options" attached. These are +// just annotations which may cause code to be generated slightly differently +// or may contain hints for code that manipulates protocol messages. +// +// Clients may define custom options as extensions of the *Options messages. +// These extensions may not yet be known at parsing time, so the parser cannot +// store the values in them. Instead it stores them in a field in the *Options +// message called uninterpreted_option. This field must have the same name +// across all *Options messages. We then use this field to populate the +// extensions when we build a descriptor, at which point all protos have been +// parsed and so all extensions are known. +// +// Extension numbers for custom options may be chosen as follows: +// * For options which will only be used within a single application or +// organization, or for experimental options, use field numbers 50000 +// through 99999. It is up to you to ensure that you do not use the +// same number for multiple options. +// * For options which will be published and used publicly by multiple +// independent entities, e-mail kenton@google.com to reserve extension +// numbers. Simply tell me how many you need and I'll send you back a +// set of numbers to use -- there's no need to explain how you intend to +// use them. If this turns out to be popular, a web service will be set up +// to automatically assign option numbers. + + +message FileOptions { + + // Sets the Java package where classes generated from this .proto will be + // placed. By default, the proto package is used, but this is often + // inappropriate because proto packages do not normally start with backwards + // domain names. + optional string java_package = 1; + + + // If set, all the classes from the .proto file are wrapped in a single + // outer class with the given name. This applies to both Proto1 + // (equivalent to the old "--one_java_file" option) and Proto2 (where + // a .proto always translates to a single class, but you may want to + // explicitly choose the class name). + optional string java_outer_classname = 8; + + // If set true, then the Java code generator will generate a separate .java + // file for each top-level message, enum, and service defined in the .proto + // file. Thus, these types will *not* be nested inside the outer class + // named by java_outer_classname. However, the outer class will still be + // generated to contain the file's getDescriptor() method as well as any + // top-level extensions defined in the file. + optional bool java_multiple_files = 10 [default=false]; + + // If set true, then the Java code generator will generate equals() and + // hashCode() methods for all messages defined in the .proto file. This is + // purely a speed optimization, as the AbstractMessage base class includes + // reflection-based implementations of these methods. + optional bool java_generate_equals_and_hash = 20 [default=false]; + + // Generated classes can be optimized for speed or code size. + enum OptimizeMode { + SPEED = 1; // Generate complete code for parsing, serialization, + // etc. + CODE_SIZE = 2; // Use ReflectionOps to implement these methods. + LITE_RUNTIME = 3; // Generate code using MessageLite and the lite runtime. + } + optional OptimizeMode optimize_for = 9 [default=SPEED]; + + + + + // Should generic services be generated in each language? "Generic" services + // are not specific to any particular RPC system. They are generated by the + // main code generators in each language (without additional plugins). + // Generic services were the only kind of service generation supported by + // early versions of proto2. + // + // Generic services are now considered deprecated in favor of using plugins + // that generate code specific to your particular RPC system. Therefore, + // these default to false. Old code which depends on generic services should + // explicitly set them to true. + optional bool cc_generic_services = 16 [default=false]; + optional bool java_generic_services = 17 [default=false]; + optional bool py_generic_services = 18 [default=false]; + + // The parser stores options it doesn't recognize here. See above. + repeated UninterpretedOption uninterpreted_option = 999; + + // Clients can define custom options in extensions of this message. See above. + extensions 1000 to max; +} + +message MessageOptions { + // Set true to use the old proto1 MessageSet wire format for extensions. + // This is provided for backwards-compatibility with the MessageSet wire + // format. You should not use this for any other reason: It's less + // efficient, has fewer features, and is more complicated. + // + // The message must be defined exactly as follows: + // message Foo { + // option message_set_wire_format = true; + // extensions 4 to max; + // } + // Note that the message cannot have any defined fields; MessageSets only + // have extensions. + // + // All extensions of your type must be singular messages; e.g. they cannot + // be int32s, enums, or repeated messages. + // + // Because this is an option, the above two restrictions are not enforced by + // the protocol compiler. + optional bool message_set_wire_format = 1 [default=false]; + + // Disables the generation of the standard "descriptor()" accessor, which can + // conflict with a field of the same name. This is meant to make migration + // from proto1 easier; new code should avoid fields named "descriptor". + optional bool no_standard_descriptor_accessor = 2 [default=false]; + + // The parser stores options it doesn't recognize here. See above. + repeated UninterpretedOption uninterpreted_option = 999; + + // Clients can define custom options in extensions of this message. See above. + extensions 1000 to max; +} + +message FieldOptions { + // The ctype option instructs the C++ code generator to use a different + // representation of the field than it normally would. See the specific + // options below. This option is not yet implemented in the open source + // release -- sorry, we'll try to include it in a future version! + optional CType ctype = 1 [default = STRING]; + enum CType { + // Default mode. + STRING = 0; + + CORD = 1; + + STRING_PIECE = 2; + } + // The packed option can be enabled for repeated primitive fields to enable + // a more efficient representation on the wire. Rather than repeatedly + // writing the tag and type for each element, the entire array is encoded as + // a single length-delimited blob. + optional bool packed = 2; + + + // Is this field deprecated? + // Depending on the target platform, this can emit Deprecated annotations + // for accessors, or it will be completely ignored; in the very least, this + // is a formalization for deprecating fields. + optional bool deprecated = 3 [default=false]; + + // EXPERIMENTAL. DO NOT USE. + // For "map" fields, the name of the field in the enclosed type that + // is the key for this map. For example, suppose we have: + // message Item { + // required string name = 1; + // required string value = 2; + // } + // message Config { + // repeated Item items = 1 [experimental_map_key="name"]; + // } + // In this situation, the map key for Item will be set to "name". + // TODO: Fully-implement this, then remove the "experimental_" prefix. + optional string experimental_map_key = 9; + + // The parser stores options it doesn't recognize here. See above. + repeated UninterpretedOption uninterpreted_option = 999; + + // Clients can define custom options in extensions of this message. See above. + extensions 1000 to max; +} + +message EnumOptions { + + // The parser stores options it doesn't recognize here. See above. + repeated UninterpretedOption uninterpreted_option = 999; + + // Clients can define custom options in extensions of this message. See above. + extensions 1000 to max; +} + +message EnumValueOptions { + // The parser stores options it doesn't recognize here. See above. + repeated UninterpretedOption uninterpreted_option = 999; + + // Clients can define custom options in extensions of this message. See above. + extensions 1000 to max; +} + +message ServiceOptions { + + // Note: Field numbers 1 through 32 are reserved for Google's internal RPC + // framework. We apologize for hoarding these numbers to ourselves, but + // we were already using them long before we decided to release Protocol + // Buffers. + + // The parser stores options it doesn't recognize here. See above. + repeated UninterpretedOption uninterpreted_option = 999; + + // Clients can define custom options in extensions of this message. See above. + extensions 1000 to max; +} + +message MethodOptions { + + // Note: Field numbers 1 through 32 are reserved for Google's internal RPC + // framework. We apologize for hoarding these numbers to ourselves, but + // we were already using them long before we decided to release Protocol + // Buffers. + + // The parser stores options it doesn't recognize here. See above. + repeated UninterpretedOption uninterpreted_option = 999; + + // Clients can define custom options in extensions of this message. See above. + extensions 1000 to max; +} + +// A message representing a option the parser does not recognize. This only +// appears in options protos created by the compiler::Parser class. +// DescriptorPool resolves these when building Descriptor objects. Therefore, +// options protos in descriptor objects (e.g. returned by Descriptor::options(), +// or produced by Descriptor::CopyTo()) will never have UninterpretedOptions +// in them. +message UninterpretedOption { + // The name of the uninterpreted option. Each string represents a segment in + // a dot-separated name. is_extension is true iff a segment represents an + // extension (denoted with parentheses in options specs in .proto files). + // E.g.,{ ["foo", false], ["bar.baz", true], ["qux", false] } represents + // "foo.(bar.baz).qux". + message NamePart { + required string name_part = 1; + required bool is_extension = 2; + } + repeated NamePart name = 2; + + // The value of the uninterpreted option, in whatever type the tokenizer + // identified it as during parsing. Exactly one of these should be set. + optional string identifier_value = 3; + optional uint64 positive_int_value = 4; + optional int64 negative_int_value = 5; + optional double double_value = 6; + optional bytes string_value = 7; + optional string aggregate_value = 8; +} + +// =================================================================== +// Optional source code info + +// Encapsulates information about the original source file from which a +// FileDescriptorProto was generated. +message SourceCodeInfo { + // A Location identifies a piece of source code in a .proto file which + // corresponds to a particular definition. This information is intended + // to be useful to IDEs, code indexers, documentation generators, and similar + // tools. + // + // For example, say we have a file like: + // message Foo { + // optional string foo = 1; + // } + // Let's look at just the field definition: + // optional string foo = 1; + // ^ ^^ ^^ ^ ^^^ + // a bc de f ghi + // We have the following locations: + // span path represents + // [a,i) [ 4, 0, 2, 0 ] The whole field definition. + // [a,b) [ 4, 0, 2, 0, 4 ] The label (optional). + // [c,d) [ 4, 0, 2, 0, 5 ] The type (string). + // [e,f) [ 4, 0, 2, 0, 1 ] The name (foo). + // [g,h) [ 4, 0, 2, 0, 3 ] The number (1). + // + // Notes: + // - A location may refer to a repeated field itself (i.e. not to any + // particular index within it). This is used whenever a set of elements are + // logically enclosed in a single code segment. For example, an entire + // extend block (possibly containing multiple extension definitions) will + // have an outer location whose path refers to the "extensions" repeated + // field without an index. + // - Multiple locations may have the same path. This happens when a single + // logical declaration is spread out across multiple places. The most + // obvious example is the "extend" block again -- there may be multiple + // extend blocks in the same scope, each of which will have the same path. + // - A location's span is not always a subset of its parent's span. For + // example, the "extendee" of an extension declaration appears at the + // beginning of the "extend" block and is shared by all extensions within + // the block. + // - Just because a location's span is a subset of some other location's span + // does not mean that it is a descendent. For example, a "group" defines + // both a type and a field in a single declaration. Thus, the locations + // corresponding to the type and field and their components will overlap. + // - Code which tries to interpret locations should probably be designed to + // ignore those that it doesn't understand, as more types of locations could + // be recorded in the future. + repeated Location location = 1; + message Location { + // Identifies which part of the FileDescriptorProto was defined at this + // location. + // + // Each element is a field number or an index. They form a path from + // the root FileDescriptorProto to the place where the definition. For + // example, this path: + // [ 4, 3, 2, 7, 1 ] + // refers to: + // file.message_type(3) // 4, 3 + // .field(7) // 2, 7 + // .name() // 1 + // This is because FileDescriptorProto.message_type has field number 4: + // repeated DescriptorProto message_type = 4; + // and DescriptorProto.field has field number 2: + // repeated FieldDescriptorProto field = 2; + // and FieldDescriptorProto.name has field number 1: + // optional string name = 1; + // + // Thus, the above path gives the location of a field name. If we removed + // the last element: + // [ 4, 3, 2, 7 ] + // this path refers to the whole field declaration (from the beginning + // of the label to the terminating semicolon). + repeated int32 path = 1 [packed=true]; + + // Always has exactly three or four elements: start line, start column, + // end line (optional, otherwise assumed same as start line), end column. + // These are packed into a single field for efficiency. Note that line + // and column numbers are zero-based -- typically you will want to add + // 1 to each before displaying to a user. + repeated int32 span = 2 [packed=true]; + + // TODO(kenton): Record comments appearing before and after the + // declaration. + } +} diff --git a/Quanter.Trader.Gui/protos/tutorial/addressbook.proto b/Quanter.Trader.Gui/protos/tutorial/addressbook.proto new file mode 100644 index 0000000..5abe35c --- /dev/null +++ b/Quanter.Trader.Gui/protos/tutorial/addressbook.proto @@ -0,0 +1,31 @@ +package tutorial; + +import "google/protobuf/csharp_options.proto"; +option (google.protobuf.csharp_file_options).namespace = "Google.ProtocolBuffers.Examples.AddressBook"; +option (google.protobuf.csharp_file_options).umbrella_classname = "AddressBookProtos"; + +option optimize_for = SPEED; + +message Person { + required string name = 1; + required int32 id = 2; // Unique ID number for this person. + optional string email = 3; + + enum PhoneType { + MOBILE = 0; + HOME = 1; + WORK = 2; + } + + message PhoneNumber { + required string number = 1; + optional PhoneType type = 2 [default = HOME]; + } + + repeated PhoneNumber phone = 4; +} + +// Our address book file is just one of these. +message AddressBook { + repeated Person person = 1; +} diff --git a/Quanter.Trader.Indicator/IComplexIndicator.cs b/Quanter.Trader.Indicator/IComplexIndicator.cs new file mode 100644 index 0000000..a41dbb7 --- /dev/null +++ b/Quanter.Trader.Indicator/IComplexIndicator.cs @@ -0,0 +1,14 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Quanter.Trader.Indicator +{ + interface IComplexIndicator : IIndicator + { + IEnumerable InnerIndicators { get; } + + } +} diff --git a/Quanter.Trader.Indicator/IIndicator.cs b/Quanter.Trader.Indicator/IIndicator.cs new file mode 100644 index 0000000..5b7020a --- /dev/null +++ b/Quanter.Trader.Indicator/IIndicator.cs @@ -0,0 +1,13 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Quanter.Trader.Indicator +{ + public interface IIndicator : ICloneable + { + IIndicatorValueList Calculate(); + } +} diff --git a/Quanter.Trader.Indicator/IIndicatorValue.cs b/Quanter.Trader.Indicator/IIndicatorValue.cs new file mode 100644 index 0000000..ab8260f --- /dev/null +++ b/Quanter.Trader.Indicator/IIndicatorValue.cs @@ -0,0 +1,14 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Quanter.Trader.Indicator +{ + public interface IIndicatorValue + { + DateTime Time { get; set; } + float Value { get; set; } + } +} diff --git a/Quanter.Trader.Indicator/IIndicatorValueList.cs b/Quanter.Trader.Indicator/IIndicatorValueList.cs new file mode 100644 index 0000000..108133c --- /dev/null +++ b/Quanter.Trader.Indicator/IIndicatorValueList.cs @@ -0,0 +1,12 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Quanter.Trader.Indicator +{ + public interface IIndicatorValueList : IList + { + } +} diff --git a/Quanter.Trader.Indicator/Properties/AssemblyInfo.cs b/Quanter.Trader.Indicator/Properties/AssemblyInfo.cs new file mode 100644 index 0000000..38a74b0 --- /dev/null +++ b/Quanter.Trader.Indicator/Properties/AssemblyInfo.cs @@ -0,0 +1,36 @@ +using System.Reflection; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; + +// 有关程序集的一般信息由以下 +// 控制。更改这些特性值可修改 +// 与程序集关联的信息。 +[assembly: AssemblyTitle("Stock.Trader.Indicator")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("")] +[assembly: AssemblyProduct("Stock.Trader.Indicator")] +[assembly: AssemblyCopyright("Copyright © 2015")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +//将 ComVisible 设置为 false 将使此程序集中的类型 +//对 COM 组件不可见。 如果需要从 COM 访问此程序集中的类型, +//请将此类型的 ComVisible 特性设置为 true。 +[assembly: ComVisible(false)] + +// 如果此项目向 COM 公开,则下列 GUID 用于类型库的 ID +[assembly: Guid("44a87744-bf18-4658-a45c-fc4cbaca7e0f")] + +// 程序集的版本信息由下列四个值组成: +// +// 主版本 +// 次版本 +// 生成号 +// 修订号 +// +//可以指定所有这些值,也可以使用“生成号”和“修订号”的默认值, +// 方法是按如下所示使用“*”: : +// [assembly: AssemblyVersion("1.0.*")] +[assembly: AssemblyVersion("1.0.0.0")] +[assembly: AssemblyFileVersion("1.0.0.0")] diff --git a/Quanter.Trader.Indicator/Quanter.Trader.Indicator.csproj b/Quanter.Trader.Indicator/Quanter.Trader.Indicator.csproj new file mode 100644 index 0000000..0e8f1df --- /dev/null +++ b/Quanter.Trader.Indicator/Quanter.Trader.Indicator.csproj @@ -0,0 +1,57 @@ + + + + + Debug + AnyCPU + {44A87744-BF18-4658-A45C-FC4CBACA7E0F} + Library + Properties + Quanter.Trader.Indicator + Quanter.Trader.Indicator + v4.5.2 + 512 + + + true + full + false + bin\Debug\ + DEBUG;TRACE + prompt + 4 + + + pdbonly + true + bin\Release\ + TRACE + prompt + 4 + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Quanter.Trader.MarketServer/BaseQuotationActor.cs b/Quanter.Trader.MarketServer/BaseQuotationActor.cs new file mode 100644 index 0000000..6a755e4 --- /dev/null +++ b/Quanter.Trader.MarketServer/BaseQuotationActor.cs @@ -0,0 +1,61 @@ +using Akka.Actor; +using Akka.Event; +using Quanter.Common; +using Quanter.Trader.Messages; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading; +using System.Threading.Tasks; + +namespace Quanter.Market +{ + /// + /// + /// + public abstract class BaseQuotationActor : TypedActor, IHandle + { + protected readonly ILoggingAdapter _log = Logging.GetLogger(Context); + protected IDictionary symbolActors = new Dictionary(); + protected IList aliases = new List(); + + public void Handle(QuotationRequest message) + { + switch (message.Type) + { + case QuotationRequest.RequestType.ASKED_SECURITIES: + _handleAskedSecurities(message.Body as IList); + break; + case QuotationRequest.RequestType.RUN: + run(); + break; + } + } + + protected virtual void _handleAskedSecurities(IList seces) + { + // 初始化证券Actor列表 + foreach (var sec in seces) + { + _log.Debug("准备接收证券代码 {0}的行情数据", sec.Symbol); + var actor = Context.ActorSelection(String.Format("/user/{0}/{1}", ConstantsHelper.AKKA_PATH_MARKET_MANAGER, sec.Symbol)); + symbolActors.Add(sec.Symbol, actor); + + aliases.Add(sec.Alias); // 用于获取数据 + } + } + + + protected virtual void run() + { + } + + protected void newQuoteDataArrived(QuoteData data) + { + _log.Debug("通知{0} 获取新数据到达", data.Alias); + symbolActors[data.Symbol].Tell(new SecuritiesQuotationRequest() { Type = SecuritiesQuotationRequest.RequestType.NEW_QUOTEDATA, Body = data }); + } + + } +} diff --git a/Quanter.Trader.MarketServer/CHANGES.txt b/Quanter.Trader.MarketServer/CHANGES.txt new file mode 100644 index 0000000..d80368c --- /dev/null +++ b/Quanter.Trader.MarketServer/CHANGES.txt @@ -0,0 +1,99 @@ +=============================================================================== +Welcome to the C# port of Google Protocol Buffers, written by Jon Skeet +(skeet@pobox.com) based on the work of many talented people. + +For more information about this port, visit its homepage: +http://protobuf-csharp-port.googlecode.com + +For more information about Protocol Buffers in general, visit the project page +for the C++, Java and Python project: +http://protobuf.googlecode.com +=============================================================================== +RELEASE NOTES - Version 2.4.1.473 +=============================================================================== + +Features: +- Added option service_generator_type to control service generation with + NONE, GENERIC, INTERFACE, or IRPCDISPATCH +- Added interfaces IRpcDispatch and IRpcServerStub to provide for blocking + services and implementations. +- Added ProtoGen.exe command-line argument "--protoc_dir=" to specify the + location of protoc.exe. +- Extracted interfaces for ICodedInputStream and ICodedOutputStream to allow + custom implementation of writers with both speed and size optimizations. +- Addition of the "Google.ProtoBuffers.Serialization" assembly to support + reading and writing messages to/from XML, JSON, IDictionary<,> and others. +- Several performance related fixes and tweeks +- Issue 3: Add option to mark generated code with attribute +- Issue 20: Support for decorating classes [Serializable] +- Issue 21: Decorate fields with [deprecated=true] as [System.Obsolete] +- Issue 22: Reusable Builder classes +- Issue 24: Support for using Json/Xml formats with ICodedInputStream +- Issue 25: Added support for NuGet packages +- Issue 31: Upgraded protoc.exe and descriptor to 2.4.1 + +Fixes: +- Issue 13: Message with Field same name as message causes uncompilable .cs +- Issue 16: Does not integrate well with other tooling +- Issue 19: Support for negative enum values +- Issue 26: AddRange in GeneratedBuilder iterates twice. +- Issue 27: Remove XML documentation output from test projects to clear + warnings/errors. +- Issue 28: Circular message dependencies result in null default values for + Message fields. +- Issue 29: Message classes generated have a public default constructor. You + can disable private ctor generation with the option generate_private_ctor. +- Issue 35: Fixed a bug in ProtoGen handling of arguments with trailing \ +- Big-endian support for float, and double on Silverlight +- Packed and Unpacked parsing allow for all repeated, as per version 2.3 +- Fix for leaving Builder a public ctor on internal classes for use with + generic "where T: new()" constraints. + +Other: +- Changed the code signing key to a privately held key +- Reformatted all code and line-endings to C# defaults +- Reworking of performance benchmarks to produce reliable results, option /v2 +- Issue 34: Silverlight assemblies are now unit tested + +=============================================================================== +RELEASE NOTES - Version 2.3.0.277 +=============================================================================== + +Features: +- Added cls_compliance option to generate attributes indicating + non-CLS-compliance. +- Added file_extension option to control the generated output file's extension. +- Added umbrella_namespace option to place the umbrella class into a nested + namespace to address issues with proto files having the same name as a + message it contains. +- Added output_directory option to set the output path for the source file(s). +- Added ignore_google_protobuf option to avoid generating code for includes + from the google.protobuf package. +- Added the LITE framework (Google.ProtoBuffersLite.dll) and the ability to + generate code with "option optimize_for = LITE_RUNTIME;". +- Added ability to invoke protoc.exe from within ProtoGen.exe. +- Upgraded to protoc.exe (2.3) compiler. + +Fixes: +- Issue 9: Class cannot be static and sealed error +- Issue 12: default value for enumerate fields must be filled out + +Other: +- Rewrite of build using MSBbuild instead of NAnt +- Moved to NUnit Version 2.2.8.0 +- Changed to using secure .snk for releases + +=============================================================================== +RELEASE NOTES - Version 0.9.1 +=============================================================================== + +Fixes: +- issue 10: Incorrect encoding of packed fields when serialized + +=============================================================================== +RELEASE NOTES - Version 0.9.0 +=============================================================================== + +- Initial release + +=============================================================================== \ No newline at end of file diff --git a/Quanter.Trader.MarketServer/MarketReceiverConfigurationSection.cs b/Quanter.Trader.MarketServer/MarketReceiverConfigurationSection.cs new file mode 100644 index 0000000..1f53d38 --- /dev/null +++ b/Quanter.Trader.MarketServer/MarketReceiverConfigurationSection.cs @@ -0,0 +1,77 @@ +using System; +using System.Collections.Generic; +using System.Configuration; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Quanter.Market +{ + public class MarketReceiverConfigurationSection : ConfigurationSection + { + [ConfigurationProperty("receiver", IsDefaultCollection = true)] + public ReceiverElementCollection Receivers + { + get + { + return (ReceiverElementCollection)base["receiver"]; + } + } + } + + public class ReceiverElementCollection : ConfigurationElementCollection + { + protected override ConfigurationElement CreateNewElement() + { + return new ReceiverElement(); + } + + protected override object GetElementKey(ConfigurationElement element) + { + return ((ReceiverElement)element).Name; + } + } + + public class ReceiverElement : ConfigurationElement + { + [ConfigurationProperty("name", IsRequired = true, IsKey = true)] + public string Name + { + get + { + return base["name"].ToString(); + } + set + { + base["name"] = value; + } + } + + [ConfigurationProperty("type", IsRequired = true)] + public string Type + { + get + { + return base["type"].ToString(); + } + set + { + base["type"] = value; + } + } + + [ConfigurationProperty("threads", IsRequired = false)] + public int Threads + { + get + { + return int.Parse(base["threads"].ToString()); + } + set + { + base["threads"] = value; + } + } + + } +} diff --git a/Quanter.Trader.MarketServer/Properties/AssemblyInfo.cs b/Quanter.Trader.MarketServer/Properties/AssemblyInfo.cs new file mode 100644 index 0000000..44beefb --- /dev/null +++ b/Quanter.Trader.MarketServer/Properties/AssemblyInfo.cs @@ -0,0 +1,36 @@ +using System.Reflection; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; + +// 有关程序集的一般信息由以下 +// 控制。更改这些特性值可修改 +// 与程序集关联的信息。 +[assembly: AssemblyTitle("Stock.Trader.MarketServer")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("")] +[assembly: AssemblyProduct("Stock.Trader.MarketServer")] +[assembly: AssemblyCopyright("Copyright © 2015")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +//将 ComVisible 设置为 false 将使此程序集中的类型 +//对 COM 组件不可见。 如果需要从 COM 访问此程序集中的类型, +//请将此类型的 ComVisible 特性设置为 true。 +[assembly: ComVisible(false)] + +// 如果此项目向 COM 公开,则下列 GUID 用于类型库的 ID +[assembly: Guid("6d5c9c0a-3c0f-47f3-9bff-2621cb1c5f10")] + +// 程序集的版本信息由下列四个值组成: +// +// 主版本 +// 次版本 +// 生成号 +// 修订号 +// +//可以指定所有这些值,也可以使用“生成号”和“修订号”的默认值, +// 方法是按如下所示使用“*”: : +// [assembly: AssemblyVersion("1.0.*")] +[assembly: AssemblyVersion("1.0.0.0")] +[assembly: AssemblyFileVersion("1.0.0.0")] diff --git a/Quanter.Trader.MarketServer/Quanter.MarketServer.csproj b/Quanter.Trader.MarketServer/Quanter.MarketServer.csproj new file mode 100644 index 0000000..e0ad7a8 --- /dev/null +++ b/Quanter.Trader.MarketServer/Quanter.MarketServer.csproj @@ -0,0 +1,120 @@ + + + + + Debug + AnyCPU + {6D5C9C0A-3C0F-47F3-9BFF-2621CB1C5F10} + Library + Properties + Quanter.Market + Quanter.MarketServer + v4.5.2 + 512 + + + true + full + false + bin\Debug\ + DEBUG;TRACE + prompt + 4 + + + pdbonly + true + bin\Release\ + TRACE + prompt + 4 + + + + ..\packages\Akka.1.0.5\lib\net45\Akka.dll + True + + + ..\packages\Akka.Remote.1.0.5\lib\net45\Akka.Remote.dll + True + + + ..\packages\CsvHelper.2.13.5.0\lib\net40-client\CsvHelper.dll + True + + + ..\packages\Google.ProtocolBuffers.2.4.1.521\lib\net40\Google.ProtocolBuffers.dll + True + + + ..\packages\Google.ProtocolBuffers.2.4.1.521\lib\net40\Google.ProtocolBuffers.Serialization.dll + True + + + ..\packages\Helios.1.4.1\lib\net45\Helios.dll + True + + + ..\packages\Newtonsoft.Json.7.0.1\lib\net45\Newtonsoft.Json.dll + True + + + + + + + + + + + + + + + + + + + + + + + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + + + + + + + + {34db14a6-e4ed-4c4a-8ca6-939201a572be} + Quanter.BusinessEntity + + + {a3fa3c71-a7b0-4bb6-bd32-0aee20493593} + Quanter.Common + + + {dde08214-ec3a-4dd7-8cee-49973e17ae8f} + Quanter.Trader.Messages + + + + + \ No newline at end of file diff --git a/Quanter.Trader.MarketServer/SecuritiesMarketManagerActor.cs b/Quanter.Trader.MarketServer/SecuritiesMarketManagerActor.cs new file mode 100644 index 0000000..cdf04ea --- /dev/null +++ b/Quanter.Trader.MarketServer/SecuritiesMarketManagerActor.cs @@ -0,0 +1,153 @@ +using Akka.Actor; +using Akka.Event; +using Quanter.Common; +using Quanter.Trader.Messages; +using System; +using System.Collections.Generic; +using System.IO; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using CsvHelper; +using System.Reflection; +using System.Configuration; +using Quanter.BusinessEntity; + +namespace Quanter.Market +{ + /// + /// 处理的消息有 + /// 1、启动市场 + /// 2、停止市场 + /// 3、增加策略 + /// 4、减少策略 + /// + public class SecuritiesMarketManagerActor : TypedActor, IHandle + { + private readonly ILoggingAdapter _log = Logging.GetLogger(Context); + + private IDictionary secActors = new Dictionary(); + private List secs = new List(); + private IActorRef quotationActor = null; + + + protected override void PreStart() + { + _initStockMarket(); + _initMarketReceiver(); + _tellAskedSecurities(); + base.PreStart(); + } + public void Handle(MarketRequest message) + { + switch(message.Type) + { + case MarketRequest.RequestType.START: + _startMarket(); + break; + case MarketRequest.RequestType.STOP: + _log.Info("停止证券市场服务"); + _stopMarket(); + break; + default: + _log.Info("不支持的请求类型 {0}", message.Type); + break; + } + } + + private void _startMarket() + { + _log.Info("通知行情接收器Actor,开始接收行情数据"); + quotationActor.Tell(new QuotationRequest() { Type = QuotationRequest.RequestType.RUN }); + } + + private void _stopMarket() + { + // 关闭所有的Actor + foreach(var key in secActors.Keys) + { + _log.Debug("关闭Symbol {0} Actor", key); + secActors[key].GracefulStop(TimeSpan.FromSeconds(5)); + } + secActors.Clear(); + + // quotationActor.Tell(""); // 关闭接收数据 + _log.Debug("关闭行情接收器 Actor"); + quotationActor.GracefulStop(TimeSpan.FromSeconds(5)); + } + + + /// + /// 初始化证券报价列表 + /// + private void _initStockMarket() + { + _log.Info("初始化证券市场关注的证券列表"); + secActors.Clear(); + + // 读取证券列表 + string filePath = "stock_list.csv"; + CsvReader reader = new CsvReader(new StreamReader(filePath)); + while (reader.Read()) + { + String code = reader.GetField(0); + MarketType mt = (MarketType)Enum.Parse(typeof(MarketType), reader.GetField(1)); + String name = reader.GetField(2); + Securities sec = new Securities(SecuritiesTypes.Stock, mt, code); + try { + if (secActors.ContainsKey(sec.Symbol)) + { + _log.Error("发现重复证券代码 {0}", sec.Symbol); + } + else + { + var secActor = Context.ActorOf(Props.Create(sec), sec.Symbol); + secActors.Add(sec.Symbol, secActor); + secs.Add(sec); + _log.Debug("创建了{0}'s Actor, 路径是 {1}", sec.Symbol, secActor.Path); + } + } catch(Exception e) + { + _log.Error("创建了{0}'s Actor, 发生异常: {1}", sec.Symbol, e.StackTrace); + } + } + } + + /// + /// 动态加载市场行情接收 + /// + private void _initMarketReceiver() + { + try { + //MarketReceiverConfigurationSection config = (MarketReceiverConfigurationSection)ConfigurationManager.GetSection("receivers"); + //foreach(var receiver in config.Receivers) + //{ + // ReceiverElement rec = ((ReceiverElement)receiver); + // Type t1 = Type.GetType(rec.Type); + // var secActor1 = Context.ActorOf(Props.Create(t1), rec.Name); + //} + Type t = Type.GetType("Quanter.Market.Sina.SinaQuotationActor, Quanter.Market.Sina"); + quotationActor = Context.ActorOf(Props.Create(t), "sina.quotation"); + + // 通知这个actor 接收那些股票行情 + //quotationActor.Tell(""); + _log.Debug("成功创建{0}市场行情接收器", "sina.quotation"); + } + catch (Exception e) + { + _log.Error("市场行情接收创建失败 {0}", e.StackTrace); + } + + } + + private void _tellAskedSecurities() + { + QuotationRequest req = new QuotationRequest() + { + Type = QuotationRequest.RequestType.ASKED_SECURITIES, + Body = secs + }; + quotationActor.Tell(req); + } + } +} diff --git a/Quanter.Trader.MarketServer/SecuritiesQuotationActor.cs b/Quanter.Trader.MarketServer/SecuritiesQuotationActor.cs new file mode 100644 index 0000000..4891706 --- /dev/null +++ b/Quanter.Trader.MarketServer/SecuritiesQuotationActor.cs @@ -0,0 +1,120 @@ +using Akka.Actor; +using Akka.Event; +using Quanter.Common; +using Quanter.Trader.Messages; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Quanter.Market +{ + /// + /// 处理接收的消息有 + /// 1、订阅价格 + /// 2、取消订阅价格 + /// 3、请求当前报价 + /// 4、设置当前价格 + /// + public class SecuritiesQuotationActor : TypedActor, IHandle + { + private readonly ILoggingAdapter _log = Logging.GetLogger(Context); + + private Dictionary askTickActors = new Dictionary(); + private Dictionary askBarActors = new Dictionary(); + private Dictionary askQuotationActors = new Dictionary(); + + private ActorSelection persistenceActor = null; + private Securities securities; + + public SecuritiesQuotationActor(Securities securities) + { + this.securities = securities; + } + + protected override void PreStart() + { + _init(); + base.PreStart(); + } + + public void Handle(SecuritiesQuotationRequest message) + { + switch(message.Type) + { + case SecuritiesQuotationRequest.RequestType.NEW_QUOTEDATA: + _receiveQuoteData((QuoteData)message.Body); + break; + case SecuritiesQuotationRequest.RequestType.NEW_BARDATA: + break; + case SecuritiesQuotationRequest.RequestType.NEW_TICKDATA: + break; + case SecuritiesQuotationRequest.RequestType.WATCH_QUOTEDATA: + _watchQuoteData(message.Body.ToString()); + break; + case SecuritiesQuotationRequest.RequestType.WATCH_BARDATA: + _watchBarData(message.Body.ToString()); + break; + case SecuritiesQuotationRequest.RequestType.WATCH_TICKDATA: + _watchTickData(message.Body.ToString()); + break; + case SecuritiesQuotationRequest.RequestType.UNWATCH: + _unwatch(message.Body.ToString()); + break; + default: + _log.Warning("不支持该操作 {0}", message.Type); + break; + } + } + + private void _init() + { + _log.Debug("初始化{0}SecuritiesActor", securities.Symbol); + persistenceActor = Context.ActorSelection(String.Format("/user/{0}", ConstantsHelper.AKKA_PATH_PERSISTENCE)); + } + + private void _receiveQuoteData(QuoteData data) + { + _log.Debug("{0}新报价数据到达,通知订阅的策略", data.Symbol); + //PersistenceRequest req = new PersistenceRequest() { Type = PersistenceType.SAVE, Body = data }; + //persistenceActor.Tell(req); + + foreach(var actor in askQuotationActors.Values) + { + actor.Tell(new StrategyResponse() { Type = StrategyResponse.ResponseType.QUOTE_ARRIVED, Body = data }); + } + } + + private void _watchQuoteData(String strategyId) + { + String path = String.Format("/user/{0}/{1}",ConstantsHelper.AKKA_PATH_STRATEGY_MANAGER, strategyId); + var actor = Context.ActorSelection(path); + this.askQuotationActors.Add(strategyId, actor); + _log.Debug("策略{0}订阅了{1}报价数据", strategyId, securities.Symbol); + } + + private void _watchBarData(String strategyId) + { + String path = String.Format("/user/{0}/{1}", ConstantsHelper.AKKA_PATH_STRATEGY_MANAGER, strategyId); + var actor = Context.ActorSelection(path); + this.askBarActors.Add(strategyId, actor); + _log.Debug("策略{0}订阅了{1}Bar数据", strategyId, securities.Symbol); + } + + private void _watchTickData(String strategyId) + { + String path = String.Format("/user/{0}/{1}", ConstantsHelper.AKKA_PATH_STRATEGY_MANAGER, strategyId); + var actor = Context.ActorSelection(path); + this.askTickActors.Add(strategyId, actor); + _log.Debug("策略{0}订阅了{1}Tick数据", strategyId, securities.Symbol); + } + + private void _unwatch(String strategyId) + { + if (this.askQuotationActors.Keys.Contains(strategyId)) this.askQuotationActors.Remove(strategyId); + if (this.askBarActors.Keys.Contains(strategyId)) this.askBarActors.Remove(strategyId); + if (this.askTickActors.Keys.Contains(strategyId)) this.askTickActors.Remove(strategyId); + } + } +} diff --git a/Quanter.Trader.MarketServer/licenses/license.txt b/Quanter.Trader.MarketServer/licenses/license.txt new file mode 100644 index 0000000..b8e773b --- /dev/null +++ b/Quanter.Trader.MarketServer/licenses/license.txt @@ -0,0 +1,31 @@ +Protocol Buffers - Google's data interchange format +Copyright 2008-2010 Google Inc. All rights reserved. +http://github.com/jskeet/dotnet-protobufs/ +Original C++/Java/Python code: +http://code.google.com/p/protobuf/ + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + + * Redistributions of source code must retain the above copyright +notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above +copyright notice, this list of conditions and the following disclaimer +in the documentation and/or other materials provided with the +distribution. + * Neither the name of Google Inc. nor the names of its +contributors may be used to endorse or promote products derived from +this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/Quanter.Trader.MarketServer/licenses/protoc-license.txt b/Quanter.Trader.MarketServer/licenses/protoc-license.txt new file mode 100644 index 0000000..c779cb0 --- /dev/null +++ b/Quanter.Trader.MarketServer/licenses/protoc-license.txt @@ -0,0 +1,36 @@ +protoc.exe was built from the original source at http://code.google.com/p/protobuf/ +The licence for this code is as follows: + +Copyright 2008, Google Inc. +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + + * Redistributions of source code must retain the above copyright +notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above +copyright notice, this list of conditions and the following disclaimer +in the documentation and/or other materials provided with the +distribution. + * Neither the name of Google Inc. nor the names of its +contributors may be used to endorse or promote products derived from +this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +Code generated by the Protocol Buffer compiler is owned by the owner +of the input file used when generating it. This code is not +standalone and requires a support library to be linked with it. This +support library is itself covered by the above license. \ No newline at end of file diff --git a/Quanter.Trader.MarketServer/packages.config b/Quanter.Trader.MarketServer/packages.config new file mode 100644 index 0000000..0639d6f --- /dev/null +++ b/Quanter.Trader.MarketServer/packages.config @@ -0,0 +1,9 @@ + + + + + + + + + \ No newline at end of file diff --git a/Quanter.Trader.MarketServer/protos/google/protobuf/csharp_options.proto b/Quanter.Trader.MarketServer/protos/google/protobuf/csharp_options.proto new file mode 100644 index 0000000..152df76 --- /dev/null +++ b/Quanter.Trader.MarketServer/protos/google/protobuf/csharp_options.proto @@ -0,0 +1,115 @@ +// Extra options for C# generator + +import "google/protobuf/descriptor.proto"; + +package google.protobuf; + +message CSharpFileOptions { + + // Namespace for generated classes; defaults to the package. + optional string namespace = 1; + + // Name of the "umbrella" class used for metadata about all + // the messages within this file. Default is based on the name + // of the file. + optional string umbrella_classname = 2; + + // Whether classes should be public (true) or internal (false) + optional bool public_classes = 3 [default = true]; + + // Whether to generate a single file for everything within the + // .proto file (false), or one file per message (true). + // This option is not currently honored; please log a feature + // request if you really want it. + optional bool multiple_files = 4; + + // Whether to nest messages within a single umbrella class (true) + // or create the umbrella class as a peer, with messages as + // top-level classes in the namespace (false) + optional bool nest_classes = 5; + + // Generate appropriate support for Code Contracts + // (Ongoing; support should improve over time) + optional bool code_contracts = 6; + + // Create subdirectories for namespaces, e.g. namespace "Foo.Bar" + // would generate files within [output directory]/Foo/Bar + optional bool expand_namespace_directories = 7; + + // Generate attributes indicating non-CLS-compliance + optional bool cls_compliance = 8 [default = true]; + + // Generate messages/builders with the [Serializable] attribute + optional bool add_serializable = 9 [default = false]; + + // Generates a private ctor for Message types + optional bool generate_private_ctor = 10 [default = true]; + + // The extension that should be appended to the umbrella_classname when creating files. + optional string file_extension = 221 [default = ".cs"]; + + // A nested namespace for the umbrella class. Helpful for name collisions caused by + // umbrella_classname conflicting with an existing type. This will be automatically + // set to 'Proto' if a collision is detected with types being generated. This value + // is ignored when nest_classes == true + optional string umbrella_namespace = 222; + + // The output path for the source file(s) generated + optional string output_directory = 223 [default = "."]; + + // Will ignore the type generations and remove dependencies for the descriptor proto + // files that declare their package to be "google.protobuf" + optional bool ignore_google_protobuf = 224 [default = false]; + + // Controls how services are generated, GENERIC is the deprecated original implementation + // INTERFACE generates service interfaces only, RPCINTEROP generates interfaces and + // implementations using the included Windows RPC interop libarary. + optional CSharpServiceType service_generator_type = 225 [default = NONE]; + + // Used to add the System.Runtime.CompilerServices.CompilerGeneratedAttribute and + // System.CodeDom.Compiler.GeneratedCodeAttribute attributes to generated code. + optional bool generated_code_attributes = 226 [default = false]; +} + +enum CSharpServiceType { + // Services are ignored by the generator + NONE = 0; + // Generates the original Java generic service implementations + GENERIC = 1; + // Generates an interface for the service and nothing else + INTERFACE = 2; + // Generates an interface for the service and client/server wrappers for the interface + IRPCDISPATCH = 3; +} + +extend FileOptions { + optional CSharpFileOptions csharp_file_options = 1000; +} + +extend FieldOptions { + optional CSharpFieldOptions csharp_field_options = 1000; +} + +message CSharpFieldOptions { + // Provides the ability to override the name of the property + // generated for this field. This is applied to all properties + // and methods to do with this field, including HasFoo, FooCount, + // FooList etc. + optional string property_name = 1; +} + +message CSharpServiceOptions { + optional string interface_id = 1; +} + +extend ServiceOptions { + optional CSharpServiceOptions csharp_service_options = 1000; +} + +message CSharpMethodOptions { + optional int32 dispatch_id = 1; +} + +extend MethodOptions { + optional CSharpMethodOptions csharp_method_options = 1000; +} \ No newline at end of file diff --git a/Quanter.Trader.MarketServer/protos/google/protobuf/descriptor.proto b/Quanter.Trader.MarketServer/protos/google/protobuf/descriptor.proto new file mode 100644 index 0000000..233f879 --- /dev/null +++ b/Quanter.Trader.MarketServer/protos/google/protobuf/descriptor.proto @@ -0,0 +1,533 @@ +// Protocol Buffers - Google's data interchange format +// Copyright 2008 Google Inc. All rights reserved. +// http://code.google.com/p/protobuf/ +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// Author: kenton@google.com (Kenton Varda) +// Based on original Protocol Buffers design by +// Sanjay Ghemawat, Jeff Dean, and others. +// +// The messages in this file describe the definitions found in .proto files. +// A valid .proto file can be translated directly to a FileDescriptorProto +// without any other information (e.g. without reading its imports). + + + +package google.protobuf; +option java_package = "com.google.protobuf"; +option java_outer_classname = "DescriptorProtos"; + +// descriptor.proto must be optimized for speed because reflection-based +// algorithms don't work during bootstrapping. +option optimize_for = SPEED; + +// The protocol compiler can output a FileDescriptorSet containing the .proto +// files it parses. +message FileDescriptorSet { + repeated FileDescriptorProto file = 1; +} + +// Describes a complete .proto file. +message FileDescriptorProto { + optional string name = 1; // file name, relative to root of source tree + optional string package = 2; // e.g. "foo", "foo.bar", etc. + + // Names of files imported by this file. + repeated string dependency = 3; + + // All top-level definitions in this file. + repeated DescriptorProto message_type = 4; + repeated EnumDescriptorProto enum_type = 5; + repeated ServiceDescriptorProto service = 6; + repeated FieldDescriptorProto extension = 7; + + optional FileOptions options = 8; + + // This field contains optional information about the original source code. + // You may safely remove this entire field whithout harming runtime + // functionality of the descriptors -- the information is needed only by + // development tools. + optional SourceCodeInfo source_code_info = 9; +} + +// Describes a message type. +message DescriptorProto { + optional string name = 1; + + repeated FieldDescriptorProto field = 2; + repeated FieldDescriptorProto extension = 6; + + repeated DescriptorProto nested_type = 3; + repeated EnumDescriptorProto enum_type = 4; + + message ExtensionRange { + optional int32 start = 1; + optional int32 end = 2; + } + repeated ExtensionRange extension_range = 5; + + optional MessageOptions options = 7; +} + +// Describes a field within a message. +message FieldDescriptorProto { + enum Type { + // 0 is reserved for errors. + // Order is weird for historical reasons. + TYPE_DOUBLE = 1; + TYPE_FLOAT = 2; + TYPE_INT64 = 3; // Not ZigZag encoded. Negative numbers + // take 10 bytes. Use TYPE_SINT64 if negative + // values are likely. + TYPE_UINT64 = 4; + TYPE_INT32 = 5; // Not ZigZag encoded. Negative numbers + // take 10 bytes. Use TYPE_SINT32 if negative + // values are likely. + TYPE_FIXED64 = 6; + TYPE_FIXED32 = 7; + TYPE_BOOL = 8; + TYPE_STRING = 9; + TYPE_GROUP = 10; // Tag-delimited aggregate. + TYPE_MESSAGE = 11; // Length-delimited aggregate. + + // New in version 2. + TYPE_BYTES = 12; + TYPE_UINT32 = 13; + TYPE_ENUM = 14; + TYPE_SFIXED32 = 15; + TYPE_SFIXED64 = 16; + TYPE_SINT32 = 17; // Uses ZigZag encoding. + TYPE_SINT64 = 18; // Uses ZigZag encoding. + }; + + enum Label { + // 0 is reserved for errors + LABEL_OPTIONAL = 1; + LABEL_REQUIRED = 2; + LABEL_REPEATED = 3; + // TODO(sanjay): Should we add LABEL_MAP? + }; + + optional string name = 1; + optional int32 number = 3; + optional Label label = 4; + + // If type_name is set, this need not be set. If both this and type_name + // are set, this must be either TYPE_ENUM or TYPE_MESSAGE. + optional Type type = 5; + + // For message and enum types, this is the name of the type. If the name + // starts with a '.', it is fully-qualified. Otherwise, C++-like scoping + // rules are used to find the type (i.e. first the nested types within this + // message are searched, then within the parent, on up to the root + // namespace). + optional string type_name = 6; + + // For extensions, this is the name of the type being extended. It is + // resolved in the same manner as type_name. + optional string extendee = 2; + + // For numeric types, contains the original text representation of the value. + // For booleans, "true" or "false". + // For strings, contains the default text contents (not escaped in any way). + // For bytes, contains the C escaped value. All bytes >= 128 are escaped. + // TODO(kenton): Base-64 encode? + optional string default_value = 7; + + optional FieldOptions options = 8; +} + +// Describes an enum type. +message EnumDescriptorProto { + optional string name = 1; + + repeated EnumValueDescriptorProto value = 2; + + optional EnumOptions options = 3; +} + +// Describes a value within an enum. +message EnumValueDescriptorProto { + optional string name = 1; + optional int32 number = 2; + + optional EnumValueOptions options = 3; +} + +// Describes a service. +message ServiceDescriptorProto { + optional string name = 1; + repeated MethodDescriptorProto method = 2; + + optional ServiceOptions options = 3; +} + +// Describes a method of a service. +message MethodDescriptorProto { + optional string name = 1; + + // Input and output type names. These are resolved in the same way as + // FieldDescriptorProto.type_name, but must refer to a message type. + optional string input_type = 2; + optional string output_type = 3; + + optional MethodOptions options = 4; +} + +// =================================================================== +// Options + +// Each of the definitions above may have "options" attached. These are +// just annotations which may cause code to be generated slightly differently +// or may contain hints for code that manipulates protocol messages. +// +// Clients may define custom options as extensions of the *Options messages. +// These extensions may not yet be known at parsing time, so the parser cannot +// store the values in them. Instead it stores them in a field in the *Options +// message called uninterpreted_option. This field must have the same name +// across all *Options messages. We then use this field to populate the +// extensions when we build a descriptor, at which point all protos have been +// parsed and so all extensions are known. +// +// Extension numbers for custom options may be chosen as follows: +// * For options which will only be used within a single application or +// organization, or for experimental options, use field numbers 50000 +// through 99999. It is up to you to ensure that you do not use the +// same number for multiple options. +// * For options which will be published and used publicly by multiple +// independent entities, e-mail kenton@google.com to reserve extension +// numbers. Simply tell me how many you need and I'll send you back a +// set of numbers to use -- there's no need to explain how you intend to +// use them. If this turns out to be popular, a web service will be set up +// to automatically assign option numbers. + + +message FileOptions { + + // Sets the Java package where classes generated from this .proto will be + // placed. By default, the proto package is used, but this is often + // inappropriate because proto packages do not normally start with backwards + // domain names. + optional string java_package = 1; + + + // If set, all the classes from the .proto file are wrapped in a single + // outer class with the given name. This applies to both Proto1 + // (equivalent to the old "--one_java_file" option) and Proto2 (where + // a .proto always translates to a single class, but you may want to + // explicitly choose the class name). + optional string java_outer_classname = 8; + + // If set true, then the Java code generator will generate a separate .java + // file for each top-level message, enum, and service defined in the .proto + // file. Thus, these types will *not* be nested inside the outer class + // named by java_outer_classname. However, the outer class will still be + // generated to contain the file's getDescriptor() method as well as any + // top-level extensions defined in the file. + optional bool java_multiple_files = 10 [default=false]; + + // If set true, then the Java code generator will generate equals() and + // hashCode() methods for all messages defined in the .proto file. This is + // purely a speed optimization, as the AbstractMessage base class includes + // reflection-based implementations of these methods. + optional bool java_generate_equals_and_hash = 20 [default=false]; + + // Generated classes can be optimized for speed or code size. + enum OptimizeMode { + SPEED = 1; // Generate complete code for parsing, serialization, + // etc. + CODE_SIZE = 2; // Use ReflectionOps to implement these methods. + LITE_RUNTIME = 3; // Generate code using MessageLite and the lite runtime. + } + optional OptimizeMode optimize_for = 9 [default=SPEED]; + + + + + // Should generic services be generated in each language? "Generic" services + // are not specific to any particular RPC system. They are generated by the + // main code generators in each language (without additional plugins). + // Generic services were the only kind of service generation supported by + // early versions of proto2. + // + // Generic services are now considered deprecated in favor of using plugins + // that generate code specific to your particular RPC system. Therefore, + // these default to false. Old code which depends on generic services should + // explicitly set them to true. + optional bool cc_generic_services = 16 [default=false]; + optional bool java_generic_services = 17 [default=false]; + optional bool py_generic_services = 18 [default=false]; + + // The parser stores options it doesn't recognize here. See above. + repeated UninterpretedOption uninterpreted_option = 999; + + // Clients can define custom options in extensions of this message. See above. + extensions 1000 to max; +} + +message MessageOptions { + // Set true to use the old proto1 MessageSet wire format for extensions. + // This is provided for backwards-compatibility with the MessageSet wire + // format. You should not use this for any other reason: It's less + // efficient, has fewer features, and is more complicated. + // + // The message must be defined exactly as follows: + // message Foo { + // option message_set_wire_format = true; + // extensions 4 to max; + // } + // Note that the message cannot have any defined fields; MessageSets only + // have extensions. + // + // All extensions of your type must be singular messages; e.g. they cannot + // be int32s, enums, or repeated messages. + // + // Because this is an option, the above two restrictions are not enforced by + // the protocol compiler. + optional bool message_set_wire_format = 1 [default=false]; + + // Disables the generation of the standard "descriptor()" accessor, which can + // conflict with a field of the same name. This is meant to make migration + // from proto1 easier; new code should avoid fields named "descriptor". + optional bool no_standard_descriptor_accessor = 2 [default=false]; + + // The parser stores options it doesn't recognize here. See above. + repeated UninterpretedOption uninterpreted_option = 999; + + // Clients can define custom options in extensions of this message. See above. + extensions 1000 to max; +} + +message FieldOptions { + // The ctype option instructs the C++ code generator to use a different + // representation of the field than it normally would. See the specific + // options below. This option is not yet implemented in the open source + // release -- sorry, we'll try to include it in a future version! + optional CType ctype = 1 [default = STRING]; + enum CType { + // Default mode. + STRING = 0; + + CORD = 1; + + STRING_PIECE = 2; + } + // The packed option can be enabled for repeated primitive fields to enable + // a more efficient representation on the wire. Rather than repeatedly + // writing the tag and type for each element, the entire array is encoded as + // a single length-delimited blob. + optional bool packed = 2; + + + // Is this field deprecated? + // Depending on the target platform, this can emit Deprecated annotations + // for accessors, or it will be completely ignored; in the very least, this + // is a formalization for deprecating fields. + optional bool deprecated = 3 [default=false]; + + // EXPERIMENTAL. DO NOT USE. + // For "map" fields, the name of the field in the enclosed type that + // is the key for this map. For example, suppose we have: + // message Item { + // required string name = 1; + // required string value = 2; + // } + // message Config { + // repeated Item items = 1 [experimental_map_key="name"]; + // } + // In this situation, the map key for Item will be set to "name". + // TODO: Fully-implement this, then remove the "experimental_" prefix. + optional string experimental_map_key = 9; + + // The parser stores options it doesn't recognize here. See above. + repeated UninterpretedOption uninterpreted_option = 999; + + // Clients can define custom options in extensions of this message. See above. + extensions 1000 to max; +} + +message EnumOptions { + + // The parser stores options it doesn't recognize here. See above. + repeated UninterpretedOption uninterpreted_option = 999; + + // Clients can define custom options in extensions of this message. See above. + extensions 1000 to max; +} + +message EnumValueOptions { + // The parser stores options it doesn't recognize here. See above. + repeated UninterpretedOption uninterpreted_option = 999; + + // Clients can define custom options in extensions of this message. See above. + extensions 1000 to max; +} + +message ServiceOptions { + + // Note: Field numbers 1 through 32 are reserved for Google's internal RPC + // framework. We apologize for hoarding these numbers to ourselves, but + // we were already using them long before we decided to release Protocol + // Buffers. + + // The parser stores options it doesn't recognize here. See above. + repeated UninterpretedOption uninterpreted_option = 999; + + // Clients can define custom options in extensions of this message. See above. + extensions 1000 to max; +} + +message MethodOptions { + + // Note: Field numbers 1 through 32 are reserved for Google's internal RPC + // framework. We apologize for hoarding these numbers to ourselves, but + // we were already using them long before we decided to release Protocol + // Buffers. + + // The parser stores options it doesn't recognize here. See above. + repeated UninterpretedOption uninterpreted_option = 999; + + // Clients can define custom options in extensions of this message. See above. + extensions 1000 to max; +} + +// A message representing a option the parser does not recognize. This only +// appears in options protos created by the compiler::Parser class. +// DescriptorPool resolves these when building Descriptor objects. Therefore, +// options protos in descriptor objects (e.g. returned by Descriptor::options(), +// or produced by Descriptor::CopyTo()) will never have UninterpretedOptions +// in them. +message UninterpretedOption { + // The name of the uninterpreted option. Each string represents a segment in + // a dot-separated name. is_extension is true iff a segment represents an + // extension (denoted with parentheses in options specs in .proto files). + // E.g.,{ ["foo", false], ["bar.baz", true], ["qux", false] } represents + // "foo.(bar.baz).qux". + message NamePart { + required string name_part = 1; + required bool is_extension = 2; + } + repeated NamePart name = 2; + + // The value of the uninterpreted option, in whatever type the tokenizer + // identified it as during parsing. Exactly one of these should be set. + optional string identifier_value = 3; + optional uint64 positive_int_value = 4; + optional int64 negative_int_value = 5; + optional double double_value = 6; + optional bytes string_value = 7; + optional string aggregate_value = 8; +} + +// =================================================================== +// Optional source code info + +// Encapsulates information about the original source file from which a +// FileDescriptorProto was generated. +message SourceCodeInfo { + // A Location identifies a piece of source code in a .proto file which + // corresponds to a particular definition. This information is intended + // to be useful to IDEs, code indexers, documentation generators, and similar + // tools. + // + // For example, say we have a file like: + // message Foo { + // optional string foo = 1; + // } + // Let's look at just the field definition: + // optional string foo = 1; + // ^ ^^ ^^ ^ ^^^ + // a bc de f ghi + // We have the following locations: + // span path represents + // [a,i) [ 4, 0, 2, 0 ] The whole field definition. + // [a,b) [ 4, 0, 2, 0, 4 ] The label (optional). + // [c,d) [ 4, 0, 2, 0, 5 ] The type (string). + // [e,f) [ 4, 0, 2, 0, 1 ] The name (foo). + // [g,h) [ 4, 0, 2, 0, 3 ] The number (1). + // + // Notes: + // - A location may refer to a repeated field itself (i.e. not to any + // particular index within it). This is used whenever a set of elements are + // logically enclosed in a single code segment. For example, an entire + // extend block (possibly containing multiple extension definitions) will + // have an outer location whose path refers to the "extensions" repeated + // field without an index. + // - Multiple locations may have the same path. This happens when a single + // logical declaration is spread out across multiple places. The most + // obvious example is the "extend" block again -- there may be multiple + // extend blocks in the same scope, each of which will have the same path. + // - A location's span is not always a subset of its parent's span. For + // example, the "extendee" of an extension declaration appears at the + // beginning of the "extend" block and is shared by all extensions within + // the block. + // - Just because a location's span is a subset of some other location's span + // does not mean that it is a descendent. For example, a "group" defines + // both a type and a field in a single declaration. Thus, the locations + // corresponding to the type and field and their components will overlap. + // - Code which tries to interpret locations should probably be designed to + // ignore those that it doesn't understand, as more types of locations could + // be recorded in the future. + repeated Location location = 1; + message Location { + // Identifies which part of the FileDescriptorProto was defined at this + // location. + // + // Each element is a field number or an index. They form a path from + // the root FileDescriptorProto to the place where the definition. For + // example, this path: + // [ 4, 3, 2, 7, 1 ] + // refers to: + // file.message_type(3) // 4, 3 + // .field(7) // 2, 7 + // .name() // 1 + // This is because FileDescriptorProto.message_type has field number 4: + // repeated DescriptorProto message_type = 4; + // and DescriptorProto.field has field number 2: + // repeated FieldDescriptorProto field = 2; + // and FieldDescriptorProto.name has field number 1: + // optional string name = 1; + // + // Thus, the above path gives the location of a field name. If we removed + // the last element: + // [ 4, 3, 2, 7 ] + // this path refers to the whole field declaration (from the beginning + // of the label to the terminating semicolon). + repeated int32 path = 1 [packed=true]; + + // Always has exactly three or four elements: start line, start column, + // end line (optional, otherwise assumed same as start line), end column. + // These are packed into a single field for efficiency. Note that line + // and column numbers are zero-based -- typically you will want to add + // 1 to each before displaying to a user. + repeated int32 span = 2 [packed=true]; + + // TODO(kenton): Record comments appearing before and after the + // declaration. + } +} diff --git a/Quanter.Trader.MarketServer/protos/tutorial/addressbook.proto b/Quanter.Trader.MarketServer/protos/tutorial/addressbook.proto new file mode 100644 index 0000000..5abe35c --- /dev/null +++ b/Quanter.Trader.MarketServer/protos/tutorial/addressbook.proto @@ -0,0 +1,31 @@ +package tutorial; + +import "google/protobuf/csharp_options.proto"; +option (google.protobuf.csharp_file_options).namespace = "Google.ProtocolBuffers.Examples.AddressBook"; +option (google.protobuf.csharp_file_options).umbrella_classname = "AddressBookProtos"; + +option optimize_for = SPEED; + +message Person { + required string name = 1; + required int32 id = 2; // Unique ID number for this person. + optional string email = 3; + + enum PhoneType { + MOBILE = 0; + HOME = 1; + WORK = 2; + } + + message PhoneNumber { + required string number = 1; + optional PhoneType type = 2 [default = HOME]; + } + + repeated PhoneNumber phone = 4; +} + +// Our address book file is just one of these. +message AddressBook { + repeated Person person = 1; +} diff --git "a/Quanter.Trader.MarketServer/stock_list - \345\244\215\345\210\266.csv" "b/Quanter.Trader.MarketServer/stock_list - \345\244\215\345\210\266.csv" new file mode 100644 index 0000000..ebe1dc5 --- /dev/null +++ "b/Quanter.Trader.MarketServer/stock_list - \345\244\215\345\210\266.csv" @@ -0,0 +1,3145 @@ +000001,XSHE,平安银行 +000002,XSHE,万 科A +000004,XSHE,国农科技 +000005,XSHE,世纪星源 +000006,XSHE,深振业A +000007,XSHE,零七股份 +000008,XSHE,神州高铁 +000009,XSHE,中国宝安 +000010,XSHE,深华新 +000011,XSHE,深物业A +000012,XSHE,南 玻A +000014,XSHE,沙河股份 +000016,XSHE,深康佳A +000017,XSHE,深中华A +000018,XSHE,神州长城 +000019,XSHE,深深宝A +000020,XSHE,深华发A +000021,XSHE,深科技 +000022,XSHE,深赤湾A +000023,XSHE,深天地A +000024,XSHE,招商地产 +000025,XSHE,特 力A +000026,XSHE,飞亚达A +000027,XSHE,深圳能源 +000028,XSHE,国药一致 +000029,XSHE,深深房A +000030,XSHE,富奥股份 +000031,XSHE,中粮地产 +000032,XSHE,深桑达A +000033,XSHE, +000034,XSHE,深信泰丰 +000035,XSHE,中国天楹 +000036,XSHE,华联控股 +000037,XSHE,深南电A +000038,XSHE,深大通 +000039,XSHE,中集集团 +000040,XSHE,宝安地产 +000042,XSHE,中洲控股 +000043,XSHE,中航地产 +000045,XSHE,深纺织A +000046,XSHE,泛海控股 +000048,XSHE,康达尔 +000049,XSHE,德赛电池 +000050,XSHE,深天马A +000055,XSHE,方大集团 +000056,XSHE,皇庭国际 +000058,XSHE,深 赛 格 +000059,XSHE,*ST华锦 +000060,XSHE,中金岭南 +000061,XSHE,农 产 品 +000062,XSHE,深圳华强 +000063,XSHE,中兴通讯 +000065,XSHE,北方国际 +000066,XSHE,长城电脑 +000068,XSHE,*ST华赛 +000069,XSHE,华侨城A +000070,XSHE,特发信息 +000078,XSHE,海王生物 +000088,XSHE,盐 田 港 +000089,XSHE,深圳机场 +000090,XSHE,天健集团 +000096,XSHE,广聚能源 +000099,XSHE,中信海直 +000100,XSHE,TCL 集团 +000150,XSHE,宜华健康 +000151,XSHE,中成股份 +000153,XSHE,丰原药业 +000155,XSHE,*ST川化 +000156,XSHE,华数传媒 +000157,XSHE,中联重科 +000158,XSHE,常山股份 +000159,XSHE,国际实业 +000166,XSHE,申万宏源 +000301,XSHE,东方市场 +000333,XSHE,美的集团 +000338,XSHE,潍柴动力 +000400,XSHE,许继电气 +000401,XSHE,冀东水泥 +000402,XSHE,金 融 街 +000403,XSHE,ST生化 +000404,XSHE,华意压缩 +000407,XSHE,胜利股份 +000408,XSHE,金谷源 +000409,XSHE,山东地矿 +000410,XSHE,沈阳机床 +000411,XSHE,英特集团 +000413,XSHE,东旭光电 +000415,XSHE,渤海租赁 +000416,XSHE,民生控股 +000417,XSHE,合肥百货 +000418,XSHE,小天鹅A +000419,XSHE,通程控股 +000420,XSHE,吉林化纤 +000421,XSHE,南京中北 +000422,XSHE,湖北宜化 +000423,XSHE,东阿阿胶 +000425,XSHE,徐工机械 +000426,XSHE,兴业矿业 +000428,XSHE,华天酒店 +000429,XSHE,粤高速A +000430,XSHE,张家界 +000488,XSHE,晨鸣纸业 +000498,XSHE,山东路桥 +000501,XSHE,鄂武商A +000502,XSHE,绿景控股 +000503,XSHE,海虹控股 +000504,XSHE,南华生物 +000505,XSHE,珠江控股 +000506,XSHE,中润资源 +000507,XSHE,珠海港 +000509,XSHE,华塑控股 +000510,XSHE,*ST金路 +000511,XSHE,烯碳新材 +000513,XSHE,丽珠集团 +000514,XSHE,渝 开 发 +000516,XSHE,国际医学 +000517,XSHE,荣安地产 +000518,XSHE,四环生物 +000519,XSHE,江南红箭 +000520,XSHE,长航凤凰 +000521,XSHE,美菱电器 +000523,XSHE,广州浪奇 +000524,XSHE,岭南控股 +000525,XSHE,红 太 阳 +000526,XSHE,银润投资 +000528,XSHE,柳 工 +000529,XSHE,广弘控股 +000530,XSHE,大冷股份 +000531,XSHE,穗恒运A +000532,XSHE,力合股份 +000533,XSHE,万 家 乐 +000534,XSHE,万泽股份 +000536,XSHE,华映科技 +000537,XSHE,广宇发展 +000538,XSHE,云南白药 +000539,XSHE,粤电力A +000540,XSHE,中天城投 +000541,XSHE,佛山照明 +000543,XSHE,皖能电力 +000544,XSHE,中原环保 +000545,XSHE,金浦钛业 +000546,XSHE,金圆股份 +000547,XSHE,航天发展 +000548,XSHE,湖南投资 +000550,XSHE,江铃汽车 +000551,XSHE,创元科技 +000552,XSHE,靖远煤电 +000553,XSHE,沙隆达A +000554,XSHE,泰山石油 +000555,XSHE,神州信息 +000557,XSHE,*ST广夏 +000558,XSHE,莱茵体育 +000559,XSHE,万向钱潮 +000560,XSHE,昆百大A +000561,XSHE,烽火电子 +000563,XSHE,陕国投A +000564,XSHE,西安民生 +000565,XSHE,渝三峡A +000566,XSHE,海南海药 +000567,XSHE,海德股份 +000568,XSHE,泸州老窖 +000570,XSHE,苏常柴A +000571,XSHE,新大洲A +000572,XSHE,海马汽车 +000573,XSHE,粤宏远A +000576,XSHE,广东甘化 +000581,XSHE,威孚高科 +000582,XSHE,北部湾港 +000584,XSHE,友利控股 +000585,XSHE,东北电气 +000586,XSHE,汇源通信 +000587,XSHE,金叶珠宝 +000589,XSHE,黔轮胎A +000590,XSHE,*ST古汉 +000591,XSHE,桐 君 阁 +000592,XSHE,平潭发展 +000593,XSHE,大通燃气 +000595,XSHE,宝塔实业 +000596,XSHE,古井贡酒 +000597,XSHE,东北制药 +000598,XSHE,兴蓉环境 +000599,XSHE,青岛双星 +000600,XSHE,建投能源 +000601,XSHE,韶能股份 +000603,XSHE,盛达矿业 +000605,XSHE,渤海股份 +000606,XSHE,青海明胶 +000607,XSHE,华媒控股 +000608,XSHE,阳光股份 +000609,XSHE,绵世股份 +000610,XSHE,西安旅游 +000611,XSHE,*ST蒙发 +000612,XSHE,焦作万方 +000613,XSHE,大东海A +000615,XSHE,湖北金环 +000616,XSHE,海航投资 +000617,XSHE,石油济柴 +000619,XSHE,海螺型材 +000620,XSHE,新华联 +000622,XSHE,恒立实业 +000623,XSHE,吉林敖东 +000625,XSHE,长安汽车 +000626,XSHE,如意集团 +000627,XSHE,天茂集团 +000628,XSHE,高新发展 +000629,XSHE,攀钢钒钛 +000630,XSHE,铜陵有色 +000631,XSHE,顺发恒业 +000632,XSHE,三木集团 +000633,XSHE,合金投资 +000635,XSHE,英 力 特 +000636,XSHE,风华高科 +000637,XSHE,茂化实华 +000638,XSHE,万方发展 +000639,XSHE,西王食品 +000650,XSHE,仁和药业 +000651,XSHE,格力电器 +000652,XSHE,泰达股份 +000655,XSHE,金岭矿业 +000656,XSHE,金科股份 +000657,XSHE,中钨高新 +000659,XSHE,*ST中富 +000661,XSHE,长春高新 +000662,XSHE,索芙特 +000663,XSHE,永安林业 +000665,XSHE,湖北广电 +000666,XSHE,经纬纺机 +000667,XSHE,美好集团 +000668,XSHE,荣丰控股 +000669,XSHE,金鸿能源 +000670,XSHE,盈方微 +000671,XSHE,阳 光 城 +000672,XSHE,上峰水泥 +000673,XSHE,当代东方 +000676,XSHE,智度投资 +000677,XSHE,*ST海龙 +000678,XSHE,襄阳轴承 +000679,XSHE,大连友谊 +000680,XSHE,山推股份 +000681,XSHE,视觉中国 +000682,XSHE,东方电子 +000683,XSHE,远兴能源 +000685,XSHE,中山公用 +000686,XSHE,东北证券 +000687,XSHE,华讯方舟 +000688,XSHE,建新矿业 +000690,XSHE,宝新能源 +000691,XSHE,亚太实业 +000692,XSHE,惠天热电 +000693,XSHE,华泽钴镍 +000695,XSHE,滨海能源 +000697,XSHE,炼石有色 +000698,XSHE,沈阳化工 +000700,XSHE,模塑科技 +000701,XSHE,厦门信达 +000702,XSHE,正虹科技 +000703,XSHE,恒逸石化 +000705,XSHE,浙江震元 +000707,XSHE,双环科技 +000708,XSHE,大冶特钢 +000709,XSHE,河北钢铁 +000710,XSHE,天兴仪表 +000711,XSHE,*ST京蓝 +000712,XSHE,锦龙股份 +000713,XSHE,丰乐种业 +000715,XSHE,中兴商业 +000716,XSHE,黑芝麻 +000717,XSHE,韶钢松山 +000718,XSHE,苏宁环球 +000719,XSHE,大地传媒 +000720,XSHE,新能泰山 +000721,XSHE,西安饮食 +000722,XSHE,湖南发展 +000723,XSHE,美锦能源 +000725,XSHE,京东方A +000726,XSHE,鲁 泰A +000727,XSHE,华东科技 +000728,XSHE,国元证券 +000729,XSHE,燕京啤酒 +000731,XSHE,四川美丰 +000732,XSHE,泰禾集团 +000733,XSHE,振华科技 +000735,XSHE,罗 牛 山 +000736,XSHE,中房地产 +000737,XSHE,南风化工 +000738,XSHE,中航动控 +000739,XSHE,普洛药业 +000748,XSHE,长城信息 +000750,XSHE,国海证券 +000751,XSHE,锌业股份 +000752,XSHE,西藏发展 +000753,XSHE,漳州发展 +000755,XSHE,山西三维 +000756,XSHE,新华制药 +000757,XSHE,浩物股份 +000758,XSHE,中色股份 +000759,XSHE,中百集团 +000760,XSHE,斯太尔 +000761,XSHE,本钢板材 +000762,XSHE,西藏矿业 +000766,XSHE,通化金马 +000767,XSHE,漳泽电力 +000768,XSHE,中航飞机 +000776,XSHE,广发证券 +000777,XSHE,中核科技 +000778,XSHE,新兴铸管 +000779,XSHE,三毛派神 +000780,XSHE,平庄能源 +000782,XSHE,美达股份 +000783,XSHE,长江证券 +000785,XSHE,武汉中商 +000786,XSHE,北新建材 +000788,XSHE,北大医药 +000789,XSHE,万年青 +000790,XSHE,华神集团 +000791,XSHE,甘肃电投 +000792,XSHE,盐湖股份 +000793,XSHE,华闻传媒 +000795,XSHE,太原刚玉 +000796,XSHE,凯撒旅游 +000797,XSHE,中国武夷 +000798,XSHE,中水渔业 +000799,XSHE,*ST酒鬼 +000800,XSHE,一汽轿车 +000801,XSHE,四川九洲 +000802,XSHE,北京文化 +000803,XSHE,金宇车城 +000806,XSHE,银河生物 +000807,XSHE,云铝股份 +000809,XSHE,铁岭新城 +000810,XSHE,创维数字 +000811,XSHE,烟台冰轮 +000812,XSHE,陕西金叶 +000813,XSHE,天山纺织 +000815,XSHE,*ST美利 +000816,XSHE,智慧农业 +000818,XSHE,方大化工 +000819,XSHE,岳阳兴长 +000820,XSHE,金城股份 +000821,XSHE,京山轻机 +000822,XSHE,山东海化 +000823,XSHE,超声电子 +000825,XSHE,太钢不锈 +000826,XSHE,启迪桑德 +000828,XSHE,东莞控股 +000829,XSHE,天音控股 +000830,XSHE,鲁西化工 +000831,XSHE,五矿稀土 +000833,XSHE,贵糖股份 +000835,XSHE,长城动漫 +000836,XSHE,鑫茂科技 +000837,XSHE,秦川机床 +000838,XSHE,财信发展 +000839,XSHE,中信国安 +000848,XSHE,承德露露 +000850,XSHE,华茂股份 +000851,XSHE,高鸿股份 +000852,XSHE,石化机械 +000856,XSHE,冀东装备 +000858,XSHE,五 粮 液 +000859,XSHE,国风塑业 +000860,XSHE,顺鑫农业 +000861,XSHE,海印股份 +000862,XSHE,银星能源 +000863,XSHE,三湘股份 +000868,XSHE,安凯客车 +000869,XSHE,张 裕A +000875,XSHE,吉电股份 +000876,XSHE,新 希 望 +000877,XSHE,天山股份 +000878,XSHE,云南铜业 +000880,XSHE,潍柴重机 +000881,XSHE,大连国际 +000882,XSHE,华联股份 +000883,XSHE,湖北能源 +000885,XSHE,同力水泥 +000886,XSHE,海南高速 +000887,XSHE,中鼎股份 +000888,XSHE,峨眉山A +000889,XSHE,茂业通信 +000890,XSHE,法 尔 胜 +000892,XSHE,*ST星美 +000893,XSHE,东凌粮油 +000895,XSHE,双汇发展 +000897,XSHE,津滨发展 +000898,XSHE,鞍钢股份 +000899,XSHE,赣能股份 +000900,XSHE,现代投资 +000901,XSHE,航天科技 +000902,XSHE,新洋丰 +000903,XSHE,云内动力 +000905,XSHE,厦门港务 +000906,XSHE,物产中拓 +000908,XSHE,景峰医药 +000909,XSHE,数源科技 +000910,XSHE,大亚科技 +000911,XSHE,南宁糖业 +000912,XSHE,*ST天化 +000913,XSHE,钱江摩托 +000915,XSHE,山大华特 +000916,XSHE,华北高速 +000917,XSHE,电广传媒 +000918,XSHE,嘉凯城 +000919,XSHE,金陵药业 +000920,XSHE,南方汇通 +000921,XSHE,海信科龙 +000922,XSHE,佳电股份 +000923,XSHE,河北宣工 +000925,XSHE,众合科技 +000926,XSHE,福星股份 +000927,XSHE,*ST夏利 +000928,XSHE,中钢国际 +000929,XSHE,兰州黄河 +000930,XSHE,中粮生化 +000931,XSHE,中 关 村 +000932,XSHE,华菱钢铁 +000933,XSHE,神火股份 +000935,XSHE,四川双马 +000936,XSHE,华西股份 +000937,XSHE,冀中能源 +000938,XSHE,紫光股份 +000939,XSHE,凯迪生态 +000948,XSHE,南天信息 +000949,XSHE,新乡化纤 +000950,XSHE,建峰化工 +000951,XSHE,中国重汽 +000952,XSHE,广济药业 +000953,XSHE,河池化工 +000955,XSHE,欣龙控股 +000957,XSHE,中通客车 +000958,XSHE,东方能源 +000959,XSHE,首钢股份 +000960,XSHE,锡业股份 +000961,XSHE,中南建设 +000962,XSHE,东方钽业 +000963,XSHE,华东医药 +000965,XSHE,天保基建 +000966,XSHE,长源电力 +000967,XSHE,上风高科 +000968,XSHE,煤 气 化 +000969,XSHE,安泰科技 +000970,XSHE,中科三环 +000971,XSHE,高升控股 +000972,XSHE,新中基 +000973,XSHE,佛塑科技 +000975,XSHE,银泰资源 +000976,XSHE,*ST春晖 +000977,XSHE,浪潮信息 +000978,XSHE,桂林旅游 +000979,XSHE,中弘股份 +000980,XSHE,金马股份 +000981,XSHE,银亿股份 +000982,XSHE,中银绒业 +000983,XSHE,西山煤电 +000985,XSHE,大庆华科 +000987,XSHE,广州友谊 +000988,XSHE,华工科技 +000989,XSHE,九 芝 堂 +000990,XSHE,诚志股份 +000993,XSHE,闽东电力 +000995,XSHE,*ST皇台 +000996,XSHE,中国中期 +000997,XSHE,新 大 陆 +000998,XSHE,隆平高科 +000999,XSHE,华润三九 +002001,XSHE,新 和 成 +002002,XSHE,鸿达兴业 +002003,XSHE,伟星股份 +002004,XSHE,华邦健康 +002005,XSHE,德豪润达 +002006,XSHE,精功科技 +002007,XSHE,华兰生物 +002008,XSHE,大族激光 +002009,XSHE,天奇股份 +002010,XSHE,传化股份 +002011,XSHE,盾安环境 +002012,XSHE,凯恩股份 +002013,XSHE,中航机电 +002014,XSHE,永新股份 +002015,XSHE,*ST霞客 +002016,XSHE,世荣兆业 +002017,XSHE,东信和平 +002018,XSHE,华信国际 +002019,XSHE,亿帆鑫富 +002020,XSHE,京新药业 +002021,XSHE,中捷资源 +002022,XSHE,科华生物 +002023,XSHE,海特高新 +002024,XSHE,苏宁云商 +002025,XSHE,航天电器 +002026,XSHE,山东威达 +002027,XSHE,七喜控股 +002028,XSHE,思源电气 +002029,XSHE,七 匹 狼 +002030,XSHE,达安基因 +002031,XSHE,巨轮智能 +002032,XSHE,苏 泊 尔 +002033,XSHE,丽江旅游 +002034,XSHE,美 欣 达 +002035,XSHE,华帝股份 +002036,XSHE,汉麻产业 +002037,XSHE,久联发展 +002038,XSHE,双鹭药业 +002039,XSHE,黔源电力 +002040,XSHE,南 京 港 +002041,XSHE,登海种业 +002042,XSHE,华孚色纺 +002043,XSHE,兔 宝 宝 +002044,XSHE,江苏三友 +002045,XSHE,国光电器 +002046,XSHE,轴研科技 +002047,XSHE,宝鹰股份 +002048,XSHE,宁波华翔 +002049,XSHE,同方国芯 +002050,XSHE,三花股份 +002051,XSHE,中工国际 +002052,XSHE,同洲电子 +002053,XSHE,云南盐化 +002054,XSHE,德美化工 +002055,XSHE,得润电子 +002056,XSHE,横店东磁 +002057,XSHE,中钢天源 +002058,XSHE,威 尔 泰 +002059,XSHE,云南旅游 +002060,XSHE,粤 水 电 +002061,XSHE,江山化工 +002062,XSHE,宏润建设 +002063,XSHE,远光软件 +002064,XSHE,华峰氨纶 +002065,XSHE,东华软件 +002066,XSHE,瑞泰科技 +002067,XSHE,景兴纸业 +002068,XSHE,黑猫股份 +002069,XSHE,獐 子 岛 +002070,XSHE,众和股份 +002071,XSHE,长城影视 +002072,XSHE,凯瑞德 +002073,XSHE,软控股份 +002074,XSHE,国轩高科 +002075,XSHE,沙钢股份 +002076,XSHE,雪 莱 特 +002077,XSHE,大港股份 +002078,XSHE,太阳纸业 +002079,XSHE,苏州固锝 +002080,XSHE,中材科技 +002081,XSHE,金 螳 螂 +002082,XSHE,栋梁新材 +002083,XSHE,孚日股份 +002084,XSHE,海鸥卫浴 +002085,XSHE,万丰奥威 +002086,XSHE,东方海洋 +002087,XSHE,新野纺织 +002088,XSHE,鲁阳节能 +002089,XSHE,新 海 宜 +002090,XSHE,金智科技 +002091,XSHE,江苏国泰 +002092,XSHE,中泰化学 +002093,XSHE,国脉科技 +002094,XSHE,青岛金王 +002095,XSHE,生 意 宝 +002096,XSHE,南岭民爆 +002097,XSHE,山河智能 +002098,XSHE,浔兴股份 +002099,XSHE,海翔药业 +002100,XSHE,天康生物 +002101,XSHE,广东鸿图 +002102,XSHE,冠福股份 +002103,XSHE,广博股份 +002104,XSHE,恒宝股份 +002105,XSHE,信隆实业 +002106,XSHE,莱宝高科 +002107,XSHE,沃华医药 +002108,XSHE,沧州明珠 +002109,XSHE,兴化股份 +002110,XSHE,三钢闽光 +002111,XSHE,威海广泰 +002112,XSHE,三变科技 +002113,XSHE,天润控股 +002114,XSHE,罗平锌电 +002115,XSHE,三维通信 +002116,XSHE,中国海诚 +002117,XSHE,东港股份 +002118,XSHE,紫鑫药业 +002119,XSHE,康强电子 +002120,XSHE,新海股份 +002121,XSHE,科陆电子 +002122,XSHE,天马股份 +002123,XSHE,荣信股份 +002124,XSHE,天邦股份 +002125,XSHE,湘潭电化 +002126,XSHE,银轮股份 +002127,XSHE,新民科技 +002128,XSHE,露天煤业 +002129,XSHE,中环股份 +002130,XSHE,沃尔核材 +002131,XSHE,利欧股份 +002132,XSHE,恒星科技 +002133,XSHE,广宇集团 +002134,XSHE,天津普林 +002135,XSHE,东南网架 +002136,XSHE,安 纳 达 +002137,XSHE,麦达数字 +002138,XSHE,顺络电子 +002139,XSHE,拓邦股份 +002140,XSHE,东华科技 +002141,XSHE,蓉胜超微 +002142,XSHE,宁波银行 +002143,XSHE,印纪传媒 +002144,XSHE,宏达高科 +002145,XSHE,中核钛白 +002146,XSHE,荣盛发展 +002147,XSHE,方圆支承 +002148,XSHE,北纬通信 +002149,XSHE,西部材料 +002150,XSHE,通润装备 +002151,XSHE,北斗星通 +002152,XSHE,广电运通 +002153,XSHE,石基信息 +002154,XSHE,报 喜 鸟 +002155,XSHE,湖南黄金 +002156,XSHE,通富微电 +002157,XSHE,正邦科技 +002158,XSHE,汉钟精机 +002159,XSHE,三特索道 +002160,XSHE,常铝股份 +002161,XSHE,远 望 谷 +002162,XSHE,悦心健康 +002163,XSHE,中航三鑫 +002164,XSHE,宁波东力 +002165,XSHE,红 宝 丽 +002166,XSHE,莱茵生物 +002167,XSHE,东方锆业 +002168,XSHE,深圳惠程 +002169,XSHE,智光电气 +002170,XSHE,芭田股份 +002171,XSHE,楚江新材 +002172,XSHE,澳洋科技 +002173,XSHE,千足珍珠 +002174,XSHE,游族网络 +002175,XSHE,东方网络 +002176,XSHE,江特电机 +002177,XSHE,御银股份 +002178,XSHE,延华智能 +002179,XSHE,中航光电 +002180,XSHE,艾派克 +002181,XSHE,粤 传 媒 +002182,XSHE,云海金属 +002183,XSHE,怡 亚 通 +002184,XSHE,海得控制 +002185,XSHE,华天科技 +002186,XSHE,全 聚 德 +002187,XSHE,广百股份 +002188,XSHE,新 嘉 联 +002189,XSHE,利达光电 +002190,XSHE,成飞集成 +002191,XSHE,劲嘉股份 +002192,XSHE,*ST融捷 +002193,XSHE,山东如意 +002194,XSHE,武汉凡谷 +002195,XSHE,二三四五 +002196,XSHE,方正电机 +002197,XSHE,证通电子 +002198,XSHE,嘉应制药 +002199,XSHE,东晶电子 +002200,XSHE,云投生态 +002201,XSHE,九鼎新材 +002202,XSHE,金风科技 +002203,XSHE,海亮股份 +002204,XSHE,大连重工 +002205,XSHE,国统股份 +002206,XSHE,海 利 得 +002207,XSHE,准油股份 +002208,XSHE,合肥城建 +002209,XSHE,达 意 隆 +002210,XSHE,飞马国际 +002211,XSHE,宏达新材 +002212,XSHE,南洋股份 +002213,XSHE,特 尔 佳 +002214,XSHE,大立科技 +002215,XSHE,诺 普 信 +002216,XSHE,三全食品 +002217,XSHE,合力泰 +002218,XSHE,拓日新能 +002219,XSHE,恒康医疗 +002220,XSHE,天宝股份 +002221,XSHE,东华能源 +002222,XSHE,福晶科技 +002223,XSHE,鱼跃医疗 +002224,XSHE,三 力 士 +002225,XSHE,濮耐股份 +002226,XSHE,江南化工 +002227,XSHE,奥 特 迅 +002228,XSHE,合兴包装 +002229,XSHE,鸿博股份 +002230,XSHE,科大讯飞 +002231,XSHE,奥维通信 +002232,XSHE,启明信息 +002233,XSHE,塔牌集团 +002234,XSHE,民和股份 +002235,XSHE,安妮股份 +002236,XSHE,大华股份 +002237,XSHE,恒邦股份 +002238,XSHE,天威视讯 +002239,XSHE,奥特佳 +002240,XSHE,威华股份 +002241,XSHE,歌尔声学 +002242,XSHE,九阳股份 +002243,XSHE,通产丽星 +002244,XSHE,滨江集团 +002245,XSHE,澳洋顺昌 +002246,XSHE,北化股份 +002247,XSHE,帝龙新材 +002248,XSHE,华东数控 +002249,XSHE,大洋电机 +002250,XSHE,联化科技 +002251,XSHE,步 步 高 +002252,XSHE,上海莱士 +002253,XSHE,川大智胜 +002254,XSHE,泰和新材 +002255,XSHE,海陆重工 +002256,XSHE,彩虹精化 +002258,XSHE,利尔化学 +002259,XSHE,升达林业 +002260,XSHE,德奥通航 +002261,XSHE,拓维信息 +002262,XSHE,恩华药业 +002263,XSHE,大 东 南 +002264,XSHE,新 华 都 +002265,XSHE,西仪股份 +002266,XSHE,浙富控股 +002267,XSHE,陕天然气 +002268,XSHE,卫 士 通 +002269,XSHE,美邦服饰 +002270,XSHE,法因数控 +002271,XSHE,东方雨虹 +002272,XSHE,川润股份 +002273,XSHE,水晶光电 +002274,XSHE,华昌化工 +002275,XSHE,桂林三金 +002276,XSHE,万马股份 +002277,XSHE,友阿股份 +002278,XSHE,神开股份 +002279,XSHE,久其软件 +002280,XSHE,联络互动 +002281,XSHE,光迅科技 +002282,XSHE,博深工具 +002283,XSHE,天润曲轴 +002284,XSHE,亚太股份 +002285,XSHE,世联行 +002286,XSHE,保龄宝 +002287,XSHE,奇正藏药 +002288,XSHE,超华科技 +002289,XSHE,宇顺电子 +002290,XSHE,禾盛新材 +002291,XSHE,星期六 +002292,XSHE,奥飞动漫 +002293,XSHE,罗莱生活 +002294,XSHE,信立泰 +002295,XSHE,精艺股份 +002296,XSHE,辉煌科技 +002297,XSHE,博云新材 +002298,XSHE,中电鑫龙 +002299,XSHE,圣农发展 +002300,XSHE,太阳电缆 +002301,XSHE,齐心集团 +002302,XSHE,西部建设 +002303,XSHE,美盈森 +002304,XSHE,洋河股份 +002305,XSHE,南国置业 +002306,XSHE,*ST云网 +002307,XSHE,北新路桥 +002308,XSHE,威创股份 +002309,XSHE,中利科技 +002310,XSHE,东方园林 +002311,XSHE,海大集团 +002312,XSHE,三泰控股 +002313,XSHE,日海通讯 +002314,XSHE,南山控股 +002315,XSHE,焦点科技 +002316,XSHE,键桥通讯 +002317,XSHE,众生药业 +002318,XSHE,久立特材 +002319,XSHE,乐通股份 +002320,XSHE,海峡股份 +002321,XSHE,华英农业 +002322,XSHE,理工监测 +002323,XSHE,雅百特 +002324,XSHE,普利特 +002325,XSHE,洪涛股份 +002326,XSHE,永太科技 +002327,XSHE,富安娜 +002328,XSHE,新朋股份 +002329,XSHE,皇氏集团 +002330,XSHE,得利斯 +002331,XSHE,皖通科技 +002332,XSHE,仙琚制药 +002333,XSHE,罗普斯金 +002334,XSHE,英威腾 +002335,XSHE,科华恒盛 +002336,XSHE,人人乐 +002337,XSHE,赛象科技 +002338,XSHE,奥普光电 +002339,XSHE,积成电子 +002340,XSHE,格林美 +002341,XSHE,新纶科技 +002342,XSHE,巨力索具 +002343,XSHE,禾欣股份 +002344,XSHE,海宁皮城 +002345,XSHE,潮宏基 +002346,XSHE,柘中股份 +002347,XSHE,泰尔重工 +002348,XSHE,高乐股份 +002349,XSHE,精华制药 +002350,XSHE,北京科锐 +002351,XSHE,漫步者 +002352,XSHE,鼎泰新材 +002353,XSHE,杰瑞股份 +002354,XSHE,天神娱乐 +002355,XSHE,兴民钢圈 +002356,XSHE,浩宁达 +002357,XSHE,富临运业 +002358,XSHE,森源电气 +002359,XSHE,齐星铁塔 +002360,XSHE,同德化工 +002361,XSHE,神剑股份 +002362,XSHE,汉王科技 +002363,XSHE,隆基机械 +002364,XSHE,中恒电气 +002365,XSHE,永安药业 +002366,XSHE,台海核电 +002367,XSHE,康力电梯 +002368,XSHE,太极股份 +002369,XSHE,卓翼科技 +002370,XSHE,亚太药业 +002371,XSHE,七星电子 +002372,XSHE,伟星新材 +002373,XSHE,千方科技 +002374,XSHE,丽鹏股份 +002375,XSHE,亚厦股份 +002376,XSHE,新北洋 +002377,XSHE,国创高新 +002378,XSHE,章源钨业 +002379,XSHE,鲁丰环保 +002380,XSHE,科远股份 +002381,XSHE,双箭股份 +002382,XSHE,蓝帆医疗 +002383,XSHE,合众思壮 +002384,XSHE,东山精密 +002385,XSHE,大北农 +002386,XSHE,天原集团 +002387,XSHE,黑牛食品 +002388,XSHE,新亚制程 +002389,XSHE,南洋科技 +002390,XSHE,信邦制药 +002391,XSHE,长青股份 +002392,XSHE,北京利尔 +002393,XSHE,力生制药 +002394,XSHE,联发股份 +002395,XSHE,双象股份 +002396,XSHE,星网锐捷 +002397,XSHE,梦洁家纺 +002398,XSHE,建研集团 +002399,XSHE,海普瑞 +002400,XSHE,省广股份 +002401,XSHE,中海科技 +002402,XSHE,和而泰 +002403,XSHE,爱仕达 +002404,XSHE,嘉欣丝绸 +002405,XSHE,四维图新 +002406,XSHE,远东传动 +002407,XSHE,多氟多 +002408,XSHE,齐翔腾达 +002409,XSHE,雅克科技 +002410,XSHE,广联达 +002411,XSHE,九九久 +002412,XSHE,汉森制药 +002413,XSHE,雷科防务 +002414,XSHE,高德红外 +002415,XSHE,海康威视 +002416,XSHE,爱施德 +002417,XSHE,*ST元达 +002418,XSHE,康盛股份 +002419,XSHE,天虹商场 +002420,XSHE,毅昌股份 +002421,XSHE,达实智能 +002422,XSHE,科伦药业 +002423,XSHE,中原特钢 +002424,XSHE,贵州百灵 +002425,XSHE,凯撒股份 +002426,XSHE,胜利精密 +002427,XSHE,尤夫股份 +002428,XSHE,云南锗业 +002429,XSHE,兆驰股份 +002430,XSHE,杭氧股份 +002431,XSHE,棕榈园林 +002432,XSHE,九安医疗 +002433,XSHE,太安堂 +002434,XSHE,万里扬 +002435,XSHE,长江润发 +002436,XSHE,兴森科技 +002437,XSHE,誉衡药业 +002438,XSHE,江苏神通 +002439,XSHE,启明星辰 +002440,XSHE,闰土股份 +002441,XSHE,众业达 +002442,XSHE,龙星化工 +002443,XSHE,金洲管道 +002444,XSHE,巨星科技 +002445,XSHE,中南重工 +002446,XSHE,盛路通信 +002447,XSHE,壹桥海参 +002448,XSHE,中原内配 +002449,XSHE,国星光电 +002450,XSHE,康得新 +002451,XSHE,摩恩电气 +002452,XSHE,长高集团 +002453,XSHE,天马精化 +002454,XSHE,松芝股份 +002455,XSHE,百川股份 +002456,XSHE,欧菲光 +002457,XSHE,青龙管业 +002458,XSHE,益生股份 +002459,XSHE,天业通联 +002460,XSHE,赣锋锂业 +002461,XSHE,珠江啤酒 +002462,XSHE,嘉事堂 +002463,XSHE,沪电股份 +002464,XSHE,金利科技 +002465,XSHE,海格通信 +002466,XSHE,天齐锂业 +002467,XSHE,二六三 +002468,XSHE,艾迪西 +002469,XSHE,三维工程 +002470,XSHE,金正大 +002471,XSHE,中超控股 +002472,XSHE,双环传动 +002473,XSHE,圣莱达 +002474,XSHE,榕基软件 +002475,XSHE,立讯精密 +002476,XSHE,宝莫股份 +002477,XSHE,雏鹰农牧 +002478,XSHE,常宝股份 +002479,XSHE,富春环保 +002480,XSHE,新筑股份 +002481,XSHE,双塔食品 +002482,XSHE,广田股份 +002483,XSHE,润邦股份 +002484,XSHE,江海股份 +002485,XSHE,希努尔 +002486,XSHE,嘉麟杰 +002487,XSHE,大金重工 +002488,XSHE,金固股份 +002489,XSHE,浙江永强 +002490,XSHE,山东墨龙 +002491,XSHE,通鼎互联 +002492,XSHE,恒基达鑫 +002493,XSHE,荣盛石化 +002494,XSHE,华斯股份 +002495,XSHE,佳隆股份 +002496,XSHE,辉丰股份 +002497,XSHE,雅化集团 +002498,XSHE,汉缆股份 +002499,XSHE,科林环保 +002500,XSHE,山西证券 +002501,XSHE,利源精制 +002502,XSHE,骅威股份 +002503,XSHE,搜于特 +002504,XSHE,弘高创意 +002505,XSHE,大康牧业 +002506,XSHE,协鑫集成 +002507,XSHE,涪陵榨菜 +002508,XSHE,老板电器 +002509,XSHE,天广消防 +002510,XSHE,天汽模 +002511,XSHE,中顺洁柔 +002512,XSHE,达华智能 +002513,XSHE,蓝丰生化 +002514,XSHE,宝馨科技 +002515,XSHE,金字火腿 +002516,XSHE,旷达科技 +002517,XSHE,泰亚股份 +002518,XSHE,科士达 +002519,XSHE,银河电子 +002520,XSHE,日发精机 +002521,XSHE,齐峰新材 +002522,XSHE,浙江众成 +002523,XSHE,天桥起重 +002524,XSHE,光正集团 +002526,XSHE,山东矿机 +002527,XSHE,新时达 +002528,XSHE,英飞拓 +002529,XSHE,海源机械 +002530,XSHE,丰东股份 +002531,XSHE,天顺风能 +002532,XSHE,新界泵业 +002533,XSHE,金杯电工 +002534,XSHE,杭锅股份 +002535,XSHE,林州重机 +002536,XSHE,西泵股份 +002537,XSHE,海立美达 +002538,XSHE,司尔特 +002539,XSHE,新都化工 +002540,XSHE,亚太科技 +002541,XSHE,鸿路钢构 +002542,XSHE,中化岩土 +002543,XSHE,万和电气 +002544,XSHE,杰赛科技 +002545,XSHE,东方铁塔 +002546,XSHE,新联电子 +002547,XSHE,春兴精工 +002548,XSHE,金新农 +002549,XSHE,凯美特气 +002550,XSHE,千红制药 +002551,XSHE,尚荣医疗 +002552,XSHE,宝鼎重工 +002553,XSHE,南方轴承 +002554,XSHE,惠博普 +002555,XSHE,顺荣三七 +002556,XSHE,辉隆股份 +002557,XSHE,洽洽食品 +002558,XSHE,世纪游轮 +002559,XSHE,亚威股份 +002560,XSHE,通达股份 +002561,XSHE,徐家汇 +002562,XSHE,兄弟科技 +002563,XSHE,森马服饰 +002564,XSHE,天沃科技 +002565,XSHE,上海绿新 +002566,XSHE,益盛药业 +002567,XSHE,唐人神 +002568,XSHE,百润股份 +002569,XSHE,步森股份 +002570,XSHE,贝因美 +002571,XSHE,德力股份 +002572,XSHE,索菲亚 +002573,XSHE,清新环境 +002574,XSHE,明牌珠宝 +002575,XSHE,群兴玩具 +002576,XSHE,通达动力 +002577,XSHE,雷柏科技 +002578,XSHE,闽发铝业 +002579,XSHE,中京电子 +002580,XSHE,圣阳股份 +002581,XSHE,未名医药 +002582,XSHE,好想你 +002583,XSHE,海能达 +002584,XSHE,西陇科学 +002585,XSHE,双星新材 +002586,XSHE,围海股份 +002587,XSHE,奥拓电子 +002588,XSHE,史丹利 +002589,XSHE,瑞康医药 +002590,XSHE,万安科技 +002591,XSHE,恒大高新 +002592,XSHE,八菱科技 +002593,XSHE,日上集团 +002594,XSHE,比亚迪 +002595,XSHE,豪迈科技 +002596,XSHE,海南瑞泽 +002597,XSHE,金禾实业 +002598,XSHE,山东章鼓 +002599,XSHE,盛通股份 +002600,XSHE,江粉磁材 +002601,XSHE,佰利联 +002602,XSHE,世纪华通 +002603,XSHE,以岭药业 +002604,XSHE,龙力生物 +002605,XSHE,姚记扑克 +002606,XSHE,大连电瓷 +002607,XSHE,亚夏汽车 +002608,XSHE,*ST舜船 +002609,XSHE,捷顺科技 +002610,XSHE,爱康科技 +002611,XSHE,东方精工 +002612,XSHE,朗姿股份 +002613,XSHE,北玻股份 +002614,XSHE,蒙发利 +002615,XSHE,哈尔斯 +002616,XSHE,长青集团 +002617,XSHE,露笑科技 +002618,XSHE,丹邦科技 +002619,XSHE,巨龙管业 +002620,XSHE,瑞和股份 +002621,XSHE,三垒股份 +002622,XSHE,永大集团 +002623,XSHE,亚玛顿 +002624,XSHE,完美环球 +002625,XSHE,龙生股份 +002626,XSHE,金达威 +002627,XSHE,宜昌交运 +002628,XSHE,成都路桥 +002629,XSHE,仁智油服 +002630,XSHE,华西能源 +002631,XSHE,德尔未来 +002632,XSHE,道明光学 +002633,XSHE,*ST申科 +002634,XSHE,棒杰股份 +002635,XSHE,安洁科技 +002636,XSHE,金安国纪 +002637,XSHE,赞宇科技 +002638,XSHE,勤上光电 +002639,XSHE,雪人股份 +002640,XSHE,跨境通 +002641,XSHE,永高股份 +002642,XSHE,荣之联 +002643,XSHE,万润股份 +002644,XSHE,佛慈制药 +002645,XSHE,华宏科技 +002646,XSHE,青青稞酒 +002647,XSHE,宏磊股份 +002648,XSHE,卫星石化 +002649,XSHE,博彦科技 +002650,XSHE,加加食品 +002651,XSHE,利君股份 +002652,XSHE,扬子新材 +002653,XSHE,海思科 +002654,XSHE,万润科技 +002655,XSHE,共达电声 +002656,XSHE,卡奴迪路 +002657,XSHE,中科金财 +002658,XSHE,雪迪龙 +002659,XSHE,中泰桥梁 +002660,XSHE,茂硕电源 +002661,XSHE,克明面业 +002662,XSHE,京威股份 +002663,XSHE,普邦园林 +002664,XSHE,信质电机 +002665,XSHE,首航节能 +002666,XSHE,德联集团 +002667,XSHE,鞍重股份 +002668,XSHE,奥马电器 +002669,XSHE,康达新材 +002670,XSHE,华声股份 +002671,XSHE,龙泉股份 +002672,XSHE,东江环保 +002673,XSHE,西部证券 +002674,XSHE,兴业科技 +002675,XSHE,东诚药业 +002676,XSHE,顺威股份 +002677,XSHE,浙江美大 +002678,XSHE,珠江钢琴 +002679,XSHE,福建金森 +002680,XSHE,黄海机械 +002681,XSHE,奋达科技 +002682,XSHE,龙洲股份 +002683,XSHE,宏大爆破 +002684,XSHE,猛狮科技 +002685,XSHE,华东重机 +002686,XSHE,亿利达 +002687,XSHE,乔治白 +002688,XSHE,金河生物 +002689,XSHE,远大智能 +002690,XSHE,美亚光电 +002691,XSHE,冀凯股份 +002692,XSHE,远程电缆 +002693,XSHE,双成药业 +002694,XSHE,顾地科技 +002695,XSHE,煌上煌 +002696,XSHE,百洋股份 +002697,XSHE,红旗连锁 +002698,XSHE,博实股份 +002699,XSHE,美盛文化 +002700,XSHE,新疆浩源 +002701,XSHE,奥瑞金 +002702,XSHE,海欣食品 +002703,XSHE,浙江世宝 +002705,XSHE,新宝股份 +002706,XSHE,良信电器 +002707,XSHE,众信旅游 +002708,XSHE,光洋股份 +002709,XSHE,天赐材料 +002711,XSHE,欧浦智网 +002712,XSHE,思美传媒 +002713,XSHE,东易日盛 +002714,XSHE,牧原股份 +002715,XSHE,登云股份 +002716,XSHE,金贵银业 +002717,XSHE,岭南园林 +002718,XSHE,友邦吊顶 +002719,XSHE,麦趣尔 +002721,XSHE,金一文化 +002722,XSHE,金轮股份 +002723,XSHE,金莱特 +002724,XSHE,海洋王 +002725,XSHE,跃岭股份 +002726,XSHE,龙大肉食 +002727,XSHE,一心堂 +002728,XSHE,台城制药 +002729,XSHE,好利来 +002730,XSHE,电光科技 +002731,XSHE,萃华珠宝 +002732,XSHE,燕塘乳业 +002733,XSHE,雄韬股份 +002734,XSHE,利民股份 +002735,XSHE,王子新材 +002736,XSHE,国信证券 +002737,XSHE,葵花药业 +002738,XSHE,中矿资源 +002739,XSHE,万达院线 +002740,XSHE,爱迪尔 +002741,XSHE,光华科技 +002742,XSHE,三圣特材 +002743,XSHE,富煌钢构 +002745,XSHE,木林森 +002746,XSHE,仙坛股份 +002747,XSHE,埃斯顿 +002748,XSHE,世龙实业 +002749,XSHE,国光股份 +002750,XSHE,龙津药业 +002751,XSHE,易尚展示 +002752,XSHE,昇兴股份 +002753,XSHE,永东股份 +002755,XSHE,东方新星 +002756,XSHE,永兴特钢 +002757,XSHE,南兴装备 +002758,XSHE,华通医药 +002759,XSHE,天际股份 +002760,XSHE,凤形股份 +002761,XSHE,多喜爱 +002762,XSHE,金发拉比 +002763,XSHE,汇洁股份 +002765,XSHE,蓝黛传动 +002766,XSHE,索菱股份 +002767,XSHE,先锋电子 +002768,XSHE,国恩股份 +002769,XSHE,普路通 +002770,XSHE,科迪乳业 +002771,XSHE,真视通 +002772,XSHE,众兴菌业 +002773,XSHE,康弘药业 +002775,XSHE,文科园林 +002776,XSHE,柏堡龙 +002779,XSHE,中坚科技 +002780,XSHE,三夫户外 +002783,XSHE,凯龙股份 +150008,XSHE,瑞和小康 +150009,XSHE,瑞和远见 +150013,XSHE,中证100B +150017,XSHE,合润B +150018,XSHE,银华稳进 +150019,XSHE,银华锐进 +150021,XSHE,汇利B +150023,XSHE,深成指B +150027,XSHE, +150028,XSHE,中证500A +150029,XSHE,中证500B +150030,XSHE,中证90A +150031,XSHE,中证90B +150032,XSHE,多利优先 +150033,XSHE,多利进取 +150034,XSHE,聚利A +150035,XSHE,聚利B +150036,XSHE,建信稳健 +150037,XSHE,建信进取 +150039,XSHE,鼎利A +150040,XSHE,鼎利B +150042,XSHE,利鑫B +150047,XSHE,消费A +150048,XSHE,消费B +150049,XSHE,消费收益 +150050,XSHE,消费进取 +150051,XSHE,沪深300A +150052,XSHE,沪深300B +150053,XSHE,泰达500A +150054,XSHE,泰达500B +150055,XSHE,500A +150056,XSHE,500B +150057,XSHE,中小300A +150058,XSHE,中小300B +150059,XSHE,资源A级 +150060,XSHE,资源B级 +150064,XSHE,同瑞A +150065,XSHE,同瑞B +150066,XSHE,互利A +150067,XSHE,互利B +150073,XSHE,诺安稳健 +150075,XSHE,诺安进取 +150076,XSHE,浙商稳健 +150077,XSHE,浙商进取 +150083,XSHE,深证100A +150084,XSHE,深证100B +150085,XSHE,中小板A +150086,XSHE,中小板B +150088,XSHE,金鹰500A +150089,XSHE,金鹰500B +150090,XSHE,成长A +150091,XSHE,成长B +150092,XSHE,诺德300A +150093,XSHE,诺德300B +150094,XSHE,泰信400A +150095,XSHE,泰信400B +150096,XSHE,商品A +150097,XSHE,商品B +150100,XSHE,资源A +150101,XSHE,资源B +150102,XSHE,利众B +150104,XSHE,HS300A +150105,XSHE,HS300B +150106,XSHE,中小A +150107,XSHE,中小B +150108,XSHE,同辉100A +150109,XSHE,同辉100B +150112,XSHE,深100A +150113,XSHE,深100B +150114,XSHE,惠裕B +150117,XSHE,房地产A +150118,XSHE,房地产B +150120,XSHE,鼎利进取 +150121,XSHE,银河优先 +150122,XSHE,银河进取 +150123,XSHE,建信50A +150124,XSHE,建信50B +150128,XSHE,工银增B +150129,XSHE,丰利债B +150130,XSHE,医药A +150131,XSHE,医药B +150133,XSHE,德信A +150134,XSHE,德信B +150135,XSHE,国富100A +150136,XSHE,国富100B +150138,XSHE,中证800A +150139,XSHE,中证800B +150140,XSHE,国金300A +150141,XSHE,国金300B +150142,XSHE,互利债B +150143,XSHE,转债A级 +150144,XSHE,转债B级 +150145,XSHE,高贝塔A +150146,XSHE,高贝塔B +150147,XSHE,同利B +150148,XSHE,医药800A +150149,XSHE,医药800B +150150,XSHE,有色800A +150151,XSHE,有色800B +150152,XSHE,创业板A +150153,XSHE,创业板B +150154,XSHE,惠丰B +150156,XSHE,中银互B +150157,XSHE,金融A +150158,XSHE,金融B +150160,XSHE,通福B +150161,XSHE,惠鑫B +150164,XSHE,可转债A +150165,XSHE,可转债B +150167,XSHE,银华300A +150168,XSHE,银华300B +150169,XSHE,恒生A +150170,XSHE,恒生B +150171,XSHE,证券A +150172,XSHE,证券B +150173,XSHE,TMT中证A +150174,XSHE,TMT中证B +150175,XSHE,H股A +150176,XSHE,H股B +150177,XSHE,证保A +150178,XSHE,证保B +150179,XSHE,信息A +150180,XSHE,信息B +150181,XSHE,军工A +150182,XSHE,军工B +150184,XSHE,环保A +150185,XSHE,环保B +150186,XSHE,军工A级 +150187,XSHE,军工B级 +150188,XSHE,转债优先 +150189,XSHE,转债进取 +150190,XSHE,NCF环保A +150191,XSHE,NCF环保B +150192,XSHE,地产A +150193,XSHE,地产B +150194,XSHE,互联网A +150195,XSHE,互联网B +150196,XSHE,有色A +150197,XSHE,有色B +150198,XSHE,食品A +150199,XSHE,食品B +150200,XSHE,券商A +150201,XSHE,券商B +150203,XSHE,传媒A +150204,XSHE,传媒B +150205,XSHE,国防A +150206,XSHE,国防B +150207,XSHE,地产A端 +150208,XSHE,地产B端 +150209,XSHE,国企改A +150210,XSHE,国企改B +150211,XSHE,新能车A +150212,XSHE,新能车B +150213,XSHE,成长A级 +150214,XSHE,成长B级 +150215,XSHE,TMTA +150216,XSHE,TMTB +150217,XSHE,新能源A +150218,XSHE,新能源B +150219,XSHE,健康A +150220,XSHE,健康B +150221,XSHE,中航军A +150222,XSHE,中航军B +150223,XSHE,证券A级 +150224,XSHE,证券B级 +150225,XSHE,证保A级 +150226,XSHE,证保B级 +150227,XSHE,银行A +150228,XSHE,银行B +150229,XSHE,酒A +150230,XSHE,酒B +150231,XSHE,电子A +150232,XSHE,电子B +150233,XSHE,传媒业A +150234,XSHE,传媒业B +150235,XSHE,券商A级 +150236,XSHE,券商B级 +150237,XSHE,环保A级 +150238,XSHE,环保B级 +150241,XSHE,银行A级 +150242,XSHE,银行B级 +150243,XSHE,创业A +150244,XSHE,创业B +150245,XSHE,互联A +150246,XSHE,互联B +150247,XSHE,传媒A级 +150248,XSHE,传媒B级 +150249,XSHE,银行A端 +150250,XSHE,银行B端 +150251,XSHE,煤炭A +150252,XSHE,煤炭B +150255,XSHE,银行业A +150256,XSHE,银行业B +150257,XSHE,生物A +150258,XSHE,生物B +150259,XSHE,重组A +150260,XSHE,重组B +150261,XSHE,医疗A +150262,XSHE,医疗B +150263,XSHE,1000A +150264,XSHE,1000B +150265,XSHE,一带A +150266,XSHE,一带B +150267,XSHE,银行A类 +150268,XSHE,银行B类 +150269,XSHE,白酒A +150270,XSHE,白酒B +150271,XSHE,生物药A +150272,XSHE,生物药B +150273,XSHE,带路A +150274,XSHE,带路B +150275,XSHE,一带一A +150276,XSHE,一带一B +150277,XSHE,高铁A +150278,XSHE,高铁B +150279,XSHE,新能A +150280,XSHE,新能B +150281,XSHE,金融地A +150282,XSHE,金融地B +150283,XSHE,SW医药A +150284,XSHE,SW医药B +150287,XSHE,钢铁A +150288,XSHE,钢铁B +150289,XSHE,煤炭A级 +150290,XSHE,煤炭B级 +150291,XSHE,银行A份 +150292,XSHE,银行B份 +150293,XSHE,高铁A级 +150294,XSHE,高铁B级 +150295,XSHE,改革A +150296,XSHE,改革B +150297,XSHE,互联A级 +150298,XSHE,互联B级 +150299,XSHE,银行股A +150300,XSHE,银行股B +150301,XSHE,证券股A +150302,XSHE,证券股B +150303,XSHE,创业股A +150304,XSHE,创业股B +150305,XSHE,养老A +150306,XSHE,养老B +150307,XSHE,体育A +150308,XSHE,体育B +150309,XSHE,信息安A +150310,XSHE,信息安B +150311,XSHE,智能A +150312,XSHE,智能B +150315,XSHE,工业4A +150316,XSHE,工业4B +150317,XSHE,E金融A +150318,XSHE,E金融B +150321,XSHE,煤炭A基 +150322,XSHE,煤炭B基 +150323,XSHE,环保A端 +150324,XSHE,环保B端 +150325,XSHE,高铁A端 +150326,XSHE,高铁B端 +150327,XSHE,新能A级 +150328,XSHE,新能B级 +150329,XSHE,保险A +150330,XSHE,保险B +150331,XSHE,网金融A +150332,XSHE,网金融B +150335,XSHE,军工股A +150336,XSHE,军工股B +150343,XSHE,证券A基 +150344,XSHE,证券B基 +160105,XSHE,南方积配 +160106,XSHE,南方高增 +160119,XSHE,南方500 +160123,XSHE,南方50债 +160125,XSHE,南方香港 +160127,XSHE,南方消费 +160128,XSHE,南方金利 +160130,XSHE,南方永利 +160131,XSHE,南方聚利 +160133,XSHE,南方天元 +160135,XSHE,高铁基金 +160136,XSHE,改革基金 +160137,XSHE,互联基金 +160211,XSHE,国泰小盘 +160212,XSHE,国泰估值 +160215,XSHE,国泰价值 +160216,XSHE,国泰商品 +160217,XSHE,国泰互利 +160218,XSHE,国泰地产 +160219,XSHE,国泰医药 +160220,XSHE,国泰民益 +160221,XSHE,国泰有色 +160222,XSHE,国泰食品 +160224,XSHE,国泰TMT +160225,XSHE,新汽车 +160311,XSHE,华夏蓝筹 +160314,XSHE,华夏行业 +160415,XSHE,华安S300 +160416,XSHE,华安石油 +160417,XSHE,华安300 +160418,XSHE,银行股基 +160419,XSHE,证券股基 +160420,XSHE,创业50 +160505,XSHE,博时主题 +160512,XSHE,博时卓越 +160513,XSHE,稳健债A +160515,XSHE,安丰18 +160516,XSHE,博时证保 +160517,XSHE,博时银行 +160603,XSHE,鹏华收益 +160605,XSHE,鹏华50 +160607,XSHE,鹏华价值 +160610,XSHE,鹏华动力 +160611,XSHE,鹏华治理 +160613,XSHE,鹏华创新 +160615,XSHE,鹏华300 +160616,XSHE,鹏华500 +160617,XSHE,鹏华丰润 +160618,XSHE,鹏华丰泽 +160620,XSHE,资源分级 +160621,XSHE,鹏华丰和 +160624,XSHE,鹏华领先 +160625,XSHE,证保分级 +160626,XSHE,信息分级 +160627,XSHE,鹏华策略 +160628,XSHE,房地产 +160629,XSHE,传媒分级 +160630,XSHE,国防分级 +160631,XSHE,银行指基 +160632,XSHE,酒分级 +160633,XSHE,券商指基 +160634,XSHE,环保分级 +160635,XSHE,医药分级 +160636,XSHE,互联网 +160637,XSHE,创业指基 +160638,XSHE,带路分级 +160639,XSHE,高铁分级 +160640,XSHE,新能源 +160706,XSHE,嘉实 300 +160716,XSHE,嘉实50 +160717,XSHE,恒生H股 +160718,XSHE,嘉实多利 +160719,XSHE,嘉实黄金 +160720,XSHE,中期企债 +160805,XSHE,长盛同智 +160806,XSHE,长盛同庆 +160807,XSHE,长盛300 +160808,XSHE,长盛同瑞 +160809,XSHE,长盛同辉 +160810,XSHE,长盛同丰 +160812,XSHE,长盛同益 +160813,XSHE,长盛同盛 +160814,XSHE,金融地产 +160910,XSHE,大成创新 +160915,XSHE,大成景丰 +160916,XSHE,优选LOF +160918,XSHE,大成小盘 +160919,XSHE,大成产业 +300001,XSHE,特锐德 +300002,XSHE,神州泰岳 +300003,XSHE,乐普医疗 +300004,XSHE,南风股份 +300005,XSHE,探路者 +300006,XSHE,莱美药业 +300007,XSHE,汉威电子 +300008,XSHE,上海佳豪 +300009,XSHE,安科生物 +300010,XSHE,立思辰 +300011,XSHE,鼎汉技术 +300012,XSHE,华测检测 +300013,XSHE,新宁物流 +300014,XSHE,亿纬锂能 +300015,XSHE,爱尔眼科 +300016,XSHE,北陆药业 +300017,XSHE,网宿科技 +300018,XSHE,中元华电 +300019,XSHE,硅宝科技 +300020,XSHE,银江股份 +300021,XSHE,大禹节水 +300022,XSHE,吉峰农机 +300023,XSHE,宝德股份 +300024,XSHE,机器人 +300025,XSHE,华星创业 +300026,XSHE,红日药业 +300027,XSHE,华谊兄弟 +300028,XSHE,金亚科技 +300029,XSHE,天龙光电 +300030,XSHE,阳普医疗 +300031,XSHE,宝通科技 +300032,XSHE,金龙机电 +300033,XSHE,同花顺 +300034,XSHE,钢研高纳 +300035,XSHE,中科电气 +300036,XSHE,超图软件 +300037,XSHE,新宙邦 +300038,XSHE,梅泰诺 +300039,XSHE,上海凯宝 +300040,XSHE,九洲电气 +300041,XSHE,回天新材 +300042,XSHE,朗科科技 +300043,XSHE,互动娱乐 +300044,XSHE,赛为智能 +300045,XSHE,华力创通 +300046,XSHE,台基股份 +300047,XSHE,天源迪科 +300048,XSHE,合康变频 +300049,XSHE,福瑞股份 +300050,XSHE,世纪鼎利 +300051,XSHE,三五互联 +300052,XSHE,中青宝 +300053,XSHE,欧比特 +300054,XSHE,鼎龙股份 +300055,XSHE,万邦达 +300056,XSHE,三维丝 +300057,XSHE,万顺股份 +300058,XSHE,蓝色光标 +300059,XSHE,东方财富 +300061,XSHE,康耐特 +300062,XSHE,中能电气 +300063,XSHE,天龙集团 +300064,XSHE,豫金刚石 +300065,XSHE,海兰信 +300066,XSHE,三川股份 +300067,XSHE,安诺其 +300068,XSHE,南都电源 +300069,XSHE,金利华电 +300070,XSHE,碧水源 +300071,XSHE,华谊嘉信 +300072,XSHE,三聚环保 +300073,XSHE,当升科技 +300074,XSHE,华平股份 +300075,XSHE,数字政通 +300076,XSHE,GQY视讯 +300077,XSHE,国民技术 +300078,XSHE,思创医惠 +300079,XSHE,数码视讯 +300080,XSHE,易成新能 +300081,XSHE,恒信移动 +300082,XSHE,奥克股份 +300083,XSHE,劲胜精密 +300084,XSHE,海默科技 +300085,XSHE,银之杰 +300086,XSHE,康芝药业 +300087,XSHE,荃银高科 +300088,XSHE,长信科技 +300089,XSHE,文化长城 +300090,XSHE,盛运环保 +300091,XSHE,金通灵 +300092,XSHE,科新机电 +300093,XSHE,金刚玻璃 +300094,XSHE,国联水产 +300095,XSHE,华伍股份 +300096,XSHE,易联众 +300097,XSHE,智云股份 +300098,XSHE,高新兴 +300099,XSHE,尤洛卡 +300100,XSHE,双林股份 +300101,XSHE,振芯科技 +300102,XSHE,乾照光电 +300103,XSHE,达刚路机 +300104,XSHE,乐视网 +300105,XSHE,龙源技术 +300106,XSHE,西部牧业 +300107,XSHE,建新股份 +300108,XSHE,双龙股份 +300109,XSHE,新开源 +300110,XSHE,华仁药业 +300111,XSHE,向日葵 +300112,XSHE,万讯自控 +300113,XSHE,顺网科技 +300114,XSHE,中航电测 +300115,XSHE,长盈精密 +300116,XSHE,坚瑞消防 +300117,XSHE,嘉寓股份 +300118,XSHE,东方日升 +300119,XSHE,瑞普生物 +300120,XSHE,经纬电材 +300121,XSHE,阳谷华泰 +300122,XSHE,智飞生物 +300123,XSHE,太阳鸟 +300124,XSHE,汇川技术 +300125,XSHE,易世达 +300126,XSHE,锐奇股份 +300127,XSHE,银河磁体 +300128,XSHE,锦富新材 +300129,XSHE,泰胜风能 +300130,XSHE,新国都 +300131,XSHE,英唐智控 +300132,XSHE,青松股份 +300133,XSHE,华策影视 +300134,XSHE,大富科技 +300135,XSHE,宝利国际 +300136,XSHE,信维通信 +300137,XSHE,先河环保 +300138,XSHE,晨光生物 +300139,XSHE,晓程科技 +300140,XSHE,启源装备 +300141,XSHE,和顺电气 +300142,XSHE,沃森生物 +300143,XSHE,星河生物 +300144,XSHE,宋城演艺 +300145,XSHE,南方泵业 +300146,XSHE,汤臣倍健 +300147,XSHE,香雪制药 +300148,XSHE,天舟文化 +300149,XSHE,量子高科 +300150,XSHE,世纪瑞尔 +300151,XSHE,昌红科技 +300152,XSHE,科融环境 +300153,XSHE,科泰电源 +300154,XSHE,瑞凌股份 +300155,XSHE,安居宝 +300156,XSHE,神雾环保 +300157,XSHE,恒泰艾普 +300158,XSHE,振东制药 +300159,XSHE,新研股份 +300160,XSHE,秀强股份 +300161,XSHE,华中数控 +300162,XSHE,雷曼股份 +300163,XSHE,先锋新材 +300164,XSHE,通源石油 +300165,XSHE,天瑞仪器 +300166,XSHE,东方国信 +300167,XSHE,迪威视讯 +300168,XSHE,万达信息 +300169,XSHE,天晟新材 +300170,XSHE,汉得信息 +300171,XSHE,东富龙 +300172,XSHE,中电环保 +300173,XSHE,智慧松德 +300174,XSHE,元力股份 +300175,XSHE,朗源股份 +300176,XSHE,鸿特精密 +300177,XSHE,中海达 +300178,XSHE,腾邦国际 +300179,XSHE,四方达 +300180,XSHE,华峰超纤 +300181,XSHE,佐力药业 +300182,XSHE,捷成股份 +300183,XSHE,东软载波 +300184,XSHE,力源信息 +300185,XSHE,通裕重工 +300187,XSHE,永清环保 +300188,XSHE,美亚柏科 +300189,XSHE,神农基因 +300190,XSHE,维尔利 +300191,XSHE,潜能恒信 +300192,XSHE,科斯伍德 +300193,XSHE,佳士科技 +300194,XSHE,福安药业 +300195,XSHE,长荣股份 +300196,XSHE,长海股份 +300197,XSHE,铁汉生态 +300198,XSHE,纳川股份 +300199,XSHE,翰宇药业 +300200,XSHE,高盟新材 +300201,XSHE,海伦哲 +300202,XSHE,聚龙股份 +300203,XSHE,聚光科技 +300204,XSHE,舒泰神 +300205,XSHE,天喻信息 +300206,XSHE,理邦仪器 +300207,XSHE,欣旺达 +300208,XSHE,恒顺众昇 +300209,XSHE,天泽信息 +300210,XSHE,森远股份 +300211,XSHE,亿通科技 +300212,XSHE,易华录 +300213,XSHE,佳讯飞鸿 +300214,XSHE,日科化学 +300215,XSHE,电科院 +300216,XSHE,千山药机 +300217,XSHE,东方电热 +300218,XSHE,安利股份 +300219,XSHE,鸿利光电 +300220,XSHE,金运激光 +300221,XSHE,银禧科技 +300222,XSHE,科大智能 +300223,XSHE,北京君正 +300224,XSHE,正海磁材 +300225,XSHE,金力泰 +300226,XSHE,上海钢联 +300227,XSHE,光韵达 +300228,XSHE,富瑞特装 +300229,XSHE,拓尔思 +300230,XSHE,永利股份 +300231,XSHE,银信科技 +300232,XSHE,洲明科技 +300233,XSHE,金城医药 +300234,XSHE,开尔新材 +300235,XSHE,方直科技 +300236,XSHE,上海新阳 +300237,XSHE,美晨科技 +300238,XSHE,冠昊生物 +300239,XSHE,东宝生物 +300240,XSHE,飞力达 +300241,XSHE,瑞丰光电 +300242,XSHE,明家科技 +300243,XSHE,瑞丰高材 +300244,XSHE,迪安诊断 +300245,XSHE,天玑科技 +300246,XSHE,宝莱特 +300247,XSHE,乐金健康 +300248,XSHE,新开普 +300249,XSHE,依米康 +300250,XSHE,初灵信息 +300251,XSHE,光线传媒 +300252,XSHE,金信诺 +300253,XSHE,卫宁软件 +300254,XSHE,仟源医药 +300255,XSHE,常山药业 +300256,XSHE,星星科技 +300257,XSHE,开山股份 +300258,XSHE,精锻科技 +300259,XSHE,新天科技 +300260,XSHE,新莱应材 +300261,XSHE,雅本化学 +300262,XSHE,巴安水务 +300263,XSHE,隆华节能 +300264,XSHE,佳创视讯 +300265,XSHE,通光线缆 +300266,XSHE,兴源环境 +300267,XSHE,尔康制药 +300268,XSHE,万福生科 +300269,XSHE,联建光电 +300270,XSHE,中威电子 +300271,XSHE,华宇软件 +300272,XSHE,开能环保 +300273,XSHE,和佳股份 +300274,XSHE,阳光电源 +300275,XSHE,梅安森 +300276,XSHE,三丰智能 +300277,XSHE,海联讯 +300278,XSHE,华昌达 +300279,XSHE,和晶科技 +300280,XSHE,南通锻压 +300281,XSHE,金明精机 +300282,XSHE,汇冠股份 +300283,XSHE,温州宏丰 +300284,XSHE,苏交科 +300285,XSHE,国瓷材料 +300286,XSHE,安科瑞 +300287,XSHE,飞利信 +300288,XSHE,朗玛信息 +300289,XSHE,利德曼 +300290,XSHE,荣科科技 +300291,XSHE,华录百纳 +300292,XSHE,吴通控股 +300293,XSHE,蓝英装备 +300294,XSHE,博雅生物 +300295,XSHE,三六五网 +300296,XSHE,利亚德 +300297,XSHE,蓝盾股份 +300298,XSHE,三诺生物 +300299,XSHE,富春通信 +300300,XSHE,汉鼎股份 +300301,XSHE,长方照明 +300302,XSHE,同有科技 +300303,XSHE,聚飞光电 +300304,XSHE,云意电气 +300305,XSHE,裕兴股份 +300306,XSHE,远方光电 +300307,XSHE,慈星股份 +300308,XSHE,中际装备 +300309,XSHE,吉艾科技 +300310,XSHE,宜通世纪 +300311,XSHE,任子行 +300312,XSHE,邦讯技术 +300313,XSHE,天山生物 +300314,XSHE,戴维医疗 +300315,XSHE,掌趣科技 +300316,XSHE,晶盛机电 +300317,XSHE,珈伟股份 +300318,XSHE,博晖创新 +300319,XSHE,麦捷科技 +300320,XSHE,海达股份 +300321,XSHE,同大股份 +300322,XSHE,硕贝德 +300323,XSHE,华灿光电 +300324,XSHE,旋极信息 +300325,XSHE,德威新材 +300326,XSHE,凯利泰 +300327,XSHE,中颖电子 +300328,XSHE,宜安科技 +300329,XSHE,海伦钢琴 +300330,XSHE,华虹计通 +300331,XSHE,苏大维格 +300332,XSHE,天壕环境 +300333,XSHE,兆日科技 +300334,XSHE,津膜科技 +300335,XSHE,迪森股份 +300336,XSHE,新文化 +300337,XSHE,银邦股份 +300338,XSHE,开元仪器 +300339,XSHE,润和软件 +300340,XSHE,科恒股份 +300341,XSHE,麦迪电气 +300342,XSHE,天银机电 +300343,XSHE,联创股份 +300344,XSHE,太空板业 +300345,XSHE,红宇新材 +300346,XSHE,南大光电 +300347,XSHE,泰格医药 +300348,XSHE,长亮科技 +300349,XSHE,金卡股份 +300350,XSHE,华鹏飞 +300351,XSHE,永贵电器 +300352,XSHE,北信源 +300353,XSHE,东土科技 +300354,XSHE,东华测试 +300355,XSHE,蒙草抗旱 +300356,XSHE,光一科技 +300357,XSHE,我武生物 +300358,XSHE,楚天科技 +300359,XSHE,全通教育 +300360,XSHE,炬华科技 +300362,XSHE,天保重装 +300363,XSHE,博腾股份 +300364,XSHE,中文在线 +300365,XSHE,恒华科技 +300366,XSHE,创意信息 +300367,XSHE,东方网力 +300368,XSHE,汇金股份 +300369,XSHE,绿盟科技 +300370,XSHE,安控科技 +300371,XSHE,汇中股份 +300372,XSHE,欣泰电气 +300373,XSHE,扬杰科技 +300374,XSHE,恒通科技 +300375,XSHE,鹏翎股份 +300376,XSHE,易事特 +300377,XSHE,赢时胜 +300378,XSHE,鼎捷软件 +300379,XSHE,东方通 +300380,XSHE,安硕信息 +300381,XSHE,溢多利 +300382,XSHE,斯莱克 +300383,XSHE,光环新网 +300384,XSHE,三联虹普 +300385,XSHE,雪浪环境 +300386,XSHE,飞天诚信 +300387,XSHE,富邦股份 +300388,XSHE,国祯环保 +300389,XSHE,艾比森 +300390,XSHE,天华超净 +300391,XSHE,康跃科技 +300392,XSHE,腾信股份 +300393,XSHE,中来股份 +300394,XSHE,天孚通信 +300395,XSHE,菲利华 +300396,XSHE,迪瑞医疗 +300397,XSHE,天和防务 +300398,XSHE,飞凯材料 +300399,XSHE,京天利 +300400,XSHE,劲拓股份 +300401,XSHE,花园生物 +300402,XSHE,宝色股份 +300403,XSHE,地尔汉宇 +300404,XSHE,博济医药 +300405,XSHE,科隆精化 +300406,XSHE,九强生物 +300407,XSHE,凯发电气 +300408,XSHE,三环集团 +300409,XSHE,道氏技术 +300410,XSHE,正业科技 +300411,XSHE,金盾股份 +300412,XSHE,迦南科技 +300413,XSHE,快乐购 +300414,XSHE,中光防雷 +300415,XSHE,伊之密 +300416,XSHE,苏试试验 +300417,XSHE,南华仪器 +300418,XSHE,昆仑万维 +300419,XSHE,浩丰科技 +300420,XSHE,五洋科技 +300421,XSHE,力星股份 +300422,XSHE,博世科 +300423,XSHE,鲁亿通 +300424,XSHE,航新科技 +300425,XSHE,环能科技 +300426,XSHE,唐德影视 +300427,XSHE,红相电力 +300428,XSHE,四通新材 +300429,XSHE,强力新材 +300430,XSHE,诚益通 +300431,XSHE,暴风科技 +300432,XSHE,富临精工 +300433,XSHE,蓝思科技 +300434,XSHE,金石东方 +300435,XSHE,中泰股份 +300436,XSHE,广生堂 +300437,XSHE,清水源 +300438,XSHE,鹏辉能源 +300439,XSHE,美康生物 +300440,XSHE,运达科技 +300441,XSHE,鲍斯股份 +300442,XSHE,普丽盛 +300443,XSHE,金雷风电 +300444,XSHE,双杰电气 +300445,XSHE,康斯特 +300446,XSHE,乐凯新材 +300447,XSHE,全信股份 +300448,XSHE,浩云科技 +300449,XSHE,汉邦高科 +300450,XSHE,先导智能 +300451,XSHE,创业软件 +300452,XSHE,山河药辅 +300453,XSHE,三鑫医疗 +300455,XSHE,康拓红外 +300456,XSHE,耐威科技 +300457,XSHE,赢合科技 +300458,XSHE,全志科技 +300459,XSHE,浙江金科 +300460,XSHE,惠伦晶体 +300461,XSHE,田中精机 +300462,XSHE,华铭智能 +300463,XSHE,迈克生物 +300464,XSHE,星徽精密 +300465,XSHE,高伟达 +300466,XSHE,赛摩电气 +300467,XSHE,迅游科技 +300468,XSHE,四方精创 +300469,XSHE,信息发展 +300470,XSHE,日机密封 +300471,XSHE,厚普股份 +300472,XSHE,新元科技 +300473,XSHE,德尔股份 +300475,XSHE,聚隆科技 +300476,XSHE,胜宏科技 +300477,XSHE,合纵科技 +300478,XSHE,杭州高新 +300479,XSHE,神思电子 +300480,XSHE,光力科技 +300481,XSHE,濮阳惠成 +300482,XSHE,万孚生物 +300483,XSHE,沃施股份 +300485,XSHE,赛升药业 +300486,XSHE,东杰智能 +300487,XSHE,蓝晓科技 +300488,XSHE,恒锋工具 +300489,XSHE,中飞股份 +300493,XSHE,润欣科技 +300496,XSHE,中科创达 +300498,XSHE,温氏股份 +600000,XSHG,浦发银行 +600004,XSHG,白云机场 +600005,XSHG,武钢股份 +600006,XSHG,东风汽车 +600007,XSHG,中国国贸 +600008,XSHG,首创股份 +600009,XSHG,上海机场 +600010,XSHG,包钢股份 +600011,XSHG,华能国际 +600012,XSHG,皖通高速 +600015,XSHG,华夏银行 +600016,XSHG,民生银行 +600017,XSHG,日照港 +600018,XSHG,上港集团 +600019,XSHG,宝钢股份 +600020,XSHG,中原高速 +600021,XSHG,上海电力 +600022,XSHG,山东钢铁 +600023,XSHG,浙能电力 +600026,XSHG,中海发展 +600027,XSHG,华电国际 +600028,XSHG,中国石化 +600029,XSHG,南方航空 +600030,XSHG,中信证券 +600031,XSHG,三一重工 +600033,XSHG,福建高速 +600035,XSHG,楚天高速 +600036,XSHG,招商银行 +600037,XSHG,歌华有线 +600038,XSHG,中直股份 +600039,XSHG,四川路桥 +600048,XSHG,保利地产 +600050,XSHG,中国联通 +600051,XSHG,宁波联合 +600052,XSHG,浙江广厦 +600053,XSHG,中江地产 +600054,XSHG,黄山旅游 +600055,XSHG,华润万东 +600056,XSHG,中国医药 +600057,XSHG,象屿股份 +600058,XSHG,五矿发展 +600059,XSHG,古越龙山 +600060,XSHG,海信电器 +600061,XSHG,国投安信 +600062,XSHG,华润双鹤 +600063,XSHG,皖维高新 +600064,XSHG,南京高科 +600066,XSHG,宇通客车 +600067,XSHG,冠城大通 +600068,XSHG,葛洲坝 +600069,XSHG,*ST银鸽 +600070,XSHG,浙江富润 +600071,XSHG,*ST光学 +600072,XSHG,钢构工程 +600073,XSHG,上海梅林 +600074,XSHG,保千里 +600075,XSHG,新疆天业 +600076,XSHG,青鸟华光 +600077,XSHG,宋都股份 +600078,XSHG,澄星股份 +600079,XSHG,人福医药 +600080,XSHG,金花股份 +600081,XSHG,东风科技 +600082,XSHG,海泰发展 +600083,XSHG,博信股份 +600084,XSHG,中葡股份 +600085,XSHG,同仁堂 +600086,XSHG,东方金钰 +600088,XSHG,中视传媒 +600089,XSHG,特变电工 +600090,XSHG,啤酒花 +600091,XSHG,*ST明科 +600093,XSHG,禾嘉股份 +600094,XSHG,大名城 +600095,XSHG,哈高科 +600096,XSHG,云天化 +600097,XSHG,开创国际 +600098,XSHG,广州发展 +600099,XSHG,林海股份 +600100,XSHG,同方股份 +600101,XSHG,明星电力 +600103,XSHG,青山纸业 +600104,XSHG,上汽集团 +600105,XSHG,永鼎股份 +600106,XSHG,重庆路桥 +600107,XSHG,美尔雅 +600108,XSHG,亚盛集团 +600109,XSHG,国金证券 +600110,XSHG,中科英华 +600111,XSHG,北方稀土 +600112,XSHG,天成控股 +600113,XSHG,浙江东日 +600114,XSHG,东睦股份 +600115,XSHG,东方航空 +600116,XSHG,三峡水利 +600117,XSHG,西宁特钢 +600118,XSHG,中国卫星 +600119,XSHG,长江投资 +600120,XSHG,浙江东方 +600121,XSHG,郑州煤电 +600122,XSHG,宏图高科 +600123,XSHG,兰花科创 +600125,XSHG,铁龙物流 +600126,XSHG,杭钢股份 +600127,XSHG,金健米业 +600128,XSHG,弘业股份 +600129,XSHG,太极集团 +600130,XSHG,波导股份 +600131,XSHG,岷江水电 +600132,XSHG,重庆啤酒 +600133,XSHG,东湖高新 +600135,XSHG,乐凯胶片 +600136,XSHG,道博股份 +600137,XSHG,浪莎股份 +600138,XSHG,中青旅 +600139,XSHG,西部资源 +600141,XSHG,兴发集团 +600143,XSHG,金发科技 +600145,XSHG,*ST新亿 +600146,XSHG,商赢环球 +600148,XSHG,长春一东 +600149,XSHG,廊坊发展 +600150,XSHG,中国船舶 +600151,XSHG,航天机电 +600152,XSHG,维科精华 +600153,XSHG,建发股份 +600155,XSHG,宝硕股份 +600156,XSHG,华升股份 +600157,XSHG,永泰能源 +600158,XSHG,中体产业 +600159,XSHG,大龙地产 +600160,XSHG,巨化股份 +600161,XSHG,天坛生物 +600162,XSHG,香江控股 +600163,XSHG,*ST闽能 +600165,XSHG,新日恒力 +600166,XSHG,福田汽车 +600167,XSHG,联美控股 +600168,XSHG,武汉控股 +600169,XSHG,太原重工 +600170,XSHG,上海建工 +600171,XSHG,上海贝岭 +600172,XSHG,黄河旋风 +600173,XSHG,卧龙地产 +600175,XSHG,美都能源 +600176,XSHG,中国巨石 +600177,XSHG,雅戈尔 +600178,XSHG,东安动力 +600179,XSHG,黑化股份 +600180,XSHG,瑞茂通 +600182,XSHG,S佳通 +600183,XSHG,生益科技 +600184,XSHG,光电股份 +600185,XSHG,格力地产 +600186,XSHG,莲花味精 +600187,XSHG,国中水务 +600188,XSHG,兖州煤业 +600189,XSHG,吉林森工 +600190,XSHG,锦州港 +600191,XSHG,华资实业 +600192,XSHG,长城电工 +600193,XSHG,创兴资源 +600195,XSHG,中牧股份 +600196,XSHG,复星医药 +600197,XSHG,伊力特 +600198,XSHG,大唐电信 +600199,XSHG,金种子酒 +600200,XSHG,江苏吴中 +600201,XSHG,金宇集团 +600202,XSHG,哈空调 +600203,XSHG,福日电子 +600206,XSHG,有研新材 +600207,XSHG,安彩高科 +600208,XSHG,新湖中宝 +600209,XSHG,罗顿发展 +600210,XSHG,紫江企业 +600211,XSHG,西藏药业 +600212,XSHG,江泉实业 +600213,XSHG,亚星客车 +600215,XSHG,长春经开 +600216,XSHG,浙江医药 +600217,XSHG,*ST秦岭 +600218,XSHG,全柴动力 +600219,XSHG,南山铝业 +600220,XSHG,江苏阳光 +600221,XSHG,海南航空 +600222,XSHG,太龙药业 +600223,XSHG,鲁商置业 +600225,XSHG,天津松江 +600226,XSHG,升华拜克 +600227,XSHG,赤天化 +600228,XSHG,昌九生化 +600229,XSHG,城市传媒 +600230,XSHG,沧州大化 +600231,XSHG,凌钢股份 +600232,XSHG,金鹰股份 +600233,XSHG,大杨创世 +600234,XSHG,山水文化 +600235,XSHG,民丰特纸 +600236,XSHG,桂冠电力 +600237,XSHG,铜峰电子 +600238,XSHG,海南椰岛 +600239,XSHG,云南城投 +600240,XSHG,华业资本 +600241,XSHG,时代万恒 +600242,XSHG,*ST中昌 +600243,XSHG,青海华鼎 +600246,XSHG,万通地产 +600247,XSHG,*ST成城 +600248,XSHG,延长化建 +600249,XSHG,两面针 +600250,XSHG,南纺股份 +600251,XSHG,冠农股份 +600252,XSHG,中恒集团 +600255,XSHG,鑫科材料 +600256,XSHG,广汇能源 +600257,XSHG,大湖股份 +600258,XSHG,首旅酒店 +600259,XSHG,广晟有色 +600260,XSHG,凯乐科技 +600261,XSHG,阳光照明 +600262,XSHG,北方股份 +600265,XSHG,ST景谷 +600266,XSHG,北京城建 +600267,XSHG,海正药业 +600268,XSHG,国电南自 +600269,XSHG,赣粤高速 +600270,XSHG,外运发展 +600271,XSHG,航天信息 +600272,XSHG,开开实业 +600273,XSHG,嘉化能源 +600275,XSHG,武昌鱼 +600276,XSHG,恒瑞医药 +600277,XSHG,亿利洁能 +600278,XSHG,东方创业 +600279,XSHG,重庆港九 +600280,XSHG,中央商场 +600281,XSHG,太化股份 +600282,XSHG,南钢股份 +600283,XSHG,钱江水利 +600284,XSHG,浦东建设 +600285,XSHG,羚锐制药 +600287,XSHG,江苏舜天 +600288,XSHG,大恒科技 +600289,XSHG,亿阳信通 +600290,XSHG,华仪电气 +600291,XSHG,西水股份 +600292,XSHG,中电远达 +600293,XSHG,三峡新材 +600295,XSHG,鄂尔多斯 +600297,XSHG,广汇汽车 +600298,XSHG,安琪酵母 +600299,XSHG,蓝星新材 +600300,XSHG,维维股份 +600301,XSHG,*ST南化 +600302,XSHG,标准股份 +600303,XSHG,曙光股份 +600305,XSHG,恒顺醋业 +600306,XSHG,商业城 +600307,XSHG,酒钢宏兴 +600308,XSHG,华泰股份 +600309,XSHG,万华化学 +600310,XSHG,桂东电力 +600311,XSHG,ST荣华 +600312,XSHG,平高电气 +600313,XSHG,农发种业 +600315,XSHG,上海家化 +600316,XSHG,洪都航空 +600317,XSHG,营口港 +600318,XSHG,巢东股份 +600319,XSHG,亚星化学 +600320,XSHG,振华重工 +600321,XSHG,国栋建设 +600322,XSHG,天房发展 +600323,XSHG,瀚蓝环境 +600325,XSHG,华发股份 +600326,XSHG,西藏天路 +600327,XSHG,大东方 +600328,XSHG,兰太实业 +600329,XSHG,中新药业 +600330,XSHG,天通股份 +600331,XSHG,宏达股份 +600332,XSHG,白云山 +600333,XSHG,长春燃气 +600335,XSHG,国机汽车 +600336,XSHG,澳柯玛 +600337,XSHG,美克家居 +600338,XSHG,西藏珠峰 +600339,XSHG,天利高新 +600340,XSHG,华夏幸福 +600343,XSHG,航天动力 +600345,XSHG,长江通信 +600346,XSHG,大橡塑 +600348,XSHG,阳泉煤业 +600350,XSHG,山东高速 +600351,XSHG,亚宝药业 +600352,XSHG,浙江龙盛 +600353,XSHG,旭光股份 +600354,XSHG,敦煌种业 +600355,XSHG,精伦电子 +600356,XSHG,恒丰纸业 +600358,XSHG,国旅联合 +600359,XSHG,新农开发 +600360,XSHG,华微电子 +600361,XSHG,华联综超 +600362,XSHG,江西铜业 +600363,XSHG,联创光电 +600365,XSHG,通葡股份 +600366,XSHG,宁波韵升 +600367,XSHG,红星发展 +600368,XSHG,五洲交通 +600369,XSHG,西南证券 +600370,XSHG,三房巷 +600371,XSHG,万向德农 +600372,XSHG,中航电子 +600373,XSHG,中文传媒 +600375,XSHG,华菱星马 +600376,XSHG,首开股份 +600377,XSHG,宁沪高速 +600378,XSHG,天科股份 +600379,XSHG,宝光股份 +600380,XSHG,健康元 +600381,XSHG,青海春天 +600382,XSHG,广东明珠 +600383,XSHG,金地集团 +600385,XSHG,山东金泰 +600386,XSHG,北巴传媒 +600387,XSHG,海越股份 +600388,XSHG,龙净环保 +600389,XSHG,江山股份 +600390,XSHG,金瑞科技 +600391,XSHG,成发科技 +600392,XSHG,盛和资源 +600393,XSHG,东华实业 +600395,XSHG,盘江股份 +600396,XSHG,金山股份 +600397,XSHG,安源煤业 +600398,XSHG,海澜之家 +600399,XSHG,抚顺特钢 +600400,XSHG,红豆股份 +600401,XSHG,*ST海润 +600403,XSHG,大有能源 +600405,XSHG,动力源 +600406,XSHG,国电南瑞 +600408,XSHG,*ST安泰 +600409,XSHG,三友化工 +600410,XSHG,华胜天成 +600415,XSHG,小商品城 +600416,XSHG,湘电股份 +600418,XSHG,江淮汽车 +600419,XSHG,天润乳业 +600420,XSHG,现代制药 +600421,XSHG,仰帆控股 +600422,XSHG,昆药集团 +600423,XSHG,柳化股份 +600425,XSHG,青松建化 +600426,XSHG,华鲁恒升 +600428,XSHG,中远航运 +600429,XSHG,三元股份 +600432,XSHG,吉恩镍业 +600433,XSHG,冠豪高新 +600435,XSHG,北方导航 +600436,XSHG,片仔癀 +600438,XSHG,通威股份 +600439,XSHG,瑞贝卡 +600444,XSHG,*ST国通 +600446,XSHG,金证股份 +600448,XSHG,华纺股份 +600449,XSHG,宁夏建材 +600452,XSHG,涪陵电力 +600455,XSHG,博通股份 +600456,XSHG,宝钛股份 +600458,XSHG,时代新材 +600459,XSHG,贵研铂业 +600460,XSHG,士兰微 +600461,XSHG,洪城水业 +600462,XSHG,石岘纸业 +600463,XSHG,空港股份 +600466,XSHG,蓝光发展 +600467,XSHG,好当家 +600468,XSHG,百利电气 +600469,XSHG,风神股份 +600470,XSHG,六国化工 +600475,XSHG,华光股份 +600476,XSHG,湘邮科技 +600477,XSHG,杭萧钢构 +600478,XSHG,科力远 +600479,XSHG,千金药业 +600480,XSHG,凌云股份 +600481,XSHG,双良节能 +600482,XSHG,风帆股份 +600483,XSHG,福能股份 +600485,XSHG,信威集团 +600486,XSHG,扬农化工 +600487,XSHG,亨通光电 +600488,XSHG,天药股份 +600489,XSHG,中金黄金 +600490,XSHG,鹏欣资源 +600491,XSHG,龙元建设 +600493,XSHG,凤竹纺织 +600495,XSHG,晋西车轴 +600496,XSHG,精工钢构 +600497,XSHG,驰宏锌锗 +600498,XSHG,烽火通信 +600499,XSHG,科达洁能 +600500,XSHG,中化国际 +600501,XSHG,航天晨光 +600502,XSHG,安徽水利 +600503,XSHG,华丽家族 +600505,XSHG,西昌电力 +600506,XSHG,香梨股份 +600507,XSHG,方大特钢 +600508,XSHG,上海能源 +600509,XSHG,天富能源 +600510,XSHG,黑牡丹 +600511,XSHG,国药股份 +600512,XSHG,腾达建设 +600513,XSHG,联环药业 +600515,XSHG,海岛建设 +600516,XSHG,方大炭素 +600517,XSHG,置信电气 +600518,XSHG,康美药业 +600519,XSHG,贵州茅台 +600520,XSHG,中发科技 +600521,XSHG,华海药业 +600522,XSHG,中天科技 +600523,XSHG,贵航股份 +600525,XSHG,长园集团 +600526,XSHG,菲达环保 +600527,XSHG,江南高纤 +600528,XSHG,中铁二局 +600529,XSHG,山东药玻 +600530,XSHG,交大昂立 +600531,XSHG,豫光金铅 +600532,XSHG,宏达矿业 +600533,XSHG,栖霞建设 +600535,XSHG,天士力 +600536,XSHG,中国软件 +600537,XSHG,亿晶光电 +600538,XSHG,国发股份 +600539,XSHG,*ST狮头 +600540,XSHG,新赛股份 +600543,XSHG,莫高股份 +600545,XSHG,新疆城建 +600546,XSHG,山煤国际 +600547,XSHG,山东黄金 +600548,XSHG,深高速 +600549,XSHG,厦门钨业 +600550,XSHG,保变电气 +600551,XSHG,时代出版 +600552,XSHG,方兴科技 +600555,XSHG,九龙山 +600556,XSHG,慧球科技 +600557,XSHG,康缘药业 +600558,XSHG,大西洋 +600559,XSHG,老白干酒 +600560,XSHG,金自天正 +600561,XSHG,江西长运 +600562,XSHG,国睿科技 +600563,XSHG,法拉电子 +600565,XSHG,迪马股份 +600566,XSHG,济川药业 +600567,XSHG,山鹰纸业 +600568,XSHG,中珠控股 +600569,XSHG,安阳钢铁 +600570,XSHG,恒生电子 +600571,XSHG,信雅达 +600572,XSHG,康恩贝 +600573,XSHG,惠泉啤酒 +600575,XSHG,皖江物流 +600576,XSHG,万家文化 +600577,XSHG,精达股份 +600578,XSHG,京能电力 +600579,XSHG,天华院 +600580,XSHG,卧龙电气 +600581,XSHG,八一钢铁 +600582,XSHG,天地科技 +600583,XSHG,海油工程 +600584,XSHG,长电科技 +600585,XSHG,海螺水泥 +600586,XSHG,金晶科技 +600587,XSHG,新华医疗 +600588,XSHG,用友网络 +600589,XSHG,广东榕泰 +600590,XSHG,泰豪科技 +600592,XSHG,龙溪股份 +600593,XSHG,大连圣亚 +600594,XSHG,益佰制药 +600595,XSHG,中孚实业 +600596,XSHG,新安股份 +600597,XSHG,光明乳业 +600598,XSHG,北大荒 +600599,XSHG,熊猫金控 +600600,XSHG,青岛啤酒 +600601,XSHG,方正科技 +600602,XSHG,仪电电子 +600603,XSHG,大洲兴业 +600604,XSHG,市北高新 +600605,XSHG,汇通能源 +600606,XSHG,绿地控股 +600608,XSHG,*ST沪科 +600609,XSHG,金杯汽车 +600610,XSHG,中毅达 +600611,XSHG,大众交通 +600612,XSHG,老凤祥 +600613,XSHG,神奇制药 +600614,XSHG,鼎立股份 +600615,XSHG,丰华股份 +600616,XSHG,金枫酒业 +600617,XSHG,国新能源 +600618,XSHG,氯碱化工 +600619,XSHG,海立股份 +600620,XSHG,天宸股份 +600621,XSHG,华鑫股份 +600622,XSHG,嘉宝集团 +600623,XSHG,双钱股份 +600624,XSHG,复旦复华 +600626,XSHG,申达股份 +600628,XSHG,新世界 +600629,XSHG,华建集团 +600630,XSHG,龙头股份 +600633,XSHG,浙报传媒 +600634,XSHG,中技控股 +600635,XSHG,大众公用 +600636,XSHG,三爱富 +600637,XSHG,东方明珠 +600638,XSHG,新黄浦 +600639,XSHG,浦东金桥 +600640,XSHG,号百控股 +600641,XSHG,万业企业 +600642,XSHG,申能股份 +600643,XSHG,爱建集团 +600644,XSHG,*ST乐电 +600645,XSHG,中源协和 +600647,XSHG,同达创业 +600648,XSHG,外高桥 +600649,XSHG,城投控股 +600650,XSHG,锦江投资 +600651,XSHG,飞乐音响 +600652,XSHG,游久游戏 +600653,XSHG,申华控股 +600654,XSHG,中安消 +600655,XSHG,豫园商城 +600656,XSHG,*ST博元 +600657,XSHG,信达地产 +600658,XSHG,电子城 +600660,XSHG,福耀玻璃 +600661,XSHG,新南洋 +600662,XSHG,强生控股 +600663,XSHG,陆家嘴 +600664,XSHG,哈药股份 +600665,XSHG,天地源 +600666,XSHG,奥瑞德 +600667,XSHG,太极实业 +600668,XSHG,尖峰集团 +600671,XSHG,天目药业 +600673,XSHG,东阳光科 +600674,XSHG,川投能源 +600675,XSHG,中华企业 +600676,XSHG,交运股份 +600677,XSHG,航天通信 +600678,XSHG,四川金顶 +600679,XSHG,金山开发 +600680,XSHG,上海普天 +600681,XSHG,万鸿集团 +600682,XSHG,南京新百 +600683,XSHG,京投银泰 +600684,XSHG,珠江实业 +600685,XSHG,中船防务 +600686,XSHG,金龙汽车 +600687,XSHG,刚泰控股 +600688,XSHG,上海石化 +600689,XSHG,上海三毛 +600690,XSHG,青岛海尔 +600691,XSHG,*ST阳化 +600692,XSHG,亚通股份 +600693,XSHG,东百集团 +600694,XSHG,大商股份 +600695,XSHG,绿庭投资 +600696,XSHG,匹凸匹 +600697,XSHG,欧亚集团 +600698,XSHG,湖南天雁 +600699,XSHG,均胜电子 +600701,XSHG,工大高新 +600702,XSHG,沱牌舍得 +600703,XSHG,三安光电 +600704,XSHG,物产中大 +600705,XSHG,中航资本 +600706,XSHG,曲江文旅 +600707,XSHG,彩虹股份 +600708,XSHG,光明地产 +600710,XSHG,*ST常林 +600711,XSHG,盛屯矿业 +600712,XSHG,南宁百货 +600713,XSHG,南京医药 +600714,XSHG,金瑞矿业 +600715,XSHG,*ST松辽 +600716,XSHG,凤凰股份 +600717,XSHG,天津港 +600718,XSHG,东软集团 +600719,XSHG,大连热电 +600720,XSHG,祁连山 +600721,XSHG,百花村 +600722,XSHG,*ST金化 +600723,XSHG,首商股份 +600724,XSHG,宁波富达 +600725,XSHG,云维股份 +600726,XSHG,华电能源 +600727,XSHG,鲁北化工 +600728,XSHG,佳都科技 +600729,XSHG,重庆百货 +600730,XSHG,中国高科 +600731,XSHG,湖南海利 +600732,XSHG,*ST新梅 +600733,XSHG,S前锋 +600734,XSHG,实达集团 +600735,XSHG,新华锦 +600736,XSHG,苏州高新 +600737,XSHG,中粮屯河 +600738,XSHG,兰州民百 +600739,XSHG,辽宁成大 +600740,XSHG,山西焦化 +600741,XSHG,华域汽车 +600742,XSHG,一汽富维 +600743,XSHG,华远地产 +600744,XSHG,华银电力 +600745,XSHG,中茵股份 +600746,XSHG,江苏索普 +600747,XSHG,大连控股 +600748,XSHG,上实发展 +600749,XSHG,西藏旅游 +600750,XSHG,江中药业 +600751,XSHG,天海投资 +600753,XSHG,东方银星 +600754,XSHG,锦江股份 +600755,XSHG,厦门国贸 +600756,XSHG,浪潮软件 +600757,XSHG,长江传媒 +600758,XSHG,红阳能源 +600759,XSHG,洲际油气 +600760,XSHG,中航黑豹 +600761,XSHG,安徽合力 +600763,XSHG,通策医疗 +600764,XSHG,中电广通 +600765,XSHG,中航重机 +600766,XSHG,园城黄金 +600767,XSHG,运盛医疗 +600768,XSHG,宁波富邦 +600769,XSHG,祥龙电业 +600770,XSHG,综艺股份 +600771,XSHG,广誉远 +600773,XSHG,西藏城投 +600774,XSHG,汉商集团 +600775,XSHG,南京熊猫 +600776,XSHG,东方通信 +600777,XSHG,新潮实业 +600778,XSHG,友好集团 +600779,XSHG,*ST水井 +600780,XSHG,通宝能源 +600781,XSHG,辅仁药业 +600782,XSHG,新钢股份 +600783,XSHG,鲁信创投 +600784,XSHG,鲁银投资 +600785,XSHG,新华百货 +600787,XSHG,中储股份 +600789,XSHG,鲁抗医药 +600790,XSHG,轻纺城 +600791,XSHG,京能置业 +600792,XSHG,云煤能源 +600793,XSHG,ST宜纸 +600794,XSHG,保税科技 +600795,XSHG,国电电力 +600796,XSHG,钱江生化 +600797,XSHG,浙大网新 +600798,XSHG,宁波海运 +600800,XSHG,天津磁卡 +600801,XSHG,华新水泥 +600802,XSHG,福建水泥 +600803,XSHG,新奥股份 +600804,XSHG,鹏博士 +600805,XSHG,悦达投资 +600806,XSHG,昆明机床 +600807,XSHG,天业股份 +600808,XSHG,马钢股份 +600809,XSHG,山西汾酒 +600810,XSHG,神马股份 +600811,XSHG,东方集团 +600812,XSHG,华北制药 +600814,XSHG,杭州解百 +600815,XSHG,厦工股份 +600816,XSHG,安信信托 +600817,XSHG,ST宏盛 +600818,XSHG,中路股份 +600819,XSHG,耀皮玻璃 +600820,XSHG,隧道股份 +600821,XSHG,津劝业 +600822,XSHG,上海物贸 +600823,XSHG,世茂股份 +600824,XSHG,益民集团 +600825,XSHG,新华传媒 +600826,XSHG,兰生股份 +600827,XSHG,百联股份 +600828,XSHG,成商集团 +600829,XSHG,人民同泰 +600830,XSHG,香溢融通 +600831,XSHG,广电网络 +600833,XSHG,第一医药 +600834,XSHG,申通地铁 +600835,XSHG,上海机电 +600836,XSHG,界龙实业 +600837,XSHG,海通证券 +600838,XSHG,上海九百 +600839,XSHG,四川长虹 +600841,XSHG,上柴股份 +600843,XSHG,上工申贝 +600844,XSHG,丹化科技 +600845,XSHG,宝信软件 +600846,XSHG,同济科技 +600847,XSHG,万里股份 +600848,XSHG,上海临港 +600850,XSHG,华东电脑 +600851,XSHG,海欣股份 +600853,XSHG,龙建股份 +600854,XSHG,春兰股份 +600855,XSHG,航天长峰 +600856,XSHG,中天能源 +600857,XSHG,宁波中百 +600858,XSHG,银座股份 +600859,XSHG,王府井 +600860,XSHG,京城股份 +600861,XSHG,北京城乡 +600862,XSHG,南通科技 +600863,XSHG,内蒙华电 +600864,XSHG,哈投股份 +600865,XSHG,百大集团 +600866,XSHG,星湖科技 +600867,XSHG,通化东宝 +600868,XSHG,梅雁吉祥 +600869,XSHG,智慧能源 +600870,XSHG,*ST厦华 +600871,XSHG,石化油服 +600872,XSHG,中炬高新 +600873,XSHG,梅花生物 +600874,XSHG,创业环保 +600875,XSHG,东方电气 +600876,XSHG,洛阳玻璃 +600877,XSHG,中国嘉陵 +600879,XSHG,航天电子 +600880,XSHG,博瑞传播 +600881,XSHG,亚泰集团 +600882,XSHG,华联矿业 +600883,XSHG,博闻科技 +600884,XSHG,杉杉股份 +600885,XSHG,宏发股份 +600886,XSHG,国投电力 +600887,XSHG,伊利股份 +600888,XSHG,新疆众和 +600889,XSHG,南京化纤 +600890,XSHG,中房股份 +600891,XSHG,秋林集团 +600892,XSHG,宝诚股份 +600893,XSHG,中航动力 +600894,XSHG,广日股份 +600895,XSHG,张江高科 +600896,XSHG,中海海盛 +600897,XSHG,厦门空港 +600898,XSHG,三联商社 +600900,XSHG,长江电力 +600917,XSHG,重庆燃气 +600958,XSHG,东方证券 +600959,XSHG,江苏有线 +600960,XSHG,渤海活塞 +600961,XSHG,株冶集团 +600962,XSHG,*ST中鲁 +600963,XSHG,岳阳林纸 +600965,XSHG,福成五丰 +600966,XSHG,博汇纸业 +600967,XSHG,北方创业 +600969,XSHG,郴电国际 +600970,XSHG,中材国际 +600971,XSHG,恒源煤电 +600973,XSHG,宝胜股份 +600975,XSHG,新五丰 +600976,XSHG,健民集团 +600978,XSHG,宜华木业 +600979,XSHG,广安爱众 +600980,XSHG,北矿磁材 +600981,XSHG,汇鸿集团 +600982,XSHG,宁波热电 +600983,XSHG,惠而浦 +600984,XSHG,*ST建机 +600985,XSHG,雷鸣科化 +600986,XSHG,科达股份 +600987,XSHG,航民股份 +600988,XSHG,赤峰黄金 +600990,XSHG,四创电子 +600992,XSHG,贵绳股份 +600993,XSHG,马应龙 +600995,XSHG,文山电力 +600997,XSHG,开滦股份 +600998,XSHG,九州通 +600999,XSHG,招商证券 +601000,XSHG,唐山港 +601001,XSHG,大同煤业 +601002,XSHG,晋亿实业 +601003,XSHG,柳钢股份 +601005,XSHG,重庆钢铁 +601006,XSHG,大秦铁路 +601007,XSHG,金陵饭店 +601008,XSHG,连云港 +601009,XSHG,南京银行 +601010,XSHG,文峰股份 +601011,XSHG,宝泰隆 +601012,XSHG,隆基股份 +601015,XSHG,陕西黑猫 +601016,XSHG,节能风电 +601018,XSHG,宁波港 +601021,XSHG,春秋航空 +601028,XSHG,玉龙股份 +601038,XSHG,一拖股份 +601058,XSHG,赛轮金宇 +601069,XSHG,西部黄金 +601088,XSHG,中国神华 +601098,XSHG,中南传媒 +601099,XSHG,太平洋 +601100,XSHG,恒立油缸 +601101,XSHG,昊华能源 +601106,XSHG,中国一重 +601107,XSHG,四川成渝 +601111,XSHG,中国国航 +601113,XSHG,华鼎股份 +601116,XSHG,三江购物 +601117,XSHG,中国化学 +601118,XSHG,海南橡胶 +601126,XSHG,四方股份 +601137,XSHG,博威合金 +601139,XSHG,深圳燃气 +601158,XSHG,重庆水务 +601166,XSHG,兴业银行 +601168,XSHG,西部矿业 +601169,XSHG,北京银行 +601177,XSHG,杭齿前进 +601179,XSHG,中国西电 +601186,XSHG,中国铁建 +601188,XSHG,龙江交通 +601198,XSHG,东兴证券 +601199,XSHG,江南水务 +601208,XSHG,东材科技 +601211,XSHG,国泰君安 +601216,XSHG,君正集团 +601218,XSHG,吉鑫科技 +601222,XSHG,林洋电子 +601225,XSHG,陕西煤业 +601226,XSHG,华电重工 +601231,XSHG,环旭电子 +601233,XSHG,桐昆股份 +601238,XSHG,广汽集团 +601258,XSHG,庞大集团 +601288,XSHG,农业银行 +601311,XSHG,骆驼股份 +601313,XSHG,江南嘉捷 +601318,XSHG,中国平安 +601328,XSHG,交通银行 +601333,XSHG,广深铁路 +601336,XSHG,新华保险 +601339,XSHG,百隆东方 +601368,XSHG,绿城水务 +601369,XSHG,陕鼓动力 +601377,XSHG,兴业证券 +601388,XSHG,怡球资源 +601390,XSHG,中国中铁 +601398,XSHG,工商银行 +601515,XSHG,东风股份 +601518,XSHG,吉林高速 +601519,XSHG,大智慧 +601555,XSHG,东吴证券 +601558,XSHG,华锐风电 +601566,XSHG,九牧王 +601567,XSHG,三星医疗 +601579,XSHG,会稽山 +601588,XSHG,北辰实业 +601599,XSHG,鹿港科技 +601600,XSHG,中国铝业 +601601,XSHG,中国太保 +601607,XSHG,上海医药 +601608,XSHG,中信重工 +601616,XSHG,广电电气 +601618,XSHG,中国中冶 +601628,XSHG,中国人寿 +601633,XSHG,长城汽车 +601636,XSHG,旗滨集团 +601666,XSHG,平煤股份 +601668,XSHG,中国建筑 +601669,XSHG,中国电建 +601677,XSHG,明泰铝业 +601678,XSHG,滨化股份 +601688,XSHG,华泰证券 +601689,XSHG,拓普集团 +601699,XSHG,潞安环能 +601700,XSHG,风范股份 +601717,XSHG,郑煤机 +601718,XSHG,际华集团 +601727,XSHG,上海电气 +601766,XSHG,中国中车 +601777,XSHG,力帆股份 +601788,XSHG,光大证券 +601789,XSHG,宁波建工 +601798,XSHG,蓝科高新 +601799,XSHG,星宇股份 +601800,XSHG,中国交建 +601801,XSHG,皖新传媒 +601808,XSHG,中海油服 +601818,XSHG,光大银行 +601857,XSHG,中国石油 +601866,XSHG,中海集运 +601872,XSHG,招商轮船 +601877,XSHG,正泰电器 +601880,XSHG,大连港 +601886,XSHG,江河创建 +601888,XSHG,中国国旅 +601890,XSHG,亚星锚链 +601898,XSHG,中煤能源 +601899,XSHG,紫金矿业 +601901,XSHG,方正证券 +601908,XSHG,京运通 +601918,XSHG,国投新集 +601919,XSHG,中国远洋 +601928,XSHG,凤凰传媒 +601929,XSHG,吉视传媒 +601933,XSHG,永辉超市 +601939,XSHG,建设银行 +601958,XSHG,金钼股份 +601965,XSHG,中国汽研 +601968,XSHG,宝钢包装 +601969,XSHG,海南矿业 +601985,XSHG,中国核电 +601988,XSHG,中国银行 +601989,XSHG,中国重工 +601991,XSHG,大唐发电 +601992,XSHG,金隅股份 +601996,XSHG,丰林集团 +601998,XSHG,中信银行 +601999,XSHG,出版传媒 +603000,XSHG,人民网 +603001,XSHG,奥康国际 +603002,XSHG,宏昌电子 +603003,XSHG,龙宇燃油 +603005,XSHG,晶方科技 +603006,XSHG,联明股份 +603008,XSHG,喜临门 +603009,XSHG,北特科技 +603010,XSHG,万盛股份 +603011,XSHG,合锻股份 +603012,XSHG,创力集团 +603015,XSHG,弘讯科技 +603017,XSHG,中衡设计 +603018,XSHG,设计股份 +603019,XSHG,中科曙光 +603020,XSHG,爱普股份 +603021,XSHG,山东华鹏 +603022,XSHG,新通联 +603023,XSHG,威帝股份 +603025,XSHG,大豪科技 +603026,XSHG,石大胜华 +603030,XSHG,全筑股份 +603066,XSHG,音飞储存 +603077,XSHG,和邦生物 +603085,XSHG,天成自控 +603088,XSHG,宁波精达 +603099,XSHG,长白山 +603100,XSHG,川仪股份 +603108,XSHG,润达医疗 +603111,XSHG,康尼机电 +603116,XSHG,红蜻蜓 +603117,XSHG,万林股份 +603118,XSHG,共进股份 +603123,XSHG,翠微股份 +603126,XSHG,中材节能 +603128,XSHG,华贸物流 +603158,XSHG,腾龙股份 +603166,XSHG,福达股份 +603167,XSHG,渤海轮渡 +603168,XSHG,莎普爱思 +603169,XSHG,兰石重装 +603188,XSHG,亚邦股份 +603198,XSHG,迎驾贡酒 +603199,XSHG,九华旅游 +603222,XSHG,济民制药 +603223,XSHG,恒通股份 +603227,XSHG,雪峰科技 +603268,XSHG,松发股份 +603288,XSHG,海天味业 +603300,XSHG,华铁科技 +603306,XSHG,华懋科技 +603308,XSHG,应流股份 +603309,XSHG,维力医疗 +603311,XSHG,金海环境 +603315,XSHG,福鞍股份 +603318,XSHG,派思股份 +603328,XSHG,依顿电子 +603333,XSHG,明星电缆 +603338,XSHG,浙江鼎力 +603355,XSHG,莱克电气 +603366,XSHG,日出东方 +603368,XSHG,柳州医药 +603369,XSHG,今世缘 +603398,XSHG,邦宝益智 +603399,XSHG,新华龙 +603456,XSHG,九洲药业 +603518,XSHG,维格娜丝 +603519,XSHG,立霸股份 +603555,XSHG,贵人鸟 +603558,XSHG,健盛集团 +603566,XSHG,普莱柯 +603567,XSHG,珍宝岛 +603568,XSHG,伟明环保 +603588,XSHG,高能环境 +603589,XSHG,口子窖 +603598,XSHG,引力传媒 +603599,XSHG,广信股份 +603600,XSHG,永艺股份 +603601,XSHG,再升科技 +603606,XSHG,东方电缆 +603609,XSHG,禾丰牧业 +603611,XSHG,诺力股份 +603616,XSHG,韩建河山 +603618,XSHG,杭电股份 +603636,XSHG,南威软件 +603669,XSHG,灵康药业 +603678,XSHG,火炬电子 +603686,XSHG,龙马环卫 +603688,XSHG,石英股份 +603696,XSHG,安记食品 +603698,XSHG,航天工程 +603699,XSHG,纽威股份 +603703,XSHG,盛洋科技 +603718,XSHG,海利生物 +603729,XSHG,龙韵股份 +603766,XSHG,隆鑫通用 +603788,XSHG,宁波高发 +603789,XSHG,星光农机 +603799,XSHG,华友钴业 +603800,XSHG,道森股份 +603806,XSHG,福斯特 +603808,XSHG,歌力思 +603818,XSHG,曲美家居 +603828,XSHG,柯利达 +603838,XSHG,四通股份 +603869,XSHG,北部湾旅 +603883,XSHG,老百姓 +603885,XSHG,吉祥航空 +603889,XSHG,新澳股份 +603898,XSHG,好莱客 +603899,XSHG,晨光文具 +603901,XSHG,永创智能 +603918,XSHG,金桥信息 +603936,XSHG,博敏电子 +603939,XSHG,益丰药房 +603968,XSHG,醋化股份 +603969,XSHG,银龙股份 +603979,XSHG,金诚信 +603988,XSHG,中电电机 +603989,XSHG,艾华集团 +603993,XSHG,洛阳钼业 +603997,XSHG,继峰股份 +603998,XSHG,方盛制药 +603999,XSHG,读者传媒 +159915,XSHE,创业板 +502012,XSHG,证券B diff --git a/Quanter.Trader.MarketServer/stock_list.csv b/Quanter.Trader.MarketServer/stock_list.csv new file mode 100644 index 0000000..4dc6fd1 --- /dev/null +++ b/Quanter.Trader.MarketServer/stock_list.csv @@ -0,0 +1,6 @@ +000001,XSHE,平安银行 +000002,XSHE,万 科A +603998,XSHG,方盛制药 +603999,XSHG,读者传媒 +159915,XSHE,创业板 +502012,XSHG,证券B diff --git a/Quanter.Trader.MarketServer/stocklist.csv b/Quanter.Trader.MarketServer/stocklist.csv new file mode 100644 index 0000000..1306a9e --- /dev/null +++ b/Quanter.Trader.MarketServer/stocklist.csv @@ -0,0 +1,3095 @@ +sz000001,平安银行,12.28 +sz000002,万 科A,14.50 +sz000004,国农科技,39.35 +sz000005,世纪星源,10.34 +sz000006,深振业A,11.88 +sz000007,零七股份,23.63 +sz000008,神州高铁,12.85 +sz000009,中国宝安,18.13 +sz000010,深华新,9.71 +sz000011,深物业A,14.88 +sz000012,南 玻A,10.80 +sz000014,沙河股份,23.22 +sz000016,深康佳A,8.16 +sz000017,深中华A,12.52 +sz000018,中冠A,36.24 +sz000019,深深宝A,17.64 +sz000020,深华发A,25.05 +sz000021,深科技,13.05 +sz000022,深赤湾A,20.12 +sz000023,深天地A,0.00 +sz000024,招商地产,35.60 +sz000025,特 力A,66.21 +sz000026,飞亚达A,14.70 +sz000027,深圳能源,11.41 +sz000028,国药一致,0.00 +sz000029,深深房A,14.22 +sz000030,富奥股份,10.22 +sz000031,中粮地产,16.00 +sz000032,深桑达A,25.10 +sz000033,,0 +sz000034,深信泰丰,0.00 +sz000035,中国天楹,16.10 +sz000036,华联控股,8.38 +sz000037,深南电A,11.33 +sz000038,深大通,54.09 +sz000039,中集集团,20.32 +sz000040,宝安地产,16.49 +sz000042,中洲控股,20.43 +sz000043,中航地产,12.63 +sz000045,深纺织A,13.71 +sz000046,泛海控股,12.17 +sz000048,康达尔,0.00 +sz000049,德赛电池,52.75 +sz000050,深天马A,24.10 +sz000055,方大集团,12.46 +sz000056,皇庭国际,28.36 +sz000058,深 赛 格,0.00 +sz000059,*ST华锦,8.23 +sz000060,中金岭南,12.86 +sz000061,农 产 品,15.60 +sz000062,深圳华强,41.06 +sz000063,中兴通讯,19.02 +sz000065,北方国际,0.00 +sz000066,长城电脑,0.00 +sz000068,*ST华赛,11.70 +sz000069,华侨城A,8.57 +sz000070,特发信息,28.54 +sz000078,海王生物,19.57 +sz000088,盐 田 港,8.62 +sz000089,深圳机场,8.42 +sz000090,天健集团,20.00 +sz000096,广聚能源,18.56 +sz000099,中信海直,17.50 +sz000100,TCL 集团,4.09 +sz000150,宜华健康,37.97 +sz000151,中成股份,27.82 +sz000153,丰原药业,0.00 +sz000155,*ST川化,8.55 +sz000156,华数传媒,34.53 +sz000157,中联重科,5.52 +sz000158,常山股份,20.03 +sz000159,国际实业,8.98 +sz000166,申万宏源,11.66 +sz000301,东方市场,6.38 +sz000333,美的集团,28.50 +sz000338,潍柴动力,10.21 +sz000400,许继电气,20.35 +sz000401,冀东水泥,11.51 +sz000402,金 融 街,9.63 +sz000403,ST生化,23.93 +sz000404,华意压缩,9.02 +sz000407,胜利股份,7.57 +sz000408,金谷源,20.21 +sz000409,山东地矿,9.96 +sz000410,沈阳机床,27.48 +sz000411,英特集团,27.17 +sz000413,东旭光电,10.00 +sz000415,渤海租赁,9.01 +sz000416,民生控股,10.95 +sz000417,合肥百货,10.16 +sz000418,小天鹅A,21.40 +sz000419,通程控股,9.13 +sz000420,吉林化纤,7.48 +sz000421,南京中北,9.11 +sz000422,湖北宜化,7.59 +sz000423,东阿阿胶,48.23 +sz000425,徐工机械,5.02 +sz000426,兴业矿业,0.00 +sz000428,华天酒店,10.05 +sz000429,粤高速A,6.70 +sz000430,张家界,14.08 +sz000488,晨鸣纸业,9.07 +sz000498,山东路桥,7.31 +sz000501,鄂武商A,19.04 +sz000502,绿景控股,29.23 +sz000503,海虹控股,36.08 +sz000504,南华生物,27.09 +sz000505,珠江控股,11.68 +sz000506,中润资源,9.48 +sz000507,珠海港,8.03 +sz000509,华塑控股,9.05 +sz000510,*ST金路,7.94 +sz000511,烯碳新材,0.00 +sz000513,丽珠集团,49.65 +sz000514,渝 开 发,0.00 +sz000516,国际医学,20.35 +sz000517,荣安地产,6.55 +sz000518,四环生物,6.60 +sz000519,江南红箭,0.00 +sz000520,长航凤凰,0.00 +sz000521,美菱电器,7.45 +sz000523,广州浪奇,16.32 +sz000524,岭南控股,19.66 +sz000525,红 太 阳,18.09 +sz000526,银润投资,79.53 +sz000528,柳 工,8.98 +sz000529,广弘控股,0.00 +sz000530,大冷股份,16.50 +sz000531,穗恒运A,10.96 +sz000532,力合股份,20.71 +sz000533,万 家 乐,8.40 +sz000534,万泽股份,0.00 +sz000536,华映科技,15.97 +sz000537,广宇发展,9.67 +sz000538,云南白药,70.10 +sz000539,粤电力A,7.81 +sz000540,中天城投,11.73 +sz000541,佛山照明,13.11 +sz000543,皖能电力,9.29 +sz000544,中原环保,20.08 +sz000545,金浦钛业,8.89 +sz000546,金圆股份,11.90 +sz000547,航天发展,24.28 +sz000548,湖南投资,9.89 +sz000550,江铃汽车,29.00 +sz000551,创元科技,13.20 +sz000552,靖远煤电,9.27 +sz000553,沙隆达A,0.00 +sz000554,泰山石油,12.39 +sz000555,神州信息,33.72 +sz000557,*ST广夏,7.96 +sz000558,莱茵体育,25.00 +sz000559,万向钱潮,23.90 +sz000560,昆百大A,14.00 +sz000561,烽火电子,11.42 +sz000563,陕国投A,12.79 +sz000564,西安民生,12.90 +sz000565,渝三峡A,15.14 +sz000566,海南海药,41.59 +sz000567,海德股份,33.84 +sz000568,泸州老窖,24.53 +sz000570,苏常柴A,10.97 +sz000571,新大洲A,7.47 +sz000572,海马汽车,6.75 +sz000573,粤宏远A,7.60 +sz000576,广东甘化,18.47 +sz000581,威孚高科,25.48 +sz000582,北部湾港,21.85 +sz000584,友利控股,0.00 +sz000585,东北电气,0.00 +sz000586,汇源通信,0.00 +sz000587,金叶珠宝,20.43 +sz000589,黔轮胎A,7.58 +sz000590,*ST古汉,24.63 +sz000591,桐 君 阁,0.00 +sz000592,平潭发展,22.73 +sz000593,大通燃气,11.94 +sz000595,宝塔实业,0.00 +sz000596,古井贡酒,34.00 +sz000597,东北制药,9.51 +sz000598,兴蓉环境,7.92 +sz000599,青岛双星,8.80 +sz000600,建投能源,10.70 +sz000601,韶能股份,11.26 +sz000603,盛达矿业,0.00 +sz000605,渤海股份,23.20 +sz000606,青海明胶,0.00 +sz000607,华媒控股,13.93 +sz000608,阳光股份,5.96 +sz000609,绵世股份,16.06 +sz000610,西安旅游,14.87 +sz000611,*ST蒙发,9.72 +sz000612,焦作万方,7.10 +sz000613,大东海A,14.78 +sz000615,湖北金环,17.19 +sz000616,海航投资,8.64 +sz000617,石油济柴,14.78 +sz000619,海螺型材,15.34 +sz000620,新华联,11.22 +sz000622,恒立实业,14.29 +sz000623,吉林敖东,30.57 +sz000625,长安汽车,15.16 +sz000626,如意集团,0.00 +sz000627,天茂集团,11.03 +sz000628,高新发展,16.86 +sz000629,攀钢钒钛,3.16 +sz000630,铜陵有色,4.08 +sz000631,顺发恒业,9.10 +sz000632,三木集团,10.75 +sz000633,合金投资,17.14 +sz000635,英 力 特,13.70 +sz000636,风华高科,11.16 +sz000637,茂化实华,7.86 +sz000638,万方发展,24.30 +sz000639,西王食品,15.21 +sz000650,仁和药业,11.31 +sz000651,格力电器,18.54 +sz000652,泰达股份,7.06 +sz000655,金岭矿业,9.42 +sz000656,金科股份,6.10 +sz000657,中钨高新,0.00 +sz000659,*ST中富,5.56 +sz000661,长春高新,117.14 +sz000662,索芙特,21.21 +sz000663,永安林业,17.54 +sz000665,湖北广电,21.50 +sz000666,经纬纺机,23.45 +sz000667,美好集团,5.54 +sz000668,荣丰控股,23.52 +sz000669,金鸿能源,24.96 +sz000670,盈方微,14.45 +sz000671,阳 光 城,7.77 +sz000672,上峰水泥,0.00 +sz000673,当代东方,32.06 +sz000676,智度投资,39.78 +sz000677,*ST海龙,0.00 +sz000678,襄阳轴承,9.67 +sz000679,大连友谊,0.00 +sz000680,山推股份,7.08 +sz000681,视觉中国,38.95 +sz000682,东方电子,7.15 +sz000683,远兴能源,5.77 +sz000685,中山公用,15.59 +sz000686,东北证券,18.80 +sz000687,华讯方舟,28.55 +sz000688,建新矿业,0.00 +sz000690,宝新能源,10.05 +sz000691,亚太实业,9.02 +sz000692,惠天热电,7.29 +sz000693,华泽钴镍,17.85 +sz000695,滨海能源,0.00 +sz000697,炼石有色,26.32 +sz000698,沈阳化工,8.08 +sz000700,模塑科技,21.12 +sz000701,厦门信达,21.98 +sz000702,正虹科技,13.88 +sz000703,恒逸石化,12.03 +sz000705,浙江震元,14.71 +sz000707,双环科技,8.34 +sz000708,大冶特钢,11.67 +sz000709,河北钢铁,3.36 +sz000710,天兴仪表,30.46 +sz000711,*ST京蓝,0.00 +sz000712,锦龙股份,31.62 +sz000713,丰乐种业,12.25 +sz000715,中兴商业,13.20 +sz000716,黑芝麻,0.00 +sz000717,韶钢松山,5.13 +sz000718,苏宁环球,0.00 +sz000719,大地传媒,22.27 +sz000720,新能泰山,9.89 +sz000721,西安饮食,8.45 +sz000722,湖南发展,21.27 +sz000723,美锦能源,11.10 +sz000725,京东方A,3.09 +sz000726,鲁 泰A,12.89 +sz000727,华东科技,10.43 +sz000728,国元证券,25.18 +sz000729,燕京啤酒,8.42 +sz000731,四川美丰,10.47 +sz000732,泰禾集团,23.82 +sz000733,振华科技,26.75 +sz000735,罗 牛 山,7.50 +sz000736,中房地产,18.60 +sz000737,南风化工,6.39 +sz000738,中航动控,37.25 +sz000739,普洛药业,8.27 +sz000748,长城信息,0.00 +sz000750,国海证券,13.53 +sz000751,锌业股份,6.30 +sz000752,西藏发展,16.69 +sz000753,漳州发展,6.84 +sz000755,山西三维,9.56 +sz000756,新华制药,12.52 +sz000757,浩物股份,12.02 +sz000758,中色股份,15.76 +sz000759,中百集团,8.13 +sz000760,斯太尔,16.20 +sz000761,本钢板材,5.36 +sz000762,西藏矿业,27.56 +sz000766,通化金马,14.71 +sz000767,漳泽电力,6.32 +sz000768,中航飞机,27.20 +sz000776,广发证券,19.39 +sz000777,中核科技,34.93 +sz000778,新兴铸管,7.89 +sz000779,三毛派神,0.00 +sz000780,平庄能源,5.94 +sz000782,美达股份,17.67 +sz000783,长江证券,12.80 +sz000785,武汉中商,14.25 +sz000786,北新建材,13.58 +sz000788,北大医药,16.00 +sz000789,万年青,8.04 +sz000790,华神集团,13.80 +sz000791,甘肃电投,15.69 +sz000792,盐湖股份,23.71 +sz000793,华闻传媒,0.00 +sz000795,太原刚玉,0.00 +sz000796,凯撒旅游,0.00 +sz000797,中国武夷,24.49 +sz000798,中水渔业,12.92 +sz000799,*ST酒鬼,16.84 +sz000800,一汽轿车,16.51 +sz000801,四川九洲,32.14 +sz000802,北京文化,31.11 +sz000803,金宇车城,24.52 +sz000806,银河生物,30.22 +sz000807,云铝股份,5.44 +sz000809,铁岭新城,5.68 +sz000810,创维数字,0.00 +sz000811,烟台冰轮,15.11 +sz000812,陕西金叶,0.00 +sz000813,天山纺织,0.00 +sz000815,*ST美利,25.72 +sz000816,智慧农业,8.76 +sz000818,方大化工,9.23 +sz000819,岳阳兴长,39.28 +sz000820,金城股份,19.33 +sz000821,京山轻机,16.84 +sz000822,山东海化,7.18 +sz000823,超声电子,12.20 +sz000825,太钢不锈,4.32 +sz000826,启迪桑德,40.84 +sz000828,东莞控股,12.99 +sz000829,天音控股,0.00 +sz000830,鲁西化工,7.22 +sz000831,五矿稀土,22.98 +sz000833,贵糖股份,0.00 +sz000835,长城动漫,17.53 +sz000836,鑫茂科技,0.00 +sz000837,秦川机床,16.81 +sz000838,财信发展,22.31 +sz000839,中信国安,0.00 +sz000848,承德露露,14.68 +sz000850,华茂股份,0.00 +sz000851,高鸿股份,0.00 +sz000852,石化机械,19.85 +sz000856,冀东装备,12.70 +sz000858,五 粮 液,25.28 +sz000859,国风塑业,6.64 +sz000860,顺鑫农业,18.93 +sz000861,海印股份,9.08 +sz000862,银星能源,9.42 +sz000863,三湘股份,14.21 +sz000868,安凯客车,10.46 +sz000869,张 裕A,38.82 +sz000875,吉电股份,9.77 +sz000876,新 希 望,0.00 +sz000877,天山股份,8.93 +sz000878,云南铜业,12.15 +sz000880,潍柴重机,16.57 +sz000881,大连国际,0.00 +sz000882,华联股份,6.53 +sz000883,湖北能源,6.67 +sz000885,同力水泥,17.60 +sz000886,海南高速,6.85 +sz000887,中鼎股份,25.37 +sz000888,峨眉山A,12.70 +sz000889,茂业通信,16.38 +sz000890,法 尔 胜,14.84 +sz000892,*ST星美,17.63 +sz000893,东凌粮油,15.05 +sz000895,双汇发展,19.95 +sz000897,津滨发展,5.91 +sz000898,鞍钢股份,4.82 +sz000899,赣能股份,12.69 +sz000900,现代投资,8.60 +sz000901,航天科技,0.00 +sz000902,新洋丰,25.34 +sz000903,云内动力,8.69 +sz000905,厦门港务,14.42 +sz000906,物产中拓,16.50 +sz000908,景峰医药,18.70 +sz000909,数源科技,19.10 +sz000910,大亚科技,15.89 +sz000911,南宁糖业,20.57 +sz000912,*ST天化,7.02 +sz000913,钱江摩托,13.53 +sz000915,山大华特,37.19 +sz000916,华北高速,5.97 +sz000917,电广传媒,30.25 +sz000918,嘉凯城,5.77 +sz000919,金陵药业,17.60 +sz000920,南方汇通,20.07 +sz000921,海信科龙,8.99 +sz000922,佳电股份,14.32 +sz000923,河北宣工,19.05 +sz000925,众合科技,0.00 +sz000926,福星股份,14.85 +sz000927,*ST夏利,8.00 +sz000928,中钢国际,16.79 +sz000929,兰州黄河,0.00 +sz000930,中粮生化,17.91 +sz000931,中 关 村,12.71 +sz000932,华菱钢铁,3.11 +sz000933,神火股份,4.78 +sz000935,四川双马,7.32 +sz000936,华西股份,14.15 +sz000937,冀中能源,5.47 +sz000938,紫光股份,110.10 +sz000939,凯迪生态,16.03 +sz000948,南天信息,28.90 +sz000949,新乡化纤,5.60 +sz000950,建峰化工,8.88 +sz000951,中国重汽,16.63 +sz000952,广济药业,17.26 +sz000953,河池化工,16.17 +sz000955,欣龙控股,8.95 +sz000957,中通客车,22.17 +sz000958,东方能源,0.00 +sz000959,首钢股份,3.72 +sz000960,锡业股份,12.67 +sz000961,中南建设,16.28 +sz000962,东方钽业,13.72 +sz000963,华东医药,77.36 +sz000965,天保基建,6.74 +sz000966,长源电力,14.76 +sz000967,上风高科,24.20 +sz000968,煤 气 化,7.67 +sz000969,安泰科技,13.12 +sz000970,中科三环,15.75 +sz000971,高升控股,0.00 +sz000972,新中基,0.00 +sz000973,佛塑科技,11.43 +sz000975,银泰资源,13.02 +sz000976,*ST春晖,8.91 +sz000977,浪潮信息,30.98 +sz000978,桂林旅游,11.72 +sz000979,中弘股份,5.31 +sz000980,金马股份,0.00 +sz000981,银亿股份,0.00 +sz000982,中银绒业,0.00 +sz000983,西山煤电,6.20 +sz000985,大庆华科,23.78 +sz000987,广州友谊,26.63 +sz000988,华工科技,18.18 +sz000989,九 芝 堂,29.48 +sz000990,诚志股份,28.39 +sz000993,闽东电力,10.80 +sz000995,*ST皇台,12.40 +sz000996,中国中期,30.35 +sz000997,新 大 陆,24.90 +sz000998,隆平高科,21.70 +sz000999,华润三九,27.16 +sz002001,新 和 成,16.15 +sz002002,鸿达兴业,27.28 +sz002003,伟星股份,16.12 +sz002004,华邦健康,14.34 +sz002005,德豪润达,10.38 +sz002006,精功科技,14.96 +sz002007,华兰生物,42.80 +sz002008,大族激光,25.77 +sz002009,天奇股份,20.25 +sz002010,传化股份,24.04 +sz002011,盾安环境,15.22 +sz002012,凯恩股份,8.91 +sz002013,中航机电,24.10 +sz002014,永新股份,20.28 +sz002015,*ST霞客,0.00 +sz002016,世荣兆业,13.77 +sz002017,东信和平,18.01 +sz002018,华信国际,0.00 +sz002019,亿帆鑫富,31.31 +sz002020,京新药业,30.20 +sz002021,中捷资源,12.29 +sz002022,科华生物,31.36 +sz002023,海特高新,21.33 +sz002024,苏宁云商,15.12 +sz002025,航天电器,28.36 +sz002026,山东威达,0.00 +sz002027,七喜控股,52.72 +sz002028,思源电气,16.65 +sz002029,七 匹 狼,13.51 +sz002030,达安基因,43.21 +sz002031,巨轮智能,14.33 +sz002032,苏 泊 尔,25.90 +sz002033,丽江旅游,14.69 +sz002034,美 欣 达,41.76 +sz002035,华帝股份,17.00 +sz002036,汉麻产业,29.74 +sz002037,久联发展,27.09 +sz002038,双鹭药业,34.41 +sz002039,黔源电力,18.34 +sz002040,南 京 港,0.00 +sz002041,登海种业,17.74 +sz002042,华孚色纺,12.53 +sz002043,兔 宝 宝,15.85 +sz002044,江苏三友,0.00 +sz002045,国光电器,16.48 +sz002046,轴研科技,12.32 +sz002047,宝鹰股份,11.83 +sz002048,宁波华翔,0.00 +sz002049,同方国芯,64.30 +sz002050,三花股份,10.05 +sz002051,中工国际,23.85 +sz002052,同洲电子,14.15 +sz002053,云南盐化,0.00 +sz002054,德美化工,13.60 +sz002055,得润电子,0.00 +sz002056,横店东磁,26.86 +sz002057,中钢天源,16.78 +sz002058,威 尔 泰,24.98 +sz002059,云南旅游,11.82 +sz002060,粤 水 电,9.37 +sz002061,江山化工,0.00 +sz002062,宏润建设,10.68 +sz002063,远光软件,23.06 +sz002064,华峰氨纶,7.07 +sz002065,东华软件,23.96 +sz002066,瑞泰科技,22.74 +sz002067,景兴纸业,11.77 +sz002068,黑猫股份,8.22 +sz002069,獐 子 岛,0.00 +sz002070,众和股份,0.00 +sz002071,长城影视,19.80 +sz002072,凯瑞德,23.49 +sz002073,软控股份,17.86 +sz002074,国轩高科,39.92 +sz002075,沙钢股份,0.00 +sz002076,雪 莱 特,17.87 +sz002077,大港股份,0.00 +sz002078,太阳纸业,5.95 +sz002079,苏州固锝,10.59 +sz002080,中材科技,22.83 +sz002081,金 螳 螂,17.83 +sz002082,栋梁新材,0.00 +sz002083,孚日股份,7.32 +sz002084,海鸥卫浴,13.26 +sz002085,万丰奥威,32.66 +sz002086,东方海洋,24.19 +sz002087,新野纺织,8.36 +sz002088,鲁阳节能,16.65 +sz002089,新 海 宜,17.82 +sz002090,金智科技,33.29 +sz002091,江苏国泰,0.00 +sz002092,中泰化学,0.00 +sz002093,国脉科技,15.02 +sz002094,青岛金王,0.00 +sz002095,生 意 宝,85.42 +sz002096,南岭民爆,23.71 +sz002097,山河智能,11.58 +sz002098,浔兴股份,16.50 +sz002099,海翔药业,21.22 +sz002100,天康生物,10.66 +sz002101,广东鸿图,25.18 +sz002102,冠福股份,0.00 +sz002103,广博股份,0.00 +sz002104,恒宝股份,20.52 +sz002105,信隆实业,9.61 +sz002106,莱宝高科,14.91 +sz002107,沃华医药,29.16 +sz002108,沧州明珠,19.88 +sz002109,兴化股份,0.00 +sz002110,三钢闽光,7.54 +sz002111,威海广泰,36.53 +sz002112,三变科技,0.00 +sz002113,天润控股,31.00 +sz002114,罗平锌电,19.85 +sz002115,三维通信,14.32 +sz002116,中国海诚,20.25 +sz002117,东港股份,40.98 +sz002118,紫鑫药业,20.98 +sz002119,康强电子,21.46 +sz002120,新海股份,22.86 +sz002121,科陆电子,28.83 +sz002122,天马股份,8.28 +sz002123,荣信股份,23.28 +sz002124,天邦股份,28.03 +sz002125,湘潭电化,21.47 +sz002126,银轮股份,0.00 +sz002127,新民科技,0.00 +sz002128,露天煤业,10.30 +sz002129,中环股份,14.97 +sz002130,沃尔核材,24.14 +sz002131,利欧股份,0.00 +sz002132,恒星科技,7.53 +sz002133,广宇集团,9.06 +sz002134,天津普林,14.53 +sz002135,东南网架,11.95 +sz002136,安 纳 达,15.46 +sz002137,实 益 达,17.64 +sz002138,顺络电子,15.70 +sz002139,拓邦股份,24.10 +sz002140,东华科技,20.60 +sz002141,蓉胜超微,30.50 +sz002142,宁波银行,14.85 +sz002143,印纪传媒,33.95 +sz002144,宏达高科,29.48 +sz002145,中核钛白,14.15 +sz002146,荣盛发展,10.75 +sz002147,方圆支承,0.00 +sz002148,北纬通信,20.87 +sz002149,西部材料,21.80 +sz002150,通润装备,0.00 +sz002151,北斗星通,55.27 +sz002152,广电运通,32.01 +sz002153,石基信息,132.18 +sz002154,报 喜 鸟,8.23 +sz002155,湖南黄金,8.82 +sz002156,通富微电,19.49 +sz002157,正邦科技,22.54 +sz002158,汉钟精机,21.08 +sz002159,三特索道,31.99 +sz002160,常铝股份,12.02 +sz002161,远 望 谷,24.55 +sz002162,悦心健康,15.39 +sz002163,中航三鑫,10.31 +sz002164,宁波东力,9.25 +sz002165,红 宝 丽,8.16 +sz002166,莱茵生物,15.75 +sz002167,东方锆业,10.38 +sz002168,深圳惠程,11.41 +sz002169,智光电气,24.52 +sz002170,芭田股份,13.58 +sz002171,楚江新材,22.82 +sz002172,澳洋科技,16.25 +sz002173,千足珍珠,23.82 +sz002174,游族网络,0.00 +sz002175,东方网络,62.16 +sz002176,江特电机,16.89 +sz002177,御银股份,11.24 +sz002178,延华智能,15.51 +sz002179,中航光电,40.86 +sz002180,艾派克,47.60 +sz002181,粤 传 媒,14.05 +sz002182,云海金属,13.70 +sz002183,怡 亚 通,49.77 +sz002184,海得控制,38.82 +sz002185,华天科技,19.48 +sz002186,全 聚 德,21.70 +sz002187,广百股份,16.28 +sz002188,新 嘉 联,36.79 +sz002189,利达光电,38.60 +sz002190,成飞集成,41.77 +sz002191,劲嘉股份,0.00 +sz002192,*ST融捷,39.30 +sz002193,山东如意,17.86 +sz002194,武汉凡谷,15.57 +sz002195,二三四五,37.78 +sz002196,方正电机,32.50 +sz002197,证通电子,27.39 +sz002198,嘉应制药,10.33 +sz002199,东晶电子,14.92 +sz002200,云投生态,21.41 +sz002201,九鼎新材,0.00 +sz002202,金风科技,16.25 +sz002203,海亮股份,0.00 +sz002204,大连重工,10.24 +sz002205,国统股份,31.16 +sz002206,海 利 得,15.48 +sz002207,准油股份,19.26 +sz002208,合肥城建,20.66 +sz002209,达 意 隆,0.00 +sz002210,飞马国际,0.00 +sz002211,宏达新材,11.50 +sz002212,南洋股份,13.63 +sz002213,特 尔 佳,17.12 +sz002214,大立科技,14.80 +sz002215,诺 普 信,17.57 +sz002216,三全食品,11.51 +sz002217,合力泰,18.50 +sz002218,拓日新能,10.90 +sz002219,恒康医疗,0.00 +sz002220,天宝股份,11.36 +sz002221,东华能源,30.24 +sz002222,福晶科技,23.78 +sz002223,鱼跃医疗,42.79 +sz002224,三 力 士,15.39 +sz002225,濮耐股份,8.00 +sz002226,江南化工,9.53 +sz002227,奥 特 迅,45.09 +sz002228,合兴包装,0.00 +sz002229,鸿博股份,26.42 +sz002230,科大讯飞,38.19 +sz002231,奥维通信,17.70 +sz002232,启明信息,17.93 +sz002233,塔牌集团,11.38 +sz002234,民和股份,15.93 +sz002235,安妮股份,0.00 +sz002236,大华股份,36.36 +sz002237,恒邦股份,10.27 +sz002238,天威视讯,25.86 +sz002239,奥特佳,0.00 +sz002240,威华股份,11.84 +sz002241,歌尔声学,33.91 +sz002242,九阳股份,24.46 +sz002243,通产丽星,14.16 +sz002244,滨江集团,8.30 +sz002245,澳洋顺昌,7.98 +sz002246,北化股份,0.00 +sz002247,帝龙新材,0.00 +sz002248,华东数控,0.00 +sz002249,大洋电机,12.95 +sz002250,联化科技,19.68 +sz002251,步 步 高,18.24 +sz002252,上海莱士,45.50 +sz002253,川大智胜,55.40 +sz002254,泰和新材,16.80 +sz002255,海陆重工,11.06 +sz002256,彩虹精化,27.60 +sz002258,利尔化学,25.80 +sz002259,升达林业,10.35 +sz002260,德奥通航,43.15 +sz002261,拓维信息,40.16 +sz002262,恩华药业,29.10 +sz002263,大 东 南,10.08 +sz002264,新 华 都,8.05 +sz002265,西仪股份,0.00 +sz002266,浙富控股,8.91 +sz002267,陕天然气,13.20 +sz002268,卫 士 通,60.85 +sz002269,美邦服饰,7.01 +sz002270,法因数控,20.10 +sz002271,东方雨虹,19.90 +sz002272,川润股份,9.12 +sz002273,水晶光电,38.36 +sz002274,华昌化工,11.93 +sz002275,桂林三金,22.85 +sz002276,万马股份,32.33 +sz002277,友阿股份,14.60 +sz002278,神开股份,19.74 +sz002279,久其软件,63.81 +sz002280,联络互动,68.32 +sz002281,光迅科技,60.93 +sz002282,博深工具,13.49 +sz002283,天润曲轴,20.68 +sz002284,亚太股份,14.27 +sz002285,世联行,17.51 +sz002286,保龄宝,0.00 +sz002287,奇正藏药,31.64 +sz002288,超华科技,12.33 +sz002289,宇顺电子,0.00 +sz002290,禾盛新材,38.43 +sz002291,星期六,15.67 +sz002292,奥飞动漫,39.15 +sz002293,罗莱家纺,18.69 +sz002294,信立泰,29.56 +sz002295,精艺股份,17.54 +sz002296,辉煌科技,20.82 +sz002297,博云新材,15.13 +sz002298,鑫龙电器,19.25 +sz002299,圣农发展,20.46 +sz002300,太阳电缆,12.02 +sz002301,齐心集团,25.60 +sz002302,西部建设,19.19 +sz002303,美盈森,0.00 +sz002304,洋河股份,63.99 +sz002305,南国置业,6.56 +sz002306,*ST云网,0.00 +sz002307,北新路桥,12.84 +sz002308,威创股份,23.09 +sz002309,中利科技,0.00 +sz002310,东方园林,0.00 +sz002311,海大集团,14.02 +sz002312,三泰控股,31.73 +sz002313,日海通讯,0.00 +sz002314,南山控股,10.04 +sz002315,焦点科技,104.00 +sz002316,键桥通讯,22.42 +sz002317,众生药业,13.97 +sz002318,久立特材,16.77 +sz002319,乐通股份,17.27 +sz002320,海峡股份,0.00 +sz002321,华英农业,11.61 +sz002322,理工监测,25.20 +sz002323,雅百特,0.00 +sz002324,普利特,29.64 +sz002325,洪涛股份,17.85 +sz002326,永太科技,22.05 +sz002327,富安娜,11.46 +sz002328,新朋股份,11.89 +sz002329,皇氏集团,23.88 +sz002330,得利斯,16.87 +sz002331,皖通科技,25.17 +sz002332,仙琚制药,14.42 +sz002333,罗普斯金,19.47 +sz002334,英威腾,12.67 +sz002335,科华恒盛,34.52 +sz002336,人人乐,13.38 +sz002337,赛象科技,11.35 +sz002338,奥普光电,68.69 +sz002339,积成电子,26.52 +sz002340,格林美,15.63 +sz002341,新纶科技,0.00 +sz002342,巨力索具,7.70 +sz002343,禾欣股份,68.63 +sz002344,海宁皮城,15.90 +sz002345,潮宏基,14.50 +sz002346,柘中股份,17.19 +sz002347,泰尔重工,21.22 +sz002348,高乐股份,19.76 +sz002349,精华制药,37.17 +sz002350,北京科锐,19.24 +sz002351,漫步者,28.05 +sz002352,鼎泰新材,29.79 +sz002353,杰瑞股份,28.11 +sz002354,天神娱乐,102.15 +sz002355,兴民钢圈,18.34 +sz002356,浩宁达,31.80 +sz002357,富临运业,16.68 +sz002358,森源电气,20.14 +sz002359,齐星铁塔,31.01 +sz002360,同德化工,13.85 +sz002361,神剑股份,19.46 +sz002362,汉王科技,33.35 +sz002363,隆基机械,20.50 +sz002364,中恒电气,30.43 +sz002365,永安药业,19.26 +sz002366,台海核电,67.30 +sz002367,康力电梯,19.19 +sz002368,太极股份,0.00 +sz002369,卓翼科技,15.16 +sz002370,亚太药业,34.30 +sz002371,七星电子,0.00 +sz002372,伟星新材,18.32 +sz002373,千方科技,51.28 +sz002374,丽鹏股份,17.90 +sz002375,亚厦股份,16.88 +sz002376,新北洋,16.08 +sz002377,国创高新,9.83 +sz002378,章源钨业,11.96 +sz002379,鲁丰环保,0.00 +sz002380,科远股份,35.90 +sz002381,双箭股份,18.77 +sz002382,蓝帆医疗,31.00 +sz002383,合众思壮,42.40 +sz002384,东山精密,0.00 +sz002385,大北农,13.06 +sz002386,天原集团,7.13 +sz002387,黑牛食品,18.03 +sz002388,新亚制程,11.98 +sz002389,南洋科技,20.53 +sz002390,信邦制药,0.00 +sz002391,长青股份,17.23 +sz002392,北京利尔,9.00 +sz002393,力生制药,47.75 +sz002394,联发股份,15.14 +sz002395,双象股份,23.17 +sz002396,星网锐捷,23.39 +sz002397,梦洁家纺,10.91 +sz002398,建研集团,18.03 +sz002399,海普瑞,31.98 +sz002400,省广股份,25.40 +sz002401,中海科技,0.00 +sz002402,和而泰,23.41 +sz002403,爱仕达,15.35 +sz002404,嘉欣丝绸,10.35 +sz002405,四维图新,43.91 +sz002406,远东传动,10.05 +sz002407,多氟多,60.50 +sz002408,齐翔腾达,13.81 +sz002409,雅克科技,0.00 +sz002410,广联达,20.58 +sz002411,九九久,17.08 +sz002412,汉森制药,0.00 +sz002413,雷科防务,54.57 +sz002414,高德红外,30.35 +sz002415,海康威视,35.89 +sz002416,爱施德,19.30 +sz002417,*ST元达,18.51 +sz002418,康盛股份,0.00 +sz002419,天虹商场,13.33 +sz002420,毅昌股份,10.17 +sz002421,达实智能,20.44 +sz002422,科伦药业,17.53 +sz002423,中原特钢,16.32 +sz002424,贵州百灵,29.60 +sz002425,凯撒股份,27.19 +sz002426,胜利精密,24.68 +sz002427,尤夫股份,18.91 +sz002428,云南锗业,16.90 +sz002429,兆驰股份,13.03 +sz002430,杭氧股份,10.69 +sz002431,棕榈园林,0.00 +sz002432,九安医疗,31.27 +sz002433,太安堂,16.25 +sz002434,万里扬,23.05 +sz002435,长江润发,0.00 +sz002436,兴森科技,20.92 +sz002437,誉衡药业,33.90 +sz002438,江苏神通,23.33 +sz002439,启明星辰,35.54 +sz002440,闰土股份,18.79 +sz002441,众业达,23.30 +sz002442,龙星化工,12.86 +sz002443,金洲管道,0.00 +sz002444,巨星科技,18.50 +sz002445,中南重工,27.60 +sz002446,盛路通信,32.73 +sz002447,壹桥海参,11.09 +sz002448,中原内配,13.18 +sz002449,国星光电,15.32 +sz002450,康得新,34.68 +sz002451,摩恩电气,14.07 +sz002452,长高集团,0.00 +sz002453,天马精化,0.00 +sz002454,松芝股份,18.80 +sz002455,百川股份,12.25 +sz002456,欧菲光,28.98 +sz002457,青龙管业,14.18 +sz002458,益生股份,28.78 +sz002459,天业通联,17.36 +sz002460,赣锋锂业,47.83 +sz002461,珠江啤酒,14.17 +sz002462,嘉事堂,46.57 +sz002463,沪电股份,6.56 +sz002464,金利科技,75.82 +sz002465,海格通信,17.60 +sz002466,天齐锂业,154.83 +sz002467,二六三,16.33 +sz002468,艾迪西,0.00 +sz002469,三维工程,17.35 +sz002470,金正大,20.82 +sz002471,中超控股,11.68 +sz002472,双环传动,30.00 +sz002473,圣莱达,0.00 +sz002474,榕基软件,20.29 +sz002475,立讯精密,0.00 +sz002476,宝莫股份,9.34 +sz002477,雏鹰农牧,17.65 +sz002478,常宝股份,14.16 +sz002479,富春环保,14.26 +sz002480,新筑股份,13.58 +sz002481,双塔食品,0.00 +sz002482,广田股份,26.38 +sz002483,润邦股份,0.00 +sz002484,江海股份,24.70 +sz002485,希努尔,0.00 +sz002486,嘉麟杰,6.87 +sz002487,大金重工,14.15 +sz002488,金固股份,27.50 +sz002489,浙江永强,12.40 +sz002490,山东墨龙,10.71 +sz002491,通鼎互联,18.46 +sz002492,恒基达鑫,15.14 +sz002493,荣盛石化,14.59 +sz002494,华斯股份,22.49 +sz002495,佳隆股份,7.49 +sz002496,辉丰股份,24.72 +sz002497,雅化集团,9.72 +sz002498,汉缆股份,8.61 +sz002499,科林环保,27.94 +sz002500,山西证券,16.28 +sz002501,利源精制,12.86 +sz002502,骅威股份,0.00 +sz002503,搜于特,16.37 +sz002504,弘高创意,29.40 +sz002505,大康牧业,7.37 +sz002506,协鑫集成,14.47 +sz002507,涪陵榨菜,20.38 +sz002508,老板电器,39.98 +sz002509,天广消防,17.88 +sz002510,天汽模,14.71 +sz002511,中顺洁柔,11.00 +sz002512,达华智能,21.97 +sz002513,蓝丰生化,18.18 +sz002514,宝馨科技,0.00 +sz002515,金字火腿,21.30 +sz002516,旷达科技,15.16 +sz002517,泰亚股份,59.20 +sz002518,科士达,35.52 +sz002519,银河电子,26.15 +sz002520,日发精机,27.14 +sz002521,齐峰新材,12.17 +sz002522,浙江众成,19.85 +sz002523,天桥起重,9.12 +sz002524,光正集团,8.64 +sz002526,山东矿机,11.43 +sz002527,新时达,26.20 +sz002528,英飞拓,15.02 +sz002529,海源机械,27.99 +sz002530,丰东股份,0.00 +sz002531,天顺风能,13.79 +sz002532,新界泵业,16.00 +sz002533,金杯电工,9.95 +sz002534,杭锅股份,16.58 +sz002535,林州重机,12.79 +sz002536,西泵股份,64.74 +sz002537,海立美达,0.00 +sz002538,司尔特,13.57 +sz002539,新都化工,14.88 +sz002540,亚太科技,10.38 +sz002541,鸿路钢构,0.00 +sz002542,中化岩土,13.26 +sz002543,万和电气,18.13 +sz002544,杰赛科技,0.00 +sz002545,东方铁塔,0.00 +sz002546,新联电子,26.99 +sz002547,春兴精工,13.11 +sz002548,金新农,17.99 +sz002549,凯美特气,14.33 +sz002550,千红制药,23.30 +sz002551,尚荣医疗,29.87 +sz002552,宝鼎重工,18.31 +sz002553,南方轴承,14.55 +sz002554,惠博普,13.39 +sz002555,顺荣三七,57.16 +sz002556,辉隆股份,20.02 +sz002557,洽洽食品,18.05 +sz002558,世纪游轮,82.10 +sz002559,亚威股份,17.95 +sz002560,通达股份,34.50 +sz002561,徐家汇,15.70 +sz002562,兄弟科技,23.81 +sz002563,森马服饰,13.43 +sz002564,天沃科技,10.50 +sz002565,上海绿新,10.57 +sz002566,益盛药业,17.00 +sz002567,唐人神,0.00 +sz002568,百润股份,49.74 +sz002569,步森股份,30.40 +sz002570,贝因美,15.96 +sz002571,德力股份,17.00 +sz002572,索菲亚,40.29 +sz002573,清新环境,23.58 +sz002574,明牌珠宝,17.31 +sz002575,群兴玩具,0.00 +sz002576,通达动力,28.21 +sz002577,雷柏科技,60.90 +sz002578,闽发铝业,9.85 +sz002579,中京电子,15.14 +sz002580,圣阳股份,19.32 +sz002581,未名医药,34.23 +sz002582,好想你,0.00 +sz002583,海能达,12.39 +sz002584,西陇化工,45.60 +sz002585,双星新材,12.52 +sz002586,围海股份,8.85 +sz002587,奥拓电子,16.18 +sz002588,史丹利,32.36 +sz002589,瑞康医药,39.55 +sz002590,万安科技,18.61 +sz002591,恒大高新,14.43 +sz002592,八菱科技,44.41 +sz002593,日上集团,33.54 +sz002594,比亚迪,64.51 +sz002595,豪迈科技,23.20 +sz002596,海南瑞泽,25.90 +sz002597,金禾实业,12.42 +sz002598,山东章鼓,12.07 +sz002599,盛通股份,35.65 +sz002600,江粉磁材,10.91 +sz002601,佰利联,35.50 +sz002602,世纪华通,0.00 +sz002603,以岭药业,0.00 +sz002604,龙力生物,0.00 +sz002605,姚记扑克,0.00 +sz002606,大连电瓷,17.15 +sz002607,亚夏汽车,14.15 +sz002608,*ST舜船,0.00 +sz002609,捷顺科技,22.82 +sz002610,爱康科技,13.52 +sz002611,东方精工,15.39 +sz002612,朗姿股份,55.31 +sz002613,北玻股份,7.82 +sz002614,蒙发利,19.26 +sz002615,哈尔斯,21.37 +sz002616,长青集团,26.75 +sz002617,露笑科技,21.98 +sz002618,丹邦科技,42.70 +sz002619,巨龙管业,0.00 +sz002620,瑞和股份,41.90 +sz002621,三垒股份,23.20 +sz002622,永大集团,0.00 +sz002623,亚玛顿,44.65 +sz002624,完美环球,0.00 +sz002625,龙生股份,70.64 +sz002626,金达威,13.73 +sz002627,宜昌交运,26.20 +sz002628,成都路桥,7.50 +sz002629,仁智油服,0.00 +sz002630,华西能源,13.58 +sz002631,德尔未来,26.28 +sz002632,道明光学,20.49 +sz002633,*ST申科,0.00 +sz002634,棒杰股份,36.48 +sz002635,安洁科技,27.48 +sz002636,金安国纪,0.00 +sz002637,赞宇科技,24.04 +sz002638,勤上光电,0.00 +sz002639,雪人股份,0.00 +sz002640,跨境通,36.25 +sz002641,永高股份,10.40 +sz002642,荣之联,50.55 +sz002643,万润股份,35.15 +sz002644,佛慈制药,18.00 +sz002645,华宏科技,23.06 +sz002646,青青稞酒,23.36 +sz002647,宏磊股份,0.00 +sz002648,卫星石化,10.90 +sz002649,博彦科技,58.68 +sz002650,加加食品,7.43 +sz002651,利君股份,15.52 +sz002652,扬子新材,0.00 +sz002653,海思科,23.25 +sz002654,万润科技,36.16 +sz002655,共达电声,0.00 +sz002656,卡奴迪路,22.24 +sz002657,中科金财,94.64 +sz002658,雪迪龙,28.44 +sz002659,中泰桥梁,27.10 +sz002660,茂硕电源,14.58 +sz002661,克明面业,53.35 +sz002662,京威股份,16.19 +sz002663,普邦园林,8.92 +sz002664,信质电机,30.95 +sz002665,首航节能,0.00 +sz002666,德联集团,12.70 +sz002667,鞍重股份,0.00 +sz002668,奥马电器,107.50 +sz002669,康达新材,30.61 +sz002670,华声股份,40.88 +sz002671,龙泉股份,19.23 +sz002672,东江环保,21.37 +sz002673,西部证券,38.63 +sz002674,兴业科技,17.15 +sz002675,东诚药业,47.81 +sz002676,顺威股份,39.14 +sz002677,浙江美大,23.10 +sz002678,珠江钢琴,16.00 +sz002679,福建金森,23.51 +sz002680,黄海机械,45.00 +sz002681,奋达科技,45.31 +sz002682,龙洲股份,16.84 +sz002683,宏大爆破,0.00 +sz002684,猛狮科技,29.53 +sz002685,华东重机,10.41 +sz002686,亿利达,18.58 +sz002687,乔治白,13.72 +sz002688,金河生物,21.53 +sz002689,博林特,11.86 +sz002690,美亚光电,34.46 +sz002691,冀凯股份,20.48 +sz002692,远程电缆,18.96 +sz002693,双成药业,14.99 +sz002694,顾地科技,14.70 +sz002695,煌上煌,37.17 +sz002696,百洋股份,22.65 +sz002697,红旗连锁,8.21 +sz002698,博实股份,34.58 +sz002699,美盛文化,52.80 +sz002700,新疆浩源,14.69 +sz002701,奥瑞金,29.78 +sz002702,海欣食品,29.08 +sz002703,浙江世宝,39.93 +sz002705,新宝股份,20.18 +sz002706,良信电器,67.00 +sz002707,众信旅游,0.00 +sz002708,光洋股份,20.11 +sz002709,天赐材料,71.38 +sz002711,欧浦智网,34.45 +sz002712,思美传媒,106.99 +sz002713,东易日盛,29.70 +sz002714,牧原股份,57.94 +sz002715,登云股份,36.05 +sz002716,金贵银业,13.27 +sz002717,岭南园林,31.06 +sz002718,友邦吊顶,60.19 +sz002719,麦趣尔,0.00 +sz002721,金一文化,0.00 +sz002722,金轮股份,36.55 +sz002723,金莱特,25.58 +sz002724,海洋王,26.98 +sz002725,跃岭股份,23.65 +sz002726,龙大肉食,15.58 +sz002727,一心堂,65.80 +sz002728,台城制药,31.62 +sz002729,好利来,64.75 +sz002730,电光科技,0.00 +sz002731,萃华珠宝,33.39 +sz002732,燕塘乳业,38.09 +sz002733,雄韬股份,23.79 +sz002734,利民股份,35.50 +sz002735,王子新材,46.39 +sz002736,国信证券,21.85 +sz002737,葵花药业,52.16 +sz002738,中矿资源,40.63 +sz002739,万达院线,106.50 +sz002740,爱迪尔,51.41 +sz002741,光华科技,40.97 +sz002742,三圣特材,38.25 +sz002743,富煌钢构,33.90 +sz002745,木林森,41.54 +sz002746,仙坛股份,38.77 +sz002747,埃斯顿,77.00 +sz002748,世龙实业,36.60 +sz002749,国光股份,107.37 +sz002750,龙津药业,47.34 +sz002751,易尚展示,148.25 +sz002752,昇兴股份,38.10 +sz002753,永东股份,46.19 +sz002755,东方新星,42.35 +sz002756,永兴特钢,56.65 +sz002757,南兴装备,52.03 +sz002758,华通医药,103.38 +sz002759,天际股份,45.50 +sz002760,凤形股份,49.40 +sz002761,多喜爱,38.75 +sz002762,金发拉比,79.73 +sz002763,汇洁股份,44.12 +sz002765,蓝黛传动,32.92 +sz002766,索菱股份,42.72 +sz002767,先锋电子,46.36 +sz002768,国恩股份,62.56 +sz002769,普路通,95.14 +sz002770,科迪乳业,0.00 +sz002771,真视通,128.01 +sz002772,众兴菌业,47.20 +sz002773,康弘药业,90.10 +sz002775,文科园林,60.44 +sz002776,柏堡龙,69.85 +sz300001,特锐德,31.700 +sz300002,神州泰岳,13.920 +sz300003,乐普医疗,40.560 +sz300004,南风股份,29.110 +sz300005,探路者,25.710 +sz300006,莱美药业,34.090 +sz300007,汉威电子,35.540 +sz300008,上海佳豪,25.050 +sz300009,安科生物,35.430 +sz300010,立思辰,37.310 +sz300011,鼎汉技术,31.720 +sz300012,华测检测,28.550 +sz300013,新宁物流,22.880 +sz300014,亿纬锂能,31.210 +sz300015,爱尔眼科,31.560 +sz300016,北陆药业,0.000 +sz300017,网宿科技,60.700 +sz300018,中元华电,35.990 +sz300019,硅宝科技,17.580 +sz300020,银江股份,0.000 +sz300021,大禹节水,16.600 +sz300022,吉峰农机,10.620 +sz300023,宝德股份,35.680 +sz300024,机器人,83.600 +sz300025,华星创业,30.410 +sz300026,红日药业,20.610 +sz300027,华谊兄弟,41.070 +sz300028,金亚科技,0.000 +sz300029,天龙光电,14.220 +sz300030,阳普医疗,0.000 +sz300031,宝通科技,32.400 +sz300032,金龙机电,30.180 +sz300033,同花顺,83.010 +sz300034,钢研高纳,29.730 +sz300035,中科电气,14.850 +sz300036,超图软件,0.000 +sz300037,新宙邦,45.300 +sz300038,梅泰诺,42.020 +sz300039,上海凯宝,14.400 +sz300040,九洲电气,13.330 +sz300041,回天新材,26.400 +sz300042,朗科科技,37.550 +sz300043,互动娱乐,17.220 +sz300044,赛为智能,29.310 +sz300045,华力创通,23.490 +sz300046,台基股份,23.560 +sz300047,天源迪科,27.110 +sz300048,合康变频,17.920 +sz300049,福瑞股份,32.780 +sz300050,世纪鼎利,38.500 +sz300051,三五互联,21.990 +sz300052,中青宝,32.060 +sz300053,欧比特,42.900 +sz300054,鼎龙股份,0.000 +sz300055,万邦达,24.680 +sz300056,三维丝,22.960 +sz300057,万顺股份,17.400 +sz300058,蓝色光标,16.480 +sz300059,东方财富,62.960 +sz300061,康耐特,0.000 +sz300062,中能电气,28.090 +sz300063,天龙集团,40.000 +sz300064,豫金刚石,14.300 +sz300065,海兰信,42.700 +sz300066,三川股份,14.150 +sz300067,安诺其,10.700 +sz300068,南都电源,19.620 +sz300069,金利华电,0.000 +sz300070,碧水源,51.300 +sz300071,华谊嘉信,13.960 +sz300072,三聚环保,35.080 +sz300073,当升科技,30.560 +sz300074,华平股份,16.420 +sz300075,数字政通,34.820 +sz300076,GQY视讯,31.260 +sz300077,国民技术,42.160 +sz300078,思创医惠,42.550 +sz300079,数码视讯,13.070 +sz300080,新大新材,10.040 +sz300081,恒信移动,47.800 +sz300082,奥克股份,7.980 +sz300083,劲胜精密,43.700 +sz300084,海默科技,12.360 +sz300085,银之杰,54.010 +sz300086,康芝药业,16.030 +sz300087,荃银高科,11.990 +sz300088,长信科技,13.300 +sz300089,文化长城,28.920 +sz300090,盛运环保,12.560 +sz300091,金通灵,39.270 +sz300092,科新机电,0.000 +sz300093,金刚玻璃,0.000 +sz300094,国联水产,0.000 +sz300095,华伍股份,14.350 +sz300096,易联众,29.260 +sz300097,智云股份,44.000 +sz300098,高新兴,15.220 +sz300099,尤洛卡,0.000 +sz300100,双林股份,22.930 +sz300101,振芯科技,34.270 +sz300102,乾照光电,9.690 +sz300103,达刚路机,20.620 +sz300104,乐视网,52.450 +sz300105,龙源技术,12.110 +sz300106,西部牧业,19.630 +sz300107,建新股份,7.800 +sz300108,双龙股份,18.700 +sz300109,新开源,70.940 +sz300110,华仁药业,16.570 +sz300111,向日葵,7.010 +sz300112,万讯自控,20.390 +sz300113,顺网科技,86.850 +sz300114,中航电测,54.480 +sz300115,长盈精密,35.120 +sz300116,坚瑞消防,10.750 +sz300117,嘉寓股份,10.630 +sz300118,东方日升,13.910 +sz300119,瑞普生物,20.750 +sz300120,经纬电材,0.000 +sz300121,阳谷华泰,13.630 +sz300122,智飞生物,35.140 +sz300123,太阳鸟,0.000 +sz300124,汇川技术,48.500 +sz300125,易世达,30.490 +sz300126,锐奇股份,21.590 +sz300127,银河磁体,17.580 +sz300128,锦富新材,22.970 +sz300129,泰胜风能,10.070 +sz300130,新国都,34.190 +sz300131,英唐智控,0.000 +sz300132,青松股份,9.830 +sz300133,华策影视,32.490 +sz300134,大富科技,0.000 +sz300135,宝利国际,10.430 +sz300136,信维通信,29.420 +sz300137,先河环保,23.030 +sz300138,晨光生物,20.600 +sz300139,晓程科技,18.310 +sz300140,启源装备,28.160 +sz300141,和顺电气,28.820 +sz300142,沃森生物,15.570 +sz300143,星河生物,0.000 +sz300144,宋城演艺,0.000 +sz300145,南方泵业,47.100 +sz300146,汤臣倍健,35.100 +sz300147,香雪制药,25.520 +sz300148,天舟文化,0.000 +sz300149,量子高科,0.000 +sz300150,世纪瑞尔,16.450 +sz300151,昌红科技,16.590 +sz300152,科融环境,13.810 +sz300153,科泰电源,16.490 +sz300154,瑞凌股份,15.450 +sz300155,安居宝,20.010 +sz300156,神雾环保,53.730 +sz300157,恒泰艾普,13.260 +sz300158,振东制药,20.500 +sz300159,新研股份,17.610 +sz300160,秀强股份,34.930 +sz300161,华中数控,37.420 +sz300162,雷曼股份,0.000 +sz300163,先锋新材,14.620 +sz300164,通源石油,11.910 +sz300165,天瑞仪器,25.000 +sz300166,东方国信,38.590 +sz300167,迪威视讯,23.800 +sz300168,万达信息,0.000 +sz300169,天晟新材,0.000 +sz300170,汉得信息,21.680 +sz300171,东富龙,26.510 +sz300172,中电环保,18.160 +sz300173,智慧松德,20.250 +sz300174,元力股份,24.810 +sz300175,朗源股份,11.220 +sz300176,鸿特精密,28.600 +sz300177,中海达,20.150 +sz300178,腾邦国际,0.000 +sz300179,四方达,8.750 +sz300180,华峰超纤,16.380 +sz300181,佐力药业,11.980 +sz300182,捷成股份,23.090 +sz300183,东软载波,28.380 +sz300184,力源信息,21.400 +sz300185,通裕重工,9.920 +sz300187,永清环保,42.710 +sz300188,美亚柏科,0.000 +sz300189,神农基因,0.000 +sz300190,维尔利,25.920 +sz300191,潜能恒信,40.690 +sz300192,科斯伍德,14.920 +sz300193,佳士科技,14.650 +sz300194,福安药业,0.000 +sz300195,长荣股份,25.970 +sz300196,长海股份,30.880 +sz300197,铁汉生态,18.860 +sz300198,纳川股份,14.540 +sz300199,翰宇药业,27.990 +sz300200,高盟新材,17.050 +sz300201,海伦哲,19.800 +sz300202,聚龙股份,31.210 +sz300203,聚光科技,36.880 +sz300204,舒泰神,34.980 +sz300205,天喻信息,22.770 +sz300206,理邦仪器,27.800 +sz300207,欣旺达,28.020 +sz300208,恒顺众昇,0.000 +sz300209,天泽信息,0.000 +sz300210,森远股份,19.050 +sz300211,亿通科技,23.350 +sz300212,易华录,55.650 +sz300213,佳讯飞鸿,40.450 +sz300214,日科化学,9.260 +sz300215,电科院,14.120 +sz300216,千山药机,45.700 +sz300217,东方电热,12.700 +sz300218,安利股份,16.310 +sz300219,鸿利光电,16.210 +sz300220,金运激光,45.430 +sz300221,银禧科技,12.560 +sz300222,科大智能,0.000 +sz300223,北京君正,39.000 +sz300224,正海磁材,25.980 +sz300225,金力泰,8.500 +sz300226,上海钢联,61.770 +sz300227,光韵达,36.700 +sz300228,富瑞特装,22.990 +sz300229,拓尔思,35.750 +sz300230,永利带业,28.220 +sz300231,银信科技,24.480 +sz300232,洲明科技,34.010 +sz300233,金城医药,35.960 +sz300234,开尔新材,21.800 +sz300235,方直科技,0.000 +sz300236,上海新阳,40.680 +sz300237,美晨科技,12.910 +sz300238,冠昊生物,0.000 +sz300239,东宝生物,15.780 +sz300240,飞力达,18.900 +sz300241,瑞丰光电,16.050 +sz300242,明家科技,39.560 +sz300243,瑞丰高材,20.500 +sz300244,迪安诊断,79.750 +sz300245,天玑科技,30.460 +sz300246,宝莱特,35.000 +sz300247,乐金健康,0.000 +sz300248,新开普,32.100 +sz300249,依米康,26.900 +sz300250,初灵信息,70.100 +sz300251,光线传媒,27.820 +sz300252,金信诺,36.900 +sz300253,卫宁软件,46.680 +sz300254,仟源医药,34.740 +sz300255,常山药业,19.250 +sz300256,星星科技,26.790 +sz300257,开山股份,25.630 +sz300258,精锻科技,16.850 +sz300259,新天科技,11.880 +sz300260,新莱应材,31.300 +sz300261,雅本化学,0.000 +sz300262,巴安水务,21.500 +sz300263,隆华节能,23.080 +sz300264,佳创视讯,17.970 +sz300265,通光线缆,14.160 +sz300266,兴源环境,47.660 +sz300267,尔康制药,31.300 +sz300268,万福生科,34.300 +sz300269,联建光电,0.000 +sz300270,中威电子,20.180 +sz300271,华宇软件,42.970 +sz300272,开能环保,22.400 +sz300273,和佳股份,23.600 +sz300274,阳光电源,28.760 +sz300275,梅安森,25.350 +sz300276,三丰智能,29.650 +sz300277,海联讯,35.350 +sz300278,华昌达,22.980 +sz300279,和晶科技,60.110 +sz300280,南通锻压,0.000 +sz300281,金明精机,18.340 +sz300282,汇冠股份,31.350 +sz300283,温州宏丰,13.410 +sz300284,苏交科,24.600 +sz300285,国瓷材料,38.450 +sz300286,安科瑞,38.570 +sz300287,飞利信,19.800 +sz300288,朗玛信息,0.000 +sz300289,利德曼,21.400 +sz300290,荣科科技,21.350 +sz300291,华录百纳,38.010 +sz300292,吴通控股,43.950 +sz300293,蓝英装备,27.030 +sz300294,博雅生物,40.630 +sz300295,三六五网,60.050 +sz300296,利亚德,23.720 +sz300297,蓝盾股份,21.130 +sz300298,三诺生物,37.060 +sz300299,富春通信,51.430 +sz300300,汉鼎股份,30.270 +sz300301,长方照明,9.760 +sz300302,同有科技,73.810 +sz300303,聚飞光电,10.820 +sz300304,云意电气,24.380 +sz300305,裕兴股份,29.680 +sz300306,远方光电,0.000 +sz300307,慈星股份,17.530 +sz300308,中际装备,17.440 +sz300309,吉艾科技,19.810 +sz300310,宜通世纪,49.690 +sz300311,任子行,43.590 +sz300312,邦讯技术,40.700 +sz300313,天山生物,0.000 +sz300314,戴维医疗,36.880 +sz300315,掌趣科技,15.420 +sz300316,晶盛机电,17.300 +sz300317,珈伟股份,0.000 +sz300318,博晖创新,24.250 +sz300319,麦捷科技,31.740 +sz300320,海达股份,13.730 +sz300321,同大股份,104.570 +sz300322,硕贝德,15.520 +sz300323,华灿光电,9.180 +sz300324,旋极信息,46.690 +sz300325,德威新材,17.820 +sz300326,凯利泰,0.000 +sz300327,中颖电子,34.270 +sz300328,宜安科技,32.590 +sz300329,海伦钢琴,23.100 +sz300330,华虹计通,19.690 +sz300331,苏大维格,0.000 +sz300332,天壕环境,27.220 +sz300333,兆日科技,32.570 +sz300334,津膜科技,0.000 +sz300335,迪森股份,17.850 +sz300336,新文化,33.390 +sz300337,银邦股份,10.570 +sz300338,开元仪器,16.710 +sz300339,润和软件,48.000 +sz300340,科恒股份,30.390 +sz300341,麦迪电气,23.700 +sz300342,天银机电,0.000 +sz300343,联创股份,104.680 +sz300344,太空板业,0.000 +sz300345,红宇新材,17.590 +sz300346,南大光电,37.360 +sz300347,泰格医药,35.300 +sz300348,长亮科技,79.300 +sz300349,金卡股份,0.000 +sz300350,华鹏飞,39.990 +sz300351,永贵电器,0.000 +sz300352,北信源,53.680 +sz300353,东土科技,27.900 +sz300354,东华测试,38.400 +sz300355,蒙草抗旱,20.420 +sz300356,光一科技,45.540 +sz300357,我武生物,45.700 +sz300358,楚天科技,0.000 +sz300359,全通教育,116.230 +sz300360,炬华科技,35.230 +sz300362,天保重装,46.200 +sz300363,博腾股份,29.050 +sz300364,中文在线,221.000 +sz300365,恒华科技,0.000 +sz300366,创意信息,55.000 +sz300367,东方网力,78.200 +sz300368,汇金股份,28.710 +sz300369,绿盟科技,50.190 +sz300370,安控科技,0.000 +sz300371,汇中股份,31.420 +sz300372,欣泰电气,18.600 +sz300373,扬杰科技,25.870 +sz300374,恒通科技,28.490 +sz300375,鹏翎股份,23.150 +sz300376,易事特,48.120 +sz300377,赢时胜,84.900 +sz300378,鼎捷软件,62.400 +sz300379,东方通,91.360 +sz300380,安硕信息,76.800 +sz300381,溢多利,56.490 +sz300382,斯莱克,46.580 +sz300383,光环新网,58.000 +sz300384,三联虹普,69.980 +sz300385,雪浪环境,48.760 +sz300386,飞天诚信,52.620 +sz300387,富邦股份,29.460 +sz300388,国祯环保,39.040 +sz300389,艾比森,40.490 +sz300390,天华超净,46.860 +sz300391,康跃科技,22.120 +sz300392,腾信股份,46.500 +sz300393,中来股份,52.660 +sz300394,天孚通信,106.810 +sz300395,菲利华,40.150 +sz300396,迪瑞医疗,53.290 +sz300397,天和防务,98.100 +sz300398,飞凯材料,79.100 +sz300399,京天利,71.170 +sz300400,劲拓股份,39.600 +sz300401,花园生物,24.260 +sz300402,宝色股份,19.580 +sz300403,地尔汉宇,59.900 +sz300404,博济医药,52.960 +sz300405,科隆精化,50.990 +sz300406,九强生物,46.550 +sz300407,凯发电气,0.000 +sz300408,三环集团,37.990 +sz300409,道氏技术,58.370 +sz300410,正业科技,117.690 +sz300411,金盾股份,39.740 +sz300412,迦南科技,51.950 +sz300413,快乐购,50.200 +sz300414,中光防雷,50.500 +sz300415,伊之密,25.500 +sz300416,苏试试验,90.040 +sz300417,南华仪器,113.750 +sz300418,昆仑万维,53.210 +sz300419,浩丰科技,206.550 +sz300420,五洋科技,64.420 +sz300421,力星股份,41.500 +sz300422,博世科,51.800 +sz300423,鲁亿通,50.190 +sz300424,航新科技,92.940 +sz300425,环能科技,48.100 +sz300426,唐德影视,80.300 +sz300427,红相电力,79.900 +sz300428,四通新材,59.200 +sz300429,强力新材,135.080 +sz300430,诚益通,63.950 +sz300431,暴风科技,0.000 +sz300432,富临精工,30.630 +sz300433,蓝思科技,92.550 +sz300434,金石东方,71.320 +sz300435,中泰股份,66.690 +sz300436,广生堂,97.910 +sz300437,清水源,97.000 +sz300438,鹏辉能源,129.270 +sz300439,美康生物,47.840 +sz300440,运达科技,89.620 +sz300441,鲍斯股份,41.670 +sz300442,普丽盛,73.810 +sz300443,金雷风电,210.950 +sz300444,双杰电气,35.560 +sz300445,康斯特,66.890 +sz300446,乐凯新材,131.980 +sz300447,全信股份,104.200 +sz300448,浩云科技,107.780 +sz300449,汉邦高科,123.200 +sz300450,先导股份,101.970 +sz300451,创业软件,212.290 +sz300452,山河药辅,124.540 +sz300453,三鑫医疗,80.850 +sz300455,康拓红外,50.760 +sz300456,耐威科技,0.000 +sz300457,赢合科技,77.190 +sz300458,全志科技,109.490 +sz300459,浙江金科,0.000 +sz300460,惠伦晶体,38.060 +sz300461,田中精机,61.080 +sz300462,华铭智能,36.480 +sz300463,迈克生物,122.650 +sz300464,星徽精密,50.700 +sz300465,高伟达,96.010 +sz300466,赛摩电气,0.000 +sz300467,迅游科技,66.030 +sz300468,四方精创,89.430 +sz300469,信息发展,139.800 +sz300470,日机密封,106.980 +sz300471,厚普股份,89.440 +sz300472,新元科技,60.690 +sz300473,德尔股份,91.080 +sz300475,聚隆科技,33.230 +sz300476,胜宏科技,56.180 +sz300477,合纵科技,54.870 +sz300478,杭州高新,66.960 +sz300479,神思电子,97.460 +sz300480,光力科技,75.790 +sz300481,濮阳惠成,54.960 +sz300482,万孚生物,147.620 +sz300483,沃施股份,61.500 +sz300485,赛升药业,146.300 +sz300486,东杰智能,54.800 +sz300487,蓝晓科技,69.280 +sz300488,恒锋工具,94.950 +sz300489,中飞股份,104.910 +sz300498,温氏股份,55.700 +sh600000,浦发银行,19.05 +sh600004,白云机场,13.68 +sh600005,武钢股份,3.76 +sh600006,东风汽车,9.46 +sh600007,中国国贸,16.26 +sh600008,首创股份,10.99 +sh600009,上海机场,30.20 +sh600010,包钢股份,4.03 +sh600011,华能国际,9.26 +sh600012,皖通高速,13.54 +sh600015,华夏银行,11.06 +sh600016,民生银行,8.80 +sh600017,日照港,8.49 +sh600018,上港集团,7.25 +sh600019,宝钢股份,5.80 +sh600020,中原高速,6.34 +sh600021,上海电力,16.22 +sh600022,山东钢铁,3.19 +sh600023,浙能电力,8.49 +sh600026,中海发展,11.08 +sh600027,华电国际,7.18 +sh600028,中国石化,5.12 +sh600029,南方航空,8.61 +sh600030,中信证券,20.29 +sh600031,三一重工,6.96 +sh600033,福建高速,4.26 +sh600035,楚天高速,5.19 +sh600036,招商银行,17.88 +sh600037,歌华有线,24.48 +sh600038,中直股份,59.87 +sh600039,四川路桥,5.17 +sh600048,保利地产,9.49 +sh600050,中国联通,6.65 +sh600051,宁波联合,12.09 +sh600052,浙江广厦,8.09 +sh600053,中江地产,30.99 +sh600054,黄山旅游,22.88 +sh600055,华润万东,39.98 +sh600056,中国医药,16.48 +sh600057,象屿股份,12.96 +sh600058,五矿发展,37.31 +sh600059,古越龙山,10.75 +sh600060,海信电器,18.04 +sh600061,国投安信,25.13 +sh600062,华润双鹤,22.98 +sh600063,皖维高新,6.21 +sh600064,南京高科,19.97 +sh600066,宇通客车,21.18 +sh600067,冠城大通,9.14 +sh600068,葛洲坝,8.26 +sh600069,*ST银鸽,5.09 +sh600070,浙江富润,9.50 +sh600071,*ST光学,23.04 +sh600072,钢构工程,25.99 +sh600073,上海梅林,13.40 +sh600074,保千里,17.44 +sh600075,新疆天业,11.23 +sh600076,青鸟华光,10.75 +sh600077,宋都股份,7.17 +sh600078,澄星股份,6.80 +sh600079,人福医药,19.51 +sh600080,金花股份,13.87 +sh600081,东风科技,19.66 +sh600082,海泰发展,7.08 +sh600083,博信股份,20.14 +sh600084,中葡股份,7.26 +sh600085,同仁堂,26.81 +sh600086,东方金钰,15.09 +sh600088,中视传媒,28.06 +sh600089,特变电工,12.42 +sh600090,啤酒花,17.56 +sh600091,*ST明科,11.99 +sh600093,禾嘉股份,18.49 +sh600094,大名城,11.38 +sh600095,哈高科,12.17 +sh600096,云天化,14.41 +sh600097,开创国际,30.24 +sh600098,广州发展,13.64 +sh600099,林海股份,13.37 +sh600100,同方股份,18.74 +sh600101,明星电力,13.75 +sh600103,青山纸业,8.19 +sh600104,上汽集团,19.84 +sh600105,永鼎股份,23.53 +sh600106,重庆路桥,10.54 +sh600107,美尔雅,17.72 +sh600108,亚盛集团,7.79 +sh600109,国金证券,17.31 +sh600110,中科英华,13.73 +sh600111,北方稀土,15.10 +sh600112,天成控股,16.90 +sh600113,浙江东日,11.87 +sh600114,东睦股份,14.77 +sh600115,东方航空,7.82 +sh600116,三峡水利,17.75 +sh600117,西宁特钢,5.97 +sh600118,中国卫星,48.97 +sh600119,长江投资,22.83 +sh600120,浙江东方,19.86 +sh600121,郑州煤电,6.45 +sh600122,宏图高科,16.94 +sh600123,兰花科创,7.94 +sh600125,铁龙物流,10.29 +sh600126,杭钢股份,8.98 +sh600127,金健米业,7.29 +sh600128,弘业股份,15.33 +sh600129,太极集团,22.79 +sh600130,波导股份,8.72 +sh600131,岷江水电,9.60 +sh600132,重庆啤酒,16.44 +sh600133,东湖高新,13.14 +sh600135,乐凯胶片,17.28 +sh600136,道博股份,62.29 +sh600137,浪莎股份,44.06 +sh600138,中青旅,20.64 +sh600139,西部资源,16.67 +sh600141,兴发集团,13.82 +sh600143,金发科技,8.81 +sh600145,*ST新亿,7.73 +sh600146,商赢环球,33.33 +sh600148,长春一东,29.79 +sh600149,廊坊发展,17.26 +sh600150,中国船舶,38.49 +sh600151,航天机电,13.66 +sh600152,维科精华,11.31 +sh600153,建发股份,17.31 +sh600155,宝硕股份,14.98 +sh600156,华升股份,13.08 +sh600157,永泰能源,5.13 +sh600158,中体产业,22.12 +sh600159,大龙地产,6.09 +sh600160,巨化股份,19.69 +sh600161,天坛生物,30.91 +sh600162,香江控股,9.27 +sh600163,*ST南纸,7.19 +sh600165,新日恒力,16.52 +sh600166,福田汽车,6.92 +sh600167,联美控股,25.76 +sh600168,武汉控股,9.68 +sh600169,太原重工,6.70 +sh600170,上海建工,7.94 +sh600171,上海贝岭,22.80 +sh600172,黄河旋风,24.48 +sh600173,卧龙地产,8.24 +sh600175,美都能源,6.07 +sh600176,中国巨石,25.32 +sh600177,雅戈尔,16.08 +sh600178,东安动力,11.32 +sh600179,黑化股份,15.85 +sh600180,瑞茂通,25.06 +sh600182,S佳通,17.67 +sh600183,生益科技,9.56 +sh600184,光电股份,33.99 +sh600185,格力地产,21.29 +sh600186,莲花味精,7.67 +sh600187,国中水务,6.27 +sh600188,兖州煤业,9.95 +sh600189,吉林森工,13.79 +sh600190,锦州港,6.24 +sh600191,华资实业,22.32 +sh600192,长城电工,10.70 +sh600193,创兴资源,13.48 +sh600195,中牧股份,17.18 +sh600196,复星医药,25.61 +sh600197,伊力特,13.43 +sh600198,大唐电信,25.13 +sh600199,金种子酒,9.75 +sh600200,江苏吴中,28.14 +sh600201,金宇集团,33.67 +sh600202,哈空调,12.74 +sh600203,福日电子,14.01 +sh600206,有研新材,14.52 +sh600207,安彩高科,13.66 +sh600208,新湖中宝,5.67 +sh600209,罗顿发展,10.41 +sh600210,紫江企业,7.67 +sh600211,西藏药业,39.63 +sh600212,江泉实业,9.34 +sh600213,亚星客车,13.14 +sh600215,长春经开,9.97 +sh600216,浙江医药,10.89 +sh600217,*ST秦岭,9.53 +sh600218,全柴动力,12.78 +sh600219,南山铝业,6.58 +sh600220,江苏阳光,6.35 +sh600221,海南航空,4.04 +sh600222,太龙药业,8.55 +sh600223,鲁商置业,8.16 +sh600225,天津松江,7.82 +sh600226,升华拜克,10.41 +sh600227,赤天化,5.04 +sh600228,昌九生化,14.04 +sh600229,城市传媒,20.41 +sh600230,沧州大化,12.50 +sh600231,凌钢股份,6.56 +sh600232,金鹰股份,11.18 +sh600233,大杨创世,21.32 +sh600234,山水文化,17.17 +sh600235,民丰特纸,10.96 +sh600236,桂冠电力,7.60 +sh600237,铜峰电子,5.73 +sh600238,海南椰岛,16.79 +sh600239,云南城投,7.36 +sh600240,华业资本,14.81 +sh600241,时代万恒,15.08 +sh600242,*ST中昌,7.82 +sh600243,青海华鼎,14.09 +sh600246,万通地产,5.65 +sh600247,*ST成城,17.29 +sh600248,延长化建,10.21 +sh600249,两面针,9.12 +sh600250,南纺股份,17.01 +sh600251,冠农股份,12.06 +sh600252,中恒集团,7.22 +sh600255,鑫科材料,6.00 +sh600256,广汇能源,7.45 +sh600257,大湖股份,12.69 +sh600258,首旅酒店,18.55 +sh600259,广晟有色,48.45 +sh600260,凯乐科技,16.91 +sh600261,阳光照明,8.27 +sh600262,北方股份,45.03 +sh600265,ST景谷,24.06 +sh600266,北京城建,15.41 +sh600267,海正药业,14.67 +sh600268,国电南自,10.77 +sh600269,赣粤高速,5.97 +sh600270,外运发展,27.04 +sh600271,航天信息,55.91 +sh600272,开开实业,20.90 +sh600273,嘉化能源,11.32 +sh600275,武昌鱼,8.25 +sh600276,恒瑞医药,50.71 +sh600277,亿利能源,9.96 +sh600278,东方创业,19.55 +sh600279,重庆港九,13.89 +sh600280,中央商场,12.39 +sh600281,太化股份,6.86 +sh600282,南钢股份,3.49 +sh600283,钱江水利,19.81 +sh600284,浦东建设,14.57 +sh600285,羚锐制药,12.84 +sh600287,江苏舜天,12.23 +sh600288,大恒科技,18.04 +sh600289,亿阳信通,20.19 +sh600290,华仪电气,15.10 +sh600291,西水股份,28.51 +sh600292,中电远达,26.30 +sh600293,三峡新材,11.81 +sh600295,鄂尔多斯,9.07 +sh600297,广汇汽车,11.64 +sh600298,安琪酵母,31.70 +sh600299,蓝星新材,19.20 +sh600300,维维股份,6.94 +sh600301,*ST南化,13.75 +sh600302,标准股份,10.09 +sh600303,曙光股份,14.22 +sh600305,恒顺醋业,23.23 +sh600306,商业城,12.40 +sh600307,酒钢宏兴,4.38 +sh600308,华泰股份,5.97 +sh600309,万华化学,18.52 +sh600310,桂东电力,11.09 +sh600311,荣华实业,7.54 +sh600312,平高电气,20.17 +sh600313,农发种业,14.85 +sh600315,上海家化,39.99 +sh600316,洪都航空,26.32 +sh600317,营口港,5.03 +sh600318,巢东股份,35.30 +sh600319,亚星化学,10.71 +sh600320,振华重工,6.59 +sh600321,国栋建设,5.57 +sh600322,天房发展,5.50 +sh600323,瀚蓝环境,15.84 +sh600325,华发股份,16.14 +sh600326,西藏天路,12.08 +sh600327,大东方,10.03 +sh600328,兰太实业,16.01 +sh600329,中新药业,21.69 +sh600330,天通股份,14.85 +sh600331,宏达股份,8.11 +sh600332,白云山,29.36 +sh600333,长春燃气,8.28 +sh600335,国机汽车,18.58 +sh600336,澳柯玛,9.22 +sh600337,美克家居,16.13 +sh600338,西藏珠峰,13.79 +sh600339,天利高新,8.35 +sh600340,华夏幸福,27.28 +sh600343,航天动力,30.79 +sh600345,长江通信,25.48 +sh600346,大橡塑,11.97 +sh600348,阳泉煤业,6.92 +sh600350,山东高速,6.74 +sh600351,亚宝药业,13.41 +sh600352,浙江龙盛,11.23 +sh600353,旭光股份,11.18 +sh600354,敦煌种业,9.20 +sh600355,精伦电子,8.80 +sh600356,恒丰纸业,11.38 +sh600358,国旅联合,18.71 +sh600359,新农开发,12.46 +sh600360,华微电子,11.05 +sh600361,华联综超,8.17 +sh600362,江西铜业,15.37 +sh600363,联创光电,20.30 +sh600365,通葡股份,14.11 +sh600366,宁波韵升,20.17 +sh600367,红星发展,12.25 +sh600368,五洲交通,6.98 +sh600369,西南证券,10.38 +sh600370,三房巷,14.06 +sh600371,万向德农,18.08 +sh600372,中航电子,27.64 +sh600373,中文传媒,25.09 +sh600375,华菱星马,7.73 +sh600376,首开股份,12.44 +sh600377,宁沪高速,8.61 +sh600378,天科股份,18.47 +sh600379,宝光股份,21.76 +sh600380,健康元,15.26 +sh600381,青海春天,23.95 +sh600382,广东明珠,16.26 +sh600383,金地集团,13.73 +sh600385,山东金泰,24.46 +sh600386,北巴传媒,18.49 +sh600387,海越股份,18.04 +sh600388,龙净环保,19.20 +sh600389,江山股份,25.80 +sh600390,金瑞科技,15.44 +sh600391,成发科技,59.96 +sh600392,盛和资源,11.84 +sh600393,东华实业,10.89 +sh600395,盘江股份,8.04 +sh600396,金山股份,7.95 +sh600397,安源煤业,6.34 +sh600398,海澜之家,15.10 +sh600399,抚顺特钢,9.84 +sh600400,红豆股份,23.09 +sh600401,*ST海润,3.08 +sh600403,大有能源,7.52 +sh600405,动力源,18.08 +sh600406,国电南瑞,16.57 +sh600408,*ST安泰,4.50 +sh600409,三友化工,8.20 +sh600410,华胜天成,25.44 +sh600415,小商品城,10.59 +sh600416,湘电股份,20.05 +sh600418,江淮汽车,15.47 +sh600419,天润乳业,32.92 +sh600420,现代制药,37.15 +sh600421,仰帆控股,20.28 +sh600422,昆药集团,36.29 +sh600423,柳化股份,7.58 +sh600425,青松建化,5.96 +sh600426,华鲁恒升,13.99 +sh600428,中远航运,14.25 +sh600429,三元股份,7.29 +sh600432,吉恩镍业,9.38 +sh600433,冠豪高新,11.11 +sh600435,北方导航,34.36 +sh600436,片仔癀,58.97 +sh600438,通威股份,13.56 +sh600439,瑞贝卡,6.96 +sh600444,*ST国通,20.70 +sh600446,金证股份,50.17 +sh600448,华纺股份,9.49 +sh600449,宁夏建材,12.95 +sh600452,涪陵电力,28.59 +sh600455,博通股份,46.03 +sh600456,宝钛股份,21.80 +sh600458,时代新材,20.40 +sh600459,贵研铂业,20.51 +sh600460,士兰微,8.24 +sh600461,洪城水业,15.66 +sh600462,石岘纸业,13.22 +sh600463,空港股份,15.95 +sh600466,蓝光发展,15.07 +sh600467,好当家,7.66 +sh600468,百利电气,17.42 +sh600469,风神股份,17.61 +sh600470,六国化工,9.66 +sh600475,华光股份,18.39 +sh600476,湘邮科技,32.40 +sh600477,杭萧钢构,12.23 +sh600478,科力远,21.24 +sh600479,千金药业,17.97 +sh600480,凌云股份,19.42 +sh600481,双良节能,11.27 +sh600482,风帆股份,41.48 +sh600483,福能股份,18.04 +sh600485,信威集团,26.41 +sh600486,扬农化工,29.26 +sh600487,亨通光电,13.66 +sh600488,天药股份,7.31 +sh600489,中金黄金,9.79 +sh600490,鹏欣资源,6.61 +sh600491,龙元建设,10.39 +sh600493,凤竹纺织,16.26 +sh600495,晋西车轴,12.35 +sh600496,精工钢构,6.53 +sh600497,驰宏锌锗,10.64 +sh600498,烽火通信,28.01 +sh600499,科达洁能,22.79 +sh600500,中化国际,12.49 +sh600501,航天晨光,27.99 +sh600502,安徽水利,13.67 +sh600503,华丽家族,13.72 +sh600505,西昌电力,11.44 +sh600506,香梨股份,21.18 +sh600507,方大特钢,6.64 +sh600508,上海能源,10.51 +sh600509,天富能源,10.41 +sh600510,黑牡丹,11.98 +sh600511,国药股份,33.21 +sh600512,腾达建设,5.56 +sh600513,联环药业,23.40 +sh600515,海岛建设,16.29 +sh600516,方大炭素,11.55 +sh600517,置信电气,15.44 +sh600518,康美药业,16.85 +sh600519,贵州茅台,211.69 +sh600520,中发科技,24.24 +sh600521,华海药业,23.75 +sh600522,中天科技,22.68 +sh600523,贵航股份,23.83 +sh600525,长园集团,21.04 +sh600526,菲达环保,19.85 +sh600527,江南高纤,7.93 +sh600528,中铁二局,11.96 +sh600529,山东药玻,19.34 +sh600530,交大昂立,21.37 +sh600531,豫光金铅,13.30 +sh600532,宏达矿业,14.57 +sh600533,栖霞建设,5.27 +sh600535,天士力,37.80 +sh600536,中国软件,36.43 +sh600537,亿晶光电,14.66 +sh600538,国发股份,13.17 +sh600539,*ST狮头,11.85 +sh600540,新赛股份,8.36 +sh600543,莫高股份,12.65 +sh600545,新疆城建,12.83 +sh600546,山煤国际,4.84 +sh600547,山东黄金,19.26 +sh600548,深高速,9.39 +sh600549,厦门钨业,20.37 +sh600550,保变电气,8.42 +sh600551,时代出版,23.31 +sh600552,方兴科技,19.20 +sh600555,九龙山,10.21 +sh600556,慧球科技,23.03 +sh600557,康缘药业,24.69 +sh600558,大西洋,9.54 +sh600559,老白干酒,59.95 +sh600560,金自天正,19.33 +sh600561,江西长运,16.26 +sh600562,国睿科技,64.39 +sh600563,法拉电子,39.68 +sh600565,迪马股份,10.58 +sh600566,济川药业,25.93 +sh600567,山鹰纸业,4.09 +sh600568,中珠控股,24.42 +sh600569,安阳钢铁,3.15 +sh600570,恒生电子,70.98 +sh600571,信雅达,69.36 +sh600572,康恩贝,13.64 +sh600573,惠泉啤酒,16.27 +sh600575,皖江物流,5.97 +sh600576,万家文化,18.99 +sh600577,精达股份,6.28 +sh600578,京能电力,6.07 +sh600579,天华院,15.14 +sh600580,卧龙电气,16.64 +sh600581,八一钢铁,7.35 +sh600582,天地科技,16.26 +sh600583,海油工程,9.94 +sh600584,长电科技,22.74 +sh600585,海螺水泥,17.22 +sh600586,金晶科技,5.57 +sh600587,新华医疗,37.35 +sh600588,用友网络,31.66 +sh600589,广东榕泰,11.96 +sh600590,泰豪科技,16.95 +sh600592,龙溪股份,13.79 +sh600593,大连圣亚,38.85 +sh600594,益佰制药,20.74 +sh600595,中孚实业,5.37 +sh600596,新安股份,10.48 +sh600597,光明乳业,16.37 +sh600598,北大荒,15.45 +sh600599,熊猫金控,40.78 +sh600600,青岛啤酒,33.52 +sh600601,方正科技,7.11 +sh600602,仪电电子,10.47 +sh600603,大洲兴业,12.32 +sh600604,市北高新,23.51 +sh600605,汇通能源,22.26 +sh600606,绿地控股,17.44 +sh600608,*ST沪科,9.63 +sh600609,金杯汽车,5.29 +sh600610,中毅达,15.61 +sh600611,大众交通,16.15 +sh600612,老凤祥,43.96 +sh600613,神奇制药,24.34 +sh600614,鼎立股份,11.71 +sh600615,丰华股份,22.91 +sh600616,金枫酒业,12.32 +sh600617,国新能源,17.19 +sh600618,氯碱化工,13.42 +sh600619,海立股份,14.54 +sh600620,天宸股份,19.27 +sh600621,华鑫股份,14.07 +sh600622,嘉宝集团,15.95 +sh600623,双钱股份,20.48 +sh600624,复旦复华,18.75 +sh600626,申达股份,16.04 +sh600628,新世界,18.18 +sh600629,华建集团,26.41 +sh600630,龙头股份,28.67 +sh600633,浙报传媒,18.02 +sh600634,中技控股,23.09 +sh600635,大众公用,10.75 +sh600636,三爱富,18.01 +sh600637,东方明珠,36.95 +sh600638,新黄浦,14.69 +sh600639,浦东金桥,24.88 +sh600640,号百控股,23.70 +sh600641,万业企业,16.23 +sh600642,申能股份,7.97 +sh600643,爱建集团,16.73 +sh600644,*ST乐电,8.62 +sh600645,中源协和,56.03 +sh600647,同达创业,28.05 +sh600648,外高桥,28.42 +sh600649,城投控股,17.81 +sh600650,锦江投资,44.17 +sh600651,飞乐音响,12.86 +sh600652,游久游戏,29.57 +sh600653,申华控股,6.00 +sh600654,中安消,34.67 +sh600655,豫园商城,17.55 +sh600656,,0 +sh600657,信达地产,6.98 +sh600658,电子城,12.21 +sh600660,福耀玻璃,14.14 +sh600661,新南洋,41.42 +sh600662,强生控股,16.98 +sh600663,陆家嘴,49.75 +sh600664,哈药股份,11.98 +sh600665,天地源,6.48 +sh600666,奥瑞德,26.03 +sh600667,太极实业,10.84 +sh600668,尖峰集团,15.64 +sh600671,天目药业,24.77 +sh600673,东阳光科,9.06 +sh600674,川投能源,10.75 +sh600675,中华企业,8.40 +sh600676,交运股份,13.72 +sh600677,航天通信,25.58 +sh600678,四川金顶,17.99 +sh600679,金山开发,16.74 +sh600680,上海普天,53.98 +sh600681,万鸿集团,13.11 +sh600682,南京新百,37.53 +sh600683,京投银泰,10.20 +sh600684,珠江实业,10.61 +sh600685,中船防务,38.62 +sh600686,金龙汽车,20.59 +sh600687,刚泰控股,21.24 +sh600688,上海石化,7.09 +sh600689,上海三毛,16.63 +sh600690,青岛海尔,9.92 +sh600691,*ST阳化,3.90 +sh600692,亚通股份,16.56 +sh600693,东百集团,10.06 +sh600694,大商股份,37.90 +sh600695,绿庭投资,11.45 +sh600696,匹凸匹,11.95 +sh600697,欧亚集团,27.43 +sh600698,湖南天雁,8.40 +sh600699,均胜电子,31.25 +sh600701,工大高新,23.59 +sh600702,沱牌舍得,18.58 +sh600703,三安光电,26.30 +sh600704,物产中大,20.23 +sh600705,中航资本,17.93 +sh600706,曲江文旅,19.98 +sh600707,彩虹股份,12.48 +sh600708,光明地产,14.73 +sh600710,*ST常林,5.44 +sh600711,盛屯矿业,8.60 +sh600712,南宁百货,8.68 +sh600713,南京医药,11.43 +sh600714,金瑞矿业,11.44 +sh600715,*ST松辽,28.64 +sh600716,凤凰股份,9.63 +sh600717,天津港,11.78 +sh600718,东软集团,23.22 +sh600719,大连热电,15.31 +sh600720,祁连山,9.47 +sh600721,百花村,16.73 +sh600722,*ST金化,7.55 +sh600723,首商股份,10.83 +sh600724,宁波富达,7.33 +sh600725,云维股份,7.02 +sh600726,华电能源,7.54 +sh600727,鲁北化工,10.06 +sh600728,佳都科技,39.88 +sh600729,重庆百货,32.39 +sh600730,中国高科,18.60 +sh600731,湖南海利,10.39 +sh600732,*ST新梅,7.71 +sh600733,S前锋,41.82 +sh600734,实达集团,13.89 +sh600735,新华锦,16.41 +sh600736,苏州高新,8.15 +sh600737,中粮屯河,17.39 +sh600738,兰州民百,9.48 +sh600739,辽宁成大,15.83 +sh600740,山西焦化,6.44 +sh600741,华域汽车,16.17 +sh600742,一汽富维,27.60 +sh600743,华远地产,7.43 +sh600744,华银电力,10.63 +sh600745,中茵股份,23.72 +sh600746,江苏索普,9.42 +sh600747,大连控股,6.05 +sh600748,上实发展,13.17 +sh600749,西藏旅游,23.17 +sh600750,江中药业,37.54 +sh600751,天海投资,11.19 +sh600753,东方银星,30.53 +sh600754,锦江股份,52.49 +sh600755,厦门国贸,9.40 +sh600756,浪潮软件,31.37 +sh600757,长江传媒,11.60 +sh600758,红阳能源,14.60 +sh600759,洲际油气,7.85 +sh600760,中航黑豹,17.50 +sh600761,安徽合力,12.73 +sh600763,通策医疗,110.36 +sh600764,中电广通,19.41 +sh600765,中航重机,22.49 +sh600766,园城黄金,16.05 +sh600767,运盛医疗,13.62 +sh600768,宁波富邦,25.48 +sh600769,祥龙电业,11.57 +sh600770,综艺股份,13.95 +sh600771,广誉远,31.98 +sh600773,西藏城投,23.97 +sh600774,汉商集团,21.63 +sh600775,南京熊猫,18.88 +sh600776,东方通信,12.90 +sh600777,新潮实业,11.80 +sh600778,友好集团,12.10 +sh600779,*ST水井,13.02 +sh600780,通宝能源,7.62 +sh600781,辅仁药业,19.36 +sh600782,新钢股份,5.73 +sh600783,鲁信创投,39.33 +sh600784,鲁银投资,8.78 +sh600785,新华百货,30.68 +sh600787,中储股份,11.58 +sh600789,鲁抗医药,14.01 +sh600790,轻纺城,8.71 +sh600791,京能置业,8.74 +sh600792,云煤能源,7.03 +sh600793,ST宜纸,19.98 +sh600794,保税科技,7.55 +sh600795,国电电力,4.19 +sh600796,钱江生化,12.13 +sh600797,浙大网新,14.92 +sh600798,宁波海运,7.44 +sh600800,天津磁卡,10.15 +sh600801,华新水泥,8.39 +sh600802,福建水泥,8.61 +sh600803,新奥股份,14.02 +sh600804,鹏博士,25.64 +sh600805,悦达投资,12.85 +sh600806,昆明机床,15.47 +sh600807,天业股份,15.67 +sh600808,马钢股份,3.67 +sh600809,山西汾酒,18.01 +sh600810,神马股份,9.16 +sh600811,东方集团,9.01 +sh600812,华北制药,8.37 +sh600814,杭州解百,11.75 +sh600815,厦工股份,11.13 +sh600816,安信信托,19.20 +sh600817,ST宏盛,15.38 +sh600818,中路股份,69.82 +sh600819,耀皮玻璃,8.29 +sh600820,隧道股份,11.90 +sh600821,津劝业,8.86 +sh600822,上海物贸,15.57 +sh600823,世茂股份,12.30 +sh600824,益民集团,8.86 +sh600825,新华传媒,12.73 +sh600826,兰生股份,32.15 +sh600827,百联股份,19.76 +sh600828,成商集团,8.86 +sh600829,人民同泰,14.22 +sh600830,香溢融通,12.84 +sh600831,广电网络,15.91 +sh600833,第一医药,20.39 +sh600834,申通地铁,18.67 +sh600835,上海机电,31.59 +sh600836,界龙实业,32.57 +sh600837,海通证券,16.70 +sh600838,上海九百,16.45 +sh600839,四川长虹,6.78 +sh600841,上柴股份,13.88 +sh600843,上工申贝,17.13 +sh600844,丹化科技,8.87 +sh600845,宝信软件,68.39 +sh600846,同济科技,13.38 +sh600847,万里股份,33.09 +sh600848,上海临港,23.62 +sh600850,华东电脑,57.09 +sh600851,海欣股份,13.79 +sh600853,龙建股份,7.93 +sh600854,春兰股份,9.21 +sh600855,航天长峰,43.64 +sh600856,中天能源,23.64 +sh600857,宁波中百,17.82 +sh600858,银座股份,9.95 +sh600859,王府井,25.25 +sh600860,京城股份,13.29 +sh600861,北京城乡,15.43 +sh600862,南通科技,21.93 +sh600863,内蒙华电,4.97 +sh600864,哈投股份,10.88 +sh600865,百大集团,15.87 +sh600866,星湖科技,8.90 +sh600867,通化东宝,25.48 +sh600868,梅雁吉祥,7.85 +sh600869,智慧能源,10.71 +sh600870,*ST厦华,8.12 +sh600871,石化油服,9.77 +sh600872,中炬高新,14.95 +sh600873,梅花生物,8.16 +sh600874,创业环保,11.73 +sh600875,东方电气,14.76 +sh600876,洛阳玻璃,34.96 +sh600877,中国嘉陵,9.39 +sh600879,航天电子,20.30 +sh600880,博瑞传播,7.50 +sh600881,亚泰集团,8.12 +sh600882,华联矿业,13.42 +sh600883,博闻科技,15.84 +sh600884,杉杉股份,33.84 +sh600885,宏发股份,31.09 +sh600886,国投电力,8.99 +sh600887,伊利股份,15.43 +sh600888,新疆众和,8.98 +sh600889,南京化纤,14.74 +sh600890,中房股份,7.63 +sh600891,秋林集团,9.45 +sh600892,宝诚股份,64.84 +sh600893,中航动力,50.21 +sh600894,广日股份,19.42 +sh600895,张江高科,28.97 +sh600896,中海海盛,16.18 +sh600897,厦门空港,23.63 +sh600898,三联商社,13.53 +sh600900,长江电力,13.34 +sh600917,重庆燃气,14.44 +sh600958,东方证券,25.50 +sh600959,江苏有线,23.34 +sh600960,渤海活塞,10.90 +sh600961,株冶集团,12.95 +sh600962,*ST中鲁,17.73 +sh600963,岳阳林纸,7.85 +sh600965,福成五丰,16.69 +sh600966,博汇纸业,4.11 +sh600967,北方创业,20.27 +sh600969,郴电国际,18.68 +sh600970,中材国际,13.34 +sh600971,恒源煤电,6.33 +sh600973,宝胜股份,16.63 +sh600975,新五丰,16.10 +sh600976,健民集团,34.56 +sh600978,宜华木业,22.33 +sh600979,广安爱众,8.20 +sh600980,北矿磁材,22.87 +sh600981,汇鸿集团,12.85 +sh600982,宁波热电,7.54 +sh600983,惠而浦,14.88 +sh600984,*ST建机,11.10 +sh600985,雷鸣科化,13.65 +sh600986,科达股份,21.59 +sh600987,航民股份,13.02 +sh600988,赤峰黄金,11.57 +sh600990,四创电子,62.75 +sh600992,贵绳股份,15.11 +sh600993,马应龙,21.68 +sh600995,文山电力,9.22 +sh600997,开滦股份,5.80 +sh600998,九州通,19.87 +sh600999,招商证券,22.51 +sh601000,唐山港,8.25 +sh601001,大同煤业,5.93 +sh601002,晋亿实业,13.51 +sh601003,柳钢股份,4.82 +sh601005,重庆钢铁,3.35 +sh601006,大秦铁路,9.20 +sh601007,金陵饭店,16.13 +sh601008,连云港,7.76 +sh601009,南京银行,17.84 +sh601010,文峰股份,8.35 +sh601011,宝泰隆,8.62 +sh601012,隆基股份,13.97 +sh601015,陕西黑猫,12.63 +sh601016,节能风电,18.68 +sh601018,宁波港,8.16 +sh601021,春秋航空,62.81 +sh601028,玉龙股份,9.41 +sh601038,一拖股份,13.78 +sh601058,赛轮金宇,8.20 +sh601069,西部黄金,19.82 +sh601088,中国神华,15.35 +sh601098,中南传媒,23.63 +sh601099,太平洋,10.18 +sh601100,恒立油缸,17.28 +sh601101,昊华能源,7.48 +sh601106,中国一重,9.30 +sh601107,四川成渝,5.12 +sh601111,中国国航,8.92 +sh601113,华鼎股份,9.06 +sh601116,三江购物,11.30 +sh601117,中国化学,7.38 +sh601118,海南橡胶,7.98 +sh601126,四方股份,16.38 +sh601137,博威合金,24.46 +sh601139,深圳燃气,9.76 +sh601158,重庆水务,10.05 +sh601166,兴业银行,16.13 +sh601168,西部矿业,7.56 +sh601169,北京银行,9.65 +sh601177,杭齿前进,11.59 +sh601179,中国西电,7.13 +sh601186,中国铁建,15.40 +sh601188,龙江交通,5.19 +sh601198,东兴证券,27.64 +sh601199,江南水务,38.09 +sh601208,东材科技,9.21 +sh601211,国泰君安,23.95 +sh601216,君正集团,11.29 +sh601218,吉鑫科技,7.31 +sh601222,林洋电子,39.67 +sh601225,陕西煤业,5.25 +sh601226,华电重工,13.59 +sh601231,环旭电子,15.21 +sh601233,桐昆股份,13.82 +sh601238,广汽集团,22.62 +sh601258,庞大集团,4.38 +sh601288,农业银行,3.20 +sh601311,骆驼股份,20.38 +sh601313,江南嘉捷,16.47 +sh601318,中国平安,34.97 +sh601328,交通银行,6.55 +sh601333,广深铁路,4.87 +sh601336,新华保险,48.02 +sh601339,百隆东方,7.36 +sh601368,绿城水务,20.28 +sh601369,陕鼓动力,9.29 +sh601377,兴业证券,12.02 +sh601388,怡球资源,23.33 +sh601390,中国中铁,12.48 +sh601398,工商银行,4.64 +sh601515,东风股份,15.64 +sh601518,吉林高速,5.09 +sh601519,大智慧,14.53 +sh601555,东吴证券,17.01 +sh601558,华锐风电,4.49 +sh601566,九牧王,20.78 +sh601567,三星医疗,16.12 +sh601579,会稽山,13.45 +sh601588,北辰实业,5.34 +sh601599,鹿港科技,23.88 +sh601600,中国铝业,5.22 +sh601601,中国太保,26.96 +sh601607,上海医药,19.80 +sh601608,中信重工,8.58 +sh601616,广电电气,7.30 +sh601618,中国中冶,7.79 +sh601628,中国人寿,28.15 +sh601633,长城汽车,13.65 +sh601636,旗滨集团,6.01 +sh601666,平煤股份,5.01 +sh601668,中国建筑,6.66 +sh601669,中国电建,9.09 +sh601677,明泰铝业,14.72 +sh601678,滨化股份,7.97 +sh601688,华泰证券,20.70 +sh601689,拓普集团,23.80 +sh601699,潞安环能,6.58 +sh601700,风范股份,10.37 +sh601717,郑煤机,7.37 +sh601718,际华集团,14.30 +sh601727,上海电气,11.23 +sh601766,中国中车,14.68 +sh601777,力帆股份,15.38 +sh601788,光大证券,24.94 +sh601789,宁波建工,11.87 +sh601798,蓝科高新,13.70 +sh601799,星宇股份,33.46 +sh601800,中国交建,16.05 +sh601801,皖新传媒,31.36 +sh601808,中海油服,17.32 +sh601818,光大银行,4.41 +sh601857,中国石油,8.91 +sh601866,中海集运,8.73 +sh601872,招商轮船,7.84 +sh601877,正泰电器,30.02 +sh601880,大连港,6.95 +sh601886,江河创建,12.43 +sh601888,中国国旅,52.98 +sh601890,亚星锚链,13.73 +sh601898,中煤能源,6.48 +sh601899,紫金矿业,3.66 +sh601901,方正证券,10.42 +sh601908,京运通,9.23 +sh601918,国投新集,11.43 +sh601919,中国远洋,11.63 +sh601928,凤凰传媒,17.34 +sh601929,吉视传媒,7.08 +sh601933,永辉超市,10.51 +sh601939,建设银行,5.72 +sh601958,金钼股份,8.65 +sh601965,中国汽研,10.04 +sh601968,宝钢包装,15.44 +sh601969,海南矿业,15.72 +sh601985,中国核电,10.35 +sh601988,中国银行,4.04 +sh601989,中国重工,10.85 +sh601991,大唐发电,5.59 +sh601992,金隅股份,10.10 +sh601996,丰林集团,10.13 +sh601998,中信银行,7.56 +sh601999,出版传媒,13.21 +sh603000,人民网,22.66 +sh603001,奥康国际,32.53 +sh603002,宏昌电子,12.56 +sh603003,龙宇燃油,22.59 +sh603005,晶方科技,46.82 +sh603006,联明股份,51.35 +sh603008,喜临门,22.68 +sh603009,北特科技,37.89 +sh603010,万盛股份,44.38 +sh603011,合锻股份,26.40 +sh603012,创力集团,27.08 +sh603015,弘讯科技,35.91 +sh603017,中衡设计,48.88 +sh603018,设计股份,83.31 +sh603019,中科曙光,99.24 +sh603020,爱普股份,59.84 +sh603021,山东华鹏,50.51 +sh603022,新通联,52.22 +sh603023,威帝股份,37.27 +sh603025,大豪科技,48.28 +sh603026,石大胜华,28.40 +sh603030,全筑股份,36.13 +sh603066,音飞储存,56.72 +sh603077,和邦生物,8.21 +sh603085,天成自控,49.98 +sh603088,宁波精达,61.84 +sh603099,长白山,23.36 +sh603100,川仪股份,19.81 +sh603108,润达医疗,98.08 +sh603111,康尼机电,33.36 +sh603116,红蜻蜓,34.62 +sh603117,万林股份,30.20 +sh603118,共进股份,48.14 +sh603123,翠微股份,11.39 +sh603126,中材节能,16.98 +sh603128,华贸物流,11.51 +sh603158,腾龙股份,59.15 +sh603166,福达股份,30.20 +sh603167,渤海轮渡,12.55 +sh603168,莎普爱思,57.45 +sh603169,兰石重装,19.94 +sh603188,亚邦股份,23.65 +sh603198,迎驾贡酒,33.42 +sh603199,九华旅游,52.21 +sh603222,济民制药,35.99 +sh603223,恒通股份,41.95 +sh603227,雪峰科技,31.15 +sh603268,松发股份,61.23 +sh603288,海天味业,34.44 +sh603300,华铁科技,31.69 +sh603306,华懋科技,43.15 +sh603308,应流股份,25.24 +sh603309,维力医疗,42.31 +sh603311,金海环境,32.22 +sh603315,福鞍股份,50.90 +sh603318,派思股份,42.66 +sh603328,依顿电子,33.22 +sh603333,明星电缆,10.06 +sh603338,浙江鼎力,59.48 +sh603355,莱克电气,51.14 +sh603366,日出东方,11.11 +sh603368,柳州医药,104.01 +sh603369,今世缘,37.27 +sh603399,新华龙,13.52 +sh603456,九洲药业,68.06 +sh603518,维格娜丝,35.88 +sh603519,立霸股份,54.79 +sh603555,贵人鸟,38.49 +sh603558,健盛集团,23.23 +sh603566,普莱柯,57.19 +sh603567,珍宝岛,61.50 +sh603568,伟明环保,61.37 +sh603588,高能环境,81.99 +sh603589,口子窖,40.57 +sh603598,引力传媒,61.42 +sh603599,广信股份,53.11 +sh603600,永艺股份,93.47 +sh603601,再升科技,44.42 +sh603606,东方电缆,21.57 +sh603609,禾丰牧业,14.60 +sh603611,诺力股份,35.34 +sh603616,韩建河山,41.52 +sh603618,杭电股份,31.50 +sh603636,南威软件,109.24 +sh603669,灵康药业,36.47 +sh603678,火炬电子,95.46 +sh603686,龙马环卫,45.04 +sh603688,石英股份,23.87 +sh603698,航天工程,39.45 +sh603699,纽威股份,22.38 +sh603703,盛洋科技,74.60 +sh603718,海利生物,51.30 +sh603729,龙韵股份,112.31 +sh603766,隆鑫通用,21.42 +sh603788,宁波高发,39.44 +sh603789,星光农机,45.95 +sh603799,华友钴业,26.59 +sh603806,福斯特,45.14 +sh603808,歌力思,52.74 +sh603818,曲美家居,22.54 +sh603828,柯利达,34.80 +sh603838,四通股份,40.02 +sh603869,北部湾旅,25.76 +sh603883,老百姓,67.16 +sh603885,吉祥航空,75.89 +sh603889,新澳股份,31.25 +sh603898,好莱客,37.14 +sh603899,晨光文具,41.98 +sh603901,永创智能,33.36 +sh603918,金桥信息,92.54 +sh603939,益丰药房,45.85 +sh603968,醋化股份,32.00 +sh603969,银龙股份,20.13 +sh603979,金诚信,33.53 +sh603988,中电电机,50.25 +sh603989,艾华集团,40.22 +sh603993,洛阳钼业,5.43 +sh603997,继峰股份,29.32 +sh603998,方盛制药,45.77 +sz150008,瑞和小康,1.117 +sz150009,瑞和远见,1.092 +sz150012,中证100A,1.170 +sz150013,中证100B,1.541 +sz150016,合润A,2.497 +sz150017,合润B,3.394 +sz150018,银华稳进,0.956 +sz150019,银华锐进,1.211 +sz150020,汇利A,0.969 +sz150021,汇利B,1.015 +sz150022,深成指A,0.880 +sz150023,深成指B,0.641 +sz150027,添利B,1.439 +sz150028,中证500A,0.975 +sz150029,中证500B,1.670 +sz150030,中证90A,1.003 +sz150031,中证90B,1.380 +sz150032,多利优先,1.034 +sz150033,多利进取,1.047 +sz150034,聚利A,1.199 +sz150035,聚利B,2.124 +sz150036,建信稳健,1.129 +sz150037,建信进取,1.670 +sz150039,鼎利A,0.000 +sz150040,鼎利B,1.712 +sz150042,利鑫B,1.593 +sz150047,消费A,1.355 +sz150048,消费B,1.571 +sz150049,消费收益,0.945 +sz150050,消费进取,1.305 +sz150051,沪深300A,0.943 +sz150052,沪深300B,0.670 +sz150053,泰达500A,0.992 +sz150054,泰达500B,1.080 +sz150055,500A,1.023 +sz150056,500B,2.054 +sz150057,中小300A,1.068 +sz150058,中小300B,1.549 +sz150059,资源A级,1.053 +sz150060,资源B级,1.238 +sz150064,同瑞A,0.962 +sz150065,同瑞B,1.430 +sz150066,互利A,0.907 +sz150067,互利B,1.329 +sz150073,诺安稳健,0.968 +sz150075,诺安进取,1.764 +sz150076,浙商稳健,0.968 +sz150077,浙商进取,1.649 +sz150083,深证100A,1.015 +sz150084,深证100B,1.315 +sz150085,中小板A,1.029 +sz150086,中小板B,1.585 +sz150088,金鹰500A,0.995 +sz150089,金鹰500B,1.663 +sz150090,成长A,0.969 +sz150091,成长B,1.678 +sz150092,诺德300A,0.929 +sz150093,诺德300B,1.563 +sz150094,泰信400A,0.979 +sz150095,泰信400B,0.895 +sz150096,商品A,1.123 +sz150097,商品B,0.938 +sz150100,资源A,1.020 +sz150101,资源B,1.416 +sz150102,利众B,1.327 +sz150104,HS300A,1.053 +sz150105,HS300B,1.717 +sz150106,中小A,1.160 +sz150107,中小B,1.429 +sz150108,同辉100A,1.160 +sz150109,同辉100B,1.299 +sz150112,深100A,0.967 +sz150113,深100B,1.838 +sz150114,惠裕B,1.237 +sz150117,房地产A,1.026 +sz150118,房地产B,0.761 +sz150120,鼎利进取,1.194 +sz150121,银河优先,0.996 +sz150122,银河进取,1.608 +sz150123,建信50A,1.141 +sz150124,建信50B,1.508 +sz150128,工银增B,1.174 +sz150129,丰利债B,0.000 +sz150130,医药A,1.033 +sz150131,医药B,0.817 +sz150133,德信A,1.010 +sz150134,德信B,1.141 +sz150135,国富100A,1.015 +sz150136,国富100B,0.764 +sz150138,中证800A,0.962 +sz150139,中证800B,1.375 +sz150140,国金300A,0.994 +sz150141,国金300B,0.995 +sz150142,互利债B,1.411 +sz150143,转债A级,0.920 +sz150144,转债B级,1.759 +sz150145,高贝塔A,0.979 +sz150146,高贝塔B,0.915 +sz150147,同利B,2.960 +sz150148,医药800A,0.980 +sz150149,医药800B,0.784 +sz150150,有色800A,0.985 +sz150151,有色800B,1.109 +sz150152,创业板A,0.997 +sz150153,创业板B,1.688 +sz150154,惠丰B,1.016 +sz150156,中银互B,1.007 +sz150157,金融A,0.993 +sz150158,金融B,1.057 +sz150160,通福B,1.457 +sz150161,惠鑫B,0.000 +sz150164,可转债A,0.932 +sz150165,可转债B,0.984 +sz150167,银华300A,0.993 +sz150168,银华300B,0.985 +sz150169,恒生A,0.951 +sz150170,恒生B,0.983 +sz150171,证券A,0.919 +sz150172,证券B,1.924 +sz150173,TMT中证A,0.929 +sz150174,TMT中证B,1.295 +sz150175,H股A,0.955 +sz150176,H股B,0.918 +sz150177,证保A,0.920 +sz150178,证保B,1.881 +sz150179,信息A,0.928 +sz150180,信息B,1.903 +sz150181,军工A,0.935 +sz150182,军工B,1.000 +sz150184,环保A,0.928 +sz150185,环保B,1.421 +sz150186,军工A级,0.943 +sz150187,军工B级,1.622 +sz150188,转债优先,1.015 +sz150189,转债进取,1.339 +sz150190,NCF环保A,1.061 +sz150191,NCF环保B,1.680 +sz150192,地产A,0.930 +sz150193,地产B,1.358 +sz150194,互联网A,0.940 +sz150195,互联网B,1.085 +sz150196,有色A,1.042 +sz150197,有色B,1.173 +sz150198,食品A,1.020 +sz150199,食品B,0.582 +sz150200,券商A,0.909 +sz150201,券商B,1.109 +sz150203,传媒A,0.939 +sz150204,传媒B,2.058 +sz150205,国防A,0.918 +sz150206,国防B,1.125 +sz150207,地产A端,0.942 +sz150208,地产B端,0.714 +sz150209,国企改A,0.926 +sz150210,国企改B,1.230 +sz150211,新能车A,0.996 +sz150212,新能车B,1.095 +sz150213,成长A级,0.988 +sz150214,成长B级,0.898 +sz150215,TMTA,0.943 +sz150216,TMTB,1.868 +sz150217,新能源A,0.935 +sz150218,新能源B,1.970 +sz150219,健康A,1.243 +sz150220,健康B,1.139 +sz150221,中航军A,1.215 +sz150222,中航军B,1.470 +sz150223,证券A级,1.115 +sz150224,证券B级,1.587 +sz150225,证保A级,0.961 +sz150226,证保B级,1.660 +sz150227,银行A,0.913 +sz150228,银行B,0.830 +sz150229,酒A,0.938 +sz150230,酒B,0.764 +sz150231,电子A,0.961 +sz150232,电子B,0.590 +sz150233,传媒业A,0.926 +sz150234,传媒业B,1.501 +sz150235,券商A级,0.924 +sz150236,券商B级,0.593 +sz150237,环保A级,0.922 +sz150238,环保B级,1.715 +sz150241,银行A级,0.933 +sz150242,银行B级,0.944 +sz150243,创业A,0.940 +sz150244,创业B,0.726 +sz150245,互联A,0.923 +sz150246,互联B,1.935 +sz150247,传媒A级,1.018 +sz150248,传媒B级,1.216 +sz150249,银行A端,0.929 +sz150250,银行B端,0.850 +sz150251,煤炭A,0.928 +sz150252,煤炭B,1.135 +sz150255,银行业A,0.929 +sz150256,银行业B,0.767 +sz150257,生物A,0.929 +sz150258,生物B,1.560 +sz150259,重组A,0.928 +sz150260,重组B,1.510 +sz150261,医疗A,1.038 +sz150262,医疗B,0.888 +sz150263,1000A,1.115 +sz150264,1000B,0.957 +sz150265,一带A,1.006 +sz150266,一带B,0.868 +sz150267,银行A类,0.972 +sz150268,银行B类,0.814 +sz150269,白酒A,0.932 +sz150270,白酒B,0.714 +sz150271,生物药A,0.926 +sz150272,生物药B,1.497 +sz150273,带路A,0.926 +sz150274,带路B,1.063 +sz150275,一带一A,0.928 +sz150276,一带一B,1.048 +sz150277,高铁A,0.928 +sz150278,高铁B,1.291 +sz150279,新能A,0.933 +sz150280,新能B,1.245 +sz150281,金融地A,0.973 +sz150282,金融地B,0.656 +sz150283,SW医药A,0.932 +sz150284,SW医药B,1.091 +sz150287,钢铁A,1.008 +sz150288,钢铁B,0.945 +sz150289,煤炭A级,1.010 +sz150290,煤炭B级,0.565 +sz150291,银行A份,1.013 +sz150292,银行B份,0.684 +sz150293,高铁A级,1.008 +sz150294,高铁B级,1.825 +sz150295,改革A,1.018 +sz150296,改革B,1.147 +sz150297,互联A级,1.025 +sz150298,互联B级,0.911 +sz150299,银行股A,1.012 +sz150300,银行股B,0.639 +sz150301,证券股A,1.007 +sz150302,证券股B,1.811 +sz150303,创业股A,1.012 +sz150304,创业股B,0.365 +sz150305,养老A,0.930 +sz150306,养老B,1.007 +sz150307,体育A,0.940 +sz150308,体育B,1.150 +sz150309,信息安A,0.922 +sz150310,信息安B,1.566 +sz150311,智能A,0.940 +sz150312,智能B,1.561 +sz150315,工业4A,0.931 +sz150316,工业4B,1.660 +sz150317,E金融A,1.012 +sz150318,E金融B,0.840 +sz150321,煤炭A基,1.177 +sz150322,煤炭B基,1.082 +sz150323,环保A端,1.013 +sz150324,环保B端,0.948 +sz150325,高铁A端,1.009 +sz150326,高铁B端,0.663 +sz150327,新能A级,1.012 +sz150328,新能B级,0.859 +sz150329,保险A,0.921 +sz150330,保险B,1.108 +sz150331,网金融A,1.152 +sz150332,网金融B,1.012 +sz150335,军工股A,1.101 +sz150336,军工股B,1.166 +sz150343,证券A基,1.005 +sz150344,证券B基,0.912 +sz160105,南方积配,1.584 +sz160106,南方高增,2.242 +sz160119,南方500,1.821 +sz160123,南方50债,1.196 +sz160125,南方香港,0.917 +sz160128,南方金利,1.058 +sz160130,南方永利,0.948 +sz160131,南方聚利,1.055 +sz160133,南方天元,1.935 +sz160211,国泰小盘,2.495 +sz160212,国泰估值,2.004 +sz160215,国泰价值,1.735 +sz160216,国泰商品,0.478 +sz160220,国泰民益,1.288 +sz160311,华夏蓝筹,1.430 +sz160314,华夏行业,1.470 +sz160415,华安S300,1.461 +sz160416,华安石油,0.839 +sz160505,博时主题,3.092 +sz160512,博时卓越,2.261 +sz160513,稳健债A,1.399 +sz160515,安丰18,1.206 +sz160607,鹏华价值,1.265 +sz160610,鹏华动力,1.479 +sz160611,鹏华治理,1.036 +sz160613,鹏华创新,0.000 +sz160615,鹏华300,1.390 +sz160616,鹏华500,1.496 +sz160618,鹏华丰泽,1.126 +sz160621,鹏华丰和,1.120 +sz160706,嘉实 300,1.033 +sz160716,嘉实50,1.141 +sz160717,恒生H股,0.716 +sz160719,嘉实黄金,0.595 +sz160720,中期企债,1.136 +sz160805,长盛同智,1.300 +sz160806,长盛同庆,1.420 +sz160807,长盛300,1.228 +sz160810,长盛同丰,1.146 +sz160812,长盛同益,1.688 +sz160813,长盛同盛,1.064 +sz160910,大成创新,1.157 +sz160915,大成景丰,0.000 +sz160916,优选LOF,2.251 +sz160918,大成小盘,2.215 +sz160919,大成产业,1.515 \ No newline at end of file diff --git a/Quanter.Trader.Messages/CHANGES.txt b/Quanter.Trader.Messages/CHANGES.txt new file mode 100644 index 0000000..d80368c --- /dev/null +++ b/Quanter.Trader.Messages/CHANGES.txt @@ -0,0 +1,99 @@ +=============================================================================== +Welcome to the C# port of Google Protocol Buffers, written by Jon Skeet +(skeet@pobox.com) based on the work of many talented people. + +For more information about this port, visit its homepage: +http://protobuf-csharp-port.googlecode.com + +For more information about Protocol Buffers in general, visit the project page +for the C++, Java and Python project: +http://protobuf.googlecode.com +=============================================================================== +RELEASE NOTES - Version 2.4.1.473 +=============================================================================== + +Features: +- Added option service_generator_type to control service generation with + NONE, GENERIC, INTERFACE, or IRPCDISPATCH +- Added interfaces IRpcDispatch and IRpcServerStub to provide for blocking + services and implementations. +- Added ProtoGen.exe command-line argument "--protoc_dir=" to specify the + location of protoc.exe. +- Extracted interfaces for ICodedInputStream and ICodedOutputStream to allow + custom implementation of writers with both speed and size optimizations. +- Addition of the "Google.ProtoBuffers.Serialization" assembly to support + reading and writing messages to/from XML, JSON, IDictionary<,> and others. +- Several performance related fixes and tweeks +- Issue 3: Add option to mark generated code with attribute +- Issue 20: Support for decorating classes [Serializable] +- Issue 21: Decorate fields with [deprecated=true] as [System.Obsolete] +- Issue 22: Reusable Builder classes +- Issue 24: Support for using Json/Xml formats with ICodedInputStream +- Issue 25: Added support for NuGet packages +- Issue 31: Upgraded protoc.exe and descriptor to 2.4.1 + +Fixes: +- Issue 13: Message with Field same name as message causes uncompilable .cs +- Issue 16: Does not integrate well with other tooling +- Issue 19: Support for negative enum values +- Issue 26: AddRange in GeneratedBuilder iterates twice. +- Issue 27: Remove XML documentation output from test projects to clear + warnings/errors. +- Issue 28: Circular message dependencies result in null default values for + Message fields. +- Issue 29: Message classes generated have a public default constructor. You + can disable private ctor generation with the option generate_private_ctor. +- Issue 35: Fixed a bug in ProtoGen handling of arguments with trailing \ +- Big-endian support for float, and double on Silverlight +- Packed and Unpacked parsing allow for all repeated, as per version 2.3 +- Fix for leaving Builder a public ctor on internal classes for use with + generic "where T: new()" constraints. + +Other: +- Changed the code signing key to a privately held key +- Reformatted all code and line-endings to C# defaults +- Reworking of performance benchmarks to produce reliable results, option /v2 +- Issue 34: Silverlight assemblies are now unit tested + +=============================================================================== +RELEASE NOTES - Version 2.3.0.277 +=============================================================================== + +Features: +- Added cls_compliance option to generate attributes indicating + non-CLS-compliance. +- Added file_extension option to control the generated output file's extension. +- Added umbrella_namespace option to place the umbrella class into a nested + namespace to address issues with proto files having the same name as a + message it contains. +- Added output_directory option to set the output path for the source file(s). +- Added ignore_google_protobuf option to avoid generating code for includes + from the google.protobuf package. +- Added the LITE framework (Google.ProtoBuffersLite.dll) and the ability to + generate code with "option optimize_for = LITE_RUNTIME;". +- Added ability to invoke protoc.exe from within ProtoGen.exe. +- Upgraded to protoc.exe (2.3) compiler. + +Fixes: +- Issue 9: Class cannot be static and sealed error +- Issue 12: default value for enumerate fields must be filled out + +Other: +- Rewrite of build using MSBbuild instead of NAnt +- Moved to NUnit Version 2.2.8.0 +- Changed to using secure .snk for releases + +=============================================================================== +RELEASE NOTES - Version 0.9.1 +=============================================================================== + +Fixes: +- issue 10: Incorrect encoding of packed fields when serialized + +=============================================================================== +RELEASE NOTES - Version 0.9.0 +=============================================================================== + +- Initial release + +=============================================================================== \ No newline at end of file diff --git a/Quanter.Trader.Messages/ClientMessages.cs b/Quanter.Trader.Messages/ClientMessages.cs new file mode 100644 index 0000000..fc8623f --- /dev/null +++ b/Quanter.Trader.Messages/ClientMessages.cs @@ -0,0 +1,56 @@ +using Quanter.BusinessEntity; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Quanter.Trader.Messages +{ + public enum RequestType : int + { + LOGIN, // 登录 + START_MY_STRATEGIES, // 启动 + STOP_MY_STRATEGIES, // 停止 + PAUSE, // 暂停 + RESTORE, // 恢复 + GET_ALL_STRATEGIES, // 获取所有策略列表 + GET_MY_STRATEGIES, // 获取我的策略 + ADD_MY_STRATEGY, // 增加我的策略 + REMOVE_MY_STRATEGY, // 移除我的策略 + SETUP_STRATEGY, // 配置我的策略 + QUERY_STRATEGY_ACCOUNT, // 获取指定策略的账户信息 + UPDATE_ACCOUNT, // 更新账户 + START_MARKET, + STOP_MARKET + } + + public enum ResponseType : int + { + RETURN_ALL_STRATEGIES, + RETURN_MY_STRATEGIES, + RETURN_LOGIN_INFO, + } + + public class ClientRequest + { + public RequestType? Action { get; set; } + + public int Userid { get; set; } + + public object Body { get; set; } + + } + + public class ClientResponse + { + public ResponseType Action { get; set; } + + public Object Body { get; set; } + } + + public class EStrategyList : List + { + + } +} diff --git a/Quanter.Trader.Messages/Constants.cs b/Quanter.Trader.Messages/Constants.cs new file mode 100644 index 0000000..3b93db5 --- /dev/null +++ b/Quanter.Trader.Messages/Constants.cs @@ -0,0 +1,16 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Quanter.Trader.Messages +{ + public class ConstantsHelper + { + public static String AKKA_PATH_STRATEGY_MANAGER = "strategy"; + public static String AKKA_PATH_MARKET_MANAGER = "market"; + public static String AKKA_PATH_PERSISTENCE = "persistence"; + public static readonly String AKKA_PATH_TRADER = "trader"; + } +} diff --git a/Quanter.Trader.Messages/ErrorMessages.cs b/Quanter.Trader.Messages/ErrorMessages.cs new file mode 100644 index 0000000..e3ae110 --- /dev/null +++ b/Quanter.Trader.Messages/ErrorMessages.cs @@ -0,0 +1,12 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Quanter.Trader.Messages +{ + public class ErrorResponse + { + } +} diff --git a/Quanter.Trader.Messages/MarketMessages.cs b/Quanter.Trader.Messages/MarketMessages.cs new file mode 100644 index 0000000..2d74241 --- /dev/null +++ b/Quanter.Trader.Messages/MarketMessages.cs @@ -0,0 +1,115 @@ +using Akka.Actor; +using Quanter.Common; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Quanter.Trader.Messages +{ + public class ConnectedRequest + { + public String Username { get; set; } + public String Password { get; set; } + } + + public class ConnectedResponse + { + public String Message { get; set; } + } + + public class MarketRequest + { + public enum RequestType + { + START, + STOP, + ADD_STRATEGY, + REMOVE_STARTEGY, + } + + public RequestType Type { get; set; } + } + + public class StopMarketRequest + { + + } + + public class AddStrategyRequest + { + private List secs = new List(); + public Securities[] Securitiess { get { return this.secs.ToArray(); } } + + public void AddSecurities(Securities sec) + { + secs.Add(sec); + } + } + + public class RemoveStrategyRequest + { + private List secs = new List(); + public Securities[] Securitiess { get { return this.secs.ToArray(); } } + + public void AddSecurities(Securities sec) + { + secs.Add(sec); + } + } + + /// + /// 订阅股票数据请求 + /// + public class WatchStockRequest + { + public String Symbol { get; set; } + + public IActorRef Watcher { get; set; } + } + + /// + /// 取消订阅股票数据的请求 + /// + public class UnwatchStockRequest + { + public String Symbol { get; set; } + + public IActorRef Watcher { get; set; } + } + + public class StockCurrentBidRequest + { + public String Symbol { get; set; } + + public IActorRef Watcher { get; set; } + } + + public class NewBidArrivedRequest + { + public TickData Bid { get; set; } + } + + public class StockDataResponse + { + + } + + /// + /// 股票历史数据请求 + /// + public class StockHistoryDataRequest + { + public DateTime Start { get; set; } + public DateTime End { get; set; } + public String Symbol { get; set; } + } + + public class StockHistoryDataResponse + { + + } + + +} diff --git a/Quanter.Trader.Messages/PersistenceMessages.cs b/Quanter.Trader.Messages/PersistenceMessages.cs new file mode 100644 index 0000000..9b38adb --- /dev/null +++ b/Quanter.Trader.Messages/PersistenceMessages.cs @@ -0,0 +1,25 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Quanter.Trader.Messages +{ + public enum PersistenceType + { + OPEN, + CLOSE, + SAVE, + UPDATE, + DELETE, + LOAD, + FIND, + LIST + } + public class PersistenceRequest + { + public PersistenceType Type { get; set; } + public Object Body { get; set; } + } +} diff --git a/Quanter.Trader.Messages/Properties/AssemblyInfo.cs b/Quanter.Trader.Messages/Properties/AssemblyInfo.cs new file mode 100644 index 0000000..779aa5a --- /dev/null +++ b/Quanter.Trader.Messages/Properties/AssemblyInfo.cs @@ -0,0 +1,36 @@ +using System.Reflection; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; + +// 有关程序集的一般信息由以下 +// 控制。更改这些特性值可修改 +// 与程序集关联的信息。 +[assembly: AssemblyTitle("Stock.Trader.Messages")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("")] +[assembly: AssemblyProduct("Stock.Trader.Messages")] +[assembly: AssemblyCopyright("Copyright © 2015")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +//将 ComVisible 设置为 false 将使此程序集中的类型 +//对 COM 组件不可见。 如果需要从 COM 访问此程序集中的类型, +//请将此类型的 ComVisible 特性设置为 true。 +[assembly: ComVisible(false)] + +// 如果此项目向 COM 公开,则下列 GUID 用于类型库的 ID +[assembly: Guid("dde08214-ec3a-4dd7-8cee-49973e17ae8f")] + +// 程序集的版本信息由下列四个值组成: +// +// 主版本 +// 次版本 +// 生成号 +// 修订号 +// +//可以指定所有这些值,也可以使用“生成号”和“修订号”的默认值, +// 方法是按如下所示使用“*”: : +// [assembly: AssemblyVersion("1.0.*")] +[assembly: AssemblyVersion("1.0.0.0")] +[assembly: AssemblyFileVersion("1.0.0.0")] diff --git a/Quanter.Trader.Messages/Quanter.Trader.Messages.csproj b/Quanter.Trader.Messages/Quanter.Trader.Messages.csproj new file mode 100644 index 0000000..8a619d4 --- /dev/null +++ b/Quanter.Trader.Messages/Quanter.Trader.Messages.csproj @@ -0,0 +1,108 @@ + + + + + Debug + AnyCPU + {DDE08214-EC3A-4DD7-8CEE-49973E17AE8F} + Library + Properties + Quanter.Trader.Messages + Quanter.Trader.Messages + v4.5.2 + 512 + + + true + full + false + bin\Debug\ + DEBUG;TRACE + prompt + 4 + + + pdbonly + true + bin\Release\ + TRACE + prompt + 4 + + + + ..\packages\Akka.1.0.5\lib\net45\Akka.dll + True + + + ..\packages\Akka.Remote.1.0.5\lib\net45\Akka.Remote.dll + True + + + ..\packages\Google.ProtocolBuffers.2.4.1.521\lib\net40\Google.ProtocolBuffers.dll + True + + + ..\packages\Google.ProtocolBuffers.2.4.1.521\lib\net40\Google.ProtocolBuffers.Serialization.dll + True + + + ..\packages\Helios.1.4.1\lib\net45\Helios.dll + True + + + ..\packages\Newtonsoft.Json.7.0.1\lib\net45\Newtonsoft.Json.dll + True + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + {34db14a6-e4ed-4c4a-8ca6-939201a572be} + Quanter.BusinessEntity + + + {a3fa3c71-a7b0-4bb6-bd32-0aee20493593} + Quanter.Common + + + + + \ No newline at end of file diff --git a/Quanter.Trader.Messages/SecuritiesQuotationMessages.cs b/Quanter.Trader.Messages/SecuritiesQuotationMessages.cs new file mode 100644 index 0000000..d25b580 --- /dev/null +++ b/Quanter.Trader.Messages/SecuritiesQuotationMessages.cs @@ -0,0 +1,40 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using Quanter.Common; + +namespace Quanter.Trader.Messages +{ + public class QuotationRequest + { + public enum RequestType + { + ASKED_SECURITIES, // 请求接收行情的证券列表 + RUN, // 开始接收行情 + } + + public RequestType Type { get; set; } + public Object Body { get; set; } + } + + public class SecuritiesQuotationRequest + { + public enum RequestType + { + + WATCH_QUOTEDATA, + WATCH_TICKDATA, + WATCH_BARDATA, + UNWATCH, + NEW_TICKDATA, + NEW_BARDATA, + NEW_QUOTEDATA, + } + + public RequestType Type { get; set; } + + public Object Body { get; set; } + } +} diff --git a/Quanter.Trader.Messages/StrategyMessages.cs b/Quanter.Trader.Messages/StrategyMessages.cs new file mode 100644 index 0000000..b9c95a2 --- /dev/null +++ b/Quanter.Trader.Messages/StrategyMessages.cs @@ -0,0 +1,88 @@ +using Quanter.BusinessEntity; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Quanter.Trader.Messages +{ + + public class StrategiesRequest + { + private EStrategyList sds = new EStrategyList(); + public EStrategy[] Strategies { get { return sds.ToArray(); } } + + public void AddStrategy(EStrategy sd) + { + sds.Add(sd); + } + + public void RemoveStrategy(EStrategy sd) + { + sds.Remove(sd); + } + } + + public class StrategiesResponse + { + private EStrategyList sds = new EStrategyList(); + public EStrategy[] Strategies { get { return sds.ToArray(); } } + + public void Add(EStrategy sd) + { + sds.Add(sd); + } + + public void Remove(EStrategy sd) + { + sds.Remove(sd); + } + + } + + public class MyStrategiesRequest : StrategiesRequest + { + public String Username { get; set; } + + } + + public class MyStrategiesResponse : StrategiesResponse + { + + } + + public enum StrategyRequestType + { + CREATE, + START, + STOP, + } + public class StrategyRequest + { + public StrategyRequestType Type { get; set; } + + public object Body { get; set; } + } + + public class StrategyResponse + { + public enum ResponseType + { + TICK_ARRIVED, + BAR_ARRIVED, + QUOTE_ARRIVED, + RUN_ARRIVED, + } + + public ResponseType Type { get; set; } + + public object Body { get; set; } + } + + public class StartStrateiesReponse + { + + } + +} diff --git a/Quanter.Trader.Messages/TradeMessages.cs b/Quanter.Trader.Messages/TradeMessages.cs new file mode 100644 index 0000000..67dc555 --- /dev/null +++ b/Quanter.Trader.Messages/TradeMessages.cs @@ -0,0 +1,75 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Quanter.Trader.Messages +{ + public enum OrderType { + BUY, + SELL, + CANCEL, + } + + public enum TradeType + { + ALGO, //算法下单 + LIMIT, // 涨跌停板下单 + } + + public enum TradeInterface + { + FIX, + CTP, + CTP2, + LTS, + THS, + TDX, + } + + public class Order + { + /// + /// 订单号 + /// + public int Id { get; set; } + /// + /// 委托号 > 0,表示成功 + /// <=0表示有错误,错误标识在细化 + /// -1: 表示资金不足 + /// -2: 表示股票数量不足 + /// -3: 输入的证券代码不对 + /// + public int EntrustNo { get; set; } + + public int StrategyId { get; set; } + public String Symbol { get; set; } + public float Price { get; set; } + public int Amount { get; set; } + public OrderType Type { get; set; } + + /// + /// 下单时间 + /// + public DateTime Date { get; set; } + + } + + public class TradeRequest + { + public OrderType OrderType { get; set; } + + public TradeInterface TradeInterface { get; set; } + + public TradeType TradeType { get; set; } + + public Order SecuritiesOrder { get; set; } + } + + public class TradeResponse + { + public int EntrustNo { get; set; } + public String Message { get; set; } + } +} diff --git a/Quanter.Trader.Messages/UserMessages.cs b/Quanter.Trader.Messages/UserMessages.cs new file mode 100644 index 0000000..c837665 --- /dev/null +++ b/Quanter.Trader.Messages/UserMessages.cs @@ -0,0 +1,31 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Quanter.Trader.Messages +{ + public enum UserActionType + { + LOGIN, + REGISTER, + FETCH_MY_STRATEGIES, + ADD_MY_STRATEGY, + REMOVE_MY_STRATEGY, + START_ALL_STRATEGY, + STOP_ALL_STRATEGY, + } + + public class UserRequest + { + public UserActionType Action { get; set; } + + public Object Body { get; set; } + } + + public class UserResponse + { + public Object Body { get; set; } + } +} diff --git a/Quanter.Trader.Messages/app.manifest b/Quanter.Trader.Messages/app.manifest new file mode 100644 index 0000000..010811d --- /dev/null +++ b/Quanter.Trader.Messages/app.manifest @@ -0,0 +1,48 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Quanter.Trader.Messages/licenses/license.txt b/Quanter.Trader.Messages/licenses/license.txt new file mode 100644 index 0000000..b8e773b --- /dev/null +++ b/Quanter.Trader.Messages/licenses/license.txt @@ -0,0 +1,31 @@ +Protocol Buffers - Google's data interchange format +Copyright 2008-2010 Google Inc. All rights reserved. +http://github.com/jskeet/dotnet-protobufs/ +Original C++/Java/Python code: +http://code.google.com/p/protobuf/ + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + + * Redistributions of source code must retain the above copyright +notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above +copyright notice, this list of conditions and the following disclaimer +in the documentation and/or other materials provided with the +distribution. + * Neither the name of Google Inc. nor the names of its +contributors may be used to endorse or promote products derived from +this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/Quanter.Trader.Messages/licenses/protoc-license.txt b/Quanter.Trader.Messages/licenses/protoc-license.txt new file mode 100644 index 0000000..c779cb0 --- /dev/null +++ b/Quanter.Trader.Messages/licenses/protoc-license.txt @@ -0,0 +1,36 @@ +protoc.exe was built from the original source at http://code.google.com/p/protobuf/ +The licence for this code is as follows: + +Copyright 2008, Google Inc. +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + + * Redistributions of source code must retain the above copyright +notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above +copyright notice, this list of conditions and the following disclaimer +in the documentation and/or other materials provided with the +distribution. + * Neither the name of Google Inc. nor the names of its +contributors may be used to endorse or promote products derived from +this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +Code generated by the Protocol Buffer compiler is owned by the owner +of the input file used when generating it. This code is not +standalone and requires a support library to be linked with it. This +support library is itself covered by the above license. \ No newline at end of file diff --git a/Quanter.Trader.Messages/packages.config b/Quanter.Trader.Messages/packages.config new file mode 100644 index 0000000..0934726 --- /dev/null +++ b/Quanter.Trader.Messages/packages.config @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/Quanter.Trader.Messages/protos/google/protobuf/csharp_options.proto b/Quanter.Trader.Messages/protos/google/protobuf/csharp_options.proto new file mode 100644 index 0000000..152df76 --- /dev/null +++ b/Quanter.Trader.Messages/protos/google/protobuf/csharp_options.proto @@ -0,0 +1,115 @@ +// Extra options for C# generator + +import "google/protobuf/descriptor.proto"; + +package google.protobuf; + +message CSharpFileOptions { + + // Namespace for generated classes; defaults to the package. + optional string namespace = 1; + + // Name of the "umbrella" class used for metadata about all + // the messages within this file. Default is based on the name + // of the file. + optional string umbrella_classname = 2; + + // Whether classes should be public (true) or internal (false) + optional bool public_classes = 3 [default = true]; + + // Whether to generate a single file for everything within the + // .proto file (false), or one file per message (true). + // This option is not currently honored; please log a feature + // request if you really want it. + optional bool multiple_files = 4; + + // Whether to nest messages within a single umbrella class (true) + // or create the umbrella class as a peer, with messages as + // top-level classes in the namespace (false) + optional bool nest_classes = 5; + + // Generate appropriate support for Code Contracts + // (Ongoing; support should improve over time) + optional bool code_contracts = 6; + + // Create subdirectories for namespaces, e.g. namespace "Foo.Bar" + // would generate files within [output directory]/Foo/Bar + optional bool expand_namespace_directories = 7; + + // Generate attributes indicating non-CLS-compliance + optional bool cls_compliance = 8 [default = true]; + + // Generate messages/builders with the [Serializable] attribute + optional bool add_serializable = 9 [default = false]; + + // Generates a private ctor for Message types + optional bool generate_private_ctor = 10 [default = true]; + + // The extension that should be appended to the umbrella_classname when creating files. + optional string file_extension = 221 [default = ".cs"]; + + // A nested namespace for the umbrella class. Helpful for name collisions caused by + // umbrella_classname conflicting with an existing type. This will be automatically + // set to 'Proto' if a collision is detected with types being generated. This value + // is ignored when nest_classes == true + optional string umbrella_namespace = 222; + + // The output path for the source file(s) generated + optional string output_directory = 223 [default = "."]; + + // Will ignore the type generations and remove dependencies for the descriptor proto + // files that declare their package to be "google.protobuf" + optional bool ignore_google_protobuf = 224 [default = false]; + + // Controls how services are generated, GENERIC is the deprecated original implementation + // INTERFACE generates service interfaces only, RPCINTEROP generates interfaces and + // implementations using the included Windows RPC interop libarary. + optional CSharpServiceType service_generator_type = 225 [default = NONE]; + + // Used to add the System.Runtime.CompilerServices.CompilerGeneratedAttribute and + // System.CodeDom.Compiler.GeneratedCodeAttribute attributes to generated code. + optional bool generated_code_attributes = 226 [default = false]; +} + +enum CSharpServiceType { + // Services are ignored by the generator + NONE = 0; + // Generates the original Java generic service implementations + GENERIC = 1; + // Generates an interface for the service and nothing else + INTERFACE = 2; + // Generates an interface for the service and client/server wrappers for the interface + IRPCDISPATCH = 3; +} + +extend FileOptions { + optional CSharpFileOptions csharp_file_options = 1000; +} + +extend FieldOptions { + optional CSharpFieldOptions csharp_field_options = 1000; +} + +message CSharpFieldOptions { + // Provides the ability to override the name of the property + // generated for this field. This is applied to all properties + // and methods to do with this field, including HasFoo, FooCount, + // FooList etc. + optional string property_name = 1; +} + +message CSharpServiceOptions { + optional string interface_id = 1; +} + +extend ServiceOptions { + optional CSharpServiceOptions csharp_service_options = 1000; +} + +message CSharpMethodOptions { + optional int32 dispatch_id = 1; +} + +extend MethodOptions { + optional CSharpMethodOptions csharp_method_options = 1000; +} \ No newline at end of file diff --git a/Quanter.Trader.Messages/protos/google/protobuf/descriptor.proto b/Quanter.Trader.Messages/protos/google/protobuf/descriptor.proto new file mode 100644 index 0000000..233f879 --- /dev/null +++ b/Quanter.Trader.Messages/protos/google/protobuf/descriptor.proto @@ -0,0 +1,533 @@ +// Protocol Buffers - Google's data interchange format +// Copyright 2008 Google Inc. All rights reserved. +// http://code.google.com/p/protobuf/ +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// Author: kenton@google.com (Kenton Varda) +// Based on original Protocol Buffers design by +// Sanjay Ghemawat, Jeff Dean, and others. +// +// The messages in this file describe the definitions found in .proto files. +// A valid .proto file can be translated directly to a FileDescriptorProto +// without any other information (e.g. without reading its imports). + + + +package google.protobuf; +option java_package = "com.google.protobuf"; +option java_outer_classname = "DescriptorProtos"; + +// descriptor.proto must be optimized for speed because reflection-based +// algorithms don't work during bootstrapping. +option optimize_for = SPEED; + +// The protocol compiler can output a FileDescriptorSet containing the .proto +// files it parses. +message FileDescriptorSet { + repeated FileDescriptorProto file = 1; +} + +// Describes a complete .proto file. +message FileDescriptorProto { + optional string name = 1; // file name, relative to root of source tree + optional string package = 2; // e.g. "foo", "foo.bar", etc. + + // Names of files imported by this file. + repeated string dependency = 3; + + // All top-level definitions in this file. + repeated DescriptorProto message_type = 4; + repeated EnumDescriptorProto enum_type = 5; + repeated ServiceDescriptorProto service = 6; + repeated FieldDescriptorProto extension = 7; + + optional FileOptions options = 8; + + // This field contains optional information about the original source code. + // You may safely remove this entire field whithout harming runtime + // functionality of the descriptors -- the information is needed only by + // development tools. + optional SourceCodeInfo source_code_info = 9; +} + +// Describes a message type. +message DescriptorProto { + optional string name = 1; + + repeated FieldDescriptorProto field = 2; + repeated FieldDescriptorProto extension = 6; + + repeated DescriptorProto nested_type = 3; + repeated EnumDescriptorProto enum_type = 4; + + message ExtensionRange { + optional int32 start = 1; + optional int32 end = 2; + } + repeated ExtensionRange extension_range = 5; + + optional MessageOptions options = 7; +} + +// Describes a field within a message. +message FieldDescriptorProto { + enum Type { + // 0 is reserved for errors. + // Order is weird for historical reasons. + TYPE_DOUBLE = 1; + TYPE_FLOAT = 2; + TYPE_INT64 = 3; // Not ZigZag encoded. Negative numbers + // take 10 bytes. Use TYPE_SINT64 if negative + // values are likely. + TYPE_UINT64 = 4; + TYPE_INT32 = 5; // Not ZigZag encoded. Negative numbers + // take 10 bytes. Use TYPE_SINT32 if negative + // values are likely. + TYPE_FIXED64 = 6; + TYPE_FIXED32 = 7; + TYPE_BOOL = 8; + TYPE_STRING = 9; + TYPE_GROUP = 10; // Tag-delimited aggregate. + TYPE_MESSAGE = 11; // Length-delimited aggregate. + + // New in version 2. + TYPE_BYTES = 12; + TYPE_UINT32 = 13; + TYPE_ENUM = 14; + TYPE_SFIXED32 = 15; + TYPE_SFIXED64 = 16; + TYPE_SINT32 = 17; // Uses ZigZag encoding. + TYPE_SINT64 = 18; // Uses ZigZag encoding. + }; + + enum Label { + // 0 is reserved for errors + LABEL_OPTIONAL = 1; + LABEL_REQUIRED = 2; + LABEL_REPEATED = 3; + // TODO(sanjay): Should we add LABEL_MAP? + }; + + optional string name = 1; + optional int32 number = 3; + optional Label label = 4; + + // If type_name is set, this need not be set. If both this and type_name + // are set, this must be either TYPE_ENUM or TYPE_MESSAGE. + optional Type type = 5; + + // For message and enum types, this is the name of the type. If the name + // starts with a '.', it is fully-qualified. Otherwise, C++-like scoping + // rules are used to find the type (i.e. first the nested types within this + // message are searched, then within the parent, on up to the root + // namespace). + optional string type_name = 6; + + // For extensions, this is the name of the type being extended. It is + // resolved in the same manner as type_name. + optional string extendee = 2; + + // For numeric types, contains the original text representation of the value. + // For booleans, "true" or "false". + // For strings, contains the default text contents (not escaped in any way). + // For bytes, contains the C escaped value. All bytes >= 128 are escaped. + // TODO(kenton): Base-64 encode? + optional string default_value = 7; + + optional FieldOptions options = 8; +} + +// Describes an enum type. +message EnumDescriptorProto { + optional string name = 1; + + repeated EnumValueDescriptorProto value = 2; + + optional EnumOptions options = 3; +} + +// Describes a value within an enum. +message EnumValueDescriptorProto { + optional string name = 1; + optional int32 number = 2; + + optional EnumValueOptions options = 3; +} + +// Describes a service. +message ServiceDescriptorProto { + optional string name = 1; + repeated MethodDescriptorProto method = 2; + + optional ServiceOptions options = 3; +} + +// Describes a method of a service. +message MethodDescriptorProto { + optional string name = 1; + + // Input and output type names. These are resolved in the same way as + // FieldDescriptorProto.type_name, but must refer to a message type. + optional string input_type = 2; + optional string output_type = 3; + + optional MethodOptions options = 4; +} + +// =================================================================== +// Options + +// Each of the definitions above may have "options" attached. These are +// just annotations which may cause code to be generated slightly differently +// or may contain hints for code that manipulates protocol messages. +// +// Clients may define custom options as extensions of the *Options messages. +// These extensions may not yet be known at parsing time, so the parser cannot +// store the values in them. Instead it stores them in a field in the *Options +// message called uninterpreted_option. This field must have the same name +// across all *Options messages. We then use this field to populate the +// extensions when we build a descriptor, at which point all protos have been +// parsed and so all extensions are known. +// +// Extension numbers for custom options may be chosen as follows: +// * For options which will only be used within a single application or +// organization, or for experimental options, use field numbers 50000 +// through 99999. It is up to you to ensure that you do not use the +// same number for multiple options. +// * For options which will be published and used publicly by multiple +// independent entities, e-mail kenton@google.com to reserve extension +// numbers. Simply tell me how many you need and I'll send you back a +// set of numbers to use -- there's no need to explain how you intend to +// use them. If this turns out to be popular, a web service will be set up +// to automatically assign option numbers. + + +message FileOptions { + + // Sets the Java package where classes generated from this .proto will be + // placed. By default, the proto package is used, but this is often + // inappropriate because proto packages do not normally start with backwards + // domain names. + optional string java_package = 1; + + + // If set, all the classes from the .proto file are wrapped in a single + // outer class with the given name. This applies to both Proto1 + // (equivalent to the old "--one_java_file" option) and Proto2 (where + // a .proto always translates to a single class, but you may want to + // explicitly choose the class name). + optional string java_outer_classname = 8; + + // If set true, then the Java code generator will generate a separate .java + // file for each top-level message, enum, and service defined in the .proto + // file. Thus, these types will *not* be nested inside the outer class + // named by java_outer_classname. However, the outer class will still be + // generated to contain the file's getDescriptor() method as well as any + // top-level extensions defined in the file. + optional bool java_multiple_files = 10 [default=false]; + + // If set true, then the Java code generator will generate equals() and + // hashCode() methods for all messages defined in the .proto file. This is + // purely a speed optimization, as the AbstractMessage base class includes + // reflection-based implementations of these methods. + optional bool java_generate_equals_and_hash = 20 [default=false]; + + // Generated classes can be optimized for speed or code size. + enum OptimizeMode { + SPEED = 1; // Generate complete code for parsing, serialization, + // etc. + CODE_SIZE = 2; // Use ReflectionOps to implement these methods. + LITE_RUNTIME = 3; // Generate code using MessageLite and the lite runtime. + } + optional OptimizeMode optimize_for = 9 [default=SPEED]; + + + + + // Should generic services be generated in each language? "Generic" services + // are not specific to any particular RPC system. They are generated by the + // main code generators in each language (without additional plugins). + // Generic services were the only kind of service generation supported by + // early versions of proto2. + // + // Generic services are now considered deprecated in favor of using plugins + // that generate code specific to your particular RPC system. Therefore, + // these default to false. Old code which depends on generic services should + // explicitly set them to true. + optional bool cc_generic_services = 16 [default=false]; + optional bool java_generic_services = 17 [default=false]; + optional bool py_generic_services = 18 [default=false]; + + // The parser stores options it doesn't recognize here. See above. + repeated UninterpretedOption uninterpreted_option = 999; + + // Clients can define custom options in extensions of this message. See above. + extensions 1000 to max; +} + +message MessageOptions { + // Set true to use the old proto1 MessageSet wire format for extensions. + // This is provided for backwards-compatibility with the MessageSet wire + // format. You should not use this for any other reason: It's less + // efficient, has fewer features, and is more complicated. + // + // The message must be defined exactly as follows: + // message Foo { + // option message_set_wire_format = true; + // extensions 4 to max; + // } + // Note that the message cannot have any defined fields; MessageSets only + // have extensions. + // + // All extensions of your type must be singular messages; e.g. they cannot + // be int32s, enums, or repeated messages. + // + // Because this is an option, the above two restrictions are not enforced by + // the protocol compiler. + optional bool message_set_wire_format = 1 [default=false]; + + // Disables the generation of the standard "descriptor()" accessor, which can + // conflict with a field of the same name. This is meant to make migration + // from proto1 easier; new code should avoid fields named "descriptor". + optional bool no_standard_descriptor_accessor = 2 [default=false]; + + // The parser stores options it doesn't recognize here. See above. + repeated UninterpretedOption uninterpreted_option = 999; + + // Clients can define custom options in extensions of this message. See above. + extensions 1000 to max; +} + +message FieldOptions { + // The ctype option instructs the C++ code generator to use a different + // representation of the field than it normally would. See the specific + // options below. This option is not yet implemented in the open source + // release -- sorry, we'll try to include it in a future version! + optional CType ctype = 1 [default = STRING]; + enum CType { + // Default mode. + STRING = 0; + + CORD = 1; + + STRING_PIECE = 2; + } + // The packed option can be enabled for repeated primitive fields to enable + // a more efficient representation on the wire. Rather than repeatedly + // writing the tag and type for each element, the entire array is encoded as + // a single length-delimited blob. + optional bool packed = 2; + + + // Is this field deprecated? + // Depending on the target platform, this can emit Deprecated annotations + // for accessors, or it will be completely ignored; in the very least, this + // is a formalization for deprecating fields. + optional bool deprecated = 3 [default=false]; + + // EXPERIMENTAL. DO NOT USE. + // For "map" fields, the name of the field in the enclosed type that + // is the key for this map. For example, suppose we have: + // message Item { + // required string name = 1; + // required string value = 2; + // } + // message Config { + // repeated Item items = 1 [experimental_map_key="name"]; + // } + // In this situation, the map key for Item will be set to "name". + // TODO: Fully-implement this, then remove the "experimental_" prefix. + optional string experimental_map_key = 9; + + // The parser stores options it doesn't recognize here. See above. + repeated UninterpretedOption uninterpreted_option = 999; + + // Clients can define custom options in extensions of this message. See above. + extensions 1000 to max; +} + +message EnumOptions { + + // The parser stores options it doesn't recognize here. See above. + repeated UninterpretedOption uninterpreted_option = 999; + + // Clients can define custom options in extensions of this message. See above. + extensions 1000 to max; +} + +message EnumValueOptions { + // The parser stores options it doesn't recognize here. See above. + repeated UninterpretedOption uninterpreted_option = 999; + + // Clients can define custom options in extensions of this message. See above. + extensions 1000 to max; +} + +message ServiceOptions { + + // Note: Field numbers 1 through 32 are reserved for Google's internal RPC + // framework. We apologize for hoarding these numbers to ourselves, but + // we were already using them long before we decided to release Protocol + // Buffers. + + // The parser stores options it doesn't recognize here. See above. + repeated UninterpretedOption uninterpreted_option = 999; + + // Clients can define custom options in extensions of this message. See above. + extensions 1000 to max; +} + +message MethodOptions { + + // Note: Field numbers 1 through 32 are reserved for Google's internal RPC + // framework. We apologize for hoarding these numbers to ourselves, but + // we were already using them long before we decided to release Protocol + // Buffers. + + // The parser stores options it doesn't recognize here. See above. + repeated UninterpretedOption uninterpreted_option = 999; + + // Clients can define custom options in extensions of this message. See above. + extensions 1000 to max; +} + +// A message representing a option the parser does not recognize. This only +// appears in options protos created by the compiler::Parser class. +// DescriptorPool resolves these when building Descriptor objects. Therefore, +// options protos in descriptor objects (e.g. returned by Descriptor::options(), +// or produced by Descriptor::CopyTo()) will never have UninterpretedOptions +// in them. +message UninterpretedOption { + // The name of the uninterpreted option. Each string represents a segment in + // a dot-separated name. is_extension is true iff a segment represents an + // extension (denoted with parentheses in options specs in .proto files). + // E.g.,{ ["foo", false], ["bar.baz", true], ["qux", false] } represents + // "foo.(bar.baz).qux". + message NamePart { + required string name_part = 1; + required bool is_extension = 2; + } + repeated NamePart name = 2; + + // The value of the uninterpreted option, in whatever type the tokenizer + // identified it as during parsing. Exactly one of these should be set. + optional string identifier_value = 3; + optional uint64 positive_int_value = 4; + optional int64 negative_int_value = 5; + optional double double_value = 6; + optional bytes string_value = 7; + optional string aggregate_value = 8; +} + +// =================================================================== +// Optional source code info + +// Encapsulates information about the original source file from which a +// FileDescriptorProto was generated. +message SourceCodeInfo { + // A Location identifies a piece of source code in a .proto file which + // corresponds to a particular definition. This information is intended + // to be useful to IDEs, code indexers, documentation generators, and similar + // tools. + // + // For example, say we have a file like: + // message Foo { + // optional string foo = 1; + // } + // Let's look at just the field definition: + // optional string foo = 1; + // ^ ^^ ^^ ^ ^^^ + // a bc de f ghi + // We have the following locations: + // span path represents + // [a,i) [ 4, 0, 2, 0 ] The whole field definition. + // [a,b) [ 4, 0, 2, 0, 4 ] The label (optional). + // [c,d) [ 4, 0, 2, 0, 5 ] The type (string). + // [e,f) [ 4, 0, 2, 0, 1 ] The name (foo). + // [g,h) [ 4, 0, 2, 0, 3 ] The number (1). + // + // Notes: + // - A location may refer to a repeated field itself (i.e. not to any + // particular index within it). This is used whenever a set of elements are + // logically enclosed in a single code segment. For example, an entire + // extend block (possibly containing multiple extension definitions) will + // have an outer location whose path refers to the "extensions" repeated + // field without an index. + // - Multiple locations may have the same path. This happens when a single + // logical declaration is spread out across multiple places. The most + // obvious example is the "extend" block again -- there may be multiple + // extend blocks in the same scope, each of which will have the same path. + // - A location's span is not always a subset of its parent's span. For + // example, the "extendee" of an extension declaration appears at the + // beginning of the "extend" block and is shared by all extensions within + // the block. + // - Just because a location's span is a subset of some other location's span + // does not mean that it is a descendent. For example, a "group" defines + // both a type and a field in a single declaration. Thus, the locations + // corresponding to the type and field and their components will overlap. + // - Code which tries to interpret locations should probably be designed to + // ignore those that it doesn't understand, as more types of locations could + // be recorded in the future. + repeated Location location = 1; + message Location { + // Identifies which part of the FileDescriptorProto was defined at this + // location. + // + // Each element is a field number or an index. They form a path from + // the root FileDescriptorProto to the place where the definition. For + // example, this path: + // [ 4, 3, 2, 7, 1 ] + // refers to: + // file.message_type(3) // 4, 3 + // .field(7) // 2, 7 + // .name() // 1 + // This is because FileDescriptorProto.message_type has field number 4: + // repeated DescriptorProto message_type = 4; + // and DescriptorProto.field has field number 2: + // repeated FieldDescriptorProto field = 2; + // and FieldDescriptorProto.name has field number 1: + // optional string name = 1; + // + // Thus, the above path gives the location of a field name. If we removed + // the last element: + // [ 4, 3, 2, 7 ] + // this path refers to the whole field declaration (from the beginning + // of the label to the terminating semicolon). + repeated int32 path = 1 [packed=true]; + + // Always has exactly three or four elements: start line, start column, + // end line (optional, otherwise assumed same as start line), end column. + // These are packed into a single field for efficiency. Note that line + // and column numbers are zero-based -- typically you will want to add + // 1 to each before displaying to a user. + repeated int32 span = 2 [packed=true]; + + // TODO(kenton): Record comments appearing before and after the + // declaration. + } +} diff --git a/Quanter.Trader.Messages/protos/tutorial/addressbook.proto b/Quanter.Trader.Messages/protos/tutorial/addressbook.proto new file mode 100644 index 0000000..5abe35c --- /dev/null +++ b/Quanter.Trader.Messages/protos/tutorial/addressbook.proto @@ -0,0 +1,31 @@ +package tutorial; + +import "google/protobuf/csharp_options.proto"; +option (google.protobuf.csharp_file_options).namespace = "Google.ProtocolBuffers.Examples.AddressBook"; +option (google.protobuf.csharp_file_options).umbrella_classname = "AddressBookProtos"; + +option optimize_for = SPEED; + +message Person { + required string name = 1; + required int32 id = 2; // Unique ID number for this person. + optional string email = 3; + + enum PhoneType { + MOBILE = 0; + HOME = 1; + WORK = 2; + } + + message PhoneNumber { + required string number = 1; + optional PhoneType type = 2 [default = HOME]; + } + + repeated PhoneNumber phone = 4; +} + +// Our address book file is just one of these. +message AddressBook { + repeated Person person = 1; +} diff --git a/Quanter.Trader.StrategyServer/BaseStrategyActor.cs b/Quanter.Trader.StrategyServer/BaseStrategyActor.cs new file mode 100644 index 0000000..04e4f2c --- /dev/null +++ b/Quanter.Trader.StrategyServer/BaseStrategyActor.cs @@ -0,0 +1,307 @@ +using Akka.Actor; +using Akka.Event; +using Quanter.BusinessEntity; +using Quanter.Common; +using Quanter.Trader.Messages; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Quanter.Strategy +{ + public abstract class BaseStrategyActor : TypedActor, IHandle, IHandle + { + private readonly ILoggingAdapter _log = Logging.GetLogger(Context); + + private ActorSelection persistenceActor = null; + private ActorSelection tradeActor = null; + protected List secs = new List(); + private Dictionary secDict = new Dictionary(); + private Dictionary symbolPriceActors = new Dictionary(); + private Dictionary symbolPrices = new Dictionary(); + + protected void AddSecurities(Securities sec) + { + secDict.Add(sec.Symbol, sec); + + String path = String.Format("/user/{0}/{1}", ConstantsHelper.AKKA_PATH_MARKET_MANAGER, sec.Symbol); + var secActor = Context.ActorSelection(path); + SecuritiesQuotationRequest req = new SecuritiesQuotationRequest() + { + Type = SecuritiesQuotationRequest.RequestType.WATCH_QUOTEDATA, + Body = Desc.Id + }; + secActor.Tell(req); + symbolPriceActors.Add(sec.Symbol, secActor); + } + + protected void RemoveSecurities(Securities sec) + { + if (secDict.ContainsKey(sec.Symbol)) { + secDict.Remove(sec.Symbol); + symbolPriceActors[sec.Symbol].Tell(new SecuritiesQuotationRequest() { Type = SecuritiesQuotationRequest.RequestType.UNWATCH, Body = Desc.Id }); + symbolPriceActors.Remove(sec.Symbol); + } + } + + public BaseStrategyActor(EStrategy strategy) + { + this.Desc = strategy; + } + public EStrategy Desc { get; private set; } + + public void Handle(StrategyRequest message) + { + switch(message.Type) + { + case StrategyRequestType.START: + start(); + break; + case StrategyRequestType.STOP: + stop(); + break; + default: + otherAction(message); + break; + } + } + + public void Handle(StrategyResponse message) + { + switch(message.Type) + { + case StrategyResponse.ResponseType.TICK_ARRIVED: + onTickData((TickData)message.Body); + break; + case StrategyResponse.ResponseType.BAR_ARRIVED: + onBarData((BarData)message.Body); + break; + case StrategyResponse.ResponseType.QUOTE_ARRIVED: + onQuoteData((QuoteData)message.Body); + break; + case StrategyResponse.ResponseType.RUN_ARRIVED: + run(message.Body); + break; + } + } + + protected override void PreStart() + { + init(); + start(); + base.PreStart(); + } + + protected override void PostStop() + { + base.PostStop(); + stop(); + } + + protected virtual void init() + { + //String path = String.Format("/user/{0}", ConstantsHelper.AKKA_PATH_PERSISTENCE); + //persistenceActor = Context.ActorSelection(path); + + String path = String.Format("/user/{0}", ConstantsHelper.AKKA_PATH_TRADER); + tradeActor = Context.ActorSelection(path); + + initSettings(); + + } + + protected virtual void initRisk() { + // 初始化使用哪些风控 + } + + protected virtual void initSettings() { + // 使用哪个交易接口 + // 使用的哪种类型的行情数据 + // 初始化配置参数 + } + + protected virtual void initSecurities() { + // 关注哪些股票 + } + + protected virtual void start() + { + + } + + protected virtual void stop() + { + + } + + protected virtual void onTickData(TickData data) + { + + } + + protected virtual void onBarData(BarData data) + { + + } + protected virtual void onQuoteData(QuoteData data) + { + + } + + protected virtual void run(object data) + { + + } + + protected virtual void otherAction(StrategyRequest message) + { + } + + #region 子账户的处理 + + protected int getCurrentAmount(String symbol) + { + //foreach (StockHolderInfo shi in this.account.Holders) + //{ + // if (shi.StockCode == StockUtil.GetShortCode(code)) + // { + // return shi.CurrentAmount; + // } + //} + return 0; + } + + protected int getEnableAmount(String symbol) + { + //foreach (StockHolderInfo shi in this.account.Holders) + //{ + // if (shi.StockCode == StockUtil.GetShortCode(code)) + // { + // return shi.EnableAmount; + // } + //} + return 0; + } + + protected void buySecurities(Securities securities, float price, int amount) + { + // 1、下单 + Order order = _createOrder(securities, price, amount, OrderType.BUY); + _notifyTrader(order); + } + + protected void cancelSecurities(int entrustNo) + { + _log.Debug("保存到策略账户 委撤单 策略ID:{0}, 合同号:{1}", Desc.Id, entrustNo); + } + + protected void sellSecurities(Securities securities, float price, int amount) + { + // 下单 + Order order = _createOrder(securities, price, amount, OrderType.SELL); + _notifyTrader(order); + } + + private Order _createOrder(Securities sec, float price, int amount, OrderType type) + { + Order order = new Order + { + Amount = amount, + Price = price, + Type = type, + Symbol = sec.Symbol, + StrategyId = Desc.Id + }; + + return order; + } + + private void _notifyTrader(Order order) + { + _log.Debug("通知交易端下单 策略ID:{0}, 代码:{1}, 证券类别: {2}, 价格:{3}, 数量:{4}", Desc.Id, order.Symbol); + + TradeRequest req = new TradeRequest(); + + req.OrderType = order.Type; + req.TradeInterface = TradeInterface.THS; + req.TradeType = TradeType.ALGO; + + req.SecuritiesOrder = order; + + tradeActor.Tell(req); // TODO: 改为ASK? + } + + private void _updateAccountInfo () + { + // Ask 账户持股信息,资金信息 + + // + } + + /// + /// 由Persistence Actor来做,迁移到Trader 接口去保存订单 + /// + /// + //private void _saveEntrustOrder(Order order) + //{ + // PersistenceRequest req = new PersistenceRequest() { Type = PersistenceType.SAVE, Body = order }; + + // persistenceActor.Tell(req); + //} + + #endregion + + protected string _getSymbol(String stockCode) + { + if (stockCode.Length == 6) + { + switch (stockCode.Substring(0, 2)) + { + case "51": + case "50": + case "60": + stockCode = stockCode + ".XSHG"; + return stockCode; + + case "00": + case "15": + case "16": + case "30": + stockCode = stockCode + ".XSHE"; + return stockCode; + } + } + else if (stockCode.Length == 8) + { + switch (stockCode.Substring(0, 2)) + { + case "sz": + stockCode = stockCode.Substring(2, 6) + ".XSHE"; + break; + case "sh": + stockCode = stockCode.Substring(2, 6) + ".XSHG"; + break; + } + } + + return stockCode; + } + + protected string _getShortCode(String code) + { + switch (code.Length) + { + case 6: + return code; + case 8: + return code.Substring(2); + case 13: + return code.Substring(0, 6); + default: + return code; + } + } + } +} diff --git a/Quanter.Trader.StrategyServer/CHANGES.txt b/Quanter.Trader.StrategyServer/CHANGES.txt new file mode 100644 index 0000000..d80368c --- /dev/null +++ b/Quanter.Trader.StrategyServer/CHANGES.txt @@ -0,0 +1,99 @@ +=============================================================================== +Welcome to the C# port of Google Protocol Buffers, written by Jon Skeet +(skeet@pobox.com) based on the work of many talented people. + +For more information about this port, visit its homepage: +http://protobuf-csharp-port.googlecode.com + +For more information about Protocol Buffers in general, visit the project page +for the C++, Java and Python project: +http://protobuf.googlecode.com +=============================================================================== +RELEASE NOTES - Version 2.4.1.473 +=============================================================================== + +Features: +- Added option service_generator_type to control service generation with + NONE, GENERIC, INTERFACE, or IRPCDISPATCH +- Added interfaces IRpcDispatch and IRpcServerStub to provide for blocking + services and implementations. +- Added ProtoGen.exe command-line argument "--protoc_dir=" to specify the + location of protoc.exe. +- Extracted interfaces for ICodedInputStream and ICodedOutputStream to allow + custom implementation of writers with both speed and size optimizations. +- Addition of the "Google.ProtoBuffers.Serialization" assembly to support + reading and writing messages to/from XML, JSON, IDictionary<,> and others. +- Several performance related fixes and tweeks +- Issue 3: Add option to mark generated code with attribute +- Issue 20: Support for decorating classes [Serializable] +- Issue 21: Decorate fields with [deprecated=true] as [System.Obsolete] +- Issue 22: Reusable Builder classes +- Issue 24: Support for using Json/Xml formats with ICodedInputStream +- Issue 25: Added support for NuGet packages +- Issue 31: Upgraded protoc.exe and descriptor to 2.4.1 + +Fixes: +- Issue 13: Message with Field same name as message causes uncompilable .cs +- Issue 16: Does not integrate well with other tooling +- Issue 19: Support for negative enum values +- Issue 26: AddRange in GeneratedBuilder iterates twice. +- Issue 27: Remove XML documentation output from test projects to clear + warnings/errors. +- Issue 28: Circular message dependencies result in null default values for + Message fields. +- Issue 29: Message classes generated have a public default constructor. You + can disable private ctor generation with the option generate_private_ctor. +- Issue 35: Fixed a bug in ProtoGen handling of arguments with trailing \ +- Big-endian support for float, and double on Silverlight +- Packed and Unpacked parsing allow for all repeated, as per version 2.3 +- Fix for leaving Builder a public ctor on internal classes for use with + generic "where T: new()" constraints. + +Other: +- Changed the code signing key to a privately held key +- Reformatted all code and line-endings to C# defaults +- Reworking of performance benchmarks to produce reliable results, option /v2 +- Issue 34: Silverlight assemblies are now unit tested + +=============================================================================== +RELEASE NOTES - Version 2.3.0.277 +=============================================================================== + +Features: +- Added cls_compliance option to generate attributes indicating + non-CLS-compliance. +- Added file_extension option to control the generated output file's extension. +- Added umbrella_namespace option to place the umbrella class into a nested + namespace to address issues with proto files having the same name as a + message it contains. +- Added output_directory option to set the output path for the source file(s). +- Added ignore_google_protobuf option to avoid generating code for includes + from the google.protobuf package. +- Added the LITE framework (Google.ProtoBuffersLite.dll) and the ability to + generate code with "option optimize_for = LITE_RUNTIME;". +- Added ability to invoke protoc.exe from within ProtoGen.exe. +- Upgraded to protoc.exe (2.3) compiler. + +Fixes: +- Issue 9: Class cannot be static and sealed error +- Issue 12: default value for enumerate fields must be filled out + +Other: +- Rewrite of build using MSBbuild instead of NAnt +- Moved to NUnit Version 2.2.8.0 +- Changed to using secure .snk for releases + +=============================================================================== +RELEASE NOTES - Version 0.9.1 +=============================================================================== + +Fixes: +- issue 10: Incorrect encoding of packed fields when serialized + +=============================================================================== +RELEASE NOTES - Version 0.9.0 +=============================================================================== + +- Initial release + +=============================================================================== \ No newline at end of file diff --git a/Quanter.Trader.StrategyServer/ClassDiagram1.cd b/Quanter.Trader.StrategyServer/ClassDiagram1.cd new file mode 100644 index 0000000..f820d67 --- /dev/null +++ b/Quanter.Trader.StrategyServer/ClassDiagram1.cd @@ -0,0 +1,26 @@ + + + + + + AAACAAAAAAAAEAEIAhAAAAQAAgAEAQBEAAACQAKAAgY= + BaseStrategy.cs + + + + + + + AAAAAAAAAAAAEAAAAgAAAAAAAAAAAAAAAAAAAAAAAAQ= + IAccount.cs + + + + + + AAACAAAAAAAAAAEAAAAAAAQAAAAAAQAEAAACQACAAAI= + IStrategy.cs + + + + \ No newline at end of file diff --git a/Quanter.Trader.StrategyServer/IAccount.cs b/Quanter.Trader.StrategyServer/IAccount.cs new file mode 100644 index 0000000..91fede8 --- /dev/null +++ b/Quanter.Trader.StrategyServer/IAccount.cs @@ -0,0 +1,21 @@ +using Stock.Common; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Stock.Trader.Strategy +{ + public interface IAccount + { + + void BuySecurities(Securities securities, float price, int amount); + + void SellSecurities(Securities securities, float price, int amount); + + void CancelSecurities(int entrustNo); + + + } +} diff --git a/Quanter.Trader.StrategyServer/IStrategy.cs b/Quanter.Trader.StrategyServer/IStrategy.cs new file mode 100644 index 0000000..0eebb60 --- /dev/null +++ b/Quanter.Trader.StrategyServer/IStrategy.cs @@ -0,0 +1,59 @@ +using Quanter.Common; +using Quanter.Domain; +using Quanter.Trader.Messages; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Quanter.Strategy +{ + public interface IStrategy + { + int Id { get; } + + String Name { get; set; } + + StrategyDesc Desc { get; set; } + + TradeMode TradeMode { get; set; } + + List SecuritiesList { get; set; } + + /// + /// 初始化策略 + /// + void Init(); + + /// + /// 启动策略 + /// + void Start(); + + /// + /// 停止策略 + /// + void Stop(); + + /// + /// Tick 数据到达 + /// + void OnTickData(); + + /// + /// Bar数据到达 + /// + void OnBarData(); + + /// + /// 报价数据到达 + /// + void OnQuoteData(); + + /// + /// 外部其他因素触发 + /// + void Run(); + } +} diff --git a/Quanter.Trader.StrategyServer/Properties/AssemblyInfo.cs b/Quanter.Trader.StrategyServer/Properties/AssemblyInfo.cs new file mode 100644 index 0000000..f1036cd --- /dev/null +++ b/Quanter.Trader.StrategyServer/Properties/AssemblyInfo.cs @@ -0,0 +1,36 @@ +using System.Reflection; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; + +// 有关程序集的一般信息由以下 +// 控制。更改这些特性值可修改 +// 与程序集关联的信息。 +[assembly: AssemblyTitle("Stock.Trader.StrategyServer")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("")] +[assembly: AssemblyProduct("Stock.Trader.StrategyServer")] +[assembly: AssemblyCopyright("Copyright © 2015")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +//将 ComVisible 设置为 false 将使此程序集中的类型 +//对 COM 组件不可见。 如果需要从 COM 访问此程序集中的类型, +//请将此类型的 ComVisible 特性设置为 true。 +[assembly: ComVisible(false)] + +// 如果此项目向 COM 公开,则下列 GUID 用于类型库的 ID +[assembly: Guid("f0e12b5e-7012-4345-b4a4-be4cedce5e91")] + +// 程序集的版本信息由下列四个值组成: +// +// 主版本 +// 次版本 +// 生成号 +// 修订号 +// +//可以指定所有这些值,也可以使用“生成号”和“修订号”的默认值, +// 方法是按如下所示使用“*”: : +// [assembly: AssemblyVersion("1.0.*")] +[assembly: AssemblyVersion("1.0.0.0")] +[assembly: AssemblyFileVersion("1.0.0.0")] diff --git a/Quanter.Trader.StrategyServer/Quanter.StrategyServer.csproj b/Quanter.Trader.StrategyServer/Quanter.StrategyServer.csproj new file mode 100644 index 0000000..e64ec2e --- /dev/null +++ b/Quanter.Trader.StrategyServer/Quanter.StrategyServer.csproj @@ -0,0 +1,149 @@ + + + + + + Debug + AnyCPU + {F0E12B5E-7012-4345-B4A4-BE4CEDCE5E91} + Library + Properties + Quanter.Strategy + Quanter.Trader.StrategyServer + v4.5.2 + 512 + + + + + true + full + false + bin\Debug\ + DEBUG;TRACE + prompt + 4 + + + pdbonly + true + bin\Release\ + TRACE + prompt + 4 + + + + ..\packages\Akka.1.0.5\lib\net45\Akka.dll + True + + + ..\packages\Akka.Logger.slf4net.1.0.5\lib\net45\Akka.Logger.slf4net.dll + True + + + ..\packages\Akka.Remote.1.0.5\lib\net45\Akka.Remote.dll + True + + + ..\packages\Akka.TestKit.1.0.5\lib\net45\Akka.TestKit.dll + True + + + ..\packages\Akka.TestKit.Xunit2.1.0.5\lib\net45\Akka.TestKit.Xunit2.dll + True + + + ..\packages\Google.ProtocolBuffers.2.4.1.521\lib\net40\Google.ProtocolBuffers.dll + True + + + ..\packages\Google.ProtocolBuffers.2.4.1.521\lib\net40\Google.ProtocolBuffers.Serialization.dll + True + + + ..\packages\Helios.1.4.1\lib\net45\Helios.dll + True + + + ..\packages\Newtonsoft.Json.7.0.1\lib\net45\Newtonsoft.Json.dll + True + + + ..\packages\slf4net.0.1.32.1\lib\net35\slf4net.dll + True + + + + + + + + + + + + ..\packages\xunit.abstractions.2.0.0\lib\net35\xunit.abstractions.dll + True + + + ..\packages\xunit.assert.2.0.0\lib\portable-net45+win+wpa81+wp80+monotouch+monoandroid+Xamarin.iOS\xunit.assert.dll + True + + + ..\packages\xunit.extensibility.core.2.0.0\lib\portable-net45+win+wpa81+wp80+monotouch+monoandroid+Xamarin.iOS\xunit.core.dll + True + + + + + + + + + + + + + + + + + + + + + + + + + + + + {34db14a6-e4ed-4c4a-8ca6-939201a572be} + Quanter.BusinessEntity + + + {a3fa3c71-a7b0-4bb6-bd32-0aee20493593} + Quanter.Common + + + {dde08214-ec3a-4dd7-8cee-49973e17ae8f} + Quanter.Trader.Messages + + + + + + 此项目引用这台计算机上缺少的 NuGet 程序包。使用 NuGet 程序包还原可下载这些程序包。有关详细信息,请参阅 http://go.microsoft.com/fwlink/?LinkID=322105。缺少的文件是 {0}。 + + + + + \ No newline at end of file diff --git a/Quanter.Trader.StrategyServer/Risk/IRiskRule.cs b/Quanter.Trader.StrategyServer/Risk/IRiskRule.cs new file mode 100644 index 0000000..083a158 --- /dev/null +++ b/Quanter.Trader.StrategyServer/Risk/IRiskRule.cs @@ -0,0 +1,21 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Quanter.Strategy.Risk +{ + public interface IRiskRule + { + String Title { get; } + + RiskActions Action { get; set; } + + /// + /// 处理订单 + /// + /// + bool ProcessMessage(); + } +} diff --git a/Quanter.Trader.StrategyServer/Risk/RiskActions.cs b/Quanter.Trader.StrategyServer/Risk/RiskActions.cs new file mode 100644 index 0000000..a96d7e5 --- /dev/null +++ b/Quanter.Trader.StrategyServer/Risk/RiskActions.cs @@ -0,0 +1,13 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Quanter.Strategy.Risk +{ + public enum RiskActions + { + CancelOrders, + } +} diff --git a/Quanter.Trader.StrategyServer/Risk/RiskManager.cs b/Quanter.Trader.StrategyServer/Risk/RiskManager.cs new file mode 100644 index 0000000..c4a9528 --- /dev/null +++ b/Quanter.Trader.StrategyServer/Risk/RiskManager.cs @@ -0,0 +1,12 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Quanter.Strategy.Risk +{ + public class RiskManager + { + } +} diff --git a/Quanter.Trader.StrategyServer/Risk/RiskRules.cs b/Quanter.Trader.StrategyServer/Risk/RiskRules.cs new file mode 100644 index 0000000..f261cc9 --- /dev/null +++ b/Quanter.Trader.StrategyServer/Risk/RiskRules.cs @@ -0,0 +1,34 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Quanter.Strategy.Risk +{ + public abstract class AbstractRiskRule : IRiskRule + { + public RiskActions Action { get; set; } + + public string Title { get; protected set; } + + public abstract bool ProcessMessage(); + } + + public class PnLRiskRule : AbstractRiskRule + { + private decimal pnL; + public decimal PnL + { + get { return this.pnL; } + set { + this.pnL = value; + Title = pnL.ToString(); + } + } + public override bool ProcessMessage() + { + throw new NotImplementedException(); + } + } +} diff --git a/Quanter.Trader.StrategyServer/StrategyActor.cs b/Quanter.Trader.StrategyServer/StrategyActor.cs new file mode 100644 index 0000000..2027fa6 --- /dev/null +++ b/Quanter.Trader.StrategyServer/StrategyActor.cs @@ -0,0 +1,118 @@ +using Akka.Actor; +using Akka.Event; +using Quanter.Common; +using Quanter.Trader.Messages; +using System; + +namespace Quanter.Strategy +{ + /// + /// 接收的消息 + /// 1、价格变动 + /// 2、启动策略 + /// 3、停止策略 + /// + /// 发出的请求 + /// 1、订阅证券价格 证券市场 + /// 2、取消订阅证券价格 证券市场 + /// 3、下单操作 交易接口 + /// + public class StrategyActor : TypedActor + { + private readonly ILoggingAdapter log = Logging.GetLogger(Context); + + private ActorSelection _market = null; + + IStrategy strategy = null; + + public StrategyActor(IStrategy strategy) + { + this.strategy = strategy; + } + + private void _start() + { + if (strategy.TradeMode == TradeMode.BACK_TEST) + { + // 获取历史行情 + _market = Context.ActorSelection("akka.tcp://myServer@localhost:8081/securities/market/history"); + } + else + { + // + _market = Context.ActorSelection("akka.tcp://myServer@localhost:8081/securities/market"); + } + _watchStock(); + strategy.Start(); + } + + private void _stop() + { + _unwatchStock(); + strategy.Stop(); + } + + private void _tickData(TickData data) + { + strategy.OnTickData(); + } + + /// + /// Bar数据达到 + /// + /// + private void _barData(TickData data) + { + strategy.OnBarData(); + } + + private void _quoteData() + { + strategy.OnQuoteData(); + } + + private void _run() + { + strategy.Run(); + } + + /// + /// 创建一个策略 + /// + private void _createStrategy() + { + strategy = null; + } + + /// + /// 下单操作 + /// + private void _createOrder(String symbol, float price, int amount, OrderType type) + { + // IAccount account = strategy as IAccount; + } + + /// + /// 订阅股票价格 + /// + private void _watchStock() + { + foreach (var item in strategy.SecuritiesList) + { + _market.Tell("订阅价格"); + } + } + + /// + /// 取消订阅股票价格 + /// + private void _unwatchStock() + { + foreach (var item in strategy.SecuritiesList) + { + _market.Tell("取消订阅价格"); + } + } + + } +} \ No newline at end of file diff --git a/Quanter.Trader.StrategyServer/StrategyManagerActor.cs b/Quanter.Trader.StrategyServer/StrategyManagerActor.cs new file mode 100644 index 0000000..4f3ef63 --- /dev/null +++ b/Quanter.Trader.StrategyServer/StrategyManagerActor.cs @@ -0,0 +1,118 @@ +using Akka.Actor; +using Akka.Event; +using Quanter.BusinessEntity; +using Quanter.Trader.Messages; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Quanter.Strategy +{ + /// + /// 处理的接收消息有 + /// 1、启动指定的策略 StartStrategiesRequest + /// 2、注册策略 + /// 3、配置指定的策略 SetupStrategyRequest + /// 4、停止所有的策略(depreated) + /// 5、停止指定的策略 StopStrategiesRequest + /// 6、请求所有的策略列表 StrategiesRequest + /// + /// 发出的请求有 + /// 1、证券市场订阅关注的证券 + /// 2、证券市场取消关注的证券 + /// 3、 + /// + public class StrategyManagerActor : TypedActor, IHandle, IHandle + { + private readonly ILoggingAdapter _log = Logging.GetLogger(Context); + + private Dictionary strategyActors = new Dictionary(); + + public void Handle(StrategyRequest message) + { + switch(message.Type) + { + case StrategyRequestType.CREATE: + _createStrategyActor((EStrategy)message.Body); + break; + case StrategyRequestType.START: + case StrategyRequestType.STOP: + _log.Error("错误的Request Type {0}", message.Type); + break; + default: + _log.Warning("不支持的Request Type {0}", message.Type); + break; + } + } + + /// + /// + /// + /// + public void Handle(StrategiesRequest message) + { + StrategiesResponse sr = new StrategiesResponse(); + + sr.Add(new EStrategy + { + Type="", + Name = "雪球跟踪策略", + Desc = "跟踪雪球, 快速下单" + }); + + sr.Add(new EStrategy + { + Type = "", + Name = "分级B强势轮动策略", + Desc = "发现强势分级基金,快速下单" + }); + + Sender.Tell(sr); + + _log.Info("获取到所有的策略列表"); + } + + private void _createStrategyActor(EStrategy sd) + { + if (!strategyActors.ContainsKey(sd.Id)) + { + // String[] ary = sd.Type.Split(new string[] { "," }, StringSplitOptions.None); + Type t = Type.GetType(sd.Type); + var strategyActor = Context.ActorOf(Props.Create(t, sd), sd.Id.ToString()); + strategyActors.Add(sd.Id, strategyActor); + }else + { + _log.Warning("重复注册策略,策略号 {0}", sd.Id); + } + } + + //private void _registerStarategy(IStrategy strategy) + //{ + // if(strategyActors.Keys.Contains(strategy.Id)) + // { + // Sender.Tell(new ErrorResponse() { }); // Warning: the strategy is existed + // return; + // } + // IActorRef strategyActor = null; + + // strategyActors.Add(strategy.Id, strategyActor); + //} + + //private void _unregisterStrategy(IStrategy strategy) + //{ + // if (!strategyActors.Keys.Contains(strategy.Id)) + // { + // Sender.Tell(new ErrorResponse() { }); // Warning: the strategy is not existed + // return; + // } + // else + // { + // strategyActors.Remove(strategy.Id); + // } + // strategyActors.Remove(strategy.Id); + //} + + } +} diff --git a/Quanter.Trader.StrategyServer/TradeMode.cs b/Quanter.Trader.StrategyServer/TradeMode.cs new file mode 100644 index 0000000..3ec51b1 --- /dev/null +++ b/Quanter.Trader.StrategyServer/TradeMode.cs @@ -0,0 +1,12 @@ +namespace Quanter.Strategy +{ + /// + /// 支持三种交易方式, 其中回测必须的数据源必须是历史数据,下单为虚拟下单 + /// + public enum TradeMode + { + BACK_TEST, // 回测 + MOCK_TRADE, // 模拟交易 + AUTO_TRADE, // 实盘自动交易 + } +} \ No newline at end of file diff --git a/Quanter.Trader.StrategyServer/app.config b/Quanter.Trader.StrategyServer/app.config new file mode 100644 index 0000000..e77f128 --- /dev/null +++ b/Quanter.Trader.StrategyServer/app.config @@ -0,0 +1,27 @@ + + + + +
+ + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Quanter.Trader.StrategyServer/licenses/license.txt b/Quanter.Trader.StrategyServer/licenses/license.txt new file mode 100644 index 0000000..b8e773b --- /dev/null +++ b/Quanter.Trader.StrategyServer/licenses/license.txt @@ -0,0 +1,31 @@ +Protocol Buffers - Google's data interchange format +Copyright 2008-2010 Google Inc. All rights reserved. +http://github.com/jskeet/dotnet-protobufs/ +Original C++/Java/Python code: +http://code.google.com/p/protobuf/ + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + + * Redistributions of source code must retain the above copyright +notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above +copyright notice, this list of conditions and the following disclaimer +in the documentation and/or other materials provided with the +distribution. + * Neither the name of Google Inc. nor the names of its +contributors may be used to endorse or promote products derived from +this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/Quanter.Trader.StrategyServer/licenses/protoc-license.txt b/Quanter.Trader.StrategyServer/licenses/protoc-license.txt new file mode 100644 index 0000000..c779cb0 --- /dev/null +++ b/Quanter.Trader.StrategyServer/licenses/protoc-license.txt @@ -0,0 +1,36 @@ +protoc.exe was built from the original source at http://code.google.com/p/protobuf/ +The licence for this code is as follows: + +Copyright 2008, Google Inc. +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + + * Redistributions of source code must retain the above copyright +notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above +copyright notice, this list of conditions and the following disclaimer +in the documentation and/or other materials provided with the +distribution. + * Neither the name of Google Inc. nor the names of its +contributors may be used to endorse or promote products derived from +this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +Code generated by the Protocol Buffer compiler is owned by the owner +of the input file used when generating it. This code is not +standalone and requires a support library to be linked with it. This +support library is itself covered by the above license. \ No newline at end of file diff --git a/Quanter.Trader.StrategyServer/packages.config b/Quanter.Trader.StrategyServer/packages.config new file mode 100644 index 0000000..a8a4b43 --- /dev/null +++ b/Quanter.Trader.StrategyServer/packages.config @@ -0,0 +1,17 @@ + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Quanter.Trader.StrategyServer/protos/google/protobuf/csharp_options.proto b/Quanter.Trader.StrategyServer/protos/google/protobuf/csharp_options.proto new file mode 100644 index 0000000..152df76 --- /dev/null +++ b/Quanter.Trader.StrategyServer/protos/google/protobuf/csharp_options.proto @@ -0,0 +1,115 @@ +// Extra options for C# generator + +import "google/protobuf/descriptor.proto"; + +package google.protobuf; + +message CSharpFileOptions { + + // Namespace for generated classes; defaults to the package. + optional string namespace = 1; + + // Name of the "umbrella" class used for metadata about all + // the messages within this file. Default is based on the name + // of the file. + optional string umbrella_classname = 2; + + // Whether classes should be public (true) or internal (false) + optional bool public_classes = 3 [default = true]; + + // Whether to generate a single file for everything within the + // .proto file (false), or one file per message (true). + // This option is not currently honored; please log a feature + // request if you really want it. + optional bool multiple_files = 4; + + // Whether to nest messages within a single umbrella class (true) + // or create the umbrella class as a peer, with messages as + // top-level classes in the namespace (false) + optional bool nest_classes = 5; + + // Generate appropriate support for Code Contracts + // (Ongoing; support should improve over time) + optional bool code_contracts = 6; + + // Create subdirectories for namespaces, e.g. namespace "Foo.Bar" + // would generate files within [output directory]/Foo/Bar + optional bool expand_namespace_directories = 7; + + // Generate attributes indicating non-CLS-compliance + optional bool cls_compliance = 8 [default = true]; + + // Generate messages/builders with the [Serializable] attribute + optional bool add_serializable = 9 [default = false]; + + // Generates a private ctor for Message types + optional bool generate_private_ctor = 10 [default = true]; + + // The extension that should be appended to the umbrella_classname when creating files. + optional string file_extension = 221 [default = ".cs"]; + + // A nested namespace for the umbrella class. Helpful for name collisions caused by + // umbrella_classname conflicting with an existing type. This will be automatically + // set to 'Proto' if a collision is detected with types being generated. This value + // is ignored when nest_classes == true + optional string umbrella_namespace = 222; + + // The output path for the source file(s) generated + optional string output_directory = 223 [default = "."]; + + // Will ignore the type generations and remove dependencies for the descriptor proto + // files that declare their package to be "google.protobuf" + optional bool ignore_google_protobuf = 224 [default = false]; + + // Controls how services are generated, GENERIC is the deprecated original implementation + // INTERFACE generates service interfaces only, RPCINTEROP generates interfaces and + // implementations using the included Windows RPC interop libarary. + optional CSharpServiceType service_generator_type = 225 [default = NONE]; + + // Used to add the System.Runtime.CompilerServices.CompilerGeneratedAttribute and + // System.CodeDom.Compiler.GeneratedCodeAttribute attributes to generated code. + optional bool generated_code_attributes = 226 [default = false]; +} + +enum CSharpServiceType { + // Services are ignored by the generator + NONE = 0; + // Generates the original Java generic service implementations + GENERIC = 1; + // Generates an interface for the service and nothing else + INTERFACE = 2; + // Generates an interface for the service and client/server wrappers for the interface + IRPCDISPATCH = 3; +} + +extend FileOptions { + optional CSharpFileOptions csharp_file_options = 1000; +} + +extend FieldOptions { + optional CSharpFieldOptions csharp_field_options = 1000; +} + +message CSharpFieldOptions { + // Provides the ability to override the name of the property + // generated for this field. This is applied to all properties + // and methods to do with this field, including HasFoo, FooCount, + // FooList etc. + optional string property_name = 1; +} + +message CSharpServiceOptions { + optional string interface_id = 1; +} + +extend ServiceOptions { + optional CSharpServiceOptions csharp_service_options = 1000; +} + +message CSharpMethodOptions { + optional int32 dispatch_id = 1; +} + +extend MethodOptions { + optional CSharpMethodOptions csharp_method_options = 1000; +} \ No newline at end of file diff --git a/Quanter.Trader.StrategyServer/protos/google/protobuf/descriptor.proto b/Quanter.Trader.StrategyServer/protos/google/protobuf/descriptor.proto new file mode 100644 index 0000000..233f879 --- /dev/null +++ b/Quanter.Trader.StrategyServer/protos/google/protobuf/descriptor.proto @@ -0,0 +1,533 @@ +// Protocol Buffers - Google's data interchange format +// Copyright 2008 Google Inc. All rights reserved. +// http://code.google.com/p/protobuf/ +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// Author: kenton@google.com (Kenton Varda) +// Based on original Protocol Buffers design by +// Sanjay Ghemawat, Jeff Dean, and others. +// +// The messages in this file describe the definitions found in .proto files. +// A valid .proto file can be translated directly to a FileDescriptorProto +// without any other information (e.g. without reading its imports). + + + +package google.protobuf; +option java_package = "com.google.protobuf"; +option java_outer_classname = "DescriptorProtos"; + +// descriptor.proto must be optimized for speed because reflection-based +// algorithms don't work during bootstrapping. +option optimize_for = SPEED; + +// The protocol compiler can output a FileDescriptorSet containing the .proto +// files it parses. +message FileDescriptorSet { + repeated FileDescriptorProto file = 1; +} + +// Describes a complete .proto file. +message FileDescriptorProto { + optional string name = 1; // file name, relative to root of source tree + optional string package = 2; // e.g. "foo", "foo.bar", etc. + + // Names of files imported by this file. + repeated string dependency = 3; + + // All top-level definitions in this file. + repeated DescriptorProto message_type = 4; + repeated EnumDescriptorProto enum_type = 5; + repeated ServiceDescriptorProto service = 6; + repeated FieldDescriptorProto extension = 7; + + optional FileOptions options = 8; + + // This field contains optional information about the original source code. + // You may safely remove this entire field whithout harming runtime + // functionality of the descriptors -- the information is needed only by + // development tools. + optional SourceCodeInfo source_code_info = 9; +} + +// Describes a message type. +message DescriptorProto { + optional string name = 1; + + repeated FieldDescriptorProto field = 2; + repeated FieldDescriptorProto extension = 6; + + repeated DescriptorProto nested_type = 3; + repeated EnumDescriptorProto enum_type = 4; + + message ExtensionRange { + optional int32 start = 1; + optional int32 end = 2; + } + repeated ExtensionRange extension_range = 5; + + optional MessageOptions options = 7; +} + +// Describes a field within a message. +message FieldDescriptorProto { + enum Type { + // 0 is reserved for errors. + // Order is weird for historical reasons. + TYPE_DOUBLE = 1; + TYPE_FLOAT = 2; + TYPE_INT64 = 3; // Not ZigZag encoded. Negative numbers + // take 10 bytes. Use TYPE_SINT64 if negative + // values are likely. + TYPE_UINT64 = 4; + TYPE_INT32 = 5; // Not ZigZag encoded. Negative numbers + // take 10 bytes. Use TYPE_SINT32 if negative + // values are likely. + TYPE_FIXED64 = 6; + TYPE_FIXED32 = 7; + TYPE_BOOL = 8; + TYPE_STRING = 9; + TYPE_GROUP = 10; // Tag-delimited aggregate. + TYPE_MESSAGE = 11; // Length-delimited aggregate. + + // New in version 2. + TYPE_BYTES = 12; + TYPE_UINT32 = 13; + TYPE_ENUM = 14; + TYPE_SFIXED32 = 15; + TYPE_SFIXED64 = 16; + TYPE_SINT32 = 17; // Uses ZigZag encoding. + TYPE_SINT64 = 18; // Uses ZigZag encoding. + }; + + enum Label { + // 0 is reserved for errors + LABEL_OPTIONAL = 1; + LABEL_REQUIRED = 2; + LABEL_REPEATED = 3; + // TODO(sanjay): Should we add LABEL_MAP? + }; + + optional string name = 1; + optional int32 number = 3; + optional Label label = 4; + + // If type_name is set, this need not be set. If both this and type_name + // are set, this must be either TYPE_ENUM or TYPE_MESSAGE. + optional Type type = 5; + + // For message and enum types, this is the name of the type. If the name + // starts with a '.', it is fully-qualified. Otherwise, C++-like scoping + // rules are used to find the type (i.e. first the nested types within this + // message are searched, then within the parent, on up to the root + // namespace). + optional string type_name = 6; + + // For extensions, this is the name of the type being extended. It is + // resolved in the same manner as type_name. + optional string extendee = 2; + + // For numeric types, contains the original text representation of the value. + // For booleans, "true" or "false". + // For strings, contains the default text contents (not escaped in any way). + // For bytes, contains the C escaped value. All bytes >= 128 are escaped. + // TODO(kenton): Base-64 encode? + optional string default_value = 7; + + optional FieldOptions options = 8; +} + +// Describes an enum type. +message EnumDescriptorProto { + optional string name = 1; + + repeated EnumValueDescriptorProto value = 2; + + optional EnumOptions options = 3; +} + +// Describes a value within an enum. +message EnumValueDescriptorProto { + optional string name = 1; + optional int32 number = 2; + + optional EnumValueOptions options = 3; +} + +// Describes a service. +message ServiceDescriptorProto { + optional string name = 1; + repeated MethodDescriptorProto method = 2; + + optional ServiceOptions options = 3; +} + +// Describes a method of a service. +message MethodDescriptorProto { + optional string name = 1; + + // Input and output type names. These are resolved in the same way as + // FieldDescriptorProto.type_name, but must refer to a message type. + optional string input_type = 2; + optional string output_type = 3; + + optional MethodOptions options = 4; +} + +// =================================================================== +// Options + +// Each of the definitions above may have "options" attached. These are +// just annotations which may cause code to be generated slightly differently +// or may contain hints for code that manipulates protocol messages. +// +// Clients may define custom options as extensions of the *Options messages. +// These extensions may not yet be known at parsing time, so the parser cannot +// store the values in them. Instead it stores them in a field in the *Options +// message called uninterpreted_option. This field must have the same name +// across all *Options messages. We then use this field to populate the +// extensions when we build a descriptor, at which point all protos have been +// parsed and so all extensions are known. +// +// Extension numbers for custom options may be chosen as follows: +// * For options which will only be used within a single application or +// organization, or for experimental options, use field numbers 50000 +// through 99999. It is up to you to ensure that you do not use the +// same number for multiple options. +// * For options which will be published and used publicly by multiple +// independent entities, e-mail kenton@google.com to reserve extension +// numbers. Simply tell me how many you need and I'll send you back a +// set of numbers to use -- there's no need to explain how you intend to +// use them. If this turns out to be popular, a web service will be set up +// to automatically assign option numbers. + + +message FileOptions { + + // Sets the Java package where classes generated from this .proto will be + // placed. By default, the proto package is used, but this is often + // inappropriate because proto packages do not normally start with backwards + // domain names. + optional string java_package = 1; + + + // If set, all the classes from the .proto file are wrapped in a single + // outer class with the given name. This applies to both Proto1 + // (equivalent to the old "--one_java_file" option) and Proto2 (where + // a .proto always translates to a single class, but you may want to + // explicitly choose the class name). + optional string java_outer_classname = 8; + + // If set true, then the Java code generator will generate a separate .java + // file for each top-level message, enum, and service defined in the .proto + // file. Thus, these types will *not* be nested inside the outer class + // named by java_outer_classname. However, the outer class will still be + // generated to contain the file's getDescriptor() method as well as any + // top-level extensions defined in the file. + optional bool java_multiple_files = 10 [default=false]; + + // If set true, then the Java code generator will generate equals() and + // hashCode() methods for all messages defined in the .proto file. This is + // purely a speed optimization, as the AbstractMessage base class includes + // reflection-based implementations of these methods. + optional bool java_generate_equals_and_hash = 20 [default=false]; + + // Generated classes can be optimized for speed or code size. + enum OptimizeMode { + SPEED = 1; // Generate complete code for parsing, serialization, + // etc. + CODE_SIZE = 2; // Use ReflectionOps to implement these methods. + LITE_RUNTIME = 3; // Generate code using MessageLite and the lite runtime. + } + optional OptimizeMode optimize_for = 9 [default=SPEED]; + + + + + // Should generic services be generated in each language? "Generic" services + // are not specific to any particular RPC system. They are generated by the + // main code generators in each language (without additional plugins). + // Generic services were the only kind of service generation supported by + // early versions of proto2. + // + // Generic services are now considered deprecated in favor of using plugins + // that generate code specific to your particular RPC system. Therefore, + // these default to false. Old code which depends on generic services should + // explicitly set them to true. + optional bool cc_generic_services = 16 [default=false]; + optional bool java_generic_services = 17 [default=false]; + optional bool py_generic_services = 18 [default=false]; + + // The parser stores options it doesn't recognize here. See above. + repeated UninterpretedOption uninterpreted_option = 999; + + // Clients can define custom options in extensions of this message. See above. + extensions 1000 to max; +} + +message MessageOptions { + // Set true to use the old proto1 MessageSet wire format for extensions. + // This is provided for backwards-compatibility with the MessageSet wire + // format. You should not use this for any other reason: It's less + // efficient, has fewer features, and is more complicated. + // + // The message must be defined exactly as follows: + // message Foo { + // option message_set_wire_format = true; + // extensions 4 to max; + // } + // Note that the message cannot have any defined fields; MessageSets only + // have extensions. + // + // All extensions of your type must be singular messages; e.g. they cannot + // be int32s, enums, or repeated messages. + // + // Because this is an option, the above two restrictions are not enforced by + // the protocol compiler. + optional bool message_set_wire_format = 1 [default=false]; + + // Disables the generation of the standard "descriptor()" accessor, which can + // conflict with a field of the same name. This is meant to make migration + // from proto1 easier; new code should avoid fields named "descriptor". + optional bool no_standard_descriptor_accessor = 2 [default=false]; + + // The parser stores options it doesn't recognize here. See above. + repeated UninterpretedOption uninterpreted_option = 999; + + // Clients can define custom options in extensions of this message. See above. + extensions 1000 to max; +} + +message FieldOptions { + // The ctype option instructs the C++ code generator to use a different + // representation of the field than it normally would. See the specific + // options below. This option is not yet implemented in the open source + // release -- sorry, we'll try to include it in a future version! + optional CType ctype = 1 [default = STRING]; + enum CType { + // Default mode. + STRING = 0; + + CORD = 1; + + STRING_PIECE = 2; + } + // The packed option can be enabled for repeated primitive fields to enable + // a more efficient representation on the wire. Rather than repeatedly + // writing the tag and type for each element, the entire array is encoded as + // a single length-delimited blob. + optional bool packed = 2; + + + // Is this field deprecated? + // Depending on the target platform, this can emit Deprecated annotations + // for accessors, or it will be completely ignored; in the very least, this + // is a formalization for deprecating fields. + optional bool deprecated = 3 [default=false]; + + // EXPERIMENTAL. DO NOT USE. + // For "map" fields, the name of the field in the enclosed type that + // is the key for this map. For example, suppose we have: + // message Item { + // required string name = 1; + // required string value = 2; + // } + // message Config { + // repeated Item items = 1 [experimental_map_key="name"]; + // } + // In this situation, the map key for Item will be set to "name". + // TODO: Fully-implement this, then remove the "experimental_" prefix. + optional string experimental_map_key = 9; + + // The parser stores options it doesn't recognize here. See above. + repeated UninterpretedOption uninterpreted_option = 999; + + // Clients can define custom options in extensions of this message. See above. + extensions 1000 to max; +} + +message EnumOptions { + + // The parser stores options it doesn't recognize here. See above. + repeated UninterpretedOption uninterpreted_option = 999; + + // Clients can define custom options in extensions of this message. See above. + extensions 1000 to max; +} + +message EnumValueOptions { + // The parser stores options it doesn't recognize here. See above. + repeated UninterpretedOption uninterpreted_option = 999; + + // Clients can define custom options in extensions of this message. See above. + extensions 1000 to max; +} + +message ServiceOptions { + + // Note: Field numbers 1 through 32 are reserved for Google's internal RPC + // framework. We apologize for hoarding these numbers to ourselves, but + // we were already using them long before we decided to release Protocol + // Buffers. + + // The parser stores options it doesn't recognize here. See above. + repeated UninterpretedOption uninterpreted_option = 999; + + // Clients can define custom options in extensions of this message. See above. + extensions 1000 to max; +} + +message MethodOptions { + + // Note: Field numbers 1 through 32 are reserved for Google's internal RPC + // framework. We apologize for hoarding these numbers to ourselves, but + // we were already using them long before we decided to release Protocol + // Buffers. + + // The parser stores options it doesn't recognize here. See above. + repeated UninterpretedOption uninterpreted_option = 999; + + // Clients can define custom options in extensions of this message. See above. + extensions 1000 to max; +} + +// A message representing a option the parser does not recognize. This only +// appears in options protos created by the compiler::Parser class. +// DescriptorPool resolves these when building Descriptor objects. Therefore, +// options protos in descriptor objects (e.g. returned by Descriptor::options(), +// or produced by Descriptor::CopyTo()) will never have UninterpretedOptions +// in them. +message UninterpretedOption { + // The name of the uninterpreted option. Each string represents a segment in + // a dot-separated name. is_extension is true iff a segment represents an + // extension (denoted with parentheses in options specs in .proto files). + // E.g.,{ ["foo", false], ["bar.baz", true], ["qux", false] } represents + // "foo.(bar.baz).qux". + message NamePart { + required string name_part = 1; + required bool is_extension = 2; + } + repeated NamePart name = 2; + + // The value of the uninterpreted option, in whatever type the tokenizer + // identified it as during parsing. Exactly one of these should be set. + optional string identifier_value = 3; + optional uint64 positive_int_value = 4; + optional int64 negative_int_value = 5; + optional double double_value = 6; + optional bytes string_value = 7; + optional string aggregate_value = 8; +} + +// =================================================================== +// Optional source code info + +// Encapsulates information about the original source file from which a +// FileDescriptorProto was generated. +message SourceCodeInfo { + // A Location identifies a piece of source code in a .proto file which + // corresponds to a particular definition. This information is intended + // to be useful to IDEs, code indexers, documentation generators, and similar + // tools. + // + // For example, say we have a file like: + // message Foo { + // optional string foo = 1; + // } + // Let's look at just the field definition: + // optional string foo = 1; + // ^ ^^ ^^ ^ ^^^ + // a bc de f ghi + // We have the following locations: + // span path represents + // [a,i) [ 4, 0, 2, 0 ] The whole field definition. + // [a,b) [ 4, 0, 2, 0, 4 ] The label (optional). + // [c,d) [ 4, 0, 2, 0, 5 ] The type (string). + // [e,f) [ 4, 0, 2, 0, 1 ] The name (foo). + // [g,h) [ 4, 0, 2, 0, 3 ] The number (1). + // + // Notes: + // - A location may refer to a repeated field itself (i.e. not to any + // particular index within it). This is used whenever a set of elements are + // logically enclosed in a single code segment. For example, an entire + // extend block (possibly containing multiple extension definitions) will + // have an outer location whose path refers to the "extensions" repeated + // field without an index. + // - Multiple locations may have the same path. This happens when a single + // logical declaration is spread out across multiple places. The most + // obvious example is the "extend" block again -- there may be multiple + // extend blocks in the same scope, each of which will have the same path. + // - A location's span is not always a subset of its parent's span. For + // example, the "extendee" of an extension declaration appears at the + // beginning of the "extend" block and is shared by all extensions within + // the block. + // - Just because a location's span is a subset of some other location's span + // does not mean that it is a descendent. For example, a "group" defines + // both a type and a field in a single declaration. Thus, the locations + // corresponding to the type and field and their components will overlap. + // - Code which tries to interpret locations should probably be designed to + // ignore those that it doesn't understand, as more types of locations could + // be recorded in the future. + repeated Location location = 1; + message Location { + // Identifies which part of the FileDescriptorProto was defined at this + // location. + // + // Each element is a field number or an index. They form a path from + // the root FileDescriptorProto to the place where the definition. For + // example, this path: + // [ 4, 3, 2, 7, 1 ] + // refers to: + // file.message_type(3) // 4, 3 + // .field(7) // 2, 7 + // .name() // 1 + // This is because FileDescriptorProto.message_type has field number 4: + // repeated DescriptorProto message_type = 4; + // and DescriptorProto.field has field number 2: + // repeated FieldDescriptorProto field = 2; + // and FieldDescriptorProto.name has field number 1: + // optional string name = 1; + // + // Thus, the above path gives the location of a field name. If we removed + // the last element: + // [ 4, 3, 2, 7 ] + // this path refers to the whole field declaration (from the beginning + // of the label to the terminating semicolon). + repeated int32 path = 1 [packed=true]; + + // Always has exactly three or four elements: start line, start column, + // end line (optional, otherwise assumed same as start line), end column. + // These are packed into a single field for efficiency. Note that line + // and column numbers are zero-based -- typically you will want to add + // 1 to each before displaying to a user. + repeated int32 span = 2 [packed=true]; + + // TODO(kenton): Record comments appearing before and after the + // declaration. + } +} diff --git a/Quanter.Trader.StrategyServer/protos/tutorial/addressbook.proto b/Quanter.Trader.StrategyServer/protos/tutorial/addressbook.proto new file mode 100644 index 0000000..5abe35c --- /dev/null +++ b/Quanter.Trader.StrategyServer/protos/tutorial/addressbook.proto @@ -0,0 +1,31 @@ +package tutorial; + +import "google/protobuf/csharp_options.proto"; +option (google.protobuf.csharp_file_options).namespace = "Google.ProtocolBuffers.Examples.AddressBook"; +option (google.protobuf.csharp_file_options).umbrella_classname = "AddressBookProtos"; + +option optimize_for = SPEED; + +message Person { + required string name = 1; + required int32 id = 2; // Unique ID number for this person. + optional string email = 3; + + enum PhoneType { + MOBILE = 0; + HOME = 1; + WORK = 2; + } + + message PhoneNumber { + required string number = 1; + optional PhoneType type = 2 [default = HOME]; + } + + repeated PhoneNumber phone = 4; +} + +// Our address book file is just one of these. +message AddressBook { + repeated Person person = 1; +} diff --git a/Tests.Quanter.Persistence/PersistenceActorSpec.cs b/Tests.Quanter.Persistence/PersistenceActorSpec.cs new file mode 100644 index 0000000..1995615 --- /dev/null +++ b/Tests.Quanter.Persistence/PersistenceActorSpec.cs @@ -0,0 +1,28 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using Akka.TestKit; +using Akka.TestKit.Xunit2; +using Xunit; +using Quanter.Persistence; +using Quanter.Trader.Messages; +using Quanter.BusinessEntity; + +namespace Tests.Quanter.Persistence +{ + public class PersistenceActorSpec : TestKit + { + [Fact] + public void save_update_load_find_delete_strategy() + { + TestActorRef persistenceActorRef = ActorOfAsTestActorRef("persistence"); + EStrategy strategy = new EStrategy() { Type = "Quanter.Strategy.Demo.DemoStrategyActor, Quanter.Strategy.Demo", Desc="测试策略", Name = "策略DEMO", Date=DateTime.Now }; + PersistenceRequest req = new PersistenceRequest() { Type = PersistenceType.SAVE, Body = strategy}; + persistenceActorRef.Tell(req); + + } + + } +} diff --git a/Tests.Quanter.Persistence/Properties/AssemblyInfo.cs b/Tests.Quanter.Persistence/Properties/AssemblyInfo.cs new file mode 100644 index 0000000..951dfd2 --- /dev/null +++ b/Tests.Quanter.Persistence/Properties/AssemblyInfo.cs @@ -0,0 +1,36 @@ +using System.Reflection; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; + +// 有关程序集的一般信息由以下 +// 控制。更改这些特性值可修改 +// 与程序集关联的信息。 +[assembly: AssemblyTitle("Tests.Stock.Persistence")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("")] +[assembly: AssemblyProduct("Tests.Stock.Persistence")] +[assembly: AssemblyCopyright("Copyright © 2015")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +//将 ComVisible 设置为 false 将使此程序集中的类型 +//对 COM 组件不可见。 如果需要从 COM 访问此程序集中的类型, +//请将此类型的 ComVisible 特性设置为 true。 +[assembly: ComVisible(false)] + +// 如果此项目向 COM 公开,则下列 GUID 用于类型库的 ID +[assembly: Guid("86c3100a-2b80-4232-972b-4aa2ac97fd81")] + +// 程序集的版本信息由下列四个值组成: +// +// 主版本 +// 次版本 +// 生成号 +// 修订号 +// +//可以指定所有这些值,也可以使用“生成号”和“修订号”的默认值, +// 方法是按如下所示使用“*”: : +// [assembly: AssemblyVersion("1.0.*")] +[assembly: AssemblyVersion("1.0.0.0")] +[assembly: AssemblyFileVersion("1.0.0.0")] diff --git a/Tests.Quanter.Persistence/Tests.Quanter.Persistence.csproj b/Tests.Quanter.Persistence/Tests.Quanter.Persistence.csproj new file mode 100644 index 0000000..553f876 --- /dev/null +++ b/Tests.Quanter.Persistence/Tests.Quanter.Persistence.csproj @@ -0,0 +1,113 @@ + + + + + + + Debug + AnyCPU + {86C3100A-2B80-4232-972B-4AA2AC97FD81} + Library + Properties + Tests.Quanter.Persistence + Tests.Quanter.Persistence + v4.5.2 + 512 + + + + + true + full + false + bin\Debug\ + DEBUG;TRACE + prompt + 4 + + + pdbonly + true + bin\Release\ + TRACE + prompt + 4 + + + + ..\packages\Akka.1.0.5\lib\net45\Akka.dll + True + + + ..\packages\Akka.TestKit.1.0.5\lib\net45\Akka.TestKit.dll + True + + + ..\packages\Akka.TestKit.Xunit2.1.0.5\lib\net45\Akka.TestKit.Xunit2.dll + True + + + ..\packages\Newtonsoft.Json.7.0.1\lib\net45\Newtonsoft.Json.dll + True + + + + + + + + + + + ..\packages\xunit.abstractions.2.0.0\lib\net35\xunit.abstractions.dll + True + + + ..\packages\xunit.assert.2.0.0\lib\portable-net45+win+wpa81+wp80+monotouch+monoandroid+Xamarin.iOS\xunit.assert.dll + True + + + ..\packages\xunit.extensibility.core.2.0.0\lib\portable-net45+win+wpa81+wp80+monotouch+monoandroid+Xamarin.iOS\xunit.core.dll + True + + + + + + + + + + + + {34db14a6-e4ed-4c4a-8ca6-939201a572be} + Quanter.BusinessEntity + + + {351aaa08-f483-403c-b4a4-a5725381c5e4} + Quanter.Persistence.Server + + + {dde08214-ec3a-4dd7-8cee-49973e17ae8f} + Quanter.Trader.Messages + + + + + + + + + 此项目引用这台计算机上缺少的 NuGet 程序包。使用 NuGet 程序包还原可下载这些程序包。有关详细信息,请参阅 http://go.microsoft.com/fwlink/?LinkID=322105。缺少的文件是 {0}。 + + + + + + \ No newline at end of file diff --git a/Tests.Quanter.Persistence/packages.config b/Tests.Quanter.Persistence/packages.config new file mode 100644 index 0000000..5ec505c --- /dev/null +++ b/Tests.Quanter.Persistence/packages.config @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file