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

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

作者: ycng    时间: 2019-8-11 16:09
标题: 飞狐交易师 (foxtrader) 连结 DLL 的方法
许多年以前,我曾经在+ x# u9 L2 o, x( i' N- O
理想公式区发布了
/ y* [6 g7 c+ ~5 X' D8 Z"
% H  C( `$ R' Z9 \3 i- Y如何用 Foxtrader(飞狐)连结 C++动态程式库 DLL及 80x86Macro Assembly (组合语言): H3 F7 n- B+ E$ q3 ~
"
0 S2 e9 E0 ~% F" W  {5 x6 [
$ v8 X! H/ w2 L# f1 h4 }2 O) L4 ]现在更新foxtrader(飞狐交易师)   f' g+ B( V2 T; C( g1 A! m  W; G
连结 DLL的方法
+ o: \6 z+ Y- n- C$ H8 T) O3 ^# x  T2 Z
4 ], P. u0 c' y, F& L( Wfoxtrader- - > DLL (C++ and assembly) = ( foxfunc.h + foxfunc.cpp +pow10.asm )% f5 Z5 ?" ~  k: A
gauss- - > DLL (C++ and assembly) = ( foxfunc.cpp + meigj.asm )
- P& z/ d5 d6 R" wgauss只用到函数参数传递,所以使用新的 c++compiler, 不受影响
9 c( e0 t; G8 i4 {2 {8 zfoxtrader的 foxfunc.h宣告的结构型态 (struct)在 2004vc++ 6.0 全部有效! E& T/ N) @  z$ \  }3 e0 F

8 F2 n& P7 o4 c" W也就是这五个结构都能用/ f( M- H4 n+ a$ M/ e
typedefstruct tagSTKDATA 3 V2 V$ o% z5 E5 z; _: p5 {- d! \
typedefunion tagSTKDATAEx
, ?; ], T* L" L8 I; ]' Dtypedefstruct tagSPLITDATA : W3 `$ e$ i. l0 y
typedefstruct tagCALCPARAM; n' {( N8 y& w" g
typedefstruct tagCALCINFO% }) Q* E  U' ?, ?

# [* r% H& l0 @" {自2008年起,vc++ 2008, vc++ 2010, vc++2017 对struct的编译,已经完全 c++化,不再相容于 C
. `( {) f+ |; F2 x2 |  |- H也就是这五个结构中/ _- E- g5 H9 }8 ^# G
typedefstruct tagSTKDATA 1 Q3 @! I" U' r0 Z; y6 A/ q
typedefunion tagSTKDATAEx. S, V: f2 w% d0 K
typedefstruct tagSPLITDATA
3 d4 c# q  J. t4 mtypedefstruct tagCALCPARAM$ ], _$ r8 a+ z( [) b
typedefstruct tagCALCINFO
8 H' g: p6 `2 `% ]只有这两个可以用
% g' v" A% Z, y& \$ stypedefstruct tagCALCPARAM- T* p, I; H% ^4 b7 s
typedefstruct tagCALCINFO) H' w. F: R  s1 |+ Z/ A8 {
值得庆幸的是,下面这个结构的函数参数传递个数可以有无数个" }1 Y( z7 H7 Y. r3 |" e
typedefstruct tagCALCPARAM
+ _* E, n1 G" C7 C例如:在 foxtrader中
7 m3 x" Q5 i' Z( D5 Y' XMA1:=MA(CLOSE,3);5 K- f8 [4 \2 H4 t% t& n0 U
MA2:=MA(CLOSE,6);- ]" ?& S& X3 T% i7 _* ]; i, u
MA3:=MA(CLOSE,12);
" d1 b# @; Z7 G  s8 Y& GMA4:=MA(CLOSE,24);9 |. Z0 P  c9 I& V/ |. D1 l
MYBBI1:"MYFUNC2017@MYBBI"(MA1, MA2,MA3,MA4,MA3,MA4,5)*0.95,colorff00ff,linethick3; {2017 vc++ 15.0}
8 m7 n" V7 R: v. _/ _其中MYFUNC2017=MYFUNC2017.dll, MYBBI = MYFUNC2017.dll 中的MYBBI函数,这里 MYBBI函数传递的参数共有 7个
( l, X/ x' v7 L3 {& `下面这两式计算结果相同
- S$ F5 z: e+ Nxx:(MA(CLOSE,3)+MA(CLOSE,6)+MA(CLOSE,12),MA(CLOSE,24),MA(CLOSE,12),),MA(CLOSE,24)/6*0.95,color0000ff,linethick2;{foxtrader 自行计算}3 I  r* w3 r( F! `, I, N( r( t
MYBBI1:"MYFUNC2017@MYBBI"(MA1, MA2,MA3,MA4,MA3,MA4,6)*0.95,colorff00ff,linethick3; {2017 vc++ 15.0 , dll计算}
8 _7 L7 O; U: p" f9 x) f其他例子
3 X$ N4 v/ d2 z5 k! c) Koooq:="MYFUNC2008good@MYMACLOSE"(c,,c,c,6),colorffffff,linethick5;(---> pow10.asm): M7 O" I3 Q5 v
oooq1:"MYFUNC2010@MYMAVAR"(ma(c,5),5),colorgreen,linethick5;; R# J8 V: m; \& n" i$ ^
其中pow10.asm里面有很多不同定义或宣告被注解不用,那是因为后来在逐步侦测法修改语码中才发现在foxfunc.cpp主程式中,下面这行错误,也就是新的 compiler不再相容于 C,因此在pow10.asm里面被注解不用的定义或宣告中,有些应该是可以用的
# e3 b' A- W, mfTotal= pData->m_pData.m_fClose; // @@@@@@@ vc++ 2010 cl.exe 使pData->m_pData[i-j].m_fClose错误. f3 ^$ u# ~7 u
. o9 ~1 z9 F7 @; _8 F
' z* S8 y3 X1 {' {4 @3 M- N- T
////////////////////////////////////////////////////////foxfunc.h
! O7 S% z. [+ \- V& x! ]#ifndef__FOXFUNC_H_INCLUDE
: p2 N! v1 O3 W* @#define__FOXFUNC_H_INCLUDE8 L5 `  N) R: p, {  v
/*
: p, Y' x9 A7 E1 X& @飞狐交易师“C语言接口”扩展程序调用接口规范V3.0
- F; v* H8 f* Q6 j1.本规范适用于飞狐交易师V3.x公式系统.
/ U! v' @3 P6 l2.扩展函数用于实现系统函数不能实现的特殊算法.) a$ _! U( G/ j6 n* o( a
3.扩展函数用windows32位动态连接库实现,建议使用MicrosoftVisual C++编程.
9 A. c( `1 z2 c* Y  F! B4.调用时在公式编辑器中写"动态库名称@函数名称"(参数表)即可,例如下面函数可以写为"FOXFUNC@MYMACLOSE"(5)
1 H, s" h& L4 I. |& {# _1 Q/ S, F+ W5.动态连接库名称和函数名称可以自己定义.: G- B3 @8 o& Z
6.使用时必须将动态库拷贝到飞狐交易师安装目录下的FmlDLL子目录下使用.# C2 L. ]) a: J: S1 u" c
*/" A7 i$ j) |/ Z3 C3 y
#ifdef__cplusplus& c9 m. F" T" ]5 L9 d
extern"C"
. |, n1 y# A" U& Y- D! b/ b  Y{( F2 z0 s" q9 _& F
#endif//__cplusplus+ n# w$ Z+ `$ Y3 _7 h# K
///////////////////////////////////////////////////////////////////////////
9 e4 k6 f7 E- \! s9 N& i//分析周期4 }! M; q8 d2 I- I
enumDATA_TYPE) V: N6 `0 @2 F  ?$ F* o1 K/ r
{
/ W# w* ^8 m7 S) [, b; y+ C) xTICK_DATA=2,//分笔成交0 z( H9 `* F1 r, p; S: B0 u
MIN1_DATA,//1分钟线: @' v. j+ i1 i
MIN5_DATA,//5分钟线 3 o$ W8 e8 H5 Q$ V
MIN15_DATA,//15分钟线
. F* t/ o0 S6 d' QMIN30_DATA,//30分钟线0 {& ]: \' E& |/ H& p% H
MIN60_DATA,//60分钟线, L* p4 l  k# ^, \
DAY_DATA,//日线
2 w' v- B7 M: \) d. eWEEK_DATA,//周线+ y: |$ j' U3 R) _
MONTH_DATA,//月线
3 P: o" \: y: M* l) B( BYEAR_DATA,//年线* [( @3 ~! |0 U& L* ]/ U
MULTIDAY_DATA,//多日线/ @: a* R# V# s% ~8 U: m' d/ n* E
MULTIMIN_DATA//多分钟线
7 \* z0 p; u3 P% B0 d6 k4 F};
) x3 ^1 P8 o& I, n4 I///////////////////////////////////////////////////////////////////////////
3 P0 {2 ~. K7 x* t//定义取用股票基本数据的结构 只有 VC++ 6.0 能compile成功使用
% l" e# w7 w* h+ N7 utypedefstruct tagSTKDATA ) y8 k# v6 {( z# P9 h7 D3 X; X
{
4 ~# P) \0 D2 J' {3 T_tm_; //时间,UCT4 o. z4 y, O" R( k2 ]3 D0 [+ v
floatm_fOpen; //开盘 open9 ~; l+ L: }. d; l1 U0 T
floatm_fHigh; //最高 high
3 U& o2 Z# s) ^floatm_fLow; //最低 low
* r8 h0 f5 v  [/ M0 q5 C* X4 m2 {floatm_fClose; //收盘 close; @- V5 J1 k& S" l! z" t" Q) A
floatm_fVolume; //成交量 Volume( J& s# z, I0 ^) G" R# c
floatm_fAmount; //成交额 amount; [( |5 L; n( Y3 B3 C
WORDm_wAdvance; //上涨家数 仅大盘有效5 E' t! |% h, ?' l
WORDm_wDecline; //下跌家数 仅大盘有效) e* L+ |0 T( `& P
}STKDATA;
* y9 h6 ~/ S; x) k6 z, S; o! N定义STKDATA为 tagSTKDATA的简单别名,STKDATA ) O9 C; z4 i9 I) C: M8 ^5 F8 S
为真正方便使用名称,tagSTKDATA 为定目的的过水名称
' Y: D5 |( ~3 J4 X5 O////////////////////////////////////////////////////////////////////////////) \3 b" v6 ^+ n6 I! J
//扩展数据,用于定义取用分笔成交数据的买卖盘 的结构, |3 T% v1 U& `1 \' d. p
typedefunion tagSTKDATAEx
1 w. d% r5 N- ~9 B{0 e9 j  x- N& Q7 y( i. b
struct
, H% {& s, F; C4 H{/ j2 X6 S$ v. {  v6 V
floatm_fBuyPrice[3]; //买1--买3价floatm_fOpen; //开盘 open1 r7 [% p. W3 W. n) ?+ d
floatm_fHigh; //最高 high
2 @7 u2 K4 b7 R8 w9 x: Ufloatm_fLow; //最低 low
; R. x  ?+ v, g. |( dfloatm_fClose; //收盘 close
! z# F( I. y1 qfloatm_fVolume; //成交量 Volume
: N2 ]# R8 ^$ u( R+ Jfloatm_fAmount; //成交额 amount
0 W0 s  }  q$ m8 @floatm_fBuyVol[3]; //买1--买3量
% `' P+ `, V! i, L1 ?floatm_fSellPrice[3]; //卖1--卖3价
6 l2 M6 `3 X) z5 Yfloatm_fSellVol[3]; //卖1--卖3量
5 p* G4 x9 [, J8 V};
- Y; G. |/ P$ @% z  Q3 ^floatm_fDataEx[12];1 J+ e. B  ]5 L
}STKDATAEx;
& W* I. D) `8 u! z6 i; _; {////////////////////////////////////////////////////////////////////////////
2 g$ r: \( a3 G; }& Z; Q/ m//定义取用除权数据的结构0 G5 q9 x6 k- S& k
typedefstruct tagSPLITDATA
8 r1 e9 u4 Z* {% R( r; Q6 x% z{
+ z5 P# Q3 P; V4 q7 c/ K9 M* Y5 I* ntime_tm_time; //时间,UCT
" G3 |# P( U% ?- a6 s4 Ofloatm_fHg; //红股
3 e, O# e( E9 P! G* ~  i) pfloatm_fPg; //配股  q- U$ v' s  |; U& m8 t
floatm_fPgj; //配股价' t6 I( M! [7 O
floatm_fHl; //红利. }" o7 p' ]5 t7 T7 f4 M
}SPLITDATA;
# \5 ~! L9 m$ B/////////////////////////////////////////////////////////////////////////////
- \9 D# j6 d4 K4 }, C2 a/*财务数据顺序(m_pfFinData内容), A8 M2 y6 p% h( \; i' h: q
序号内容9 _1 j; {1 w$ f8 [% X$ r6 y! R
0总股本(万股),
5 v$ Q) L4 [0 B' j% u. ?9 X1国家股,3 H9 V: P' `) q( L9 w* T% y
2发起人法人股,
1 V' r  l/ L+ P& Q9 f( w3法人股,) ~4 @3 g" ~  E. y' E6 n
4B股,) z6 [( ^) _  M4 b9 A
5H股,1 o/ T7 Q' i2 J; b" f
6流通A股,' t2 F/ m3 [' \: q
7职工股,
7 S3 k) _" j0 l- C; Q$ V9 R8A2转配股,
7 |: L0 p$ b( [3 i2 Y9总资产(千元),2 t  |8 @; L" f3 `: N1 F* n0 ^
10流动资产,
2 @) Q" B" d3 n  ]. \& X7 G11固定资产,7 F8 p0 a5 {' S5 j
12无形资产,  b9 Y: J/ G' S+ W
13长期投资,
" k5 R/ N! q* o5 p; d2 N$ C14流动负债,
2 u7 y8 G8 g8 u. K% d15长期负债,; c3 Q- B+ E9 b' l6 K" F: _
16资本公积金,& z& m+ y5 D: o5 Y5 Y: C
17每股公积金,
4 b2 K# {- w2 \  q18股东权益,
! ]* ?4 Y+ e  n( I% D/ X6 y19主营收入,
/ n3 F6 k+ H  S6 R* M" L% h20主营利润,
* c+ C# X  p5 y21其他利润,
3 C3 g6 d) a1 p- L+ h22营业利润,
; T2 W  J: h' O* D  y23投资收益,
  _8 m  J7 Q  h) A: n6 d$ T2 M24补贴收入,- o) V. B. {" ~8 w; b. ]
25营业外收支,
, y" h5 M( b) W, g3 v26上年损益调整,4 A; _6 |+ P" Z6 Y, M5 H
27利润总额,+ h. J; R4 Q2 p2 }- u1 d+ C+ R
28税后利润,2 a4 X9 D, i( Y5 L- `, `6 `% r4 z
29净利润,
) l- ]+ t$ M' \" E9 ^30未分配利润,3 P9 I( ?3 x0 X; p" o9 O! |
31每股未分配,- k( [8 s- [; R# Y% x
32每股收益,
( w7 M7 u/ [% d- @33每股净资产,
+ m! C, p0 [; K34调整每股净资,5 z" n3 j( ~9 V. ]
35股东权益比,3 Z, R. C0 y( W+ ^& c
36净资收益率" B7 `2 E1 {, K# F( E8 y2 @
*/+ A) B0 A0 h) X
/////////////////////////////////////////////////////////////( o( [. S9 `( e" O2 J2 U# D
//定义取用caller函数传递参数项 的结构
2 L/ V; S) S6 \/ z' _  qtypedefstruct tagCALCPARAM
& H" |% h+ ^# t5 C% O+ d4 ?8 F& Q& P{
" v+ ]6 r; b  e0 [) ~union0 Z' ]% Z4 k/ Z; T9 D
{  M! u& b9 p& K4 g4 B9 i
constfloat* m_pfParam; //指向序列参数的址标,指向一个浮点型数组pointertofloat variable parameter / ex. c,h,l,o, co2...co2=(c+o)/2' E' G: k  @$ o
constfloat m_fParam; //数值参数 valueof parameter
4 I' T/ _. P( V8 n) ?) ]4 g};
! h4 K2 {, C2 U  Aconstint m_nParamStart; //序列参数有效起始位置thestart address of variable parameter / ex. c,h,l,o,co2...... B* v$ @4 r# ~( @
}CALCPARAM;' V  b, Y7 N6 D4 \, P8 @. M
/////////////////////////////////////////////////////////////////////////////4 a& G/ o# H, u) X
//定义全部取用址标 的总结构 (各指标指向前述各结构以便取的各结构的数据,接口信息数据的结构 ); J/ Q" T. W: U% w) r5 b9 U: n
typedefstruct tagCALCINFO9 P8 G$ ?+ U0 x
{
# V8 k( e( ^5 ?8 f/ m5 PconstDWORD m_dwSize; //结构大小- {& ^; g- G9 p( F" H3 q
constDWORD m_dwVersion; //调用软件版本(V2.10: 0x210): ~) J# x4 J+ C* Q8 g4 [
constDWORD m_dwSerial; //调用软件序列号7 L+ o( \  z; j2 b
constchar* m_strStkLabel; //股票代码
# ~0 C  z8 q4 t: W7 a2 w8 _+ zconstBOOL m_bIndex; //大盘
* s4 t9 i+ `/ U$ \6 P1 Y% Tconstint m_nNumData; //数据数量(pData,pDataEx,pResultBuf数据数量)数据长度5 B0 i0 ?) j$ ?" q8 M
constSTKDATA* m_pData; //常规数据,注意:当m_nNumData==0时可能为NULL! B" J1 R: J6 L1 {( R+ b
constSTKDATAEx* m_pDataEx; //扩展数据,分笔成交买卖盘,注意:可能为NULL
7 y1 m- }8 q" _* D$ {constint m_nParam1Start; //参数1有效起始位置<0/ constant parameter >0 /variable parameter
) ?2 m6 T+ Q0 U8 sconstfloat* m_pfParam1; //调用参数1/pointer to variable parameter 1 & q# G0 b  T  }! @5 w, }
constfloat* m_pfParam2; //调用参数2/pointer to variable parameter 2
5 s; L1 o$ D5 p# C) ~9 f; A/ ~4 Lconstfloat* m_pfParam3; //调用参数3/pointer to variable parameter 3
) Z9 X6 B; g7 gconstfloat* m_pfParam4; //调用参数4/pointer to variable parameter 4' p' B0 X) X3 ^, `/ ]
float*m_pResultBuf; //结果缓冲区
# M4 d8 b2 n$ r- sconstDWORD m_dataType; //数据类型6 ~0 I$ s+ A7 K, \4 X( u4 @* F7 y/ A
constfloat* m_pfFinData; //财务数据0 [5 p1 q& h8 b: B" z
//以上与分析家兼容,所以沿用其结构和名称
0 j& S" Q1 D' |7 V; n- \//以下为飞狐交易师扩展(fortagSTKDATAEx). [+ E5 r5 f+ r5 k9 F
constDWORD m_dwReserved; // 保留( I: H- [6 m  ^& b' O
constint m_nNumParam; // 调用参数数量$ Y7 B. \& l; `" M( A8 `* `
constCALCPARAM* m_pCalcParam; // 调用参数数组( I% t5 C) F% d
constDWORD m_dwReservedEx[4]; // 保留
: r" v  g& }, Jchar*m_strStkName; //股票名称
5 A: x8 p& r! V. G7 z& zSPLITDATA*m_pSplitData; //除权数据
* l# |$ N, @0 r' s( }3 ?3 B4 z' ^* Pintm_nNumSplitData; //除权次数4 X0 [! t( D6 R: J$ \8 T7 U$ s
}CALCINFO;
5 G$ \2 R8 H5 d* w# Z$ ]/*& e: s6 l6 `6 z( o
注1:(与分析家兼容)* _2 E: C( b1 h$ f" @& N
1.函数调用参数由m_pfParam1--m_pfParam4带入,若为NULL则表示该参数无效.
$ S$ J( ]! S, O3 ?' t+ ?2.当一个参数无效时,则其后的所有参数均无效.
* o  G7 Z+ l, _) n% J  @' G如:m_pfParam2为NULL,则m_pfParam3,m_pfParam4一定为NULL.; I3 j7 \2 o, A
3.参数1可以是常数参数或序列数参数,其馀参数只能为常数参数.
/ _' I! z( `4 Z. t3 k7 N1 [2 ]4.若m_nParam1Start<0,则参数1为常数参数,参数等于*m_pfParam1;
" ?6 h/ G- p$ E- B2 I/ C& s5.若m_nParam1Start>=0,则参数1为序列数参数,m_pfParam1指向一个浮点型数组,
! o8 b9 N# x* D. @* P  d4 l4 _数组大小为m_nNumData,数据有效范围为m_nParam1Start至 m_nNumData-1.
8 \4 u4 P5 l/ Z9 F在时间上m_pData[x]与 m_pfParam1[x]是一致的* g( ?) l( W# U9 C9 J& F
注2:(飞狐交易师扩展)
" b7 \& O4 s6 ~/ R+ N- i& g1.该扩展结构使调用参数在技术上可以是无限数目的,且每个参数都可为数值或序列,由公式中实际的调用参数决定。
- V7 Y) x1 T0 X9 H! n; D2.CALCPARAM结构用于带入参数信息和实际数据,m_pCalcParam数组大小为m_nNumParam,数据有效范围为0 至m_nNumParam-1." N5 H) @2 Q( M9 s7 e% y3 z
3.按参数的顺序,m_pCalcParam[0]为第一个参数的数据,m_pCalcParam[1]为第二个参数的数据...,为了保持兼容,原m_nParam1Start、m_pfParam1等5个属性依然有赋值。! M: A$ L  p8 k3 r8 D. e2 Q
4.若i位置的参数为数值,取用m_pCalcParam.m_fParam.1 M5 B& S  @" ]6 k* V
5.若i位置的参数为序列,取用m_pCalcParam.m_pfParam,数组大小为m_nNumData,数据有效范围为m_pCalcParam.m_nParamStart至 m_nNumData-1.若m_pCalcParam.m_nParamStart<0,则此数组中无有效数据。+ u1 ]! ^, |4 ~' Z4 i
6.由于可以调用多个序列,许多序列的计算可以先在公式中进行,然后作为调用的参数即可。
" n6 O5 N& s3 n- u" R  l7.经此扩展,对分析家的DLL依然可以调用、兼容。
4 G! v/ b9 V: B3 l% |8 z( D; ~6 l*/
, ]& C) q' n. }+ q' h///////////////////////////////////////////////////////////////////////////////////" D8 L. F6 G% v2 p
/*函数输出
4 |$ l6 X2 |" g4 y__declspec(dllexport)int xxxxxxxx(CALCINFO* pData);" @% U1 @; g* r  K# a' z! w2 t
1.函数名称需全部大写.4 |! ^5 Q$ q- ^
2.函数必须以上述形式声明,请用实际函数名称替代xxxxxxxx;
7 y( t7 W" P8 y) i+ p对于C++程序还需包括在extern"C" { } 括号中.
6 h' w: X* l1 Z. D6 c2 }; e/ g3.函数计算结果用pData->m_pResultBuf带回.- o2 q" m' H0 c! m# w7 M
4.函数返回-1表示错误或全部数据无效,否则返回第一个有效值位置,即:' S. D3 c# q1 R; ?6 g8 q. J$ z
m_pResultBuf[返回值]-- m_pResultBuf[m_nNumData-1]间为有效值.
" q8 s& }$ q* c- l' h0 a/ O+ Q5.函数名称长度不能超过15字节,动态连接库文件名不能超过9字节(不包括扩展名),动态库名称不能叫SYSTEM,EXPLORER
( L1 [; h/ i* u/ N/ R- u  i3 f*/2 q$ B7 r( z* Y/ l9 h( x& ^
//示例函数,使用时用实际名称替换3 H, Z6 K, }  A6 V4 {9 T  {
__declspec(dllexport)int WINAPI MYMACLOSE(CALCINFO* pData);& Q" Z7 l/ O! X9 \; ]9 k
__declspec(dllexport)int WINAPI SMOOTH(CALCINFO* pData);
2 y. V, G7 p  i  p$ J4 h5 g* r0 }//__declspec(dllexport) int WINAPI MYMAVAR(CALCINFO* pData);/ w1 ~# \) E$ Q' d( [! n( q
__declspec(dllexport)int WINAPI MYBBI(CALCINFO* pData);( H4 G% o- B3 d9 Q  O5 z; z8 |
//WINAPI = _stdcall
9 b/ G3 I, ^4 }6 y+ l' P8 E#ifdef__cplusplus
+ F, U5 a' a6 q' N2 G}
/ m5 S1 y0 p3 j9 `) }#endif//__cplusplus- f: z1 w( _; j' M. z& x" _7 d
#endif//__FOXFUNC_H_INCLUDE, |7 H4 b6 y/ y* V
, X2 C# v5 ]' q% j
//////////////////////////////////////////comment 注解1 G! C( h% t+ n0 ~
__declspec(dllexport)int WINAPI MYMAVAR(CALCINFO* pData)$ `& A5 c/ K# k7 `$ ?3 ?
pData是指向 址标总结构 CALCINFO的 总址标
; p, ?2 z/ C6 M; u) @取用第二个参数数值floatfParam = *pData→m_pfParam2
% ?8 D6 H4 r% u( ]- K& P# _, c取用第一个序列参数的址标constfloat* pValue = pData->m_pfParam1;
7 a7 e2 w# E2 T# x: A取用股票数据长度intndata = pData→m_nNumData;
, S/ ~/ r3 ^) E第一个参数存在且为数值pData->m_pfParam1&& pData→m_nParam1Start<0/ e# d/ s5 o+ J- D! [8 B
第一个参数存在且为序列pData->m_pfParam1&& pData→m_nParam1Start>=0
; a' G: d3 P1 c4 u, f第一个及第二个参数存在且为序列,第三个参数不存在pData->m_pfParam1&& pData->m_pfParam2 && pData->m_nParam1Start>=0&& pData->m_pfParam3==NULL/ `8 s5 c5 c" p1 B: d
constfloat* cpParam = pData->m_pfParam1; 定义cpParam为第一个序列参数的址标: c6 p7 j) c, P8 r/ g. A: x: t+ U3 N
取用股票数据结构
/ F4 }; d+ \% upData→m_nNumData= 变数数据长度
( q& ?+ z" w1 T% z0 s2 wpData→m_pData= pointer to struc STKDATA 的址标
, F3 B) C8 L; Y# S% ppData→m_pData[x]数据结构的第x个数据4 V3 K1 r% z% [, o. n) q( l
pData→m_pData[x].m_fHigh数据结构的第x个数据中的 High
6 V2 K+ }0 ^# k$ H# U! Q6 N取用结果缓冲序列: L. }0 f5 M0 }1 s. x9 |8 o
pData->m_pResultBuf
& H/ Z. f+ W3 o5 q取得第一个序列参数的起始序位,如 2,...5 , . 7...2 r+ B+ L) u0 A3 \
intnFirst = pData->m_nParam1Start;
. ~( g/ S3 l: L2 P4 S3 L1 q& {for( i = nFirst+nPeriod-1; i < pData->m_nNumData; i++ )9 m% b0 E. `0 Z! l  B8 A
取得第二个数值参数的数值- _/ t# \3 K5 ~  C3 `
floatfParam = *pData->m_pfParam2; . `* p$ X+ {* V4 M2 W8 J; s; i! b
intnPeriod = (int)fParam;
4 h5 k. u) t! E& f# c! t* b取用第一个序列参数的址标constfloat* pValue = pData→m_pfParam1;
# e, G5 S" ?  X, u取用序列参数的单个直pValue
5 I% I8 A: G% U- p* I( n取用缓冲序列的单个值pData->m_pResultBuf  x' D6 j4 K4 e& p1 D) s
constCALCPARAM* m_pCalcParam; // 调用参数数组. o2 N2 N1 i1 I1 i- N1 L
m_pCalcParam为序列址标,指向各序列参数的指标0 [9 \( b0 A" q. P. `2 o. `
第一个序列参数pData→m_pCalcParam[0]( |+ u6 i9 F2 x
constfloat* m_pfParam; //指向序列参数的址标
6 X. t. a& D& ?7 W第一个序列参数的起始序位pData->m_pCalcParam[0].m_nParamStart: x# Y# U* Y8 i
第一个序列参数的址标constfloat* pValue1 = pData→m_pCalcParam[0].m_pfParam;
: z6 J  E  b' g( c9 `  Q! b# J取用第一个序列参数的单个直pValue18 v* i' o7 U' A9 U# x) V& H! `
第二个序列参数pData→m_pCalcParam[1]5 ]% r$ N. N" m6 `. S1 F' }6 \
第二个序列参数的起始序位pData->m_pCalcParam[1].m_nParamStart
4 u; `0 ]. w' K1 \' h& I第二个序列参数的址标constfloat* pValue1 = pData→m_pCalcParam[1].m_pfParam;
6 R! n: U  h; R0 w$ }" V$ S取用第二个序列参数的单个直pValue2
' D8 ~* S* J5 M第三个序列参数pData→m_pCalcParam[2]3 E. B" C, p$ @9 T" R1 S) T
第三个序列参数的起始序位pData->m_pCalcParam[2].m_nParamStart
+ ~; T7 Q; l( W& E" _' \第三个序列参数的址标constfloat* pValue1 = pData→m_pCalcParam[2].m_pfParam;
* ]1 @7 }" z1 W6 F6 N取用第三个序列参数的单个直pValue35 X8 U. e$ t+ F1 b( X
第四个序列参数pData→m_pCalcParam[3]) R* K: ^' i9 R' V" {& R) _9 E
第四个序列参数的起始序位pData->m_pCalcParam[3].m_nParamStart
& R7 _9 l$ O8 U* ^1 i! P第四个序列参数的址标constfloat* pValue1 = pData→m_pCalcParam[3].m_pfParam;. k& L- {+ Z" [9 ^+ M: k
取用第四个序列参数的单个直pValue4
5 h. w/ O: C6 H7 k( p如果有四个序列参数,则取用序位最高的那一个序位
. s3 u7 r9 u1 d- F) Rif( pData->m_pCalcParam[0].m_nParamStart >= 0 &&
: T0 j8 h) t% n. n8 @! q  {. zpData->m_pCalcParam[1].m_nParamStart>= 0 &&% d& O) E0 ?4 N" E0 Y' X
pData->m_pCalcParam[2].m_nParamStart>= 0 &&+ G  J; h' z) X. F% d4 J6 ~
pData->m_pCalcParam[3].m_nParamStart>= 0 ) //4个序列都含有效数值
" D! C4 O$ I1 A6 l5 P{
: V1 d8 h& V* n' M1 ]//计算返回的序列的第一个有效值位置, ~% E5 C- ]0 p6 }  s$ E
intnFirst = pData->m_pCalcParam[3].m_nParamStart;//已知返回的序列的第一个有效值位置与第4个序列一致
# D  t6 ?1 ?0 d* r" t//若不知,则
9 u* e7 D  I: F3 l0 o( }  @/*
+ `) E. G  i. NintnFirst = pData->m_pCalcParam[0].m_nParamStart;& C# R3 f7 u8 K: }! u
if( nFirst < pData->m_pCalcParam[1].m_nParamStart )
; L3 V- }7 \4 k0 `2 snFirst= pData->m_pCalcParam[1].m_nParamStart;
3 `- `. _6 z" C  nif( nFirst < pData->m_pCalcParam[2].m_nParamStart ) + {5 @( k$ h- X. m6 k  s* w
nFirst= pData->m_pCalcParam[2].m_nParamStart;# _( H$ X! U% u; {2 H  e" a6 [
if( nFirst < pData->m_pCalcParam[3].m_nParamStart )
% n1 t6 y$ d3 G/ j9 XnFirst= pData→m_pCalcParam[3].m_nParamStart;
3 g1 R( m5 y& e- rconstfloat* pValue1 = pData->m_pCalcParam[0].m_pfParam;' {4 G# \# ]3 q  K. Y( @
constfloat* pValue2 = pData->m_pCalcParam[1].m_pfParam;
- ?, k, Q* `( p1 iconstfloat* pValue3 = pData->m_pCalcParam[2].m_pfParam;
6 G% ]/ m, l% f) [constfloat* pValue4 = pData->m_pCalcParam[3].m_pfParam;
3 j+ Z3 S& |( X2 }  q: K- `//-------------------0 m1 U' |6 ?+ [, u/ M4 _
floatm_fOpen; //开盘 open( g# G+ {* s" |  C; g1 k) |
floatm_fHigh; //最高 high
& y8 `+ l2 k) B2 s" S" ^. zfloatm_fLow; //最低 low
: m$ W8 A0 \1 a+ ofloatm_fClose; //收盘 close
, o! ~  p5 T+ H7 J* w1 ffloatm_fVolume; //成交量 Volume( `* f2 x' k. q- }* Z' Z+ S
floatm_fAmount; //成交额 amount7 A# C* s3 P4 z3 ~, \$ \6 E
调用收盘据
) W( J' F4 j5 i$ v/ e7 H2 L3 SpData→m_nNumData= 变数数据长度+ X0 x; d- ?; S2 n' z4 N; `4 x7 ^0 u
pData→m_pData= pointer to struc STKDATA
3 B) \6 W7 s' L0 e  KpData→m_pData[x]第x个数据3 V' X7 G8 }8 }0 {& r; ^
pData→m_pData[x].m_fHigh第x个数据中的 High0 @+ v9 l/ k* [+ B4 Q+ s
@@@@@@@@@@@important !!!!!!!
5 \; _; K2 f/ g, DsinceVC++ 2008, cl.exe will make ‘pData→m_pData[i-j].m_fClose’ anerror/ F' D5 q3 a9 E' N: t. s) G
so,pass the high,low,open and close just from the function parameter ,that is use ‘ CALCPARAM’ struct
, m2 s9 S* Y! j, `4 D4 ]pData->m_pData[i-j].m_fOpen// to use open , there is no way in using a varable for calculationoutside foxtrader
% B4 S, k9 x; r2 \* ]* z6 @pData→m_pData[i-j].m_fHighto use high& Q; f) y, l" o, p0 u  H
pData->m_pData[i-j].m_fLow
6 b- l2 \; [3 R1 L/ zpData->m_pData[i-j].m_fClose
) I* J3 R- C2 X/ sm_pData= pointer to struc STKDATA
- ~9 f9 w5 J! pincalling C++ dll function
/ `0 I2 o; @1 _: J* ^0 d; cm_pDatais passed to pData (CALCINFO* pData . A CALCINFO* type pointer)
/ `: r& V* E( w8 c; Wtouse a single value in variable ‘High’; {7 X. R  A: w! U4 m
pData→m_pData[i-j].m_fHighto use high
* o) R! E* Q* {8 y, i: X5 i- j5 Kconstfloat* m_pfParam1; //调用参数1/pointer to variable parameter 1 1 ~& R8 E( e1 y( z) t  u: l
constfloat* m_pfParam2; //调用参数2/pointer to variable parameter 2
( W# Y# w. k! \5 Fconstfloat* m_pfParam3; //调用参数3/pointer to variable parameter 35 ~: L$ v; d- g
constfloat* m_pfParam4;
6 P) i& X' D2 fm_pfParam1,m_pfParam2, m_pfParam3, m_pfParam4 = pointer to caller function 的参数- U* {4 i3 S. F) Z
pData→m_pfParam1= pointer to 第一个(序列)参数2 v7 z8 x/ P6 V& U
pData→m_pfParam1[x]= 取用第一个(序列)参数的第x 个值" L, m8 v3 G/ a
constfloat* cpParam = pData→m_pfParam1; =定义 cpParam为 pointerto 第一个(序列)参数1 l1 L* C5 D0 @! |/ i! y2 J+ \% j; D
cpParam[x] = 取用第一个(序列)参数的第x 个值
- I- U! d: Y( U& l* {m_pResultBuf= 结果缓冲列
, @. |( ~3 a, F3 ^pData→m_pResultBuf= pointer to 结果缓冲列
" E2 _9 K0 b5 GpData→m_pResultBuf[x] = 取用结果缓冲列的第 x个值0 P) y8 l; M9 M
//////////////////////////////////////////comment0 a, w9 P, K1 [4 V6 }
//////////////////////////////////////////comment 注解8 E4 A/ _; \8 q# K* D7 g
constint m_nParam1Start; //统杅1衄虴宎弇离3 h0 c. C8 P( C  [6 d4 E
constfloat* m_pfParam1; //覃蚚统杅1
- t7 e4 @) C/ ~5 G# P: Y4 @constfloat* m_pfParam2; //覃蚚统杅2
$ |; _9 U9 [0 B( h/ Gconstfloat* m_pfParam3; //覃蚚统杅3
' o, G/ W2 m: t3 xconstfloat* m_pfParam4; //覃蚚统杅4,parameters must be <= 4
$ J- h  O6 b0 z! d+ s1 `* P- ^6 C//const float* m_pfParam5; // parameters must be <= 4
  O3 P& h! F/ K+ M1 l//const float* m_pfParam6; 3 I5 u- ]' M" w; u7 H
//const float* m_pfParam7; % x) X. s/ Q. a# M
//const float* m_pfParam8;, W7 B/ [: V/ Y
//pData->m_pfParam1 && pData->m_pfParam2 &&pData->m_pfParam3 && pData->m_nParam1Start>=0 &&
% s+ N1 X$ H- z% L/ ~1 QpData->m_pCalcParam[0].m_nParamStart>=0&& pData->m_pCalcParam[1].m_nParamStart>=03 H3 m5 o2 O  z* l& W
&&pData->m_pCalcParam[2].m_nParamStart>=0)
, `, Q% ~. c4 o4 b3 _6 [{: h. Z# B6 I' _- c' s
floatfParam = *pData->m_pfParam4; //pointer ,pData->m_pCalcParam[3].m_nParamStart >= 0# \$ q( h5 m& O+ o$ Z& @
intnPeriod = (int)fParam; //统杅1
  u/ J" Y; o- d1 a+ m7 m//const float* cpParam = pData->m_pfParam2; // cpParam = pointer to第一个序列参数,cpParam = 取用第一个序列参数的第i 个值8 w% v% S. V0 p; D, e, d8 M  Z
constfloat* cpParam1 =pData->m_pCalcParam[0].m_pfParam; // cpParam =pointer to 第一个序列参数,cpParam = 取用第一个序列参数的第i 个值
' s1 `) E4 G, y5 X2 F/ m8 U& Tconstfloat* cpParam2 =pData->m_pCalcParam[1].m_pfParam; // cpParam =pointer to 第一个序列参数,cpParam = 取用第一个序列参数的第i 个值4 M* z: F# H- g) V
constfloat* cpParam3 =pData->m_pCalcParam[2].m_pfParam; // cpParam =pointer to 第一个序列参数,cpParam = 取用第一个序列参数的第i 个值//parameters must be <= 4
0 H% c0 w9 G& X- ?/ a- ?//const float* cpParam4 =pData->m_pCalcParam[3].m_pfParam; //cpParam = pointer to 第一个序列参数,cpParam = 取用第一个序列参数的第i 个值
: R, E$ c( S% \//const float* cpParam5 =pData->m_pCalcParam[4].m_pfParam; //cpParam = pointer to 第一个序列参数,cpParam = 取用第一个序列参数的第i 个值
" Y- w4 ^7 a; P, U, W//m_pData = const struct pointer to struct STKDATA , pointer to structSTKDATA ,
' D4 Z$ o6 Z' o, ]2 E0 j) xtouse pData→m_pData[x].m_fClose$ _, A. c  ~+ t  o5 p9 n; u1 ~
pData→m_pData[x]= | 1,2,3 , … , m_nNumParam | time_t m_time; & N" s' J/ i" B3 N
|1,2,3 , … , m_nNumParam | float m_fOime_t
! e1 |+ l1 X  \. C|1,2,3 , … , m_nNumParam | float m_fHigh;
) S" j0 m& f+ P5 W' @6 V.. .
- G+ e6 U. y* o" p|1,2,3 , … , m_nNumParam | WORD m_wDecline;0 t& L/ D, E' }" a) e
m_nNumParam= 数据high,close,open,low的长度4 r* ?6 Q  c+ a+ A6 u* ^4 M' o$ s/ o, D
touse high:/ l' f  s; {1 S7 r" d( ?
pData→m_pData[x].m_fHigh& _, t' T9 K7 a! Q
contentof struct STKDATA9 A( c" W+ g* I: ~
time_tm_time; //时间,UCT
) n, M; k/ q- D6 F) ~8 Z' vfloatm_fOpen; //开盘 open2 r$ }! Y2 w+ C5 g5 N4 [3 D
floatm_fHigh; //最高 high
3 y# B& X6 {& e/ D: c( gfloatm_fLow; //最低 low6 z- d+ {2 ^" |& M
floatm_fClose; //收盘 close
1 f' S  V0 w* Y' ]6 A; {1 y7 k$ Xfloatm_fVolume; //成交量 Volume
9 ~/ H/ R5 B% Bfloatm_fAmount; //成交额 amount0 L/ j6 J. y1 p
WORDm_wAdvance; //上涨家数 仅大盘有效
4 I  x$ |8 n, v# Q: e" UWORDm_wDecline; //下跌家数 仅大盘有效
6 p$ R$ N2 |8 I1 a& _调用传递参数及传回结果
4 z* D/ f0 h3 Z1 U" V调用传递参数1 B* _. h7 y6 K+ n2 _- M
(pData->m_pfParam1 && //参数1有效Param1exists
# E' \% y' t3 v1 gpData->m_nParam1Start<0&& //参数1为常数/ S% b; @9 R5 A7 E
pData->m_pfParam2==NULL) //
5 @+ z+ d# t! qlocalprocedure 定义使用变数7 m7 t/ S5 d2 ?7 m1 F
onstfloat* pValue = pData→m_pfParam1; //use constant参数1$ U3 c+ D& U3 h# c1 A0 ]
intnFirst = pData->m_nParam1Start; //use 参数1效值起始位. O. x& M% S( u2 U5 ~0 q' [* m
floatfParam = *pData->m_pfParam2; //use 参数2
3 T9 w' c9 ?1 FintnPeriod = (int)fParam;
  @- @- E( Y4 B; l" L传回结果
- [0 t- ?$ {, g  |3 G6 b0 \& G: r0 xfTotal+= pValue[i-j];
2 D* y3 ?0 C: O3 c5 s5 i* n2 `' X! vpData->m_pResultBuf" w7 Q" K" y, Z0 j; }
//////////////////////////////////////////comment




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