阳光飞狐

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

 找回密码
 手机注册

手机动态码快速登录

手机号快速注册登录

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

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

[复制链接]
跳转到指定楼层
1#
发表于 2019-8-11 16:09:40 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
许多年以前,我曾经在( j" q2 W, O" M5 I5 Z% y  \% }
理想公式区发布了9 r' @) n0 E2 F
"( l& @3 m+ _& A* m3 i) Q9 q
如何用 Foxtrader(飞狐)连结 C++动态程式库 DLL80x86Macro Assembly (组合语言)5 ^: K2 g* T0 C
"
  v5 _" i5 ], F( m0 |# j6 g; a1 f( Q5 f
现在更新foxtrader(飞狐交易师) # V0 o% `8 @' |
连结 DLL的方法: _$ `4 e1 ]; r( D$ Q+ u" Z$ i

% W7 w& k8 h0 J' a: S, Sfoxtrader- - > DLL (C++ and assembly) = ( foxfunc.h + foxfunc.cpp +pow10.asm )
0 g+ H) o8 e5 k$ m4 X3 o5 Egauss- - > DLL (C++ and assembly) = ( foxfunc.cpp + meigj.asm ), e% l: T" v0 t3 i4 \4 G$ w
gauss只用到函数参数传递,所以使用新的 c++compiler, 不受影响
+ \3 M8 _, A8 Efoxtraderfoxfunc.h宣告的结构型态 (struct)2004vc++ 6.0 全部有效
  s8 f4 U/ m# T+ c1 S- F" Z6 o0 R" F: O( D9 t
也就是这五个结构都能用
4 q( ~" q: W9 otypedefstruct tagSTKDATA
7 }( }! q% J4 ], y3 _4 p) {typedefunion tagSTKDATAEx" z- q8 M0 X7 |0 E1 X
typedefstruct tagSPLITDATA
( a+ N/ {! [0 d# B- Htypedefstruct tagCALCPARAM
5 n3 _) w" P- xtypedefstruct tagCALCINFO
& T* n1 a: S$ V8 C3 ^; g. G* B$ G; N
5 Q  J* P7 m) M9 i; K) M2008年起,vc++ 2008, vc++ 2010, vc++2017 struct的编译,已经完全 c++,不再相容于 C
* Q1 R2 F; N* \  r+ R. p也就是这五个结构中
6 T! \- d, o: `7 w" T* Vtypedefstruct tagSTKDATA 9 R+ T+ x" |" B& U3 X
typedefunion tagSTKDATAEx- H$ _" G4 C* a9 r% h
typedefstruct tagSPLITDATA & g. l) R: A$ @4 _
typedefstruct tagCALCPARAM
+ B2 M' ?8 {7 V9 Y7 |# `typedefstruct tagCALCINFO
/ f5 G, Z, B% g只有这两个可以用  G3 g1 Q/ G1 [; V& {% [
typedefstruct tagCALCPARAM, Y1 I; a3 r. Y; K6 S% i# x( M
typedefstruct tagCALCINFO: o* w% _% u! ~& X( ?, L+ F( @
值得庆幸的是,下面这个结构的函数参数传递个数可以有无数个
0 v; N% U" x8 n% @# ^7 btypedefstruct tagCALCPARAM; }: c6 ?, ?- z2 S) m
例如:foxtrader
$ C3 D+ V8 E. G8 v  y9 O6 Q$ OMA1:=MA(CLOSE,3);
# x! T. E" Z( ]( _; [- |1 |MA2:=MA(CLOSE,6);3 f! V8 r* \; G" ?5 R' [) E
MA3:=MA(CLOSE,12);+ R- i& i6 k+ `# a) s" z
MA4:=MA(CLOSE,24);
6 E0 Q2 X1 H- Z# z3 H7 e) [MYBBI1:"MYFUNC2017@MYBBI"(MA1, MA2,MA3,MA4,MA3,MA4,5)*0.95,colorff00ff,linethick3; {2017 vc++ 15.0}: ~+ P9 ^& o! x5 F6 Q+ a3 O$ ^
其中MYFUNC2017=MYFUNC2017.dll, MYBBI = MYFUNC2017.dll 中的MYBBI函数,这里 MYBBI函数传递的参数共有 7- Y; [4 z% S  M( s, U
下面这两式计算结果相同
1 ~1 u* ^5 T+ a  a3 A, B: Oxx:(MA(CLOSE,3)+MA(CLOSE,6)+MA(CLOSE,12),MA(CLOSE,24),MA(CLOSE,12),),MA(CLOSE,24)/6*0.95,color0000ff,linethick2;{foxtrader 自行计算}
( V- ?1 y4 P+ u+ K* q% ^# rMYBBI1:"MYFUNC2017@MYBBI"(MA1, MA2,MA3,MA4,MA3,MA4,6)*0.95,colorff00ff,linethick3; {2017 vc++ 15.0 , dll计算}
# F& i7 _, b. m  s7 l. w# `; F0 Z其他例子2 P4 z. Z) H. u0 t3 ]. [
oooq:="MYFUNC2008good@MYMACLOSE"(c,,c,c,6),colorffffff,linethick5;(---> pow10.asm)$ P5 A1 {6 Y' ~- y# \6 A8 k; D& U
oooq1:"MYFUNC2010@MYMAVAR"(ma(c,5),5),colorgreen,linethick5;
) ^9 e7 ~* ?9 z其中pow10.asm里面有很多不同定义或宣告被注解不用,那是因为后来在逐步侦测法修改语码中才发现在foxfunc.cpp主程式中,下面这行错误,也就是新的 compiler不再相容于 C,因此在pow10.asm里面被注解不用的定义或宣告中,有些应该是可以用的& u5 o; Z+ F# v$ ~' c
fTotal= pData->m_pData.m_fClose; // @@@@@@@ vc++ 2010 cl.exe 使pData->m_pData[i-j].m_fClose错误
1 T7 t+ Q: m2 V+ ^
$ w: O& K+ T9 F  ~: K7 w* ^
; @; r! y$ ^, Z( F////////////////////////////////////////////////////////foxfunc.h
9 ?6 F9 D& n; `( \) S8 v#ifndef__FOXFUNC_H_INCLUDE* x8 A! v0 _. G1 B5 U  B" f
#define__FOXFUNC_H_INCLUDE
9 R8 ~6 m+ j3 {/*
6 U0 N/ A4 m& U, y# O8 i飞狐交易师“C语言接口”扩展程序调用接口规范V3.0& Y+ Y4 f& i- f( |  `
1.本规范适用于飞狐交易师V3.x公式系统.
( g+ H& x, r5 t9 i* c2.扩展函数用于实现系统函数不能实现的特殊算法.+ Y7 M. s% D* q4 N; c9 D9 \$ h
3.扩展函数用windows32位动态连接库实现,建议使用MicrosoftVisual C++编程.2 o) X3 g9 ~! K1 H$ b( t
4.调用时在公式编辑器中写"动态库名称@函数名称"(参数表)即可,例如下面函数可以写为"FOXFUNC@MYMACLOSE"(5)5 e4 c3 Q! y. _' j& K4 _
5.动态连接库名称和函数名称可以自己定义.: {) b2 I2 ~7 O( S9 ~
6.使用时必须将动态库拷贝到飞狐交易师安装目录下的FmlDLL子目录下使用.% `# j4 a  u6 U
*/' a5 U5 Q' D' x2 D# o& J
#ifdef__cplusplus. U  ]! B) g" g* h
extern"C", d5 j$ ]* r8 c) t
{$ w. ^. ^5 l( b
#endif//__cplusplus6 L( J) i; b/ p' g0 _( ^3 v# N
///////////////////////////////////////////////////////////////////////////
2 h8 d' I4 W; |2 l6 C0 x* I# `//分析周期
+ ]/ i0 f/ p1 l( E. W+ s) QenumDATA_TYPE, @% y7 u/ n" N: z7 x/ r7 n
{
& ?) f3 I( J5 a, f+ C. O* WTICK_DATA=2,//分笔成交9 o6 R. A& H; y4 h4 z" G/ f1 q$ W
MIN1_DATA,//1分钟线2 d& q6 o/ M- \  l8 i: s
MIN5_DATA,//5分钟线
8 n" D. b4 ^) Y# pMIN15_DATA,//15分钟线1 v3 X; x( @- V5 q2 e( N
MIN30_DATA,//30分钟线3 u* d6 A4 d* X5 n- H3 I
MIN60_DATA,//60分钟线0 G7 \: d0 e7 p9 Q5 w
DAY_DATA,//日线
" t4 v8 y+ \8 {  h( v. u1 JWEEK_DATA,//周线
: U2 D" W( T% y2 }, |- e% ]5 GMONTH_DATA,//月线
7 b$ F) b4 \# A. q+ F8 o3 qYEAR_DATA,//年线' d* H2 R+ V0 O
MULTIDAY_DATA,//多日线
& {$ s; H7 g1 f5 _& C! O8 WMULTIMIN_DATA//多分钟线
7 C3 s0 ?+ ^1 w# G3 T5 p};  o1 k% U0 p3 W% p3 ~0 q( K& R
///////////////////////////////////////////////////////////////////////////7 B2 i( L/ N2 @2 g% r' y# s
//定义取用股票基本数据的结构 只有 VC++ 6.0 compile成功使用8 \4 o( j5 \) A. }$ l
typedefstruct tagSTKDATA
2 Y/ d7 M2 E* h+ z4 [* V% o{" a3 t  {% `9 ^5 [
_tm_; //时间,UCT; |$ I; N7 `3 `  Z% }5 I
floatm_fOpen; //开盘 open- w0 O" ]* E9 K& Q# [
floatm_fHigh; //最高 high9 Z- v5 g5 q9 U) {
floatm_fLow; //最低 low9 D) u! G. a  `* \
floatm_fClose; //收盘 close) {: A8 M1 w/ G
floatm_fVolume; //成交量 Volume
7 o# h+ d1 |; k/ Ufloatm_fAmount; //成交额 amount+ M4 B  H' P) w6 a; E5 I6 T) X# _5 X6 v
WORDm_wAdvance; //上涨家数 仅大盘有效
( `( S( P, X, C6 H$ `7 c8 N# p7 \WORDm_wDecline; //下跌家数 仅大盘有效
0 o4 w7 F9 ]5 R2 V1 W# L}STKDATA;+ f. R- Y" j% G& Z
定义STKDATAtagSTKDATA的简单别名,STKDATA 5 ^5 [# ]8 x& J6 }
为真正方便使用名称,tagSTKDATA 为定目的的过水名称
! X) b6 K- d; R$ C4 H) t( L/ O////////////////////////////////////////////////////////////////////////////+ O+ n  m- W: q9 w
//扩展数据,用于定义取用分笔成交数据的买卖盘 的结构: D8 r3 g1 }0 S' [) b+ }6 h
typedefunion tagSTKDATAEx
& X, Y4 J4 R) d{
8 Y9 H8 z  M( [- S* b( ustruct1 l+ x* N' b! q0 h/ s. _. b
{+ b1 H) Z0 p/ i! x$ n5 }
floatm_fBuyPrice[3]; //1--3floatm_fOpen; //开盘 open. t+ H: F3 o3 h; B6 O. ~
floatm_fHigh; //最高 high
6 [) Y9 u# M% j/ @8 `floatm_fLow; //最低 low
* O4 R1 q* X/ e- W1 l2 pfloatm_fClose; //收盘 close; o6 m5 z* R& p; l  y0 D( j
floatm_fVolume; //成交量 Volume* j- R/ f, V! d; O6 h
floatm_fAmount; //成交额 amount
. }1 T4 H" W) gfloatm_fBuyVol[3]; //1--3
' Q8 a: D4 n3 ?2 ofloatm_fSellPrice[3]; //1--3+ K. [# D8 b6 ^6 |
floatm_fSellVol[3]; //1--3
! ?' c* M7 Z# i3 P4 F* U/ O2 y7 N( X, M};1 ]8 R( P) a& x
floatm_fDataEx[12];
2 `4 U( E7 N8 n% x}STKDATAEx;
1 [0 ]. t( q1 ^0 z9 s$ p2 S- w0 B; T////////////////////////////////////////////////////////////////////////////. ~) i1 B4 A# Y# S8 Q  [% h7 e' ~6 w7 N
//定义取用除权数据的结构$ j( d1 c- y& X2 I+ ]0 e
typedefstruct tagSPLITDATA
% ?( U4 D* X" P+ e, a{
" W# \1 ?! D- Z' G" a0 \time_tm_time; //时间,UCT) D0 o; M- q5 ^" o
floatm_fHg; //红股5 I; b9 _$ }! I0 ?" S0 V, {, e! I
floatm_fPg; //配股
- k9 b# B% [' w- b$ X2 K( Y2 B$ mfloatm_fPgj; //配股价
3 [; I; m( f& Efloatm_fHl; //红利
% N1 C& ]5 S0 j$ n; U3 @}SPLITDATA;6 Y2 ~. B/ g- o0 }7 O3 U, v
/////////////////////////////////////////////////////////////////////////////0 |, {- O2 w4 {% @2 d8 S
/*财务数据顺序(m_pfFinData内容)$ A3 x9 M/ S) J4 r
序号内容
" O$ L4 d+ L! @1 n" i6 @0总股本(万股),
* H- S3 c# b7 ~4 A, G' a1国家股,
. z. A  s  {) z& Y; m2发起人法人股,
9 h5 k8 ~+ ]( y3法人股,  P* S1 b+ U1 p3 |- t
4B,
3 b0 B! y7 X8 T) p" y5H,: b/ c! G7 d: ]3 c3 c9 o
6流通A,
' [# r! T: d7 Y, u% f0 C7 e7职工股,& J0 |/ E4 c, t' V$ m; d
8A2转配股,: m$ ~  {  z9 R3 ?- y* X- e
9总资产(千元),0 U, A  t' y. W9 q
10流动资产,
! I; W1 @' ]; i  A( b3 Y11固定资产,0 U4 C" r# W8 g" _4 z0 C
12无形资产,. ^7 B) P9 T+ q
13长期投资,
- H3 c! q' u1 S' J14流动负债,  }& q3 {5 g, Q) S! w
15长期负债,# P0 m0 c. y/ D. s) v
16资本公积金,4 P/ }& b/ e: {0 X  J8 N
17每股公积金,; \2 }! @/ X, E$ b+ A+ A
18股东权益,
' V: V* p% O+ g  B( m0 q# Y+ a19主营收入,, j( W% p' R" S
20主营利润,
3 Y" R+ j1 `# _. M21其他利润,
( l+ C. f8 I6 j4 Z22营业利润,0 v7 x  u% p7 I- s: m: \
23投资收益,- Y; `+ f* T$ a6 s% {' a4 _+ g
24补贴收入,% J$ p, `; p( N* X$ F
25营业外收支,6 X2 M; U$ l7 e3 g  a, |1 M
26上年损益调整,
0 i$ i  f8 T6 Q+ f- }% Y27利润总额,( I( k6 n' b3 g) B% f& z
28税后利润,
3 z* ~& S% U6 x1 D29净利润,
  ]+ G# |7 N8 E6 o# ^4 i/ i30未分配利润,+ e8 N  T% a; R& k
31每股未分配,
: a7 a- j& F1 H& N3 a9 a6 ^- P; T: q32每股收益,
  u& c3 @$ v" u' G/ f33每股净资产,
  d9 a* d& a% w0 O2 E" d3 E1 X, d/ o34调整每股净资,- ~7 W' p9 [4 b+ ?: D5 b
35股东权益比,
1 M, @% }; \0 r" K  X) n3 Z% D! s36净资收益率9 c; Z3 h. Z4 B7 f9 q# S7 _
*/2 R% o/ h! P/ @, E8 U
/////////////////////////////////////////////////////////////5 p) A( C0 {% d  \4 J
//定义取用caller函数传递参数项 的结构
1 W$ H: H7 V: W  u+ T* a( \3 o9 [- Ytypedefstruct tagCALCPARAM8 c1 Y1 q2 Y" G) V8 f7 X5 L9 E9 p' }
{
3 z8 r( {# R/ B" V4 funion
* n# N* j6 ]) Y8 E{: A8 b  m2 y! j: X% _3 G0 ^
constfloat* m_pfParam; //指向序列参数的址标,指向一个浮点型数组pointertofloat variable parameter / ex. c,h,l,o, co2...co2=(c+o)/2( x: ]. r5 e' v! P( ?
constfloat m_fParam; //数值参数 valueof parameter5 z3 Z" \3 A* a; H; U( i9 y. ~
};
9 p4 V  g/ a% y" ?) K/ Tconstint m_nParamStart; //序列参数有效起始位置thestart address of variable parameter / ex. c,h,l,o,co2.....) \( C; I3 ?! u0 q8 M
}CALCPARAM;
+ g% O* B+ q7 ]) A: H/////////////////////////////////////////////////////////////////////////////  f" _# B4 v* H- u" u/ i  q4 O
//定义全部取用址标 的总结构 (各指标指向前述各结构以便取的各结构的数据,接口信息数据的结构 )
6 |) L$ n8 r( Y, e+ T6 Etypedefstruct tagCALCINFO
9 k) {2 G9 u# N{
. X' E( ?. i  c) j0 o/ B! oconstDWORD m_dwSize; //结构大小$ s" j( V+ X/ W/ g% w8 X" M
constDWORD m_dwVersion; //调用软件版本(V2.10: 0x210)
: z- B; t1 ^8 EconstDWORD m_dwSerial; //调用软件序列号
, t1 b# P/ _; W8 s; [constchar* m_strStkLabel; //股票代码* w9 z- i3 d, A- t9 s* K! y/ |; ^
constBOOL m_bIndex; //大盘# J& Y( C, b% L
constint m_nNumData; //数据数量(pData,pDataEx,pResultBuf数据数量)数据长度& M! t) G& }0 F- c
constSTKDATA* m_pData; //常规数据,注意:m_nNumData==0时可能为NULL, k0 l6 E( x, t9 H; W1 i# R) r5 {
constSTKDATAEx* m_pDataEx; //扩展数据,分笔成交买卖盘,注意:可能为NULL
2 Y4 s" M' O/ `% I: Vconstint m_nParam1Start; //参数1有效起始位置<0/ constant parameter >0 /variable parameter
, p! S: |5 K% E# q+ U5 wconstfloat* m_pfParam1; //调用参数1/pointer to variable parameter 1
) \- @4 H5 S$ C. U7 c& T( bconstfloat* m_pfParam2; //调用参数2/pointer to variable parameter 2
& P* k( ~1 L, [( m- Dconstfloat* m_pfParam3; //调用参数3/pointer to variable parameter 3" ~2 j0 U0 h# n; z0 Q) `
constfloat* m_pfParam4; //调用参数4/pointer to variable parameter 4+ ]3 C9 Q0 h, Y/ E: _9 ^) H0 e- v) y; F
float*m_pResultBuf; //结果缓冲区
3 M6 ~4 C5 [1 qconstDWORD m_dataType; //数据类型
3 x* U# M. u! K! o3 Aconstfloat* m_pfFinData; //财务数据
! l1 R8 [$ U" L4 S5 C- b//以上与分析家兼容,所以沿用其结构和名称
5 H' N, i" f6 Y5 O) Z" P! R6 `//以下为飞狐交易师扩展(fortagSTKDATAEx)+ b2 Z& S+ I& [" B
constDWORD m_dwReserved; // 保留" _/ Z- r& G' U, w* P
constint m_nNumParam; // 调用参数数量
! L  @$ `; _, J- \3 [constCALCPARAM* m_pCalcParam; // 调用参数数组
" S5 {4 ~% y/ v3 LconstDWORD m_dwReservedEx[4]; // 保留
) S$ d  t; M4 e# dchar*m_strStkName; //股票名称* s2 _2 g, m! D
SPLITDATA*m_pSplitData; //除权数据
1 L: ]$ q, {7 z1 l& ]intm_nNumSplitData; //除权次数# W7 W* B; {; \, F7 ?) F; }) i
}CALCINFO;' r( j0 t, Y2 |6 q( A; t& \
/*
3 R" z) i1 X9 X6 s4 B  _3 [1:(与分析家兼容)
  N8 {/ x9 a# A5 @, C' B4 Z; W0 O1.函数调用参数由m_pfParam1--m_pfParam4带入,若为NULL则表示该参数无效.
% o# g. `: f9 |' i) U9 b6 M2.当一个参数无效时,则其后的所有参数均无效.. Q" M/ q8 }) D7 o
:m_pfParam2NULL,m_pfParam3,m_pfParam4一定为NULL.
0 ~+ O$ s  @/ t! v; z3.参数1可以是常数参数或序列数参数,其馀参数只能为常数参数.
: Z/ V3 W- e, C5 Y7 b) d# D4.m_nParam1Start<0,则参数1为常数参数,参数等于*m_pfParam1;6 ~  J; F* ~: G  x' c& a4 h, K1 G
5.m_nParam1Start>=0,则参数1为序列数参数,m_pfParam1指向一个浮点型数组,* y& i+ @4 o6 z% i2 ]5 Q
数组大小为m_nNumData,数据有效范围为m_nParam1Startm_nNumData-1.! D1 q7 R2 y+ |9 F( x: m6 v. ?
在时间上m_pData[x]m_pfParam1[x]是一致的
. S! o1 B! k8 r! b2 _# `2:(飞狐交易师扩展)
1 H$ G8 A0 \+ s  S. H& m1.该扩展结构使调用参数在技术上可以是无限数目的,且每个参数都可为数值或序列,由公式中实际的调用参数决定。9 s" i! E2 w' H, D* P- p( f. j
2.CALCPARAM结构用于带入参数信息和实际数据,m_pCalcParam数组大小为m_nNumParam,数据有效范围为0 m_nNumParam-1.
, m5 f: P- c5 c- b3.按参数的顺序,m_pCalcParam[0]为第一个参数的数据,m_pCalcParam[1]为第二个参数的数据...,为了保持兼容,原m_nParam1Startm_pfParam15个属性依然有赋值。
: V  s1 X1 G. `7 {5 N5 x/ F4.i位置的参数为数值,取用m_pCalcParam.m_fParam.7 Q! H* i- u6 y" [. ^
5.i位置的参数为序列,取用m_pCalcParam.m_pfParam,数组大小为m_nNumData,数据有效范围为m_pCalcParam.m_nParamStartm_nNumData-1.m_pCalcParam.m_nParamStart<0,则此数组中无有效数据。. f  ]& I9 H  D0 i7 W1 V3 ]% i
6.由于可以调用多个序列,许多序列的计算可以先在公式中进行,然后作为调用的参数即可。
7 [! i% @1 }: V! }0 D7 @0 }7.经此扩展,对分析家的DLL依然可以调用、兼容。0 |% x5 C  Y& b9 \7 b
*/  n: a" ]; B) t
///////////////////////////////////////////////////////////////////////////////////
9 q% O, F9 @7 ?/*函数输出
# T1 a$ H8 i% c9 d3 B8 ^__declspec(dllexport)int xxxxxxxx(CALCINFO* pData);# q# M3 v; C; ~% ^4 k$ O
1.函数名称需全部大写.% R, Z3 E8 I  P. [4 y8 ^) ~. k8 q
2.函数必须以上述形式声明,请用实际函数名称替代xxxxxxxx;
9 U- ], q( {" A% D对于C++程序还需包括在extern"C" { } 括号中.& H" J8 r9 S- h: F, y2 R
3.函数计算结果用pData->m_pResultBuf带回.
/ I! ]* h* ]5 o' |9 _) \; D4.函数返回-1表示错误或全部数据无效,否则返回第一个有效值位置,:
, S- C3 c- Y, l0 [8 Im_pResultBuf[返回值]-- m_pResultBuf[m_nNumData-1]间为有效值.7 @5 W3 u, E5 b$ S6 |) K
5.函数名称长度不能超过15字节,动态连接库文件名不能超过9字节(不包括扩展名),动态库名称不能叫SYSTEM,EXPLORER
8 i( S2 m) [" j2 e, Q6 s*/' F0 l9 d4 h% w+ O# \6 ^+ L8 h
//示例函数,使用时用实际名称替换
4 P* C+ C; M/ P, Z__declspec(dllexport)int WINAPI MYMACLOSE(CALCINFO* pData);
7 G+ d, Z& `+ q/ [- b) j__declspec(dllexport)int WINAPI SMOOTH(CALCINFO* pData);
$ N1 k- R0 v4 k//__declspec(dllexport) int WINAPI MYMAVAR(CALCINFO* pData);
. N/ J- O" w7 w8 Y__declspec(dllexport)int WINAPI MYBBI(CALCINFO* pData);$ m% U5 F$ h" J6 V
//WINAPI = _stdcall; @" n; z% N* i* _2 S) |! h/ U
#ifdef__cplusplus
( |  |: a$ s% t}" H: g  r( I7 B
#endif//__cplusplus
7 S, z3 R# f. ^#endif//__FOXFUNC_H_INCLUDE. ?* z2 J: X6 y9 F2 O
# y/ H% ^6 J, n( P
//////////////////////////////////////////comment 注解6 b. d: N* F; t3 T  Y, i# `! T
__declspec(dllexport)int WINAPI MYMAVAR(CALCINFO* pData)% T5 S5 h' [6 ?( G: Y
pData是指向 址标总结构 CALCINFO的 总址标
* B. D9 B* S3 G& p9 \6 J5 t$ T取用第二个参数数值floatfParam = *pData→m_pfParam2 : M5 L, a& s$ B" A; y+ Q8 y4 D7 ?2 t
取用第一个序列参数的址标constfloat* pValue = pData->m_pfParam1;
$ L' O2 G5 v' a3 O; O取用股票数据长度intndata = pData→m_nNumData;
) i0 {! b" W8 l第一个参数存在且为数值pData->m_pfParam1&& pData→m_nParam1Start<0
4 ^/ |$ }! g& g: Q3 m第一个参数存在且为序列pData->m_pfParam1&& pData→m_nParam1Start>=0
( ]! @6 u2 @/ r6 e6 n1 x9 L; X1 @第一个及第二个参数存在且为序列,第三个参数不存在pData->m_pfParam1&& pData->m_pfParam2 && pData->m_nParam1Start>=0&& pData->m_pfParam3==NULL% O% {+ R6 j7 Q- s. ]' [
constfloat* cpParam = pData->m_pfParam1; 定义cpParam为第一个序列参数的址标
8 o( e4 o2 |- a- C6 @/ ?9 {取用股票数据结构6 p, h) t7 j' u# O
pData→m_nNumData= 变数数据长度
1 r) H1 r" T& n) Z. X8 Y! s  |, V6 SpData→m_pData= pointer to struc STKDATA 的址标
$ R9 _2 j9 ^5 T9 ?) P1 |1 k; c  p& tpData→m_pData[x]数据结构的第x个数据
5 b, z- N, _$ X, f# l& dpData→m_pData[x].m_fHigh数据结构的第x个数据中的 High$ R; ?& j. d( z: o, j
取用结果缓冲序列
1 h5 @+ X  C2 j8 @2 z% y5 C5 JpData->m_pResultBuf4 J* D' j' ^. K' \/ |( ^
取得第一个序列参数的起始序位,2,...5 , . 7...$ U% i( Y# T2 q; i7 b) b5 J
intnFirst = pData->m_nParam1Start; , e3 M' [8 C8 o" j7 |
for( i = nFirst+nPeriod-1; i < pData->m_nNumData; i++ )
; u& J. F% A' F) n5 a/ E* b取得第二个数值参数的数值9 u1 x# D: I2 Y2 k7 v
floatfParam = *pData->m_pfParam2; ; V) H) \. a. ?7 A
intnPeriod = (int)fParam;% o, _. e, m; a/ Y/ k5 k
取用第一个序列参数的址标constfloat* pValue = pData→m_pfParam1;
0 C% ?7 f' p; h3 M' x4 Q( N8 E取用序列参数的单个直pValue1 X  e- d4 |9 h9 V$ {8 E; F
取用缓冲序列的单个值pData->m_pResultBuf' Z5 s3 \1 p3 ~; H" S  L
constCALCPARAM* m_pCalcParam; // 调用参数数组
" D) R" E1 h& P. d( C7 }) Xm_pCalcParam为序列址标,指向各序列参数的指标7 B) @7 O2 d0 |. r% v, E
第一个序列参数pData→m_pCalcParam[0]
3 x* p* q0 V0 L2 w4 t, q! e9 \constfloat* m_pfParam; //指向序列参数的址标
% O+ `: y# A& v, ]; I& i第一个序列参数的起始序位pData->m_pCalcParam[0].m_nParamStart
& q) L1 O% c6 p% X) [. U第一个序列参数的址标constfloat* pValue1 = pData→m_pCalcParam[0].m_pfParam;
4 X6 I6 Q! O8 p- L3 Z/ U取用第一个序列参数的单个直pValue1
# k  h! a( z7 e* e) y9 F- v第二个序列参数pData→m_pCalcParam[1]
' l/ \- f& z! h! U( L第二个序列参数的起始序位pData->m_pCalcParam[1].m_nParamStart
2 @) Z0 D# a) N第二个序列参数的址标constfloat* pValue1 = pData→m_pCalcParam[1].m_pfParam;
3 Q4 Y  k/ A& Z9 n取用第二个序列参数的单个直pValue2' Q: G: U# D* S! ~# ^* I( O3 g6 N! e
第三个序列参数pData→m_pCalcParam[2]+ n5 I8 r" X# o$ q+ E  s) L8 Y
第三个序列参数的起始序位pData->m_pCalcParam[2].m_nParamStart
3 F  @, [) }" K$ V" u: h第三个序列参数的址标constfloat* pValue1 = pData→m_pCalcParam[2].m_pfParam;
2 m# N& D$ q$ q& }# a7 g取用第三个序列参数的单个直pValue3
% I  G' o2 O/ q( I9 f/ q& a第四个序列参数pData→m_pCalcParam[3]
  t5 v4 J, F( M% s( T3 Z( {+ B第四个序列参数的起始序位pData->m_pCalcParam[3].m_nParamStart
' }! O4 a9 L7 q9 i3 e/ `第四个序列参数的址标constfloat* pValue1 = pData→m_pCalcParam[3].m_pfParam;
3 `1 [# o# k( F% [5 A* P; x3 T取用第四个序列参数的单个直pValue45 g% {* ^! J# Z, e  }
如果有四个序列参数,则取用序位最高的那一个序位/ @- k; D( H, K, D$ W
if( pData->m_pCalcParam[0].m_nParamStart >= 0 &&
4 O) Z' y& L$ b' C9 ?& HpData->m_pCalcParam[1].m_nParamStart>= 0 &&0 \8 v, ?- J' z; W
pData->m_pCalcParam[2].m_nParamStart>= 0 &&- @, P( a& N& Q! s" ]" x
pData->m_pCalcParam[3].m_nParamStart>= 0 ) //4个序列都含有效数值7 \, t: |% e5 ^+ @
{
: r* v2 x9 F0 i4 q4 Q//计算返回的序列的第一个有效值位置2 q4 U4 j* {+ y" S/ |* H+ U( \; X
intnFirst = pData->m_pCalcParam[3].m_nParamStart;//已知返回的序列的第一个有效值位置与第4个序列一致2 }9 Y1 b6 L% I( L1 U9 @& y& }
//若不知,则; H* Q- z/ T5 I! T6 f3 F# C' z
/*
, ]7 a0 |7 e" u/ R6 \% ~intnFirst = pData->m_pCalcParam[0].m_nParamStart;
6 F9 R* q. F' Q% Wif( nFirst < pData->m_pCalcParam[1].m_nParamStart )
5 K1 B- r2 Y) f& R5 \nFirst= pData->m_pCalcParam[1].m_nParamStart;
" [- u% E$ N* u* _) R9 M5 z4 C  {' |if( nFirst < pData->m_pCalcParam[2].m_nParamStart )
8 P8 i$ ]- q1 GnFirst= pData->m_pCalcParam[2].m_nParamStart;& t$ J5 J4 i+ {/ L1 `0 w3 ~
if( nFirst < pData->m_pCalcParam[3].m_nParamStart )
' z+ h/ u5 D# inFirst= pData→m_pCalcParam[3].m_nParamStart;
6 k" g8 [( X7 E% [constfloat* pValue1 = pData->m_pCalcParam[0].m_pfParam;0 A, c; J) S* d( w
constfloat* pValue2 = pData->m_pCalcParam[1].m_pfParam;; |. s6 P' V' L
constfloat* pValue3 = pData->m_pCalcParam[2].m_pfParam;
0 \0 R( [# B) P$ [, |constfloat* pValue4 = pData->m_pCalcParam[3].m_pfParam;" b( t3 }9 V9 h0 c0 k
//-------------------
4 Y2 G9 d0 ~+ q* S! L2 d( [floatm_fOpen; //开盘 open1 P. ~$ w3 x; k4 X: G" y5 u
floatm_fHigh; //最高 high; ?7 O; _7 l. |& f( _/ {
floatm_fLow; //最低 low1 L; ?' k6 P* c. ^0 H- l( w
floatm_fClose; //收盘 close
  ?+ @+ D) ^# V6 N  i0 Q, Ufloatm_fVolume; //成交量 Volume
  a2 ^; N6 Q$ @: hfloatm_fAmount; //成交额 amount
1 y+ x; o4 p# d6 d: F- y7 T  S调用收盘据* U1 o5 x6 S4 y: x+ F% G
pData→m_nNumData= 变数数据长度0 q, Y( H1 Y3 k4 I$ v4 J, d: ~
pData→m_pData= pointer to struc STKDATA
7 U# d. v2 R+ A4 \2 VpData→m_pData[x]x个数据' H' C; c: P2 d0 q6 m9 R
pData→m_pData[x].m_fHighx个数据中的 High
, w# [5 R5 L) c& j@@@@@@@@@@@important !!!!!!!
- Z+ A( G/ g2 G. YsinceVC++ 2008, cl.exe will make ‘pData→m_pData[i-j].m_fClose’ anerror
. x5 b' `& c$ O/ [2 E( |, Xso,pass the high,low,open and close just from the function parameter ,that is use ‘ CALCPARAM’ struct" ^/ @% A5 n+ f, x$ d. A1 I
pData->m_pData[i-j].m_fOpen// to use open , there is no way in using a varable for calculationoutside foxtrader
) [1 S2 M7 U1 y# }7 \2 V: GpData→m_pData[i-j].m_fHighto use high
! E! C3 U+ w' s  j: E/ opData->m_pData[i-j].m_fLow
8 G; j4 ?$ L8 vpData->m_pData[i-j].m_fClose0 v3 f/ I) ]' v) W
m_pData= pointer to struc STKDATA* I; A9 K6 m+ {+ q% I3 \6 i0 P+ ]
incalling C++ dll function
- }% ^% {/ i' F8 s( Lm_pDatais passed to pData (CALCINFO* pData . A CALCINFO* type pointer)
. c5 D( c, ^! D  Z! @touse a single value in variable ‘High’- |/ R$ |* J7 X9 a5 r
pData→m_pData[i-j].m_fHighto use high" {  r& \8 L" f$ b0 m
constfloat* m_pfParam1; //调用参数1/pointer to variable parameter 1 1 `9 n" {$ H8 L, n# S; @. }% P0 Z
constfloat* m_pfParam2; //调用参数2/pointer to variable parameter 2
0 R6 t  H# L5 u, Q; Q! lconstfloat* m_pfParam3; //调用参数3/pointer to variable parameter 3& Y" ~. Y; U2 t- i
constfloat* m_pfParam4;
2 `9 Y6 {; i6 {* r8 E8 m2 I% um_pfParam1,m_pfParam2, m_pfParam3, m_pfParam4 = pointer to caller function 的参数2 ~5 W  i: g. F: z
pData→m_pfParam1= pointer to 第一个(序列)参数" U: f) {" d) j
pData→m_pfParam1[x]= 取用第一个(序列)参数的第x 个值
) J: I  U6 b6 B) s* D6 R7 _constfloat* cpParam = pData→m_pfParam1; =定义 cpParampointerto 第一个(序列)参数
% z4 x7 x3 x0 icpParam[x] = 取用第一个(序列)参数的第x 个值0 [( }! p+ [; j& O) H/ Q
m_pResultBuf= 结果缓冲列
, W7 I! W% Q9 k8 r+ npData→m_pResultBuf= pointer to 结果缓冲列
0 r0 Q! q: k  q) |pData→m_pResultBuf[x] = 取用结果缓冲列的第 x个值
3 V* o: J+ |2 _//////////////////////////////////////////comment4 s; M# w, }! ?
//////////////////////////////////////////comment 注解% n  `! z" B% |9 n! O  @- B$ N1 C
constint m_nParam1Start; //统杅1衄虴宎弇离1 v. ~: h. o  z. g/ d4 G
constfloat* m_pfParam1; //覃蚚统杅1
6 N5 h! y+ i0 dconstfloat* m_pfParam2; //覃蚚统杅2
6 \% N4 I, V% r$ zconstfloat* m_pfParam3; //覃蚚统杅32 h; `2 [  _% C5 U- H
constfloat* m_pfParam4; //覃蚚统杅4,parameters must be <= 4
3 q3 s6 V6 g6 a8 v6 a//const float* m_pfParam5; // parameters must be <= 4& r7 g% s- Q$ H. @. h2 n
//const float* m_pfParam6; ! K( F: r& w' @
//const float* m_pfParam7;
7 }0 c( k' T8 e) [2 G//const float* m_pfParam8;5 h6 P. h/ L$ f9 S) E$ O* x6 N
//pData->m_pfParam1 && pData->m_pfParam2 &&pData->m_pfParam3 && pData->m_nParam1Start>=0 &&
' X( k. ~! f7 Z! vpData->m_pCalcParam[0].m_nParamStart>=0&& pData->m_pCalcParam[1].m_nParamStart>=08 [" C6 X9 M: S( o; L: z( q
&&pData->m_pCalcParam[2].m_nParamStart>=0)
5 j# p+ T4 \- B" x{
- G0 f1 f  {; R9 wfloatfParam = *pData->m_pfParam4; //pointer ,pData->m_pCalcParam[3].m_nParamStart >= 0
: ?! _# `$ E6 `" ^: S) p7 rintnPeriod = (int)fParam; //统杅1
* j: \! E0 H, y1 |- v+ \' v3 J//const float* cpParam = pData->m_pfParam2; // cpParam = pointer to第一个序列参数,cpParam = 取用第一个序列参数的第i 个值: _2 e1 j7 w8 t) `2 a
constfloat* cpParam1 =pData->m_pCalcParam[0].m_pfParam; // cpParam =pointer to 第一个序列参数,cpParam = 取用第一个序列参数的第i 个值! C# w$ f+ j# L3 z, I& N
constfloat* cpParam2 =pData->m_pCalcParam[1].m_pfParam; // cpParam =pointer to 第一个序列参数,cpParam = 取用第一个序列参数的第i 个值- N% O! M* i, a/ W) g
constfloat* cpParam3 =pData->m_pCalcParam[2].m_pfParam; // cpParam =pointer to 第一个序列参数,cpParam = 取用第一个序列参数的第i 个值//parameters must be <= 4, O& ?- D; o( `! z# j6 E
//const float* cpParam4 =pData->m_pCalcParam[3].m_pfParam; //cpParam = pointer to 第一个序列参数,cpParam = 取用第一个序列参数的第i 个值% Y+ l  y! V$ ~
//const float* cpParam5 =pData->m_pCalcParam[4].m_pfParam; //cpParam = pointer to 第一个序列参数,cpParam = 取用第一个序列参数的第i 个值
/ l" G2 O9 Y/ N7 o9 Z" {//m_pData = const struct pointer to struct STKDATA , pointer to structSTKDATA ,
8 T# ?0 k) S5 L/ \touse pData→m_pData[x].m_fClose
/ L4 z1 t6 F, @& S6 h! H: c2 Z$ upData→m_pData[x]= | 1,2,3 , … , m_nNumParam | time_t m_time; 1 U7 m1 `; e( L& s
|1,2,3 , … , m_nNumParam | float m_fOime_t & w7 \# U3 A$ B8 U; X$ `6 r
|1,2,3 , … , m_nNumParam | float m_fHigh;; T/ O: b9 B5 j  @! u5 ~& a* h
.. .
7 \( M- h. _" v& I|1,2,3 , … , m_nNumParam | WORD m_wDecline;: w8 G( e7 l- d2 X
m_nNumParam= 数据high,close,open,low的长度, A2 N0 l! x$ M1 a$ X" H7 \
touse high:
4 y; ]3 r8 a* _7 f2 apData→m_pData[x].m_fHigh& k. ?+ a: r4 n- w
contentof struct STKDATA
4 d4 g  O) J5 T8 t1 y! I8 Itime_tm_time; //时间,UCT
* [$ A* ]- t  |floatm_fOpen; //开盘 open
+ f) P7 t# ^, t/ L  ~) l6 efloatm_fHigh; //最高 high. U' E0 J% v, _* f' r' E3 o
floatm_fLow; //最低 low7 ?5 A2 q6 A8 M" m
floatm_fClose; //收盘 close/ P+ y$ l( `2 i5 A7 O* K
floatm_fVolume; //成交量 Volume8 C9 Q$ D. `4 L9 c8 Z6 O& q! r
floatm_fAmount; //成交额 amount; J" @9 z9 d& C3 N( Y  J  W
WORDm_wAdvance; //上涨家数 仅大盘有效6 H1 K3 q% Y3 M9 l' v! u# ^% H" K
WORDm_wDecline; //下跌家数 仅大盘有效
0 X2 ~9 r- U% B+ g调用传递参数及传回结果
. Y) m$ V0 v! S4 ?3 I! K调用传递参数5 ~! |+ o7 r! o" {' Y
(pData->m_pfParam1 && //参数1有效Param1exists& ]  g6 g9 g6 ]* L' }% K. S1 Y: x
pData->m_nParam1Start<0&& //参数1为常数
+ i) {2 j2 J+ ^/ X$ J0 mpData->m_pfParam2==NULL) //: }- K% b; V9 r( H# c: S2 V/ _
localprocedure 定义使用变数* l; D' {: Q9 e* Z: h* \' |& z2 X
onstfloat* pValue = pData→m_pfParam1; //use constant参数1
5 i- ]7 c* s/ L' G4 {! yintnFirst = pData->m_nParam1Start; //use 参数1效值起始位
! P& P  i; w5 L6 c& yfloatfParam = *pData->m_pfParam2; //use 参数2
. n" N! J" D2 n0 ]3 p$ pintnPeriod = (int)fParam; , b+ r: v, C* E: g+ D! w* X) b. f
传回结果
& u# w; O, g  H2 s6 e; ^fTotal+= pValue[i-j];( B5 W0 z3 C4 A( K+ @2 n/ O
pData->m_pResultBuf6 ~8 G* P' U8 ], T. j
//////////////////////////////////////////comment

评分

1

查看全部评分

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

本版积分规则

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

GMT+8, 2026-9-3 19:17 , Processed in 0.166692 second(s), 19 queries .

Powered by Discuz! X3.2 Licensed

© 2001-2013 Comsenz Inc.

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