Skip to content

Commit

Permalink
add support for new WSEE & WSES queries
Browse files Browse the repository at this point in the history
  • Loading branch information
Freddie Wu committed Apr 19, 2018
1 parent 02babbe commit ed5455e
Show file tree
Hide file tree
Showing 7 changed files with 106 additions and 41 deletions.
23 changes: 6 additions & 17 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -26,33 +26,22 @@ This project provides kdb+/q support for 4 distinct sets of APIs provided by [Wi

### Build

如果您使用<del>正版的Visual Studio 2013</del>Visual Studio 2015(包括社区版),则本工程只需要[Kx][][`k.h`][github_c](须作[少许改动](#modification))和[`q.lib`][github_w]即可编译通过。(如需运行单元测试项目`Test_kdb+.util`,则还额外需要[`c.lib`][github_w][`c.dll`][github_w]。)这些编译所需要的文件都已经包含在本项目中
本工程需要使用<del>正版的Visual Studio 2013</del>Visual Studio 2015(包括社区版)进行编译

<del>如果您使用的是免费版的Visual Studio Express 2013,则本工程还额外需要[Windows Driver Kit (WDK) v7.1.0][WDK]中的头文件和库方可编译。为方便直接使用,[压缩包](./packaged/)里还包括了工程编译后生成的DLL(在Release目录中)。</del>

#### <a name="modification"></a>对[`k.h`][github_c]所作的改动:
### Note

1. Line 89:
万得金融终端安装时,缺省只会把安装目录下的`bin`子目录加入到`PATH`环境变量中。这种情况下只能正常使用32位版的接口。

```cpp
extern double log(double);
```
Comment out this line to avoid conflicting signature in `math.h` from MSVC <del>2013</del>2015.

#### `Wind_API`项目所作的改动:

1. `Additional Include Directories`:

Change `D:\Wind\Wind.NET.Client\WindNET\...` to the installation path of your 万得金融终端.
2. `Additional Library Directories`:

Change `D:\Wind\Wind.NET.Client\WindNET\...` to the installation path of your 万得金融终端.
如果需要使用64位版的接口,请务必在kdb+启动前,先把万得金融终端安装目录下的`x64`子目录加入到`PATH`环境变量最前面,以便让`q.exe`进程能在32位版本之前先找到64位版本的库。

### Change Log

* 2018.04
* Include dependent headers and libraries into the project
* Added support for x64 build
* Add support for x64 build
* Add support for the new `WSES` and `WSEE` functions
* 2018.01
* Upgraded from MSVC 2013 to 2015
* Various bug fixes for `Wind_RD.q` module
Expand Down
50 changes: 31 additions & 19 deletions Test_Wind_API/Test_Wind.q
Original file line number Diff line number Diff line change
Expand Up @@ -12,65 +12,77 @@

-1"WindAPI Version: ",.wind.version[];

-1"=== Variables =================";
show
.wind.QueryGap;

-1"=== Timeout =================";
show
.wind.getTimeout[];
show
.wind.setTimeout 00:01;

-1"=== Login =================";
//NOTE: no longer require username/password, as account is tied to Wind Terminal
.wind.login[`;`];
/ .wind.logout[];

-1"=== WSD =================";
show
.wind.WSD[`000001.SZ;`open`high`low`close`volume;"ED-1M";.z.D;()];

show
.wind.WSD[`000001.SZ`600000.SH;`volume;"ED-21TD";.z.D;()]
-1"=== WSS =================";
show
.wind.WSS[`000001.SZ`000002.SZ`600000.SH;`open`high`low`close`volume;`tradeDate`cycle!(.z.D;`W)];

-1"=== WSI =================";
show
.wind.WSI[`000001.SZ`000002.SZ`600000.SH;`open`high`low`close`volume;.z.D;`datetime$1D+.z.D;(1#`BarSize)!1#1];

-1"=== WST =================";
show
.wind.WST[`000001.SZ;`last`bid`ask`bid1`bsize1`ask1`asize1;.z.D;`datetime$1D+.z.D;()];

-1"=== WSET =================";
show
.wind.WSET[`SectorConstituent;`date`sectorid!(.z.D;`a001010100000000)];
show
.wind.WSET["OptionChain";`date`us_code`position_var`month`call_put!(.z.D;`0001.HK;`;"全部";"全部")];

-1"=== WSQ =================";
show
.wind.WSQ[`000001.SZ`000002.SZ`600000.SH;`rt_date`rt_time`rt_last`rt_vol;();::];
//TODO: How to test WSQ subscription mode?!
/show
/ qid:.wind.WSQ[`000001.SZ`000002.SZ`600000.SH;`rt_date`rt_time`rt_last`rt_vol;();]`callback set .wind.makeCallback{show(.z.P;x);show y};
/ .wind.unsub qid;
/ .wind.unsubAll[];

-1"=== WSES =================";
show
.wind.WSES[`1000011262000000;`sec_close_avg;.z.D-100;.z.D;(1#`DynamicTime)!1#0];
show
.wind.WSES[`1000011262000000`1000011263000000`1000011264000000;`sec_close_avg;.z.D-100;.z.D;(1#`DynamicTime)!1#1];
-1"=== WSEE =================";
show
.wind.WSEE[`1000011262000000`1000011263000000`1000011264000000;`sec_close_avg`sec_turn_avg;`tradeDate`endDate`unit`DynamicTime!(-1 0+.z.D),1 0];
-1"=== h2code =================";
show
.wind.h2code[("10000875";"10000877");`option;()];

-1"=== tDays =================";
show
.wind.tDays[2010.01.01;.z.D;`Days`Period!`Weekdays`Q];

-1"=== tDaysOffset =================";
show
.wind.tDaysOffset[.z.D;-2;`Days`Period!`Weekdays`W];

-1"=== tDaysCount =================";
show
.wind.tDaysCount[2010.01.01;.z.D;`Days`Period!`Weekdays`Q];

-1"=== EDB =================";
show
.wind.EDB[`M0009808;.z.D-30;.z.D;()];

show
.wind.EDB[`M0009808`M0009809;.z.D-30;.z.D;()]
//TODO: How to test PMS functionality?
/show
/-1"=== WPF =================";
/ .wind.WPF
/-1"=== WUPF =================";
/ .wind.WUPF

-2@/:(
"========================================================================================";
"Test_Wind_API >>> If you can read this line, all tests have been completed successfully!";
"========================================================================================");
"==========================================================================================";
" Test_Wind_API >>> If you can read this line, all tests have been completed successfully! ";
"==========================================================================================");
exit 0
14 changes: 14 additions & 0 deletions Wind_API/Wind.q
Original file line number Diff line number Diff line change
Expand Up @@ -169,6 +169,19 @@ unsub:DLL 2:(`Wind_cr;1);
/q) .wind.unsubAll[]
unsubAll:DLL 2:(`Wind_car;1);

/q) .wind.WSES[`1000011262000000;`sec_close_avg;.z.D-100;.z.D;(1#`DynamicTime)!1#0]
/q) .wind.WSES[`1000011262000000`1000011263000000`1000011264000000;`sec_close_avg;.z.D-100;.z.D;(1#`DynamicTime)!1#1]
WSES:{[F;c;i;b;e;p]
impl.windHack update`date$ts,`$code from
impl.quantData2Table F[(),c;i;b;e;impl.dict2Strings p]
}DLL 2:(`Wind_wses;5);

/q) .wind.WSEE[`1000011262000000`1000011263000000`1000011264000000;`sec_close_avg`sec_turn_avg;`tradeDate`endDate`unit`DynamicTime!(-1 0+.z.D),1 0]
WSEE:{[F;c;i;p]
impl.windHack update`$code from
impl.quantData2Table F[(),c;(),i;impl.dict2Strings p]
}DLL 2:(`Wind_wsee;3);

/q) .wind.h2code[`000001 ;`stocka;()]
/q) .wind.h2code[`000001`600000 ;`stocka;()]
/q) .wind.h2code[`IC00`A1705 ;`future;()]
Expand Down Expand Up @@ -202,6 +215,7 @@ tDaysCount:{[F;b;e;p]
}DLL 2:(`Wind_tdayscnt;3);

/q) .wind.EDB[`M0009808;2011.01.01;2015.06.29;()]
/q) .wind.EDB[`M0009808`M0009809;2011.01.01;2015.06.29;()]
EDB:{[F;c;b;e;p]
delete ts,code from update date:"d"$ts,sym:`$code from
impl.quantData2Table F[(),c;b;e;impl.dict2Strings p]
Expand Down
15 changes: 15 additions & 0 deletions Wind_API/Wind_API.h
Original file line number Diff line number Diff line change
Expand Up @@ -92,6 +92,21 @@ extern "C" {
WIND_API K K_DECL Wind_cr(K qid);
WIND_API K K_DECL Wind_car(K/*NOTE: at least one argument required by `2:'*/);

// (1 x windCodes + n x indicators) or (n x windCodes + 1 x indicators)
WIND_API K K_DECL Wind_wses(
K windCodes, //-11h or 11h or 10h or 0h=(10h;...)
K indicator, //-11h
K beginDate, //-14h or 10h
K endDate, //-14h
K params //0h=() or 11h!0h
);

WIND_API K K_DECL Wind_wsee(
K windCodes, //-11h or 11h or 10h or 0h=(10h;...)
K indicators, //-11h or 11h
K params //0h=() or 11h!0h
);

WIND_API K K_DECL Wind_htocode(
K codes, //-11h or 11h or 10h or 0h=(10h;...)
K type, //-11h or 10h
Expand Down
8 changes: 4 additions & 4 deletions Wind_API/Wind_API.vcxproj
Original file line number Diff line number Diff line change
Expand Up @@ -92,9 +92,9 @@
<EnablePREfast>true</EnablePREfast>
</ClCompile>
<Link>
<SubSystem>Console</SubSystem>
<GenerateDebugInformation>true</GenerateDebugInformation>
<AdditionalLibraryDirectories>$(TargetDir);$(SolutionDir)lib\WindQuantAPI\$(PlatformTarget)\;$(SolutionDir)lib\q\$(PlatformTarget)\;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
<SubSystem>Console</SubSystem>
</Link>
<PostBuildEvent>
<Command>IF EXIST $(SolutionDir)..\..\code\ (
Expand Down Expand Up @@ -136,9 +136,9 @@ IF NOT EXIST $(TargetDir).wind.pass (
<EnablePREfast>true</EnablePREfast>
</ClCompile>
<Link>
<SubSystem>Console</SubSystem>
<GenerateDebugInformation>true</GenerateDebugInformation>
<AdditionalLibraryDirectories>$(TargetDir);$(SolutionDir)lib\WindQuantAPI\$(PlatformTarget)\;$(SolutionDir)lib\q\$(PlatformTarget)\;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
<SubSystem>Console</SubSystem>
</Link>
<PostBuildEvent>
<Command>IF EXIST $(SolutionDir)..\..\code\ (
Expand Down Expand Up @@ -181,11 +181,11 @@ IF NOT EXIST $(TargetDir).wind.pass (
<TreatWarningAsError>true</TreatWarningAsError>
</ClCompile>
<Link>
<SubSystem>Console</SubSystem>
<GenerateDebugInformation>true</GenerateDebugInformation>
<EnableCOMDATFolding>true</EnableCOMDATFolding>
<OptimizeReferences>true</OptimizeReferences>
<AdditionalLibraryDirectories>$(TargetDir);$(SolutionDir)lib\WindQuantAPI\$(PlatformTarget)\;$(SolutionDir)lib\q\$(PlatformTarget)\;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
<SubSystem>Console</SubSystem>
</Link>
<PostBuildEvent>
<Command>IF EXIST $(SolutionDir)..\..\code\ (
Expand Down Expand Up @@ -228,11 +228,11 @@ IF NOT EXIST $(TargetDir).wind.pass (
<TreatWarningAsError>true</TreatWarningAsError>
</ClCompile>
<Link>
<SubSystem>Console</SubSystem>
<GenerateDebugInformation>true</GenerateDebugInformation>
<EnableCOMDATFolding>true</EnableCOMDATFolding>
<OptimizeReferences>true</OptimizeReferences>
<AdditionalLibraryDirectories>$(TargetDir);$(SolutionDir)lib\WindQuantAPI\$(PlatformTarget)\;$(SolutionDir)lib\q\$(PlatformTarget)\;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
<SubSystem>Console</SubSystem>
</Link>
<PostBuildEvent>
<Command>IF EXIST $(SolutionDir)..\..\code\ (
Expand Down
36 changes: 36 additions & 0 deletions Wind_API/Wind_strike.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -173,6 +173,42 @@ WIND_API K K_DECL Wind_wset(K reportName, K params) {
return result.waitFor(qid);
}

WIND_API K K_DECL Wind_wses(K windCodes, K indicator, K beginDate, K endDate, K params) {
std::wstring codes, indi, begin, end, paras;
try {
codes = Wind::util::qList2WStringJoin(windCodes, L',');
indi = q::q2WString(indicator);
begin = Wind::util::q2StrOrX(beginDate, &Wind::util::q2DateStr);
end = Wind::util::q2StrOrX(endDate, &Wind::util::q2DateStr);
paras = Wind::util::qDict2WStringMapJoin(params, L';', L'=');
}
catch (std::runtime_error const& error) {
return q::error2q(error.what());
}

Wind::callback::Result result;
::WQID const qid = ::WSES(codes.c_str(), indi.c_str(), begin.c_str(), end.c_str(), paras.c_str(),
&Wind::callback::strike, result.dup());
return result.waitFor(qid);
}

WIND_API K K_DECL Wind_wsee(K windCodes, K indicators, K params) {
std::wstring codes, indis, paras;
try {
codes = Wind::util::qList2WStringJoin(windCodes, L',');
indis = Wind::util::qList2WStringJoin(indicators, L',');
paras = Wind::util::qDict2WStringMapJoin(params, L';', L'=');
}
catch (std::runtime_error const& error) {
return q::error2q(error.what());
}

Wind::callback::Result result;
::WQID const qid = ::WSEE(codes.c_str(), indis.c_str(), paras.c_str(),
&Wind::callback::strike, result.dup());
return result.waitFor(qid);
}

WIND_API K K_DECL Wind_htocode(K codes, K type, K params) {
std::wstring codeList, codeType, paras;
try {
Expand Down
1 change: 0 additions & 1 deletion q_Wind.sln
Original file line number Diff line number Diff line change
Expand Up @@ -151,7 +151,6 @@ Global
{41577929-CFDA-42D7-9A03-8F77023A8D8A}.Debug|Win32.ActiveCfg = Debug|Win32
{41577929-CFDA-42D7-9A03-8F77023A8D8A}.Debug|Win32.Build.0 = Debug|Win32
{41577929-CFDA-42D7-9A03-8F77023A8D8A}.Debug|x64.ActiveCfg = Debug|x64
{41577929-CFDA-42D7-9A03-8F77023A8D8A}.Debug|x64.Build.0 = Debug|x64
{41577929-CFDA-42D7-9A03-8F77023A8D8A}.Release|Win32.ActiveCfg = Release|Win32
{41577929-CFDA-42D7-9A03-8F77023A8D8A}.Release|x64.ActiveCfg = Release|x64
EndGlobalSection
Expand Down

0 comments on commit ed5455e

Please sign in to comment.