阳光飞狐

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

 找回密码
 手机注册
查看: 2063|回复: 0
打印 上一主题 下一主题

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

[复制链接]
跳转到指定楼层
1#
发表于 2019-8-11 16:09:40 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
许多年以前,我曾经在
4 P; R- a' Z% K理想公式区发布了. |# G+ t0 f6 G! \( E
"
# j5 R; c' ^2 X1 Z如何用 Foxtrader(飞狐)连结 C++动态程式库 DLL及 80x86Macro Assembly (组合语言), |2 e& f# V; f; x
"
. e$ x+ I' C, d" f) W/ L4 B+ Q& A; Z( T5 U* K; p8 |! j
现在更新foxtrader(飞狐交易师)
3 J$ W4 `9 k# }7 B' u) B
连结 DLL的方法4 ]% _; Q$ c$ Y, g4 t
& f1 E1 N! K; I& @
foxtrader- - > DLL (C++ and assembly) = ( foxfunc.h + foxfunc.cpp +pow10.asm )
+ D( N+ P7 X1 X* q1 I; k2 Dgauss- - > DLL (C++ and assembly) = ( foxfunc.cpp + meigj.asm )$ p& L$ {, C% O0 L* h+ i! T2 {6 {; g
gauss只用到函数参数传递,所以使用新的 c++compiler, 不受影响, ?9 W- n4 V% l9 n9 W0 @; A3 D
foxtrader的 foxfunc.h宣告的结构型态 (struct)在 2004vc++ 6.0 全部有效) h( e+ H' o- K2 O2 I6 }' ]
7 w* R) `( t- W
也就是这五个结构都能用7 f1 Y' S3 N0 @  Q7 q/ R7 f
typedefstruct tagSTKDATA / ]8 t2 R9 T( u& _8 l5 k
typedefunion tagSTKDATAEx
% T% T; R% t" A& `* Utypedefstruct tagSPLITDATA 1 i: g5 V% U7 m* j
typedefstruct tagCALCPARAM* t. {7 c% U; a9 ?- P
typedefstruct tagCALCINFO8 t4 I  F' x: Z2 H( D. T3 p
$ b& {3 n  |0 [3 Z! o
自2008年起,vc++ 2008, vc++ 2010, vc++2017 对struct的编译,已经完全 c++化,不再相容于 C  Z7 U& d% H; g4 T5 i: Z
也就是这五个结构中0 y/ ~9 H- J6 ]! j
typedefstruct tagSTKDATA
9 O) g( x! n6 t: X2 K) Ttypedefunion tagSTKDATAEx
2 I7 r( }9 C9 U/ E8 mtypedefstruct tagSPLITDATA . y! ]4 n/ d8 _3 @( x! d! K( X
typedefstruct tagCALCPARAM/ z0 Z2 z$ Y: e+ t: z6 p- X
typedefstruct tagCALCINFO8 `2 R6 W/ `+ f% N1 V, x/ _
只有这两个可以用
- {' b4 T' O: Rtypedefstruct tagCALCPARAM2 V; D) H$ W  O! e8 p. g/ l
typedefstruct tagCALCINFO
2 j& |8 j$ t9 N& {5 h值得庆幸的是,下面这个结构的函数参数传递个数可以有无数个: z% |/ H- \$ \3 @
typedefstruct tagCALCPARAM0 Q# q$ u% c# b* B% y
例如:在 foxtrader中
3 `" m" I4 d1 K8 U* O: SMA1:=MA(CLOSE,3);
2 T- {  r5 j2 m' X( D8 t# RMA2:=MA(CLOSE,6);
& }% J) t* m' B! h% lMA3:=MA(CLOSE,12);+ t& ^: n8 p5 d5 G/ M& _! J3 s' j. K8 T
MA4:=MA(CLOSE,24);+ p7 {1 U0 x, X- C) L
MYBBI1:"MYFUNC2017@MYBBI"(MA1, MA2,MA3,MA4,MA3,MA4,5)*0.95,colorff00ff,linethick3; {2017 vc++ 15.0}
8 ^: C& M' e3 i5 I6 `其中MYFUNC2017=MYFUNC2017.dll, MYBBI = MYFUNC2017.dll 中的MYBBI函数,这里 MYBBI函数传递的参数共有 7个
) \$ a; Z4 ]8 k4 H7 n5 N3 G下面这两式计算结果相同
+ e- e7 R0 z' axx:(MA(CLOSE,3)+MA(CLOSE,6)+MA(CLOSE,12),MA(CLOSE,24),MA(CLOSE,12),),MA(CLOSE,24)/6*0.95,color0000ff,linethick2;{foxtrader 自行计算}# p. a& B0 A8 m3 n
MYBBI1:"MYFUNC2017@MYBBI"(MA1, MA2,MA3,MA4,MA3,MA4,6)*0.95,colorff00ff,linethick3; {2017 vc++ 15.0 , dll计算}, H5 ]& w( B: F% e4 w, N5 M4 n( |
其他例子1 V/ O; x, ~) _, h
oooq:="MYFUNC2008good@MYMACLOSE"(c,,c,c,6),colorffffff,linethick5;(---> pow10.asm)9 L4 E; J6 h0 _2 m  Q) V
oooq1:"MYFUNC2010@MYMAVAR"(ma(c,5),5),colorgreen,linethick5;
/ z0 O- E, F/ I# p其中pow10.asm里面有很多不同定义或宣告被注解不用,那是因为后来在逐步侦测法修改语码中才发现在foxfunc.cpp主程式中,下面这行错误,也就是新的 compiler不再相容于 C,因此在pow10.asm里面被注解不用的定义或宣告中,有些应该是可以用的/ U2 R5 y; G( I6 K% V1 m
fTotal= pData->m_pData.m_fClose; // @@@@@@@ vc++ 2010 cl.exe 使pData->m_pData[i-j].m_fClose错误/ P/ s9 M3 k/ r* R2 P8 k, o. [
& q  X: \, @% k: A

) V! c4 {" r' |5 f6 V////////////////////////////////////////////////////////foxfunc.h
# n6 e" j) R7 w9 M, [#ifndef__FOXFUNC_H_INCLUDE
$ o0 R3 u; y* @! E! U3 S8 X#define__FOXFUNC_H_INCLUDE
! H. v$ |, E* v3 E/*4 b# W2 b+ ~9 K3 r. z
飞狐交易师“C语言接口”扩展程序调用接口规范V3.0
" s5 l4 G0 X7 Z( x. W0 g1.本规范适用于飞狐交易师V3.x公式系统.
/ ]8 w; s) e0 ]3 v0 U8 q" s2.扩展函数用于实现系统函数不能实现的特殊算法.' M  S# D* c0 y# p2 ?
3.扩展函数用windows32位动态连接库实现,建议使用MicrosoftVisual C++编程.; V% p  u8 m7 ^
4.调用时在公式编辑器中写"动态库名称@函数名称"(参数表)即可,例如下面函数可以写为"FOXFUNC@MYMACLOSE"(5)4 Q3 P1 |4 S0 g; r7 A
5.动态连接库名称和函数名称可以自己定义.+ k1 x1 ?( O- v
6.使用时必须将动态库拷贝到飞狐交易师安装目录下的FmlDLL子目录下使用.& ~, p4 Z: A  D7 ]+ S# y
*/
: c) ?- j" S# T/ g( a$ M#ifdef__cplusplus
, w( ~6 j# O$ i2 I) c7 ?/ X" Xextern"C"
, j3 t/ w! l5 w7 d6 L/ N. Y{9 Z+ {3 h% L5 K% u. {" F0 y
#endif//__cplusplus* _6 m$ ]  o6 b) V4 c) e3 M
///////////////////////////////////////////////////////////////////////////, N. v' w7 S9 }4 A8 o- B
//分析周期
: Z3 L9 K# |5 I& y% |' FenumDATA_TYPE, F, R$ `) c- h1 p- ~
{! z; L! a+ H" s  w+ c1 b
TICK_DATA=2,//分笔成交
' L6 b; J7 Z5 VMIN1_DATA,//1分钟线* c6 t) d4 l% K- k5 ~: z' ^- n
MIN5_DATA,//5分钟线
7 F5 i6 f( s, s) h6 J) RMIN15_DATA,//15分钟线
  r& r4 Q8 Z3 H5 c. tMIN30_DATA,//30分钟线: u6 U6 g% z2 Z0 }7 d  F# f
MIN60_DATA,//60分钟线5 {1 ~( S- v! C3 Q2 B' r) j
DAY_DATA,//日线
: m8 R8 u! b* o9 o; b; F7 uWEEK_DATA,//周线
1 R5 s" `& f* C% }MONTH_DATA,//月线
6 t: x8 d! M, `( B. N  ^) rYEAR_DATA,//年线
5 W8 r9 F: U: }4 sMULTIDAY_DATA,//多日线
7 g4 ^. M, ]0 Z# ^& yMULTIMIN_DATA//多分钟线
) e0 l: }& c5 G9 M};
, ^  Y, `) ?. V' Y+ w///////////////////////////////////////////////////////////////////////////. ?7 I' M6 n$ [4 O( v& i3 o$ j
//定义取用股票基本数据的结构 只有 VC++ 6.0 能compile成功使用
) c" F/ b, J2 h5 H; K7 ytypedefstruct tagSTKDATA " ^: l* s. ]2 u# _
{& x6 G+ [" Q: u- o* }
_tm_; //时间,UCT
6 I# J. d) ]" Zfloatm_fOpen; //开盘 open
; w7 `, B- z1 A0 l$ p( ?& Ofloatm_fHigh; //最高 high0 \1 s2 @0 d: G( @2 I2 F5 q6 @
floatm_fLow; //最低 low
$ C* u  _4 V5 p) V5 o- ifloatm_fClose; //收盘 close4 I9 k1 l2 y  s3 @& }% c) l
floatm_fVolume; //成交量 Volume+ g! }- C- U$ ^& g" \. ?! Y  e
floatm_fAmount; //成交额 amount
/ p, R6 q4 k9 m) R0 P/ ~WORDm_wAdvance; //上涨家数 仅大盘有效8 B  [3 Y6 D$ H3 q% h: p/ c0 K
WORDm_wDecline; //下跌家数 仅大盘有效" R4 _+ B& Y9 F" v8 u  R
}STKDATA;
3 v2 X6 }; n* Q定义STKDATA为 tagSTKDATA的简单别名,STKDATA
9 ^! X% n' [* {: Z% a* s: A$ \为真正方便使用名称,tagSTKDATA 为定目的的过水名称7 D3 P. d5 G% O
////////////////////////////////////////////////////////////////////////////3 {1 K/ }* i- t% ?* g
//扩展数据,用于定义取用分笔成交数据的买卖盘 的结构" ^# N& w8 W$ d( a
typedefunion tagSTKDATAEx
" T, h9 Y/ q4 Q' W; i/ }; P3 N{% l) J. ~6 L! U3 t9 Z3 \" ^7 \
struct+ e3 I2 W3 x/ i* X3 W2 S, k
{; a4 I/ G2 |; j1 P
floatm_fBuyPrice[3]; //买1--买3价floatm_fOpen; //开盘 open1 R1 _. j5 q5 s3 D. _- D
floatm_fHigh; //最高 high% n3 E2 @1 [) }% D# C. a
floatm_fLow; //最低 low3 @- c. l; u3 A/ [) x/ ^
floatm_fClose; //收盘 close& M- g3 O1 ?# ?$ x, t# c
floatm_fVolume; //成交量 Volume: A) e) ?* O% ]9 ^- R
floatm_fAmount; //成交额 amount; S5 W0 I! R2 T  j6 K
floatm_fBuyVol[3]; //买1--买3量
  R; f) e: ?5 Y( D" a% ifloatm_fSellPrice[3]; //卖1--卖3价7 {2 _6 q/ f* ^6 _7 K
floatm_fSellVol[3]; //卖1--卖3量  L* y% w0 o0 v8 P% h8 y
};, N9 m% P1 w+ T* _( e' p, q
floatm_fDataEx[12];
# B0 ]" g* t) E& s$ w/ r. Y}STKDATAEx;* E/ n5 N$ C. R! E
////////////////////////////////////////////////////////////////////////////7 k& M3 [* f" n1 `$ g0 m' V
//定义取用除权数据的结构# r+ d3 Y* n! @) i7 W
typedefstruct tagSPLITDATA " S5 R! q" w$ A! K
{
' U7 W( I+ B* n' h5 Mtime_tm_time; //时间,UCT
9 O, @2 G. F* u  Hfloatm_fHg; //红股) ^8 u! Q! P, K- O8 d
floatm_fPg; //配股* T" h5 Z7 E& v  u
floatm_fPgj; //配股价+ c1 u4 q6 Q3 o
floatm_fHl; //红利- J) X' u' ~# R+ s6 B. z3 [1 N
}SPLITDATA;
, R% ]5 P, j6 E7 X! L- W2 d$ Z* _/////////////////////////////////////////////////////////////////////////////
( f1 @; ?0 T. I, t8 o4 I6 l/*财务数据顺序(m_pfFinData内容)$ J9 N2 W( I- {( g
序号内容
+ Y# U1 Q, ^3 I) }- Q0总股本(万股),
: m+ d3 y2 s5 A% F; G1 y1国家股,- _8 [' K8 M4 P1 b
2发起人法人股,7 C1 J# L* b8 i+ s
3法人股,
+ j  D  o' p: |0 j8 c; _4B股,
3 V5 m: @, ]' X; ]2 U1 c# I2 m5H股," N7 j. L* y3 Y$ }9 E1 f  Z9 o, g
6流通A股,6 I4 {4 e' T) ]8 z4 P
7职工股,
) A6 R8 V. Q1 [: r0 E8A2转配股,) ^; S, i! j" O+ N- ?7 F
9总资产(千元),
' v9 \* V5 M7 t) j& X: H5 s7 P10流动资产,- \' a: o8 i+ g2 }4 i
11固定资产,
; R) B4 E! C6 j2 R+ d" u$ ~5 g1 P12无形资产,
( F9 t; m: A2 m) v. c2 i( x1 J! `, `13长期投资,
6 A0 C7 K, {  r  U14流动负债,5 {3 t/ J- d# |& O6 n* |
15长期负债,+ h- N1 y8 X" x4 w
16资本公积金,
4 ~7 ~# w% K( {/ P0 g17每股公积金,% g& q) v* `" a2 X5 r
18股东权益,% f! H8 T' H9 S8 e6 ]8 H2 g; W4 N
19主营收入,) u5 m% o  q2 x9 v+ T6 U  b, x
20主营利润,: z0 I8 I- t' Z4 x/ f7 C1 E) i
21其他利润,
: w* q# i, ~( D- v, i) Q  l22营业利润,2 a  a2 d2 d3 g% x5 Q
23投资收益,
' |, U& U, l1 N+ t5 `8 }5 ~24补贴收入,. w. p* e# K) o5 r
25营业外收支,2 `- K4 ?$ M! N  j; \5 j
26上年损益调整,8 Q2 w% S, ^% ]; F7 h0 I
27利润总额,
+ |9 Y7 _8 c, Y/ }$ u0 U' L28税后利润,7 X. }8 k- F4 S/ o+ R& |
29净利润,# d& y2 g0 X: B5 r) z
30未分配利润,
- v9 F/ p* E& E* f) B4 v# I# }. O31每股未分配,
3 v; |. ~+ q7 s1 K32每股收益,7 R) h7 k0 j- Z* R( h% `
33每股净资产,( |3 a* C& h( n8 _3 p1 J) `5 U
34调整每股净资,5 z8 Y, K/ X( t/ D7 }) I# C3 G
35股东权益比,
/ m; D: Y7 e; W+ a* R$ V36净资收益率
* m& \: E3 @' E( O6 M*/0 ]/ c% o8 _7 m% p- J
/////////////////////////////////////////////////////////////
, o3 t, k1 I$ ?; a$ {//定义取用caller函数传递参数项 的结构$ q$ z. _! S( z' d7 _
typedefstruct tagCALCPARAM
+ {6 F6 W: d" U; V{' u- t4 Y3 L4 o0 n
union
; s2 D3 {- J" S* r& w2 W! d{
5 X5 a. B# ?9 q9 v* ?3 uconstfloat* m_pfParam; //指向序列参数的址标,指向一个浮点型数组pointertofloat variable parameter / ex. c,h,l,o, co2...co2=(c+o)/2# O4 m3 s; p! }" E4 [. E! [( Y
constfloat m_fParam; //数值参数 valueof parameter
0 b+ s6 m, d7 e' C7 v/ z+ W};% v- {$ z* F  I( s
constint m_nParamStart; //序列参数有效起始位置thestart address of variable parameter / ex. c,h,l,o,co2.....
, {1 o! }8 f) v: c( V8 `* F5 U}CALCPARAM;
  {9 N3 ]+ N! t: H, `# ~/////////////////////////////////////////////////////////////////////////////
* W  o4 s0 ^. _& \: z6 K//定义全部取用址标 的总结构 (各指标指向前述各结构以便取的各结构的数据,接口信息数据的结构 )3 L; |2 B" p2 A  H4 d7 q
typedefstruct tagCALCINFO
( O+ y( f, \9 ^5 \{
( O# p5 Z9 k7 _* b$ `: N5 W% i$ JconstDWORD m_dwSize; //结构大小% U, T, ?# H( r  L3 i
constDWORD m_dwVersion; //调用软件版本(V2.10: 0x210)
! s6 A2 k0 f0 @# R( S- U  RconstDWORD m_dwSerial; //调用软件序列号. J& p$ q( g2 g
constchar* m_strStkLabel; //股票代码
9 B3 X4 W0 j4 SconstBOOL m_bIndex; //大盘
' A6 v( l) _( a* D$ A& Bconstint m_nNumData; //数据数量(pData,pDataEx,pResultBuf数据数量)数据长度
5 b( A; t7 f- b4 q8 Y$ B/ {constSTKDATA* m_pData; //常规数据,注意:当m_nNumData==0时可能为NULL
  B- }# p4 X0 N8 k$ f4 Q. x3 J" }! V. q2 @constSTKDATAEx* m_pDataEx; //扩展数据,分笔成交买卖盘,注意:可能为NULL
- W, _: D. ?8 s1 pconstint m_nParam1Start; //参数1有效起始位置<0/ constant parameter >0 /variable parameter 3 s2 d7 W+ B+ ^$ h1 p/ `! q
constfloat* m_pfParam1; //调用参数1/pointer to variable parameter 1 / E- {- E3 h& L0 ^8 F
constfloat* m_pfParam2; //调用参数2/pointer to variable parameter 2
  E  k) p% F2 ?- R5 Tconstfloat* m_pfParam3; //调用参数3/pointer to variable parameter 3
; m6 g, l2 {) D: xconstfloat* m_pfParam4; //调用参数4/pointer to variable parameter 4
8 ]& ]7 \2 t2 Y+ R& Nfloat*m_pResultBuf; //结果缓冲区2 f8 R0 ~) H; c0 g2 B+ S$ T
constDWORD m_dataType; //数据类型
* i% y. S1 _9 f; U! S; E6 P) h8 H9 u2 {constfloat* m_pfFinData; //财务数据) F! M: d8 h) G* z- e1 i
//以上与分析家兼容,所以沿用其结构和名称
9 u! x4 l& f: G* }5 \9 G//以下为飞狐交易师扩展(fortagSTKDATAEx)) Z3 g9 R+ C" @8 h) I; ~
constDWORD m_dwReserved; // 保留
$ X4 t# H; a" G& Jconstint m_nNumParam; // 调用参数数量5 @! I* B" W) I* x; |; k
constCALCPARAM* m_pCalcParam; // 调用参数数组" D, b2 ?/ N$ H. h3 s3 C8 z
constDWORD m_dwReservedEx[4]; // 保留2 E1 u- ~% p% V$ w: e
char*m_strStkName; //股票名称0 I2 \* C' X/ G, N2 J4 U9 M  K
SPLITDATA*m_pSplitData; //除权数据
4 y$ o* i4 V1 ]# x5 q) F/ }9 b* o, R* dintm_nNumSplitData; //除权次数
) g# V* U! I( n" _4 Z6 K}CALCINFO;
2 F4 D: b$ j* n% i5 p2 ?! P9 G/*
- e, N8 ?" H! Z注1:(与分析家兼容)
2 h, A& A8 E  y1.函数调用参数由m_pfParam1--m_pfParam4带入,若为NULL则表示该参数无效.
# q' O9 I2 A9 U2.当一个参数无效时,则其后的所有参数均无效.: i1 S  ^7 K, v
如:m_pfParam2为NULL,则m_pfParam3,m_pfParam4一定为NULL.' {4 `' V, S( I# F8 W( o
3.参数1可以是常数参数或序列数参数,其馀参数只能为常数参数.
9 N7 `* L; Y! U5 \4.若m_nParam1Start<0,则参数1为常数参数,参数等于*m_pfParam1;
  H" C0 Z" ]6 I- F: |  O5.若m_nParam1Start>=0,则参数1为序列数参数,m_pfParam1指向一个浮点型数组,
5 O1 u$ Y1 q0 a% r; u数组大小为m_nNumData,数据有效范围为m_nParam1Start至 m_nNumData-1.
. c' R* ~) V5 }6 a; `' H( _在时间上m_pData[x]与 m_pfParam1[x]是一致的
0 b0 U$ @* @' q, {5 B5 N& @8 h注2:(飞狐交易师扩展)$ I1 h8 c% u) @
1.该扩展结构使调用参数在技术上可以是无限数目的,且每个参数都可为数值或序列,由公式中实际的调用参数决定。+ \6 ^$ b, L: x" B4 b
2.CALCPARAM结构用于带入参数信息和实际数据,m_pCalcParam数组大小为m_nNumParam,数据有效范围为0 至m_nNumParam-1.% M+ H% s  y" N- P" u. E
3.按参数的顺序,m_pCalcParam[0]为第一个参数的数据,m_pCalcParam[1]为第二个参数的数据...,为了保持兼容,原m_nParam1Start、m_pfParam1等5个属性依然有赋值。: c* ^+ B. c; I( F* X3 q2 V" Z
4.若i位置的参数为数值,取用m_pCalcParam.m_fParam.
: \8 R  X5 h- C5 o& c5.若i位置的参数为序列,取用m_pCalcParam.m_pfParam,数组大小为m_nNumData,数据有效范围为m_pCalcParam.m_nParamStart至 m_nNumData-1.若m_pCalcParam.m_nParamStart<0,则此数组中无有效数据。
4 V/ M# D1 t, g( w% y5 U6.由于可以调用多个序列,许多序列的计算可以先在公式中进行,然后作为调用的参数即可。* \; N8 |/ Q" Z( b& j2 L
7.经此扩展,对分析家的DLL依然可以调用、兼容。
( q2 I4 n2 j5 T- n( _*/$ ^+ R4 x+ b# f5 f: `& S
///////////////////////////////////////////////////////////////////////////////////
, {0 [$ j# u* c, c$ h% a/*函数输出" B0 _" i$ h) N7 |. q( k, n" l
__declspec(dllexport)int xxxxxxxx(CALCINFO* pData);
% c$ E( q% F$ j: q( U* u1.函数名称需全部大写.
3 s" ?7 g0 K+ @8 I5 c! i9 A2.函数必须以上述形式声明,请用实际函数名称替代xxxxxxxx;
( F% _5 x- J$ j0 @$ \3 N3 m( o% K) C对于C++程序还需包括在extern"C" { } 括号中.1 h6 }7 V% }. g- y
3.函数计算结果用pData->m_pResultBuf带回.4 n3 n* k" p' R
4.函数返回-1表示错误或全部数据无效,否则返回第一个有效值位置,即:
3 I- o  k( @. q2 F. om_pResultBuf[返回值]-- m_pResultBuf[m_nNumData-1]间为有效值.3 h0 _* d0 `; |# q8 K+ l: o
5.函数名称长度不能超过15字节,动态连接库文件名不能超过9字节(不包括扩展名),动态库名称不能叫SYSTEM,EXPLORER4 c2 D& o$ [/ ^5 g
*/
" ^2 l. f1 a1 _//示例函数,使用时用实际名称替换
( C% I9 X7 X) z8 n1 ~( |6 ?' e__declspec(dllexport)int WINAPI MYMACLOSE(CALCINFO* pData);
) Y& l2 b  _. f4 R& w1 m4 ?__declspec(dllexport)int WINAPI SMOOTH(CALCINFO* pData);
# R# {+ C$ U- P- c# A& C//__declspec(dllexport) int WINAPI MYMAVAR(CALCINFO* pData);' @; u- r& H! n- O( A7 h
__declspec(dllexport)int WINAPI MYBBI(CALCINFO* pData);* s" }- o4 v4 P, S( L* W8 S# I
//WINAPI = _stdcall; x3 w7 L5 w2 \8 b* O2 @! i
#ifdef__cplusplus
4 f. \$ A/ p* |3 e1 Z  E1 A$ s  Q" w}" E* \9 G; y8 C8 a9 l# @  J
#endif//__cplusplus; \0 M# Y' V! c; r7 b0 H
#endif//__FOXFUNC_H_INCLUDE: R( z! ?, L& D( Y% ?4 u
. b( _$ [; g( ]  g* {
//////////////////////////////////////////comment 注解4 u, h* z0 h; c) E' s
__declspec(dllexport)int WINAPI MYMAVAR(CALCINFO* pData)
4 s& ~, Z4 ~0 F$ f" ]8 B- wpData是指向 址标总结构 CALCINFO的 总址标
! a. z9 {) @$ f取用第二个参数数值floatfParam = *pData→m_pfParam2   z5 r) a. l8 M$ R3 [# k- E
取用第一个序列参数的址标constfloat* pValue = pData->m_pfParam1;
3 I5 u$ F* R8 ]+ P6 s  ]2 ?取用股票数据长度intndata = pData→m_nNumData;
, U( Q  U+ \$ g$ H第一个参数存在且为数值pData->m_pfParam1&& pData→m_nParam1Start<0  U, u9 w! e; n' L
第一个参数存在且为序列pData->m_pfParam1&& pData→m_nParam1Start>=09 w# G4 z- x& B  K- ?
第一个及第二个参数存在且为序列,第三个参数不存在pData->m_pfParam1&& pData->m_pfParam2 && pData->m_nParam1Start>=0&& pData->m_pfParam3==NULL
/ H; q; Q1 p' a: X8 rconstfloat* cpParam = pData->m_pfParam1; 定义cpParam为第一个序列参数的址标
- n! Q/ }( K4 w: T取用股票数据结构
7 ?- |  r; U4 E- t" d$ |9 XpData→m_nNumData= 变数数据长度
1 k6 V9 a# D# U# @8 ?9 Z+ FpData→m_pData= pointer to struc STKDATA 的址标
& |! x3 a; j' T! `& V0 jpData→m_pData[x]数据结构的第x个数据4 T! J6 ?# d6 S
pData→m_pData[x].m_fHigh数据结构的第x个数据中的 High
, y3 ?+ M( O3 v+ J7 p7 s4 N% N取用结果缓冲序列
4 P% v2 {4 g: s* o( [5 E5 m% E3 bpData->m_pResultBuf
- ?- ?5 o- D' _& u取得第一个序列参数的起始序位,如 2,...5 , . 7..." H; @% a( g9 |
intnFirst = pData->m_nParam1Start;
  M! Y( L1 p( |7 V4 h* |for( i = nFirst+nPeriod-1; i < pData->m_nNumData; i++ )
- U& P- q& C. {8 G0 Y取得第二个数值参数的数值5 A/ ~2 E: j; R6 k8 S
floatfParam = *pData->m_pfParam2; ) o5 D& z7 g  E0 S
intnPeriod = (int)fParam;
+ O3 G# t$ S6 v! ]' r取用第一个序列参数的址标constfloat* pValue = pData→m_pfParam1;" n% S0 `2 V& [
取用序列参数的单个直pValue
/ Y% G/ L" ?0 ]) ~取用缓冲序列的单个值pData->m_pResultBuf
7 o( r2 E7 _$ q0 yconstCALCPARAM* m_pCalcParam; // 调用参数数组' U) [5 x2 L, t+ B
m_pCalcParam为序列址标,指向各序列参数的指标
( ]5 l0 R- z: Z/ `; {- m+ {第一个序列参数pData→m_pCalcParam[0]
4 I" `- L: K, sconstfloat* m_pfParam; //指向序列参数的址标
6 j5 U% A( T) a" c; g第一个序列参数的起始序位pData->m_pCalcParam[0].m_nParamStart& N$ U8 x) L9 m
第一个序列参数的址标constfloat* pValue1 = pData→m_pCalcParam[0].m_pfParam;) ?+ T- V3 f9 s1 r
取用第一个序列参数的单个直pValue1
# a1 s4 ^7 B/ ^2 M第二个序列参数pData→m_pCalcParam[1]
( q8 I; h: t6 ~& F) F第二个序列参数的起始序位pData->m_pCalcParam[1].m_nParamStart; X6 k: J9 ?: j1 V0 I3 J2 I" [
第二个序列参数的址标constfloat* pValue1 = pData→m_pCalcParam[1].m_pfParam;
8 x, K% S( a; \7 p- C$ K: O4 ^, {取用第二个序列参数的单个直pValue2; g& e6 w) Z% w
第三个序列参数pData→m_pCalcParam[2]- I" M8 t; O' d! _1 ]
第三个序列参数的起始序位pData->m_pCalcParam[2].m_nParamStart7 N: G. V/ D5 e& K
第三个序列参数的址标constfloat* pValue1 = pData→m_pCalcParam[2].m_pfParam;
7 `  ~$ ?; v, I% a7 w- b取用第三个序列参数的单个直pValue3( \6 p3 B  Q" v- |. \/ e' j
第四个序列参数pData→m_pCalcParam[3]
) o, n- W* O4 l- t第四个序列参数的起始序位pData->m_pCalcParam[3].m_nParamStart
3 t( d: X8 l6 k( H9 J8 k# |第四个序列参数的址标constfloat* pValue1 = pData→m_pCalcParam[3].m_pfParam;
& y- e5 {5 D# P. ]; [5 ~取用第四个序列参数的单个直pValue4
$ g3 i' k! X8 J9 x1 V如果有四个序列参数,则取用序位最高的那一个序位# g" S! j& q) [" }+ W
if( pData->m_pCalcParam[0].m_nParamStart >= 0 &&
; r- L% `2 T" |/ z- O& RpData->m_pCalcParam[1].m_nParamStart>= 0 &&
  {4 h. m; h5 z% GpData->m_pCalcParam[2].m_nParamStart>= 0 &&
8 b' C5 n, N2 d! I: a# T9 \pData->m_pCalcParam[3].m_nParamStart>= 0 ) //4个序列都含有效数值7 {' @$ o! u% \0 }7 y
{! S+ j  e: O0 m8 K8 U- @* \
//计算返回的序列的第一个有效值位置) n9 `0 Q1 ?6 w8 M4 H7 s8 p; H2 E
intnFirst = pData->m_pCalcParam[3].m_nParamStart;//已知返回的序列的第一个有效值位置与第4个序列一致$ u  c- _; Z* z! v- {# u% B
//若不知,则
' g. r. Y" f- u" B/*
% |0 y% c, b! i2 |6 jintnFirst = pData->m_pCalcParam[0].m_nParamStart;
6 `: ^- g5 @; D' {, u! q' u# vif( nFirst < pData->m_pCalcParam[1].m_nParamStart ) 3 e2 ]2 N$ l1 m( u6 z4 M/ _' U
nFirst= pData->m_pCalcParam[1].m_nParamStart;' R& `1 c. i2 b+ A& F+ J
if( nFirst < pData->m_pCalcParam[2].m_nParamStart )
% s$ p4 Y3 @+ q% y5 C- O( XnFirst= pData->m_pCalcParam[2].m_nParamStart;
! u# E4 y; L2 U# D: Oif( nFirst < pData->m_pCalcParam[3].m_nParamStart )
& f7 w' z: h2 Q! YnFirst= pData→m_pCalcParam[3].m_nParamStart;4 {& D& E1 }7 Y) [  W' R/ l' D
constfloat* pValue1 = pData->m_pCalcParam[0].m_pfParam;
4 R3 I" ^3 Q, Z8 T% f0 nconstfloat* pValue2 = pData->m_pCalcParam[1].m_pfParam;
. P. P2 g4 x- M6 ?constfloat* pValue3 = pData->m_pCalcParam[2].m_pfParam;
% G  L& {' A: g5 J- S% ^  p/ J/ p: {constfloat* pValue4 = pData->m_pCalcParam[3].m_pfParam;7 W9 a2 x& ^1 |- T
//-------------------
: t* `" z8 l, Z$ u& U  xfloatm_fOpen; //开盘 open
, ]8 n* _/ c' _" ^1 zfloatm_fHigh; //最高 high  t8 E$ _) b3 m7 b9 f, x6 n
floatm_fLow; //最低 low
4 ?$ X3 `6 f4 R6 W- j. rfloatm_fClose; //收盘 close
: e" p( }: m8 g% J3 Dfloatm_fVolume; //成交量 Volume
# I: N; k4 ?7 r, b4 z, \* Xfloatm_fAmount; //成交额 amount
4 t1 c  k0 c1 S6 m. B$ |# o调用收盘据
  @) t9 \; E% x8 a9 A1 f1 rpData→m_nNumData= 变数数据长度/ u, i. Q* v6 K
pData→m_pData= pointer to struc STKDATA
" l9 H0 }) p, [" e5 \- ZpData→m_pData[x]第x个数据% i# y. e! D1 ~/ Q. q
pData→m_pData[x].m_fHigh第x个数据中的 High# [, a3 F2 m) X* t
@@@@@@@@@@@important !!!!!!!
* R7 ^8 [. q  J" w  AsinceVC++ 2008, cl.exe will make ‘pData→m_pData[i-j].m_fClose’ anerror
& P0 y; b7 O5 ^( d" p' ]& z7 g3 Q% Z# `so,pass the high,low,open and close just from the function parameter ,that is use ‘ CALCPARAM’ struct
& S/ V0 J- Y6 bpData->m_pData[i-j].m_fOpen// to use open , there is no way in using a varable for calculationoutside foxtrader
3 t, l/ G4 n/ s. zpData→m_pData[i-j].m_fHighto use high
6 T' Q: N, X  c+ hpData->m_pData[i-j].m_fLow; i6 b& ?! O2 j# C
pData->m_pData[i-j].m_fClose
9 T- J# H7 ~' e; t) qm_pData= pointer to struc STKDATA3 e$ k: w; [! R/ `0 \* ?' p& ]
incalling C++ dll function
4 X) I+ Y) I& n% B3 [" R# G7 m" Fm_pDatais passed to pData (CALCINFO* pData . A CALCINFO* type pointer)4 f3 u( B1 L7 n: C9 h" w. W, Y
touse a single value in variable ‘High’
3 O8 V( Z, b/ D! N4 XpData→m_pData[i-j].m_fHighto use high) q& S# J( U$ z- @; ~9 q
constfloat* m_pfParam1; //调用参数1/pointer to variable parameter 1
- T8 T4 j! d6 ~/ L! Iconstfloat* m_pfParam2; //调用参数2/pointer to variable parameter 2
' y* [! l2 H+ o! t; R# cconstfloat* m_pfParam3; //调用参数3/pointer to variable parameter 3
& y# f+ q6 E9 ?( oconstfloat* m_pfParam4;
- [( s; x+ C) h; v4 Jm_pfParam1,m_pfParam2, m_pfParam3, m_pfParam4 = pointer to caller function 的参数
& s9 c+ A* }+ }pData→m_pfParam1= pointer to 第一个(序列)参数4 g4 \) c% v/ y, Y- j: x, P/ ]
pData→m_pfParam1[x]= 取用第一个(序列)参数的第x 个值
) m+ K. a* I1 }3 q! H# N9 Dconstfloat* cpParam = pData→m_pfParam1; =定义 cpParam为 pointerto 第一个(序列)参数
! r9 y5 A+ ]2 p: O2 Y* q3 A0 s4 vcpParam[x] = 取用第一个(序列)参数的第x 个值$ k; O2 V$ C& {' ~
m_pResultBuf= 结果缓冲列
; N( N0 d/ {$ K8 t4 u/ NpData→m_pResultBuf= pointer to 结果缓冲列' N8 i# z- O6 B" |
pData→m_pResultBuf[x] = 取用结果缓冲列的第 x个值
$ L$ X/ h8 ?* a/ e//////////////////////////////////////////comment
) x. F" W! M& l3 q//////////////////////////////////////////comment 注解2 U2 c; c' F( O4 T# p! _* S: d
constint m_nParam1Start; //统杅1衄虴宎弇离
+ ]% ]/ \( ~, tconstfloat* m_pfParam1; //覃蚚统杅17 U! r8 x& Z; D. A1 ]5 J
constfloat* m_pfParam2; //覃蚚统杅20 }) M) M# H, R
constfloat* m_pfParam3; //覃蚚统杅3
% U/ h, l. R$ S8 U  C, J% }3 tconstfloat* m_pfParam4; //覃蚚统杅4,parameters must be <= 4
$ G, T- d% G7 E* L, g//const float* m_pfParam5; // parameters must be <= 4
8 Y- v7 h; U4 \( T' Q//const float* m_pfParam6;   ?. @. G5 n6 r
//const float* m_pfParam7;   ~: R  H0 c/ {" B: \. d
//const float* m_pfParam8;
7 Q/ ?1 ~% p; ?7 r0 V//pData->m_pfParam1 && pData->m_pfParam2 &&pData->m_pfParam3 && pData->m_nParam1Start>=0 &&+ }2 V1 O; w; N, l& K: K1 c
pData->m_pCalcParam[0].m_nParamStart>=0&& pData->m_pCalcParam[1].m_nParamStart>=0
8 ~3 U  o# M$ l1 e&&pData->m_pCalcParam[2].m_nParamStart>=0) - A+ S5 Y) s" [; G
{
( r% x2 J! X& C8 G2 b- NfloatfParam = *pData->m_pfParam4; //pointer ,pData->m_pCalcParam[3].m_nParamStart >= 0
2 C2 C* z4 ?! K9 z( r, n% c) qintnPeriod = (int)fParam; //统杅1  w: n1 ?& H$ B; b9 e" R7 x1 z) T' \
//const float* cpParam = pData->m_pfParam2; // cpParam = pointer to第一个序列参数,cpParam = 取用第一个序列参数的第i 个值
) h6 N0 M0 q( f! w. j. ]! dconstfloat* cpParam1 =pData->m_pCalcParam[0].m_pfParam; // cpParam =pointer to 第一个序列参数,cpParam = 取用第一个序列参数的第i 个值
& l9 Z: o: \4 p1 s$ T" mconstfloat* cpParam2 =pData->m_pCalcParam[1].m_pfParam; // cpParam =pointer to 第一个序列参数,cpParam = 取用第一个序列参数的第i 个值
2 `3 O' U( J* ^5 ~constfloat* cpParam3 =pData->m_pCalcParam[2].m_pfParam; // cpParam =pointer to 第一个序列参数,cpParam = 取用第一个序列参数的第i 个值//parameters must be <= 4+ t3 I' L( I5 @% M
//const float* cpParam4 =pData->m_pCalcParam[3].m_pfParam; //cpParam = pointer to 第一个序列参数,cpParam = 取用第一个序列参数的第i 个值7 N+ h4 m5 w; V, ~1 \
//const float* cpParam5 =pData->m_pCalcParam[4].m_pfParam; //cpParam = pointer to 第一个序列参数,cpParam = 取用第一个序列参数的第i 个值
3 m4 V" j) g/ R' x& ?' u$ v//m_pData = const struct pointer to struct STKDATA , pointer to structSTKDATA ,
3 x3 o5 U6 y# `touse pData→m_pData[x].m_fClose& S- |, R( ^1 H+ w! F
pData→m_pData[x]= | 1,2,3 , … , m_nNumParam | time_t m_time; - B/ ?- T3 R6 n- t( f) @
|1,2,3 , … , m_nNumParam | float m_fOime_t
* H3 V' d5 }, L( L' [4 U|1,2,3 , … , m_nNumParam | float m_fHigh;- l) @6 m8 l: S
.. .
2 w4 n7 E  ^% F7 g8 I+ o|1,2,3 , … , m_nNumParam | WORD m_wDecline;- Y: y$ Y3 t& j3 k4 V" z+ g
m_nNumParam= 数据high,close,open,low的长度2 }5 `$ {& [; a' ?2 W' W$ _( }: p7 g
touse high:
; s9 H/ b8 k2 [pData→m_pData[x].m_fHigh1 N+ a3 [# K' T+ [" c! b: d# c8 a. r
contentof struct STKDATA, g" ~+ ]5 t0 t; e
time_tm_time; //时间,UCT
1 @7 {  K( n* p8 r8 h) sfloatm_fOpen; //开盘 open
0 S! M4 x# _' W2 ~' s# Mfloatm_fHigh; //最高 high; E" @( ?# A; N$ i- K0 C
floatm_fLow; //最低 low7 d/ w4 E4 W, o6 o; E# Q  P
floatm_fClose; //收盘 close
! ~/ X; B8 {2 h5 n* {+ ^- Hfloatm_fVolume; //成交量 Volume
% @# d$ ?9 r3 V8 d( g- r0 @0 cfloatm_fAmount; //成交额 amount
  ^$ ~$ D" V8 a) yWORDm_wAdvance; //上涨家数 仅大盘有效
0 g) ?2 `6 f4 Z. jWORDm_wDecline; //下跌家数 仅大盘有效
1 w: U" z- R- V3 f9 s调用传递参数及传回结果- f. \6 o7 `9 F$ {. P2 Z
调用传递参数7 X6 p& c* `1 G! M( `
(pData->m_pfParam1 && //参数1有效Param1exists
% e# t7 M) a* V' `8 v0 N: RpData->m_nParam1Start<0&& //参数1为常数' ?/ T+ n* d4 E) M9 A- {6 z
pData->m_pfParam2==NULL) //
3 f& P# W( K. n/ F) Klocalprocedure 定义使用变数/ X% r5 w6 q/ r9 l9 o
onstfloat* pValue = pData→m_pfParam1; //use constant参数1( `. i7 ]3 b# u
intnFirst = pData->m_nParam1Start; //use 参数1效值起始位
% V& o4 I4 n0 Q" @0 `& sfloatfParam = *pData->m_pfParam2; //use 参数25 c9 b3 R0 B  I
intnPeriod = (int)fParam;
, s  z+ A- C  D; a传回结果
( d) ~/ U/ K/ k3 U* |; j. ]fTotal+= pValue[i-j];- P8 d! H+ E4 [# C
pData->m_pResultBuf( j9 D" n* F3 c
//////////////////////////////////////////comment

评分

1

查看全部评分

您需要登录后才可以回帖 登录 | 手机注册

本版积分规则

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

GMT+8, 2026-10-20 12:33 , Processed in 0.138664 second(s), 20 queries .

Powered by Discuz! X3.2 Licensed

© 2001-2013 Comsenz Inc.

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