diff --git a/.gitignore b/.gitignore
index 78b49ee..baf3ab0 100644
--- a/.gitignore
+++ b/.gitignore
@@ -70,6 +70,7 @@ ipch/
*.opensdf
*.sdf
*.cachefile
+*.opendb
# Visual Studio profiler
*.psess
@@ -126,7 +127,7 @@ publish/
# Publish Web Output
*.[Pp]ublish.xml
*.azurePubxml
-# TODO: Comment the next line if you want to checkin your web deploy settings
+# TODO: Comment the next line if you want to checkin your web deploy settings
# but database connection strings (with potential passwords) will be unencrypted
*.pubxml
*.publishproj
@@ -229,3 +230,13 @@ $RECYCLE.BIN/
# Windows shortcuts
*.lnk
+
+# Linux objects
+*.so
+*.o
+
+# Misc files
+*.userprefs
+
+# VSCode files
+.vscode
diff --git a/AllCppProjects.sln b/AllCppProjects.sln
new file mode 100644
index 0000000..1014488
--- /dev/null
+++ b/AllCppProjects.sln
@@ -0,0 +1,414 @@
+
+Microsoft Visual Studio Solution File, Format Version 12.00
+# Visual Studio 14
+VisualStudioVersion = 14.0.25420.1
+MinimumVisualStudioVersion = 10.0.40219.1
+Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "apis", "apis", "{78740AE4-CA39-4892-B262-7FC77BF31E3A}"
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "CTP_Quote", "apis\CTP_Quote\CTP_Quote.vcxproj", "{919B914D-6840-453E-9201-8619E63AD0E1}"
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "CTP_Trade", "apis\CTP_Trade\CTP_Trade.vcxproj", "{9FBB0318-E21C-4B7C-A258-98E6A3860B35}"
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "Kingstar_Quote", "apis\Kingstar_Quote\Kingstar_Quote.vcxproj", "{199071F1-5059-4883-BA49-6A9922A71ADD}"
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "Kingstar_Trade", "apis\Kingstar_Trade\Kingstar_Trade.vcxproj", "{70015722-8252-4944-AE20-16A88B583CEE}"
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "LTS_Query_v2", "apis\LTS_Query_v2\LTS_Query_v2.vcxproj", "{51D11C21-C4A7-4F07-9658-B8BA223684B8}"
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "LTS_Quote_v2", "apis\LTS_Quote_v2\LTS_Quote_v2.vcxproj", "{D4387736-0623-4442-A4AC-AF79239F9419}"
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "LTS_Trade_v2", "apis\LTS_Trade_v2\LTS_Trade_v2.vcxproj", "{683AECBB-89EB-4692-99C5-A527853326D4}"
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "Tdx_Trade", "apis\Tdx_Trade\Tdx_Trade.vcxproj", "{01D3F1DE-99B3-4D41-97C3-F4680CDB980B}"
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "TongShi_Quote", "apis\TongShi_Quote\TongShi_Quote.vcxproj", "{372C0D5E-ED93-4335-849C-65494AE8A17D}"
+EndProject
+Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "common", "common", "{463A606E-275B-4F7B-B46D-B5E0E0C9FBFF}"
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "License", "common\License\License.vcxproj", "{D3231052-575C-4D58-BA38-2C01B10BF205}"
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "Queue", "common\Queue\Queue.vcxproj", "{3A9173AA-92DB-49F9-88E3-09419C1D8E9F}"
+EndProject
+Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "tests", "tests", "{8B1A6E55-6AB5-4875-8EC0-97E86BF42714}"
+EndProject
+Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "tools", "tools", "{EA89FD2A-C740-4401-84E8-3BFEB57B1D5A}"
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "FakeAPI", "tools\FakeAPI\FakeAPI.vcxproj", "{358586C9-A4B8-43E4-8376-59C68F0F6211}"
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "CPP_TEST", "tests\CPP\CPP_TEST.vcxproj", "{C77ADBF7-E610-4E57-BE4D-C122FC5BE611}"
+EndProject
+Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "languages", "languages", "{DFA0F44C-82C0-4772-B71F-51D3DDE00F16}"
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "XAPI_CPP", "languages\CPP\XAPI_CPP\XAPI_CPP.vcxproj", "{39599EFE-428F-408F-BF4F-BF462E37C5E8}"
+EndProject
+Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "CPP", "CPP", "{E883D8BF-3E2E-4899-B490-7346465B2555}"
+EndProject
+Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "CPP", "CPP", "{A67F001E-0B1B-4BE2-90BB-243F8648B5EF}"
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "UFX_Trade", "apis\UFX_Trade\UFX_Trade.vcxproj", "{26C43947-9E7A-4B55-8A6D-A0F5222612AA}"
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "Wind_Quote", "apis\Wind_Quote\Wind_Quote.vcxproj", "{7B30B57A-6E59-482E-A8A8-5E2D978EA991}"
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "Sgit_Quote", "apis\Sgit_Quote\Sgit_Quote.vcxproj", "{62BD7F43-395B-4A1E-84AC-64135ECF371D}"
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "Sgit_Trade", "apis\Sgit_Trade\Sgit_Trade.vcxproj", "{B8C6E4A3-3345-4C46-91B2-198EB9D292DB}"
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "CTP_SOPT_Trade", "apis\CTP_SOPT_Trade\CTP_SOPT_Trade.vcxproj", "{ADCD2BDB-C723-4E9A-BFA4-2FC7EA10DC9A}"
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "ATP_Quote", "apis\ATP_Quote\ATP_Quote.vcxproj", "{3F2DB224-C53A-4983-B77D-0629D3ABDD80}"
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "ATP_Trade", "apis\ATP_Trade\ATP_Trade.vcxproj", "{6D0E7A00-CCBE-4103-80A7-42A980BF43E0}"
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "CTPZQ_Quote", "apis\CTPZQ_Quote\CTPZQ_Quote.vcxproj", "{891F3DF0-72F6-404A-AF4A-85F1A640AB82}"
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "CTPZQ_Trade", "apis\CTPZQ_Trade\CTPZQ_Trade.vcxproj", "{5307B252-E992-4907-9C15-4BC5BD746F4C}"
+EndProject
+Global
+ GlobalSection(SolutionConfigurationPlatforms) = preSolution
+ Debug|Win32 = Debug|Win32
+ Debug|x64 = Debug|x64
+ Debug64|Win32 = Debug64|Win32
+ Debug64|x64 = Debug64|x64
+ Release|Win32 = Release|Win32
+ Release|x64 = Release|x64
+ Release64|Win32 = Release64|Win32
+ Release64|x64 = Release64|x64
+ EndGlobalSection
+ GlobalSection(ProjectConfigurationPlatforms) = postSolution
+ {919B914D-6840-453E-9201-8619E63AD0E1}.Debug|Win32.ActiveCfg = Debug|Win32
+ {919B914D-6840-453E-9201-8619E63AD0E1}.Debug|Win32.Build.0 = Debug|Win32
+ {919B914D-6840-453E-9201-8619E63AD0E1}.Debug|x64.ActiveCfg = Debug|Win32
+ {919B914D-6840-453E-9201-8619E63AD0E1}.Debug64|Win32.ActiveCfg = Debug64|x64
+ {919B914D-6840-453E-9201-8619E63AD0E1}.Debug64|x64.ActiveCfg = Debug64|x64
+ {919B914D-6840-453E-9201-8619E63AD0E1}.Release|Win32.ActiveCfg = Release|Win32
+ {919B914D-6840-453E-9201-8619E63AD0E1}.Release|Win32.Build.0 = Release|Win32
+ {919B914D-6840-453E-9201-8619E63AD0E1}.Release|x64.ActiveCfg = Release|Win32
+ {919B914D-6840-453E-9201-8619E63AD0E1}.Release64|Win32.ActiveCfg = Release64|x64
+ {919B914D-6840-453E-9201-8619E63AD0E1}.Release64|x64.ActiveCfg = Release64|x64
+ {919B914D-6840-453E-9201-8619E63AD0E1}.Release64|x64.Build.0 = Release64|x64
+ {9FBB0318-E21C-4B7C-A258-98E6A3860B35}.Debug|Win32.ActiveCfg = Debug|Win32
+ {9FBB0318-E21C-4B7C-A258-98E6A3860B35}.Debug|Win32.Build.0 = Debug|Win32
+ {9FBB0318-E21C-4B7C-A258-98E6A3860B35}.Debug|x64.ActiveCfg = Debug|Win32
+ {9FBB0318-E21C-4B7C-A258-98E6A3860B35}.Debug64|Win32.ActiveCfg = Debug64|x64
+ {9FBB0318-E21C-4B7C-A258-98E6A3860B35}.Debug64|x64.ActiveCfg = Debug64|x64
+ {9FBB0318-E21C-4B7C-A258-98E6A3860B35}.Debug64|x64.Build.0 = Debug64|x64
+ {9FBB0318-E21C-4B7C-A258-98E6A3860B35}.Release|Win32.ActiveCfg = Release|Win32
+ {9FBB0318-E21C-4B7C-A258-98E6A3860B35}.Release|Win32.Build.0 = Release|Win32
+ {9FBB0318-E21C-4B7C-A258-98E6A3860B35}.Release|x64.ActiveCfg = Release|Win32
+ {9FBB0318-E21C-4B7C-A258-98E6A3860B35}.Release64|Win32.ActiveCfg = Release64|x64
+ {9FBB0318-E21C-4B7C-A258-98E6A3860B35}.Release64|x64.ActiveCfg = Release64|x64
+ {9FBB0318-E21C-4B7C-A258-98E6A3860B35}.Release64|x64.Build.0 = Release64|x64
+ {199071F1-5059-4883-BA49-6A9922A71ADD}.Debug|Win32.ActiveCfg = Debug|Win32
+ {199071F1-5059-4883-BA49-6A9922A71ADD}.Debug|Win32.Build.0 = Debug|Win32
+ {199071F1-5059-4883-BA49-6A9922A71ADD}.Debug|x64.ActiveCfg = Debug|Win32
+ {199071F1-5059-4883-BA49-6A9922A71ADD}.Debug64|Win32.ActiveCfg = Debug|Win32
+ {199071F1-5059-4883-BA49-6A9922A71ADD}.Debug64|Win32.Build.0 = Debug|Win32
+ {199071F1-5059-4883-BA49-6A9922A71ADD}.Debug64|x64.ActiveCfg = Debug|Win32
+ {199071F1-5059-4883-BA49-6A9922A71ADD}.Release|Win32.ActiveCfg = Release|Win32
+ {199071F1-5059-4883-BA49-6A9922A71ADD}.Release|Win32.Build.0 = Release|Win32
+ {199071F1-5059-4883-BA49-6A9922A71ADD}.Release|x64.ActiveCfg = Release|Win32
+ {199071F1-5059-4883-BA49-6A9922A71ADD}.Release64|Win32.ActiveCfg = Release|Win32
+ {199071F1-5059-4883-BA49-6A9922A71ADD}.Release64|Win32.Build.0 = Release|Win32
+ {199071F1-5059-4883-BA49-6A9922A71ADD}.Release64|x64.ActiveCfg = Release|Win32
+ {70015722-8252-4944-AE20-16A88B583CEE}.Debug|Win32.ActiveCfg = Debug|Win32
+ {70015722-8252-4944-AE20-16A88B583CEE}.Debug|Win32.Build.0 = Debug|Win32
+ {70015722-8252-4944-AE20-16A88B583CEE}.Debug|x64.ActiveCfg = Debug|Win32
+ {70015722-8252-4944-AE20-16A88B583CEE}.Debug64|Win32.ActiveCfg = Debug|Win32
+ {70015722-8252-4944-AE20-16A88B583CEE}.Debug64|Win32.Build.0 = Debug|Win32
+ {70015722-8252-4944-AE20-16A88B583CEE}.Debug64|x64.ActiveCfg = Debug|Win32
+ {70015722-8252-4944-AE20-16A88B583CEE}.Release|Win32.ActiveCfg = Release|Win32
+ {70015722-8252-4944-AE20-16A88B583CEE}.Release|Win32.Build.0 = Release|Win32
+ {70015722-8252-4944-AE20-16A88B583CEE}.Release|x64.ActiveCfg = Release|Win32
+ {70015722-8252-4944-AE20-16A88B583CEE}.Release64|Win32.ActiveCfg = Release|Win32
+ {70015722-8252-4944-AE20-16A88B583CEE}.Release64|Win32.Build.0 = Release|Win32
+ {70015722-8252-4944-AE20-16A88B583CEE}.Release64|x64.ActiveCfg = Release|Win32
+ {51D11C21-C4A7-4F07-9658-B8BA223684B8}.Debug|Win32.ActiveCfg = Debug|Win32
+ {51D11C21-C4A7-4F07-9658-B8BA223684B8}.Debug|Win32.Build.0 = Debug|Win32
+ {51D11C21-C4A7-4F07-9658-B8BA223684B8}.Debug|x64.ActiveCfg = Debug|Win32
+ {51D11C21-C4A7-4F07-9658-B8BA223684B8}.Debug64|Win32.ActiveCfg = Debug|Win32
+ {51D11C21-C4A7-4F07-9658-B8BA223684B8}.Debug64|Win32.Build.0 = Debug|Win32
+ {51D11C21-C4A7-4F07-9658-B8BA223684B8}.Debug64|x64.ActiveCfg = Debug|Win32
+ {51D11C21-C4A7-4F07-9658-B8BA223684B8}.Release|Win32.ActiveCfg = Release|Win32
+ {51D11C21-C4A7-4F07-9658-B8BA223684B8}.Release|Win32.Build.0 = Release|Win32
+ {51D11C21-C4A7-4F07-9658-B8BA223684B8}.Release|x64.ActiveCfg = Release|Win32
+ {51D11C21-C4A7-4F07-9658-B8BA223684B8}.Release64|Win32.ActiveCfg = Release|Win32
+ {51D11C21-C4A7-4F07-9658-B8BA223684B8}.Release64|Win32.Build.0 = Release|Win32
+ {51D11C21-C4A7-4F07-9658-B8BA223684B8}.Release64|x64.ActiveCfg = Release|Win32
+ {D4387736-0623-4442-A4AC-AF79239F9419}.Debug|Win32.ActiveCfg = Debug|Win32
+ {D4387736-0623-4442-A4AC-AF79239F9419}.Debug|Win32.Build.0 = Debug|Win32
+ {D4387736-0623-4442-A4AC-AF79239F9419}.Debug|x64.ActiveCfg = Debug|Win32
+ {D4387736-0623-4442-A4AC-AF79239F9419}.Debug64|Win32.ActiveCfg = Debug|Win32
+ {D4387736-0623-4442-A4AC-AF79239F9419}.Debug64|Win32.Build.0 = Debug|Win32
+ {D4387736-0623-4442-A4AC-AF79239F9419}.Debug64|x64.ActiveCfg = Debug|Win32
+ {D4387736-0623-4442-A4AC-AF79239F9419}.Release|Win32.ActiveCfg = Release|Win32
+ {D4387736-0623-4442-A4AC-AF79239F9419}.Release|Win32.Build.0 = Release|Win32
+ {D4387736-0623-4442-A4AC-AF79239F9419}.Release|x64.ActiveCfg = Release|Win32
+ {D4387736-0623-4442-A4AC-AF79239F9419}.Release64|Win32.ActiveCfg = Release|Win32
+ {D4387736-0623-4442-A4AC-AF79239F9419}.Release64|Win32.Build.0 = Release|Win32
+ {D4387736-0623-4442-A4AC-AF79239F9419}.Release64|x64.ActiveCfg = Release|Win32
+ {683AECBB-89EB-4692-99C5-A527853326D4}.Debug|Win32.ActiveCfg = Debug|Win32
+ {683AECBB-89EB-4692-99C5-A527853326D4}.Debug|Win32.Build.0 = Debug|Win32
+ {683AECBB-89EB-4692-99C5-A527853326D4}.Debug|x64.ActiveCfg = Debug|Win32
+ {683AECBB-89EB-4692-99C5-A527853326D4}.Debug64|Win32.ActiveCfg = Debug|Win32
+ {683AECBB-89EB-4692-99C5-A527853326D4}.Debug64|Win32.Build.0 = Debug|Win32
+ {683AECBB-89EB-4692-99C5-A527853326D4}.Debug64|x64.ActiveCfg = Debug|Win32
+ {683AECBB-89EB-4692-99C5-A527853326D4}.Release|Win32.ActiveCfg = Release|Win32
+ {683AECBB-89EB-4692-99C5-A527853326D4}.Release|Win32.Build.0 = Release|Win32
+ {683AECBB-89EB-4692-99C5-A527853326D4}.Release|x64.ActiveCfg = Release|Win32
+ {683AECBB-89EB-4692-99C5-A527853326D4}.Release64|Win32.ActiveCfg = Release|Win32
+ {683AECBB-89EB-4692-99C5-A527853326D4}.Release64|Win32.Build.0 = Release|Win32
+ {683AECBB-89EB-4692-99C5-A527853326D4}.Release64|x64.ActiveCfg = Release|Win32
+ {01D3F1DE-99B3-4D41-97C3-F4680CDB980B}.Debug|Win32.ActiveCfg = Debug|Win32
+ {01D3F1DE-99B3-4D41-97C3-F4680CDB980B}.Debug|Win32.Build.0 = Debug|Win32
+ {01D3F1DE-99B3-4D41-97C3-F4680CDB980B}.Debug|x64.ActiveCfg = Debug|Win32
+ {01D3F1DE-99B3-4D41-97C3-F4680CDB980B}.Debug64|Win32.ActiveCfg = Debug|Win32
+ {01D3F1DE-99B3-4D41-97C3-F4680CDB980B}.Debug64|Win32.Build.0 = Debug|Win32
+ {01D3F1DE-99B3-4D41-97C3-F4680CDB980B}.Debug64|x64.ActiveCfg = Debug|Win32
+ {01D3F1DE-99B3-4D41-97C3-F4680CDB980B}.Release|Win32.ActiveCfg = Release|Win32
+ {01D3F1DE-99B3-4D41-97C3-F4680CDB980B}.Release|Win32.Build.0 = Release|Win32
+ {01D3F1DE-99B3-4D41-97C3-F4680CDB980B}.Release|x64.ActiveCfg = Release|Win32
+ {01D3F1DE-99B3-4D41-97C3-F4680CDB980B}.Release64|Win32.ActiveCfg = Release|Win32
+ {01D3F1DE-99B3-4D41-97C3-F4680CDB980B}.Release64|Win32.Build.0 = Release|Win32
+ {01D3F1DE-99B3-4D41-97C3-F4680CDB980B}.Release64|x64.ActiveCfg = Release|Win32
+ {372C0D5E-ED93-4335-849C-65494AE8A17D}.Debug|Win32.ActiveCfg = Debug|Win32
+ {372C0D5E-ED93-4335-849C-65494AE8A17D}.Debug|Win32.Build.0 = Debug|Win32
+ {372C0D5E-ED93-4335-849C-65494AE8A17D}.Debug|x64.ActiveCfg = Debug|Win32
+ {372C0D5E-ED93-4335-849C-65494AE8A17D}.Debug64|Win32.ActiveCfg = Debug|Win32
+ {372C0D5E-ED93-4335-849C-65494AE8A17D}.Debug64|Win32.Build.0 = Debug|Win32
+ {372C0D5E-ED93-4335-849C-65494AE8A17D}.Debug64|x64.ActiveCfg = Debug|Win32
+ {372C0D5E-ED93-4335-849C-65494AE8A17D}.Release|Win32.ActiveCfg = Release|Win32
+ {372C0D5E-ED93-4335-849C-65494AE8A17D}.Release|Win32.Build.0 = Release|Win32
+ {372C0D5E-ED93-4335-849C-65494AE8A17D}.Release|x64.ActiveCfg = Release|Win32
+ {372C0D5E-ED93-4335-849C-65494AE8A17D}.Release64|Win32.ActiveCfg = Release|Win32
+ {372C0D5E-ED93-4335-849C-65494AE8A17D}.Release64|Win32.Build.0 = Release|Win32
+ {372C0D5E-ED93-4335-849C-65494AE8A17D}.Release64|x64.ActiveCfg = Release|Win32
+ {D3231052-575C-4D58-BA38-2C01B10BF205}.Debug|Win32.ActiveCfg = Debug|Win32
+ {D3231052-575C-4D58-BA38-2C01B10BF205}.Debug|Win32.Build.0 = Debug|Win32
+ {D3231052-575C-4D58-BA38-2C01B10BF205}.Debug|x64.ActiveCfg = Debug|Win32
+ {D3231052-575C-4D58-BA38-2C01B10BF205}.Debug64|Win32.ActiveCfg = Debug|Win32
+ {D3231052-575C-4D58-BA38-2C01B10BF205}.Debug64|Win32.Build.0 = Debug|Win32
+ {D3231052-575C-4D58-BA38-2C01B10BF205}.Debug64|x64.ActiveCfg = Debug|Win32
+ {D3231052-575C-4D58-BA38-2C01B10BF205}.Release|Win32.ActiveCfg = Release|Win32
+ {D3231052-575C-4D58-BA38-2C01B10BF205}.Release|Win32.Build.0 = Release|Win32
+ {D3231052-575C-4D58-BA38-2C01B10BF205}.Release|x64.ActiveCfg = Release|Win32
+ {D3231052-575C-4D58-BA38-2C01B10BF205}.Release64|Win32.ActiveCfg = Release|Win32
+ {D3231052-575C-4D58-BA38-2C01B10BF205}.Release64|Win32.Build.0 = Release|Win32
+ {D3231052-575C-4D58-BA38-2C01B10BF205}.Release64|x64.ActiveCfg = Release|Win32
+ {3A9173AA-92DB-49F9-88E3-09419C1D8E9F}.Debug|Win32.ActiveCfg = Debug|Win32
+ {3A9173AA-92DB-49F9-88E3-09419C1D8E9F}.Debug|Win32.Build.0 = Debug|Win32
+ {3A9173AA-92DB-49F9-88E3-09419C1D8E9F}.Debug|x64.ActiveCfg = Debug|Win32
+ {3A9173AA-92DB-49F9-88E3-09419C1D8E9F}.Debug64|Win32.ActiveCfg = Debug64|x64
+ {3A9173AA-92DB-49F9-88E3-09419C1D8E9F}.Debug64|x64.ActiveCfg = Debug64|x64
+ {3A9173AA-92DB-49F9-88E3-09419C1D8E9F}.Debug64|x64.Build.0 = Debug64|x64
+ {3A9173AA-92DB-49F9-88E3-09419C1D8E9F}.Release|Win32.ActiveCfg = Release|Win32
+ {3A9173AA-92DB-49F9-88E3-09419C1D8E9F}.Release|Win32.Build.0 = Release|Win32
+ {3A9173AA-92DB-49F9-88E3-09419C1D8E9F}.Release|x64.ActiveCfg = Release|Win32
+ {3A9173AA-92DB-49F9-88E3-09419C1D8E9F}.Release64|Win32.ActiveCfg = Release64|x64
+ {3A9173AA-92DB-49F9-88E3-09419C1D8E9F}.Release64|x64.ActiveCfg = Release64|x64
+ {3A9173AA-92DB-49F9-88E3-09419C1D8E9F}.Release64|x64.Build.0 = Release64|x64
+ {358586C9-A4B8-43E4-8376-59C68F0F6211}.Debug|Win32.ActiveCfg = Debug|Win32
+ {358586C9-A4B8-43E4-8376-59C68F0F6211}.Debug|Win32.Build.0 = Debug|Win32
+ {358586C9-A4B8-43E4-8376-59C68F0F6211}.Debug|x64.ActiveCfg = Debug|Win32
+ {358586C9-A4B8-43E4-8376-59C68F0F6211}.Debug64|Win32.ActiveCfg = Debug|Win32
+ {358586C9-A4B8-43E4-8376-59C68F0F6211}.Debug64|Win32.Build.0 = Debug|Win32
+ {358586C9-A4B8-43E4-8376-59C68F0F6211}.Debug64|x64.ActiveCfg = Debug|Win32
+ {358586C9-A4B8-43E4-8376-59C68F0F6211}.Release|Win32.ActiveCfg = Release|Win32
+ {358586C9-A4B8-43E4-8376-59C68F0F6211}.Release|Win32.Build.0 = Release|Win32
+ {358586C9-A4B8-43E4-8376-59C68F0F6211}.Release|x64.ActiveCfg = Release|Win32
+ {358586C9-A4B8-43E4-8376-59C68F0F6211}.Release64|Win32.ActiveCfg = Release64|Win32
+ {358586C9-A4B8-43E4-8376-59C68F0F6211}.Release64|Win32.Build.0 = Release64|Win32
+ {358586C9-A4B8-43E4-8376-59C68F0F6211}.Release64|x64.ActiveCfg = Release64|Win32
+ {C77ADBF7-E610-4E57-BE4D-C122FC5BE611}.Debug|Win32.ActiveCfg = Debug|Win32
+ {C77ADBF7-E610-4E57-BE4D-C122FC5BE611}.Debug|Win32.Build.0 = Debug|Win32
+ {C77ADBF7-E610-4E57-BE4D-C122FC5BE611}.Debug|x64.ActiveCfg = Debug|Win32
+ {C77ADBF7-E610-4E57-BE4D-C122FC5BE611}.Debug64|Win32.ActiveCfg = Debug|Win32
+ {C77ADBF7-E610-4E57-BE4D-C122FC5BE611}.Debug64|Win32.Build.0 = Debug|Win32
+ {C77ADBF7-E610-4E57-BE4D-C122FC5BE611}.Debug64|x64.ActiveCfg = Debug|Win32
+ {C77ADBF7-E610-4E57-BE4D-C122FC5BE611}.Release|Win32.ActiveCfg = Release|Win32
+ {C77ADBF7-E610-4E57-BE4D-C122FC5BE611}.Release|Win32.Build.0 = Release|Win32
+ {C77ADBF7-E610-4E57-BE4D-C122FC5BE611}.Release|x64.ActiveCfg = Release|Win32
+ {C77ADBF7-E610-4E57-BE4D-C122FC5BE611}.Release64|Win32.ActiveCfg = Release|Win32
+ {C77ADBF7-E610-4E57-BE4D-C122FC5BE611}.Release64|Win32.Build.0 = Release|Win32
+ {C77ADBF7-E610-4E57-BE4D-C122FC5BE611}.Release64|x64.ActiveCfg = Release|Win32
+ {39599EFE-428F-408F-BF4F-BF462E37C5E8}.Debug|Win32.ActiveCfg = Debug|Win32
+ {39599EFE-428F-408F-BF4F-BF462E37C5E8}.Debug|Win32.Build.0 = Debug|Win32
+ {39599EFE-428F-408F-BF4F-BF462E37C5E8}.Debug|x64.ActiveCfg = Debug|Win32
+ {39599EFE-428F-408F-BF4F-BF462E37C5E8}.Debug64|Win32.ActiveCfg = Debug|Win32
+ {39599EFE-428F-408F-BF4F-BF462E37C5E8}.Debug64|Win32.Build.0 = Debug|Win32
+ {39599EFE-428F-408F-BF4F-BF462E37C5E8}.Debug64|x64.ActiveCfg = Debug|Win32
+ {39599EFE-428F-408F-BF4F-BF462E37C5E8}.Debug64|x64.Build.0 = Debug|Win32
+ {39599EFE-428F-408F-BF4F-BF462E37C5E8}.Release|Win32.ActiveCfg = Release|Win32
+ {39599EFE-428F-408F-BF4F-BF462E37C5E8}.Release|Win32.Build.0 = Release|Win32
+ {39599EFE-428F-408F-BF4F-BF462E37C5E8}.Release|x64.ActiveCfg = Release|Win32
+ {39599EFE-428F-408F-BF4F-BF462E37C5E8}.Release64|Win32.ActiveCfg = Release|Win32
+ {39599EFE-428F-408F-BF4F-BF462E37C5E8}.Release64|Win32.Build.0 = Release|Win32
+ {39599EFE-428F-408F-BF4F-BF462E37C5E8}.Release64|x64.ActiveCfg = Release|Win32
+ {26C43947-9E7A-4B55-8A6D-A0F5222612AA}.Debug|Win32.ActiveCfg = Debug|Win32
+ {26C43947-9E7A-4B55-8A6D-A0F5222612AA}.Debug|Win32.Build.0 = Debug|Win32
+ {26C43947-9E7A-4B55-8A6D-A0F5222612AA}.Debug|x64.ActiveCfg = Debug|Win32
+ {26C43947-9E7A-4B55-8A6D-A0F5222612AA}.Debug64|Win32.ActiveCfg = Debug|Win32
+ {26C43947-9E7A-4B55-8A6D-A0F5222612AA}.Debug64|Win32.Build.0 = Debug|Win32
+ {26C43947-9E7A-4B55-8A6D-A0F5222612AA}.Debug64|x64.ActiveCfg = Debug|Win32
+ {26C43947-9E7A-4B55-8A6D-A0F5222612AA}.Release|Win32.ActiveCfg = Release|Win32
+ {26C43947-9E7A-4B55-8A6D-A0F5222612AA}.Release|Win32.Build.0 = Release|Win32
+ {26C43947-9E7A-4B55-8A6D-A0F5222612AA}.Release|x64.ActiveCfg = Release|Win32
+ {26C43947-9E7A-4B55-8A6D-A0F5222612AA}.Release64|Win32.ActiveCfg = Release|Win32
+ {26C43947-9E7A-4B55-8A6D-A0F5222612AA}.Release64|Win32.Build.0 = Release|Win32
+ {26C43947-9E7A-4B55-8A6D-A0F5222612AA}.Release64|x64.ActiveCfg = Release|Win32
+ {7B30B57A-6E59-482E-A8A8-5E2D978EA991}.Debug|Win32.ActiveCfg = Debug|Win32
+ {7B30B57A-6E59-482E-A8A8-5E2D978EA991}.Debug|Win32.Build.0 = Debug|Win32
+ {7B30B57A-6E59-482E-A8A8-5E2D978EA991}.Debug|x64.ActiveCfg = Debug|Win32
+ {7B30B57A-6E59-482E-A8A8-5E2D978EA991}.Debug64|Win32.ActiveCfg = Debug|Win32
+ {7B30B57A-6E59-482E-A8A8-5E2D978EA991}.Debug64|Win32.Build.0 = Debug|Win32
+ {7B30B57A-6E59-482E-A8A8-5E2D978EA991}.Debug64|x64.ActiveCfg = Release|Win32
+ {7B30B57A-6E59-482E-A8A8-5E2D978EA991}.Debug64|x64.Build.0 = Release|Win32
+ {7B30B57A-6E59-482E-A8A8-5E2D978EA991}.Release|Win32.ActiveCfg = Release|Win32
+ {7B30B57A-6E59-482E-A8A8-5E2D978EA991}.Release|Win32.Build.0 = Release|Win32
+ {7B30B57A-6E59-482E-A8A8-5E2D978EA991}.Release|x64.ActiveCfg = Release|Win32
+ {7B30B57A-6E59-482E-A8A8-5E2D978EA991}.Release64|Win32.ActiveCfg = Release|Win32
+ {7B30B57A-6E59-482E-A8A8-5E2D978EA991}.Release64|Win32.Build.0 = Release|Win32
+ {7B30B57A-6E59-482E-A8A8-5E2D978EA991}.Release64|x64.ActiveCfg = Release|Win32
+ {7B30B57A-6E59-482E-A8A8-5E2D978EA991}.Release64|x64.Build.0 = Release|Win32
+ {62BD7F43-395B-4A1E-84AC-64135ECF371D}.Debug|Win32.ActiveCfg = Debug|Win32
+ {62BD7F43-395B-4A1E-84AC-64135ECF371D}.Debug|Win32.Build.0 = Debug|Win32
+ {62BD7F43-395B-4A1E-84AC-64135ECF371D}.Debug|x64.ActiveCfg = Debug|x64
+ {62BD7F43-395B-4A1E-84AC-64135ECF371D}.Debug|x64.Build.0 = Debug|x64
+ {62BD7F43-395B-4A1E-84AC-64135ECF371D}.Debug64|Win32.ActiveCfg = Debug|Win32
+ {62BD7F43-395B-4A1E-84AC-64135ECF371D}.Debug64|Win32.Build.0 = Debug|Win32
+ {62BD7F43-395B-4A1E-84AC-64135ECF371D}.Debug64|x64.ActiveCfg = Debug|x64
+ {62BD7F43-395B-4A1E-84AC-64135ECF371D}.Debug64|x64.Build.0 = Debug|x64
+ {62BD7F43-395B-4A1E-84AC-64135ECF371D}.Release|Win32.ActiveCfg = Release|Win32
+ {62BD7F43-395B-4A1E-84AC-64135ECF371D}.Release|Win32.Build.0 = Release|Win32
+ {62BD7F43-395B-4A1E-84AC-64135ECF371D}.Release|x64.ActiveCfg = Release|x64
+ {62BD7F43-395B-4A1E-84AC-64135ECF371D}.Release|x64.Build.0 = Release|x64
+ {62BD7F43-395B-4A1E-84AC-64135ECF371D}.Release64|Win32.ActiveCfg = Release|Win32
+ {62BD7F43-395B-4A1E-84AC-64135ECF371D}.Release64|Win32.Build.0 = Release|Win32
+ {62BD7F43-395B-4A1E-84AC-64135ECF371D}.Release64|x64.ActiveCfg = Release|x64
+ {62BD7F43-395B-4A1E-84AC-64135ECF371D}.Release64|x64.Build.0 = Release|x64
+ {B8C6E4A3-3345-4C46-91B2-198EB9D292DB}.Debug|Win32.ActiveCfg = Debug|Win32
+ {B8C6E4A3-3345-4C46-91B2-198EB9D292DB}.Debug|Win32.Build.0 = Debug|Win32
+ {B8C6E4A3-3345-4C46-91B2-198EB9D292DB}.Debug|x64.ActiveCfg = Debug|x64
+ {B8C6E4A3-3345-4C46-91B2-198EB9D292DB}.Debug|x64.Build.0 = Debug|x64
+ {B8C6E4A3-3345-4C46-91B2-198EB9D292DB}.Debug64|Win32.ActiveCfg = Debug|Win32
+ {B8C6E4A3-3345-4C46-91B2-198EB9D292DB}.Debug64|Win32.Build.0 = Debug|Win32
+ {B8C6E4A3-3345-4C46-91B2-198EB9D292DB}.Debug64|x64.ActiveCfg = Debug|x64
+ {B8C6E4A3-3345-4C46-91B2-198EB9D292DB}.Debug64|x64.Build.0 = Debug|x64
+ {B8C6E4A3-3345-4C46-91B2-198EB9D292DB}.Release|Win32.ActiveCfg = Release|Win32
+ {B8C6E4A3-3345-4C46-91B2-198EB9D292DB}.Release|Win32.Build.0 = Release|Win32
+ {B8C6E4A3-3345-4C46-91B2-198EB9D292DB}.Release|x64.ActiveCfg = Release|x64
+ {B8C6E4A3-3345-4C46-91B2-198EB9D292DB}.Release|x64.Build.0 = Release|x64
+ {B8C6E4A3-3345-4C46-91B2-198EB9D292DB}.Release64|Win32.ActiveCfg = Release|Win32
+ {B8C6E4A3-3345-4C46-91B2-198EB9D292DB}.Release64|Win32.Build.0 = Release|Win32
+ {B8C6E4A3-3345-4C46-91B2-198EB9D292DB}.Release64|x64.ActiveCfg = Release|x64
+ {B8C6E4A3-3345-4C46-91B2-198EB9D292DB}.Release64|x64.Build.0 = Release|x64
+ {ADCD2BDB-C723-4E9A-BFA4-2FC7EA10DC9A}.Debug|Win32.ActiveCfg = Debug|Win32
+ {ADCD2BDB-C723-4E9A-BFA4-2FC7EA10DC9A}.Debug|Win32.Build.0 = Debug|Win32
+ {ADCD2BDB-C723-4E9A-BFA4-2FC7EA10DC9A}.Debug|x64.ActiveCfg = Debug|x64
+ {ADCD2BDB-C723-4E9A-BFA4-2FC7EA10DC9A}.Debug|x64.Build.0 = Debug|x64
+ {ADCD2BDB-C723-4E9A-BFA4-2FC7EA10DC9A}.Debug64|Win32.ActiveCfg = Debug|Win32
+ {ADCD2BDB-C723-4E9A-BFA4-2FC7EA10DC9A}.Debug64|Win32.Build.0 = Debug|Win32
+ {ADCD2BDB-C723-4E9A-BFA4-2FC7EA10DC9A}.Debug64|x64.ActiveCfg = Debug|x64
+ {ADCD2BDB-C723-4E9A-BFA4-2FC7EA10DC9A}.Release|Win32.ActiveCfg = Release|Win32
+ {ADCD2BDB-C723-4E9A-BFA4-2FC7EA10DC9A}.Release|Win32.Build.0 = Release|Win32
+ {ADCD2BDB-C723-4E9A-BFA4-2FC7EA10DC9A}.Release|x64.ActiveCfg = Release|x64
+ {ADCD2BDB-C723-4E9A-BFA4-2FC7EA10DC9A}.Release|x64.Build.0 = Release|x64
+ {ADCD2BDB-C723-4E9A-BFA4-2FC7EA10DC9A}.Release64|Win32.ActiveCfg = Release|Win32
+ {ADCD2BDB-C723-4E9A-BFA4-2FC7EA10DC9A}.Release64|Win32.Build.0 = Release|Win32
+ {ADCD2BDB-C723-4E9A-BFA4-2FC7EA10DC9A}.Release64|x64.ActiveCfg = Release|x64
+ {ADCD2BDB-C723-4E9A-BFA4-2FC7EA10DC9A}.Release64|x64.Build.0 = Release|x64
+ {3F2DB224-C53A-4983-B77D-0629D3ABDD80}.Debug|Win32.ActiveCfg = Debug|Win32
+ {3F2DB224-C53A-4983-B77D-0629D3ABDD80}.Debug|Win32.Build.0 = Debug|Win32
+ {3F2DB224-C53A-4983-B77D-0629D3ABDD80}.Debug|x64.ActiveCfg = Debug|x64
+ {3F2DB224-C53A-4983-B77D-0629D3ABDD80}.Debug|x64.Build.0 = Debug|x64
+ {3F2DB224-C53A-4983-B77D-0629D3ABDD80}.Debug64|Win32.ActiveCfg = Debug|Win32
+ {3F2DB224-C53A-4983-B77D-0629D3ABDD80}.Debug64|Win32.Build.0 = Debug|Win32
+ {3F2DB224-C53A-4983-B77D-0629D3ABDD80}.Debug64|x64.ActiveCfg = Debug|x64
+ {3F2DB224-C53A-4983-B77D-0629D3ABDD80}.Debug64|x64.Build.0 = Debug|x64
+ {3F2DB224-C53A-4983-B77D-0629D3ABDD80}.Release|Win32.ActiveCfg = Release|Win32
+ {3F2DB224-C53A-4983-B77D-0629D3ABDD80}.Release|Win32.Build.0 = Release|Win32
+ {3F2DB224-C53A-4983-B77D-0629D3ABDD80}.Release|x64.ActiveCfg = Release|x64
+ {3F2DB224-C53A-4983-B77D-0629D3ABDD80}.Release|x64.Build.0 = Release|x64
+ {3F2DB224-C53A-4983-B77D-0629D3ABDD80}.Release64|Win32.ActiveCfg = Release|Win32
+ {3F2DB224-C53A-4983-B77D-0629D3ABDD80}.Release64|Win32.Build.0 = Release|Win32
+ {3F2DB224-C53A-4983-B77D-0629D3ABDD80}.Release64|x64.ActiveCfg = Release|x64
+ {3F2DB224-C53A-4983-B77D-0629D3ABDD80}.Release64|x64.Build.0 = Release|x64
+ {6D0E7A00-CCBE-4103-80A7-42A980BF43E0}.Debug|Win32.ActiveCfg = Debug|Win32
+ {6D0E7A00-CCBE-4103-80A7-42A980BF43E0}.Debug|Win32.Build.0 = Debug|Win32
+ {6D0E7A00-CCBE-4103-80A7-42A980BF43E0}.Debug|x64.ActiveCfg = Debug|x64
+ {6D0E7A00-CCBE-4103-80A7-42A980BF43E0}.Debug|x64.Build.0 = Debug|x64
+ {6D0E7A00-CCBE-4103-80A7-42A980BF43E0}.Debug64|Win32.ActiveCfg = Debug|Win32
+ {6D0E7A00-CCBE-4103-80A7-42A980BF43E0}.Debug64|Win32.Build.0 = Debug|Win32
+ {6D0E7A00-CCBE-4103-80A7-42A980BF43E0}.Debug64|x64.ActiveCfg = Debug|x64
+ {6D0E7A00-CCBE-4103-80A7-42A980BF43E0}.Debug64|x64.Build.0 = Debug|x64
+ {6D0E7A00-CCBE-4103-80A7-42A980BF43E0}.Release|Win32.ActiveCfg = Release|Win32
+ {6D0E7A00-CCBE-4103-80A7-42A980BF43E0}.Release|Win32.Build.0 = Release|Win32
+ {6D0E7A00-CCBE-4103-80A7-42A980BF43E0}.Release|x64.ActiveCfg = Release|x64
+ {6D0E7A00-CCBE-4103-80A7-42A980BF43E0}.Release|x64.Build.0 = Release|x64
+ {6D0E7A00-CCBE-4103-80A7-42A980BF43E0}.Release64|Win32.ActiveCfg = Release|Win32
+ {6D0E7A00-CCBE-4103-80A7-42A980BF43E0}.Release64|Win32.Build.0 = Release|Win32
+ {6D0E7A00-CCBE-4103-80A7-42A980BF43E0}.Release64|x64.ActiveCfg = Release|x64
+ {6D0E7A00-CCBE-4103-80A7-42A980BF43E0}.Release64|x64.Build.0 = Release|x64
+ {891F3DF0-72F6-404A-AF4A-85F1A640AB82}.Debug|Win32.ActiveCfg = Debug|Win32
+ {891F3DF0-72F6-404A-AF4A-85F1A640AB82}.Debug|Win32.Build.0 = Debug|Win32
+ {891F3DF0-72F6-404A-AF4A-85F1A640AB82}.Debug|x64.ActiveCfg = Debug|x64
+ {891F3DF0-72F6-404A-AF4A-85F1A640AB82}.Debug|x64.Build.0 = Debug|x64
+ {891F3DF0-72F6-404A-AF4A-85F1A640AB82}.Debug64|Win32.ActiveCfg = Debug|Win32
+ {891F3DF0-72F6-404A-AF4A-85F1A640AB82}.Debug64|Win32.Build.0 = Debug|Win32
+ {891F3DF0-72F6-404A-AF4A-85F1A640AB82}.Debug64|x64.ActiveCfg = Debug|x64
+ {891F3DF0-72F6-404A-AF4A-85F1A640AB82}.Debug64|x64.Build.0 = Debug|x64
+ {891F3DF0-72F6-404A-AF4A-85F1A640AB82}.Release|Win32.ActiveCfg = Release|Win32
+ {891F3DF0-72F6-404A-AF4A-85F1A640AB82}.Release|Win32.Build.0 = Release|Win32
+ {891F3DF0-72F6-404A-AF4A-85F1A640AB82}.Release|x64.ActiveCfg = Release|x64
+ {891F3DF0-72F6-404A-AF4A-85F1A640AB82}.Release|x64.Build.0 = Release|x64
+ {891F3DF0-72F6-404A-AF4A-85F1A640AB82}.Release64|Win32.ActiveCfg = Release|Win32
+ {891F3DF0-72F6-404A-AF4A-85F1A640AB82}.Release64|Win32.Build.0 = Release|Win32
+ {891F3DF0-72F6-404A-AF4A-85F1A640AB82}.Release64|x64.ActiveCfg = Release|x64
+ {891F3DF0-72F6-404A-AF4A-85F1A640AB82}.Release64|x64.Build.0 = Release|x64
+ {5307B252-E992-4907-9C15-4BC5BD746F4C}.Debug|Win32.ActiveCfg = Debug|Win32
+ {5307B252-E992-4907-9C15-4BC5BD746F4C}.Debug|Win32.Build.0 = Debug|Win32
+ {5307B252-E992-4907-9C15-4BC5BD746F4C}.Debug|x64.ActiveCfg = Debug|x64
+ {5307B252-E992-4907-9C15-4BC5BD746F4C}.Debug|x64.Build.0 = Debug|x64
+ {5307B252-E992-4907-9C15-4BC5BD746F4C}.Debug64|Win32.ActiveCfg = Debug|Win32
+ {5307B252-E992-4907-9C15-4BC5BD746F4C}.Debug64|Win32.Build.0 = Debug|Win32
+ {5307B252-E992-4907-9C15-4BC5BD746F4C}.Debug64|x64.ActiveCfg = Debug|x64
+ {5307B252-E992-4907-9C15-4BC5BD746F4C}.Debug64|x64.Build.0 = Debug|x64
+ {5307B252-E992-4907-9C15-4BC5BD746F4C}.Release|Win32.ActiveCfg = Release|Win32
+ {5307B252-E992-4907-9C15-4BC5BD746F4C}.Release|Win32.Build.0 = Release|Win32
+ {5307B252-E992-4907-9C15-4BC5BD746F4C}.Release|x64.ActiveCfg = Release|x64
+ {5307B252-E992-4907-9C15-4BC5BD746F4C}.Release|x64.Build.0 = Release|x64
+ {5307B252-E992-4907-9C15-4BC5BD746F4C}.Release64|Win32.ActiveCfg = Release|Win32
+ {5307B252-E992-4907-9C15-4BC5BD746F4C}.Release64|Win32.Build.0 = Release|Win32
+ {5307B252-E992-4907-9C15-4BC5BD746F4C}.Release64|x64.ActiveCfg = Release|x64
+ {5307B252-E992-4907-9C15-4BC5BD746F4C}.Release64|x64.Build.0 = Release|x64
+ EndGlobalSection
+ GlobalSection(SolutionProperties) = preSolution
+ HideSolutionNode = FALSE
+ EndGlobalSection
+ GlobalSection(NestedProjects) = preSolution
+ {919B914D-6840-453E-9201-8619E63AD0E1} = {78740AE4-CA39-4892-B262-7FC77BF31E3A}
+ {9FBB0318-E21C-4B7C-A258-98E6A3860B35} = {78740AE4-CA39-4892-B262-7FC77BF31E3A}
+ {199071F1-5059-4883-BA49-6A9922A71ADD} = {78740AE4-CA39-4892-B262-7FC77BF31E3A}
+ {70015722-8252-4944-AE20-16A88B583CEE} = {78740AE4-CA39-4892-B262-7FC77BF31E3A}
+ {51D11C21-C4A7-4F07-9658-B8BA223684B8} = {78740AE4-CA39-4892-B262-7FC77BF31E3A}
+ {D4387736-0623-4442-A4AC-AF79239F9419} = {78740AE4-CA39-4892-B262-7FC77BF31E3A}
+ {683AECBB-89EB-4692-99C5-A527853326D4} = {78740AE4-CA39-4892-B262-7FC77BF31E3A}
+ {01D3F1DE-99B3-4D41-97C3-F4680CDB980B} = {78740AE4-CA39-4892-B262-7FC77BF31E3A}
+ {372C0D5E-ED93-4335-849C-65494AE8A17D} = {78740AE4-CA39-4892-B262-7FC77BF31E3A}
+ {D3231052-575C-4D58-BA38-2C01B10BF205} = {463A606E-275B-4F7B-B46D-B5E0E0C9FBFF}
+ {3A9173AA-92DB-49F9-88E3-09419C1D8E9F} = {463A606E-275B-4F7B-B46D-B5E0E0C9FBFF}
+ {358586C9-A4B8-43E4-8376-59C68F0F6211} = {EA89FD2A-C740-4401-84E8-3BFEB57B1D5A}
+ {C77ADBF7-E610-4E57-BE4D-C122FC5BE611} = {A67F001E-0B1B-4BE2-90BB-243F8648B5EF}
+ {39599EFE-428F-408F-BF4F-BF462E37C5E8} = {E883D8BF-3E2E-4899-B490-7346465B2555}
+ {E883D8BF-3E2E-4899-B490-7346465B2555} = {DFA0F44C-82C0-4772-B71F-51D3DDE00F16}
+ {A67F001E-0B1B-4BE2-90BB-243F8648B5EF} = {8B1A6E55-6AB5-4875-8EC0-97E86BF42714}
+ {26C43947-9E7A-4B55-8A6D-A0F5222612AA} = {78740AE4-CA39-4892-B262-7FC77BF31E3A}
+ {7B30B57A-6E59-482E-A8A8-5E2D978EA991} = {78740AE4-CA39-4892-B262-7FC77BF31E3A}
+ {62BD7F43-395B-4A1E-84AC-64135ECF371D} = {78740AE4-CA39-4892-B262-7FC77BF31E3A}
+ {B8C6E4A3-3345-4C46-91B2-198EB9D292DB} = {78740AE4-CA39-4892-B262-7FC77BF31E3A}
+ {ADCD2BDB-C723-4E9A-BFA4-2FC7EA10DC9A} = {78740AE4-CA39-4892-B262-7FC77BF31E3A}
+ {3F2DB224-C53A-4983-B77D-0629D3ABDD80} = {78740AE4-CA39-4892-B262-7FC77BF31E3A}
+ {6D0E7A00-CCBE-4103-80A7-42A980BF43E0} = {78740AE4-CA39-4892-B262-7FC77BF31E3A}
+ {891F3DF0-72F6-404A-AF4A-85F1A640AB82} = {78740AE4-CA39-4892-B262-7FC77BF31E3A}
+ {5307B252-E992-4907-9C15-4BC5BD746F4C} = {78740AE4-CA39-4892-B262-7FC77BF31E3A}
+ EndGlobalSection
+EndGlobal
diff --git a/CopyApiDll.bat b/CopyApiDll.bat
new file mode 100644
index 0000000..5167290
--- /dev/null
+++ b/CopyApiDll.bat
@@ -0,0 +1,31 @@
+REM 32位调试版
+xcopy "include\Tdx\win32\*.*" "bin\Debug\x86\Tdx" /Y
+xcopy "include\CTP\win32\*.dll" "bin\Debug\x86\CTP" /Y
+xcopy "include\Kingstar\win32\*.*" "bin\Debug\x86\Kingstar" /Y
+xcopy "include\LTS_v2\win32\*.dll" "bin\Debug\x86\LTS_v2" /Y
+xcopy "include\UFX\win32\*.*" "bin\Debug\x86\UFX" /Y
+xcopy "include\Wind\win32\*.dll" "bin\Debug\x86\Wind" /Y
+xcopy "include\Sgit\win32\*.dll" "bin\Debug\x86\Sgit" /Y
+xcopy "include\CTP_SOPT\win32\*.dll" "bin\Debug\x86\CTP_SOPT" /Y
+xcopy "include\ATP\win32\*.dll" "bin\Debug\x86\ATP" /Y
+xcopy "include\CTPZQ\win32\*.dll" "bin\Debug\x86\CTPZQ" /Y
+
+REM 32位发布版
+xcopy "include\Tdx\win32\*.*" "bin\Release\x86\Tdx" /Y
+xcopy "include\CTP\win32\*.dll" "bin\Release\x86\CTP" /Y
+xcopy "include\Kingstar\win32\*.*" "bin\Release\x86\Kingstar" /Y
+xcopy "include\LTS_v2\win32\*.dll" "bin\Release\x86\LTS_v2" /Y
+xcopy "include\UFX\win32\*.*" "bin\Release\x86\UFX" /Y
+xcopy "include\Wind\win32\*.dll" "bin\Release\x86\Wind" /Y
+xcopy "include\Sgit\win32\*.dll" "bin\Release\x86\Sgit" /Y
+xcopy "include\CTP_SOPT\win32\*.dll" "bin\Release\x86\CTP_SOPT" /Y
+xcopy "include\ATP\win32\*.dll" "bin\Release\x86\ATP" /Y
+xcopy "include\CTPZQ\win32\*.dll" "bin\Release\x86\CTPZQ" /Y
+
+REM 64位调试版
+xcopy "include\CTP\win64\*.dll" "bin\Debug64\x64\CTP" /Y
+
+REM 64位发布版
+xcopy "include\CTP\win64\*.dll" "bin\Release64\x64\CTP" /Y
+
+pause
\ No newline at end of file
diff --git a/FakeAPI/instruments.dat b/FakeAPI/instruments.dat
deleted file mode 100644
index f74a262..0000000
Binary files a/FakeAPI/instruments.dat and /dev/null differ
diff --git a/LICENSE.txt b/LICENSE.txt
new file mode 100644
index 0000000..7a4ba3e
--- /dev/null
+++ b/LICENSE.txt
@@ -0,0 +1 @@
+BSD License
\ No newline at end of file
diff --git a/Makefile b/Makefile
new file mode 100644
index 0000000..2518b24
--- /dev/null
+++ b/Makefile
@@ -0,0 +1,10 @@
+all:
+ $(MAKE) -C common/Queue all
+ $(MAKE) -C apis/CTP all
+ $(MAKE) -C tests/CPP all
+
+clean:
+ $(MAKE) -C common/Queue clean
+ $(MAKE) -C apis/CTP clean
+ $(MAKE) -C tests/CPP clean
+
diff --git a/Makefile.global b/Makefile.global
new file mode 100644
index 0000000..c15f865
--- /dev/null
+++ b/Makefile.global
@@ -0,0 +1,11 @@
+CXX=clang++
+IFLAGS=-I../../ -I../../include/ -I../ -I./
+CFLAGS=$(IFLAGS)-std=c++11 -O3 -fPIC -pthread -Bsymbol
+
+all: $(ALL)
+
+%.o: %.cpp
+ $(CXX) $(CFLAGS) -c $^ -o $@
+
+clean:
+ rm -rf *.so *.o $(DEPS)
diff --git a/QuantBox_CTP_Quote/QuantBox_CTP_Quote.vcxproj b/QuantBox_CTP_Quote/QuantBox_CTP_Quote.vcxproj
deleted file mode 100644
index 4cf345a..0000000
--- a/QuantBox_CTP_Quote/QuantBox_CTP_Quote.vcxproj
+++ /dev/null
@@ -1,274 +0,0 @@
-
-
-
-
- Debug64
- Win32
-
-
- Debug64
- x64
-
-
- Debug
- Win32
-
-
- Debug
- x64
-
-
- Release
- Win32
-
-
- Release
- x64
-
-
-
- {919B914D-6840-453E-9201-8619E63AD0E1}
- Win32Proj
- QuantBox_CTP_Quote
-
-
-
- DynamicLibrary
- true
- v120
- Unicode
-
-
- DynamicLibrary
- true
- v120
- Unicode
-
-
- DynamicLibrary
- true
- v120
- Unicode
-
-
- DynamicLibrary
- true
- v120
- Unicode
-
-
- DynamicLibrary
- false
- v120
- true
- Unicode
-
-
- DynamicLibrary
- false
- v120
- true
- Unicode
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- true
- C:\Program Files\SmartQuant Ltd\OpenQuant 2014\XAPI\CTP\x86
-
-
- true
-
-
- true
- C:\Program Files\SmartQuant Ltd\OpenQuant 2014\XAPI\CTP
-
-
- true
- C:\Program Files\SmartQuant Ltd\OpenQuant 2014\XAPI\CTP\x64
-
-
- false
-
-
- false
-
-
-
- Use
- Level3
- Disabled
- WIN32;_DEBUG;_WINDOWS;_USRDLL;QUANTBOX_CTP_QUOTE_EXPORTS;BUILDING_DLL;_CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions)
- true
- Cdecl
- ..\include\ZeroMQ\libzmq\include;..\include\ZeroMQ\czmq\include;%(AdditionalIncludeDirectories)
-
-
- Windows
- true
- ..\include\ApiHeader.def
-
-
- xcopy "$(TargetPath)" "$(SolutionDir)XAPI\CTP\x86\" /Y
-xcopy "$(SolutionDir)include\CTP\win32\*.dll" "$(SolutionDir)XAPI\CTP\x86\" /Y
-
-
-
-
- Use
- Level3
- Disabled
- WIN32;_DEBUG;_WINDOWS;_USRDLL;QUANTBOX_CTP_QUOTE_EXPORTS;BUILDING_DLL;_CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions)
- true
-
-
- Windows
- true
- ..\include\ApiHeader.def
-
-
-
-
- Use
- Level3
- Disabled
- WIN32;_DEBUG;_WINDOWS;_USRDLL;QUANTBOX_CTP_QUOTE_EXPORTS;BUILDING_DLL;_CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions)
- true
-
-
- Windows
- true
- ..\include\ApiHeader.def
-
-
-
-
- Use
- Level3
- Disabled
- WIN32;_DEBUG;_WINDOWS;_USRDLL;QUANTBOX_CTP_QUOTE_EXPORTS;BUILDING_DLL;_CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions)
- true
-
-
- Windows
- true
- ..\include\ApiHeader.def
-
-
-
-
- Level3
- Use
- MaxSpeed
- true
- true
- WIN32;NDEBUG;_WINDOWS;_USRDLL;QUANTBOX_CTP_QUOTE_EXPORTS;BUILDING_DLL;_CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions)
- true
-
-
- Windows
- true
- true
- true
- ..\include\ApiHeader.def
-
-
-
-
- Level3
- Use
- MaxSpeed
- true
- true
- WIN32;NDEBUG;_WINDOWS;_USRDLL;QUANTBOX_CTP_QUOTE_EXPORTS;%(PreprocessorDefinitions)
- true
-
-
- Windows
- true
- true
- true
- QuantBox_CTP_Quote.def
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- Use
- Use
- Use
- Use
-
-
-
- false
- false
- false
- false
- Use
- Use
- Use
- Use
- false
- false
-
-
-
-
-
-
- Use
- Use
- Use
- Use
-
-
- Use
- Use
- Use
- Use
-
-
- Create
- Create
- Create
- Create
- Create
- Create
-
-
-
-
-
-
\ No newline at end of file
diff --git a/QuantBox_CTP_Trade/QuantBox_CTP_Trade.vcxproj b/QuantBox_CTP_Trade/QuantBox_CTP_Trade.vcxproj
deleted file mode 100644
index fa3fed2..0000000
--- a/QuantBox_CTP_Trade/QuantBox_CTP_Trade.vcxproj
+++ /dev/null
@@ -1,277 +0,0 @@
-
-
-
-
- Debug64
- Win32
-
-
- Debug64
- x64
-
-
- Debug
- Win32
-
-
- Debug
- x64
-
-
- Release
- Win32
-
-
- Release
- x64
-
-
-
- {9FBB0318-E21C-4B7C-A258-98E6A3860B35}
- Win32Proj
- QuantBox_CTP_Trade
-
-
-
- DynamicLibrary
- true
- v120
- Unicode
-
-
- DynamicLibrary
- true
- v120
- Unicode
-
-
- DynamicLibrary
- true
- v120
- Unicode
-
-
- DynamicLibrary
- true
- v120
- Unicode
-
-
- DynamicLibrary
- false
- v120
- true
- Unicode
-
-
- DynamicLibrary
- false
- v120
- true
- Unicode
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- true
- C:\Program Files\SmartQuant Ltd\OpenQuant 2014\XAPI\CTP\x86
-
-
- true
-
-
- true
- C:\Program Files\SmartQuant Ltd\OpenQuant 2014\XAPI\CTP
-
-
- true
- C:\Program Files\SmartQuant Ltd\OpenQuant 2014\XAPI\CTP\x64
-
-
- false
-
-
- false
-
-
-
- Use
- Level3
- Disabled
- WIN32;_DEBUG;_WINDOWS;_USRDLL;BUILDING_DLL;_CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions)
- true
-
-
- Windows
- true
- ..\include\ApiHeader.def
-
-
- xcopy "$(TargetPath)" "$(SolutionDir)XAPI\CTP\x86\" /Y
-xcopy "$(SolutionDir)include\CTP\win32\*.dll" "$(SolutionDir)XAPI\CTP\x86\" /Y
-
-
-
-
- Use
- Level3
- Disabled
- WIN32;_DEBUG;_WINDOWS;_USRDLL;BUILDING_DLL;_CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions)
- true
-
-
- Windows
- true
- ..\include\ApiHeader.def
-
-
-
-
- Use
- Level3
- Disabled
- WIN32;_DEBUG;_WINDOWS;_USRDLL;BUILDING_DLL;_CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions)
- true
-
-
- Windows
- true
- ..\include\ApiHeader.def
-
-
-
-
- Use
- Level3
- Disabled
- WIN32;_DEBUG;_WINDOWS;_USRDLL;BUILDING_DLL;_CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions)
- true
-
-
- Windows
- true
- ..\include\ApiHeader.def
-
-
-
-
- Level3
- Use
- MaxSpeed
- true
- true
- WIN32;NDEBUG;_WINDOWS;_USRDLL;BUILDING_DLL;_CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions)
- true
-
-
- Windows
- true
- true
- true
- ..\include\ApiHeader.def
-
-
-
-
- Level3
- Use
- MaxSpeed
- true
- true
- WIN32;NDEBUG;_WINDOWS;_USRDLL;QUANTBOX_CTP_TRADE_EXPORTS;%(PreprocessorDefinitions)
- true
-
-
- Windows
- true
- true
- true
- QuantBox_CTP_Trade.def
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- Use
- Use
- Use
- Use
-
-
- false
- false
- false
- false
- Use
- Use
- Use
- Use
- false
- false
-
-
-
-
-
-
- Use
- Use
- Use
- Use
-
-
- Create
- Create
- Create
- Create
- Create
- Create
-
-
- Use
- Use
- Use
- Use
-
-
- Use
- Use
- Use
- Use
-
-
-
-
-
-
\ No newline at end of file
diff --git a/QuantBox_LTS_Query_v2/QueryApi.cpp b/QuantBox_LTS_Query_v2/QueryApi.cpp
deleted file mode 100644
index f4f70b5..0000000
--- a/QuantBox_LTS_Query_v2/QueryApi.cpp
+++ /dev/null
@@ -1,1186 +0,0 @@
-#include "stdafx.h"
-#include "QueryApi.h"
-
-#include "../include/QueueEnum.h"
-#include "../include/QueueHeader.h"
-
-#include "../include/ApiHeader.h"
-#include "../include/ApiStruct.h"
-
-#include "../include/toolkit.h"
-
-#include "../QuantBox_Queue/MsgQueue.h"
-
-// õ뽻ͬһת
-#include "../QuantBox_LTS_Trade_v2/TypeConvert.h"
-
-#include
-#include
-
-void* __stdcall Query_Q(char type, void* pApi1, void* pApi2, double double1, double double2, void* ptr1, int size1, void* ptr2, int size2, void* ptr3, int size3)
-{
- // ڲãüǷΪ
- CQueryApi* pApi = (CQueryApi*)pApi2;
- pApi->QueryInThread(type, pApi1, pApi2, double1, double2, ptr1, size1, ptr2, size2, ptr3, size3);
- return nullptr;
-}
-
-void CQueryApi::QueryInThread(char type, void* pApi1, void* pApi2, double double1, double double2, void* ptr1, int size1, void* ptr2, int size2, void* ptr3, int size3)
-{
- int iRet = 0;
- switch (type)
- {
- case E_Init:
- iRet = _Init();
- break;
- case E_ReqUserLoginField:
- iRet = _ReqUserLogin(type, pApi1, pApi2, double1, double2, ptr1, size1, ptr2, size2, ptr3, size3);
- break;
- case E_QryTradingAccountField:
- iRet = _ReqQryTradingAccount(type, pApi1, pApi2, double1, double2, ptr1, size1, ptr2, size2, ptr3, size3);
- break;
- case E_QryInvestorPositionField:
- iRet = _ReqQryInvestorPosition(type, pApi1, pApi2, double1, double2, ptr1, size1, ptr2, size2, ptr3, size3);
- break;
- case E_QryInstrumentField:
- iRet = _ReqQryInstrument(type, pApi1, pApi2, double1, double2, ptr1, size1, ptr2, size2, ptr3, size3);
- break;
- case E_QryInvestorField:
- iRet = _ReqQryInvestor(type, pApi1, pApi2, double1, double2, ptr1, size1, ptr2, size2, ptr3, size3);
- break;
- case E_QryOrderField:
- iRet = _ReqQryOrder(type, pApi1, pApi2, double1, double2, ptr1, size1, ptr2, size2, ptr3, size3);
- break;
- case E_QryTradeField:
- iRet = _ReqQryTrade(type, pApi1, pApi2, double1, double2, ptr1, size1, ptr2, size2, ptr3, size3);
- break;
- case E_AuthRandCodeField:
- iRet = _ReqFetchAuthRandCode(type, pApi1, pApi2, double1, double2, ptr1, size1, ptr2, size2, ptr3, size3);
- break;
- default:
- break;
- }
-
- if (0 == iRet)
- {
- //سɹӵѷͳ
- m_nSleep = 1;
- }
- else
- {
- m_msgQueue_Query->Input_Copy(type, pApi1, pApi2, double1, double2, ptr1, size1, ptr2, size2, ptr3, size3);
- //ʧܣ4ݽʱ1s
- m_nSleep *= 4;
- m_nSleep %= 1023;
- }
- this_thread::sleep_for(chrono::milliseconds(m_nSleep));
-}
-
-void CQueryApi::Register(void* pCallback, void* pClass)
-{
- m_pClass = pClass;
- if (m_msgQueue == nullptr)
- return;
-
- m_msgQueue_Query->Register((void*)Query_Q, this);
- m_msgQueue->Register(pCallback, this);
- if (pCallback)
- {
- m_msgQueue_Query->StartThread();
- m_msgQueue->StartThread();
- }
- else
- {
- m_msgQueue_Query->StopThread();
- m_msgQueue->StopThread();
- }
-}
-
-CQueryApi::CQueryApi(void)
-{
- m_pApi = nullptr;
- m_lRequestID = 0;
- m_nSleep = 1;
-
- // ԼάϢ
- m_msgQueue = new CMsgQueue();
- m_msgQueue_Query = new CMsgQueue();
-
- m_msgQueue_Query->Register((void*)Query_Q, this);
- m_msgQueue_Query->StartThread();
-}
-
-
-CQueryApi::~CQueryApi(void)
-{
- Disconnect();
-}
-
-bool CQueryApi::IsErrorRspInfo(CSecurityFtdcRspInfoField *pRspInfo, int nRequestID, bool bIsLast)
-{
- bool bRet = ((pRspInfo) && (pRspInfo->ErrorID != 0));
- if (bRet)
- {
- ErrorField* pField = (ErrorField*)m_msgQueue->new_block(sizeof(ErrorField));
-
- pField->RawErrorID = pRspInfo->ErrorID;
- strcpy(pField->Text, pRspInfo->ErrorMsg);
-
- m_msgQueue->Input_NoCopy(ResponeType::OnRtnError, m_msgQueue, m_pClass, bIsLast, 0, pField, sizeof(ErrorField), nullptr, 0, nullptr, 0);
- }
- return bRet;
-}
-
-bool CQueryApi::IsErrorRspInfo(CSecurityFtdcRspInfoField *pRspInfo)
-{
- bool bRet = ((pRspInfo) && (pRspInfo->ErrorID != 0));
-
- return bRet;
-}
-
-void CQueryApi::Connect(const string& szPath,
- ServerInfoField* pServerInfo,
- UserInfoField* pUserInfo)
-{
- m_szPath = szPath;
- memcpy(&m_ServerInfo, pServerInfo, sizeof(ServerInfoField));
- memcpy(&m_UserInfo, pUserInfo, sizeof(UserInfoField));
-
- m_msgQueue_Query->Input_NoCopy(RequestType::E_Init, m_msgQueue_Query, this, 0, 0,
- nullptr, 0, nullptr, 0, nullptr, 0);
-}
-
-int CQueryApi::_Init()
-{
- char *pszPath = new char[m_szPath.length() + 1024];
- srand((unsigned int)time(nullptr));
- sprintf(pszPath, "%s/%s/%s/Td/%d/", m_szPath.c_str(), m_ServerInfo.BrokerID, m_UserInfo.UserID, rand());
- makedirs(pszPath);
-
- m_pApi = CSecurityFtdcQueryApi::CreateFtdcQueryApi(pszPath);
- delete[] pszPath;
-
- m_msgQueue->Input_NoCopy(ResponeType::OnConnectionStatus, m_msgQueue, m_pClass, ConnectionStatus::ConnectionStatus_Initialized, 0, nullptr, 0, nullptr, 0, nullptr, 0);
-
- if (m_pApi)
- {
- m_pApi->RegisterSpi(this);
-
- //ӵַ
- size_t len = strlen(m_ServerInfo.Address) + 1;
- char* buf = new char[len];
- strncpy(buf, m_ServerInfo.Address, len);
-
- char* token = strtok(buf, _QUANTBOX_SEPS_);
- while (token)
- {
- if (strlen(token)>0)
- {
- m_pApi->RegisterFront(token);
- }
- token = strtok(nullptr, _QUANTBOX_SEPS_);
- }
- delete[] buf;
-
- //if (m_ServerInfo.PublicTopicResumeTypeSubscribePublicTopic((SECURITY_TE_RESUME_TYPE)m_ServerInfo.PublicTopicResumeType);
- //if (m_ServerInfo.PrivateTopicResumeTypeSubscribePrivateTopic((SECURITY_TE_RESUME_TYPE)m_ServerInfo.PrivateTopicResumeType);
-
- m_msgQueue->Input_NoCopy(ResponeType::OnConnectionStatus, m_msgQueue, m_pClass, ConnectionStatus::ConnectionStatus_Connecting, 0, nullptr, 0, nullptr, 0, nullptr, 0);
- //ʼ
- m_pApi->Init();
- }
-
- return 0;
-}
-
-void CQueryApi::Disconnect()
-{
- if (m_msgQueue_Query)
- {
- m_msgQueue_Query->StopThread();
- m_msgQueue_Query->Register(nullptr, nullptr);
- m_msgQueue_Query->Clear();
- delete m_msgQueue_Query;
- m_msgQueue_Query = nullptr;
- }
-
- if (m_pApi)
- {
- m_pApi->RegisterSpi(nullptr);
- m_pApi->Release();
- m_pApi = nullptr;
-
- // ȫֻһ
- m_msgQueue->Clear();
- m_msgQueue->Input_NoCopy(ResponeType::OnConnectionStatus, m_msgQueue, m_pClass, ConnectionStatus::ConnectionStatus_Disconnected, 0, nullptr, 0, nullptr, 0, nullptr, 0);
- //
- m_msgQueue->Process();
- }
-
- if (m_msgQueue)
- {
- m_msgQueue->StopThread();
- m_msgQueue->Register(nullptr, nullptr);
- m_msgQueue->Clear();
- delete m_msgQueue;
- m_msgQueue = nullptr;
- }
-
- m_lRequestID = 0;//߳ѾֹͣûбҪԭӲ
-
- Clear();
-}
-
-void CQueryApi::Clear()
-{
- for (unordered_map::iterator it = m_id_platform_order.begin(); it != m_id_platform_order.end(); ++it)
- delete it->second;
- m_id_platform_order.clear();
-
- for (unordered_map::iterator it = m_id_api_order.begin(); it != m_id_api_order.end(); ++it)
- delete it->second;
- m_id_api_order.clear();
-
- //for (unordered_map::iterator it = m_id_platform_quote.begin(); it != m_id_platform_quote.end(); ++it)
- // delete it->second;
- //m_id_platform_quote.clear();
-
- //for (unordered_map::iterator it = m_id_api_quote.begin(); it != m_id_api_quote.end(); ++it)
- // delete it->second;
- //m_id_api_quote.clear();
-
- for (unordered_map::iterator it = m_id_platform_position.begin(); it != m_id_platform_position.end(); ++it)
- delete it->second;
- m_id_platform_position.clear();
-}
-
-void CQueryApi::OnFrontConnected()
-{
- m_msgQueue->Input_NoCopy(ResponeType::OnConnectionStatus, m_msgQueue, m_pClass, ConnectionStatus::ConnectionStatus_Connected, 0, nullptr, 0, nullptr, 0, nullptr, 0);
-
- //ReqUserLogin();
- ReqFetchAuthRandCode();
-}
-
-void CQueryApi::OnFrontDisconnected(int nReason)
-{
- RspUserLoginField* pField = (RspUserLoginField*)m_msgQueue->new_block(sizeof(RspUserLoginField));
-
- //ʧܷصϢƴӶɣҪΪͳһ
- pField->RawErrorID = nReason;
- GetOnFrontDisconnectedMsg(nReason, pField->Text);
-
- m_msgQueue->Input_NoCopy(ResponeType::OnConnectionStatus, m_msgQueue, m_pClass, ConnectionStatus::ConnectionStatus_Disconnected, 0, pField, sizeof(RspUserLoginField), nullptr, 0, nullptr, 0);
-}
-
-void CQueryApi::ReqFetchAuthRandCode()
-{
- CSecurityFtdcAuthRandCodeField* pBody = (CSecurityFtdcAuthRandCodeField*)m_msgQueue_Query->new_block(sizeof(CSecurityFtdcAuthRandCodeField));
-
- strncpy(pBody->RandCode, "", sizeof(TSecurityFtdcAuthCodeType));
-
- m_msgQueue_Query->Input_NoCopy(RequestType::E_AuthRandCodeField, m_msgQueue_Query, this, 0, 0,
- pBody, sizeof(CSecurityFtdcAuthRandCodeField), nullptr, 0, nullptr, 0);
-}
-
-int CQueryApi::_ReqFetchAuthRandCode(char type, void* pApi1, void* pApi2, double double1, double double2, void* ptr1, int size1, void* ptr2, int size2, void* ptr3, int size3)
-{
- m_msgQueue->Input_NoCopy(ResponeType::OnConnectionStatus, m_msgQueue, m_pClass, ConnectionStatus::ConnectionStatus_Authorizing, 0, nullptr, 0, nullptr, 0, nullptr, 0);
- return m_pApi->ReqFetchAuthRandCode((CSecurityFtdcAuthRandCodeField*)ptr1, ++m_lRequestID);
-}
-
-void CQueryApi::OnRspFetchAuthRandCode(CSecurityFtdcAuthRandCodeField *pAuthRandCode, CSecurityFtdcRspInfoField *pRspInfo, int nRequestID, bool bIsLast)
-{
- RspUserLoginField* pField = (RspUserLoginField*)m_msgQueue->new_block(sizeof(RspUserLoginField));
-
- if (!IsErrorRspInfo(pRspInfo)
- && pAuthRandCode)
- {
- m_msgQueue->Input_NoCopy(ResponeType::OnConnectionStatus, m_msgQueue, m_pClass, ConnectionStatus::ConnectionStatus_Authorized, 0, pField, sizeof(RspUserLoginField), nullptr, 0, nullptr, 0);
-
- ReqUserLogin(pAuthRandCode->RandCode);
- }
- else
- {
- pField->RawErrorID = pRspInfo->ErrorID;
- strncpy(pField->Text, pRspInfo->ErrorMsg, sizeof(Char256Type));
-
- m_msgQueue->Input_NoCopy(ResponeType::OnConnectionStatus, m_msgQueue, m_pClass, ConnectionStatus::ConnectionStatus_Disconnected, 0, pField, sizeof(RspUserLoginField), nullptr, 0, nullptr, 0);
- }
-}
-
-void CQueryApi::ReqUserLogin(TSecurityFtdcAuthCodeType RandCode)
-{
- CSecurityFtdcReqUserLoginField* pBody = (CSecurityFtdcReqUserLoginField*)m_msgQueue_Query->new_block(sizeof(CSecurityFtdcReqUserLoginField));
-
- strncpy(pBody->BrokerID, m_ServerInfo.BrokerID, sizeof(TSecurityFtdcBrokerIDType));
- strncpy(pBody->UserID, m_UserInfo.UserID, sizeof(TSecurityFtdcInvestorIDType));
- strncpy(pBody->Password, m_UserInfo.Password, sizeof(TSecurityFtdcPasswordType));
- strncpy(pBody->UserProductInfo, m_ServerInfo.UserProductInfo, sizeof(TSecurityFtdcProductInfoType));
- strncpy(pBody->AuthCode, m_ServerInfo.AuthCode, sizeof(TSecurityFtdcAuthCodeType));
- strncpy(pBody->RandCode, RandCode, sizeof(TSecurityFtdcAuthCodeType));
-
- m_msgQueue_Query->Input_NoCopy(RequestType::E_ReqUserLoginField, m_msgQueue_Query, this, 0, 0,
- pBody, sizeof(CSecurityFtdcReqUserLoginField), nullptr, 0, nullptr, 0);
-}
-
-int CQueryApi::_ReqUserLogin(char type, void* pApi1, void* pApi2, double double1, double double2, void* ptr1, int size1, void* ptr2, int size2, void* ptr3, int size3)
-{
- m_msgQueue->Input_NoCopy(ResponeType::OnConnectionStatus, m_msgQueue, m_pClass, ConnectionStatus::ConnectionStatus_Logining, 0, nullptr, 0, nullptr, 0, nullptr, 0);
- return m_pApi->ReqUserLogin((CSecurityFtdcReqUserLoginField*)ptr1, ++m_lRequestID);
-}
-
-void CQueryApi::OnRspUserLogin(CSecurityFtdcRspUserLoginField *pRspUserLogin, CSecurityFtdcRspInfoField *pRspInfo, int nRequestID, bool bIsLast)
-{
- RspUserLoginField* pField = (RspUserLoginField*)m_msgQueue->new_block(sizeof(RspUserLoginField));
-
- if (!IsErrorRspInfo(pRspInfo)
- &&pRspUserLogin)
- {
- pField->TradingDay = GetDate(pRspUserLogin->TradingDay);
- pField->LoginTime = GetTime(pRspUserLogin->LoginTime);
-
- sprintf(pField->SessionID, "%d:%d", pRspUserLogin->FrontID, pRspUserLogin->SessionID);
-
- m_msgQueue->Input_NoCopy(ResponeType::OnConnectionStatus, m_msgQueue, m_pClass, ConnectionStatus::ConnectionStatus_Logined, 0, pField, sizeof(RspUserLoginField), nullptr, 0, nullptr, 0);
-
- // µ¼Ϣܻõ
- memcpy(&m_RspUserLogin,pRspUserLogin,sizeof(CSecurityFtdcRspUserLoginField));
- m_nMaxOrderRef = atol(pRspUserLogin->MaxOrderRef);
- // ԼʱID1ʼܴ0ʼ
- m_nMaxOrderRef = m_nMaxOrderRef>1 ? m_nMaxOrderRef : 1;
- //ReqSettlementInfoConfirm();
- ReqQryInvestor();
-
- m_msgQueue->Input_NoCopy(ResponeType::OnConnectionStatus, m_msgQueue, m_pClass, ConnectionStatus::ConnectionStatus_Done, 0, nullptr, 0, nullptr, 0, nullptr, 0);
-
- if (m_ServerInfo.PrivateTopicResumeType > ResumeType::ResumeType_Restart
- && (m_ServerInfo.PrivateTopicResumeTypeRawErrorID = pRspInfo->ErrorID;
- strncpy(pField->Text, pRspInfo->ErrorMsg, sizeof(Char256Type));
-
- m_msgQueue->Input_NoCopy(ResponeType::OnConnectionStatus, m_msgQueue, m_pClass, ConnectionStatus::ConnectionStatus_Disconnected, 0, pField, sizeof(RspUserLoginField), nullptr, 0, nullptr, 0);
- }
-}
-
-//int CQueryApi::ReqOrderInsert(
-// OrderField* pOrder,
-// int count,
-// OrderIDType* pInOut)
-//{
-// int OrderRef = -1;
-// if (nullptr == m_pApi)
-// return -1;
-//
-// CSecurityFtdcInputOrderField body = {0};
-//
-// strncpy(body.BrokerID, m_RspUserLogin.BrokerID, sizeof(TSecurityFtdcBrokerIDType));
-// strncpy(body.InvestorID, m_RspUserLogin.UserID, sizeof(TSecurityFtdcInvestorIDType));
-//
-// body.MinVolume = 1;
-// body.ForceCloseReason = SECURITY_FTDC_FCC_NotForceClose;
-// body.IsAutoSuspend = 0;
-// body.UserForceClose = 0;
-// //body.IsSwapOrder = 0;
-//
-// //Լ
-// strncpy(body.InstrumentID, pOrder->InstrumentID, sizeof(TSecurityFtdcInstrumentIDType));
-// strncpy(body.ExchangeID, pOrder->ExchangeID, sizeof(TSecurityFtdcExchangeIDType));
-// //
-// body.Direction = OrderSide_2_TSecurityFtdcDirectionType(pOrder->Side);
-// //ƽ
-// body.CombOffsetFlag[0] = OpenCloseType_2_TSecurityFtdcOffsetFlagType(pOrder->OpenClose);
-// //Ͷ
-// body.CombHedgeFlag[0] = HedgeFlagType_2_TSecurityFtdcHedgeFlagType(pOrder->HedgeFlag);
-// //
-// body.VolumeTotalOriginal = (int)pOrder->Qty;
-//
-// // õһļ۸ļ۸أ
-// //body.LimitPrice = pOrder1->Price;
-// sprintf(body.LimitPrice, "%f", pOrder->Price);
-// body.StopPrice = pOrder->StopPx;
-//
-// // ԵڶдеڶΪǽ
-// if (count>1)
-// {
-// body.CombOffsetFlag[1] = OpenCloseType_2_TSecurityFtdcOffsetFlagType(pOrder[1].OpenClose);
-// body.CombHedgeFlag[1] = HedgeFlagType_2_TSecurityFtdcHedgeFlagType(pOrder[1].HedgeFlag);
-// // Ʋֻ¹ܣûʵ
-// //body.IsSwapOrder = (body.CombOffsetFlag[0] != body.CombOffsetFlag[1]);
-// }
-//
-// //۸
-// //body.OrderPriceType = OrderType_2_TSecurityFtdcOrderPriceTypeType(pOrder1->Type);
-//
-// // м
-// switch (pOrder->Type)
-// {
-// case Market:
-// case Stop:
-// case MarketOnClose:
-// case TrailingStop:
-// body.OrderPriceType = SECURITY_FTDC_OPT_BestPrice;
-// body.TimeCondition = SECURITY_FTDC_TC_IOC;
-// break;
-// case Limit:
-// case StopLimit:
-// case TrailingStopLimit:
-// default:
-// body.OrderPriceType = SECURITY_FTDC_OPT_LimitPrice;
-// body.TimeCondition = SECURITY_FTDC_TC_GFD;
-// break;
-// }
-//
-// // IOCFOK
-// switch (pOrder->TimeInForce)
-// {
-// case IOC:
-// body.TimeCondition = SECURITY_FTDC_TC_IOC;
-// body.VolumeCondition = SECURITY_FTDC_VC_AV;
-// break;
-// case FOK:
-// body.TimeCondition = SECURITY_FTDC_TC_IOC;
-// body.VolumeCondition = SECURITY_FTDC_VC_CV;
-// //body.MinVolume = body.VolumeTotalOriginal; // ط
-// break;
-// default:
-// body.VolumeCondition = SECURITY_FTDC_VC_AV;
-// break;
-// }
-//
-// //
-// switch (pOrder->Type)
-// {
-// case Stop:
-// case TrailingStop:
-// case StopLimit:
-// case TrailingStopLimit:
-// // ûвԣ
-// body.ContingentCondition = SECURITY_FTDC_CC_Immediately;
-// break;
-// default:
-// body.ContingentCondition = SECURITY_FTDC_CC_Immediately;
-// break;
-// }
-//
-// int nRet = 0;
-// {
-// //ܱ̫죬m_nMaxOrderRefûиıύ
-// lock_guard cl(m_csOrderRef);
-//
-// if (OrderRef < 0)
-// {
-// nRet = m_nMaxOrderRef;
-// ++m_nMaxOrderRef;
-// }
-// else
-// {
-// nRet = OrderRef;
-// }
-// sprintf(body.OrderRef, "%d", nRet);
-//
-// //浽Уֱӷ
-// int n = m_pApi->ReqOrderInsert(&body, ++m_lRequestID);
-// if (n < 0)
-// {
-// nRet = n;
-// sprintf(m_orderInsert_Id, "%d", nRet);
-// }
-// else
-// {
-// sprintf(m_orderInsert_Id, "%d:%d:%d", m_RspUserLogin.FrontID, m_RspUserLogin.SessionID, nRet);
-//
-// OrderField* pField = (OrderField*)m_msgQueue->new_block(sizeof(OrderField));
-// memcpy(pField, pOrder, sizeof(OrderField));
-// strcpy(pField->ID, m_orderInsert_Id);
-// m_id_platform_order.insert(pair(m_orderInsert_Id, pField));
-// }
-// strncpy((char*)pInOut, m_orderInsert_Id, sizeof(OrderIDType));
-// }
-//
-// return nRet;
-//}
-
-//void CQueryApi::OnRspOrderInsert(CSecurityFtdcInputOrderField *pInputOrder, CSecurityFtdcRspInfoField *pRspInfo, int nRequestID, bool bIsLast)
-//{
-// OrderIDType orderId = { 0 };
-// if (pInputOrder)
-// {
-// sprintf(orderId, "%d:%d:%s", m_RspUserLogin.FrontID, m_RspUserLogin.SessionID, pInputOrder->OrderRef);
-// }
-// else
-// {
-// IsErrorRspInfo(pRspInfo, nRequestID, bIsLast);
-// }
-//
-// unordered_map::iterator it = m_id_platform_order.find(orderId);
-// if (it == m_id_platform_order.end())
-// {
-// // ûҵӦʾ
-// //assert(false);
-// }
-// else
-// {
-// // ҵˣҪ״̬
-// // ʹϴε״̬
-// OrderField* pField = it->second;
-// strcpy(pField->ID, orderId);
-// pField->ExecType = ExecType::ExecRejected;
-// pField->Status = OrderStatus::Rejected;
-// pField->ErrorID = pRspInfo->ErrorID;
-// strncpy(pField->Text, pRspInfo->ErrorMsg, sizeof(ErrorMsgType));
-// m_msgQueue->Input_Copy(ResponeType::OnRtnOrder, m_msgQueue, m_pClass, 0, 0, pField, sizeof(OrderField), nullptr, 0, nullptr, 0);
-// }
-//}
-
-//void CQueryApi::OnErrRtnOrderInsert(CSecurityFtdcInputOrderField *pInputOrder, CSecurityFtdcRspInfoField *pRspInfo)
-//{
-// OrderIDType orderId = { 0 };
-// if (pInputOrder)
-// {
-// sprintf(orderId, "%d:%d:%s", m_RspUserLogin.FrontID, m_RspUserLogin.SessionID, pInputOrder->OrderRef);
-// }
-// else
-// {
-// IsErrorRspInfo(pRspInfo, 0, true);
-// }
-//
-// unordered_map::iterator it = m_id_platform_order.find(orderId);
-// if (it == m_id_platform_order.end())
-// {
-// // ûҵӦʾ
-// //assert(false);
-// // LTSڿʼʱҲյ˻رﰡ
-// }
-// else
-// {
-// // ҵˣҪ״̬
-// // ʹϴε״̬
-// OrderField* pField = it->second;
-// strcpy(pField->ID, orderId);
-// pField->ExecType = ExecType::ExecRejected;
-// pField->Status = OrderStatus::Rejected;
-// pField->ErrorID = pRspInfo->ErrorID;
-// strncpy(pField->Text, pRspInfo->ErrorMsg, sizeof(ErrorMsgType));
-// m_msgQueue->Input_Copy(ResponeType::OnRtnOrder, m_msgQueue, m_pClass, 0, 0, pField, sizeof(OrderField), nullptr, 0, nullptr, 0);
-// }
-//}
-//
-//void CQueryApi::OnRtnTrade(CSecurityFtdcTradeField *pTrade)
-//{
-// OnTrade(pTrade,false);
-//}
-
-//int CQueryApi::ReqOrderAction(OrderIDType* szIds, int count, OrderIDType* pOutput)
-//{
-// unordered_map::iterator it = m_id_api_order.find(szIds[0]);
-// if (it == m_id_api_order.end())
-// {
-// sprintf((char*)pOutput, "%d", -100);
-// return -100;
-// }
-// else
-// {
-// // ҵ˶
-// return ReqOrderAction(it->second, count, pOutput);
-// }
-//}
-
-//int CQueryApi::ReqOrderAction(CSecurityFtdcOrderField *pOrder, int count, OrderIDType* pOutput)
-//{
-// if (nullptr == m_pApi)
-// return 0;
-//
-// CSecurityFtdcInputOrderActionField body = {0};
-//
-// ///˾
-// strncpy(body.BrokerID, pOrder->BrokerID,sizeof(TSecurityFtdcBrokerIDType));
-// ///Ͷߴ
-// strncpy(body.InvestorID, pOrder->InvestorID,sizeof(TSecurityFtdcInvestorIDType));
-// ///
-// strncpy(body.OrderRef, pOrder->OrderRef,sizeof(TSecurityFtdcOrderRefType));
-// ///ǰñ
-// body.FrontID = pOrder->FrontID;
-// ///Ự
-// body.SessionID = pOrder->SessionID;
-// ///
-// strncpy(body.ExchangeID,pOrder->ExchangeID,sizeof(TSecurityFtdcExchangeIDType));
-// ///
-// //strncpy(body.OrderSysID,pOrder->OrderSysID,sizeof(TSecurityFtdcOrderSysIDType));
-// ///־
-// body.ActionFlag = SECURITY_FTDC_AF_Delete;
-// ///Լ
-// strncpy(body.InstrumentID, pOrder->InstrumentID,sizeof(TSecurityFtdcInstrumentIDType));
-//
-// int nRet = m_pApi->ReqOrderAction(&body, ++m_lRequestID);
-// if (nRet < 0)
-// {
-// sprintf(m_orderAction_Id, "%d", nRet);
-// }
-// else
-// {
-// memset(m_orderAction_Id, 0, sizeof(OrderIDType));
-// }
-// strncpy((char*)pOutput, m_orderAction_Id, sizeof(OrderIDType));
-//
-// return nRet;
-//}
-
-//void CQueryApi::OnRspOrderAction(CSecurityFtdcInputOrderActionField *pInputOrderAction, CSecurityFtdcRspInfoField *pRspInfo, int nRequestID, bool bIsLast)
-//{
-// OrderIDType orderId = { 0 };
-// if (pInputOrderAction)
-// {
-// sprintf(orderId, "%d:%d:%s", pInputOrderAction->FrontID, pInputOrderAction->SessionID, pInputOrderAction->OrderRef);
-// }
-// else
-// {
-// IsErrorRspInfo(pRspInfo, nRequestID, bIsLast);
-// }
-//
-// unordered_map::iterator it = m_id_platform_order.find(orderId);
-// if (it == m_id_platform_order.end())
-// {
-// // ûҵӦʾ
-// //assert(false);
-// }
-// else
-// {
-// // ҵˣҪ״̬
-// // ʹϴε״̬
-// OrderField* pField = it->second;
-// pField->ExecType = ExecType::ExecCancelReject;
-// pField->ErrorID = pRspInfo->ErrorID;
-// strncpy(pField->Text, pRspInfo->ErrorMsg, sizeof(ErrorMsgType));
-// m_msgQueue->Input_Copy(ResponeType::OnRtnOrder, m_msgQueue, m_pClass, 0, 0, pField, sizeof(OrderField), nullptr, 0, nullptr, 0);
-// }
-//}
-
-//void CQueryApi::OnErrRtnOrderAction(CSecurityFtdcOrderActionField *pOrderAction, CSecurityFtdcRspInfoField *pRspInfo)
-//{
-// OrderIDType orderId = { 0 };
-// if (pOrderAction)
-// {
-// sprintf(orderId, "%d:%d:%s", pOrderAction->FrontID, pOrderAction->SessionID, pOrderAction->OrderRef);
-// }
-// else
-// {
-// IsErrorRspInfo(pRspInfo, 0, true);
-// }
-//
-// unordered_map::iterator it = m_id_platform_order.find(orderId);
-// if (it == m_id_platform_order.end())
-// {
-// // ûҵӦʾ
-// //assert(false);
-// }
-// else
-// {
-// // ҵˣҪ״̬
-// // ʹϴε״̬
-// OrderField* pField = it->second;
-// pField->ExecType = ExecType::ExecCancelReject;
-// pField->ErrorID = pRspInfo->ErrorID;
-// strncpy(pField->Text, pRspInfo->ErrorMsg, sizeof(ErrorMsgType));
-// m_msgQueue->Input_Copy(ResponeType::OnRtnOrder, m_msgQueue, m_pClass, 0, 0, pField, sizeof(OrderField), nullptr, 0, nullptr, 0);
-// }
-//}
-
-//void CQueryApi::OnRtnOrder(CSecurityFtdcOrderField *pOrder)
-//{
-// OnOrder(pOrder,false);
-//}
-
-void CQueryApi::ReqQryTradingAccount()
-{
- CSecurityFtdcQryTradingAccountField* pBody = (CSecurityFtdcQryTradingAccountField*)m_msgQueue_Query->new_block(sizeof(CSecurityFtdcQryTradingAccountField));
-
- strcpy(pBody->BrokerID, m_RspUserLogin.BrokerID);
- strcpy(pBody->InvestorID, m_RspUserLogin.UserID);
-
- m_msgQueue_Query->Input_NoCopy(RequestType::E_QryTradingAccountField, m_msgQueue_Query, this, 0, 0,
- pBody, sizeof(CSecurityFtdcQryTradingAccountField), nullptr, 0, nullptr, 0);
-}
-
-int CQueryApi::_ReqQryTradingAccount(char type, void* pApi1, void* pApi2, double double1, double double2, void* ptr1, int size1, void* ptr2, int size2, void* ptr3, int size3)
-{
- return m_pApi->ReqQryTradingAccount((CSecurityFtdcQryTradingAccountField*)ptr1, ++m_lRequestID);
-}
-
-void CQueryApi::OnRspQryTradingAccount(CSecurityFtdcTradingAccountField *pTradingAccount, CSecurityFtdcRspInfoField *pRspInfo, int nRequestID, bool bIsLast)
-{
- if (!IsErrorRspInfo(pRspInfo, nRequestID, bIsLast))
- {
- if (pTradingAccount)
- {
- AccountField* pField = (AccountField*)m_msgQueue->new_block(sizeof(AccountField));
-
- strcpy(pField->AccountID, pTradingAccount->AccountID);
- pField->PreBalance = pTradingAccount->PreBalance;
- pField->CurrMargin = pTradingAccount->CurrMargin;
- //pField->CloseProfit = pTradingAccount->CloseProfit;
- //pField->PositionProfit = pTradingAccount->PositionProfit;
- pField->Balance = pTradingAccount->Balance;
- pField->Available = pTradingAccount->Available;
- pField->Deposit = pTradingAccount->Deposit;
- pField->Withdraw = pTradingAccount->Withdraw;
- pField->FrozenTransferFee = pTradingAccount->FrozenTransferFee;
- pField->FrozenStampTax = pTradingAccount->FrozenStampTax;
- pField->FrozenCommission = pTradingAccount->FrozenCommission;
- pField->FrozenCash = pTradingAccount->FrozenCash;
- pField->TransferFee = pTradingAccount->TransferFee;
- pField->StampTax = pTradingAccount->StampTax;
- pField->Commission = pTradingAccount->Commission;
- pField->CashIn = pTradingAccount->CashIn;
-
- m_msgQueue->Input_NoCopy(ResponeType::OnRspQryTradingAccount, m_msgQueue, m_pClass, bIsLast, 0, pField, sizeof(AccountField), nullptr, 0, nullptr, 0);
- }
- else
- {
- m_msgQueue->Input_NoCopy(ResponeType::OnRspQryTradingAccount, m_msgQueue, m_pClass, bIsLast, 0, nullptr, 0, nullptr, 0, nullptr, 0);
- }
- }
-}
-
-void CQueryApi::ReqQryInvestorPosition(const string& szInstrumentId, const string& szExchange)
-{
- CSecurityFtdcQryInvestorPositionField* pBody = (CSecurityFtdcQryInvestorPositionField*)m_msgQueue_Query->new_block(sizeof(CSecurityFtdcQryInvestorPositionField));
-
- strcpy(pBody->BrokerID, m_RspUserLogin.BrokerID);
- strcpy(pBody->InvestorID, m_RspUserLogin.UserID);
- strncpy(pBody->InstrumentID, szInstrumentId.c_str(), sizeof(TSecurityFtdcInstrumentIDType));
-
- m_msgQueue_Query->Input_NoCopy(RequestType::E_QryInvestorPositionField, m_msgQueue_Query, this, 0, 0,
- pBody, sizeof(CSecurityFtdcQryInvestorPositionField), nullptr, 0, nullptr, 0);
-}
-
-int CQueryApi::_ReqQryInvestorPosition(char type, void* pApi1, void* pApi2, double double1, double double2, void* ptr1, int size1, void* ptr2, int size2, void* ptr3, int size3)
-{
- return m_pApi->ReqQryInvestorPosition((CSecurityFtdcQryInvestorPositionField*)ptr1, ++m_lRequestID);
-}
-
-// ծعֲNetҹൽLongУֱӴӳɽзֹ鵽Net
-// пƽͶͶǿ
-void CQueryApi::OnRspQryInvestorPosition(CSecurityFtdcInvestorPositionField *pInvestorPosition, CSecurityFtdcRspInfoField *pRspInfo, int nRequestID, bool bIsLast)
-{
- if (!IsErrorRspInfo(pRspInfo, nRequestID, bIsLast))
- {
- if (pInvestorPosition)
- {
- PositionIDType positionId = { 0 };
- sprintf(positionId, "%s:%s:%d:%d",
- pInvestorPosition->InstrumentID, pInvestorPosition->ExchangeID,
- TSecurityFtdcPosiDirectionType_2_PositionSide(pInvestorPosition->PosiDirection), TSecurityFtdcHedgeFlagType_2_HedgeFlagType(pInvestorPosition->HedgeFlag));
-
- PositionField* pField = nullptr;
- unordered_map::iterator it = m_id_platform_position.find(positionId);
- if (it == m_id_platform_position.end())
- {
- pField = (PositionField*)m_msgQueue->new_block(sizeof(PositionField));
-
- sprintf(pField->Symbol, "%s.%s", pInvestorPosition->InstrumentID, pInvestorPosition->ExchangeID);
- strcpy(pField->InstrumentID, pInvestorPosition->InstrumentID);
- strcpy(pField->ExchangeID, pInvestorPosition->ExchangeID);
- pField->Side = TSecurityFtdcPosiDirectionType_2_PositionSide(pInvestorPosition->PosiDirection);
- pField->HedgeFlag = TSecurityFtdcHedgeFlagType_2_HedgeFlagType(pInvestorPosition->HedgeFlag);
-
- m_id_platform_position.insert(pair(positionId, pField));
- }
- else
- {
- pField = it->second;
- }
-
- pField->Position = pInvestorPosition->Position;
- pField->TodayPosition = pInvestorPosition->TodayPosition;
- pField->HistoryPosition = pInvestorPosition->YdPosition;
-
- // ռȫٱ֪ͨһ
- if (bIsLast)
- {
- int cnt = 0;
- int count = m_id_platform_position.size();
- for (unordered_map::iterator iter = m_id_platform_position.begin(); iter != m_id_platform_position.end(); iter++)
- {
- ++cnt;
- m_msgQueue->Input_Copy(ResponeType::OnRspQryInvestorPosition, m_msgQueue, m_pClass, cnt == count, 0, iter->second, sizeof(PositionField), nullptr, 0, nullptr, 0);
- }
- }
- }
- }
-}
-
-void CQueryApi::ReqQryInstrument(const string& szInstrumentId, const string& szExchange)
-{
- CSecurityFtdcQryInstrumentField* pBody = (CSecurityFtdcQryInstrumentField*)m_msgQueue_Query->new_block(sizeof(CSecurityFtdcQryInstrumentField));
-
- strncpy(pBody->InstrumentID, szInstrumentId.c_str(), sizeof(TSecurityFtdcInstrumentIDType));
- strncpy(pBody->ExchangeID, szExchange.c_str(), sizeof(TSecurityFtdcExchangeIDType));
-
- m_msgQueue_Query->Input_NoCopy(RequestType::E_QryInstrumentField, m_msgQueue_Query, this, 0, 0,
- pBody, sizeof(CSecurityFtdcQryInstrumentField), nullptr, 0, nullptr, 0);
-}
-
-int CQueryApi::_ReqQryInstrument(char type, void* pApi1, void* pApi2, double double1, double double2, void* ptr1, int size1, void* ptr2, int size2, void* ptr3, int size3)
-{
- return m_pApi->ReqQryInstrument((CSecurityFtdcQryInstrumentField*)ptr1, ++m_lRequestID);
-}
-
-void CQueryApi::OnRspQryInstrument(CSecurityFtdcInstrumentField *pInstrument, CSecurityFtdcRspInfoField *pRspInfo, int nRequestID, bool bIsLast)
-{
- if (!IsErrorRspInfo(pRspInfo, nRequestID, bIsLast))
- {
- if (pInstrument)
- {
- InstrumentField* pField = (InstrumentField*)m_msgQueue->new_block(sizeof(InstrumentField));
-
- strncpy(pField->InstrumentID, pInstrument->InstrumentID, sizeof(InstrumentIDType));
- strncpy(pField->ExchangeID, pInstrument->ExchangeID, sizeof(ExchangeIDType));
-
- sprintf(pField->Symbol,"%s.%s",pInstrument->InstrumentID,pInstrument->ExchangeID);
- sprintf(pField->InstrumentName, "%s(%s)", pInstrument->ExchangeInstID, pInstrument->InstrumentName);
- strncpy(pField->ProductID, pInstrument->ProductID, sizeof(InstrumentIDType));
-
- //strncpy(pField->InstrumentName, pInstrument->InstrumentName, sizeof(InstrumentNameType));
- pField->Type = CSecurityFtdcInstrumentField_2_InstrumentType(pInstrument);
- pField->VolumeMultiple = pInstrument->VolumeMultiple;
- pField->PriceTick = CSecurityFtdcInstrumentField_2_PriceTick(pInstrument);
- pField->ExpireDate = GetDate(pInstrument->ExpireDate);
- pField->OptionsType = CSecurityFtdcInstrumentField_2_PutCall(pInstrument);
- pField->StrikePrice = pInstrument->ExecPrice;
-
-
- // Ȩı
- if (strlen(pInstrument->InstrumentID) == 8)
- {
- strncpy(pField->UnderlyingInstrID, pInstrument->ExchangeInstID, 6);
- sprintf(&pField->UnderlyingInstrID[6], ".%s", pInstrument->ExchangeID);
- }
-
-
- m_msgQueue->Input_NoCopy(ResponeType::OnRspQryInstrument, m_msgQueue, m_pClass, bIsLast, 0, pField, sizeof(InstrumentField), nullptr, 0, nullptr, 0);
- }
- else
- {
- m_msgQueue->Input_NoCopy(ResponeType::OnRspQryInstrument, m_msgQueue, m_pClass, bIsLast, 0, nullptr, 0, nullptr, 0, nullptr, 0);
- }
- }
-}
-//
-//void CTraderApi::ReqQryInstrumentCommissionRate(const string& szInstrumentId)
-//{
-// if (nullptr == m_pApi)
-// return;
-//
-// SRequest* pRequest = MakeRequestBuf(E_QryInstrumentCommissionRateField);
-// if (nullptr == pRequest)
-// return;
-//
-// CSecurityFtdcQryInstrumentCommissionRateField& body = pRequest->QryInstrumentCommissionRateField;
-//
-// strncpy(body.BrokerID, m_RspUserLogin.BrokerID,sizeof(TSecurityFtdcBrokerIDType));
-// strncpy(body.InvestorID, m_RspUserLogin.UserID,sizeof(TSecurityFtdcInvestorIDType));
-// strncpy(body.InstrumentID,szInstrumentId.c_str(),sizeof(TSecurityFtdcInstrumentIDType));
-//
-// AddToSendQueue(pRequest);
-//}
-//
-//void CTraderApi::OnRspQryInstrumentCommissionRate(CSecurityFtdcInstrumentCommissionRateField *pInstrumentCommissionRate, CSecurityFtdcRspInfoField *pRspInfo, int nRequestID, bool bIsLast)
-//{
-// //if(m_msgQueue)
-// // m_msgQueue->Input_OnRspQryInstrumentCommissionRate(this,pInstrumentCommissionRate,pRspInfo,nRequestID,bIsLast);
-//
-// if (bIsLast)
-// ReleaseRequestMapBuf(nRequestID);
-//}
-
-void CQueryApi::OnRspError(CSecurityFtdcRspInfoField *pRspInfo, int nRequestID, bool bIsLast)
-{
- IsErrorRspInfo(pRspInfo, nRequestID, bIsLast);
-}
-
-void CQueryApi::ReqQryOrder()
-{
- CSecurityFtdcQryOrderField* pBody = (CSecurityFtdcQryOrderField*)m_msgQueue_Query->new_block(sizeof(CSecurityFtdcQryOrderField));
-
- strncpy(pBody->BrokerID, m_RspUserLogin.BrokerID, sizeof(TSecurityFtdcBrokerIDType));
- strncpy(pBody->InvestorID, m_RspUserLogin.UserID, sizeof(TSecurityFtdcInvestorIDType));
-
- m_msgQueue_Query->Input_NoCopy(RequestType::E_QryOrderField, m_msgQueue_Query, this, 0, 0,
- pBody, sizeof(CSecurityFtdcQryOrderField), nullptr, 0, nullptr, 0);
-}
-
-int CQueryApi::_ReqQryOrder(char type, void* pApi1, void* pApi2, double double1, double double2, void* ptr1, int size1, void* ptr2, int size2, void* ptr3, int size3)
-{
- return m_pApi->ReqQryOrder((CSecurityFtdcQryOrderField*)ptr1, ++m_lRequestID);
-}
-
-void CQueryApi::OnOrder(CSecurityFtdcOrderField *pOrder, bool bFromQry)
-{
- if (nullptr == pOrder)
- return;
-
- OrderIDType orderId = { 0 };
- sprintf(orderId, "%d:%d:%s", pOrder->FrontID, pOrder->SessionID, pOrder->OrderRef);
- OrderIDType orderSydId = { 0 };
-
- {
- // ԭʼϢڳ
-
- unordered_map::iterator it = m_id_api_order.find(orderId);
- if (it == m_id_api_order.end())
- {
- // Ҳ˶ʾµ
- CSecurityFtdcOrderField* pField = new CSecurityFtdcOrderField();
- memcpy(pField, pOrder, sizeof(CSecurityFtdcOrderField));
- m_id_api_order.insert(pair(orderId, pField));
- }
- else
- {
- // ҵ˶
- // ҪٸƱһε״ֻ̬Ҫһεڳɣ£ñȽ
- CSecurityFtdcOrderField* pField = it->second;
- memcpy(pField, pOrder, sizeof(CSecurityFtdcOrderField));
- }
-
- // SysIDڶɽر붩
- sprintf(orderSydId, "%s:%s", pOrder->ExchangeID, pOrder->OrderSysID);
- m_sysId_orderId.insert(pair(orderSydId, orderId));
- }
-
- {
- // APIĶתԼĽṹ
-
- OrderField* pField = nullptr;
- unordered_map::iterator it = m_id_platform_order.find(orderId);
- if (it == m_id_platform_order.end())
- {
- // ʱϢûУҲӦĵӣҪOrderĻָ
- pField = (OrderField*)m_msgQueue->new_block(sizeof(OrderField));
-
- strcpy(pField->ID, orderId);
- strcpy(pField->InstrumentID, pOrder->InstrumentID);
- strcpy(pField->ExchangeID, pOrder->ExchangeID);
- pField->HedgeFlag = TSecurityFtdcHedgeFlagType_2_HedgeFlagType(pOrder->CombHedgeFlag[0]);
- pField->Side = TSecurityFtdcDirectionType_2_OrderSide(pOrder->Direction);
- pField->Price = atof(pOrder->LimitPrice);
- pField->StopPx = pOrder->StopPrice;
- strncpy(pField->Text, pOrder->StatusMsg, sizeof(Char256Type));
- pField->OpenClose = TSecurityFtdcOffsetFlagType_2_OpenCloseType(pOrder->CombOffsetFlag[0]);
- pField->Status = CSecurityFtdcOrderField_2_OrderStatus(pOrder);
- pField->Qty = pOrder->VolumeTotalOriginal;
- pField->Type = CSecurityFtdcOrderField_2_OrderType(pOrder);
- pField->TimeInForce = CSecurityFtdcOrderField_2_TimeInForce(pOrder);
- pField->ExecType = ExecType::ExecType_New;
- strcpy(pField->OrderID, pOrder->OrderSysID);
-
-
- // ӵmapУߵĶȡʧʱ֪ͨ
- m_id_platform_order.insert(pair(orderId, pField));
- }
- else
- {
- pField = it->second;
- strcpy(pField->ID, orderId);
- pField->LeavesQty = pOrder->VolumeTotal;
- pField->Price = atof(pOrder->LimitPrice);
- pField->Status = CSecurityFtdcOrderField_2_OrderStatus(pOrder);
- pField->ExecType = CSecurityFtdcOrderField_2_ExecType(pOrder);
- strcpy(pField->OrderID, pOrder->OrderSysID);
- strncpy(pField->Text, pOrder->StatusMsg, sizeof(Char256Type));
- }
-
- m_msgQueue->Input_Copy(ResponeType::OnRtnOrder, m_msgQueue, m_pClass, 0, 0, pField, sizeof(OrderField), nullptr, 0, nullptr, 0);
- }
-}
-
-void CQueryApi::OnRspQryOrder(CSecurityFtdcOrderField *pOrder, CSecurityFtdcRspInfoField *pRspInfo, int nRequestID, bool bIsLast)
-{
- if (!IsErrorRspInfo(pRspInfo, nRequestID, bIsLast))
- {
- OnOrder(pOrder, true);
- }
-}
-
-void CQueryApi::ReqQryTrade()
-{
- CSecurityFtdcQryTradeField* pBody = (CSecurityFtdcQryTradeField*)m_msgQueue_Query->new_block(sizeof(CSecurityFtdcQryTradeField));
-
- strcpy(pBody->BrokerID, m_RspUserLogin.BrokerID);
- strcpy(pBody->InvestorID, m_RspUserLogin.UserID);
-
- m_msgQueue_Query->Input_NoCopy(RequestType::E_QryTradeField, m_msgQueue_Query, this, 0, 0,
- pBody, sizeof(CSecurityFtdcQryTradeField), nullptr, 0, nullptr, 0);
-}
-
-int CQueryApi::_ReqQryTrade(char type, void* pApi1, void* pApi2, double double1, double double2, void* ptr1, int size1, void* ptr2, int size2, void* ptr3, int size3)
-{
- return m_pApi->ReqQryTrade((CSecurityFtdcQryTradeField*)ptr1, ++m_lRequestID);
-}
-
-void CQueryApi::OnTrade(CSecurityFtdcTradeField *pTrade, bool bFromQry)
-{
- if (nullptr == pTrade)
- return;
-
- TradeField* pField = (TradeField*)m_msgQueue->new_block(sizeof(TradeField));
-
- strcpy(pField->InstrumentID, pTrade->InstrumentID);
- strcpy(pField->ExchangeID, pTrade->ExchangeID);
- pField->Side = TSecurityFtdcDirectionType_2_OrderSide(pTrade->Direction);
- pField->Qty = pTrade->Volume;
- pField->Price = atof(pTrade->Price);
- pField->OpenClose = TSecurityFtdcOffsetFlagType_2_OpenCloseType(pTrade->OffsetFlag);
- pField->HedgeFlag = TSecurityFtdcHedgeFlagType_2_HedgeFlagType(pTrade->HedgeFlag);
- pField->Commission = 0;//TODOԺҪ
- pField->Time = GetTime(pTrade->TradeTime);
- strcpy(pField->TradeID, pTrade->TradeID);
-
- OrderIDType orderSysId = { 0 };
- sprintf(orderSysId, "%s:%s", pTrade->ExchangeID, pTrade->OrderSysID);
- unordered_map::iterator it = m_sysId_orderId.find(orderSysId);
- if (it == m_sysId_orderId.end())
- {
- // ˳ɽҲӦı
- //assert(false);
- }
- else
- {
- // ҵӦı
- strcpy(pField->ID, it->second.c_str());
-
- m_msgQueue->Input_Copy(ResponeType::OnRtnTrade, m_msgQueue, m_pClass, 0, 0, pField, sizeof(TradeField), nullptr, 0, nullptr, 0);
-
- unordered_map::iterator it2 = m_id_platform_order.find(it->second);
- if (it2 == m_id_platform_order.end())
- {
- // ˳ɽҲӦı
- //assert(false);
- }
- else
- {
- // ¶״̬
- // ǷҪ֪ͨӿ
- }
-
- OnTrade(pField, bFromQry);
- }
-}
-
-void CQueryApi::OnTrade(TradeField *pTrade, bool bFromQry)
-{
- PositionIDType positionId = { 0 };
- sprintf(positionId, "%s:%s:%d:%d",
- pTrade->InstrumentID, pTrade->ExchangeID, TradeField_2_PositionSide(pTrade), pTrade->HedgeFlag);
-
- PositionField* pField = nullptr;
- unordered_map::iterator it = m_id_platform_position.find(positionId);
- if (it == m_id_platform_position.end())
- {
- pField = (PositionField*)m_msgQueue->new_block(sizeof(PositionField));
-
- sprintf(pField->Symbol, "%s.%s", pTrade->InstrumentID, pTrade->ExchangeID);
- strcpy(pField->InstrumentID, pTrade->InstrumentID);
- strcpy(pField->ExchangeID, pTrade->ExchangeID);
- pField->Side = TradeField_2_PositionSide(pTrade);
- pField->HedgeFlag = TSecurityFtdcHedgeFlagType_2_HedgeFlagType(pTrade->HedgeFlag);
-
- m_id_platform_position.insert(pair(positionId, pField));
- }
- else
- {
- pField = it->second;
- }
-
- if (pTrade->Side == OrderSide::OrderSide_Buy)
- {
- pField->Position += pTrade->Qty;
- pField->TodayPosition += pTrade->Qty;
- }
- else
- {
- pField->Position -= pTrade->Qty;
- if (pTrade->OpenClose == OpenCloseType::OpenCloseType_CloseToday)
- {
- pField->TodayPosition -= pTrade->Qty;
- }
- else
- {
- pField->HistoryPosition -= pTrade->Qty;
- // ıɸӽ쿪ʼ
- if (pField->HistoryPosition<0)
- {
- pField->TodayPosition += pField->HistoryPosition;
- pField->HistoryPosition = 0;
- }
- }
-
- // ֱ²ѯ
- if (pField->Position < 0 || pField->TodayPosition < 0 || pField->HistoryPosition < 0)
- {
- ReqQryInvestorPosition("", "");
- return;
- }
- }
-
- m_msgQueue->Input_Copy(ResponeType::OnRspQryInvestorPosition, m_msgQueue, m_pClass, false, 0, pField, sizeof(PositionField), nullptr, 0, nullptr, 0);
-}
-
-void CQueryApi::OnRspQryTrade(CSecurityFtdcTradeField *pTrade, CSecurityFtdcRspInfoField *pRspInfo, int nRequestID, bool bIsLast)
-{
- if (!IsErrorRspInfo(pRspInfo, nRequestID, bIsLast))
- {
- OnTrade(pTrade,true);
- }
-}
-
-void CQueryApi::ReqQryInvestor()
-{
- CSecurityFtdcQryInvestorField* pBody = (CSecurityFtdcQryInvestorField*)m_msgQueue_Query->new_block(sizeof(CSecurityFtdcQryInvestorField));
-
- strncpy(pBody->BrokerID, m_RspUserLogin.BrokerID, sizeof(TSecurityFtdcBrokerIDType));
- strncpy(pBody->InvestorID, m_RspUserLogin.UserID, sizeof(TSecurityFtdcInvestorIDType));
-
- m_msgQueue_Query->Input_NoCopy(RequestType::E_QryInvestorField, m_msgQueue_Query, this, 0, 0,
- pBody, sizeof(CSecurityFtdcQryInvestorField), nullptr, 0, nullptr, 0);
-}
-
-int CQueryApi::_ReqQryInvestor(char type, void* pApi1, void* pApi2, double double1, double double2, void* ptr1, int size1, void* ptr2, int size2, void* ptr3, int size3)
-{
- return m_pApi->ReqQryInvestor((CSecurityFtdcQryInvestorField*)ptr1, ++m_lRequestID);
-}
-
-void CQueryApi::OnRspQryInvestor(CSecurityFtdcInvestorField *pInvestor, CSecurityFtdcRspInfoField *pRspInfo, int nRequestID, bool bIsLast)
-{
- if (!IsErrorRspInfo(pRspInfo, nRequestID, bIsLast))
- {
- if (pInvestor)
- {
- memcpy(&m_Investor, pInvestor, sizeof(CSecurityFtdcInvestorField));
-
- InvestorField* pField = (InvestorField*)m_msgQueue->new_block(sizeof(InvestorField));
-
- strcpy(pField->BrokerID, pInvestor->BrokerID);
- strcpy(pField->InvestorID, pInvestor->InvestorID);
- strcpy(pField->InvestorName, pInvestor->InvestorName);
- strcpy(pField->IdentifiedCardNo, pInvestor->IdentifiedCardNo);
- pField->IdentifiedCardType = TSecurityFtdcIdCardTypeType_2_IdCardType(pInvestor->IdentifiedCardType);
-
- m_msgQueue->Input_NoCopy(ResponeType::OnRspQryInvestor, m_msgQueue, m_pClass, bIsLast, 0, pField, sizeof(InvestorField), nullptr, 0, nullptr, 0);
- }
- else
- {
- m_msgQueue->Input_NoCopy(ResponeType::OnRspQryInvestor, m_msgQueue, m_pClass, bIsLast, 0, nullptr, 0, nullptr, 0, nullptr, 0);
- }
- }
-}
diff --git a/QuantBox_LTS_Query_v2/main.cpp b/QuantBox_LTS_Query_v2/main.cpp
deleted file mode 100644
index a10d50f..0000000
--- a/QuantBox_LTS_Query_v2/main.cpp
+++ /dev/null
@@ -1,73 +0,0 @@
-#include "stdafx.h"
-#include "../include/ApiHeader.h"
-#include "../include/QueueEnum.h"
-#include "QueryApi.h"
-
-inline CQueryApi* GetApi(void* pApi)
-{
- return static_cast(pApi);
-}
-
-void* __stdcall XRequest(char type, void* pApi1, void* pApi2, double double1, double double2, void* ptr1, int size1, void* ptr2, int size2, void* ptr3, int size3)
-{
- RequestType rt = (RequestType)type;
- switch (rt)
- {
- case GetApiType:
- return (void*)(ApiType::ApiType_Query | ApiType::ApiType_Instrument);
- case GetApiVersion:
- return (void*)"0.1.0.20151116";
- case GetApiName:
- return (void*)"LTS2";
- case Create:
- return new CQueryApi();
- default:
- break;
- }
-
- if (pApi1 == nullptr)
- {
- return nullptr;
- }
-
- CQueryApi* pApi = GetApi(pApi1);
-
- switch (rt)
- {
- case Release:
- delete pApi;
- return nullptr;
- case Register:
- pApi->Register(ptr1, ptr2);
- break;
- case Connect:
- pApi->Connect((const char*)ptr3, (ServerInfoField*)ptr1, (UserInfoField*)ptr2);
- break;
- case Disconnect:
- pApi->Disconnect();
- break;
- case ReqQryInstrument:
- pApi->ReqQryInstrument((const char*)ptr1, (const char*)ptr2);
- break;
- case ReqQryTradingAccount:
- pApi->ReqQryTradingAccount();
- break;
- case ReqQryInvestorPosition:
- pApi->ReqQryInvestorPosition((const char*)ptr1, (const char*)ptr2);
- break;
- //case ReqQrySettlementInfo:
- // pApi->ReqQrySettlementInfo((const char*)ptr1);
- // break;
- //case ReqOrderInsert:
- // return (void*)pApi->ReqOrderInsert((OrderField*)ptr1, size1, (OrderIDType*)ptr2);
- // //case ReqQuoteInsert:
- // // return (void*)pApi->ReqQuoteInsert((int)double1, (OrderField*)ptr1, (OrderField*)ptr2);
- //case ReqOrderAction:
- // return (void*)pApi->ReqOrderAction((OrderIDType*)ptr1, size1, (OrderIDType*)ptr2);
- // break;
- default:
- break;
- }
-
- return pApi1;
-}
diff --git a/QuantBox_Queue/MsgQueue.cpp b/QuantBox_Queue/MsgQueue.cpp
deleted file mode 100644
index 50df4a4..0000000
--- a/QuantBox_Queue/MsgQueue.cpp
+++ /dev/null
@@ -1,115 +0,0 @@
-#include "stdafx.h"
-#include "MsgQueue.h"
-
-CMsgQueue::CMsgQueue()//:m_queue(1024)
-{
- m_hThread = nullptr;
- m_bRunning = false;
- m_bDirectOutput = false;
-
- //回调函数地址指针
- m_fnOnRespone = nullptr;
-}
-
-void CMsgQueue::Clear()
-{
- ResponeItem* pItem = nullptr;
- //清空队列
- while (m_queue.try_dequeue(pItem))
- {
- if (pItem->bNeedDelete)
- {
- delete[] pItem->ptr1;
- delete[] pItem->ptr2;
- delete[] pItem->ptr3;
- }
- delete pItem;
- }
-}
-
-bool CMsgQueue::Process()
-{
- ResponeItem* pItem = nullptr;
- if (m_queue.try_dequeue(pItem))
- {
- Output(pItem);
- if (pItem->bNeedDelete)
- {
- // 删除的是数组,目前是自己模块创建的自己删
- delete[] pItem->ptr1;
- delete[] pItem->ptr2;
- delete[] pItem->ptr3;
- }
- delete pItem;
- return true;
- }
- return false;
-}
-
-void CMsgQueue::Output(ResponeItem* pItem)
-{
- try
- {
- if (m_fnOnRespone)
- (*m_fnOnRespone)(pItem->type, pItem->pApi1, pItem->pApi2, pItem->double1, pItem->double2, pItem->ptr1, pItem->size1, pItem->ptr2, pItem->size2, pItem->ptr3, pItem->size3);
- }
- catch (...)
- {
- m_fnOnRespone = nullptr;
- }
-}
-
-void CMsgQueue::StartThread()
-{
- if(nullptr == m_hThread)
- {
- m_bRunning = true;
- m_hThread = new thread(ProcessThread,this);
- }
-}
-
-void CMsgQueue::StopThread()
-{
- m_bRunning = false;
- this_thread::sleep_for(chrono::milliseconds(1));
- m_cv.notify_all();
- this_thread::sleep_for(chrono::milliseconds(1));
- lock_guard cl(m_mtx_del);
- if(m_hThread)
- {
- //m_cv.notify_all();
- m_hThread->join();
- delete m_hThread;
- m_hThread = nullptr;
- }
-}
-
-
-void CMsgQueue::RunInThread()
-{
- while (m_bRunning)
- {
- if (Process())
- {
- }
- else
- {
- // 空闲时等1ms,如果立即有事件过来就晚了1ms
- //this_thread::sleep_for(chrono::milliseconds(1));
-
- // 空闲时过来等1ms,没等到就回去再试
- // 如过正好等到了,就立即去试,应当会快一点吧?
- unique_lock lck(m_mtx);
- m_cv.wait_for(lck, std::chrono::seconds(1), [this]{return m_bRunning == false; });
- }
- }
-
- // 清理线程
- m_hThread = nullptr;
- m_bRunning = false;
-}
-
-ConfigInfoField* CMsgQueue::Config(ConfigInfoField* pConfigInfo)
-{
- return nullptr;
-}
diff --git a/QuantBox_Tdx_Trade/Struct.h b/QuantBox_Tdx_Trade/Struct.h
deleted file mode 100644
index 4124838..0000000
--- a/QuantBox_Tdx_Trade/Struct.h
+++ /dev/null
@@ -1,87 +0,0 @@
-#pragma once
-
-/*
-120_ͻ|134_|121_ʽʺ|125_ʺ|123_ɶ|110_ίзʽ|1207
-_ʼ|1227_|101_|5250_ͻȺ|5251_ͻӪҵ|5252_Ӳк
-|5253_CPUID|5254_ýױʶ|5255_Ự|5256_ͻ|
-===============
-143_ίʱ|123_ɶ|140_֤ȯ|141_֤ȯ|130_־|131_־|10
-0_|145_ίм۸|144_ί|153_ɽ۸|152_ɽ|162_|14
-6_ίб|194_۷ʽ|147_״̬˵|161_ʽ|1213_Ϣ|
-*/
-//#define REQUEST_DRWT 1102 // ί
-
-/*
-120_ͻ|134_|121_ʽʺ|125_ʺ|123_ɶ|110_ίзʽ|126_
-ʼ|127_ֹ|1207_ʼ|140_֤ȯ|1227_|5250_ͻȺ|5251_
-Ӫҵ|5252_Ӳк|5253_CPUID|5254_ýױʶ|5255_Ự|5256_ͻ|
-
-===============
-142_ί|123_ɶ|140_֤ȯ|141_֤ȯ|130_־|131_־|10
-0_|145_ίм۸|144_ί|153_ɽ۸|152_ɽ|162_|14
-6_ίб|194_۷ʽ|161_ʽ|1213_Ϣ|
-*/
-//#define REQUEST_LSWT 1104 // ʷί
-
-struct WTLB_STRUCT
-{
- int WTRQ; // 142_ί
- int WTSJ; // 143_ίʱ
- char GDDM[32]; // 123_ɶ
- char ZQDM[32]; // 140_֤ȯ
- char ZQMC[32]; // 141_֤ȯ
- int MMBZ; // 130_־
- int WTLB; // 131_ί
- int JYSDM; // 100_
- double WTJG; // 145_ίм۸
- int WTSL; // 144_ί
- double CJJG; // 153_ɽ۸
- int CDSL; // 162_
- char WTBH[32]; // 146_ίб
- int BJFS; // 194_۷ʽ
- double DJZJ; // 161_ʽ
-};
-
-
-/*
-120_ͻ|134_|121_ʽʺ|125_ʺ|123_ɶ|110_ίзʽ|1207
-_ʼ|155_ɽ|101_|5250_ͻȺ|5251_ͻӪҵ|5252_Ӳ
-к|5253_CPUID|5254_ýױʶ|5255_Ự|5256_ͻ|
-===============
-151_ɽʱ|123_ɶ|140_֤ȯ|141_֤ȯ|130_־|131_־|15
-3_ɽ۸|152_ɽ|303_|155_ɽ|167_־|146_ίб|1213
-_Ϣ|
-*/
-//#define REQUEST_DRCJ 1108 // ճɽ
-/*
-120_ͻ|134_|121_ʽʺ|125_ʺ|123_ɶ|110_ίзʽ|126_
-ʼ|127_ֹ|1207_ʼ|140_֤ȯ|101_|5250_ͻȺ|52
-51_ͻӪҵ|5252_Ӳк|5253_CPUID|5254_ýױʶ|5255_Ự|5256_ͻ
-|
-===============
-150_ɽ|151_ɽʱ|123_ɶ|140_֤ȯ|141_֤ȯ|130_־|13
-1_־|153_ɽ۸|152_ɽ|303_|304_ʣ|206_Ӷ|210_ӡ
-˰|207_|208_ɽ|155_ɽ|146_ίб|1213_Ϣ|
-*/
-//#define REQUEST_LSCJ 1110 // ʷɽ
-
-struct CJLB_STRUCT
-{
- int CJRQ; // 150_ɽ
- int CJSJ; // 151_ɽʱ
- char GDDM[32]; // 123_ɶ
- char ZQDM[32]; // 140_֤ȯ
- char ZQMC[32]; // 141_֤ȯ
- int MMBZ; // 130_־
- int WTLB; // 131_ί
- double CJJG; // 153_ɽ۸
- int CJSL; // 152_ɽ
- double FSJE; // 303_
- double SYJE; // 304_ʣ
- double YJ; // 206_Ӷ
- double YHS; // 210_ӡ˰
- double GHF; // 207_
- double CJF; // 208_ɽ
- char CJBH[32]; // 155_ɽ
- char WTBH[32]; // 146_ίб
-};
\ No newline at end of file
diff --git a/QuantBox_Tdx_Trade/TraderApi.cpp b/QuantBox_Tdx_Trade/TraderApi.cpp
deleted file mode 100644
index 0bcd833..0000000
--- a/QuantBox_Tdx_Trade/TraderApi.cpp
+++ /dev/null
@@ -1,1420 +0,0 @@
-#include "stdafx.h"
-#include "TraderApi.h"
-
-#include "../include/QueueEnum.h"
-#include "../include/QueueHeader.h"
-
-#include "../include/ApiHeader.h"
-#include "../include/ApiStruct.h"
-
-#include "../include/ApiProcess.h"
-#include "../include/toolkit.h"
-
-#include "../QuantBox_Queue/MsgQueue.h"
-
-#include "TypeConvert.h"
-
-#include "../include/Tdx/tdx_function.h"
-
-#include
-#include
-
-
-void* __stdcall Query(char type, void* pApi1, void* pApi2, double double1, double double2, void* ptr1, int size1, void* ptr2, int size2, void* ptr3, int size3)
-{
- // 由内部调用,不用检查是否为空
- CTraderApi* pApi = (CTraderApi*)pApi2;
- pApi->QueryInThread(type, pApi1, pApi2, double1, double2, ptr1, size1, ptr2, size2, ptr3, size3);
- return nullptr;
-}
-
-void CTraderApi::QueryInThread(char type, void* pApi1, void* pApi2, double double1, double double2, void* ptr1, int size1, void* ptr2, int size2, void* ptr3, int size3)
-{
- int iRet = 0;
- switch (type)
- {
- case E_Init:
- iRet = _Init();
- break;
- case E_ReqUserLoginField:
- iRet = _ReqUserLogin(type, pApi1, pApi2, double1, double2, ptr1, size1, ptr2, size2, ptr3, size3);
- break;
- case E_InputOrderField:
- iRet = _ReqOrderInsert(type, pApi1, pApi2, double1, double2, ptr1, size1, ptr2, size2, ptr3, size3);
- break;
- case E_InputOrderActionField:
- iRet = _ReqOrderAction(type, pApi1, pApi2, double1, double2, ptr1, size1, ptr2, size2, ptr3, size3);
- break;
- case E_QryDepthMarketDataField:
- iRet = _Subscribe(type, pApi1, pApi2, double1, double2, ptr1, size1, ptr2, size2, ptr3, size3);
- break;
-
- case QueryType::ReqQryOrder :
- iRet = _ReqQryOrder(type, pApi1, pApi2, double1, double2, ptr1, size1, ptr2, size2, ptr3, size3);
- break;
- case QueryType::ReqQryTrade:
- iRet = _ReqQryTrade(type, pApi1, pApi2, double1, double2, ptr1, size1, ptr2, size2, ptr3, size3);
- break;
- case QueryType::ReqQryInvestor:
- iRet = _ReqQryInvestor(type, pApi1, pApi2, double1, double2, ptr1, size1, ptr2, size2, ptr3, size3);
- break;
- case QueryType::ReqQryTradingAccount:
- iRet = _ReqQryTradingAccount(type, pApi1, pApi2, double1, double2, ptr1, size1, ptr2, size2, ptr3, size3);
- break;
- case QueryType::ReqQryInvestorPosition:
- iRet = _ReqQryInvestorPosition(type, pApi1, pApi2, double1, double2, ptr1, size1, ptr2, size2, ptr3, size3);
- break;
-
- default:
- break;
- }
-
- if (0 == iRet)
- {
- //返回成功,填加到已发送池
- m_nSleep = 1;
- }
- else
- {
- m_msgQueue_Query->Input_Copy(type, pApi1, pApi2, double1, double2, ptr1, size1, ptr2, size2, ptr3, size3);
- //失败,按4的幂进行延时,但不超过1s
- m_nSleep *= 4;
- m_nSleep %= 1023;
- }
- this_thread::sleep_for(chrono::milliseconds(m_nSleep));
-}
-
-void* __stdcall Test(char type, void* pApi1, void* pApi2, double double1, double double2, void* ptr1, int size1, void* ptr2, int size2, void* ptr3, int size3)
-{
- // 由内部调用,不用检查是否为空
- CTraderApi* pApi = (CTraderApi*)pApi2;
- pApi->TestInThread(type, pApi1, pApi2, double1, double2, ptr1, size1, ptr2, size2, ptr3, size3);
- return nullptr;
-}
-
-void CTraderApi::TestInThread(char type, void* pApi1, void* pApi2, double double1, double double2, void* ptr1, int size1, void* ptr2, int size2, void* ptr3, int size3)
-{
- int iRet = 0;
- bool bQryOrder = false;
- bool bQryTrade = false;
- //bool bQryInvestor = false;
-
- time_t _now = time(nullptr);
-
- // 想在整点时查询一下,因为整点时交易所和柜台变状态的可能性比较大这样
-
- if (_now > m_QueryOrderTime)
- {
- bQryOrder = true;
- }
- else
- {
-
- }
-
- if (_now > m_QueryTradeTime)
- {
- bQryTrade = true;
- }
- else
- {
-
- }
-
- //if (_now > m_QueryGDLBTime)
- //{
- // bQryInvestor = true;
- //}
- //else
- //{
-
- //}
-
- //if (bQryInvestor)
- //{
- // double _queryTime = QUERY_TIME_MAX * 60;
- // m_QueryGDLBTime = time(nullptr) + _queryTime;
- // OutputQueryTime(m_QueryGDLBTime, _queryTime, "QueryInvestor");
-
- // ReqQryInvestor();
- //}
-
- if (bQryOrder)
- {
- double _queryTime = QUERY_TIME_MAX;
- m_QueryOrderTime = time(nullptr) + _queryTime;
- OutputQueryTime(m_QueryOrderTime, _queryTime, "QueryOrder");
-
- ReqQryOrder();
- }
-
- if (bQryTrade)
- {
- double _queryTime = QUERY_TIME_MAX;
- m_QueryTradeTime = time(nullptr) + _queryTime;
- OutputQueryTime(m_QueryTradeTime, _queryTime, "QueryTrade");
-
- ReqQryTrade();
- }
-
- this_thread::sleep_for(chrono::milliseconds(1000));
- m_msgQueue_Test->Input_Copy(type, pApi1, pApi2, double1, double2, ptr1, size1, ptr2, size2, ptr3, size3);
-}
-
-void CTraderApi::OutputQueryTime(time_t t, double db, const char* szSource)
-{
- LogField* pField = (LogField*)m_msgQueue->new_block(sizeof(LogField));
-
- sprintf(pField->Message, "Source:%s,Add:%d,Time:%s", szSource,(int)db, ctime(&t));
-
- // 去了最后的回车
- int len = strlen(pField->Message);
- pField->Message[len - 1] = 0;
-
- m_msgQueue->Input_NoCopy(ResponeType::OnLog, m_msgQueue, m_pClass, true, 0, pField, sizeof(LogField), nullptr, 0, nullptr, 0);
-}
-
-
-int CTraderApi::_Init()
-{
- if (m_pApi == nullptr)
- {
- m_pApi = CTdxApi::CreateApi(m_ServerInfo.ExtInfoChar128);
- }
-
- Error_STRUCT* pErr = nullptr;
-
- m_pApi->LoadScript(m_ServerInfo.Address, true, false);
- m_pApi->Init(m_ServerInfo.ExtInfoChar128, &pErr);
-
- if (pErr)
- {
- RspUserLoginField* pField = (RspUserLoginField*)m_msgQueue->new_block(sizeof(RspUserLoginField));
-
- pField->RawErrorID = pErr->ErrCode;
- strcpy(pField->Text, pErr->ErrInfo);
-
- m_msgQueue->Input_NoCopy(ResponeType::OnConnectionStatus, m_msgQueue, m_pClass, ConnectionStatus::ConnectionStatus_Disconnected, 0, pField, sizeof(RspUserLoginField), nullptr, 0, nullptr, 0);
- }
- else
- {
- m_msgQueue->Input_NoCopy(ResponeType::OnConnectionStatus, m_msgQueue, m_pClass, ConnectionStatus::ConnectionStatus_Initialized, 0, nullptr, 0, nullptr, 0, nullptr, 0);
-
- ReqUserLogin();
- }
-
- DeleteError(pErr);
-
- return 0;
-}
-
-void CTraderApi::ReqUserLogin()
-{
- if (m_UserInfo_Pos >= m_UserInfo_Count)
- return;
-
- //STTraderLogin* pBody = (STTraderLogin*)m_msgQueue_Query->new_block(sizeof(STTraderLogin));
-
- //strncpy(pBody->cust_no, m_pUserInfos[m_UserInfo_Pos].UserID, sizeof(TCustNoType));
- //strncpy(pBody->cust_pwd, m_pUserInfos[m_UserInfo_Pos].Password, sizeof(TCustPwdType));
-
- m_msgQueue_Query->Input_NoCopy(RequestType::E_ReqUserLoginField, m_msgQueue_Query, this, 0, 0,
- nullptr, 0, nullptr, 0, nullptr, 0);
-}
-
-int CTraderApi::_ReqUserLogin(char type, void* pApi1, void* pApi2, double double1, double double2, void* ptr1, int size1, void* ptr2, int size2, void* ptr3, int size3)
-{
- char** ppResults = nullptr;
- Error_STRUCT* pErr = nullptr;
-
- m_msgQueue->Input_NoCopy(ResponeType::OnConnectionStatus, m_msgQueue, m_pClass, ConnectionStatus::ConnectionStatus_Logining, 0, nullptr, 0, nullptr, 0, nullptr, 0);
-
- m_pClient = m_pApi->Login(m_UserInfo.UserID, m_UserInfo.Password, m_UserInfo.ExtInfoChar64, &ppResults, &pErr);
-
- if (m_pClient)
- {
- // 有授权信息要输出
- RspUserLoginField* pField = (RspUserLoginField*)m_msgQueue->new_block(sizeof(RspUserLoginField));
- if (pErr)
- {
- pField->RawErrorID = pErr->ErrCode;
- strcpy(pField->Text, pErr->ErrInfo);
- }
-
- m_msgQueue->Input_NoCopy(ResponeType::OnConnectionStatus, m_msgQueue, m_pClass, ConnectionStatus::ConnectionStatus_Logined, 0, pField, sizeof(pField), nullptr, 0, nullptr, 0);
-
- // 以后支持多账号时这地方要改
- m_pApi->SetClient(m_pClient);
- m_pApi->SetAccount(m_UserInfo.UserID);
-
- // 查询股东列表,华泰证券可能一开始查会返回非知请求[1122]
- GDLB_STRUCT** ppRS = nullptr;
- CharTable2Login(ppResults, &ppRS);
-
- int count = GetCountStructs((void**)ppRS);
-
- if (count>0)
- {
- for (int i = 0; i < count; ++i)
- {
- InvestorField* pField = (InvestorField*)m_msgQueue->new_block(sizeof(InvestorField));
-
- GDLB_2_InvestorField(ppRS[i], pField);
-
- m_msgQueue->Input_NoCopy(ResponeType::OnRspQryInvestor, m_msgQueue, m_pClass, i == count - 1, 0, pField, sizeof(InvestorField), nullptr, 0, nullptr, 0);
- }
- }
- else
- {
- // 查通达信仿真实验室账号不直接返回股东列表,需要主动查询
- ReqQryInvestor();
- }
-
- // 启动定时查询功能使用
- m_msgQueue_Test->Input_Copy(ResponeType::OnRtnOrder, m_msgQueue_Test, this, 0, 0, nullptr, 0, nullptr, 0, nullptr, 0);
-
- m_msgQueue->Input_NoCopy(ResponeType::OnConnectionStatus, m_msgQueue, m_pClass, ConnectionStatus::ConnectionStatus_Done, 0, nullptr, 0, nullptr, 0, nullptr, 0);
-
-
- // 登录下一个账号
- //++m_UserInfo_Pos;
- //ReqUserLogin();
- }
- else
- {
- if (pErr)
- {
- RspUserLoginField* pField = (RspUserLoginField*)m_msgQueue->new_block(sizeof(RspUserLoginField));
-
- pField->RawErrorID = pErr->ErrCode;
- strcpy(pField->Text, pErr->ErrInfo);
-
- m_msgQueue->Input_NoCopy(ResponeType::OnConnectionStatus, m_msgQueue, m_pClass, ConnectionStatus::ConnectionStatus_Disconnected, 0, pField, sizeof(RspUserLoginField), nullptr, 0, nullptr, 0);
- }
- }
-
- DeleteError(pErr);
- DeleteTableBody(ppResults);
-
- return 0;
-}
-
-void CTraderApi::ReqQuery(QueryType type, ReqQueryField* pQuery)
-{
- m_msgQueue_Query->Input_Copy(type, m_msgQueue_Query, this, 0, 0,
- pQuery, sizeof(ReqQueryField), nullptr, 0, nullptr, 0);
-}
-
-void CTraderApi::ReqQryInvestor()
-{
- m_msgQueue_Query->Input_NoCopy(QueryType::ReqQryInvestor, m_msgQueue_Query, this, 0, 0,
- nullptr, 0, nullptr, 0, nullptr, 0);
-}
-
-int CTraderApi::_ReqQryInvestor(char type, void* pApi1, void* pApi2, double double1, double double2, void* ptr1, int size1, void* ptr2, int size2, void* ptr3, int size3)
-{
- if (m_pApi == nullptr)
- return 0;
-
- FieldInfo_STRUCT** ppFieldInfos = nullptr;
- char** ppResults = nullptr;
- Error_STRUCT* pErr = nullptr;
-
- m_pApi->ReqQueryData(REQUEST_GDLB, &ppFieldInfos, &ppResults, &pErr);
-
- if (IsErrorRspInfo("ReqQryInvestor", pErr))
- {
- //int _queryTime = QUERY_TIME_MIN;
- //m_QueryGDLBTime = time(nullptr) + _queryTime;
- //OutputQueryTime(m_QueryGDLBTime, _queryTime, "NextQueryInvestor_ReqQryInvestor");
-
- DeleteTableBody(ppResults);
- DeleteError(pErr);
-
- return 0;
- }
-
- GDLB_STRUCT** ppRS = nullptr;
- CharTable2GDLB(ppFieldInfos, ppResults, &ppRS);
-
- int count = GetCountStructs((void**)ppRS);
-
- for (int i = 0; i < count; ++i)
- {
- InvestorField* pField = (InvestorField*)m_msgQueue->new_block(sizeof(InvestorField));
-
- GDLB_2_InvestorField(ppRS[i], pField);
-
- m_msgQueue->Input_NoCopy(ResponeType::OnRspQryInvestor, m_msgQueue, m_pClass, i == count - 1, 0, pField, sizeof(InvestorField), nullptr, 0, nullptr, 0);
- }
-
- DeleteTableBody(ppResults);
- DeleteError(pErr);
-
- return 0;
-}
-
-CTraderApi::CTraderApi(void)
-{
- m_pIDGenerator = nullptr;
- m_pApi = nullptr;
- m_pClient = nullptr;
- m_lRequestID = 0;
- m_nSleep = 1;
- //m_FirstTradeID[0] = 0;
- m_TradeListReverse = false;
- m_LastIsMerge = false;
-
- // 自己维护两个消息队列
- m_msgQueue = new CMsgQueue();
- m_msgQueue_Query = new CMsgQueue();
- m_msgQueue_Test = new CMsgQueue();
-
- m_msgQueue_Query->Register(Query,this);
- m_msgQueue_Query->StartThread();
-
- m_msgQueue_Test->Register(Test, this);
- m_msgQueue_Test->StartThread();
-}
-
-
-CTraderApi::~CTraderApi(void)
-{
- Disconnect();
-}
-
-void CTraderApi::Register(void* pCallback, void* pClass)
-{
- m_pClass = pClass;
- if (m_msgQueue == nullptr)
- return;
-
- m_msgQueue_Query->Register(Query,this);
- m_msgQueue_Test->Register(Test, this);
- m_msgQueue->Register(pCallback,this);
- if (pCallback)
- {
- m_msgQueue_Query->StartThread();
- m_msgQueue->StartThread();
- m_msgQueue_Test->StartThread();
- }
- else
- {
- m_msgQueue_Query->StopThread();
- m_msgQueue->StopThread();
- m_msgQueue_Test->StopThread();
- }
-}
-
-bool CTraderApi::IsErrorRspInfo(const char* szSource, Error_STRUCT *pRspInfo)
-{
- bool bRet = ((pRspInfo) && (pRspInfo->ErrType != 0));
- if (bRet)
- {
- ErrorField* pField = (ErrorField*)m_msgQueue->new_block(sizeof(ErrorField));
-
- pField->RawErrorID = pRspInfo->ErrCode;
- strcpy(pField->Text, pRspInfo->ErrInfo);
- strcpy(pField->Source, szSource);
-
- m_msgQueue->Input_NoCopy(ResponeType::OnRtnError, m_msgQueue, m_pClass, true, 0, pField, sizeof(ErrorField), nullptr, 0, nullptr, 0);
- }
- return bRet;
-}
-
-void CTraderApi::Connect(const string& szPath,
- ServerInfoField* pServerInfo,
- UserInfoField* pUserInfo,
- int count)
-{
- m_szPath = szPath;
- memcpy(&m_ServerInfo, pServerInfo, sizeof(ServerInfoField));
- memcpy(&m_UserInfo, pUserInfo, sizeof(UserInfoField));
-
- m_pUserInfos = (UserInfoField*)(new char[sizeof(UserInfoField)*count]);
- memcpy(m_pUserInfos, pUserInfo, sizeof(UserInfoField)*count);
-
- m_UserInfo_Pos = 0;
- m_UserInfo_Count = count;
-
- m_pIDGenerator = new CIDGenerator();
- m_pIDGenerator->SetPrefix(m_UserInfo.UserID);
-
- m_msgQueue_Query->Input_NoCopy(E_Init, m_msgQueue_Query, this, 0, 0, nullptr, 0, nullptr, 0, nullptr, 0);
-}
-
-void CTraderApi::Disconnect()
-{
- if (m_msgQueue_Query)
- {
- m_msgQueue_Query->StopThread();
- m_msgQueue_Query->Register(nullptr,nullptr);
- m_msgQueue_Query->Clear();
- delete m_msgQueue_Query;
- m_msgQueue_Query = nullptr;
- }
-
- if (m_msgQueue_Test)
- {
- m_msgQueue_Test->StopThread();
- m_msgQueue_Test->Register(nullptr, nullptr);
- m_msgQueue_Test->Clear();
- delete m_msgQueue_Test;
- m_msgQueue_Test = nullptr;
- }
-
- if(m_pApi)
- {
- // 还没有登出
- m_pApi->Logout(m_pClient);
- m_pClient = nullptr;
- m_pApi->Exit();
-
- m_pApi->Release();
- m_pApi = nullptr;
-
- // 全清理,只留最后一个
- if (m_msgQueue)
- {
- m_msgQueue->Clear();
- m_msgQueue->Input_NoCopy(ResponeType::OnConnectionStatus, m_msgQueue, m_pClass, ConnectionStatus::ConnectionStatus_Disconnected, 0, nullptr, 0, nullptr, 0, nullptr, 0);
- // 主动触发
- m_msgQueue->Process();
- }
- }
-
- if (m_msgQueue)
- {
- m_msgQueue->StopThread();
- m_msgQueue->Register(nullptr,nullptr);
- m_msgQueue->Clear();
- delete m_msgQueue;
- m_msgQueue = nullptr;
- }
-
- if (m_pIDGenerator)
- {
- delete m_pIDGenerator;
- m_pIDGenerator = nullptr;
- }
-}
-
-int CTraderApi::ReqOrderInsert(
- OrderField* pOrder,
- int count,
- OrderIDType* pInOut)
-{
- memset(pInOut, 0, sizeof(OrderIDType)*count);
-
- if (count < 1)
- return 0;
-
- OrderField** ppOrders = new OrderField*[count];
-
- // 生成本地ID,供上层进行定位使用
- for (int i = 0; i < count; ++i)
- {
- OrderField* pNewOrder = (OrderField*)m_msgQueue->new_block(sizeof(OrderField));
- memcpy(pNewOrder, pOrder, sizeof(OrderField));
-
- strcpy(pInOut[i], m_pIDGenerator->GetIDString());
- strcpy(pNewOrder[i].LocalID, pInOut[i]);
- ppOrders[i] = pNewOrder;
-
- // 注意这里保存了最开始发单的结构体的备份
- m_id_platform_order.insert(pair(pNewOrder->LocalID, pNewOrder));
- }
-
- m_msgQueue_Query->Input_Copy(RequestType::E_InputOrderField, m_msgQueue_Query, this, 0, 0,
- ppOrders, sizeof(OrderField*)*count, nullptr, 0, nullptr, 0);
-
- delete[] ppOrders;
-
- return 0;
-}
-
-int CTraderApi::_ReqOrderInsert(char type, void* pApi1, void* pApi2, double double1, double double2, void* ptr1, int size1, void* ptr2, int size2, void* ptr3, int size3)
-{
- if (m_pApi == nullptr)
- return 0;
-
- // 得到报单指针列表
- OrderField** ppOrders = (OrderField**)ptr1;
- int count = (int)size1 / sizeof(OrderField*);
-
- Order_STRUCT** ppTdxOrders = new Order_STRUCT*[count];
- for (int i = 0; i < count; ++i)
- {
- ppTdxOrders[i] = (Order_STRUCT*)m_msgQueue->new_block(sizeof(Order_STRUCT));
- OrderField_2_Order_STRUCT(ppOrders[i], ppTdxOrders[i]);
- }
-
- FieldInfo_STRUCT** ppFieldInfos = nullptr;
- char** ppResults = nullptr;
- Error_STRUCT** ppErrs = nullptr;
-
- // 注意:pTdxOrders在这里被修改了,需要使用修改后的东西
- int n = m_pApi->SendMultiOrders(ppTdxOrders, count, &ppFieldInfos, &ppResults, &ppErrs);
-
- // 标记批量下单是否有发成功过单的
- bool bSuccess = false;
- // 将结果立即取出来
- for (int i = 0; i < count;++i)
- {
- m_id_api_order.insert(pair(ppOrders[i]->LocalID, ppTdxOrders[i]));
- // 处理错误
- if (ppErrs && ppErrs[i])
- {
- ppOrders[i]->RawErrorID = ppErrs[i]->ErrCode;
- strcpy(ppOrders[i]->Text, ppErrs[i]->ErrInfo);
- }
-
- // 处理结果
- if (ppResults && ppResults[i*COL_EACH_ROW + 0])
- {
- bSuccess = true;
- // 写上柜台的ID,以后将基于此进行定位
- strcpy(ppOrders[i]->ID, ppResults[i*COL_EACH_ROW + 0]);
-
- m_id_api_order.erase(ppOrders[i]->LocalID);
- m_id_api_order.insert(pair(ppOrders[i]->ID, ppTdxOrders[i]));
-
- m_id_platform_order.erase(ppOrders[i]->LocalID);
- m_id_platform_order.insert(pair(ppOrders[i]->ID, ppOrders[i]));
- }
-
- // 现在有两个结构体,需要进行操作了
- // 1.通知下单的结果
- // 2.记录下单
-
- OrderField* pField = ppOrders[i];
- if (pField->RawErrorID != 0)
- {
- pField->ExecType = ExecType::ExecType_Rejected;
- pField->Status = OrderStatus::OrderStatus_Rejected;
- }
- else
- {
- pField->ExecType = ExecType::ExecType_New;
- pField->Status = OrderStatus::OrderStatus_New;
- }
-
- m_msgQueue->Input_Copy(ResponeType::OnRtnOrder, m_msgQueue, m_pClass, 0, 0, pField, sizeof(OrderField), nullptr, 0, nullptr, 0);
- }
-
- // 测试用,不能写这,太快了,要等一下
- //ReqQryTrade();
-
- // 复制完了,可以删了以前东西
- delete[] ppTdxOrders;
-
- DeleteTableBody(ppResults, count);
- DeleteErrors(ppErrs, count);
-
- if (bSuccess)
- {
- // 有挂单的,需要进行查询了
-
- double _queryTime = QUERY_TIME_MIN;
-
- m_QueryOrderTime = time(nullptr) + _queryTime;
- OutputQueryTime(m_QueryOrderTime, _queryTime, "NextQueryOrder_Send");
- }
-
- return 0;
-}
-
-int CTraderApi::ReqOrderAction(OrderIDType* szId, int count, OrderIDType* pOutput)
-{
- memset(pOutput, 0, sizeof(OrderIDType)*count);
-
- OrderField** ppOrders = new OrderField*[count];
- Order_STRUCT** ppTdxOrders = new Order_STRUCT*[count];
-
- for (int i = 0; i < count; ++i)
- {
- ppOrders[i] = nullptr;
- ppTdxOrders[i] = nullptr;
-
- {
- unordered_map::iterator it = m_id_platform_order.find(szId[i]);
- if (it != m_id_platform_order.end())
- ppOrders[i] = it->second;
- }
-
- {
- unordered_map::iterator it = m_id_api_order.find(szId[i]);
- if (it != m_id_api_order.end())
- ppTdxOrders[i] = it->second;
- }
- }
-
- m_msgQueue_Query->Input_Copy(RequestType::E_InputOrderActionField, m_msgQueue_Query, this, 0, 0,
- ppOrders, sizeof(OrderField*)*count, ppTdxOrders, sizeof(Order_STRUCT*)*count, nullptr, 0);
-
- delete[] ppOrders;
- delete[] ppTdxOrders;
-
- return 0;
-}
-
-int CTraderApi::_ReqOrderAction(char type, void* pApi1, void* pApi2, double double1, double double2, void* ptr1, int size1, void* ptr2, int size2, void* ptr3, int size3)
-{
- int count = (int)size1 / sizeof(OrderField*);
- // 通过ID找到原始结构,用于撤单
- // 通过ID找到通用结构,用于接收回报
- OrderField** ppOrders = (OrderField**)ptr1;
- Order_STRUCT** ppTdxOrders = (Order_STRUCT**)ptr2;
-
- FieldInfo_STRUCT** ppFieldInfos = nullptr;
- char** ppResults = nullptr;
- Error_STRUCT** ppErrs = nullptr;
-
- int n = m_pApi->CancelMultiOrders(ppTdxOrders, count, &ppFieldInfos, &ppResults, &ppErrs);
-
- bool bSuccess = false;
- // 将结果立即取出来
- for (int i = 0; i < count; ++i)
- {
- if (ppErrs)
- {
- if (ppErrs[i])
- {
- ppOrders[i]->RawErrorID = ppErrs[i]->ErrCode;
- strcpy(ppOrders[i]->Text, ppErrs[i]->ErrInfo);
-
- ppOrders[i]->ExecType = ExecType::ExecType_CancelReject;
- // 注意报单状态问题
- }
- else
- {
- bSuccess = true;
-
- // 会不会出现撤单时,当时不知道是否成功撤单,查询才得知没有撤成功?
- //ppOrders[i]->ExecType = ExecType::ExecCancelled;
- //ppOrders[i]->Status = OrderStatus::Cancelled;
- continue;
- }
- }
- // 撤单成功时,返回的东西还是null,所以这里使用错误信息来进行区分
-
- //if (ppResults)
- //{
- // if (ppResults[i*COL_EACH_ROW + 0])
- // {
- // }
- //}
-
- m_msgQueue->Input_Copy(ResponeType::OnRtnOrder, m_msgQueue, m_pClass, 0, 0, ppOrders[i], sizeof(OrderField), nullptr, 0, nullptr, 0);
- }
-
- DeleteTableBody(ppResults, count);
- DeleteErrors(ppErrs, count);
-
- if (bSuccess)
- {
- // 需要进行查询了
- double _queryTime = QUERY_TIME_MIN;
-
- m_QueryOrderTime = time(nullptr) + _queryTime;
- OutputQueryTime(m_QueryOrderTime, _queryTime, "NextQueryOrder_Cancel");
- }
-
- return 0;
-}
-
-void CTraderApi::ReqQryOrder()
-{
- m_msgQueue_Query->Input_NoCopy(QueryType::ReqQryOrder, m_msgQueue_Query, this, 0, 0,
- nullptr, 0, nullptr, 0, nullptr, 0);
-}
-
-int CTraderApi::_ReqQryOrder(char type, void* pApi1, void* pApi2, double double1, double double2, void* ptr1, int size1, void* ptr2, int size2, void* ptr3, int size3)
-{
- FieldInfo_STRUCT** ppFieldInfos = nullptr;
- char** ppResults = nullptr;
- Error_STRUCT* pErr = nullptr;
-
- m_pApi->ReqQueryData(REQUEST_DRWT, &ppFieldInfos, &ppResults, &pErr);
- // 测试用,事后要删除
- //m_pApi->ReqQueryData(REQUEST_LSWT, &ppFieldInfos, &ppResults, &pErr, "20150801", "20151031");
-
- if (IsErrorRspInfo("ReqQryOrder", pErr))
- {
- double _queryTime = 0.5 * QUERY_TIME_MAX + QUERY_TIME_MIN;
- m_QueryOrderTime = time(nullptr) + _queryTime;
- //OutputQueryTime(m_QueryOrderTime, _queryTime, "NextQueryOrder_QueryOrder_Error");
-
- DeleteTableBody(ppResults);
- DeleteError(pErr);
-
- return 0;
- }
-
- WTLB_STRUCT** ppRS = nullptr;
- CharTable2WTLB(ppFieldInfos, ppResults, &ppRS);
-
- // 操作前清空,按说之前已经清空过一次了
- m_NewOrderList.clear();
-
- // 有未完成的,标记为true
- bool IsDone = true;
- // 有未申报的,标记为true
- bool IsNotSent = false;
- // 有更新的
- bool IsUpdated = false;
-
- if (ppRS)
- {
- int i = 0;
- while (ppRS[i])
- {
- // 将撤单委托过滤
- if (ppRS[i]->MMBZ_ != MMBZ_Cancel)
- {
- // 需要将它输入到一个地方用于计算
- OrderField* pField = (OrderField*)m_msgQueue->new_block(sizeof(OrderField));
-
- WTLB_2_OrderField_0(ppRS[i], pField);
- m_NewOrderList.push_back(pField);
-
- if (!ZTSM_IsDone(ppRS[i]->ZTSM_))
- {
- IsDone = false;
- }
- if (ZTSM_IsNotSent(ppRS[i]->ZTSM_))
- {
- IsNotSent = true;
- }
- }
- ++i;
- }
- }
-
- // 委托列表
- // 1.新增的都需要输出
- // 2.老的看是否有变化
- ++m_OrderNotUpdateCount;
-
- int i = 0;
- list::iterator it2 = m_OldOrderList.begin();
- for (list::iterator it = m_NewOrderList.begin(); it != m_NewOrderList.end(); ++it)
- {
- OrderField* pField = *it;
-
- bool bUpdate = false;
- if (i >= m_OldOrderList.size())
- {
- bUpdate = true;
- }
- else
- {
- // 相同位置的部分
- OrderField* pOldField = *it2;
- if (pOldField->LeavesQty != pField->LeavesQty || pOldField->Status != pField->Status)
- {
- bUpdate = true;
- }
- }
-
- if (bUpdate)
- {
- IsUpdated = true;
- m_OrderNotUpdateCount = 0;
-
- // 如果能找到下单时的委托,就修改后发出来
- unordered_map::iterator it = m_id_platform_order.find(pField->ID);
- if (it != m_id_platform_order.end())
- {
- OrderField* pField_ = it->second;
- pField_->Date = pField->Date;
- pField_->Time = pField->Time;
- pField_->CumQty = pField->CumQty;
- pField_->LeavesQty = pField->LeavesQty;
- pField_->AvgPx = pField->AvgPx;
- pField_->Status = pField->Status;
- pField_->ExecType = pField->ExecType;
- strcpy(pField_->Text, pField->Text);
-
- pField = pField_;
- }
-
- m_msgQueue->Input_Copy(ResponeType::OnRtnOrder, m_msgQueue, m_pClass, 0, 0, pField, sizeof(OrderField), nullptr, 0, nullptr, 0);
- }
-
- // 前一个可能为空,移动到下一个时需要注意
- if (it2 != m_OldOrderList.end())
- {
- ++it2;
- }
-
- ++i;
- }
-
- // 将老数据清理,防止内存泄漏
- for (list::iterator it = m_OldOrderList.begin(); it != m_OldOrderList.end(); ++it)
- {
- OrderField* pField = *it;
- m_msgQueue->delete_block(pField);
- }
-
- // 做交换
- m_OldOrderList.clear();
- m_OldOrderList = m_NewOrderList;
- m_NewOrderList.clear();
-
- DeleteTableBody(ppResults);
- DeleteError(pErr);
-
- double _queryTime = 0;
- if (!IsDone)
- {
- if (!IsUpdated)
- {
- // 没有更新,是否要慢点查
- _queryTime = 0.5 * QUERY_TIME_MAX + QUERY_TIME_MIN;
- }
-
- // 有没有完成的,需要定时查询
- if (IsNotSent)
- {
- // 有没申报的,是否没在交易时间?慢点查
- _queryTime = 0.5 * QUERY_TIME_MAX + QUERY_TIME_MIN;
- }
- else
- {
- // 可能是交易时间了,是否需要考虑
- _queryTime = 2 * QUERY_TIME_MIN;
- // 可能有些挂单一天都不会成交,挂在这一直导致查太多,加一下查询计数
- if (m_OrderNotUpdateCount>=3)
- {
- _queryTime = 0.5 * QUERY_TIME_MAX + QUERY_TIME_MIN;
- }
- }
- }
- else
- {
- // 全完成了,可以不查或慢查
- _queryTime = 5 * QUERY_TIME_MAX;
- }
-
- m_QueryOrderTime = time(nullptr) + _queryTime;
- OutputQueryTime(m_QueryOrderTime, _queryTime, "NextQueryOrder_QueryOrder");
-
- // 决定成交查询间隔
- if (IsUpdated)
- {
- // 委托可能是撤单,也有可能是成交了,赶紧查一下
- _queryTime = 0;
- m_QueryTradeTime = time(nullptr) + _queryTime;
- OutputQueryTime(m_QueryTradeTime, _queryTime, "NextQueryTrade_QueryOrder");
- }
- else
- {
- // 委托没有变化,那成交就没有必要查那么快了
- _queryTime = 5 * QUERY_TIME_MAX;
- m_QueryTradeTime = time(nullptr) + _queryTime;
- OutputQueryTime(m_QueryTradeTime, _queryTime, "NextQueryTrade_QueryOrder");
- }
-
-
- return 0;
-}
-
-void CTraderApi::ReqQryTrade()
-{
- m_msgQueue_Query->Input_NoCopy(QueryType::ReqQryTrade, m_msgQueue_Query, this, 0, 0,
- nullptr, 0, nullptr, 0, nullptr, 0);
-}
-
-//////////////////////////////////////////////////////////////////////////
-double GetTradeListQty(list &tradeList,int count)
-{
- double Qty = 0;
- int i = 0;
- for (list::iterator it = tradeList.begin(); it != tradeList.end(); ++it)
- {
- ++i;
- if (i>count)
- {
- break;
- }
-
- TradeField* pField = *it;
- Qty += pField->Qty;
- }
- return Qty;
-}
-
-void TradeList2TradeMap(list &tradeList, unordered_map &tradeMap)
-{
- // 只在这个函数中new和delete应当没有问题
- for (unordered_map::iterator it = tradeMap.begin(); it != tradeMap.end(); ++it)
- {
- TradeField* pNewField = it->second;
- delete[] pNewField;
- }
- tradeMap.clear();
-
- // 将多个合约拼接成
- for (list::iterator it = tradeList.begin(); it != tradeList.end(); ++it)
- {
- TradeField* pField = *it;
- unordered_map::iterator it2 = tradeMap.find(pField->ID);
- if (it2 == tradeMap.end())
- {
- TradeField* pNewField = new TradeField;
- memcpy(pNewField, pField, sizeof(TradeField));
- tradeMap[pField->ID] = pNewField;
- }
- else
- {
- TradeField* pNewField = it2->second;
- pNewField->Price = pField->Price;
- pNewField->Qty += pField->Qty;
- }
- }
-}
-
-void CTraderApi::CompareTradeMapAndEmit(unordered_map &oldMap, unordered_map &newMap)
-{
- for (unordered_map::iterator it = newMap.begin(); it != newMap.end(); ++it)
- {
- TradeField* pNewField = it->second;
- unordered_map::iterator it2 = oldMap.find(pNewField->ID);
- if (it2 == oldMap.end())
- {
- // 没找到,是新单
- m_msgQueue->Input_Copy(ResponeType::OnRtnTrade, m_msgQueue, m_pClass, 0, 0, pNewField, sizeof(TradeField), nullptr, 0, nullptr, 0);
- }
- else
- {
- TradeField* pOldField = it2->second;
- int Qty = pNewField->Qty - pOldField->Qty;
- if (Qty>0)
- {
- // 有变化的单
- TradeField* pField = new TradeField;
- memcpy(pField, pNewField, sizeof(TradeField));
- pField->Qty = Qty;
- m_msgQueue->Input_Copy(ResponeType::OnRtnTrade, m_msgQueue, m_pClass, 0, 0, pNewField, sizeof(TradeField), nullptr, 0, nullptr, 0);
- delete[] pField;
- }
- }
- }
-}
-
-void CTraderApi::CompareTradeListAndEmit(list &oldList, list &newList)
-{
- int i = 0;
- list::iterator it2 = oldList.begin();
- for (list::iterator it = newList.begin(); it != newList.end(); ++it)
- {
- TradeField* pField = *it;
-
- bool bUpdate = false;
- if (i >= oldList.size())
- {
- bUpdate = true;
- }
- //else
- //{
- // // 相同位置的部分
- // TradeField* pOldField = *it2;
- // if (pOldField->Qty != pField->Qty)
- // {
- // bUpdate = true;
- // }
- //}
-
- if (bUpdate)
- {
- m_msgQueue->Input_Copy(ResponeType::OnRtnTrade, m_msgQueue, m_pClass, 0, 0, pField, sizeof(TradeField), nullptr, 0, nullptr, 0);
- }
-
- // 前一个可能为空,移动到下一个时需要注意
- if (it2 != oldList.end())
- {
- ++it2;
- }
-
- ++i;
- }
-}
-//////////////////////////////////////////////////////////////////////////
-
-int CTraderApi::_ReqQryTrade(char type, void* pApi1, void* pApi2, double double1, double double2, void* ptr1, int size1, void* ptr2, int size2, void* ptr3, int size3)
-{
- FieldInfo_STRUCT** ppFieldInfos = nullptr;
- char** ppResults = nullptr;
- Error_STRUCT* pErr = nullptr;
-
- m_pApi->ReqQueryData(REQUEST_DRCJ, &ppFieldInfos, &ppResults, &pErr);
-
- if (IsErrorRspInfo("ReqQryTrade", pErr))
- {
- double _queryTime = 0.5 * QUERY_TIME_MAX + QUERY_TIME_MIN;
- m_QueryTradeTime = time(nullptr) + _queryTime;
-
- DeleteTableBody(ppResults);
- DeleteError(pErr);
-
- return 0;
- }
-
- CJLB_STRUCT** ppRS = nullptr;
- CharTable2CJLB(ppFieldInfos, ppResults, &ppRS);
-
- // 操作前清空,按说之前已经清空过一次了
- m_NewTradeList.clear();
-
- if (ppRS)
- {
- // 利用成交编号的大小来判断正反序
- if (!m_TradeListReverse)
- {
- int count = GetCountStructs((void**)ppRS);
- if (count>1)
- {
- // 转成数字的比较,是否会有非数字的情况出现?
- long CJBH0 = atol(ppRS[0]->CJBH);
- long CJBH1 = atol(ppRS[count - 1]->CJBH);
- if (CJBH0>CJBH1)
- {
- m_TradeListReverse = true;
- }
- }
- }
-
- int i = 0;
- while (ppRS[i])
- {
- TradeField* pField = (TradeField*)m_msgQueue->new_block(sizeof(TradeField));
-
- CJLB_2_TradeField(ppRS[i], pField);
-
- if (m_TradeListReverse)
- {
- // 华泰查出来的表后生成的排第一,所以要处理一下
- m_NewTradeList.push_front(pField);
- }
- else
- {
- m_NewTradeList.push_back(pField);
- }
-
- ++i;
- }
- }
-
- // 新查出来的反而少了,华泰有合并成交的情况,这种如何处理?
- // 对同ID的需要累加,有发现累加不对应的,应当处理
- // 同样条数的,也有可能其中的有变化,如何处理?
- bool bTryMerge = false;
- int OldTradeListCount = m_OldTradeList.size();
- int NewTradeListCount = m_NewTradeList.size();
-
- if (NewTradeListCount < OldTradeListCount)
- {
- // 行数变少了,应当是合并了
- bTryMerge = true;
- }
- else if (OldTradeListCount == 0)
- {
- // 如果上一次的为空,不管这次查出来的是合并还是没有合并,都没有关系,当成没合并处理即可
- }
- else if (NewTradeListCount == OldTradeListCount)
- {
- // 行数不变,但有可能是其中的一条部分成交的更新,所以检查一下
-
- double OldQty = GetTradeListQty(m_OldTradeList, m_OldTradeList.size());
- double NewQty = GetTradeListQty(m_NewTradeList, m_NewTradeList.size());
- if (NewQty != OldQty)
- {
- // 同样长度成交量发生了变化,可能是合并的列表其中一个新成交了
- bTryMerge = true;
- }
- }
- else
- {
- // 行数变多了,只要其中上次的部分有变化就需要检查一下
- double OldQty = GetTradeListQty(m_OldTradeList, m_OldTradeList.size());
- double NewQty = GetTradeListQty(m_NewTradeList, m_NewTradeList.size());
- if (NewQty != OldQty)
- {
- bTryMerge = true;
- }
- }
-
-
-
- if (bTryMerge)
- {
- // 合并列表的处理方法
- // 如果上次是合并,这次就没有必要再生成一次了
- if (m_OldTradeMap.size() == 0 || !m_LastIsMerge)
- {
- for (unordered_map::iterator it = m_OldTradeMap.begin(); it != m_OldTradeMap.end(); ++it)
- {
- TradeField* pField = it->second;
- delete[] pField;
- }
- m_OldTradeMap.clear();
-
- TradeList2TradeMap(m_OldTradeList, m_OldTradeMap);
- }
- TradeList2TradeMap(m_NewTradeList, m_NewTradeMap);
- CompareTradeMapAndEmit(m_OldTradeMap, m_NewTradeMap);
-
- // 交换
- for (unordered_map::iterator it = m_OldTradeMap.begin(); it != m_OldTradeMap.end(); ++it)
- {
- TradeField* pField = it->second;
- delete[] pField;
- }
- m_OldTradeMap.clear();
- m_OldTradeMap = m_NewTradeMap;
- m_NewTradeMap.clear();
- m_LastIsMerge = true;
- }
- else
- {
- // 普通的处理方法
- CompareTradeListAndEmit(m_OldTradeList, m_NewTradeList);
- m_LastIsMerge = false;
- }
-
- // 将老数据清理,防止内存泄漏
- for (list::iterator it = m_OldTradeList.begin(); it != m_OldTradeList.end(); ++it)
- {
- TradeField* pField = *it;
- m_msgQueue->delete_block(pField);
- }
-
- // 做交换
- m_OldTradeList.clear();
- m_OldTradeList = m_NewTradeList;
- m_NewTradeList.clear();
-
- DeleteTableBody(ppResults);
- DeleteError(pErr);
-
- return 0;
-}
-
-//void CTraderApi::ReqQryInstrument(const string& szInstrumentId, const string& szExchange)
-//{
-//
-//}
-
-//void CTraderApi::ReqQryTradingAccount()
-//{
-// m_msgQueue_Query->Input_NoCopy(QueryType::ReqQryTrade, m_msgQueue_Query, this, 0, 0,
-// nullptr, 0, nullptr, 0, nullptr, 0);
-//}
-
-int CTraderApi::_ReqQryTradingAccount(char type, void* pApi1, void* pApi2, double double1, double double2, void* ptr1, int size1, void* ptr2, int size2, void* ptr3, int size3)
-{
- if (m_pApi == nullptr)
- return 0;
-
- FieldInfo_STRUCT** ppFieldInfos = nullptr;
- char** ppResults = nullptr;
- Error_STRUCT* pErr = nullptr;
-
- m_pApi->ReqQueryData(REQUEST_ZJYE, &ppFieldInfos, &ppResults, &pErr);
-
- if (IsErrorRspInfo("ReqQryTradingAccount", pErr))
- {
- DeleteTableBody(ppResults);
- DeleteError(pErr);
-
- return 0;
- }
-
- ZJYE_STRUCT** ppRS = nullptr;
- CharTable2ZJYE(ppFieldInfos, ppResults, &ppRS);
-
- int count = GetCountStructs((void**)ppRS);
- for (int i = 0; i < count; ++i)
- {
- AccountField* pField = (AccountField*)m_msgQueue->new_block(sizeof(AccountField));
-
- ZJYE_2_AccountField(ppRS[i], pField);
-
- // 可能资金账号查不出来,手工填上
- if (strlen(pField->AccountID) <= 0)
- {
- // 多账户会有问题
- strcpy(pField->AccountID, m_pApi->GetAccount());
- }
-
- m_msgQueue->Input_NoCopy(ResponeType::OnRspQryTradingAccount, m_msgQueue, m_pClass, i == count - 1, 0, pField, sizeof(AccountField), nullptr, 0, nullptr, 0);
- }
-
- DeleteTableBody(ppResults);
- DeleteError(pErr);
-
- return 0;
-}
-
-//void CTraderApi::ReqQryInvestorPosition()
-//{
-// m_msgQueue_Query->Input_NoCopy(RequestType::E_QryInvestorPositionField, m_msgQueue_Query, this, 0, 0,
-// nullptr, 0, nullptr, 0, nullptr, 0);
-//}
-
-int CTraderApi::_ReqQryInvestorPosition(char type, void* pApi1, void* pApi2, double double1, double double2, void* ptr1, int size1, void* ptr2, int size2, void* ptr3, int size3)
-{
- if (m_pApi == nullptr)
- return 0;
-
- FieldInfo_STRUCT** ppFieldInfos = nullptr;
- char** ppResults = nullptr;
- Error_STRUCT* pErr = nullptr;
-
- m_pApi->ReqQueryData(REQUEST_GFLB, &ppFieldInfos, &ppResults, &pErr);
-
- if (IsErrorRspInfo("ReqQryInvestorPosition", pErr))
- {
- DeleteTableBody(ppResults);
- DeleteError(pErr);
-
- return 0;
- }
-
- GFLB_STRUCT** ppRS = nullptr;
- CharTable2GFLB(ppFieldInfos, ppResults, &ppRS);
-
- int count = GetCountStructs((void**)ppRS);
- for (int i = 0; i < count; ++i)
- {
- PositionField* pField = (PositionField*)m_msgQueue->new_block(sizeof(PositionField));
-
- // 应当处理一下,可能一个账号对应的有多个,如信用账户
- GFLB_2_PositionField(ppRS[i], pField);
-
- m_msgQueue->Input_NoCopy(ResponeType::OnRspQryInvestorPosition, m_msgQueue, m_pClass, i == count - 1, 0, pField, sizeof(PositionField), nullptr, 0, nullptr, 0);
- }
-
- DeleteTableBody(ppResults);
- DeleteError(pErr);
-
- return 0;
-}
-
-void CTraderApi::Subscribe(const string& szInstrumentIDs, const string& szExchangeID)
-{
- char buf[64] = { 0 };
- strcpy(buf, szInstrumentIDs.c_str());
-
- m_msgQueue_Query->Input_Copy(RequestType::E_QryDepthMarketDataField, m_msgQueue_Query, this, 0, 0,
- buf, sizeof(buf), nullptr, 0, nullptr, 0);
-}
-
-int CTraderApi::_Subscribe(char type, void* pApi1, void* pApi2, double double1, double double2, void* ptr1, int size1, void* ptr2, int size2, void* ptr3, int size3)
-{
- if (m_pApi == nullptr)
- return 0;
-
- FieldInfo_STRUCT** ppFieldInfos = nullptr;
- char** ppResults = nullptr;
- Error_STRUCT* pErr = nullptr;
-
- m_pApi->ReqQueryData(REQUEST_HQ, &ppFieldInfos, &ppResults, &pErr, "", "", (char*)ptr1);
-
- if (IsErrorRspInfo("Subscribe", pErr))
- {
- DeleteTableBody(ppResults);
- DeleteError(pErr);
-
- return 0;
- }
-
- HQ_STRUCT** ppRS = nullptr;
- CharTable2HQ(ppFieldInfos, ppResults, &ppRS);
-
- int count = GetCountStructs((void**)ppRS);
-
- for (int i = 0; i < count; ++i)
- {
- DepthMarketDataNField* pField = (DepthMarketDataNField*)m_msgQueue->new_block(sizeof(DepthMarketDataNField)+sizeof(DepthField)* 10);
-
- HQ_STRUCT* pDepthMarketData = ppRS[i];
-
- strcpy(pField->InstrumentID, pDepthMarketData->ZQDM);
- //pField->Exchange = JYSDM_2_ExchangeType(pDepthMarketData->JYSDM);
-
- sprintf(pField->Symbol, "%s.%s", pField->InstrumentID, "");
-
- // 交易时间
- GetExchangeTime(time(nullptr), &pField->TradingDay, &pField->ActionDay, &pField->UpdateTime);
-
-
- pField->LastPrice = pDepthMarketData->DQJ_;
- //pField->Volume = 0;
- //pField->Turnover = pDepthMarketData->Turnover;
- //pField->OpenInterest = pDepthMarketData->OpenInterest;
- //pField->AveragePrice = pDepthMarketData->AveragePrice;
- pField->UpperLimitPrice = pDepthMarketData->ZTJG_;
- pField->LowerLimitPrice = pDepthMarketData->DTJG_;
-
- pField->PreClosePrice = pDepthMarketData->ZSJ_;
- pField->OpenPrice = pDepthMarketData->JKJ_;
-
- InitBidAsk(pField);
-
- do
- {
- if (pDepthMarketData->BidSize1_ == 0)
- break;
- AddBid(pField, pDepthMarketData->BidPrice1_, pDepthMarketData->BidSize1_, 0);
-
- if (pDepthMarketData->BidSize2_ == 0)
- break;
- AddBid(pField, pDepthMarketData->BidPrice2_, pDepthMarketData->BidSize2_, 0);
-
- if (pDepthMarketData->BidSize3_ == 0)
- break;
- AddBid(pField, pDepthMarketData->BidPrice3_, pDepthMarketData->BidSize3_, 0);
-
- if (pDepthMarketData->BidSize4_ == 0)
- break;
- AddBid(pField, pDepthMarketData->BidPrice4_, pDepthMarketData->BidSize4_, 0);
-
- if (pDepthMarketData->BidSize5_ == 0)
- break;
- AddBid(pField, pDepthMarketData->BidPrice5_, pDepthMarketData->BidSize5_, 0);
- } while (false);
-
- do
- {
- if (pDepthMarketData->AskSize1_ == 0)
- break;
- AddAsk(pField, pDepthMarketData->AskPrice1_, pDepthMarketData->AskSize1_, 0);
-
- if (pDepthMarketData->AskSize2_ == 0)
- break;
- AddAsk(pField, pDepthMarketData->AskPrice2_, pDepthMarketData->AskSize2_, 0);
-
- if (pDepthMarketData->AskSize3_ == 0)
- break;
- AddAsk(pField, pDepthMarketData->AskPrice3_, pDepthMarketData->AskSize3_, 0);
-
- if (pDepthMarketData->AskSize4_ == 0)
- break;
- AddAsk(pField, pDepthMarketData->AskPrice4_, pDepthMarketData->AskSize4_, 0);
-
- if (pDepthMarketData->AskSize5_ == 0)
- break;
- AddAsk(pField, pDepthMarketData->AskPrice5_, pDepthMarketData->AskSize5_, 0);
- } while (false);
-
- m_msgQueue->Input_NoCopy(ResponeType::OnRtnDepthMarketData, m_msgQueue, m_pClass, 0, 0, pField, pField->Size, nullptr, 0, nullptr, 0);
- }
-
- DeleteTableBody(ppResults);
- DeleteError(pErr);
-
- return 0;
-}
\ No newline at end of file
diff --git a/QuantBox_Tdx_Trade/TraderApi.h b/QuantBox_Tdx_Trade/TraderApi.h
deleted file mode 100644
index 80b84e8..0000000
--- a/QuantBox_Tdx_Trade/TraderApi.h
+++ /dev/null
@@ -1,264 +0,0 @@
-#pragma once
-
-#include "../include/Tdx/TdxApi.h"
-#include "../include/ApiStruct.h"
-#include "../include/IDGenerator.h"
-#include "../include/QueueEnum.h"
-
-#ifdef _WIN64
-#pragma comment(lib, "../include/Tdx/win64/TdxApi.lib")
-#pragma comment(lib, "../lib/QuantBox_Queue_x64.lib")
-#else
-#pragma comment(lib, "../include/Tdx/win32/TdxApi.lib")
-#pragma comment(lib, "../lib/QuantBox_Queue_x86.lib")
-#endif
-
-
-#include
-#include
-#include