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

标题: 飞狐交易师 (foxtrader) 连结 DLL 的方法 [打印本页]

作者: ycng    时间: 2019-8-11 16:09
标题: 飞狐交易师 (foxtrader) 连结 DLL 的方法
许多年以前,我曾经在+ v5 [! Z- d2 `  P( P+ m. @; q
理想公式区发布了
2 V6 X; u; M, B"; n7 I# R) [; n: @9 c
如何用 Foxtrader(飞狐)连结 C++动态程式库 DLL80x86Macro Assembly (组合语言)
& v8 S8 K' u* W"
9 n7 e& U" J, @; O  |8 L$ L! @( k$ ?
! P% _; q- r! r& J. t5 b& \9 Y9 B0 ~现在更新foxtrader(飞狐交易师) " @2 \6 ]; X# w5 T
连结 DLL的方法
4 I% e2 J9 |- T
) q; S9 n  i. }" @6 mfoxtrader- - > DLL (C++ and assembly) = ( foxfunc.h + foxfunc.cpp +pow10.asm )% ?" R5 o2 C  }0 Q* A: E# n. x, t/ G0 D
gauss- - > DLL (C++ and assembly) = ( foxfunc.cpp + meigj.asm )! m3 ^! C/ W. A9 S9 c  P7 J: J
gauss只用到函数参数传递,所以使用新的 c++compiler, 不受影响
4 Q% b* ^7 H$ ~5 ]; m$ o2 tfoxtraderfoxfunc.h宣告的结构型态 (struct)2004vc++ 6.0 全部有效
! ~* `% v- j; W$ u/ x- [; |% J% R: W( C3 O
也就是这五个结构都能用# c! ]/ R5 S8 X
typedefstruct tagSTKDATA " u' s! p- k3 ^- g/ t/ k
typedefunion tagSTKDATAEx
. P0 j5 e/ U; v" d& r6 R3 wtypedefstruct tagSPLITDATA
7 l+ R1 {+ @- c/ Y* K1 z) _5 L* btypedefstruct tagCALCPARAM
* x) n0 x( c6 z; B' J0 r+ stypedefstruct tagCALCINFO
5 W+ }1 {" l$ C
* c& K2 G) q0 Z8 w$ e2008年起,vc++ 2008, vc++ 2010, vc++2017 struct的编译,已经完全 c++,不再相容于 C
! d8 D: K, x9 m. H( z4 R也就是这五个结构中/ \( q7 B9 _/ S* s2 B: r
typedefstruct tagSTKDATA 2 y$ ^/ Q2 _% z, I
typedefunion tagSTKDATAEx3 D2 N  \) K; Q  m$ q. @
typedefstruct tagSPLITDATA 8 `# |; F( |( I* x
typedefstruct tagCALCPARAM6 S8 R* ]. ~' x9 \/ m
typedefstruct tagCALCINFO
9 u/ g' t  ]; C! Y1 N只有这两个可以用
4 M2 g: [3 D6 q/ [. stypedefstruct tagCALCPARAM) B4 d6 X" ^4 z3 M# P% R+ b
typedefstruct tagCALCINFO. K) e7 Z2 @! ]/ E
值得庆幸的是,下面这个结构的函数参数传递个数可以有无数个
2 J! P8 ?5 s# P8 [9 F, s, Utypedefstruct tagCALCPARAM
8 B' R: C; Y) D: R例如:foxtrader6 ^2 r1 W2 N$ e) y
MA1:=MA(CLOSE,3);5 I" z: [7 \" N; k
MA2:=MA(CLOSE,6);% V( Y; m1 y+ b* G
MA3:=MA(CLOSE,12);/ D4 ~5 t8 {5 n7 }
MA4:=MA(CLOSE,24);
9 C2 k2 h. P& gMYBBI1:"MYFUNC2017@MYBBI"(MA1, MA2,MA3,MA4,MA3,MA4,5)*0.95,colorff00ff,linethick3; {2017 vc++ 15.0}
/ u1 Z4 w5 i  \! j其中MYFUNC2017=MYFUNC2017.dll, MYBBI = MYFUNC2017.dll 中的MYBBI函数,这里 MYBBI函数传递的参数共有 7
! t" F* Y+ c6 f6 d* x# D4 t" A& D) O下面这两式计算结果相同
$ T4 B$ y. r% @; d, _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 自行计算}
% [: x0 F5 f% {: m7 x/ DMYBBI1:"MYFUNC2017@MYBBI"(MA1, MA2,MA3,MA4,MA3,MA4,6)*0.95,colorff00ff,linethick3; {2017 vc++ 15.0 , dll计算}: f; V; t7 w! j6 ~: k
其他例子# v* d5 O4 I$ Y4 ]. _
oooq:="MYFUNC2008good@MYMACLOSE"(c,,c,c,6),colorffffff,linethick5;(---> pow10.asm)
: c2 i: F2 D. V% M! G6 ooooq1:"MYFUNC2010@MYMAVAR"(ma(c,5),5),colorgreen,linethick5;. k) D' N0 _5 }
其中pow10.asm里面有很多不同定义或宣告被注解不用,那是因为后来在逐步侦测法修改语码中才发现在foxfunc.cpp主程式中,下面这行错误,也就是新的 compiler不再相容于 C,因此在pow10.asm里面被注解不用的定义或宣告中,有些应该是可以用的
+ d+ B/ m4 _) F: V0 U- w( q* ffTotal= pData->m_pData.m_fClose; // @@@@@@@ vc++ 2010 cl.exe 使pData->m_pData[i-j].m_fClose错误/ O+ K/ `9 g9 Q8 H, ~
3 w& G0 \1 v% ]/ ~6 F
' h' s5 i- |" |
////////////////////////////////////////////////////////foxfunc.h# Z7 W( _5 W8 T% ^9 i, `: y2 Z
#ifndef__FOXFUNC_H_INCLUDE
7 [6 _( r  Z+ a" w3 _  f#define__FOXFUNC_H_INCLUDE8 J; I5 H9 s7 I
/*; V" V! I  _  Q: f3 E1 e
飞狐交易师“C语言接口”扩展程序调用接口规范V3.01 v9 b' b* a* D  ?9 H; _- b
1.本规范适用于飞狐交易师V3.x公式系统.
# ?1 F( B3 h* c+ {1 F9 E1 T( P2.扩展函数用于实现系统函数不能实现的特殊算法.  r. s4 z' R, B) M5 K1 z
3.扩展函数用windows32位动态连接库实现,建议使用MicrosoftVisual C++编程.- ]. L5 b; \0 L- R1 F
4.调用时在公式编辑器中写"动态库名称@函数名称"(参数表)即可,例如下面函数可以写为"FOXFUNC@MYMACLOSE"(5)
7 s# H; R) A6 o2 Q- b; F: t4 c* A0 b5.动态连接库名称和函数名称可以自己定义.' Y! r4 |0 c1 l7 }' X1 a
6.使用时必须将动态库拷贝到飞狐交易师安装目录下的FmlDLL子目录下使用.3 E5 r6 I6 X% `4 r3 e
*/3 `, T6 m" p( u$ e3 K' z1 G( P  _
#ifdef__cplusplus4 j6 s2 X* a: l& D3 W. q: g
extern"C"
; _& P- ?; m5 t, I. _+ d) C4 K0 \3 U{
/ _/ F# Z; }" u( b8 X% n  M#endif//__cplusplus
$ B. R$ q% k7 u1 p+ y///////////////////////////////////////////////////////////////////////////
6 I* U  B; K! S  y" F9 `0 T//分析周期* i9 R. i2 |) C4 a5 _
enumDATA_TYPE8 p' t" ~  S& |2 [
{
; I: H( Y8 G$ J9 I; x4 T! ]TICK_DATA=2,//分笔成交- p3 p' J4 G% r' |3 Y5 w# n
MIN1_DATA,//1分钟线1 o  E% H- P) a
MIN5_DATA,//5分钟线 9 H6 S8 w8 ^- P) Q* q) r# i+ D
MIN15_DATA,//15分钟线, ]: M; r- u0 Z& ?' h
MIN30_DATA,//30分钟线5 |$ B# {5 h1 P) P- U% e
MIN60_DATA,//60分钟线1 r& S: {4 C+ I9 r0 a% r
DAY_DATA,//日线
& M; k' I% U' JWEEK_DATA,//周线
8 }5 ~$ S/ \9 P" u7 w/ E9 a  nMONTH_DATA,//月线1 G9 ^1 R1 F3 `8 Z
YEAR_DATA,//年线
3 V3 Y( @: w! v1 m1 g" r& _MULTIDAY_DATA,//多日线
( w% r( p# R2 L% z2 c7 AMULTIMIN_DATA//多分钟线
/ l: Z, [# v0 t+ t! G};; }: P* s/ l$ p3 f, ]2 k% W4 R
///////////////////////////////////////////////////////////////////////////
, o8 k2 M5 A, S, J4 C! g# y6 @//定义取用股票基本数据的结构 只有 VC++ 6.0 compile成功使用- K; `# g9 V# P" f
typedefstruct tagSTKDATA 7 h& O) @; j! c% E
{/ P, g8 l0 n. C
_tm_; //时间,UCT
  C4 q- f+ o( d6 kfloatm_fOpen; //开盘 open# u1 F  J. |! ^6 g8 j. T+ V3 j
floatm_fHigh; //最高 high
# t: v1 t7 [2 n3 Mfloatm_fLow; //最低 low
$ k& h  ]6 g$ a. z+ l$ \4 Hfloatm_fClose; //收盘 close
' m2 @* S6 A! Qfloatm_fVolume; //成交量 Volume9 }# Z2 [) n) D, j! T6 w
floatm_fAmount; //成交额 amount
: ^0 l/ w4 U! v7 c# e( r: MWORDm_wAdvance; //上涨家数 仅大盘有效
7 n& Y6 q9 L; L, [# S3 ZWORDm_wDecline; //下跌家数 仅大盘有效
% _$ L( p: \- M+ u}STKDATA;; K3 E9 ?/ x) b* K
定义STKDATAtagSTKDATA的简单别名,STKDATA 6 v5 g2 _2 w/ p- }: [
为真正方便使用名称,tagSTKDATA 为定目的的过水名称
: b6 W* ?% V6 g////////////////////////////////////////////////////////////////////////////" N) _6 E9 r3 ?/ I6 A
//扩展数据,用于定义取用分笔成交数据的买卖盘 的结构; y0 x1 m. }9 e6 A- ^
typedefunion tagSTKDATAEx* ~7 m# l9 `. ?0 u  R. y$ n+ `
{
+ G' r$ @9 K3 L4 Dstruct2 W5 C: }9 j% i* z9 _+ J
{3 s- {+ I1 o; B: b* {- V: S
floatm_fBuyPrice[3]; //1--3floatm_fOpen; //开盘 open
- H1 A$ J) l, T( S" O+ Sfloatm_fHigh; //最高 high6 G; Y! M/ M& w
floatm_fLow; //最低 low
0 x' h4 ~6 `5 h* B5 I0 dfloatm_fClose; //收盘 close: R* }6 s* @: e( O- T9 b+ L
floatm_fVolume; //成交量 Volume9 X& J  |( |9 O. Q
floatm_fAmount; //成交额 amount$ G9 V2 ]- f% E/ _& u5 H
floatm_fBuyVol[3]; //1--3
) N7 ?- m; h3 C3 A! Y" ffloatm_fSellPrice[3]; //1--3$ a, |4 P" ?" j: a% B' f
floatm_fSellVol[3]; //1--3
0 \- C, q" Q# i};$ t5 W& ]7 s. Q8 [- Q
floatm_fDataEx[12];
7 g/ Q, L* Q/ a3 C& l$ [! i" \}STKDATAEx;
1 G' e$ R; T8 \' i# ?5 A  [////////////////////////////////////////////////////////////////////////////
) P" D+ D) i0 c//定义取用除权数据的结构
: I' i; o3 u$ G3 j7 P8 |typedefstruct tagSPLITDATA
1 d8 b5 i* {- I. I7 L8 X% ~{
4 A( H7 W' k3 ~0 {$ Y* F7 I7 ?4 Xtime_tm_time; //时间,UCT
2 c+ X) y* i* P& s$ y# L) V' Ofloatm_fHg; //红股
. R6 n2 F  f4 O% r/ h/ ^floatm_fPg; //配股7 M( ^# I$ v- B9 I
floatm_fPgj; //配股价
3 [6 x& {. ], p' ~% Rfloatm_fHl; //红利# ?$ O1 i" {) ]; K6 S: L( z- i/ h
}SPLITDATA;) S/ G4 P1 n, }6 j' \
/////////////////////////////////////////////////////////////////////////////
& v$ {1 \+ }% d/*财务数据顺序(m_pfFinData内容)
  k6 o2 t% c  a+ |: s2 Z序号内容% ^1 Q; N  s/ \+ ]5 D
0总股本(万股),
! c8 y: K8 g( R1 A3 G" j" t  i  m1国家股,, E: ^4 j# ?6 `$ G+ q1 j( i
2发起人法人股,
) e% F! r' u) E4 _& G, K+ t% e; x+ n3法人股,
) ~7 R2 z! {9 f6 ]1 [  W& _4B,/ a3 }  H3 X( ^6 l! T
5H,
6 W0 P0 E1 y7 v  Q4 N% P6流通A,
9 }6 a# o0 C& W. H7职工股,
/ u8 `1 H+ i# k6 G! ^- m& k, q8A2转配股,
4 o; I( U; ^! R2 \% C" h9总资产(千元),8 d4 E& E* D" J
10流动资产,! S7 J) d% ]: D# Y$ w
11固定资产,
1 n$ B$ w+ p6 m8 W! _' E12无形资产,% s  u' }# Y6 V$ b8 W
13长期投资,
/ Q9 C( ]$ {1 F  n14流动负债,
2 M$ H" M1 S! `% X. F15长期负债,
8 U$ D3 J1 o- h' g# k8 K, m16资本公积金,
9 f. Q5 l0 N' _3 f1 A0 h17每股公积金,6 ^) P( h( }7 P
18股东权益,  _1 Q! M9 r! k
19主营收入,
6 o6 a2 `% o6 y20主营利润,9 G. ~# A3 M: U; `' ]' G1 F
21其他利润,, S. R& Z8 b. P9 F+ \9 \) G- Z
22营业利润,
& e  e; L3 S4 w" H' U! k& C23投资收益,1 V) r  T, d& ~  e) O0 `
24补贴收入,4 |% Y# w# g0 L$ [
25营业外收支,
8 ]& B. V! l! K4 M7 j0 p8 s2 ~( N26上年损益调整,
, H: _; _/ ?% I' W" g27利润总额,/ J) c- F& N0 Y3 J
28税后利润,0 |) C4 i( ~& K/ N
29净利润,
* V" h, }1 o( F30未分配利润,- ?& {7 G2 _& o1 q  {9 _/ u, e
31每股未分配,1 u. n; ?5 J. M
32每股收益,) c* i/ i) V" {, V, n0 v
33每股净资产,
7 G; s3 O8 G0 I$ k. R, L, t34调整每股净资,
1 q$ b) n, T( t: g35股东权益比,7 G' Z5 Q4 V8 O2 H5 O% }( ^
36净资收益率9 N9 z- L3 C: I* N' ^
*/" G. g/ ~3 m) I+ n2 l* V3 k9 }: ~
/////////////////////////////////////////////////////////////
5 a' y  H0 C0 A/ i5 N$ A# A//定义取用caller函数传递参数项 的结构* Q# |; _5 k- ^5 ~! g% z( T
typedefstruct tagCALCPARAM$ x4 v$ {! S% c4 s& h' ^, w
{$ X1 g* _- L4 O3 N; a% M
union
, d9 f, s3 a& d4 Z' g0 X8 }; |{
: t# ^- x  W6 j+ bconstfloat* m_pfParam; //指向序列参数的址标,指向一个浮点型数组pointertofloat variable parameter / ex. c,h,l,o, co2...co2=(c+o)/2
& \; g9 L+ ]0 t/ z5 L& }; [2 ]constfloat m_fParam; //数值参数 valueof parameter
2 d5 T/ S. e6 y};! ?5 ?5 F, {, {! f$ R; P$ d! p
constint m_nParamStart; //序列参数有效起始位置thestart address of variable parameter / ex. c,h,l,o,co2.....
- Q! k& @' x2 E3 r' L5 I/ ^}CALCPARAM;
+ b* T& E9 d. N$ v( F# U/////////////////////////////////////////////////////////////////////////////
* v, Q5 Z7 S6 Q9 t4 P2 |) I3 \//定义全部取用址标 的总结构 (各指标指向前述各结构以便取的各结构的数据,接口信息数据的结构 )+ _% k/ ?; X5 `2 ]8 k; m" `9 M
typedefstruct tagCALCINFO
- `4 E8 Y- e" x( K3 {  n& F{
0 @$ h- d1 b$ d( tconstDWORD m_dwSize; //结构大小
: n: B( ~2 K8 \6 ?" oconstDWORD m_dwVersion; //调用软件版本(V2.10: 0x210)
  t. e! e3 r" @! r, d( k1 \. U  z& aconstDWORD m_dwSerial; //调用软件序列号
5 ?& k" ~& H$ c, bconstchar* m_strStkLabel; //股票代码
  j$ ~* O- x5 H- o* {' u8 h; zconstBOOL m_bIndex; //大盘
3 {- g5 p; F; Q! qconstint m_nNumData; //数据数量(pData,pDataEx,pResultBuf数据数量)数据长度
! Z' l, Q- F- b' `9 ^. CconstSTKDATA* m_pData; //常规数据,注意:m_nNumData==0时可能为NULL
2 e9 L' i6 l: G1 ~1 c  {" K+ _constSTKDATAEx* m_pDataEx; //扩展数据,分笔成交买卖盘,注意:可能为NULL$ w3 D5 L* q; ^7 a6 i  N
constint m_nParam1Start; //参数1有效起始位置<0/ constant parameter >0 /variable parameter
" \% D4 L  ?/ j" N' Z# ~7 R: cconstfloat* m_pfParam1; //调用参数1/pointer to variable parameter 1
9 x" u' p4 q% C% I( O& W2 I! bconstfloat* m_pfParam2; //调用参数2/pointer to variable parameter 25 ~+ k* T7 k6 u! h& c
constfloat* m_pfParam3; //调用参数3/pointer to variable parameter 36 J9 u4 Y6 v$ ?4 G0 C. B
constfloat* m_pfParam4; //调用参数4/pointer to variable parameter 4) n4 L# \* H7 {+ g$ E4 j0 E
float*m_pResultBuf; //结果缓冲区* p. T$ L( S6 [2 o+ J
constDWORD m_dataType; //数据类型
; \" K6 x3 o# {4 j& h: a6 Qconstfloat* m_pfFinData; //财务数据* ~" \$ J  `! Y: n& G' O
//以上与分析家兼容,所以沿用其结构和名称. R5 R, S! R3 f
//以下为飞狐交易师扩展(fortagSTKDATAEx)
/ z8 s" M9 K* Z( t6 y7 E! X& v6 v3 PconstDWORD m_dwReserved; // 保留! K1 ]! p, U: W2 ^
constint m_nNumParam; // 调用参数数量
, J+ z% a1 P; Y1 K  @( o: ]+ m4 AconstCALCPARAM* m_pCalcParam; // 调用参数数组5 g$ A! x. E' F/ [- D3 C  h. V3 R5 J6 C7 y+ [
constDWORD m_dwReservedEx[4]; // 保留" ^. f4 U9 g. G
char*m_strStkName; //股票名称8 d: p4 T0 h$ v, T, ^. ^2 W
SPLITDATA*m_pSplitData; //除权数据' c5 X) O) w( c- P  y4 j  g
intm_nNumSplitData; //除权次数2 P2 @5 u% d) L, P( a# a
}CALCINFO;
% x4 \" w7 ?" T, j) n/*
! k( _' D6 ~* k8 p3 \1:(与分析家兼容), |% p) }4 i: C# y" r5 @
1.函数调用参数由m_pfParam1--m_pfParam4带入,若为NULL则表示该参数无效.8 |) X5 O' z$ K, p
2.当一个参数无效时,则其后的所有参数均无效.. G, S& X  t% S/ y2 Z( ]+ A, d4 d
:m_pfParam2NULL,m_pfParam3,m_pfParam4一定为NULL.
* Y7 p; o5 x4 |( X6 W9 R* N0 ~: F8 C3.参数1可以是常数参数或序列数参数,其馀参数只能为常数参数.0 l) J3 q/ e0 `- z% C$ [3 p
4.m_nParam1Start<0,则参数1为常数参数,参数等于*m_pfParam1;. Z& p/ W* ?8 w6 S7 P0 Z
5.m_nParam1Start>=0,则参数1为序列数参数,m_pfParam1指向一个浮点型数组,. g. n- b. v% t
数组大小为m_nNumData,数据有效范围为m_nParam1Startm_nNumData-1.: S3 p) e( F& ]2 @: Z9 U
在时间上m_pData[x]m_pfParam1[x]是一致的9 w; J: h( e# [) X) E
2:(飞狐交易师扩展)
9 y2 N# F; z0 O& a- h1.该扩展结构使调用参数在技术上可以是无限数目的,且每个参数都可为数值或序列,由公式中实际的调用参数决定。9 Q* T0 ~% V( v  Y
2.CALCPARAM结构用于带入参数信息和实际数据,m_pCalcParam数组大小为m_nNumParam,数据有效范围为0 m_nNumParam-1.# F; h' Y/ M0 a2 i, J% S3 V/ X( g
3.按参数的顺序,m_pCalcParam[0]为第一个参数的数据,m_pCalcParam[1]为第二个参数的数据...,为了保持兼容,原m_nParam1Startm_pfParam15个属性依然有赋值。- V3 P" n' M( U7 V' \
4.i位置的参数为数值,取用m_pCalcParam.m_fParam.
# ^$ h# ]  |7 o1 @, J4 @  x  ~5.i位置的参数为序列,取用m_pCalcParam.m_pfParam,数组大小为m_nNumData,数据有效范围为m_pCalcParam.m_nParamStartm_nNumData-1.m_pCalcParam.m_nParamStart<0,则此数组中无有效数据。
9 _. V  [1 q$ t6.由于可以调用多个序列,许多序列的计算可以先在公式中进行,然后作为调用的参数即可。8 e( w$ o# }8 c0 |# P6 c6 _
7.经此扩展,对分析家的DLL依然可以调用、兼容。
4 ^5 t6 k" u4 a) d% ]. A, V) O1 ]*/, h5 \& e, x+ W4 W
///////////////////////////////////////////////////////////////////////////////////8 H, m( @% z1 a! G9 w: L
/*函数输出
( C- ^! K( L: q) U; `__declspec(dllexport)int xxxxxxxx(CALCINFO* pData);: \3 f  x: d% r8 a! q, G3 b
1.函数名称需全部大写.
4 R. p# {& F2 y3 k# t2 h2.函数必须以上述形式声明,请用实际函数名称替代xxxxxxxx;7 r( k$ Z$ J" t' Y2 I4 u
对于C++程序还需包括在extern"C" { } 括号中.' J  y1 p/ b7 t3 f, t
3.函数计算结果用pData->m_pResultBuf带回.# v0 b' R' A" y: e6 R6 t- B: w
4.函数返回-1表示错误或全部数据无效,否则返回第一个有效值位置,:
0 E( Z0 Z4 x, L, R- Qm_pResultBuf[返回值]-- m_pResultBuf[m_nNumData-1]间为有效值.* A4 g5 R$ _& P8 c5 u. p* x
5.函数名称长度不能超过15字节,动态连接库文件名不能超过9字节(不包括扩展名),动态库名称不能叫SYSTEM,EXPLORER
% E# \8 h9 t2 c*/! A  y: M* s: D5 `, v* P1 N
//示例函数,使用时用实际名称替换8 N1 u% a& m  U1 w
__declspec(dllexport)int WINAPI MYMACLOSE(CALCINFO* pData);, r7 {  J) w. P; T' C; a& S
__declspec(dllexport)int WINAPI SMOOTH(CALCINFO* pData);7 Z7 a, ^0 n  O, k. c
//__declspec(dllexport) int WINAPI MYMAVAR(CALCINFO* pData);- t- M' q* L5 V/ e/ E% s. c6 }
__declspec(dllexport)int WINAPI MYBBI(CALCINFO* pData);+ Z5 j1 K0 D, |! [) W, ?6 d' v! _, v) V
//WINAPI = _stdcall
1 U( P3 ]! r2 k4 f! U* U1 g3 \, v#ifdef__cplusplus
5 w6 j( p  c: }* x% ]}/ V( \7 {+ X5 i& G- ?6 s
#endif//__cplusplus" }9 A% L, m, V" L: m! \+ N$ r4 ?9 y' b
#endif//__FOXFUNC_H_INCLUDE$ G3 H' N5 F/ H3 A

5 f$ u5 _5 k) F% i! Z. _# v//////////////////////////////////////////comment 注解
' L( m" Q* d3 A__declspec(dllexport)int WINAPI MYMAVAR(CALCINFO* pData)
2 y( ~; Z5 B- ^3 |pData是指向 址标总结构 CALCINFO的 总址标
+ C2 b2 h; h3 Z, a$ o取用第二个参数数值floatfParam = *pData→m_pfParam2
& v" I( U& ~5 s+ D4 M6 N& Z取用第一个序列参数的址标constfloat* pValue = pData->m_pfParam1;! j! n; \& L; `5 l0 V$ S
取用股票数据长度intndata = pData→m_nNumData;
; @# n. {" P' k4 G" I( o" h+ L第一个参数存在且为数值pData->m_pfParam1&& pData→m_nParam1Start<01 z$ z) ^+ [* j4 H/ @" @! `
第一个参数存在且为序列pData->m_pfParam1&& pData→m_nParam1Start>=0
9 x. k0 z3 q3 G% U; V第一个及第二个参数存在且为序列,第三个参数不存在pData->m_pfParam1&& pData->m_pfParam2 && pData->m_nParam1Start>=0&& pData->m_pfParam3==NULL( n) _1 r9 g2 }) j
constfloat* cpParam = pData->m_pfParam1; 定义cpParam为第一个序列参数的址标+ Z& Z2 H& H0 I* X8 o4 W& Y
取用股票数据结构
' b5 j. }. C( D5 F+ s0 E  {" KpData→m_nNumData= 变数数据长度
! J* Q7 l7 g! |$ b' y8 H2 \0 hpData→m_pData= pointer to struc STKDATA 的址标- V# z% O+ h: A4 f, R( f
pData→m_pData[x]数据结构的第x个数据9 ^; ?( H% s' K6 X' d
pData→m_pData[x].m_fHigh数据结构的第x个数据中的 High
! x( w* {+ I8 g' E, [1 \取用结果缓冲序列* ?8 G2 y' X* K  u8 y
pData->m_pResultBuf. F8 |$ [2 I) \/ ]' h+ M1 H' L
取得第一个序列参数的起始序位,2,...5 , . 7...) W# n# ~6 Q* o7 T( s; j
intnFirst = pData->m_nParam1Start;
, S6 m! D& U' C6 r) @for( i = nFirst+nPeriod-1; i < pData->m_nNumData; i++ )* C4 H; ^7 _9 d# S4 M: D
取得第二个数值参数的数值
3 M* @' q: M" G0 e! ofloatfParam = *pData->m_pfParam2;
& U1 s; i  O: q! N! w' a5 NintnPeriod = (int)fParam;
( ~& u" ~( L  M7 c5 |# {/ I取用第一个序列参数的址标constfloat* pValue = pData→m_pfParam1;
% V% R) B, r' P7 z" g5 K% N取用序列参数的单个直pValue
" c! T( K. ^: E' [" @& F% |/ w取用缓冲序列的单个值pData->m_pResultBuf8 P7 |8 x) s3 h
constCALCPARAM* m_pCalcParam; // 调用参数数组" D- N: d- D6 [5 X
m_pCalcParam为序列址标,指向各序列参数的指标
! s7 y7 Q% L3 G. G5 g第一个序列参数pData→m_pCalcParam[0]9 b5 }  k" y% Q9 I; T4 j
constfloat* m_pfParam; //指向序列参数的址标$ D: Q' L' W: r# R  L; m
第一个序列参数的起始序位pData->m_pCalcParam[0].m_nParamStart2 l5 z  Y0 D- X0 x+ A
第一个序列参数的址标constfloat* pValue1 = pData→m_pCalcParam[0].m_pfParam;
- R. R' x! L- n7 g取用第一个序列参数的单个直pValue14 m# {; @/ h/ l
第二个序列参数pData→m_pCalcParam[1]
' H! Y( M0 v4 X3 f; k/ w3 U& |第二个序列参数的起始序位pData->m_pCalcParam[1].m_nParamStart1 ?9 i5 u" F5 e) A$ A
第二个序列参数的址标constfloat* pValue1 = pData→m_pCalcParam[1].m_pfParam;; P5 l- x1 |2 m+ l$ w4 L$ `, M
取用第二个序列参数的单个直pValue2
2 M2 p% t: C6 F6 \第三个序列参数pData→m_pCalcParam[2]
- @) x+ I; c" x8 w+ ^" w& V第三个序列参数的起始序位pData->m_pCalcParam[2].m_nParamStart% \! [* B3 h  \/ s7 d  P$ T
第三个序列参数的址标constfloat* pValue1 = pData→m_pCalcParam[2].m_pfParam;# E" y5 a0 E5 \# y5 \; g/ Z
取用第三个序列参数的单个直pValue3
3 J: E/ p' z0 x第四个序列参数pData→m_pCalcParam[3]
. L1 G, E2 R* u; V1 t# \/ ?第四个序列参数的起始序位pData->m_pCalcParam[3].m_nParamStart" D2 Z3 [* }0 h8 G- `% f
第四个序列参数的址标constfloat* pValue1 = pData→m_pCalcParam[3].m_pfParam;5 B3 N! i7 n; i* j
取用第四个序列参数的单个直pValue4, Q9 d; l' U! r$ U$ S2 u
如果有四个序列参数,则取用序位最高的那一个序位* x/ R9 L" m- k: D; r( `* t, I
if( pData->m_pCalcParam[0].m_nParamStart >= 0 &&
9 z$ y* s% D' e& T6 GpData->m_pCalcParam[1].m_nParamStart>= 0 &&4 K& W9 z, C% U
pData->m_pCalcParam[2].m_nParamStart>= 0 &&  p8 q7 M6 P4 |* H! C
pData->m_pCalcParam[3].m_nParamStart>= 0 ) //4个序列都含有效数值
; c2 x2 B5 x# \- C/ R2 C{
! u1 `/ |* J3 Z//计算返回的序列的第一个有效值位置
4 [1 F+ d) i3 O( B# d/ UintnFirst = pData->m_pCalcParam[3].m_nParamStart;//已知返回的序列的第一个有效值位置与第4个序列一致
; A$ t& s4 x; L//若不知,则3 H. C  E0 A' y) [6 a' e' Z
/*" V8 j; ^+ M) G3 G7 _/ z
intnFirst = pData->m_pCalcParam[0].m_nParamStart;# B1 {( L9 `, ^0 G1 w
if( nFirst < pData->m_pCalcParam[1].m_nParamStart )
1 Z8 t! U0 v/ onFirst= pData->m_pCalcParam[1].m_nParamStart;2 R  H) r, R! p0 q" Z* N* T6 R
if( nFirst < pData->m_pCalcParam[2].m_nParamStart )
5 f. p- [$ h) G6 T( X" znFirst= pData->m_pCalcParam[2].m_nParamStart;+ u3 T( D5 B' L5 y4 ]$ x& U2 `; `
if( nFirst < pData->m_pCalcParam[3].m_nParamStart ) ( z  D: N. U& H, P% x2 b1 j: a
nFirst= pData→m_pCalcParam[3].m_nParamStart;
0 k. ]3 x6 G& Q8 \5 qconstfloat* pValue1 = pData->m_pCalcParam[0].m_pfParam;1 w! k! B) m/ c4 @+ n; Z
constfloat* pValue2 = pData->m_pCalcParam[1].m_pfParam;
. \2 ?- U! E6 [constfloat* pValue3 = pData->m_pCalcParam[2].m_pfParam;- a" y4 e, u2 U! c; K
constfloat* pValue4 = pData->m_pCalcParam[3].m_pfParam;
$ U" q  D3 m5 l. `) m//-------------------
1 |& `4 X7 ~1 qfloatm_fOpen; //开盘 open! b' ^- U! @+ q) h+ Y
floatm_fHigh; //最高 high) R: Q% l2 k, X: i0 n0 T# W6 ]0 J
floatm_fLow; //最低 low/ ]9 d/ u8 w$ d; [
floatm_fClose; //收盘 close' F  @: A2 F9 z0 I  ^( l( ~! _3 |$ k* X( ]
floatm_fVolume; //成交量 Volume/ S: M. r  A* v
floatm_fAmount; //成交额 amount) d. z+ b+ W0 _  K- T
调用收盘据9 u/ r5 U0 b# ~
pData→m_nNumData= 变数数据长度5 [+ H6 ~1 ~$ x% [
pData→m_pData= pointer to struc STKDATA
- _$ O0 v4 w5 r' z$ bpData→m_pData[x]x个数据
& Y# s7 R& L2 J2 L5 K$ z; K7 npData→m_pData[x].m_fHighx个数据中的 High8 h4 D6 j( D  H6 ]
@@@@@@@@@@@important !!!!!!!+ Y& Q! a  Q. _+ x) D3 v
sinceVC++ 2008, cl.exe will make ‘pData→m_pData[i-j].m_fClose’ anerror2 B4 C, H4 m3 u: G5 ^6 d
so,pass the high,low,open and close just from the function parameter ,that is use ‘ CALCPARAM’ struct
+ |- g# _" j6 Y" K- E% ]pData->m_pData[i-j].m_fOpen// to use open , there is no way in using a varable for calculationoutside foxtrader
- @! _0 _1 ~. ^/ F; R! D1 BpData→m_pData[i-j].m_fHighto use high) I8 K& W4 B4 p) b& N6 I, Z
pData->m_pData[i-j].m_fLow
  }3 E! l0 E. K0 |pData->m_pData[i-j].m_fClose
) Q, [, `: a6 e6 Q% Zm_pData= pointer to struc STKDATA  z- {8 T$ G9 |6 k1 B0 l6 Y
incalling C++ dll function
5 Q$ G( u# }. s* o( i7 D+ dm_pDatais passed to pData (CALCINFO* pData . A CALCINFO* type pointer)6 W9 B/ b5 U+ b% g* ~: w! X
touse a single value in variable ‘High’
# u" l  k$ U3 J) H% BpData→m_pData[i-j].m_fHighto use high& [0 O/ H8 V: t9 R* S
constfloat* m_pfParam1; //调用参数1/pointer to variable parameter 1 ' o( [3 R0 v! q* C
constfloat* m_pfParam2; //调用参数2/pointer to variable parameter 2$ _5 a& s' y- Y6 s& m% w
constfloat* m_pfParam3; //调用参数3/pointer to variable parameter 3
( }" v* h: d/ O- dconstfloat* m_pfParam4;
4 A/ K/ {" C* sm_pfParam1,m_pfParam2, m_pfParam3, m_pfParam4 = pointer to caller function 的参数
* r( N9 h7 _7 s! @! d  m+ QpData→m_pfParam1= pointer to 第一个(序列)参数
; N, ?+ w3 k' F& k/ lpData→m_pfParam1[x]= 取用第一个(序列)参数的第x 个值7 A) R+ p( U" h9 V1 U& v9 x
constfloat* cpParam = pData→m_pfParam1; =定义 cpParampointerto 第一个(序列)参数6 b/ [! s4 ]4 a! p4 U- Q5 w
cpParam[x] = 取用第一个(序列)参数的第x 个值
! D: A. v1 p/ Z7 Im_pResultBuf= 结果缓冲列
4 @) ^' f4 `8 B/ T; xpData→m_pResultBuf= pointer to 结果缓冲列+ n1 S; X2 F6 s
pData→m_pResultBuf[x] = 取用结果缓冲列的第 x个值. E( n0 |# P6 P* a- R$ W6 x
//////////////////////////////////////////comment- E+ K# H- f5 M# _  ~
//////////////////////////////////////////comment 注解
8 M- P5 t& S& h4 Nconstint m_nParam1Start; //统杅1衄虴宎弇离
& x* ]. t8 f9 R" k9 Q  Vconstfloat* m_pfParam1; //覃蚚统杅1
0 E- G% ^8 ]% ~0 o0 rconstfloat* m_pfParam2; //覃蚚统杅2
& s9 _! _" ]5 Y2 f  p) y: iconstfloat* m_pfParam3; //覃蚚统杅33 R- S2 F& W0 E( O& h1 z% V+ [3 Z
constfloat* m_pfParam4; //覃蚚统杅4,parameters must be <= 4
: ~0 _4 F, a' @7 M2 o, A//const float* m_pfParam5; // parameters must be <= 4
1 Y; ]. q: \, Z2 K5 j: l  l5 h8 i- G//const float* m_pfParam6;
' ^$ i: ]( ?& Q4 [  B$ X8 S//const float* m_pfParam7; ' H9 L. J1 n( `# o) G! j$ t
//const float* m_pfParam8;& L" {4 E0 o; |9 y( j! y2 ~9 d% T
//pData->m_pfParam1 && pData->m_pfParam2 &&pData->m_pfParam3 && pData->m_nParam1Start>=0 &&. t3 g- h' u# H) Q$ H, H# r3 V# T
pData->m_pCalcParam[0].m_nParamStart>=0&& pData->m_pCalcParam[1].m_nParamStart>=05 _" e/ ~' n2 Y! a2 U
&&pData->m_pCalcParam[2].m_nParamStart>=0)
. g# M3 j# t& u# v* L{
5 U  J  a1 {' p3 N  N! \6 {floatfParam = *pData->m_pfParam4; //pointer ,pData->m_pCalcParam[3].m_nParamStart >= 08 @! F  ?3 @- P/ p6 j  a
intnPeriod = (int)fParam; //统杅1
% d0 w3 K/ ]) y1 r//const float* cpParam = pData->m_pfParam2; // cpParam = pointer to第一个序列参数,cpParam = 取用第一个序列参数的第i 个值: r# ?% q. Z* D5 K8 J" g1 G/ L
constfloat* cpParam1 =pData->m_pCalcParam[0].m_pfParam; // cpParam =pointer to 第一个序列参数,cpParam = 取用第一个序列参数的第i 个值
( O0 `: I) e* |; ]/ I( \8 a' Yconstfloat* cpParam2 =pData->m_pCalcParam[1].m_pfParam; // cpParam =pointer to 第一个序列参数,cpParam = 取用第一个序列参数的第i 个值! W  Z, V5 X9 y, y# N" {
constfloat* cpParam3 =pData->m_pCalcParam[2].m_pfParam; // cpParam =pointer to 第一个序列参数,cpParam = 取用第一个序列参数的第i 个值//parameters must be <= 4
( ^- T* R1 K! J+ d' @# p  R* z5 x//const float* cpParam4 =pData->m_pCalcParam[3].m_pfParam; //cpParam = pointer to 第一个序列参数,cpParam = 取用第一个序列参数的第i 个值) f8 H( N2 `, Q$ i
//const float* cpParam5 =pData->m_pCalcParam[4].m_pfParam; //cpParam = pointer to 第一个序列参数,cpParam = 取用第一个序列参数的第i 个值0 F+ Z/ z( [7 X) H
//m_pData = const struct pointer to struct STKDATA , pointer to structSTKDATA ,
( p( P/ l" q1 {. otouse pData→m_pData[x].m_fClose$ L% J* W( F7 l/ A$ x% n2 g, q8 [- Q
pData→m_pData[x]= | 1,2,3 , … , m_nNumParam | time_t m_time;
3 L# k8 {  N% w6 Z8 L/ t|1,2,3 , … , m_nNumParam | float m_fOime_t 1 r/ E" @8 k6 d
|1,2,3 , … , m_nNumParam | float m_fHigh;
# b3 Y6 t+ p, {5 A! k7 I.. .
' s, ?( T% s& @|1,2,3 , … , m_nNumParam | WORD m_wDecline;' N/ @( R3 S5 D2 d8 X3 Z2 \
m_nNumParam= 数据high,close,open,low的长度
" f! ^# C* ?7 \+ n1 ~9 ^touse high:. \& ?1 |; p( T/ h5 B
pData→m_pData[x].m_fHigh
2 L! ]& D0 @0 T$ }: h8 X5 `) Lcontentof struct STKDATA8 }/ o: o; l9 \+ Z' z
time_tm_time; //时间,UCT
9 x- |/ q9 I: w/ w/ |+ S' t0 `1 Rfloatm_fOpen; //开盘 open. _7 ]. N9 C9 v8 u$ p1 C
floatm_fHigh; //最高 high2 e4 e# m. T0 w) r
floatm_fLow; //最低 low: f4 L4 t; @3 W1 o2 y7 m8 X
floatm_fClose; //收盘 close2 c) H0 x( |" l$ j' x+ x
floatm_fVolume; //成交量 Volume* c: R* y  L: |5 w0 ^
floatm_fAmount; //成交额 amount
. }9 ~5 i7 L8 @0 D- l, `WORDm_wAdvance; //上涨家数 仅大盘有效
4 K, F. M  p! v/ x5 {) o) b+ rWORDm_wDecline; //下跌家数 仅大盘有效
" [7 g. a2 p+ _' w' ~4 V& V1 i调用传递参数及传回结果
+ {, O% R5 z2 F! x6 f  V调用传递参数' B9 \8 Z3 k5 H7 u' S
(pData->m_pfParam1 && //参数1有效Param1exists
7 Q9 W! G5 d6 y# U1 Z$ ^* LpData->m_nParam1Start<0&& //参数1为常数
( a% v4 T/ w7 e# Q7 B, ^pData->m_pfParam2==NULL) //
4 @- S0 \# J; T3 d" H+ C( E- V) q! Elocalprocedure 定义使用变数
/ K% _/ y+ X, `* S  q+ N3 S% Bonstfloat* pValue = pData→m_pfParam1; //use constant参数1# k: \, }2 t4 d) P* E$ C0 p
intnFirst = pData->m_nParam1Start; //use 参数1效值起始位( T: E" _5 Y* K/ }
floatfParam = *pData->m_pfParam2; //use 参数2
) ]' }' F5 r2 x; ^7 m& d* z$ d# `intnPeriod = (int)fParam; / ^3 t/ J( S% a2 |+ ^7 B; G( a" Z9 d
传回结果4 e8 n$ j! u( S/ X+ _
fTotal+= pValue[i-j];
/ f" [% q: a2 j0 OpData->m_pResultBuf* U3 D. g- N  A, K- I! R# O1 H  O! i
//////////////////////////////////////////comment




欢迎光临 【阳光飞狐__与财富同行】 (http://bbs.88158.cn/) Powered by Discuz! X3.2