阳光飞狐

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

 找回密码
 手机注册

手机动态码快速登录

手机号快速注册登录

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

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

[复制链接]
跳转到指定楼层
1#
发表于 2019-8-11 16:09:40 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
许多年以前,我曾经在7 P6 _& N7 \8 Q1 j) U
理想公式区发布了3 m+ g/ G# I; f* V
"
( Q1 f* L& K% K# I7 c如何用 Foxtrader(飞狐)连结 C++动态程式库 DLL80x86Macro Assembly (组合语言)
9 v. U6 D6 J4 G"( ?4 u( s0 x8 U: `" X( K9 R
& ]- r2 T9 D& h/ ^; c, r8 z
现在更新foxtrader(飞狐交易师) & ~! Z0 Q3 ?9 P. G" ?# q
连结 DLL的方法8 {% T" E6 _6 ^$ N* G' _
' {) `: Z  a; K2 R. O8 o# h
foxtrader- - > DLL (C++ and assembly) = ( foxfunc.h + foxfunc.cpp +pow10.asm )
0 q' d, D6 F9 k( f7 l5 Bgauss- - > DLL (C++ and assembly) = ( foxfunc.cpp + meigj.asm ). t4 b( U) V  l! }: }9 ?1 l
gauss只用到函数参数传递,所以使用新的 c++compiler, 不受影响/ [. P4 _/ H0 Z0 W# D
foxtraderfoxfunc.h宣告的结构型态 (struct)2004vc++ 6.0 全部有效* I- j) ?3 J* }; Q* k
: f: `6 O% y- `8 O( @- ^4 ]
也就是这五个结构都能用. {" h* s. L# J2 D& Y) |# h" J4 ?. f
typedefstruct tagSTKDATA
$ s, U* s' s) T2 y4 Wtypedefunion tagSTKDATAEx) A7 R+ O0 M# H& x3 D7 k2 z
typedefstruct tagSPLITDATA
+ ?7 ?) h* g5 n$ ~! Ftypedefstruct tagCALCPARAM" U/ V# R+ V% ~3 N3 B  D
typedefstruct tagCALCINFO$ u( i7 O  Y3 j9 V8 i

6 N- d! E, h, T, |2008年起,vc++ 2008, vc++ 2010, vc++2017 struct的编译,已经完全 c++,不再相容于 C
; s. X6 H* B  O  a% d- ?也就是这五个结构中' `; x& b" q* B- `9 K
typedefstruct tagSTKDATA
# e- A3 G* l- t" F4 o" atypedefunion tagSTKDATAEx* u. r' V) i& z6 r* k
typedefstruct tagSPLITDATA   F" e( Q, O/ ^
typedefstruct tagCALCPARAM
4 _) ]  ^1 @- E) P9 i* V& ]typedefstruct tagCALCINFO% Y3 S; y# H$ _
只有这两个可以用; o2 u$ w5 H3 V9 b1 [3 L! i
typedefstruct tagCALCPARAM+ ^0 p( E, s+ J0 t& E- M8 Q( H+ M
typedefstruct tagCALCINFO( r0 h0 f8 H5 k
值得庆幸的是,下面这个结构的函数参数传递个数可以有无数个
2 t2 w" f6 w9 X/ {typedefstruct tagCALCPARAM5 c% `$ k/ ?0 p9 J" G" c
例如:foxtrader) }% Y: o% s: g$ z% g
MA1:=MA(CLOSE,3);
( p. {& b# S. j, D6 PMA2:=MA(CLOSE,6);4 [; h( K! y9 |' ~5 Y) a# U! G4 u
MA3:=MA(CLOSE,12);
3 B: [2 Z; L7 c3 M  z. O$ D0 qMA4:=MA(CLOSE,24);
8 u4 a9 {& ?) u2 @6 |1 LMYBBI1:"MYFUNC2017@MYBBI"(MA1, MA2,MA3,MA4,MA3,MA4,5)*0.95,colorff00ff,linethick3; {2017 vc++ 15.0}
% a0 C/ E+ e* ?3 w8 i: u其中MYFUNC2017=MYFUNC2017.dll, MYBBI = MYFUNC2017.dll 中的MYBBI函数,这里 MYBBI函数传递的参数共有 7
3 t. w' W8 t2 G1 }下面这两式计算结果相同
7 f* H+ h; z3 }5 \9 ~' i9 B0 ^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 自行计算}
$ Q$ Y- U# ]& U. {MYBBI1:"MYFUNC2017@MYBBI"(MA1, MA2,MA3,MA4,MA3,MA4,6)*0.95,colorff00ff,linethick3; {2017 vc++ 15.0 , dll计算}
' O* K6 x  j" `! U- P其他例子2 t" z: I8 Q% ]: y
oooq:="MYFUNC2008good@MYMACLOSE"(c,,c,c,6),colorffffff,linethick5;(---> pow10.asm)
* l, z. g1 W% w$ j, _" n3 moooq1:"MYFUNC2010@MYMAVAR"(ma(c,5),5),colorgreen,linethick5;8 S9 R$ V; v& H% @
其中pow10.asm里面有很多不同定义或宣告被注解不用,那是因为后来在逐步侦测法修改语码中才发现在foxfunc.cpp主程式中,下面这行错误,也就是新的 compiler不再相容于 C,因此在pow10.asm里面被注解不用的定义或宣告中,有些应该是可以用的8 Q3 J: W. I7 }& R/ _, Z4 t2 }
fTotal= pData->m_pData.m_fClose; // @@@@@@@ vc++ 2010 cl.exe 使pData->m_pData[i-j].m_fClose错误$ t4 X+ E; q, D( E: g3 l

: K# r9 S/ p$ Z! X# a$ b+ A5 o4 ]- c- J7 {5 l2 O, b; A
////////////////////////////////////////////////////////foxfunc.h
  D( l8 F; Y* _2 Z0 X. }" O) @#ifndef__FOXFUNC_H_INCLUDE) g% }5 ^# y4 {- U  p9 K/ |) N* O
#define__FOXFUNC_H_INCLUDE
6 W% }0 P- Z6 r- O' k/*
5 b6 X$ {. A# ^飞狐交易师“C语言接口”扩展程序调用接口规范V3.0
) p4 D( o9 B: ~! M3 P* X1.本规范适用于飞狐交易师V3.x公式系统.) g3 @$ Z0 Z- s  [+ g6 P8 Y
2.扩展函数用于实现系统函数不能实现的特殊算法.% ], _/ d* ]/ ^! ?# _9 K  O+ ^
3.扩展函数用windows32位动态连接库实现,建议使用MicrosoftVisual C++编程.
, e( B4 {1 @3 d4.调用时在公式编辑器中写"动态库名称@函数名称"(参数表)即可,例如下面函数可以写为"FOXFUNC@MYMACLOSE"(5)9 i6 p4 {4 u; f' }. L. l* z1 d
5.动态连接库名称和函数名称可以自己定义.% b1 @( @- Y5 x( y7 z( D$ {/ a; Z9 s* d
6.使用时必须将动态库拷贝到飞狐交易师安装目录下的FmlDLL子目录下使用.0 C5 Y; A( r7 k! ^1 X) B  ^
*/
  A( {3 t$ J- w. o  _- ^#ifdef__cplusplus
0 Z. d; c8 o; n8 o& bextern"C", A( q% a# ^  P. C0 z6 |2 n
{4 D5 ~6 _5 J" j8 c
#endif//__cplusplus
/ z7 h; V8 h1 w$ s9 D, q. i/ T///////////////////////////////////////////////////////////////////////////* ~2 Q8 r$ h3 q6 L; H# @6 ^
//分析周期4 p+ L6 s* ~% k8 e- i9 ^9 E
enumDATA_TYPE
9 ^1 u4 S1 Q4 W: z+ w{' t  g) q1 k. M% l! A
TICK_DATA=2,//分笔成交
$ r; U& E+ U) v$ k# L& mMIN1_DATA,//1分钟线
8 U$ @4 i$ ^! I7 }1 V# \7 ]MIN5_DATA,//5分钟线
/ d$ b& U* c" [) O# J6 E4 BMIN15_DATA,//15分钟线2 `& y! S; Q: e  T
MIN30_DATA,//30分钟线5 n1 _: a% }4 e5 x# @+ M4 P2 x" n
MIN60_DATA,//60分钟线
9 }& y0 O. j( f( U4 A8 O% [' iDAY_DATA,//日线9 v) Q7 R8 u0 n4 u; B& p
WEEK_DATA,//周线
8 V3 U! E- w4 f" N- W5 T4 m0 kMONTH_DATA,//月线2 P3 H" W0 W( q# c
YEAR_DATA,//年线: W/ [. O# O1 g4 {1 `( W7 \5 K& S3 S
MULTIDAY_DATA,//多日线
( [8 R: e! d; A3 KMULTIMIN_DATA//多分钟线) N. m( b, ?) |' o6 a- T, G7 Y# c
};( O$ z9 d" C$ r; S
///////////////////////////////////////////////////////////////////////////; t1 C8 t. [' U. y: X
//定义取用股票基本数据的结构 只有 VC++ 6.0 compile成功使用
8 c0 b: B" k7 O2 k" l3 Gtypedefstruct tagSTKDATA 3 r  U# \8 Y" E% X) U- {8 t
{. W6 u/ _. `! a/ a
_tm_; //时间,UCT4 n$ X8 w7 p- ~! g
floatm_fOpen; //开盘 open8 G, H, M/ u+ l' B
floatm_fHigh; //最高 high
* t: s; X2 i7 n: Pfloatm_fLow; //最低 low
. W6 C  i. Q& T) mfloatm_fClose; //收盘 close4 p% }2 g; d7 A8 P- X
floatm_fVolume; //成交量 Volume6 R7 O) v. O4 w+ ~* v3 n
floatm_fAmount; //成交额 amount
) Q) m( K4 V) W# s1 C7 vWORDm_wAdvance; //上涨家数 仅大盘有效* t* W+ Z  H8 S) v! r9 u" o
WORDm_wDecline; //下跌家数 仅大盘有效
4 s. G7 [2 G. M( L6 T1 N: p. A- h}STKDATA;: D' I9 u' k: M5 y, h; U
定义STKDATAtagSTKDATA的简单别名,STKDATA 2 i$ a4 j5 X* ~$ g
为真正方便使用名称,tagSTKDATA 为定目的的过水名称
) x: H' C5 N% ?( l( ^////////////////////////////////////////////////////////////////////////////: h! \  m" |- s+ ^1 H
//扩展数据,用于定义取用分笔成交数据的买卖盘 的结构
# b  O; \& T; ~' U9 dtypedefunion tagSTKDATAEx
+ ]  Q# w2 M. l! a! p* `{
& r( _4 e! z0 E, qstruct
& S. R9 X* p+ r3 ?{' p2 B5 {0 @: C) K# Q: Q
floatm_fBuyPrice[3]; //1--3floatm_fOpen; //开盘 open) c7 a0 O) _% r( y/ q" T
floatm_fHigh; //最高 high6 k! W/ J& R/ ~. v/ R: @  N/ S
floatm_fLow; //最低 low  i2 r% a! y0 _+ g! f
floatm_fClose; //收盘 close
. U  f8 |& n" {5 E4 Jfloatm_fVolume; //成交量 Volume/ {# L9 Q4 H) W: A3 ?  V
floatm_fAmount; //成交额 amount7 H) ]9 C; S  G- g& M5 L- X# I
floatm_fBuyVol[3]; //1--3( e3 G5 P7 ^$ p+ e4 T
floatm_fSellPrice[3]; //1--3
: J/ U$ i" S  z* r7 @  H+ m( Afloatm_fSellVol[3]; //1--37 w! r* ~3 E" s% {
};& Y( g- r% [, J9 ^- w
floatm_fDataEx[12];' j5 E) f2 z2 {$ q2 W: v
}STKDATAEx;5 i/ f1 r$ ]9 K
////////////////////////////////////////////////////////////////////////////' G& ?8 b% j+ I
//定义取用除权数据的结构! T, r! }& A$ H4 n+ I% x' ?% T
typedefstruct tagSPLITDATA + p) b$ m$ e( a5 B# R7 Z" u2 E
{. E$ p1 s8 I9 O! j
time_tm_time; //时间,UCT( v" k8 l' }7 A
floatm_fHg; //红股* e) P8 p$ x( f7 [4 f' A
floatm_fPg; //配股
6 n/ s$ o/ O; Q" `. E5 c- Nfloatm_fPgj; //配股价
  Y4 G0 H0 h3 l4 i# x- Hfloatm_fHl; //红利0 m+ ]! d' a( ?8 L
}SPLITDATA;
& t/ G7 {$ p1 W/////////////////////////////////////////////////////////////////////////////
9 S2 Q, h+ i: w2 H' ~' w/*财务数据顺序(m_pfFinData内容)
4 V8 \' f+ R+ f5 Q  L! [$ F序号内容
9 U  K% o4 l$ C/ u6 e: G0 m5 U1 G7 @0总股本(万股),+ ?9 ~% J0 i  u6 f
1国家股,) T' [* Y, u0 ?; [, B2 i
2发起人法人股,( y8 i/ i% y! h5 [) g
3法人股,4 ^7 r7 Z* e( a- c5 k/ u
4B,
" J/ T) j  B" n; e1 V  k' V2 D( k5H,
. o: i& K! c6 p; o- B* s6流通A,
1 g0 |6 K, ?$ f' {7 U& G7职工股,- a; I: J! Z' _, p
8A2转配股,
; ~' S& ^# a. F+ H  m  v0 ~7 C9总资产(千元),
3 s- ~5 F0 r4 P$ i10流动资产,
7 C) H, s) U1 K# E! Y0 R11固定资产,7 a- }. L2 k( Q7 M; p+ h$ D+ c6 v
12无形资产,
- }+ S) d% G4 s) i/ U% [3 Z13长期投资,, Z- ?: ?' l- f8 f. _
14流动负债,9 Z! P1 K1 l* u3 X" j; X- C( `0 b
15长期负债,* j( z' u! e) u
16资本公积金,+ T  A) X, _" F# a; l) {+ N1 u
17每股公积金,
' X; O% s0 T. @  v2 {4 |# T18股东权益,' b% Q( t4 `. |* w
19主营收入,
- w  |+ p) Y3 s& E; \( e  |/ s20主营利润,
" M1 x" d, B1 R: n) E0 y6 p7 h21其他利润,) A9 ~3 ~8 O  J/ @9 M
22营业利润,* {  D% Q$ [( o& l, _  q5 B  d
23投资收益,7 G( h0 f5 R) m5 b
24补贴收入,
! Z% Z9 N! k4 k5 O3 b0 |8 n25营业外收支,
( s  R0 I9 j2 B5 l3 g26上年损益调整,6 e- T( h# h. }: }; s# E
27利润总额,
, o  w: P) C( M4 q, v28税后利润,' c+ P  P, m0 z$ ?4 n/ [
29净利润,4 v  G9 i8 n( W  }' Z: v
30未分配利润,( R$ Z2 n7 O) X. T
31每股未分配,% F' }. q) B( Q  h* f' Q
32每股收益,3 w( m3 E* S1 d9 e2 b2 R0 E* d
33每股净资产,# T- ~. `$ {/ m# c
34调整每股净资,/ v* J, ?* K0 C3 Y
35股东权益比,
# V) H' r+ J1 S( R5 @. E! G  A36净资收益率8 W1 }4 {0 c, H9 K
*/) n% J7 s6 y7 ]# ^
/////////////////////////////////////////////////////////////
, z, Y( t1 G& E/ W3 o3 m//定义取用caller函数传递参数项 的结构- j) [5 b+ B/ P# F% v0 m6 _. o
typedefstruct tagCALCPARAM
6 |+ J# L& ?. U, F{
: b( e# p, h2 {; b3 ?, D# D9 zunion
6 i0 q# X1 o' N8 Z" H' \{( c+ u: H$ e- }9 M+ d) ]
constfloat* m_pfParam; //指向序列参数的址标,指向一个浮点型数组pointertofloat variable parameter / ex. c,h,l,o, co2...co2=(c+o)/24 z' ]  Y; j, t" R# u1 C& b8 u
constfloat m_fParam; //数值参数 valueof parameter$ D* }+ j' v: |1 b6 m8 c: N0 _1 G; ~
};; A+ W& l- E: ?$ i- x. H
constint m_nParamStart; //序列参数有效起始位置thestart address of variable parameter / ex. c,h,l,o,co2.....0 a4 {( t% K; p; d" c# ?
}CALCPARAM;' d# n0 a& W$ v' V
/////////////////////////////////////////////////////////////////////////////" W5 h7 [. T7 X6 N. N& H1 I+ Z7 S( a
//定义全部取用址标 的总结构 (各指标指向前述各结构以便取的各结构的数据,接口信息数据的结构 ). O- ^! b* o: R/ T/ j; E
typedefstruct tagCALCINFO
4 q$ J: O+ ^, v( K* H" }/ ?) \{. K$ u% g; w  L  u
constDWORD m_dwSize; //结构大小3 R1 |1 C  {- O
constDWORD m_dwVersion; //调用软件版本(V2.10: 0x210)) D7 T) w$ x' A6 d
constDWORD m_dwSerial; //调用软件序列号
0 _  k+ @, p" {0 @( Tconstchar* m_strStkLabel; //股票代码
: W# K+ w3 Q& q2 R% \( iconstBOOL m_bIndex; //大盘
' H9 e, E( y: K3 Kconstint m_nNumData; //数据数量(pData,pDataEx,pResultBuf数据数量)数据长度! u8 X0 k+ X! C& @, Z2 B* E
constSTKDATA* m_pData; //常规数据,注意:m_nNumData==0时可能为NULL
/ g5 d5 }; N' l% [; NconstSTKDATAEx* m_pDataEx; //扩展数据,分笔成交买卖盘,注意:可能为NULL
. |5 P+ t9 o* X! `+ z' pconstint m_nParam1Start; //参数1有效起始位置<0/ constant parameter >0 /variable parameter - j0 a8 v2 r, Q2 |; k
constfloat* m_pfParam1; //调用参数1/pointer to variable parameter 1
8 m5 h4 ]& t$ C! Z" c  E' sconstfloat* m_pfParam2; //调用参数2/pointer to variable parameter 2
  p6 m* {* L- lconstfloat* m_pfParam3; //调用参数3/pointer to variable parameter 3
. K( i/ y+ x; A6 S8 c8 i/ ^) d" ]  Gconstfloat* m_pfParam4; //调用参数4/pointer to variable parameter 4+ d$ @7 z2 Q* [) V: b& u; s
float*m_pResultBuf; //结果缓冲区
7 L, ^/ P. v3 H; x2 L0 [constDWORD m_dataType; //数据类型8 g. [* t. _: b! J7 b5 ^
constfloat* m_pfFinData; //财务数据
+ B& C& D8 x1 r) Y+ g//以上与分析家兼容,所以沿用其结构和名称/ L6 Q$ j9 B( l- p
//以下为飞狐交易师扩展(fortagSTKDATAEx)/ \1 u* \5 U. Q' K
constDWORD m_dwReserved; // 保留3 @# X( C4 P9 o- @/ M
constint m_nNumParam; // 调用参数数量; O% x1 q7 O  `% h3 E" h: A2 z4 N% F2 }
constCALCPARAM* m_pCalcParam; // 调用参数数组
  t4 G. q- b$ L  n$ g8 w; f  ZconstDWORD m_dwReservedEx[4]; // 保留2 y" U- K' b5 }: x! t* G3 S' ~
char*m_strStkName; //股票名称7 B8 b. E# u0 V/ v* A* i& k
SPLITDATA*m_pSplitData; //除权数据
) v1 H; O- [# t8 Y) a- B1 ?intm_nNumSplitData; //除权次数
% o: l4 @- v1 V; S. U7 ?}CALCINFO;' A* e& o  z2 v
/*
) C" A$ B8 A! p$ I4 P. z6 T. v5 {8 K1:(与分析家兼容)
" C$ o+ G4 x; W& j5 y1.函数调用参数由m_pfParam1--m_pfParam4带入,若为NULL则表示该参数无效.; o4 k, r- r6 B0 Q. U9 `! T
2.当一个参数无效时,则其后的所有参数均无效.
( w$ X  H7 V, }: a4 h:m_pfParam2NULL,m_pfParam3,m_pfParam4一定为NULL.
' T7 ~' A' h, _9 i2 m8 S: T3.参数1可以是常数参数或序列数参数,其馀参数只能为常数参数.) |1 n" [0 R% e' Q3 \) g9 y; m
4.m_nParam1Start<0,则参数1为常数参数,参数等于*m_pfParam1;6 Z! y( L! c4 }. L9 \
5.m_nParam1Start>=0,则参数1为序列数参数,m_pfParam1指向一个浮点型数组,& C) L# T* j  n. z2 B
数组大小为m_nNumData,数据有效范围为m_nParam1Startm_nNumData-1.
+ L' b& ]  Y5 ?; u4 T7 ~2 U在时间上m_pData[x]m_pfParam1[x]是一致的
- ~$ H$ Y9 e2 O0 K2:(飞狐交易师扩展), T1 h5 v5 @* b4 ?5 j  p8 A4 T  c& v
1.该扩展结构使调用参数在技术上可以是无限数目的,且每个参数都可为数值或序列,由公式中实际的调用参数决定。# `- }9 v+ t5 ?1 T/ k- o1 B( i
2.CALCPARAM结构用于带入参数信息和实际数据,m_pCalcParam数组大小为m_nNumParam,数据有效范围为0 m_nNumParam-1./ D9 F: |: _$ W. x, {- o1 E
3.按参数的顺序,m_pCalcParam[0]为第一个参数的数据,m_pCalcParam[1]为第二个参数的数据...,为了保持兼容,原m_nParam1Startm_pfParam15个属性依然有赋值。
2 M7 y4 o7 \1 s7 g8 U4 I/ S: X4.i位置的参数为数值,取用m_pCalcParam.m_fParam.
5 c- w4 J  e4 q: S- t% m) Y5.i位置的参数为序列,取用m_pCalcParam.m_pfParam,数组大小为m_nNumData,数据有效范围为m_pCalcParam.m_nParamStartm_nNumData-1.m_pCalcParam.m_nParamStart<0,则此数组中无有效数据。  D, {5 [: _7 Q7 Z3 N2 Q
6.由于可以调用多个序列,许多序列的计算可以先在公式中进行,然后作为调用的参数即可。' c  d: d+ U; I4 R+ N# C5 {$ e( U
7.经此扩展,对分析家的DLL依然可以调用、兼容。
0 U. V2 ^7 c; A: ?. G# A. I- h- J*/
7 j2 a( F# g5 {2 `% V///////////////////////////////////////////////////////////////////////////////////
. {0 C7 u9 w% ?: Z/*函数输出
  @/ ^; b) i9 c0 k__declspec(dllexport)int xxxxxxxx(CALCINFO* pData);
1 r: a1 D; d8 c+ @5 Z1.函数名称需全部大写.
4 H* N6 P4 Z: Z" Z) l! x0 {+ }: d2.函数必须以上述形式声明,请用实际函数名称替代xxxxxxxx;
! C, y: R1 D( k- L: _0 Y8 F# Y0 t对于C++程序还需包括在extern"C" { } 括号中.
& S0 e% o9 U2 e; ~3.函数计算结果用pData->m_pResultBuf带回.
- B, @+ C9 k+ e( P2 d/ D4.函数返回-1表示错误或全部数据无效,否则返回第一个有效值位置,:
2 T; k& W$ L; f) }. N1 ~# Km_pResultBuf[返回值]-- m_pResultBuf[m_nNumData-1]间为有效值.* }7 M( u$ h# P3 |2 X! o
5.函数名称长度不能超过15字节,动态连接库文件名不能超过9字节(不包括扩展名),动态库名称不能叫SYSTEM,EXPLORER
; b2 N- b: b) G9 l; Z% V*/
  _/ U1 ^. o# Y7 n8 z4 S//示例函数,使用时用实际名称替换8 B6 e7 {! x# G  @/ |
__declspec(dllexport)int WINAPI MYMACLOSE(CALCINFO* pData);/ B1 f9 F" q' ~- m* J
__declspec(dllexport)int WINAPI SMOOTH(CALCINFO* pData);
5 ]) `5 Y4 K) E) z( R//__declspec(dllexport) int WINAPI MYMAVAR(CALCINFO* pData);
; p" G3 g9 h- o/ T& I: ~6 w& F+ O9 d" e__declspec(dllexport)int WINAPI MYBBI(CALCINFO* pData);( Q5 N& z0 A- `* W& k2 t6 R0 \
//WINAPI = _stdcall
1 h2 h6 d4 ?2 O& R+ G#ifdef__cplusplus
9 _4 H5 ?8 e; F6 E% q) L' L}- }4 J7 N  t# u) ^" ~1 L
#endif//__cplusplus
7 L  e; R" g: o! {7 r7 n" |3 a# q#endif//__FOXFUNC_H_INCLUDE
$ k  C( U$ Y9 Q  |/ X; A& ~/ W7 g4 s4 j! t- n
//////////////////////////////////////////comment 注解
# P' H. z# d, |" t8 ]" E7 f- S" }: ]__declspec(dllexport)int WINAPI MYMAVAR(CALCINFO* pData)- N( b3 ]  R5 I
pData是指向 址标总结构 CALCINFO的 总址标
# D7 X( i3 O! A0 N, a" L8 N取用第二个参数数值floatfParam = *pData→m_pfParam2 3 r) N( E6 ~# f1 _# u* R
取用第一个序列参数的址标constfloat* pValue = pData->m_pfParam1;1 Y2 K& B8 Y8 g2 o* m, h. }+ ]
取用股票数据长度intndata = pData→m_nNumData;
; ]0 H1 v6 L! V; S) V第一个参数存在且为数值pData->m_pfParam1&& pData→m_nParam1Start<08 r5 e+ c& s' J( w2 @
第一个参数存在且为序列pData->m_pfParam1&& pData→m_nParam1Start>=05 F4 i* |& ~: T9 c# B/ i
第一个及第二个参数存在且为序列,第三个参数不存在pData->m_pfParam1&& pData->m_pfParam2 && pData->m_nParam1Start>=0&& pData->m_pfParam3==NULL
$ D' S) |! a, S' [4 p8 iconstfloat* cpParam = pData->m_pfParam1; 定义cpParam为第一个序列参数的址标% Z# f. L5 V6 a. |+ ?
取用股票数据结构! l6 W: q* R/ [6 w7 c  m
pData→m_nNumData= 变数数据长度
2 I# k$ v0 x# Q; X( ]) v4 l. ]pData→m_pData= pointer to struc STKDATA 的址标3 ?- x: K" R' b) T! p& [7 ]
pData→m_pData[x]数据结构的第x个数据
6 c$ {" @' f6 h5 s2 w% U9 ppData→m_pData[x].m_fHigh数据结构的第x个数据中的 High
: A4 A: p4 P7 s0 g/ E取用结果缓冲序列
0 `8 V4 S. H& e. ~/ dpData->m_pResultBuf
* G) ]8 C  {6 ?% j- Q取得第一个序列参数的起始序位,2,...5 , . 7...& T  y7 d4 ^) C) d7 }0 w- V
intnFirst = pData->m_nParam1Start; 8 A! j7 h: t* s6 k5 [
for( i = nFirst+nPeriod-1; i < pData->m_nNumData; i++ )! T! r+ v& d  o0 K0 T8 |5 T# w
取得第二个数值参数的数值) w( T3 r' X9 S
floatfParam = *pData->m_pfParam2; - Q6 B& x; z. U0 J+ D  I
intnPeriod = (int)fParam;
) Y9 @! F0 l9 S3 ?! q3 I) b2 N  g取用第一个序列参数的址标constfloat* pValue = pData→m_pfParam1;
# C( S# W9 L+ ~+ I2 M取用序列参数的单个直pValue  j6 n" Q+ S* p* j
取用缓冲序列的单个值pData->m_pResultBuf. t. I; O- ?8 K8 v, J
constCALCPARAM* m_pCalcParam; // 调用参数数组( M4 y4 W/ x. s& C
m_pCalcParam为序列址标,指向各序列参数的指标
# Z  ~" o8 ?# [# G/ F第一个序列参数pData→m_pCalcParam[0]. X. O, i/ _- b8 {
constfloat* m_pfParam; //指向序列参数的址标7 D6 |& E5 A% h1 I3 k0 N  e* @
第一个序列参数的起始序位pData->m_pCalcParam[0].m_nParamStart0 _+ o/ A: _' a2 d' s# D" u
第一个序列参数的址标constfloat* pValue1 = pData→m_pCalcParam[0].m_pfParam;
' M7 F, m( z' k/ M! Q, G% S0 c. y取用第一个序列参数的单个直pValue1
0 f; V" N0 n% `, n) j# O第二个序列参数pData→m_pCalcParam[1]
8 F2 a' u: o% s5 e* e! L/ Q第二个序列参数的起始序位pData->m_pCalcParam[1].m_nParamStart/ z  f1 ?& y6 K5 Y3 G" {$ l
第二个序列参数的址标constfloat* pValue1 = pData→m_pCalcParam[1].m_pfParam;3 k  N3 ?, ^, ?- M, A5 J
取用第二个序列参数的单个直pValue2" ]" j) Q( \) n2 b/ ]0 P% D' ?
第三个序列参数pData→m_pCalcParam[2]
- ^# C+ a! y& c' m9 Q" M5 o3 ?第三个序列参数的起始序位pData->m_pCalcParam[2].m_nParamStart
( G( y* w5 r- b  A( `& Y第三个序列参数的址标constfloat* pValue1 = pData→m_pCalcParam[2].m_pfParam;
# a' r! a) x! B2 o8 Q/ M2 z取用第三个序列参数的单个直pValue39 U7 P2 W% p/ a# ^9 Q
第四个序列参数pData→m_pCalcParam[3]
3 ~" t- y4 l6 r# ^2 X- X5 n" U$ J) _第四个序列参数的起始序位pData->m_pCalcParam[3].m_nParamStart
6 r- o7 f* L' |4 q- R第四个序列参数的址标constfloat* pValue1 = pData→m_pCalcParam[3].m_pfParam;, P; e( a  D5 \7 q8 _+ S& d
取用第四个序列参数的单个直pValue4
1 e% ]2 ~% u" g- G% c# R2 e如果有四个序列参数,则取用序位最高的那一个序位
1 w$ K2 ?/ v& a/ Uif( pData->m_pCalcParam[0].m_nParamStart >= 0 &&
" f2 P" o5 s; E& k  _, A1 K2 ~pData->m_pCalcParam[1].m_nParamStart>= 0 &&* A5 F* p: {8 h4 A$ f, B
pData->m_pCalcParam[2].m_nParamStart>= 0 &&. u, w) E5 z: p, ?) h- H5 f
pData->m_pCalcParam[3].m_nParamStart>= 0 ) //4个序列都含有效数值5 c( ?& T% [8 O7 }% i; h+ r5 P/ f
{+ g; N# O4 _3 i
//计算返回的序列的第一个有效值位置
. E4 |/ p7 _, T; A4 eintnFirst = pData->m_pCalcParam[3].m_nParamStart;//已知返回的序列的第一个有效值位置与第4个序列一致1 ?: B3 y8 V: M! Y& b' i4 J1 p+ D
//若不知,则  Y4 p7 H7 S' M( l$ H
/*, K" N0 z# y+ Y+ z
intnFirst = pData->m_pCalcParam[0].m_nParamStart;
% m! T9 ]. y  X' l/ f& Pif( nFirst < pData->m_pCalcParam[1].m_nParamStart )
1 [3 ?5 d* ]/ LnFirst= pData->m_pCalcParam[1].m_nParamStart;
8 v8 m/ b* b7 `4 c3 w* @! c1 T; E. Wif( nFirst < pData->m_pCalcParam[2].m_nParamStart ) ) t, q9 [. C- b5 k, Y; w* a! m, [7 R, J
nFirst= pData->m_pCalcParam[2].m_nParamStart;0 G+ P1 o$ W9 p
if( nFirst < pData->m_pCalcParam[3].m_nParamStart )
- S) V9 C8 Q$ c/ L3 MnFirst= pData→m_pCalcParam[3].m_nParamStart;5 F/ G" E, e8 f9 E6 J* C
constfloat* pValue1 = pData->m_pCalcParam[0].m_pfParam;
+ j% o9 }2 \% G9 e4 vconstfloat* pValue2 = pData->m_pCalcParam[1].m_pfParam;$ R: i# C% a" C
constfloat* pValue3 = pData->m_pCalcParam[2].m_pfParam;) \% n2 A: l6 g5 n
constfloat* pValue4 = pData->m_pCalcParam[3].m_pfParam;
8 z' h0 G# g4 o# _+ Y5 d: V//-------------------
  A2 Q6 l/ x5 L; B5 B! X  M/ Afloatm_fOpen; //开盘 open6 h$ A' N( x# H( K) J
floatm_fHigh; //最高 high
4 b5 G, j8 s3 [. O+ X- [floatm_fLow; //最低 low
+ f& z7 g% Y6 n; S! Z) Rfloatm_fClose; //收盘 close2 T" U7 n1 t1 H
floatm_fVolume; //成交量 Volume
$ V! A4 E/ [( `( O  ?floatm_fAmount; //成交额 amount$ V' C. @  O. U! u( |; I
调用收盘据" D+ x' w$ g  B2 D6 j! `3 N7 D
pData→m_nNumData= 变数数据长度
1 k4 x+ b& A5 V. S+ \2 vpData→m_pData= pointer to struc STKDATA
6 y' L# M$ n/ [$ s. gpData→m_pData[x]x个数据0 q4 ?" Q& ~3 O  |/ a
pData→m_pData[x].m_fHighx个数据中的 High$ s/ y  r) [6 d( m- y) H
@@@@@@@@@@@important !!!!!!!
8 r0 e1 a- V# m9 F7 MsinceVC++ 2008, cl.exe will make ‘pData→m_pData[i-j].m_fClose’ anerror
3 t+ C% I; U" X0 D8 Tso,pass the high,low,open and close just from the function parameter ,that is use ‘ CALCPARAM’ struct, \) a3 m8 S2 D
pData->m_pData[i-j].m_fOpen// to use open , there is no way in using a varable for calculationoutside foxtrader
6 Q4 O0 ]/ v* ~8 E  g5 a+ Z$ `pData→m_pData[i-j].m_fHighto use high! }9 ]9 ?5 ]* l# r
pData->m_pData[i-j].m_fLow
* }' m  Z$ M5 l/ l  apData->m_pData[i-j].m_fClose( Q4 K$ R: h7 a3 n1 n
m_pData= pointer to struc STKDATA
  F( E5 i, W) W6 w. B/ Uincalling C++ dll function5 @6 h) P; w( l" C; Q4 o
m_pDatais passed to pData (CALCINFO* pData . A CALCINFO* type pointer)
; D0 N1 l" x) G# i0 L+ f# o! Rtouse a single value in variable ‘High’$ q& ]9 i" k6 E3 w/ u$ T6 c1 N; k
pData→m_pData[i-j].m_fHighto use high0 d: G, D) D  K1 p5 R. d
constfloat* m_pfParam1; //调用参数1/pointer to variable parameter 1 / M2 _/ `2 _9 z- c% w6 n1 j
constfloat* m_pfParam2; //调用参数2/pointer to variable parameter 21 P$ i2 Y5 V6 s
constfloat* m_pfParam3; //调用参数3/pointer to variable parameter 3) c6 K7 v6 h! @9 I. ?5 W! y
constfloat* m_pfParam4; 7 }$ Z% D# X7 @6 \  E' g
m_pfParam1,m_pfParam2, m_pfParam3, m_pfParam4 = pointer to caller function 的参数
2 a1 u, g, a% T$ o) U( UpData→m_pfParam1= pointer to 第一个(序列)参数
3 J2 ~& c2 E7 ZpData→m_pfParam1[x]= 取用第一个(序列)参数的第x 个值
- \/ x! z7 W3 q+ u. ?. O2 o& {constfloat* cpParam = pData→m_pfParam1; =定义 cpParampointerto 第一个(序列)参数% h: A/ Z* r4 k- B& w" `; D. t+ {
cpParam[x] = 取用第一个(序列)参数的第x 个值
3 F5 x, M; E! q6 b8 rm_pResultBuf= 结果缓冲列  D" ?6 }# G- V( j
pData→m_pResultBuf= pointer to 结果缓冲列" x' s( i8 e/ E, [+ q) i4 G( ~
pData→m_pResultBuf[x] = 取用结果缓冲列的第 x个值
" }% }# c/ t' F* k& _//////////////////////////////////////////comment: Z( ~0 H# {3 g6 _0 @0 J( V
//////////////////////////////////////////comment 注解! u/ u. V: \- s) y% P
constint m_nParam1Start; //统杅1衄虴宎弇离
4 Y3 M: z. R) Q; M$ nconstfloat* m_pfParam1; //覃蚚统杅1& [. K4 |$ L+ f) t, G2 T9 {
constfloat* m_pfParam2; //覃蚚统杅20 p4 y- L  X$ V% v. O( Q+ U" P
constfloat* m_pfParam3; //覃蚚统杅3+ ?+ a4 ]' @4 V- F0 ]" n; H
constfloat* m_pfParam4; //覃蚚统杅4,parameters must be <= 4, h5 w, ?- P$ v0 D7 h
//const float* m_pfParam5; // parameters must be <= 4
, g4 ~3 g: [- N/ {  l+ h  c; q//const float* m_pfParam6; - y2 q- D/ l6 v! I, I& v
//const float* m_pfParam7;
$ E  E( E: F$ [3 y" s. T//const float* m_pfParam8;( H# L8 P9 R- K
//pData->m_pfParam1 && pData->m_pfParam2 &&pData->m_pfParam3 && pData->m_nParam1Start>=0 &&
6 |0 B2 _- [: o9 A' epData->m_pCalcParam[0].m_nParamStart>=0&& pData->m_pCalcParam[1].m_nParamStart>=0
6 {. i% P+ w+ A) l( H&&pData->m_pCalcParam[2].m_nParamStart>=0)
/ c% T3 w+ }6 I; e{
; w5 y2 B; C" \' `" r7 [$ _floatfParam = *pData->m_pfParam4; //pointer ,pData->m_pCalcParam[3].m_nParamStart >= 02 ~/ Z6 a# q- k- L; y; I
intnPeriod = (int)fParam; //统杅1
7 c2 y8 J, W! H7 [* d//const float* cpParam = pData->m_pfParam2; // cpParam = pointer to第一个序列参数,cpParam = 取用第一个序列参数的第i 个值. p$ d* `* R1 _
constfloat* cpParam1 =pData->m_pCalcParam[0].m_pfParam; // cpParam =pointer to 第一个序列参数,cpParam = 取用第一个序列参数的第i 个值9 J3 g% N( [- Y% C
constfloat* cpParam2 =pData->m_pCalcParam[1].m_pfParam; // cpParam =pointer to 第一个序列参数,cpParam = 取用第一个序列参数的第i 个值
1 s4 C! [/ \8 d: k  i3 n$ |constfloat* cpParam3 =pData->m_pCalcParam[2].m_pfParam; // cpParam =pointer to 第一个序列参数,cpParam = 取用第一个序列参数的第i 个值//parameters must be <= 4+ `& E4 W, x' Y1 H2 E( J2 T
//const float* cpParam4 =pData->m_pCalcParam[3].m_pfParam; //cpParam = pointer to 第一个序列参数,cpParam = 取用第一个序列参数的第i 个值) X" q& T. b4 [" l& n
//const float* cpParam5 =pData->m_pCalcParam[4].m_pfParam; //cpParam = pointer to 第一个序列参数,cpParam = 取用第一个序列参数的第i 个值
% F! y* ]- a. r/ q//m_pData = const struct pointer to struct STKDATA , pointer to structSTKDATA ,
( n5 m+ u0 I7 m, Ytouse pData→m_pData[x].m_fClose
5 e* x/ ^' n# S/ b8 B1 @4 vpData→m_pData[x]= | 1,2,3 , … , m_nNumParam | time_t m_time;
& |) D% M% J! R$ @+ B|1,2,3 , … , m_nNumParam | float m_fOime_t
9 J- v# L! B4 O3 Q|1,2,3 , … , m_nNumParam | float m_fHigh;* q: r3 s7 D6 R5 h! p0 m6 y
.. .
, D: N9 b3 u0 L|1,2,3 , … , m_nNumParam | WORD m_wDecline;) O2 Q9 i) d0 z: B% S7 O! u* L
m_nNumParam= 数据high,close,open,low的长度* n, B" }* w' r9 a" V8 [4 Z
touse high:
& Q" \1 x; J' ?1 k& l7 a; g. J: D6 cpData→m_pData[x].m_fHigh$ }% B6 m9 I2 A. p: r% S2 _% l
contentof struct STKDATA
0 l+ J  H; B1 g! ]( A: X" C4 \) t& gtime_tm_time; //时间,UCT6 ^6 h0 A, I1 Y0 e6 S6 {' u
floatm_fOpen; //开盘 open
. W! @' [) }% x" G! o$ R9 G  Pfloatm_fHigh; //最高 high
0 n( J3 o, ~# l: w, j2 rfloatm_fLow; //最低 low
; d$ M; [# A' J5 R4 _9 Jfloatm_fClose; //收盘 close
; s' w! U: @- \5 Jfloatm_fVolume; //成交量 Volume  o: a4 j$ F" f! Z: \( P4 m
floatm_fAmount; //成交额 amount
% n$ b* }6 ^. B% G) }WORDm_wAdvance; //上涨家数 仅大盘有效
! Y, ?1 R) j- I/ p# Y  H& y9 bWORDm_wDecline; //下跌家数 仅大盘有效
  X) R# C+ H- e调用传递参数及传回结果
; c* h  E: r6 J( b/ q调用传递参数! s/ A& L6 F; e2 C- G
(pData->m_pfParam1 && //参数1有效Param1exists
  ]: ?  O9 k2 Y. e8 ypData->m_nParam1Start<0&& //参数1为常数
% y+ s/ L3 x6 o* m) e4 q$ \% x+ OpData->m_pfParam2==NULL) /// z. C0 W, D. g9 j; L  d+ R: I
localprocedure 定义使用变数& Z! d; N+ j( I# H% L+ d+ e
onstfloat* pValue = pData→m_pfParam1; //use constant参数1' f% x8 Y& a' \. f/ `+ H
intnFirst = pData->m_nParam1Start; //use 参数1效值起始位3 o7 _$ F8 A8 \! x+ [! U
floatfParam = *pData->m_pfParam2; //use 参数2! g. {& w/ B$ ^4 O) U) e' j
intnPeriod = (int)fParam;
7 b0 o3 f& t3 s/ [传回结果2 O% M. t# O5 w% d
fTotal+= pValue[i-j];
$ C& i3 O+ W8 o3 {$ @, f7 ipData->m_pResultBuf
# C. t5 v1 Y" b. v! v  r//////////////////////////////////////////comment

评分

1

查看全部评分

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

本版积分规则

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

GMT+8, 2026-6-3 01:58 , Processed in 0.165145 second(s), 20 queries .

Powered by Discuz! X3.2 Licensed

© 2001-2013 Comsenz Inc.

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