阳光飞狐

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

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

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

[复制链接]
跳转到指定楼层
1#
发表于 2019-8-11 16:09:40 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
许多年以前,我曾经在
9 J/ \: |& K( }9 z3 ~: q1 m理想公式区发布了# q/ E, g1 k0 J
"
* y: H/ B' t( K) L; ^" Y如何用 Foxtrader(飞狐)连结 C++动态程式库 DLL及 80x86Macro Assembly (组合语言)
& F0 x) r6 R. v- E+ m" n) o"
3 E/ x% @) F! w0 K, D& x; v( I+ l7 ~0 P- j5 G* o" u1 `" O7 i
现在更新foxtrader(飞狐交易师)
$ f4 f3 z+ r5 ~, R: \
连结 DLL的方法
8 s1 H5 M% p) G$ Q" z/ r6 [" ?5 `# X, i5 e3 c6 h0 {
foxtrader- - > DLL (C++ and assembly) = ( foxfunc.h + foxfunc.cpp +pow10.asm )6 w4 P$ g# X; ^" s+ |
gauss- - > DLL (C++ and assembly) = ( foxfunc.cpp + meigj.asm )
4 \$ P7 J; M/ \' \gauss只用到函数参数传递,所以使用新的 c++compiler, 不受影响0 |0 E- ~5 C( U8 b, z8 P  R
foxtrader的 foxfunc.h宣告的结构型态 (struct)在 2004vc++ 6.0 全部有效+ G9 ?, n# p; N

6 C- \, f* R/ ~也就是这五个结构都能用
7 ?9 b- z+ x  V  T  e1 i, C6 u+ ftypedefstruct tagSTKDATA 2 A, r% M8 M1 `8 D+ ^0 e$ p" [; x
typedefunion tagSTKDATAEx; T5 k4 R1 K5 B
typedefstruct tagSPLITDATA 9 m5 Y- Y7 g" @$ b, Y6 Q2 r8 Q
typedefstruct tagCALCPARAM- @+ a* K- o# G8 e8 T2 @
typedefstruct tagCALCINFO
+ _; _: l. \* k8 u0 [9 N  u1 \: h2 X1 [/ N, R4 h1 g1 D  R6 w5 \* t
自2008年起,vc++ 2008, vc++ 2010, vc++2017 对struct的编译,已经完全 c++化,不再相容于 C) F8 |, V/ S& v- j0 f
也就是这五个结构中
8 |' D" O& @" {  D& [( }typedefstruct tagSTKDATA + e2 u6 Z. b2 t4 v. x
typedefunion tagSTKDATAEx
3 v1 g; D0 C" x( d6 v0 t; O2 Otypedefstruct tagSPLITDATA % _4 u1 ^7 g  B
typedefstruct tagCALCPARAM. i9 ?( \' e% q* {' v# u' ]
typedefstruct tagCALCINFO0 K' m9 Z+ b4 A5 G
只有这两个可以用, M0 ?3 R: E- n) s: D
typedefstruct tagCALCPARAM2 ]" U0 _$ A# `% ]
typedefstruct tagCALCINFO, g, h3 q1 F6 Q/ [0 s2 N- U
值得庆幸的是,下面这个结构的函数参数传递个数可以有无数个4 Z$ i: ^! Q9 e- Z* k. G" X+ d
typedefstruct tagCALCPARAM
7 M$ B) k8 d7 |" B3 o例如:在 foxtrader中* N% x# N/ _5 B" ?2 [
MA1:=MA(CLOSE,3);
/ x" N8 C3 |! j/ NMA2:=MA(CLOSE,6);2 A6 j" l7 X5 ~; ?& Q. C& W
MA3:=MA(CLOSE,12);$ }7 y, K$ P- w7 [, M0 G
MA4:=MA(CLOSE,24);
0 B0 W3 s, r4 K7 QMYBBI1:"MYFUNC2017@MYBBI"(MA1, MA2,MA3,MA4,MA3,MA4,5)*0.95,colorff00ff,linethick3; {2017 vc++ 15.0}
4 _6 O9 r" I# o4 l9 d% U其中MYFUNC2017=MYFUNC2017.dll, MYBBI = MYFUNC2017.dll 中的MYBBI函数,这里 MYBBI函数传递的参数共有 7个# K: Q0 F; n1 g, w
下面这两式计算结果相同
8 N& j' X7 Z, _  Q; ~) q4 A4 S9 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 自行计算}2 C/ @$ O$ d; [7 }  |4 `% f3 q
MYBBI1:"MYFUNC2017@MYBBI"(MA1, MA2,MA3,MA4,MA3,MA4,6)*0.95,colorff00ff,linethick3; {2017 vc++ 15.0 , dll计算}
+ F5 n  M, h+ K8 k其他例子+ E4 P: F3 `+ p
oooq:="MYFUNC2008good@MYMACLOSE"(c,,c,c,6),colorffffff,linethick5;(---> pow10.asm)9 _% V0 ^3 \1 c! \; c! L$ A% M! i
oooq1:"MYFUNC2010@MYMAVAR"(ma(c,5),5),colorgreen,linethick5;
( k& F2 `1 ?2 C7 V  _# k其中pow10.asm里面有很多不同定义或宣告被注解不用,那是因为后来在逐步侦测法修改语码中才发现在foxfunc.cpp主程式中,下面这行错误,也就是新的 compiler不再相容于 C,因此在pow10.asm里面被注解不用的定义或宣告中,有些应该是可以用的
! x% X6 J0 M$ `$ v' b( k2 [( e' V: a( L2 WfTotal= pData->m_pData.m_fClose; // @@@@@@@ vc++ 2010 cl.exe 使pData->m_pData[i-j].m_fClose错误
7 v. C+ i! p0 L
9 n4 K, r; }5 S& `9 j8 D
- O  V$ i" {5 q) x+ [( i" q////////////////////////////////////////////////////////foxfunc.h
- P' l2 P; {* m1 P2 K' Z; @. c#ifndef__FOXFUNC_H_INCLUDE
% S6 X, t. y; A. P6 @2 w#define__FOXFUNC_H_INCLUDE% B. @; ^) s& M5 a. d, H
/*3 Z0 s" O- i/ f( K7 q. v% o' I
飞狐交易师“C语言接口”扩展程序调用接口规范V3.0. q7 q; H! K4 M+ E7 Y3 C, G
1.本规范适用于飞狐交易师V3.x公式系统." p: L# z/ d3 B" _5 ^
2.扩展函数用于实现系统函数不能实现的特殊算法.
1 W' I8 V7 M# q" X0 K3 S; Q& o  a3.扩展函数用windows32位动态连接库实现,建议使用MicrosoftVisual C++编程." Z0 F/ p7 r/ g+ `% P4 Y
4.调用时在公式编辑器中写"动态库名称@函数名称"(参数表)即可,例如下面函数可以写为"FOXFUNC@MYMACLOSE"(5)$ a! m! M6 c$ @) g7 L
5.动态连接库名称和函数名称可以自己定义.% ^( i/ R8 S7 I# w: v) |6 k6 X; [
6.使用时必须将动态库拷贝到飞狐交易师安装目录下的FmlDLL子目录下使用.
) c) l! o6 z9 C*/+ n' K3 e: o" `) A1 N9 G$ \& O
#ifdef__cplusplus
) M7 S9 ?5 D) jextern"C"- I! z. }! K3 X. R$ R$ U- J7 `( N
{
) m6 s# R2 g  g6 q3 i- P#endif//__cplusplus
7 f; N1 [2 r  h8 c( B. k9 t4 T: y9 K* \///////////////////////////////////////////////////////////////////////////
8 }$ Y' j- s! T4 w//分析周期
- Z2 z9 i2 J$ s0 x2 A% [4 r# aenumDATA_TYPE
6 l9 e; \# x& U# `; z- Q  f  Q{& Z7 _7 j8 V: {/ M+ e8 `+ h
TICK_DATA=2,//分笔成交: M7 _  N8 C2 i/ W% V- ~
MIN1_DATA,//1分钟线
5 Y' [2 n) b+ I1 w0 BMIN5_DATA,//5分钟线 3 n, C! Y9 }* Y) m3 r9 ^- T
MIN15_DATA,//15分钟线
/ D3 y7 o* r3 DMIN30_DATA,//30分钟线1 N, u" Z* T. V! R/ r* e
MIN60_DATA,//60分钟线
' z% P7 _, J* _9 [2 m7 pDAY_DATA,//日线
( @' o1 G4 s( {+ V2 k! p. {3 KWEEK_DATA,//周线
9 Z. M+ [- Y& e( y) k/ R# F7 M  ^MONTH_DATA,//月线1 p  m0 s* ]5 W, w) ]1 b& y+ |
YEAR_DATA,//年线
0 s  D. d6 V. |5 a6 MMULTIDAY_DATA,//多日线0 s8 |1 [/ Z7 E; K' a" g4 J
MULTIMIN_DATA//多分钟线
) U1 {+ |% Q, ?- ]/ N) c" L};
) y. x4 t8 e2 [( p  E8 S7 z# [, b///////////////////////////////////////////////////////////////////////////4 G' Q% k: b/ n2 f2 m+ ~
//定义取用股票基本数据的结构 只有 VC++ 6.0 能compile成功使用
5 r+ f, i) I' f& L+ j4 l1 I  H. Q* Atypedefstruct tagSTKDATA " n7 R- h/ m1 S; V; z9 o6 _
{
' a9 I  s( H; F0 l$ i1 G_tm_; //时间,UCT
* M9 O' }/ R) I) p$ b4 c: ?' L+ wfloatm_fOpen; //开盘 open3 h% e' q/ T6 N1 D2 Y- M$ u- j
floatm_fHigh; //最高 high9 k5 t1 w* D. Q) w, ~, _* {3 g
floatm_fLow; //最低 low
7 N3 s. Q# P6 E8 T! a5 z  M8 xfloatm_fClose; //收盘 close) z# P  W* Z8 `4 P+ ?
floatm_fVolume; //成交量 Volume
# @6 I3 O6 v) |9 B% k# a' b* b: nfloatm_fAmount; //成交额 amount* H& }9 q" x% G" `6 H. w
WORDm_wAdvance; //上涨家数 仅大盘有效( R6 S7 ~1 A6 I+ z/ V+ m
WORDm_wDecline; //下跌家数 仅大盘有效
! s7 B5 B; }( {4 X% N' z}STKDATA;
7 W9 N* H6 f  n3 E# Y% a8 \4 x定义STKDATA为 tagSTKDATA的简单别名,STKDATA
# P5 c: k: v9 M6 C9 t9 ^+ O为真正方便使用名称,tagSTKDATA 为定目的的过水名称7 X0 R: S5 I8 L6 P3 {- N# |
////////////////////////////////////////////////////////////////////////////: N5 s* H. H/ E& o4 \. T5 k3 \+ u( U
//扩展数据,用于定义取用分笔成交数据的买卖盘 的结构2 w" m$ H, ~! {  }% v( J
typedefunion tagSTKDATAEx
/ K& @: @4 a" R, S( V& X{% C( x. ]7 I; O/ s
struct
0 A: f- q  y* p" f  x, d{
# P  q( V, q# x  y0 tfloatm_fBuyPrice[3]; //买1--买3价floatm_fOpen; //开盘 open5 P4 A: o$ N' y
floatm_fHigh; //最高 high
& u; I- l$ x3 H1 Hfloatm_fLow; //最低 low- F/ v' F8 Y9 y- O
floatm_fClose; //收盘 close
! o5 [8 N% w4 efloatm_fVolume; //成交量 Volume
- A; Q% N5 p; {+ K' }floatm_fAmount; //成交额 amount7 j, F1 d5 K6 y7 a% A, V
floatm_fBuyVol[3]; //买1--买3量
+ u) Y% `. P8 @9 I" I' xfloatm_fSellPrice[3]; //卖1--卖3价
9 v; _6 c8 P3 M6 K0 P7 {floatm_fSellVol[3]; //卖1--卖3量6 G1 m1 ~" w, W1 n
};  v; q2 D% D% A4 h; g
floatm_fDataEx[12];/ V( o9 S/ s) P4 Y5 v4 D
}STKDATAEx;2 W' W! T) u6 l, s
////////////////////////////////////////////////////////////////////////////, x% x! i) g6 B& }1 c
//定义取用除权数据的结构7 Y+ F; F. b+ U
typedefstruct tagSPLITDATA
! [- H( O- K# Q& ?6 e5 U{
$ `7 x8 U4 l) dtime_tm_time; //时间,UCT
% Q: a. N0 t" J* f& bfloatm_fHg; //红股
& x! E  D( Z* E4 y$ W  `floatm_fPg; //配股
2 Z" P, [# [0 }) d0 Tfloatm_fPgj; //配股价
/ A* I8 A' ^9 B3 i4 n' d3 Gfloatm_fHl; //红利% v; B0 x; ]- f0 D7 b- V# U4 l. b- A/ i
}SPLITDATA;
0 W+ |9 [7 z7 E7 v, A8 k/////////////////////////////////////////////////////////////////////////////  u$ I5 A! v( x& {/ b! k
/*财务数据顺序(m_pfFinData内容)
7 f+ D) u1 Z, u4 G+ E序号内容4 e" B! S4 o4 b
0总股本(万股),
' y0 B& W# T$ P) ~1国家股,
! v( d/ x7 s, n" h2发起人法人股,
9 \4 r8 E0 j' h3法人股,
* n1 ?. W2 \0 z9 ]" t, L4B股,1 K( s' x) `& K0 t' ^
5H股,, o+ E7 f9 U( V  ]: i) G
6流通A股,+ Y# p$ Q4 R2 R
7职工股,
; r5 b6 N/ T( A2 T, R8A2转配股,
( y. }) i- h/ y) L6 N8 }% R6 f9总资产(千元),% ?% X: h: E4 K. ^4 Q, H8 z
10流动资产,7 @3 \- C' Y; ~3 _* ?4 Y( |3 r
11固定资产,
- ~7 W! Y& t& m' u5 T) f12无形资产,$ C) A* l7 m7 R4 b
13长期投资,
2 P6 W) F3 x! I6 k6 K7 A% Y14流动负债,0 w) U- X5 x1 @; x2 Z1 K
15长期负债,, J5 r8 ?0 @% `, b
16资本公积金,
  V1 `& ]- m. M0 ~5 d+ E: N17每股公积金,
, @' K) ^, \5 D+ V18股东权益,% ~* p9 v" }& C0 E
19主营收入,
" ~4 P( x' [4 L20主营利润,
! r/ T* _. b# X4 ^+ @" W21其他利润,9 M- t& W- t% x' d
22营业利润,( n' X: |/ E1 F4 \
23投资收益,
2 Y7 v$ F" M1 |" {! T24补贴收入,
* v% |; \8 D- _0 K25营业外收支,
# ~* M1 S+ A4 i, c26上年损益调整,
% m) ]7 c6 S$ @1 F7 v2 Z7 H27利润总额,- }) B6 p3 p7 C8 x6 I2 }
28税后利润,
, X0 A: [% i  Q+ q' t29净利润,6 K7 |4 G1 b0 a# }
30未分配利润,  X- ?5 I$ s. m8 [6 e
31每股未分配,
$ \/ a, y! z7 `7 e& c. c1 G2 g32每股收益,
3 m- o- `# U* X7 z% M; [- t33每股净资产,
: w/ {0 \( R) [* u34调整每股净资,, ~. Q! t7 _" V7 \7 t: n6 L
35股东权益比,
$ R$ \/ |4 [. v9 L7 u36净资收益率
; O9 I% N6 n0 q*/1 e7 p  c4 N2 [! u
/////////////////////////////////////////////////////////////
9 B0 q6 ^! t3 V' h/ |//定义取用caller函数传递参数项 的结构
% A# {6 ?: L0 s/ Ttypedefstruct tagCALCPARAM
9 c- N# A' M# n' J{! Q; c: B, _/ u  F
union
) S+ p& L8 s+ x{4 Q  s) w( c7 E# d, W1 l2 _* J
constfloat* m_pfParam; //指向序列参数的址标,指向一个浮点型数组pointertofloat variable parameter / ex. c,h,l,o, co2...co2=(c+o)/2
4 ]2 \7 L2 o  ~; p# F7 Cconstfloat m_fParam; //数值参数 valueof parameter- Z8 T- z. R1 S# O& V
};7 E8 p. t7 C: S# p* b
constint m_nParamStart; //序列参数有效起始位置thestart address of variable parameter / ex. c,h,l,o,co2.....
( R% T5 i$ E. R( a}CALCPARAM;
$ ], H2 b- h0 B& s; p/ G/////////////////////////////////////////////////////////////////////////////& v, u  ^/ V' _( ]1 K7 r" H; @0 Z  p
//定义全部取用址标 的总结构 (各指标指向前述各结构以便取的各结构的数据,接口信息数据的结构 )
9 q' @- e+ A4 A0 c, R2 @1 Ctypedefstruct tagCALCINFO
. L7 M$ `/ w* a4 K$ Y{: H9 Q5 ]+ A' ?9 q1 U
constDWORD m_dwSize; //结构大小
5 G  v; z6 i4 X! cconstDWORD m_dwVersion; //调用软件版本(V2.10: 0x210)$ [8 w+ F6 F1 ~6 E) Z
constDWORD m_dwSerial; //调用软件序列号
8 y. s% x2 h% H$ U8 Jconstchar* m_strStkLabel; //股票代码
3 R7 M1 Y9 \5 E" g6 ZconstBOOL m_bIndex; //大盘
2 G5 K; n2 @+ b# A% [% vconstint m_nNumData; //数据数量(pData,pDataEx,pResultBuf数据数量)数据长度& G) j: O1 @3 `" K* e
constSTKDATA* m_pData; //常规数据,注意:当m_nNumData==0时可能为NULL
/ s- F' `% w' I( _# n. [8 [constSTKDATAEx* m_pDataEx; //扩展数据,分笔成交买卖盘,注意:可能为NULL
. w% g/ _4 i/ j$ Q% z9 bconstint m_nParam1Start; //参数1有效起始位置<0/ constant parameter >0 /variable parameter 1 S5 S! R4 O4 {* z) @# }& O3 |
constfloat* m_pfParam1; //调用参数1/pointer to variable parameter 1 " H- }; L8 S  f, Q
constfloat* m_pfParam2; //调用参数2/pointer to variable parameter 20 C  f7 O9 Z1 |3 Y0 ^- T- L
constfloat* m_pfParam3; //调用参数3/pointer to variable parameter 3* H1 G6 i3 R, V! J: n# t4 y, o) @! ^
constfloat* m_pfParam4; //调用参数4/pointer to variable parameter 4
4 S' W7 m8 u$ J# f# A3 S8 F+ f# l- ?- Afloat*m_pResultBuf; //结果缓冲区% f3 p( }$ v9 ^% b
constDWORD m_dataType; //数据类型) c* i8 w) s. n
constfloat* m_pfFinData; //财务数据; z! i9 r2 u) R, d
//以上与分析家兼容,所以沿用其结构和名称
9 s, M, y+ X/ U% A& p//以下为飞狐交易师扩展(fortagSTKDATAEx)& D& M& V+ T  [  x
constDWORD m_dwReserved; // 保留% V% H; \+ k$ T9 m6 r
constint m_nNumParam; // 调用参数数量. p3 z8 B" {, F. c$ w: E
constCALCPARAM* m_pCalcParam; // 调用参数数组
" C, d+ }: \7 T- \3 K- U3 m. q. b0 |6 fconstDWORD m_dwReservedEx[4]; // 保留
, p# ~9 T: h6 T' echar*m_strStkName; //股票名称
0 m! d  g( c7 i; o$ w, uSPLITDATA*m_pSplitData; //除权数据
9 P: d9 E3 W9 F4 eintm_nNumSplitData; //除权次数% Q! }- `& K/ M& P! F8 i. Z
}CALCINFO;
# K: s9 x- d( l! k2 `. O6 l/*
0 v. v% `5 L6 ~- R  R. s注1:(与分析家兼容)8 Q7 k4 X. g# R. }7 m
1.函数调用参数由m_pfParam1--m_pfParam4带入,若为NULL则表示该参数无效.$ i& X$ a6 l, }5 A0 e2 I& G
2.当一个参数无效时,则其后的所有参数均无效.
) s$ ~0 m9 V( G+ A如:m_pfParam2为NULL,则m_pfParam3,m_pfParam4一定为NULL.  S0 @* e5 k3 v/ z8 T2 w6 ^
3.参数1可以是常数参数或序列数参数,其馀参数只能为常数参数.
; k! T+ y; r' U: y4.若m_nParam1Start<0,则参数1为常数参数,参数等于*m_pfParam1;
- j. c2 }, J- R/ c; c4 Y- q5.若m_nParam1Start>=0,则参数1为序列数参数,m_pfParam1指向一个浮点型数组,
$ J* Q4 @- X/ u' ^+ A数组大小为m_nNumData,数据有效范围为m_nParam1Start至 m_nNumData-1.% j' q3 W& F  B* p/ b3 ~' P
在时间上m_pData[x]与 m_pfParam1[x]是一致的
2 c9 `$ `  q5 q2 j* ?. D% e注2:(飞狐交易师扩展)
$ g! y  ]. V! S- K1.该扩展结构使调用参数在技术上可以是无限数目的,且每个参数都可为数值或序列,由公式中实际的调用参数决定。$ ~5 U0 P9 ?/ V" j0 }
2.CALCPARAM结构用于带入参数信息和实际数据,m_pCalcParam数组大小为m_nNumParam,数据有效范围为0 至m_nNumParam-1.3 _4 f" a% g5 u8 _. W( i2 |4 G
3.按参数的顺序,m_pCalcParam[0]为第一个参数的数据,m_pCalcParam[1]为第二个参数的数据...,为了保持兼容,原m_nParam1Start、m_pfParam1等5个属性依然有赋值。6 L3 ]5 S- W2 i/ x' i
4.若i位置的参数为数值,取用m_pCalcParam.m_fParam.
4 H+ D1 J) K5 X9 a9 I) D5.若i位置的参数为序列,取用m_pCalcParam.m_pfParam,数组大小为m_nNumData,数据有效范围为m_pCalcParam.m_nParamStart至 m_nNumData-1.若m_pCalcParam.m_nParamStart<0,则此数组中无有效数据。
9 [  Q, {3 q# Y  m! [" v( ?$ e6.由于可以调用多个序列,许多序列的计算可以先在公式中进行,然后作为调用的参数即可。
: v2 h1 W% M4 G6 z/ C9 _; x* L7.经此扩展,对分析家的DLL依然可以调用、兼容。( k/ a) Q) ?3 o% L& V
*/
' Q" n2 O; V2 |, t- M///////////////////////////////////////////////////////////////////////////////////
1 Y9 q' w5 L8 f/*函数输出7 J  N3 A* H3 }
__declspec(dllexport)int xxxxxxxx(CALCINFO* pData);" Q0 r) r8 ~5 h. v+ s4 u
1.函数名称需全部大写.
0 }) }' W4 U' P' n: b& T1 u2.函数必须以上述形式声明,请用实际函数名称替代xxxxxxxx;
3 E0 g/ \3 S9 Q$ S$ r( ]对于C++程序还需包括在extern"C" { } 括号中.8 M; [) Y* G8 r8 o+ y  L/ U; a+ m
3.函数计算结果用pData->m_pResultBuf带回., u7 F; U, U2 d' F+ g! {' _& J" H
4.函数返回-1表示错误或全部数据无效,否则返回第一个有效值位置,即:  z# q1 {$ O7 ?: O% i- C3 N
m_pResultBuf[返回值]-- m_pResultBuf[m_nNumData-1]间为有效值.
4 D% [8 z( c, _+ s5.函数名称长度不能超过15字节,动态连接库文件名不能超过9字节(不包括扩展名),动态库名称不能叫SYSTEM,EXPLORER
! B7 O3 R3 K- v) U*// X$ `; L# f" K. ~9 a
//示例函数,使用时用实际名称替换4 [9 J. I, C( I) H  B5 Z
__declspec(dllexport)int WINAPI MYMACLOSE(CALCINFO* pData);$ p4 E8 z+ M0 F9 E9 q* l. \5 F
__declspec(dllexport)int WINAPI SMOOTH(CALCINFO* pData);
7 `. s; k- I- ]; O4 r! a//__declspec(dllexport) int WINAPI MYMAVAR(CALCINFO* pData);
) [8 a9 k2 \0 U' S9 g2 W4 C% S3 Q, [__declspec(dllexport)int WINAPI MYBBI(CALCINFO* pData);9 p! @0 T# J) n( R3 i) k" k/ j
//WINAPI = _stdcall3 M& d9 M  |: O& L8 {/ J! t8 F
#ifdef__cplusplus: E9 B3 [& y8 G. V0 [& \' ^! d
}
0 L! ], K+ ^3 H#endif//__cplusplus9 B$ s; {  Y0 v% X2 n
#endif//__FOXFUNC_H_INCLUDE' o! P, C; A4 m& G3 n
% o( U7 W" n; m$ X* N. P. o
//////////////////////////////////////////comment 注解
0 i5 P4 Z' F9 _$ ?3 L2 s__declspec(dllexport)int WINAPI MYMAVAR(CALCINFO* pData)
& W: S) _- L: ~2 `- g5 _& q" apData是指向 址标总结构 CALCINFO的 总址标
( L8 H3 R% F2 w3 Y4 M0 @( N- k取用第二个参数数值floatfParam = *pData→m_pfParam2
, l  h, Q) G* O# Q7 j+ i取用第一个序列参数的址标constfloat* pValue = pData->m_pfParam1;& C, j) {2 X4 X$ l  t
取用股票数据长度intndata = pData→m_nNumData;
; {0 b& r! p. |" b) h) k% v- e% R第一个参数存在且为数值pData->m_pfParam1&& pData→m_nParam1Start<0( ?7 i% o  p* x. T# z; v& B7 K
第一个参数存在且为序列pData->m_pfParam1&& pData→m_nParam1Start>=0# A+ E/ U' e4 T% ~
第一个及第二个参数存在且为序列,第三个参数不存在pData->m_pfParam1&& pData->m_pfParam2 && pData->m_nParam1Start>=0&& pData->m_pfParam3==NULL
2 ^# p9 u) v* F! S: |( fconstfloat* cpParam = pData->m_pfParam1; 定义cpParam为第一个序列参数的址标
! \6 c! D: g# t& _取用股票数据结构
& n! n: u/ L6 J5 K& |" apData→m_nNumData= 变数数据长度
$ M" g- u4 U7 w3 {  p3 D2 zpData→m_pData= pointer to struc STKDATA 的址标! E6 a% Y- d+ v5 }
pData→m_pData[x]数据结构的第x个数据: A9 F6 c% B$ J' ?, q* d# H6 x2 W6 e4 V$ c
pData→m_pData[x].m_fHigh数据结构的第x个数据中的 High6 I% w! p: _) N7 g8 `# o
取用结果缓冲序列7 V8 }+ J/ i6 }8 u" g% b
pData->m_pResultBuf
) g1 g/ D; x( d' @. R1 D取得第一个序列参数的起始序位,如 2,...5 , . 7...  E9 O; p8 ^; z) P1 i5 r" n8 B/ I! w& N
intnFirst = pData->m_nParam1Start; ' n5 X1 R( J; l$ W* l& f
for( i = nFirst+nPeriod-1; i < pData->m_nNumData; i++ )- f7 d4 U- w' p3 t  w
取得第二个数值参数的数值
0 P/ F' J+ {# b  W2 }7 Y4 ifloatfParam = *pData->m_pfParam2;
; m# s5 [# Z2 Z, O/ n/ u8 Q. U% TintnPeriod = (int)fParam;
4 @+ v1 @1 H; X1 L取用第一个序列参数的址标constfloat* pValue = pData→m_pfParam1;' a% P& W1 c7 ?; N) ^( {7 \
取用序列参数的单个直pValue
4 V$ m( [: u: F' a/ A5 U取用缓冲序列的单个值pData->m_pResultBuf1 e. ~" }: [( Q5 t0 A& e
constCALCPARAM* m_pCalcParam; // 调用参数数组
: Q8 I' w, S$ i6 R' [1 @  am_pCalcParam为序列址标,指向各序列参数的指标
9 K2 G- Y; P( l第一个序列参数pData→m_pCalcParam[0]4 A* d4 K* h2 f" V7 Q: W$ J: I
constfloat* m_pfParam; //指向序列参数的址标  G! C. X2 Q- z
第一个序列参数的起始序位pData->m_pCalcParam[0].m_nParamStart8 u2 O9 |9 v5 F  _
第一个序列参数的址标constfloat* pValue1 = pData→m_pCalcParam[0].m_pfParam;
2 _/ p3 m& u" G+ a. H5 L9 p# J" t( O! r取用第一个序列参数的单个直pValue1
& C8 u, v3 {6 E/ V' {4 s9 E第二个序列参数pData→m_pCalcParam[1]* L& L: D' d0 H; w& G
第二个序列参数的起始序位pData->m_pCalcParam[1].m_nParamStart
1 g6 d8 s3 E3 K" g2 {) H6 Q第二个序列参数的址标constfloat* pValue1 = pData→m_pCalcParam[1].m_pfParam;* ~& W8 \* T  ~
取用第二个序列参数的单个直pValue2
/ N' c1 P: h: y8 J/ h8 b$ ?2 A第三个序列参数pData→m_pCalcParam[2]/ _7 f0 x' S  S
第三个序列参数的起始序位pData->m_pCalcParam[2].m_nParamStart* Q5 l- h3 ^( X& j1 ]
第三个序列参数的址标constfloat* pValue1 = pData→m_pCalcParam[2].m_pfParam;0 c6 s/ |' _* u7 P' I; Q* E4 s& W6 K
取用第三个序列参数的单个直pValue3. s# q# k( K% _6 C9 D7 L
第四个序列参数pData→m_pCalcParam[3]" Z% C0 G$ v: u% X
第四个序列参数的起始序位pData->m_pCalcParam[3].m_nParamStart' O7 U; A1 @3 i: A$ W6 L
第四个序列参数的址标constfloat* pValue1 = pData→m_pCalcParam[3].m_pfParam;
7 j1 v- E- O: A: x4 B, \取用第四个序列参数的单个直pValue4
4 a/ J& `  X, j5 Y7 @# v; N% s如果有四个序列参数,则取用序位最高的那一个序位
, ~/ f, g- V8 `: Y0 J& D: |if( pData->m_pCalcParam[0].m_nParamStart >= 0 &&% p4 J7 H& m& ?+ I$ p0 {
pData->m_pCalcParam[1].m_nParamStart>= 0 &&% r# Q# A6 M. D0 r
pData->m_pCalcParam[2].m_nParamStart>= 0 &&
8 J9 |5 G- [, G! I  c4 @0 Z+ K! MpData->m_pCalcParam[3].m_nParamStart>= 0 ) //4个序列都含有效数值) _7 x: E* E7 w2 ?. W7 q
{8 o. F- s7 K4 q
//计算返回的序列的第一个有效值位置
& J1 s- r% n7 ]5 N7 g/ q- I* w: ointnFirst = pData->m_pCalcParam[3].m_nParamStart;//已知返回的序列的第一个有效值位置与第4个序列一致
4 I5 O5 G3 K0 O$ c" r* \. j//若不知,则
' z- _% U1 }0 c: e/*
! E% V6 D! L, lintnFirst = pData->m_pCalcParam[0].m_nParamStart;
! s0 r* c0 e" R& s  A6 }if( nFirst < pData->m_pCalcParam[1].m_nParamStart ) - L: \7 `4 w, Q$ |0 z1 g
nFirst= pData->m_pCalcParam[1].m_nParamStart;
( o8 m+ T" X; z# V7 Z. ^3 cif( nFirst < pData->m_pCalcParam[2].m_nParamStart ) 8 X( V" C" \4 a/ j/ b0 e& T+ v
nFirst= pData->m_pCalcParam[2].m_nParamStart;3 C; d8 M# k0 ^9 T/ W) J
if( nFirst < pData->m_pCalcParam[3].m_nParamStart ) 4 A; A3 [& `9 n
nFirst= pData→m_pCalcParam[3].m_nParamStart;2 Q7 V. v, v% A$ x9 T
constfloat* pValue1 = pData->m_pCalcParam[0].m_pfParam;) {8 O( o/ U5 C1 U
constfloat* pValue2 = pData->m_pCalcParam[1].m_pfParam;# K; R# b8 h  R9 ~8 D( e
constfloat* pValue3 = pData->m_pCalcParam[2].m_pfParam;" k6 a$ s0 [  f: h) w
constfloat* pValue4 = pData->m_pCalcParam[3].m_pfParam;: A, _5 f7 Z8 R4 D& E" \
//-------------------
/ e! ^8 K3 ^1 ]* b1 ]* W7 D$ H* Yfloatm_fOpen; //开盘 open
  P  x7 ?: C8 Y$ E. Kfloatm_fHigh; //最高 high4 ?4 F" B$ H% S2 O9 k2 }
floatm_fLow; //最低 low
, y$ t& z) B' F; R2 lfloatm_fClose; //收盘 close4 x5 \4 n+ s# p) j0 i* P( [
floatm_fVolume; //成交量 Volume7 p) }- ^9 j: p3 i
floatm_fAmount; //成交额 amount! G; s" U- b: @! g! `
调用收盘据+ `4 e  i2 w$ E6 g9 c0 y
pData→m_nNumData= 变数数据长度
) p% I" X" c/ Y3 ^% f/ QpData→m_pData= pointer to struc STKDATA
2 _- @9 h; W+ JpData→m_pData[x]第x个数据
! ?) v: N( n, X* y) d7 ~9 YpData→m_pData[x].m_fHigh第x个数据中的 High4 G9 r7 Z. w: q  o/ [/ F( ^
@@@@@@@@@@@important !!!!!!!1 Z7 i( T7 O) {, Q7 @- X
sinceVC++ 2008, cl.exe will make ‘pData→m_pData[i-j].m_fClose’ anerror9 V& `) O1 [2 b/ ]3 ^8 ~  h
so,pass the high,low,open and close just from the function parameter ,that is use ‘ CALCPARAM’ struct' w4 A6 x" O" }' g3 n6 X
pData->m_pData[i-j].m_fOpen// to use open , there is no way in using a varable for calculationoutside foxtrader
2 V# ]6 p- Q; l2 U' Z  @pData→m_pData[i-j].m_fHighto use high' w$ V9 s  x  c. N$ R
pData->m_pData[i-j].m_fLow. f0 B. Q! g2 g! ^
pData->m_pData[i-j].m_fClose$ r, z% T& M9 c; L, |
m_pData= pointer to struc STKDATA/ y1 E2 ?9 l5 P# v) h1 s& W( v, ]
incalling C++ dll function
4 m7 Z$ V- }$ Am_pDatais passed to pData (CALCINFO* pData . A CALCINFO* type pointer)
, ^/ q+ k+ \( |8 m' m4 Y- gtouse a single value in variable ‘High’. A# B) j% V; D& k2 R
pData→m_pData[i-j].m_fHighto use high
) {' J% t5 |* C: ?, W8 ]constfloat* m_pfParam1; //调用参数1/pointer to variable parameter 1 , B6 a9 f- m4 \! g4 A
constfloat* m_pfParam2; //调用参数2/pointer to variable parameter 2
5 A% Q3 ?7 u6 R* i. ?constfloat* m_pfParam3; //调用参数3/pointer to variable parameter 3
' t6 C) y6 Z7 }* ?; f1 hconstfloat* m_pfParam4; & b& H( w+ C3 N
m_pfParam1,m_pfParam2, m_pfParam3, m_pfParam4 = pointer to caller function 的参数
2 Q& J; Y* M. z1 m! @# U$ }7 PpData→m_pfParam1= pointer to 第一个(序列)参数, q; c0 u8 j' ^6 b! {. X/ M
pData→m_pfParam1[x]= 取用第一个(序列)参数的第x 个值  Z( l. U2 L. L' J
constfloat* cpParam = pData→m_pfParam1; =定义 cpParam为 pointerto 第一个(序列)参数* X, ?& g. i/ N+ D/ R
cpParam[x] = 取用第一个(序列)参数的第x 个值# |2 A6 t5 T: u$ v* G5 |+ j
m_pResultBuf= 结果缓冲列
' H. W4 H+ ^8 s" D% SpData→m_pResultBuf= pointer to 结果缓冲列* N. }; c7 t# x& }3 f8 B
pData→m_pResultBuf[x] = 取用结果缓冲列的第 x个值
. C6 d; p( H" W; M3 ]6 v//////////////////////////////////////////comment% `1 y+ L5 M8 `$ U8 u
//////////////////////////////////////////comment 注解# ^  j0 F! z, C- A' F
constint m_nParam1Start; //统杅1衄虴宎弇离
( _! @  D1 m5 I9 Oconstfloat* m_pfParam1; //覃蚚统杅1
% ~& Y- A8 e4 F" L3 e! e) O, Sconstfloat* m_pfParam2; //覃蚚统杅2$ v0 O& j) a" X' V, X+ h
constfloat* m_pfParam3; //覃蚚统杅3
# K& ^' K5 v! {constfloat* m_pfParam4; //覃蚚统杅4,parameters must be <= 48 ?; s, X. n. t8 U
//const float* m_pfParam5; // parameters must be <= 4
' Q6 l, y% p9 p4 T; e# l0 x! p9 y//const float* m_pfParam6;
; E/ @6 J5 R3 x6 n7 a//const float* m_pfParam7; ) H$ y/ R3 v# p3 _- A, u
//const float* m_pfParam8;# c7 _, O, ~2 d4 N. u! h7 \
//pData->m_pfParam1 && pData->m_pfParam2 &&pData->m_pfParam3 && pData->m_nParam1Start>=0 &&
! [( t0 O, f) V0 }' ^# {pData->m_pCalcParam[0].m_nParamStart>=0&& pData->m_pCalcParam[1].m_nParamStart>=0% g, s, |; c6 L: d7 d! G1 V( p8 m
&&pData->m_pCalcParam[2].m_nParamStart>=0)
0 g  N5 s+ s9 W( h{
0 C( z4 a5 I1 P& w8 BfloatfParam = *pData->m_pfParam4; //pointer ,pData->m_pCalcParam[3].m_nParamStart >= 0
5 @7 ~& G% r0 Z2 dintnPeriod = (int)fParam; //统杅15 i* _( B& K# N: f* U) F
//const float* cpParam = pData->m_pfParam2; // cpParam = pointer to第一个序列参数,cpParam = 取用第一个序列参数的第i 个值
( G5 m: n5 c! {# Cconstfloat* cpParam1 =pData->m_pCalcParam[0].m_pfParam; // cpParam =pointer to 第一个序列参数,cpParam = 取用第一个序列参数的第i 个值
; O' l% U2 N; _! F. [% Fconstfloat* cpParam2 =pData->m_pCalcParam[1].m_pfParam; // cpParam =pointer to 第一个序列参数,cpParam = 取用第一个序列参数的第i 个值% ]4 V0 @4 x; d$ y: O
constfloat* cpParam3 =pData->m_pCalcParam[2].m_pfParam; // cpParam =pointer to 第一个序列参数,cpParam = 取用第一个序列参数的第i 个值//parameters must be <= 4
7 l- R# r7 Z6 u3 E7 Y//const float* cpParam4 =pData->m_pCalcParam[3].m_pfParam; //cpParam = pointer to 第一个序列参数,cpParam = 取用第一个序列参数的第i 个值
% @5 Q$ S" r! `//const float* cpParam5 =pData->m_pCalcParam[4].m_pfParam; //cpParam = pointer to 第一个序列参数,cpParam = 取用第一个序列参数的第i 个值
' v# k! m0 v3 k) V* K1 N" h//m_pData = const struct pointer to struct STKDATA , pointer to structSTKDATA , 0 C! W5 U5 [& [! E# ]/ a3 r2 f
touse pData→m_pData[x].m_fClose
* l: P* `, T1 M: I& z: `! x/ CpData→m_pData[x]= | 1,2,3 , … , m_nNumParam | time_t m_time;
2 f# D% ^: y7 K) C" K. u9 P4 p|1,2,3 , … , m_nNumParam | float m_fOime_t
: v/ j7 A9 C0 p- [- r# Q|1,2,3 , … , m_nNumParam | float m_fHigh;. @" l3 n$ G6 {3 o& j5 I, T
.. .6 K) E9 a7 {1 R2 U. K, l
|1,2,3 , … , m_nNumParam | WORD m_wDecline;  j" f7 ~: _7 e% g4 {9 @2 c
m_nNumParam= 数据high,close,open,low的长度/ r: c0 H5 p+ s" z
touse high:
8 x* ~5 N" U& b% A3 _+ npData→m_pData[x].m_fHigh) O; Y  y0 P; d+ _4 a! B1 W. j3 L0 Z
contentof struct STKDATA; C! m0 C4 Q" ]
time_tm_time; //时间,UCT4 c5 ~" O6 ~$ F% h4 N
floatm_fOpen; //开盘 open
( Y1 ?. W7 o. t# D. s. Ffloatm_fHigh; //最高 high1 H1 d; Z7 [* M3 ]$ r9 G
floatm_fLow; //最低 low2 d; I8 Q- R9 C/ v% e2 P; F% v
floatm_fClose; //收盘 close
3 n. F. g) c4 N+ r5 Y' S. c3 h! F9 ~  ?floatm_fVolume; //成交量 Volume
4 W6 g* m$ A5 r# `; Nfloatm_fAmount; //成交额 amount
* f/ a1 a' \- S/ Z0 Y# lWORDm_wAdvance; //上涨家数 仅大盘有效
+ i7 i' T( `% O+ a# i  L5 _/ ?WORDm_wDecline; //下跌家数 仅大盘有效2 o8 o6 O+ q1 K0 A' I4 z- }9 e
调用传递参数及传回结果( P. ?: K* C/ M3 v- d+ b' \  H
调用传递参数
; b0 H" p" f! _# g4 D(pData->m_pfParam1 && //参数1有效Param1exists) L* F* @& T, W4 ]
pData->m_nParam1Start<0&& //参数1为常数- ~0 ~5 p9 K1 r: E6 `3 {
pData->m_pfParam2==NULL) //
! x/ }- f6 R) i/ d9 Wlocalprocedure 定义使用变数
/ ]6 m: }2 w& o" M  B: bonstfloat* pValue = pData→m_pfParam1; //use constant参数15 \) ?9 y( {' k6 ?2 o
intnFirst = pData->m_nParam1Start; //use 参数1效值起始位" m* {& M( ^* i/ C$ \* Z
floatfParam = *pData->m_pfParam2; //use 参数2
1 q9 h6 `: Y- R, @intnPeriod = (int)fParam;
( ^5 n$ f: U- v, e7 @5 R传回结果
) V, C$ w8 E( f; Y% TfTotal+= pValue[i-j];% s$ V& j# C) a; P
pData->m_pResultBuf# T8 N. \% @* v; O6 ]( c
//////////////////////////////////////////comment

评分

1

查看全部评分

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

本版积分规则

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

GMT+8, 2026-10-19 19:54 , Processed in 0.126490 second(s), 20 queries .

Powered by Discuz! X3.2 Licensed

© 2001-2013 Comsenz Inc.

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