阳光飞狐

【阳光飞狐__与财富同行】

 找回密码
 手机注册

手机动态码快速登录

手机号快速注册登录

查看: 1834|回复: 0
打印 上一主题 下一主题

飞狐交易师 (foxtrader) 连结 DLL 的方法

[复制链接]
跳转到指定楼层
1#
发表于 2019-8-11 16:09:40 | 只看该作者 回帖奖励 |正序浏览 |阅读模式
许多年以前,我曾经在! d* i) f) U6 {5 C
理想公式区发布了
* ~! V4 f8 ~' O( J  U  w"
  ]" F3 B& ~+ U4 d* ~, M. c如何用 Foxtrader(飞狐)连结 C++动态程式库 DLL80x86Macro Assembly (组合语言)
5 U# L$ E( y9 |". H9 t" T$ Z. F! L2 I7 n; ]* R5 ]/ C
6 s1 C/ r; P5 l' h; B) [8 e
现在更新foxtrader(飞狐交易师)
/ [- \$ B3 s3 O
连结 DLL的方法
  P) @* @- B+ m7 T0 d: W# r+ t7 a8 Q2 Z* z: Y2 h+ S
foxtrader- - > DLL (C++ and assembly) = ( foxfunc.h + foxfunc.cpp +pow10.asm )
, U+ X; ~; \+ t+ h! p* y) vgauss- - > DLL (C++ and assembly) = ( foxfunc.cpp + meigj.asm )
! D& _) s8 M4 s$ Qgauss只用到函数参数传递,所以使用新的 c++compiler, 不受影响
6 W) z- z8 D* ?% o! Q$ g& yfoxtraderfoxfunc.h宣告的结构型态 (struct)2004vc++ 6.0 全部有效
0 k1 F5 r. r3 A* i# Z- @% L! c0 q) U+ X2 ~& d9 A4 o  ~$ \) ^" e$ _
也就是这五个结构都能用" h; B1 W& x3 _, e6 b: L9 k
typedefstruct tagSTKDATA % n/ }: b( B  W% m+ R
typedefunion tagSTKDATAEx
+ N2 |( }" ~7 N1 `& t* K' jtypedefstruct tagSPLITDATA 2 A1 m. X  _0 K5 @7 I/ `- `
typedefstruct tagCALCPARAM# G4 D" H) M& m" Y
typedefstruct tagCALCINFO
8 R# e) \4 L+ k! B* A. T7 Q# q- S" O4 e
2008年起,vc++ 2008, vc++ 2010, vc++2017 struct的编译,已经完全 c++,不再相容于 C% r9 q$ m* X5 y
也就是这五个结构中7 B9 C6 X: o3 i3 ?5 g
typedefstruct tagSTKDATA
8 P- y! c' A6 Z4 x9 l' U4 Ctypedefunion tagSTKDATAEx
+ @0 ]# E4 @2 H( j$ |( ]$ htypedefstruct tagSPLITDATA / X, p. z0 C+ P* t. y6 f1 m$ r- b5 ~
typedefstruct tagCALCPARAM* W! w$ o0 j, g: l6 H& V0 F/ ?
typedefstruct tagCALCINFO
/ C$ h8 v! r/ q只有这两个可以用" ^/ x6 @( h! r7 K; r
typedefstruct tagCALCPARAM; t7 s$ e0 p# @# O3 g. \6 @
typedefstruct tagCALCINFO6 q" r! ]. p5 H% s; h& [
值得庆幸的是,下面这个结构的函数参数传递个数可以有无数个4 G4 F" a1 `; _
typedefstruct tagCALCPARAM: }  K3 K4 ~+ E+ _( d) ?6 Q. `
例如:foxtrader
, D$ U* {6 ]5 Y1 A4 a, d  @MA1:=MA(CLOSE,3);
4 d# V" Q1 J1 w2 EMA2:=MA(CLOSE,6);; d' F) _$ B- \' b
MA3:=MA(CLOSE,12);3 O* A$ [& @1 [
MA4:=MA(CLOSE,24);1 [- e; n- M7 |' h$ {% L" E
MYBBI1:"MYFUNC2017@MYBBI"(MA1, MA2,MA3,MA4,MA3,MA4,5)*0.95,colorff00ff,linethick3; {2017 vc++ 15.0}0 g; v3 O3 k1 ^4 B
其中MYFUNC2017=MYFUNC2017.dll, MYBBI = MYFUNC2017.dll 中的MYBBI函数,这里 MYBBI函数传递的参数共有 70 t# f  m3 ?7 M& O9 {
下面这两式计算结果相同( i5 f. {# X/ k
xx:(MA(CLOSE,3)+MA(CLOSE,6)+MA(CLOSE,12),MA(CLOSE,24),MA(CLOSE,12),),MA(CLOSE,24)/6*0.95,color0000ff,linethick2;{foxtrader 自行计算}
# ?: `' M8 q6 HMYBBI1:"MYFUNC2017@MYBBI"(MA1, MA2,MA3,MA4,MA3,MA4,6)*0.95,colorff00ff,linethick3; {2017 vc++ 15.0 , dll计算}  P, F5 G' u( n  ?. {
其他例子" M* v4 L) I! I+ A" a. S; c9 V
oooq:="MYFUNC2008good@MYMACLOSE"(c,,c,c,6),colorffffff,linethick5;(---> pow10.asm)0 b$ ], S, B7 m& u: g7 S
oooq1:"MYFUNC2010@MYMAVAR"(ma(c,5),5),colorgreen,linethick5;5 d( Y8 T4 a. R
其中pow10.asm里面有很多不同定义或宣告被注解不用,那是因为后来在逐步侦测法修改语码中才发现在foxfunc.cpp主程式中,下面这行错误,也就是新的 compiler不再相容于 C,因此在pow10.asm里面被注解不用的定义或宣告中,有些应该是可以用的
3 h% _! C- e* D7 Q  OfTotal= pData->m_pData.m_fClose; // @@@@@@@ vc++ 2010 cl.exe 使pData->m_pData[i-j].m_fClose错误
7 A  F  V. n' n7 \5 B! [6 Q, h( z& D/ ~* Q4 ?  M4 Z

( b' F2 Z' G9 j" o" f9 s8 _5 y////////////////////////////////////////////////////////foxfunc.h
; L1 Q1 `5 R* ]#ifndef__FOXFUNC_H_INCLUDE
2 y! {% _/ U8 W- K5 s  h#define__FOXFUNC_H_INCLUDE6 X1 W  q- r" L; F7 b
/*
" k2 h! o) u& e% w4 S) U4 ~飞狐交易师“C语言接口”扩展程序调用接口规范V3.0
) _# G2 U* ~4 N; ~, b. ^, h  ]8 K1.本规范适用于飞狐交易师V3.x公式系统.
. A% b6 |' |. B0 c7 Q" [! a. F2.扩展函数用于实现系统函数不能实现的特殊算法., C0 U. w! Z' R  }3 Y
3.扩展函数用windows32位动态连接库实现,建议使用MicrosoftVisual C++编程.
- b3 X, A- W8 o  q6 v4.调用时在公式编辑器中写"动态库名称@函数名称"(参数表)即可,例如下面函数可以写为"FOXFUNC@MYMACLOSE"(5)
: Q0 b* K7 U, w0 N  ^! h5.动态连接库名称和函数名称可以自己定义.: n1 ^3 z, f7 ~( b( c( n
6.使用时必须将动态库拷贝到飞狐交易师安装目录下的FmlDLL子目录下使用.4 k3 j9 x* s% i3 }  I5 i, _& `
*/# \  [7 h+ {( S0 C1 S1 d1 z
#ifdef__cplusplus+ l- W: |' N1 K7 k" s" X( C# u/ G
extern"C"
( y) R. W6 W# D{# I5 K" k2 Y1 e
#endif//__cplusplus
2 M# a# L6 b* J4 G///////////////////////////////////////////////////////////////////////////, O6 r6 o7 T. s, Y3 H4 R" q+ L" c! ^
//分析周期
! W+ s9 D& A, EenumDATA_TYPE
% g6 b. R  e! c6 e2 d, v" x{
& ~' j6 o8 i$ t& D$ bTICK_DATA=2,//分笔成交
; c3 {2 K. E* x5 n. n& VMIN1_DATA,//1分钟线" H6 Y! s0 ~% `# S2 c
MIN5_DATA,//5分钟线 + k8 i% E4 y9 @
MIN15_DATA,//15分钟线
; b# D( ?7 C+ q3 z2 gMIN30_DATA,//30分钟线: b! G2 M# \7 Y  t% [1 l6 m
MIN60_DATA,//60分钟线9 D1 }$ ]) L. M' N/ O
DAY_DATA,//日线" ~5 N6 |# d" ~: E6 M
WEEK_DATA,//周线
6 X: u( s: a# UMONTH_DATA,//月线; Q+ u; L$ k" b, X
YEAR_DATA,//年线$ f5 f2 ^! P3 o
MULTIDAY_DATA,//多日线
; u$ `5 `) B% Q* X5 tMULTIMIN_DATA//多分钟线5 d" A9 x  l9 I) D* j- O; ~
};
/ f' k8 f" h, C- d8 |5 Y+ Z4 J$ b% A///////////////////////////////////////////////////////////////////////////: w$ e5 q! Y/ _4 R
//定义取用股票基本数据的结构 只有 VC++ 6.0 compile成功使用
$ [9 f' H7 {% q3 }8 ~2 ktypedefstruct tagSTKDATA
0 ?8 N: P/ a. |; Q{
; {8 E9 }! |# X- l- G1 L_tm_; //时间,UCT
8 K2 f. ^, p* y( afloatm_fOpen; //开盘 open
* W" q" s9 C- h# }, Sfloatm_fHigh; //最高 high
+ h7 X' J' Y3 w2 Y: J. yfloatm_fLow; //最低 low/ U5 f; r$ e, V! i! K6 e
floatm_fClose; //收盘 close
4 X: b- q7 V' \2 c8 |3 ?floatm_fVolume; //成交量 Volume' q: r6 `1 _' P6 i6 Q' a  m
floatm_fAmount; //成交额 amount/ T. s" n& c! q7 R) ^7 a0 d
WORDm_wAdvance; //上涨家数 仅大盘有效" ?2 c+ H5 \# ^3 _2 f) S
WORDm_wDecline; //下跌家数 仅大盘有效9 T/ T" ?) T& ~! M
}STKDATA;1 p0 |) J: j; C7 j/ }) Y8 e
定义STKDATAtagSTKDATA的简单别名,STKDATA / i/ W+ h9 c: W5 M3 r4 E: M9 S
为真正方便使用名称,tagSTKDATA 为定目的的过水名称' q. ]" t2 m+ `6 F' _  y
////////////////////////////////////////////////////////////////////////////
  J" i1 `3 G* f//扩展数据,用于定义取用分笔成交数据的买卖盘 的结构
  t: r) J; T) |typedefunion tagSTKDATAEx
- P8 |* Q7 @+ Q3 v; h: Z{
* r2 N2 _) u2 f) ?5 u) B. T! H- h6 jstruct2 g2 ~) r# L7 @4 M% }
{
" s- D5 [% ^+ p# ?% f& i  W) |: _4 Jfloatm_fBuyPrice[3]; //1--3floatm_fOpen; //开盘 open2 Q8 V, W' A( G/ a( G* Y1 ^
floatm_fHigh; //最高 high
$ v, t* N) e8 I! w1 afloatm_fLow; //最低 low9 \6 }1 Q7 e, f' G  H
floatm_fClose; //收盘 close
& @+ r7 ~7 H' H. S' u& c! Y8 hfloatm_fVolume; //成交量 Volume
7 y4 f* y; J/ K/ Hfloatm_fAmount; //成交额 amount0 N  O6 @4 E" @* u# q
floatm_fBuyVol[3]; //1--3
2 i" C4 w, a2 ^) i! wfloatm_fSellPrice[3]; //1--3' I" ^3 o6 a1 {' K5 Q- L0 \
floatm_fSellVol[3]; //1--3
6 m# Y1 {  L- u3 _3 d};
, ?( z% w4 |1 |0 I- l+ m3 N% efloatm_fDataEx[12];) Z5 c$ ^/ G" f- T7 z2 w* ]
}STKDATAEx;
$ v& J4 o$ H5 r* G5 m////////////////////////////////////////////////////////////////////////////
! N- Y* @7 U6 n- @4 m//定义取用除权数据的结构
2 G7 ~3 |5 f8 W$ t( g. k  F/ |3 Stypedefstruct tagSPLITDATA
, h9 K: I* Z; J" ?2 g/ h) g{) p- v! Y$ G5 [1 C, a, E
time_tm_time; //时间,UCT. g* i+ ?' S. Y) a/ ~
floatm_fHg; //红股. _# u4 R  K! p4 t3 g. m
floatm_fPg; //配股
. o* B5 I7 o- b! |) _; Gfloatm_fPgj; //配股价
  K7 {* P( Z1 [floatm_fHl; //红利
) u& R# A7 B5 M0 E& l. n}SPLITDATA;
! G8 L0 K# n# m- G/////////////////////////////////////////////////////////////////////////////1 o% g4 S: I2 n
/*财务数据顺序(m_pfFinData内容)
1 a; a' d( u  D4 E序号内容1 E5 A& P& D/ F' K/ M2 f
0总股本(万股),9 w' s9 S4 r" o' C4 j
1国家股,
4 _% G8 _$ z( o8 ]2发起人法人股,
( R& k& V  J" L" j- ]3法人股,
3 q7 s1 E, G' b; z4B,7 N- U' R" M& H+ P0 m5 H1 P9 a
5H,8 z, j  H. V6 k4 I& `
6流通A,; Z. M! v' U5 a4 G! c
7职工股,; y! K  [* e& v6 S( O3 e
8A2转配股,
* P: ]' |0 A8 S/ i& t9总资产(千元),' `" ]  \/ b( o! O9 u+ U
10流动资产,, v7 [: \5 U& [8 w
11固定资产,& H. T* }$ H8 Q: S, V: S/ m+ M
12无形资产,) ^+ j" ]- ?2 O7 g, u/ n
13长期投资,6 z; Z  [' ~" q, W
14流动负债,
9 U# O2 s0 ~+ i. `) X15长期负债,
9 h; H' V& p7 [' d, f16资本公积金,$ N$ R6 `  O  m! B1 b& Q7 y
17每股公积金,
! c$ p' o$ J  u( Q18股东权益,7 c* t! ?! ?2 t/ d; R3 v+ w/ K) V
19主营收入,
4 C3 U& z7 U( F  b4 o20主营利润,# z, `' A7 w* x- k1 }. c, E
21其他利润,
  @- S6 n" |; q% r8 L8 d22营业利润,
( S: h8 i7 O5 B. E! ], L" R, m2 c5 Y23投资收益,- M3 p; Q; d  `! i  r7 C: F4 d
24补贴收入,* E- R6 i0 ?; E0 P( G
25营业外收支,! S  Q0 @- R* G1 i: S' W% y
26上年损益调整,7 O) {; Z3 A2 ]7 V. n% U& Z
27利润总额,# w$ u& K% H- s
28税后利润,
9 i6 S1 b! F! `; m1 g7 W: ^29净利润,
4 a& \) Z. l0 e* G3 i30未分配利润,
6 ~7 b( x1 T& v- B& v( j31每股未分配,
3 c8 ]' ~9 |7 L, D" s7 L32每股收益,/ }- B% y& \0 K; M* R, `
33每股净资产,+ X/ y7 D; i6 q; U6 [
34调整每股净资,
1 F7 J4 V* p$ y2 A2 K3 c: I35股东权益比,0 @: A8 c% @* ]0 ^
36净资收益率2 ~  D* B3 w. a: D3 ]; j  D
*/, V6 c: P2 C8 I+ j8 j  M+ N
/////////////////////////////////////////////////////////////$ ]3 L9 c5 X, T7 R- \" s
//定义取用caller函数传递参数项 的结构
0 j2 h. ]3 b. k  k) q0 Atypedefstruct tagCALCPARAM$ ~6 U7 \3 e* L
{
/ d. g+ a) K5 d) U+ [+ F. d% Zunion; K' B; J9 P/ Y0 |
{
( F  U% @( F" ^4 I7 a  p. Dconstfloat* m_pfParam; //指向序列参数的址标,指向一个浮点型数组pointertofloat variable parameter / ex. c,h,l,o, co2...co2=(c+o)/2
  A! O5 R' L/ _/ X8 i# l& ^" C, oconstfloat m_fParam; //数值参数 valueof parameter
" i9 R3 `" i  f; H  V" g};# I7 U! v# n4 V
constint m_nParamStart; //序列参数有效起始位置thestart address of variable parameter / ex. c,h,l,o,co2.....
" Y4 ^- ~% m' T/ ]) o3 P- i+ s}CALCPARAM;2 X8 @  x/ ]0 ~$ X& B3 [0 i
/////////////////////////////////////////////////////////////////////////////
3 H, ^* d9 o; |- @7 W" \( u//定义全部取用址标 的总结构 (各指标指向前述各结构以便取的各结构的数据,接口信息数据的结构 )
+ }7 O+ i2 R0 Q0 Ctypedefstruct tagCALCINFO. d! T# H9 @. F9 p0 W% l+ Q
{* w, g/ f/ L6 ?0 k/ Q! u
constDWORD m_dwSize; //结构大小
) E, y1 }4 }6 f2 GconstDWORD m_dwVersion; //调用软件版本(V2.10: 0x210): ]  Y% G2 G, R& {
constDWORD m_dwSerial; //调用软件序列号) V: _/ m4 j2 p4 d" ^
constchar* m_strStkLabel; //股票代码
8 n0 ~0 b  x  M& A% tconstBOOL m_bIndex; //大盘
: @  m7 i% T1 gconstint m_nNumData; //数据数量(pData,pDataEx,pResultBuf数据数量)数据长度' G8 P6 Z3 e. P( ~3 z! j/ Y
constSTKDATA* m_pData; //常规数据,注意:m_nNumData==0时可能为NULL
7 s- `- i/ U& h2 J8 h; oconstSTKDATAEx* m_pDataEx; //扩展数据,分笔成交买卖盘,注意:可能为NULL
& Q7 ?! |( @5 ]3 ~6 V1 c; a) X. \7 Fconstint m_nParam1Start; //参数1有效起始位置<0/ constant parameter >0 /variable parameter
+ ?/ Z. ?. X7 }" C8 N) V2 Qconstfloat* m_pfParam1; //调用参数1/pointer to variable parameter 1
  Y7 k4 m4 c8 U( D5 Y/ Vconstfloat* m_pfParam2; //调用参数2/pointer to variable parameter 2
; U! r! @- C& b; f( C. k) a; n% `  @constfloat* m_pfParam3; //调用参数3/pointer to variable parameter 31 j$ k( e$ m3 o
constfloat* m_pfParam4; //调用参数4/pointer to variable parameter 4
) w' i, [" x  `" F, \+ Qfloat*m_pResultBuf; //结果缓冲区
. K& I5 t4 F4 y5 }+ wconstDWORD m_dataType; //数据类型' U$ d* E3 n. G5 f% Q! H6 {
constfloat* m_pfFinData; //财务数据: y5 g% T4 m' K, R. i% e
//以上与分析家兼容,所以沿用其结构和名称
0 L2 I  O# f' w1 t: E0 C//以下为飞狐交易师扩展(fortagSTKDATAEx)
' U, T3 o/ a* {' E) [constDWORD m_dwReserved; // 保留/ [* C/ U& ]6 N2 i9 r8 c
constint m_nNumParam; // 调用参数数量
3 s. K, m' j; N, m7 v, _; m( FconstCALCPARAM* m_pCalcParam; // 调用参数数组0 F  o7 G  e% ]. j. `' B6 ]
constDWORD m_dwReservedEx[4]; // 保留
2 Q0 l$ r1 g6 S  E% e% {( Achar*m_strStkName; //股票名称
; `$ h( J  C! ^! ^+ z2 BSPLITDATA*m_pSplitData; //除权数据4 X) T' g/ L# @% p: W1 `* L6 P
intm_nNumSplitData; //除权次数2 n& {" s1 w, ?: U$ h$ X6 r9 [
}CALCINFO;! F0 p! O* r# P; L4 W
/*
' v8 \+ k% V+ V* F2 I3 Q1:(与分析家兼容)
2 N) l9 l* W- x! D: |) ~3 |  {1.函数调用参数由m_pfParam1--m_pfParam4带入,若为NULL则表示该参数无效.
% F& D6 R  d& P, l7 i! F9 j6 x4 r( y2.当一个参数无效时,则其后的所有参数均无效.
9 u9 B- H. U4 o:m_pfParam2NULL,m_pfParam3,m_pfParam4一定为NULL.
9 [* M! x% X. [7 I9 d3.参数1可以是常数参数或序列数参数,其馀参数只能为常数参数.
4 D/ v% F3 q1 q4.m_nParam1Start<0,则参数1为常数参数,参数等于*m_pfParam1;
4 Q5 _  _7 i2 }2 V5.m_nParam1Start>=0,则参数1为序列数参数,m_pfParam1指向一个浮点型数组,
, M- L& V9 D3 ?$ B. l数组大小为m_nNumData,数据有效范围为m_nParam1Startm_nNumData-1.% `& W! C4 g) `* P) O
在时间上m_pData[x]m_pfParam1[x]是一致的$ ^/ M" m, @$ E( B3 Z
2:(飞狐交易师扩展)7 w1 q8 e: p" h) |1 c- T8 I
1.该扩展结构使调用参数在技术上可以是无限数目的,且每个参数都可为数值或序列,由公式中实际的调用参数决定。5 Z( [" c$ x* c9 m$ c3 C3 @+ Z& h
2.CALCPARAM结构用于带入参数信息和实际数据,m_pCalcParam数组大小为m_nNumParam,数据有效范围为0 m_nNumParam-1.
' J4 K% Y* B2 F8 i6 V; z! v3.按参数的顺序,m_pCalcParam[0]为第一个参数的数据,m_pCalcParam[1]为第二个参数的数据...,为了保持兼容,原m_nParam1Startm_pfParam15个属性依然有赋值。
1 G% a: ]5 B$ k' I( y/ x3 C4.i位置的参数为数值,取用m_pCalcParam.m_fParam.; r+ _7 c  O) ?3 F7 D9 G! c' q+ \
5.i位置的参数为序列,取用m_pCalcParam.m_pfParam,数组大小为m_nNumData,数据有效范围为m_pCalcParam.m_nParamStartm_nNumData-1.m_pCalcParam.m_nParamStart<0,则此数组中无有效数据。
0 A" \" J. _% z0 D6.由于可以调用多个序列,许多序列的计算可以先在公式中进行,然后作为调用的参数即可。
+ h% L8 Z- l9 z: L% J% J7.经此扩展,对分析家的DLL依然可以调用、兼容。2 |; n4 H) B, ^9 ~4 h) U% \$ }
*/
" p4 j. A8 t8 a6 B///////////////////////////////////////////////////////////////////////////////////
9 G) v$ w, N* F8 ~% `& d) R' o: I! @/*函数输出2 ]3 ~# N9 P3 L1 K3 b
__declspec(dllexport)int xxxxxxxx(CALCINFO* pData);
, J" D: m6 b; {+ Z: L/ ?1.函数名称需全部大写.3 F6 Q: x4 P4 h& J& j; B% t
2.函数必须以上述形式声明,请用实际函数名称替代xxxxxxxx;  g" x5 l) U+ a9 M% i6 q
对于C++程序还需包括在extern"C" { } 括号中.
% T! d: d' P2 F' l5 `5 u3.函数计算结果用pData->m_pResultBuf带回.
- h, t+ a, F# v) v! _! f4.函数返回-1表示错误或全部数据无效,否则返回第一个有效值位置,:
; t1 [* E# R; }' ^m_pResultBuf[返回值]-- m_pResultBuf[m_nNumData-1]间为有效值.: c1 A" x0 w, y# o
5.函数名称长度不能超过15字节,动态连接库文件名不能超过9字节(不包括扩展名),动态库名称不能叫SYSTEM,EXPLORER
6 J/ C+ Y; {0 T3 n*/
. R6 A- S9 [" H) k//示例函数,使用时用实际名称替换0 Q0 }7 r& o1 @# o3 I: e
__declspec(dllexport)int WINAPI MYMACLOSE(CALCINFO* pData);
, p5 t6 {& a- R__declspec(dllexport)int WINAPI SMOOTH(CALCINFO* pData);
& A2 i; g" s# y, a' \//__declspec(dllexport) int WINAPI MYMAVAR(CALCINFO* pData);0 k" @2 ]0 k8 x- M9 y5 O% M
__declspec(dllexport)int WINAPI MYBBI(CALCINFO* pData);2 r, Q% u6 k1 k, I7 \" r. _& Q2 z
//WINAPI = _stdcall3 q5 [& {; W8 e# D( p. i* P6 M
#ifdef__cplusplus
+ n0 |& o% Z. |3 o7 m; L8 W}( x4 y& U4 v5 z+ q# G
#endif//__cplusplus
' n8 d( P' w) g% h. q#endif//__FOXFUNC_H_INCLUDE
6 \# N$ J! R0 p* L2 I. i( G, n" r* S3 P" @
//////////////////////////////////////////comment 注解
2 U! s- H( E% C% A& t2 r__declspec(dllexport)int WINAPI MYMAVAR(CALCINFO* pData)
9 r4 z* u9 P* f; D2 D& w$ UpData是指向 址标总结构 CALCINFO的 总址标5 n% \. L3 ]  H3 \: y+ `6 a
取用第二个参数数值floatfParam = *pData→m_pfParam2 5 w9 H, G( i- r/ z: C
取用第一个序列参数的址标constfloat* pValue = pData->m_pfParam1;
; H- b. s7 q8 c9 q* o2 T取用股票数据长度intndata = pData→m_nNumData;
8 X* \1 L' p/ T! U6 q# _4 X/ U第一个参数存在且为数值pData->m_pfParam1&& pData→m_nParam1Start<0
- t4 H( A" {  C/ h. C5 _! B: b3 _第一个参数存在且为序列pData->m_pfParam1&& pData→m_nParam1Start>=0
, F; P* @2 b' T# G' d& L第一个及第二个参数存在且为序列,第三个参数不存在pData->m_pfParam1&& pData->m_pfParam2 && pData->m_nParam1Start>=0&& pData->m_pfParam3==NULL6 {4 g+ o: x3 X% k! w( i8 @5 ?
constfloat* cpParam = pData->m_pfParam1; 定义cpParam为第一个序列参数的址标
! H% V2 {1 _; R8 x0 _取用股票数据结构
9 ?7 r9 i0 L+ _( n5 mpData→m_nNumData= 变数数据长度
+ a( o0 W9 `. EpData→m_pData= pointer to struc STKDATA 的址标1 P2 H( i) V9 V: s
pData→m_pData[x]数据结构的第x个数据3 ~1 x0 R$ @% N2 ^
pData→m_pData[x].m_fHigh数据结构的第x个数据中的 High6 G; W. |% G! x! S! [" L) e
取用结果缓冲序列
* I  X+ p/ d9 X. Y) A$ h. \" LpData->m_pResultBuf- [) r; X- v" f, g( t# u: v  O, s, l
取得第一个序列参数的起始序位,2,...5 , . 7...
5 S1 B( o  z6 X4 Q' HintnFirst = pData->m_nParam1Start; 2 \( K7 {5 G& y
for( i = nFirst+nPeriod-1; i < pData->m_nNumData; i++ )
+ O5 P; r+ e. p# Y- z1 V- J取得第二个数值参数的数值
8 k* z  V3 b8 b8 g8 u) ^" ]% efloatfParam = *pData->m_pfParam2;
# Y6 l" A0 k5 v2 h4 N$ h  y% ~intnPeriod = (int)fParam;
6 {; O5 w( h; q8 ?0 q取用第一个序列参数的址标constfloat* pValue = pData→m_pfParam1;& d& ]! |. V" r$ c
取用序列参数的单个直pValue
' _$ v7 P$ R" q取用缓冲序列的单个值pData->m_pResultBuf
) J6 u7 N+ a% q2 w! JconstCALCPARAM* m_pCalcParam; // 调用参数数组
" U" u9 N" c- ~% ~4 Y8 {+ rm_pCalcParam为序列址标,指向各序列参数的指标: L$ }, ?) V: m% ^9 V
第一个序列参数pData→m_pCalcParam[0]2 n8 ]- @+ m! I+ a3 Y
constfloat* m_pfParam; //指向序列参数的址标% g/ Y2 Q( r# ?5 _) y+ A
第一个序列参数的起始序位pData->m_pCalcParam[0].m_nParamStart; `  l  U7 z* N8 g8 Z1 P4 V; E
第一个序列参数的址标constfloat* pValue1 = pData→m_pCalcParam[0].m_pfParam;
. z8 a# M5 U: ?! K1 q9 c5 H取用第一个序列参数的单个直pValue1" P1 O9 I" s: d" K# m, U1 ]# ^/ O
第二个序列参数pData→m_pCalcParam[1]2 ^0 c9 b, i% f
第二个序列参数的起始序位pData->m_pCalcParam[1].m_nParamStart
' D1 n9 F7 C; q7 M9 r- l( ^. G% D第二个序列参数的址标constfloat* pValue1 = pData→m_pCalcParam[1].m_pfParam;
9 b# d  K% V; }/ k# Z+ ?5 Q取用第二个序列参数的单个直pValue26 V) a4 B+ i) M+ ], Q
第三个序列参数pData→m_pCalcParam[2]
2 A; \+ E. J  x第三个序列参数的起始序位pData->m_pCalcParam[2].m_nParamStart
8 d0 m) \( W3 @' P, X& A. p第三个序列参数的址标constfloat* pValue1 = pData→m_pCalcParam[2].m_pfParam;
6 q8 S# f' D' S5 m1 l% b取用第三个序列参数的单个直pValue34 d% U- A; ~, @" R% L) p( Y6 F9 I
第四个序列参数pData→m_pCalcParam[3]. q- p  J! {( ?  l( q
第四个序列参数的起始序位pData->m_pCalcParam[3].m_nParamStart
; M0 f& n: T+ X0 a% F第四个序列参数的址标constfloat* pValue1 = pData→m_pCalcParam[3].m_pfParam;
1 v% e% B" S, P, e; }1 M$ `取用第四个序列参数的单个直pValue4
& G* M0 `1 \7 _2 |  o. A- g, s, W0 I如果有四个序列参数,则取用序位最高的那一个序位
" j4 x$ z( R/ o9 r% a8 Qif( pData->m_pCalcParam[0].m_nParamStart >= 0 &&& L( r7 U7 |) A( l
pData->m_pCalcParam[1].m_nParamStart>= 0 &&& m  p1 x7 X- n% \! O2 B- q
pData->m_pCalcParam[2].m_nParamStart>= 0 &&$ h. T% d0 L/ ?0 N/ [" j, Q( b- Q
pData->m_pCalcParam[3].m_nParamStart>= 0 ) //4个序列都含有效数值
9 I! \+ H  f& d7 j% P{
. W7 w  m+ C, c) O, i2 l: c) C( [//计算返回的序列的第一个有效值位置
" W1 W6 b: ^0 G" h/ L  D* r5 H1 fintnFirst = pData->m_pCalcParam[3].m_nParamStart;//已知返回的序列的第一个有效值位置与第4个序列一致4 i' J* V8 `2 w/ A  w
//若不知,则
* j/ Y0 j2 I! g/*
" D* s3 p! b) H- }# r) JintnFirst = pData->m_pCalcParam[0].m_nParamStart;  l4 e! w. a! P+ S
if( nFirst < pData->m_pCalcParam[1].m_nParamStart )
+ z% D  g$ n  s* G9 P0 }! e5 ~nFirst= pData->m_pCalcParam[1].m_nParamStart;/ _8 `+ f# \- g6 P, l: {
if( nFirst < pData->m_pCalcParam[2].m_nParamStart ) % r; N! D/ o+ u1 o5 H$ }
nFirst= pData->m_pCalcParam[2].m_nParamStart;
3 c# d1 }" q4 ?$ s! ?if( nFirst < pData->m_pCalcParam[3].m_nParamStart )
- {) @9 v- @; x, f8 F' M( F5 HnFirst= pData→m_pCalcParam[3].m_nParamStart;/ |; s1 |  @% c) I( G" x
constfloat* pValue1 = pData->m_pCalcParam[0].m_pfParam;2 q% K8 k; a/ h8 B/ J, A3 B
constfloat* pValue2 = pData->m_pCalcParam[1].m_pfParam;! r) v" I3 w+ U- S3 K
constfloat* pValue3 = pData->m_pCalcParam[2].m_pfParam;/ d  j4 w2 Y& |% l& r
constfloat* pValue4 = pData->m_pCalcParam[3].m_pfParam;
3 m! E, T" t5 h+ r//-------------------0 S  G% }9 g( s, d1 T2 M
floatm_fOpen; //开盘 open  w5 [7 o" R6 D+ A- z8 Q- z( D7 |
floatm_fHigh; //最高 high
  }, C7 I  c/ O( a" |/ T/ ?floatm_fLow; //最低 low6 ^- Q) S  D( m: J  l! K; I% D/ H* k
floatm_fClose; //收盘 close" K" H: i2 t) n- R8 `# }9 L
floatm_fVolume; //成交量 Volume- B" Q3 N) J- F7 a9 X, N
floatm_fAmount; //成交额 amount
& j# S7 y$ D- {4 [0 Y$ U1 [, O调用收盘据
, C  u8 _5 T2 s9 P4 e* K" }pData→m_nNumData= 变数数据长度
0 W3 K1 q7 q, U$ x0 L$ upData→m_pData= pointer to struc STKDATA4 Y+ m# N! ]6 V6 B
pData→m_pData[x]x个数据
6 P( q3 N; c- z/ L0 }pData→m_pData[x].m_fHighx个数据中的 High# Q& o% A6 v" k
@@@@@@@@@@@important !!!!!!!
4 \4 C2 j9 ~4 C& p+ U% }+ \) m; D2 Q2 `sinceVC++ 2008, cl.exe will make ‘pData→m_pData[i-j].m_fClose’ anerror( v, r' M( V% r
so,pass the high,low,open and close just from the function parameter ,that is use ‘ CALCPARAM’ struct3 z# b: k; }+ `6 [+ w6 j( J4 |
pData->m_pData[i-j].m_fOpen// to use open , there is no way in using a varable for calculationoutside foxtrader% K' O( V/ f) w
pData→m_pData[i-j].m_fHighto use high
4 k+ j# P' k2 W  z- TpData->m_pData[i-j].m_fLow' e$ [; h2 \6 X% V
pData->m_pData[i-j].m_fClose
4 h- ~! P( b% L  W9 am_pData= pointer to struc STKDATA8 o) a: M  x5 K2 i$ G
incalling C++ dll function
7 ^5 D5 J9 N+ I4 r6 rm_pDatais passed to pData (CALCINFO* pData . A CALCINFO* type pointer)) |8 M( F0 E( g) W8 M/ C
touse a single value in variable ‘High’
/ \/ O  X% K: n0 T# p$ ppData→m_pData[i-j].m_fHighto use high% e/ C" z# x+ ~; K" o* F( F
constfloat* m_pfParam1; //调用参数1/pointer to variable parameter 1
" m. `7 ~: V) U. M; F; Qconstfloat* m_pfParam2; //调用参数2/pointer to variable parameter 2
- Q* l( I3 ?$ {  Jconstfloat* m_pfParam3; //调用参数3/pointer to variable parameter 3" j& D! m4 L+ \" P. Z
constfloat* m_pfParam4;
# {3 L/ N: W5 H# q! e6 i- b/ om_pfParam1,m_pfParam2, m_pfParam3, m_pfParam4 = pointer to caller function 的参数
" P3 ~+ K& \" JpData→m_pfParam1= pointer to 第一个(序列)参数
% ]/ `) W" f* ~* [9 W9 HpData→m_pfParam1[x]= 取用第一个(序列)参数的第x 个值
  _5 h. T( B# @" F( F; hconstfloat* cpParam = pData→m_pfParam1; =定义 cpParampointerto 第一个(序列)参数
0 H# v/ w# m) |cpParam[x] = 取用第一个(序列)参数的第x 个值/ E: s. N. x2 r
m_pResultBuf= 结果缓冲列  y  y  t6 J# N
pData→m_pResultBuf= pointer to 结果缓冲列
) i1 ~  x) m- `+ Y- cpData→m_pResultBuf[x] = 取用结果缓冲列的第 x个值3 v8 q$ ~. o( L5 M9 t- i
//////////////////////////////////////////comment# }4 ?, S1 q2 l% H% @! \7 c
//////////////////////////////////////////comment 注解
( p: J1 X6 U9 k$ Dconstint m_nParam1Start; //统杅1衄虴宎弇离/ V4 [) U9 U& i# h6 E# k
constfloat* m_pfParam1; //覃蚚统杅13 s* n4 S0 A! A; A4 |
constfloat* m_pfParam2; //覃蚚统杅2
. B# D2 g1 y! _' f) Jconstfloat* m_pfParam3; //覃蚚统杅33 O- S  F. h4 W  b. l5 Y
constfloat* m_pfParam4; //覃蚚统杅4,parameters must be <= 4- J5 [, ~3 _3 W6 ^9 Q4 p
//const float* m_pfParam5; // parameters must be <= 4
1 W, m4 ~6 V1 j3 d//const float* m_pfParam6; # U, f6 S1 j# t2 n$ M1 o; K7 n
//const float* m_pfParam7;
* O3 j" v6 P  y//const float* m_pfParam8;
  v7 F% i4 x/ d! D; G8 S//pData->m_pfParam1 && pData->m_pfParam2 &&pData->m_pfParam3 && pData->m_nParam1Start>=0 &&
7 P/ R; S5 e) g! k9 r: S; wpData->m_pCalcParam[0].m_nParamStart>=0&& pData->m_pCalcParam[1].m_nParamStart>=0
6 D! p2 T& I4 {$ C+ ~1 J; a&&pData->m_pCalcParam[2].m_nParamStart>=0) 9 P) j& \% [6 g- o5 j
{" A; B" Z2 _7 F
floatfParam = *pData->m_pfParam4; //pointer ,pData->m_pCalcParam[3].m_nParamStart >= 00 v  E( j) j. u% x' ?$ x
intnPeriod = (int)fParam; //统杅1
# U" ~& J3 d0 r$ P( z; Y' O//const float* cpParam = pData->m_pfParam2; // cpParam = pointer to第一个序列参数,cpParam = 取用第一个序列参数的第i 个值
8 c+ b' s8 e/ i  xconstfloat* cpParam1 =pData->m_pCalcParam[0].m_pfParam; // cpParam =pointer to 第一个序列参数,cpParam = 取用第一个序列参数的第i 个值
& ^- D  T2 W9 \- J4 p; z: c1 Iconstfloat* cpParam2 =pData->m_pCalcParam[1].m_pfParam; // cpParam =pointer to 第一个序列参数,cpParam = 取用第一个序列参数的第i 个值
. M& O0 [5 w+ y/ n+ J6 M3 pconstfloat* cpParam3 =pData->m_pCalcParam[2].m_pfParam; // cpParam =pointer to 第一个序列参数,cpParam = 取用第一个序列参数的第i 个值//parameters must be <= 4
, k9 _" v* @" ]* J8 `) C7 X//const float* cpParam4 =pData->m_pCalcParam[3].m_pfParam; //cpParam = pointer to 第一个序列参数,cpParam = 取用第一个序列参数的第i 个值- Y/ }  a; O) s  j" O* ~
//const float* cpParam5 =pData->m_pCalcParam[4].m_pfParam; //cpParam = pointer to 第一个序列参数,cpParam = 取用第一个序列参数的第i 个值) w" O3 m& e% \  V7 D: v
//m_pData = const struct pointer to struct STKDATA , pointer to structSTKDATA ,
8 ^, i" y; a- ~touse pData→m_pData[x].m_fClose
" u, x8 K! U( A  ^) _% g( i/ rpData→m_pData[x]= | 1,2,3 , … , m_nNumParam | time_t m_time; 3 V0 ^" l% s' a, o2 s+ g
|1,2,3 , … , m_nNumParam | float m_fOime_t 2 v' r, x" A3 ^! K5 z
|1,2,3 , … , m_nNumParam | float m_fHigh;
7 ]! x% y3 {, ^* ^.. .( S: K9 i" l7 v2 g7 W$ ]2 {
|1,2,3 , … , m_nNumParam | WORD m_wDecline;) X- [" S, N# t" n" ~- e1 |
m_nNumParam= 数据high,close,open,low的长度0 ?3 g+ t" `! o
touse high:
% ?# U1 T* C" c% Q  NpData→m_pData[x].m_fHigh& R# V; b; L  u8 l2 X6 V4 d/ @* Y
contentof struct STKDATA0 ^5 ]3 f4 Y6 w: T/ h& g' }9 X
time_tm_time; //时间,UCT
. r* N1 J* y- @; U6 X6 bfloatm_fOpen; //开盘 open
1 W3 {$ l5 d6 T: S& ~2 afloatm_fHigh; //最高 high7 X( t, W; D; i$ @1 t2 C
floatm_fLow; //最低 low
3 m% Q; W- j9 k6 [# tfloatm_fClose; //收盘 close
2 _2 w3 h& k* c- r2 Z9 wfloatm_fVolume; //成交量 Volume9 P( h7 ?& p. q* x# d+ \/ `
floatm_fAmount; //成交额 amount# J& [. ~" }8 G& d3 d0 E9 N
WORDm_wAdvance; //上涨家数 仅大盘有效! \6 y) T8 i( |6 B8 {
WORDm_wDecline; //下跌家数 仅大盘有效7 Q8 c% F! j: k  B7 E: `
调用传递参数及传回结果
) z+ }/ p5 F% E* r' q调用传递参数& \; o" N& S8 A! L0 a" e; O
(pData->m_pfParam1 && //参数1有效Param1exists
0 O) s/ N8 ~% q# r  A0 {8 fpData->m_nParam1Start<0&& //参数1为常数
5 ^% y0 A7 S% |pData->m_pfParam2==NULL) //3 M. Q7 W9 Y! J! D/ v+ \$ x
localprocedure 定义使用变数
; p1 t& q3 a; z0 W# z2 I( Ponstfloat* pValue = pData→m_pfParam1; //use constant参数13 x3 x" E7 {$ n/ B6 @& U: C& {  \
intnFirst = pData->m_nParam1Start; //use 参数1效值起始位
6 h% k  @' Y+ y) [* xfloatfParam = *pData->m_pfParam2; //use 参数2( y  {* c8 F/ S6 d
intnPeriod = (int)fParam; $ P; t5 D6 a0 w0 R$ ?
传回结果; M. T; |) G: G+ J& u% J. z
fTotal+= pValue[i-j];7 c9 Q9 D$ Y3 L" A$ Y$ G" `
pData->m_pResultBuf" x) G/ d1 T# T
//////////////////////////////////////////comment

评分

1

查看全部评分

您需要登录后才可以回帖 登录 | 手机注册 手机动态码快速登录

本版积分规则

QQ|小黑屋|手机版|Archiver|【阳光飞狐】 ( 网站ICP编号:京ICP备06013475号-7 )

GMT+8, 2026-7-20 09:14 , Processed in 0.176465 second(s), 21 queries .

Powered by Discuz! X3.2 Licensed

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表