阳光飞狐

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

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

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

[复制链接]
跳转到指定楼层
1#
发表于 2019-8-11 16:09:40 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
许多年以前,我曾经在2 x3 T( W) q" x6 t: ~7 j$ s4 a8 @
理想公式区发布了4 l2 Z+ U& ~; _2 f  ~
"
0 R/ }0 h: O9 D- T如何用 Foxtrader(飞狐)连结 C++动态程式库 DLL及 80x86Macro Assembly (组合语言)1 f8 m% ?" x& {- a' R0 w
"4 @7 y. G# @" U' s) S5 a6 l- U2 U

; i3 |* b) H" m0 z0 N现在更新foxtrader(飞狐交易师) + ~" U: \( e* w+ l
连结 DLL的方法6 ?7 ~5 E+ W2 G) w7 S2 L; h
! {( W" }- ?% |* `9 z
foxtrader- - > DLL (C++ and assembly) = ( foxfunc.h + foxfunc.cpp +pow10.asm )
; ]$ i5 x- {* N  r' L" U& I/ V  kgauss- - > DLL (C++ and assembly) = ( foxfunc.cpp + meigj.asm )
9 W! L5 _$ |3 L1 }# _$ Ggauss只用到函数参数传递,所以使用新的 c++compiler, 不受影响: f" \/ |0 z- w; `2 r8 T: L) [
foxtrader的 foxfunc.h宣告的结构型态 (struct)在 2004vc++ 6.0 全部有效) n; J* i% ?- N* n. N9 P
% ^; z6 N% j2 M# ^! X% z
也就是这五个结构都能用/ h9 N- B. a0 P# [3 s
typedefstruct tagSTKDATA ; W$ V2 Y" l1 d& @7 X
typedefunion tagSTKDATAEx
9 d+ a2 g6 p+ gtypedefstruct tagSPLITDATA
* i$ g$ Q, Q/ x: z: G3 ltypedefstruct tagCALCPARAM6 o6 e$ E$ M: }  e* v( G. E
typedefstruct tagCALCINFO% ]. W9 \/ U; g
$ l3 h; ]+ G% R( Q; Z
自2008年起,vc++ 2008, vc++ 2010, vc++2017 对struct的编译,已经完全 c++化,不再相容于 C
7 t8 _* E/ E: `  f& ]( I( w也就是这五个结构中2 C9 h5 V+ P6 H7 m& N5 G6 l8 d/ Q
typedefstruct tagSTKDATA
& d/ S! {% [9 f) H- h; A  C/ M6 ftypedefunion tagSTKDATAEx- M/ `7 s& k. h; [
typedefstruct tagSPLITDATA
" L% b6 }4 v, p( X; M! {6 stypedefstruct tagCALCPARAM7 j$ h9 V3 s  f
typedefstruct tagCALCINFO
- B" z0 _4 d& S- x只有这两个可以用
) |# \$ b7 m. n) d5 t# {typedefstruct tagCALCPARAM
/ F% C. y& ~* r/ utypedefstruct tagCALCINFO
% u. o" W' J$ f) U( v值得庆幸的是,下面这个结构的函数参数传递个数可以有无数个
3 h* z4 S; w. `6 w+ `9 l4 qtypedefstruct tagCALCPARAM: A; K7 e6 w9 k1 I
例如:在 foxtrader中' g9 a, x: Q9 e& x" A' R
MA1:=MA(CLOSE,3);
, x+ U2 h! C, mMA2:=MA(CLOSE,6);
) U7 J( l$ o0 Z. ^MA3:=MA(CLOSE,12);
+ Q$ _& z+ p3 j, k& V7 w' ZMA4:=MA(CLOSE,24);5 n$ U  t4 y& {2 _+ M* t3 W0 e9 p* a
MYBBI1:"MYFUNC2017@MYBBI"(MA1, MA2,MA3,MA4,MA3,MA4,5)*0.95,colorff00ff,linethick3; {2017 vc++ 15.0}) A: p8 S* `5 W2 q% C
其中MYFUNC2017=MYFUNC2017.dll, MYBBI = MYFUNC2017.dll 中的MYBBI函数,这里 MYBBI函数传递的参数共有 7个
3 U4 Q% t. O# e4 _下面这两式计算结果相同
0 r: s+ t4 h" [0 E+ jxx:(MA(CLOSE,3)+MA(CLOSE,6)+MA(CLOSE,12),MA(CLOSE,24),MA(CLOSE,12),),MA(CLOSE,24)/6*0.95,color0000ff,linethick2;{foxtrader 自行计算}( D0 x5 [% R+ \* a
MYBBI1:"MYFUNC2017@MYBBI"(MA1, MA2,MA3,MA4,MA3,MA4,6)*0.95,colorff00ff,linethick3; {2017 vc++ 15.0 , dll计算}
3 p, F4 E0 [, |( w0 s其他例子
' i* C5 M8 B! S5 g0 Boooq:="MYFUNC2008good@MYMACLOSE"(c,,c,c,6),colorffffff,linethick5;(---> pow10.asm)
; J# x6 C/ r6 V" F: m0 Noooq1:"MYFUNC2010@MYMAVAR"(ma(c,5),5),colorgreen,linethick5;
: y1 ]6 T) a/ p$ `) `7 x; }4 A# n: e* c其中pow10.asm里面有很多不同定义或宣告被注解不用,那是因为后来在逐步侦测法修改语码中才发现在foxfunc.cpp主程式中,下面这行错误,也就是新的 compiler不再相容于 C,因此在pow10.asm里面被注解不用的定义或宣告中,有些应该是可以用的# l3 ~9 H- t$ o# V
fTotal= pData->m_pData.m_fClose; // @@@@@@@ vc++ 2010 cl.exe 使pData->m_pData[i-j].m_fClose错误* r: L9 I6 y( i; _) C+ R
$ U0 ~* A( K+ {1 [' q
* R4 E, _+ ?4 c; W- V( N
////////////////////////////////////////////////////////foxfunc.h
* m: A" y/ b) j#ifndef__FOXFUNC_H_INCLUDE
) C" O4 W; o& T! L#define__FOXFUNC_H_INCLUDE! E* J% L( B& f/ o
/*5 e/ F1 [! b6 Q7 O  s
飞狐交易师“C语言接口”扩展程序调用接口规范V3.0
; ]6 r8 e: \  Y1.本规范适用于飞狐交易师V3.x公式系统.- d& y, [, o) I7 Z# T# b- I2 h: x
2.扩展函数用于实现系统函数不能实现的特殊算法.
5 T. R& y8 z% `& W3.扩展函数用windows32位动态连接库实现,建议使用MicrosoftVisual C++编程.
$ J1 R* N1 D; U( ~& l7 x4.调用时在公式编辑器中写"动态库名称@函数名称"(参数表)即可,例如下面函数可以写为"FOXFUNC@MYMACLOSE"(5)
4 J1 a6 P2 ?0 S9 v6 [2 ~& r5.动态连接库名称和函数名称可以自己定义.
; s% ~+ r: M& l# {  j  W$ U( c6 B6.使用时必须将动态库拷贝到飞狐交易师安装目录下的FmlDLL子目录下使用.1 A0 K) u* P' A7 ^" W! N
*/
3 X! F, W- ~  {1 O! J6 E9 J/ m) `#ifdef__cplusplus
* ^% w+ N7 }: _2 iextern"C"5 a- d! ]% i. O7 `9 K
{# u% |, b0 Y& o1 m- T' b
#endif//__cplusplus( y) W3 H7 f# x$ i  K% l
///////////////////////////////////////////////////////////////////////////
8 H" ~  a7 k8 C& ?//分析周期
" S6 ?' j/ Q$ h: Z: \, renumDATA_TYPE
- |1 O6 v6 |6 y) o* Y  }' I{
0 u$ i6 p5 E3 W! r* z( a, F' hTICK_DATA=2,//分笔成交
$ B# r0 I( V' G7 T: m" C) dMIN1_DATA,//1分钟线
7 W  o4 m9 n1 z2 `* fMIN5_DATA,//5分钟线
" x2 {: \( F& p5 O8 k+ q5 EMIN15_DATA,//15分钟线3 ]9 s3 _4 E/ b5 I* q
MIN30_DATA,//30分钟线
+ C3 y/ n& o2 {) ?& |' wMIN60_DATA,//60分钟线8 D1 z+ J  J' y' x$ `8 B$ V4 S# ?
DAY_DATA,//日线
' c. `/ I- l4 bWEEK_DATA,//周线( Q2 o, o4 M8 c$ }2 X, A# u
MONTH_DATA,//月线
$ ?8 w& C" L6 _1 Y$ @- JYEAR_DATA,//年线. }, V$ s! k9 X. K3 U  @. r
MULTIDAY_DATA,//多日线* F6 B1 Y/ F: y% i
MULTIMIN_DATA//多分钟线% l0 J. t+ e4 ~5 v
};
, i2 ]7 Y6 I% O2 G) Q% u& o///////////////////////////////////////////////////////////////////////////
9 z, ?8 g* H+ J  M3 A& R3 b; F//定义取用股票基本数据的结构 只有 VC++ 6.0 能compile成功使用
* A* C$ q5 m: |: Q) Q9 d; atypedefstruct tagSTKDATA
! \  w4 q/ Y" E% U" P{
. t: W, K& u# r1 Q' h_tm_; //时间,UCT
2 {- K8 |  M2 ffloatm_fOpen; //开盘 open
% x2 d7 U: ^0 v  Vfloatm_fHigh; //最高 high0 c3 E6 J  Z6 W& {3 o
floatm_fLow; //最低 low
, Q4 G% Y* w6 Z2 B/ _" ^( _# u# |floatm_fClose; //收盘 close1 _6 D4 X3 f/ N5 s
floatm_fVolume; //成交量 Volume
  q  V$ B. G' r; _- S$ x  D5 wfloatm_fAmount; //成交额 amount5 N, w6 e3 d  T4 a6 Y
WORDm_wAdvance; //上涨家数 仅大盘有效' ^  x6 ]3 v4 |$ r( y2 O
WORDm_wDecline; //下跌家数 仅大盘有效+ R; p5 B3 W" B8 R9 g
}STKDATA;5 D% V: H( E8 ]3 ^
定义STKDATA为 tagSTKDATA的简单别名,STKDATA % @1 }! p. I) R  z8 i
为真正方便使用名称,tagSTKDATA 为定目的的过水名称
; R1 Q7 u3 G& Y. ^" P# G////////////////////////////////////////////////////////////////////////////
  Y1 ]" [# b: \! `5 l1 {//扩展数据,用于定义取用分笔成交数据的买卖盘 的结构
. z& Y1 ]! E( `0 k' H6 @typedefunion tagSTKDATAEx
1 h0 B7 D/ T; }$ Z( m" N6 j* Y{
0 k* R. t( B' Astruct
, ?0 n2 X2 c# \% o% l{
, L# o! ~: V& Y1 S' Gfloatm_fBuyPrice[3]; //买1--买3价floatm_fOpen; //开盘 open- d0 N% y. X+ X" s) a
floatm_fHigh; //最高 high% _3 I7 {5 z, v: S. w% J
floatm_fLow; //最低 low
! Q0 j, A( a( v# f; l/ X' `floatm_fClose; //收盘 close! t, h2 A$ E0 |
floatm_fVolume; //成交量 Volume1 H0 [* r. s2 @- ~
floatm_fAmount; //成交额 amount
+ v% G6 A4 A0 w, ?0 s! t  o' Zfloatm_fBuyVol[3]; //买1--买3量1 |  ]- L5 v! f8 J7 B
floatm_fSellPrice[3]; //卖1--卖3价
8 w) Q2 |# D: e; A+ {* `floatm_fSellVol[3]; //卖1--卖3量0 P9 n& _% L! A9 r' r
};
& r0 G; ?, D* b# Yfloatm_fDataEx[12];
# k* ^+ ^& [% j: y4 l}STKDATAEx;8 _# D# X; s3 w0 s" }$ M
////////////////////////////////////////////////////////////////////////////
5 Z' D) Z0 k: b; O1 X//定义取用除权数据的结构" a; `8 `" p9 |: m( a: F( x
typedefstruct tagSPLITDATA ' a5 J) R4 k* u0 A
{" p  g1 \; G4 w5 D( W* P
time_tm_time; //时间,UCT
  p8 A  E- @9 ~4 {4 ofloatm_fHg; //红股
& P) K) r, ?$ _& ofloatm_fPg; //配股
: h; w1 K. a# D* N& d/ g$ ^0 |floatm_fPgj; //配股价
  ?6 v6 t" A% m9 R: c1 `floatm_fHl; //红利5 M2 o( ?# d; F
}SPLITDATA;
3 L; v8 ~1 P) A5 z. m/////////////////////////////////////////////////////////////////////////////
' R) _# ^: S9 x* r! L7 F' u( L2 u1 x8 n/*财务数据顺序(m_pfFinData内容)
+ ?2 j  ?! X7 d/ O. a% d, j序号内容8 |/ `/ _* ]; z; X4 ^  M" Q& r
0总股本(万股),
3 S7 U1 P, N& L2 x4 p) y  v1国家股,
( G8 M# Y. n; w7 N) T" Q! M2发起人法人股,/ u- |  s% D; i2 @) ]2 M0 }4 I" M
3法人股,
$ I4 b) g4 E: Q) x4B股,. K: L; M3 o& j& d/ y
5H股,
( S* c# r0 D; J4 A6流通A股,
' P! r6 c2 {* ]+ k' G7职工股," ?3 q; l5 g' c& v, M( k: S, a1 d
8A2转配股,+ \& I' Z, `4 y; J
9总资产(千元),$ R) N  c8 p& a
10流动资产,
. B" Z$ ^& M' }0 v" U) j1 J# ^11固定资产,
( B: e" H+ r; v12无形资产,/ r5 P: j/ `& e( k3 C% p
13长期投资,
% @/ l/ K* j1 K8 Z' J2 w) [/ W14流动负债,
+ u/ W. W( ~  P- E: U& J15长期负债,( L5 j) q+ Y9 V5 }) G- a3 R$ {5 ~
16资本公积金,- s4 ~8 L8 R; O& x  o
17每股公积金,! h% E8 z- e: p0 A0 X! N$ t% j
18股东权益,8 Z: ^" G# V, Q4 j
19主营收入,& |, b; V0 g+ c( v* a
20主营利润,! r& b( B5 i4 y2 q, U
21其他利润,
* f% O5 h& A( `- }* p. s( o4 ~7 F22营业利润,
5 K! q- R) {) B1 t5 h23投资收益,0 Y6 t+ |. L, d3 k4 p  y. C4 J
24补贴收入,
- `5 q0 u! r, j" O25营业外收支,
: X: s- w% r  E; L( X: C. L- T+ }26上年损益调整,
- g) k( y" i- h% K/ @2 J: ]27利润总额,* W( V$ p- Y; a  t
28税后利润,
8 C+ B( N8 e4 @8 @, b5 u29净利润,& j& i4 p' ^7 X, S9 T
30未分配利润,- u3 _+ v) L+ f8 ?# G) E
31每股未分配,
, A% }. R' x- o2 _. t32每股收益,, y  ^* S, S& z: T
33每股净资产,8 e( H1 H8 ]0 t2 f0 s8 |
34调整每股净资,1 U, `/ L; c& l' l0 ]  s/ Y
35股东权益比,
3 c/ W1 i4 g- c+ F. L$ H36净资收益率$ F& M( K  r: n% [- j5 k5 N% ?6 q
*// z3 ?1 s, ?3 e3 _
/////////////////////////////////////////////////////////////
4 S% U4 }- M2 B# D* H2 {2 |//定义取用caller函数传递参数项 的结构
( v' ?8 u2 [. s0 stypedefstruct tagCALCPARAM
6 I6 c+ n, B$ C  r  f8 L# y& j6 w{; J* ^  X8 ^- A+ T
union
" B% e6 i8 a% X. N' {4 |. Q  J3 Q{
  |1 d0 d/ N6 [. U1 t9 Oconstfloat* m_pfParam; //指向序列参数的址标,指向一个浮点型数组pointertofloat variable parameter / ex. c,h,l,o, co2...co2=(c+o)/2# c5 r* h/ r5 l- a! T! t
constfloat m_fParam; //数值参数 valueof parameter) Q* f% q$ @% g: K) M  D
};
8 m& |: s, \' G; G/ E; Z; ~, qconstint m_nParamStart; //序列参数有效起始位置thestart address of variable parameter / ex. c,h,l,o,co2.....& x; Z' ^" S; F! y$ o- I
}CALCPARAM;) O! A1 X9 L$ u  t0 Y# L1 a: N
/////////////////////////////////////////////////////////////////////////////9 Y/ S9 L, x  d" `7 s
//定义全部取用址标 的总结构 (各指标指向前述各结构以便取的各结构的数据,接口信息数据的结构 )
. Z/ Y/ e% v/ Q, n, Otypedefstruct tagCALCINFO( E6 K$ f* {( ?# T5 ?
{# J# g' w5 q3 r/ Y5 t
constDWORD m_dwSize; //结构大小
7 {' o$ F, h1 a9 _4 O7 Q# h5 Z$ cconstDWORD m_dwVersion; //调用软件版本(V2.10: 0x210)
% ]- g+ q# r  u9 I2 nconstDWORD m_dwSerial; //调用软件序列号" b8 F7 R, p7 C  l
constchar* m_strStkLabel; //股票代码) J4 T* U# b5 ?' L$ {, W
constBOOL m_bIndex; //大盘
3 `% E/ U6 k) h/ B; {: Fconstint m_nNumData; //数据数量(pData,pDataEx,pResultBuf数据数量)数据长度
9 ^- f# p! ^, _0 g) [- J6 mconstSTKDATA* m_pData; //常规数据,注意:当m_nNumData==0时可能为NULL" Z$ L% P6 W- {8 L
constSTKDATAEx* m_pDataEx; //扩展数据,分笔成交买卖盘,注意:可能为NULL1 g$ q& J" m& V( m; {
constint m_nParam1Start; //参数1有效起始位置<0/ constant parameter >0 /variable parameter 0 g& D7 T# J0 ?
constfloat* m_pfParam1; //调用参数1/pointer to variable parameter 1 6 {6 Q) x7 W1 @( G
constfloat* m_pfParam2; //调用参数2/pointer to variable parameter 2' Z1 }% Q' C9 h
constfloat* m_pfParam3; //调用参数3/pointer to variable parameter 3) [- O' S. ?* I/ p+ {, x% e
constfloat* m_pfParam4; //调用参数4/pointer to variable parameter 4
# C% U) D3 k! G% V7 ^8 ]+ Yfloat*m_pResultBuf; //结果缓冲区1 L5 [9 d$ k0 b. D
constDWORD m_dataType; //数据类型
0 S# j2 F+ m4 |. I6 \constfloat* m_pfFinData; //财务数据
9 b9 o: e4 p: |//以上与分析家兼容,所以沿用其结构和名称
" m* a" c7 z# @* O# H4 r3 L//以下为飞狐交易师扩展(fortagSTKDATAEx)
" p6 W: ^" P/ S, m2 I+ rconstDWORD m_dwReserved; // 保留
7 x6 e  ?1 P: M7 t) pconstint m_nNumParam; // 调用参数数量
3 x1 \! b4 t" W+ J! zconstCALCPARAM* m_pCalcParam; // 调用参数数组. H9 u* Y& [1 a- m7 g$ H: O0 v
constDWORD m_dwReservedEx[4]; // 保留
  c& c: Z% G( |. S  K+ ~char*m_strStkName; //股票名称- n- j3 P! _2 S  `+ `
SPLITDATA*m_pSplitData; //除权数据+ X$ q/ r( a. H1 [8 f( M
intm_nNumSplitData; //除权次数
( q' ?3 g/ A! k+ i+ [1 x}CALCINFO;  ^- E9 `# g  v5 C
/*8 R$ J( Y. W0 C' F
注1:(与分析家兼容)4 d, w) F5 D6 ?3 S8 {
1.函数调用参数由m_pfParam1--m_pfParam4带入,若为NULL则表示该参数无效.
! J# Q, ~) l4 z+ w% o, w1 T2.当一个参数无效时,则其后的所有参数均无效.% e5 K4 ?9 W! X% ^3 _# Z
如:m_pfParam2为NULL,则m_pfParam3,m_pfParam4一定为NULL.% u7 L& u" X/ L& p3 _! {! X
3.参数1可以是常数参数或序列数参数,其馀参数只能为常数参数.
) }: H3 o% [4 q+ }( I7 L4.若m_nParam1Start<0,则参数1为常数参数,参数等于*m_pfParam1;; T! \5 s# l2 N- U- W
5.若m_nParam1Start>=0,则参数1为序列数参数,m_pfParam1指向一个浮点型数组,
# |/ F- V2 R5 N& C数组大小为m_nNumData,数据有效范围为m_nParam1Start至 m_nNumData-1.
& x9 w* x8 L- w" I6 e' W, V/ s7 S在时间上m_pData[x]与 m_pfParam1[x]是一致的) K7 B' @4 J8 [
注2:(飞狐交易师扩展)
. @4 R3 k, y$ y/ R1.该扩展结构使调用参数在技术上可以是无限数目的,且每个参数都可为数值或序列,由公式中实际的调用参数决定。
% h3 E, L: Z# \2.CALCPARAM结构用于带入参数信息和实际数据,m_pCalcParam数组大小为m_nNumParam,数据有效范围为0 至m_nNumParam-1.! p2 A  Z4 ]5 E: s
3.按参数的顺序,m_pCalcParam[0]为第一个参数的数据,m_pCalcParam[1]为第二个参数的数据...,为了保持兼容,原m_nParam1Start、m_pfParam1等5个属性依然有赋值。
$ B/ S$ R+ J2 K& x* P2 B, U4.若i位置的参数为数值,取用m_pCalcParam.m_fParam.
+ D) x4 c( M  K& ]: O5.若i位置的参数为序列,取用m_pCalcParam.m_pfParam,数组大小为m_nNumData,数据有效范围为m_pCalcParam.m_nParamStart至 m_nNumData-1.若m_pCalcParam.m_nParamStart<0,则此数组中无有效数据。
6 x3 D+ X. A  }: G6.由于可以调用多个序列,许多序列的计算可以先在公式中进行,然后作为调用的参数即可。5 n- Z/ g% P0 r+ ~: l
7.经此扩展,对分析家的DLL依然可以调用、兼容。3 ]. @* G+ [; B
*/, H# B; t5 c4 S& L9 D
///////////////////////////////////////////////////////////////////////////////////, G( M% v* p7 ?" T) R6 Z) w6 [
/*函数输出. l" L' O7 j/ j
__declspec(dllexport)int xxxxxxxx(CALCINFO* pData);
# [8 G5 T3 {5 i2 V1.函数名称需全部大写.* b: h5 b' Y$ R( ^' x
2.函数必须以上述形式声明,请用实际函数名称替代xxxxxxxx;9 H" ^& u5 K, M* @% S7 ?
对于C++程序还需包括在extern"C" { } 括号中.+ l- y! c4 _4 [5 d; o1 R# y
3.函数计算结果用pData->m_pResultBuf带回.
2 a9 }. }& m+ ~6 }. d4.函数返回-1表示错误或全部数据无效,否则返回第一个有效值位置,即:1 N! T# i8 K2 N4 \
m_pResultBuf[返回值]-- m_pResultBuf[m_nNumData-1]间为有效值.
1 H$ ~3 c: a1 H  a5.函数名称长度不能超过15字节,动态连接库文件名不能超过9字节(不包括扩展名),动态库名称不能叫SYSTEM,EXPLORER
* q; R" U& e7 D- a" k! K/ ~" @; |*/
9 x+ j- {# v) U//示例函数,使用时用实际名称替换
  a0 x; B0 F6 B& f5 l/ R__declspec(dllexport)int WINAPI MYMACLOSE(CALCINFO* pData);
& @5 @% L) I9 |) m. |  O2 e5 P__declspec(dllexport)int WINAPI SMOOTH(CALCINFO* pData);
& `& L8 k" @9 J* ?" |//__declspec(dllexport) int WINAPI MYMAVAR(CALCINFO* pData);+ x* ]. P2 R7 S; _+ A0 z7 ~
__declspec(dllexport)int WINAPI MYBBI(CALCINFO* pData);
- P' M/ q9 X0 }& H4 [//WINAPI = _stdcall: m  O6 b. u! U# w5 y# e8 P4 s
#ifdef__cplusplus9 ?5 N0 b* x0 G1 i- t
}
# ~  z6 w) K8 i. n0 q#endif//__cplusplus, M) q* ?7 M3 y" |
#endif//__FOXFUNC_H_INCLUDE% b* k4 E5 q9 s
% D5 o( I' o; ?
//////////////////////////////////////////comment 注解5 f. M: R6 i2 U+ u( V1 r9 E
__declspec(dllexport)int WINAPI MYMAVAR(CALCINFO* pData)
/ {& C+ s8 ^- E/ IpData是指向 址标总结构 CALCINFO的 总址标
# K7 |2 E: p' c! j. |* A取用第二个参数数值floatfParam = *pData→m_pfParam2 ! D! y1 p; L1 \9 d& t( Z, q
取用第一个序列参数的址标constfloat* pValue = pData->m_pfParam1;' A% p9 l/ f! \* H. l8 T
取用股票数据长度intndata = pData→m_nNumData;
: A- j( j* q7 N- S2 \第一个参数存在且为数值pData->m_pfParam1&& pData→m_nParam1Start<09 h6 Z: X- G# S: F8 e8 v7 D
第一个参数存在且为序列pData->m_pfParam1&& pData→m_nParam1Start>=0
! o( k' C+ f4 i( f' U2 }* x7 Z' E第一个及第二个参数存在且为序列,第三个参数不存在pData->m_pfParam1&& pData->m_pfParam2 && pData->m_nParam1Start>=0&& pData->m_pfParam3==NULL
3 V7 j& A& b! ?constfloat* cpParam = pData->m_pfParam1; 定义cpParam为第一个序列参数的址标- @6 X  l% r& T- ^7 J
取用股票数据结构
! z& O1 l9 k9 j2 R! QpData→m_nNumData= 变数数据长度
, q4 F& F9 c* P* npData→m_pData= pointer to struc STKDATA 的址标
+ c5 K+ X0 ^. o. u& {( jpData→m_pData[x]数据结构的第x个数据: ]4 v. b; p0 x8 h% ]
pData→m_pData[x].m_fHigh数据结构的第x个数据中的 High
; R# D' o9 P7 T+ g  e& D. x3 J/ I取用结果缓冲序列7 |  u  e1 U! @' c9 V
pData->m_pResultBuf: G9 W+ R; f3 `" }7 G" {& d& g
取得第一个序列参数的起始序位,如 2,...5 , . 7...
$ [5 j5 A0 J- _3 ~$ v  ^; CintnFirst = pData->m_nParam1Start;
. j5 o8 C7 V! _, d  ufor( i = nFirst+nPeriod-1; i < pData->m_nNumData; i++ )' @! b/ c4 @+ y0 g
取得第二个数值参数的数值7 ]2 b7 @: p( [5 r
floatfParam = *pData->m_pfParam2; 2 x2 n4 M0 y" }
intnPeriod = (int)fParam;
8 q* z* h  G: a* D# C& j& D. z* c取用第一个序列参数的址标constfloat* pValue = pData→m_pfParam1;! m. T5 [3 X5 W! Z
取用序列参数的单个直pValue  S# z! p0 t! D" w" v; F
取用缓冲序列的单个值pData->m_pResultBuf
! G% B0 n4 d) u$ E1 sconstCALCPARAM* m_pCalcParam; // 调用参数数组
' e/ {% `; A/ }m_pCalcParam为序列址标,指向各序列参数的指标
8 j0 v+ ]3 o; W; w0 I6 q第一个序列参数pData→m_pCalcParam[0]( c9 d  x8 I- }4 b6 p1 ?# J
constfloat* m_pfParam; //指向序列参数的址标/ e8 D5 f$ ]$ v. e
第一个序列参数的起始序位pData->m_pCalcParam[0].m_nParamStart
/ H/ w, p* ?9 s' A7 i- y3 X( V第一个序列参数的址标constfloat* pValue1 = pData→m_pCalcParam[0].m_pfParam;) l6 n* \: v2 k/ b1 N& j: _% A
取用第一个序列参数的单个直pValue1/ u% Z& T* Y6 U! X, C5 `
第二个序列参数pData→m_pCalcParam[1]
3 h) G6 T5 p. J$ m1 v! Q# I7 p第二个序列参数的起始序位pData->m_pCalcParam[1].m_nParamStart( U# l; Q' R7 s4 [+ E
第二个序列参数的址标constfloat* pValue1 = pData→m_pCalcParam[1].m_pfParam;
. M* _) X% B5 M& u5 I  e* H取用第二个序列参数的单个直pValue2
2 G. v) k7 w! F( V第三个序列参数pData→m_pCalcParam[2]
! A& b- D9 o! b& ^+ w/ v  q/ n第三个序列参数的起始序位pData->m_pCalcParam[2].m_nParamStart/ A% P" {" G6 I. Y1 ^
第三个序列参数的址标constfloat* pValue1 = pData→m_pCalcParam[2].m_pfParam;
$ E4 p, ~% I: D! O1 Z: Z取用第三个序列参数的单个直pValue3
7 n: G! E$ Z% p* c; P! M第四个序列参数pData→m_pCalcParam[3]
; y$ t: ?8 g/ g4 Y/ \第四个序列参数的起始序位pData->m_pCalcParam[3].m_nParamStart
' K3 w$ d+ l. w+ K8 b* j第四个序列参数的址标constfloat* pValue1 = pData→m_pCalcParam[3].m_pfParam;
" s3 J' z8 E. B5 f- Z6 R# z9 \取用第四个序列参数的单个直pValue4% ^$ n' Y7 \& }6 s% g! R3 K* {# G
如果有四个序列参数,则取用序位最高的那一个序位
% {, X% H+ @4 e) L) i2 M7 \/ S2 V- vif( pData->m_pCalcParam[0].m_nParamStart >= 0 &&' b0 T  P3 G, |& q& s% j/ S( q
pData->m_pCalcParam[1].m_nParamStart>= 0 &&/ S9 x5 W# W! o2 w" j  H
pData->m_pCalcParam[2].m_nParamStart>= 0 &&* }% D8 H: {1 R5 W
pData->m_pCalcParam[3].m_nParamStart>= 0 ) //4个序列都含有效数值
5 r. {5 s+ F7 q2 K* _{
- D' P0 T9 l: |; O//计算返回的序列的第一个有效值位置
9 @& C% F3 Z2 Q2 Y2 D% QintnFirst = pData->m_pCalcParam[3].m_nParamStart;//已知返回的序列的第一个有效值位置与第4个序列一致
8 \, w; ~; ]& J$ z0 p+ p& d//若不知,则9 {$ s. ^% X) M, Q% M( l
/*
7 T% w8 J4 {2 M1 q! ?- O7 ?; RintnFirst = pData->m_pCalcParam[0].m_nParamStart;
6 {* x9 P% k/ R" W7 r; c; e# Wif( nFirst < pData->m_pCalcParam[1].m_nParamStart )
1 ?, a, A: n& RnFirst= pData->m_pCalcParam[1].m_nParamStart;: T9 W6 K/ t* \9 J0 d3 C
if( nFirst < pData->m_pCalcParam[2].m_nParamStart ) 1 O7 F' ?6 U1 i1 u
nFirst= pData->m_pCalcParam[2].m_nParamStart;/ b, a2 v: ?7 }- i4 S
if( nFirst < pData->m_pCalcParam[3].m_nParamStart )
  T9 t  \  v4 r1 F1 I) Z. knFirst= pData→m_pCalcParam[3].m_nParamStart;( y# g1 }& W- I0 s9 v+ w
constfloat* pValue1 = pData->m_pCalcParam[0].m_pfParam;) L( J' I5 D$ I* g; T% f# s
constfloat* pValue2 = pData->m_pCalcParam[1].m_pfParam;
/ w/ k$ {: K4 m/ v5 L: Dconstfloat* pValue3 = pData->m_pCalcParam[2].m_pfParam;
4 Y; p+ s5 ~5 F- Y8 q7 yconstfloat* pValue4 = pData->m_pCalcParam[3].m_pfParam;
- ^: k$ j7 M* N" K) w/ j' b, @//-------------------
% c8 V( m" K4 X/ F. n  K& t# ~floatm_fOpen; //开盘 open
: L4 ]; T) \8 h( F2 sfloatm_fHigh; //最高 high
/ B2 Q3 ?+ C# ~8 c, L% o6 Sfloatm_fLow; //最低 low/ T) d& g- h2 s* O4 a# d4 m; G; I
floatm_fClose; //收盘 close
  a$ p' P1 h* h- o2 P9 p% O. Z/ Nfloatm_fVolume; //成交量 Volume
3 k% {& M- F0 A1 ~# C. m0 R8 xfloatm_fAmount; //成交额 amount
1 x( R. u- m# K# M调用收盘据. N' R: W0 Y& |
pData→m_nNumData= 变数数据长度
1 f: b% ^+ G1 x5 PpData→m_pData= pointer to struc STKDATA
- A# n1 z  W! QpData→m_pData[x]第x个数据
4 \1 P+ K% w' f5 |1 XpData→m_pData[x].m_fHigh第x个数据中的 High% O7 P- U4 x# K0 X
@@@@@@@@@@@important !!!!!!!
) q4 m+ a  r( R& t5 esinceVC++ 2008, cl.exe will make ‘pData→m_pData[i-j].m_fClose’ anerror
( D, N0 u3 g( m4 l# w- gso,pass the high,low,open and close just from the function parameter ,that is use ‘ CALCPARAM’ struct
% c) ^8 b: @3 h4 `7 F. e$ KpData->m_pData[i-j].m_fOpen// to use open , there is no way in using a varable for calculationoutside foxtrader3 o2 y6 F/ P# ?% h$ b4 @( X; t
pData→m_pData[i-j].m_fHighto use high( u( F% f  J/ ?6 V& O( `3 u  ?
pData->m_pData[i-j].m_fLow0 P' ^8 r# I4 i
pData->m_pData[i-j].m_fClose
) d) e7 K% M* _5 {5 k# B7 }3 Qm_pData= pointer to struc STKDATA
$ o6 Z) Z! r. C) ]3 `7 `incalling C++ dll function
0 j2 S2 w+ ]& p/ R2 n& ?m_pDatais passed to pData (CALCINFO* pData . A CALCINFO* type pointer)
$ n% q: ]  N0 D0 @. ~, E5 N! d1 Gtouse a single value in variable ‘High’- `7 v8 B- C* j: q
pData→m_pData[i-j].m_fHighto use high
4 k! p# `* c3 s9 h0 mconstfloat* m_pfParam1; //调用参数1/pointer to variable parameter 1
, ~# t% ]; D, I* t% O$ |) |constfloat* m_pfParam2; //调用参数2/pointer to variable parameter 25 |8 E1 M! d/ m6 T
constfloat* m_pfParam3; //调用参数3/pointer to variable parameter 3
, D# T! \9 |9 k: O+ Mconstfloat* m_pfParam4;
. ~/ W" Q. g. C6 w3 W6 l9 pm_pfParam1,m_pfParam2, m_pfParam3, m_pfParam4 = pointer to caller function 的参数3 {9 B  l9 Y2 F. v" d! D5 x
pData→m_pfParam1= pointer to 第一个(序列)参数2 \3 q) I& A/ V$ o5 L0 R
pData→m_pfParam1[x]= 取用第一个(序列)参数的第x 个值
" Y9 y$ p* }9 Vconstfloat* cpParam = pData→m_pfParam1; =定义 cpParam为 pointerto 第一个(序列)参数
5 r+ `/ o3 c6 e& g' d( LcpParam[x] = 取用第一个(序列)参数的第x 个值
( m& B) I8 D% {8 |0 T+ \. ?m_pResultBuf= 结果缓冲列
/ P: m  d) U' J! W  P. |7 m, PpData→m_pResultBuf= pointer to 结果缓冲列
  f5 r$ H" `  R$ ?pData→m_pResultBuf[x] = 取用结果缓冲列的第 x个值! I$ p2 |1 I# |( t% P4 W" H% G
//////////////////////////////////////////comment  @7 ^2 U7 d$ D7 P7 G: a
//////////////////////////////////////////comment 注解( j" k; m1 p1 }, k5 A7 G
constint m_nParam1Start; //统杅1衄虴宎弇离$ E! x, j7 r$ x5 I1 n
constfloat* m_pfParam1; //覃蚚统杅1
9 S- U5 L. ^5 v6 X6 A* ~; Bconstfloat* m_pfParam2; //覃蚚统杅22 }+ b# ~* e5 q
constfloat* m_pfParam3; //覃蚚统杅3
4 T& F3 V8 @9 M/ Lconstfloat* m_pfParam4; //覃蚚统杅4,parameters must be <= 48 a+ J% [9 D8 q: C/ }
//const float* m_pfParam5; // parameters must be <= 49 Q& H2 W% ]" v0 i1 K1 f
//const float* m_pfParam6; - n! v6 B" Z8 ?* Z: A+ q( \
//const float* m_pfParam7;
; ^7 C( i8 \; K7 c0 v5 \$ A//const float* m_pfParam8;
$ {& C+ c" _6 Y. v. S9 t+ l3 O( \//pData->m_pfParam1 && pData->m_pfParam2 &&pData->m_pfParam3 && pData->m_nParam1Start>=0 &&
: y) Q& ^' p; WpData->m_pCalcParam[0].m_nParamStart>=0&& pData->m_pCalcParam[1].m_nParamStart>=0' E% U/ p9 C' M
&&pData->m_pCalcParam[2].m_nParamStart>=0)
, ~& z  \0 D( [) b2 s* T0 P{6 V% X  e$ V5 C) }; E) r
floatfParam = *pData->m_pfParam4; //pointer ,pData->m_pCalcParam[3].m_nParamStart >= 0
' ^/ p5 y+ q- C8 ^8 [+ ]: U1 E1 lintnPeriod = (int)fParam; //统杅1
" p3 g0 T4 |& f2 T6 `2 B1 q//const float* cpParam = pData->m_pfParam2; // cpParam = pointer to第一个序列参数,cpParam = 取用第一个序列参数的第i 个值4 _) G; ^  r' z( c; m8 ~
constfloat* cpParam1 =pData->m_pCalcParam[0].m_pfParam; // cpParam =pointer to 第一个序列参数,cpParam = 取用第一个序列参数的第i 个值
0 @: W1 `- x8 r, gconstfloat* cpParam2 =pData->m_pCalcParam[1].m_pfParam; // cpParam =pointer to 第一个序列参数,cpParam = 取用第一个序列参数的第i 个值$ x) X7 @' r; [+ o2 n
constfloat* cpParam3 =pData->m_pCalcParam[2].m_pfParam; // cpParam =pointer to 第一个序列参数,cpParam = 取用第一个序列参数的第i 个值//parameters must be <= 4! N, i' E8 W$ G- G2 k4 y
//const float* cpParam4 =pData->m_pCalcParam[3].m_pfParam; //cpParam = pointer to 第一个序列参数,cpParam = 取用第一个序列参数的第i 个值
3 A- Q4 d, p) |; g0 S& }& ^& R$ c, }" l//const float* cpParam5 =pData->m_pCalcParam[4].m_pfParam; //cpParam = pointer to 第一个序列参数,cpParam = 取用第一个序列参数的第i 个值
3 F5 T/ g; m: h) Q& q6 o; B; L//m_pData = const struct pointer to struct STKDATA , pointer to structSTKDATA , / ?* l* \5 a4 b, K4 r9 e/ l% K
touse pData→m_pData[x].m_fClose  r$ A" s7 I) ]8 ]) N
pData→m_pData[x]= | 1,2,3 , … , m_nNumParam | time_t m_time; 3 S3 l2 r" H8 n& M* h+ N4 r5 s
|1,2,3 , … , m_nNumParam | float m_fOime_t , u9 m2 u6 d1 m  k$ `
|1,2,3 , … , m_nNumParam | float m_fHigh;6 L! x6 s( z. Y4 P% g0 ^
.. .$ ]3 y% d& N. ]
|1,2,3 , … , m_nNumParam | WORD m_wDecline;
5 _( |4 I& t- f) ^; Om_nNumParam= 数据high,close,open,low的长度# R  M3 h( ~4 K( v
touse high:6 k2 ?* X. ^6 n' T1 M+ `" a
pData→m_pData[x].m_fHigh
/ ]" V# A/ @' f7 m- Pcontentof struct STKDATA: G5 W' x5 ]* o, p- |- K! P
time_tm_time; //时间,UCT, q7 Q3 S8 I1 r' m  e8 d$ q+ r/ G
floatm_fOpen; //开盘 open
4 t1 D# [# {& K+ W" vfloatm_fHigh; //最高 high
4 d, V/ T: [" h5 J7 r5 b% H% u1 Jfloatm_fLow; //最低 low8 h) u. y! x5 a
floatm_fClose; //收盘 close  a* |6 K1 Q# I  y) {
floatm_fVolume; //成交量 Volume
8 _( N: P4 _( `1 Ffloatm_fAmount; //成交额 amount
' k2 p2 E( k6 w7 S' ^' iWORDm_wAdvance; //上涨家数 仅大盘有效
' N: @2 M; E8 z* WWORDm_wDecline; //下跌家数 仅大盘有效
/ m/ P' t8 @. o" A调用传递参数及传回结果# d5 Y6 a" N' H: s+ `. o5 g
调用传递参数7 l1 f7 k3 r0 U# ]& u5 c3 S! R
(pData->m_pfParam1 && //参数1有效Param1exists
7 _& Q& l; Z" s0 Y9 A$ GpData->m_nParam1Start<0&& //参数1为常数: J/ B) D' C5 y! J/ A8 m* t
pData->m_pfParam2==NULL) //
; [4 R  f9 c" z( D- Q4 \/ c# U* Z: Flocalprocedure 定义使用变数% t8 ]0 G, A, b( V+ q2 m
onstfloat* pValue = pData→m_pfParam1; //use constant参数1& F9 a/ P. s9 Y" W* c
intnFirst = pData->m_nParam1Start; //use 参数1效值起始位
! d& ]- y. y% w  N% S6 E* u5 ]/ P+ GfloatfParam = *pData->m_pfParam2; //use 参数20 S/ I( U! x) o( V7 }8 X
intnPeriod = (int)fParam;
% C: k( i8 e. ?' c# H7 q1 F. W传回结果2 i( N; X  U# I- W: b2 \. u" {5 O
fTotal+= pValue[i-j];
: M  Z) ~1 g7 d7 M3 h( Y  cpData->m_pResultBuf
4 B( }* V1 O- h* s( q( F//////////////////////////////////////////comment

评分

1

查看全部评分

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

本版积分规则

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

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

Powered by Discuz! X3.2 Licensed

© 2001-2013 Comsenz Inc.

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