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

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

作者: ycng    时间: 2019-8-11 16:09
标题: 飞狐交易师 (foxtrader) 连结 DLL 的方法
许多年以前,我曾经在9 A' l( F/ o+ o# @  s+ D: T
理想公式区发布了4 H* a1 P) k7 o" x% g
"# }  Z& ~+ \; s! \. x8 g
如何用 Foxtrader(飞狐)连结 C++动态程式库 DLL及 80x86Macro Assembly (组合语言)
8 H! Q5 ^3 h' E) p", H5 k9 ^7 h1 j- `: \5 ^
2 ?/ P$ b# B( ^
现在更新foxtrader(飞狐交易师)
( f0 Y$ Q* D* L6 Z; T; Y, m
连结 DLL的方法
* h2 M5 f3 K$ [" \6 o5 v) N7 G% \/ h" p4 j. a9 A
foxtrader- - > DLL (C++ and assembly) = ( foxfunc.h + foxfunc.cpp +pow10.asm )& F. \! r& P% T9 F1 j5 W; G. l
gauss- - > DLL (C++ and assembly) = ( foxfunc.cpp + meigj.asm ): V; S1 J% c- L0 Q- p" y, ^3 |
gauss只用到函数参数传递,所以使用新的 c++compiler, 不受影响6 a0 _2 r$ t( e+ d
foxtrader的 foxfunc.h宣告的结构型态 (struct)在 2004vc++ 6.0 全部有效: g( |% S; X& [, k$ B& L
, M% Q( i  q/ p5 f5 c
也就是这五个结构都能用+ N4 |: t" x! R- M$ J' r* D
typedefstruct tagSTKDATA
, k4 T* [2 k) i; N9 Z. Stypedefunion tagSTKDATAEx. o' f6 @4 U' B4 r
typedefstruct tagSPLITDATA
$ P! ]2 P/ m) b% Y# U7 D' Rtypedefstruct tagCALCPARAM
( X) c$ t5 p  L9 Ttypedefstruct tagCALCINFO/ m8 Z0 G; Q! I! P
& q4 R1 K# B0 K$ d$ K7 Y
自2008年起,vc++ 2008, vc++ 2010, vc++2017 对struct的编译,已经完全 c++化,不再相容于 C
3 }: m; `3 C  A8 F4 N也就是这五个结构中0 V$ s& X  g2 x4 [. c9 e2 @
typedefstruct tagSTKDATA
: p8 L9 w* I4 stypedefunion tagSTKDATAEx
) N3 A1 _) Y/ y3 D  Rtypedefstruct tagSPLITDATA 5 C' _, ?3 h( c$ j
typedefstruct tagCALCPARAM
5 B$ P8 q! B% a/ rtypedefstruct tagCALCINFO& t: M- l5 b  i* t/ q
只有这两个可以用; s6 |/ C6 a2 @
typedefstruct tagCALCPARAM6 {* `8 n7 p9 P% ~5 ?
typedefstruct tagCALCINFO
& F% R% s% F  ^( e, n% O8 {5 v值得庆幸的是,下面这个结构的函数参数传递个数可以有无数个
: U+ g6 H" m6 {6 D. J( t+ stypedefstruct tagCALCPARAM
- s. k- H0 A3 _; o0 d+ T例如:在 foxtrader中
$ t2 D8 L  [( |MA1:=MA(CLOSE,3);
  a' w$ Z: C$ k; ?MA2:=MA(CLOSE,6);+ X% h4 c5 \4 g! I6 Y  i0 \( ~
MA3:=MA(CLOSE,12);4 a( O! W( \8 Y2 T+ n) |4 \( c
MA4:=MA(CLOSE,24);! b, c! K: o' @/ |) s9 S
MYBBI1:"MYFUNC2017@MYBBI"(MA1, MA2,MA3,MA4,MA3,MA4,5)*0.95,colorff00ff,linethick3; {2017 vc++ 15.0}% G* g% P" Z" i; N
其中MYFUNC2017=MYFUNC2017.dll, MYBBI = MYFUNC2017.dll 中的MYBBI函数,这里 MYBBI函数传递的参数共有 7个: d+ V- }3 Q( o3 k2 ~5 K
下面这两式计算结果相同
( X( U) V. ^% j2 o, F" R/ Mxx:(MA(CLOSE,3)+MA(CLOSE,6)+MA(CLOSE,12),MA(CLOSE,24),MA(CLOSE,12),),MA(CLOSE,24)/6*0.95,color0000ff,linethick2;{foxtrader 自行计算}
8 {* ~) v  ?6 S7 ^4 f1 JMYBBI1:"MYFUNC2017@MYBBI"(MA1, MA2,MA3,MA4,MA3,MA4,6)*0.95,colorff00ff,linethick3; {2017 vc++ 15.0 , dll计算}
" T8 [% l9 Z1 G4 ^( J$ R其他例子
9 R! H! A; Q* R  ~' f8 X9 A" Doooq:="MYFUNC2008good@MYMACLOSE"(c,,c,c,6),colorffffff,linethick5;(---> pow10.asm)$ X( A1 b8 z2 U& C
oooq1:"MYFUNC2010@MYMAVAR"(ma(c,5),5),colorgreen,linethick5;" [6 Z# N: l" L
其中pow10.asm里面有很多不同定义或宣告被注解不用,那是因为后来在逐步侦测法修改语码中才发现在foxfunc.cpp主程式中,下面这行错误,也就是新的 compiler不再相容于 C,因此在pow10.asm里面被注解不用的定义或宣告中,有些应该是可以用的
: o0 i1 I' d+ _3 ]0 A- E2 P& EfTotal= pData->m_pData.m_fClose; // @@@@@@@ vc++ 2010 cl.exe 使pData->m_pData[i-j].m_fClose错误
( p& L. v+ L% z3 u0 U. f; k0 `8 X8 k7 }/ F6 `# o
' @- s: u% X- X5 M2 S
////////////////////////////////////////////////////////foxfunc.h# x) u0 A/ m1 J# u! \$ N( @& \/ s
#ifndef__FOXFUNC_H_INCLUDE: l& c) A+ J8 L8 o! a: c
#define__FOXFUNC_H_INCLUDE
! C' l+ J; A( L1 S: _) r- v: u/*
# r0 t3 q* }; q7 A; m2 t0 c飞狐交易师“C语言接口”扩展程序调用接口规范V3.0
5 Z: x' X" x6 Z( O1.本规范适用于飞狐交易师V3.x公式系统.7 N9 y% g* z# ]1 z& y' C
2.扩展函数用于实现系统函数不能实现的特殊算法.
# z8 {7 c! {: V: W9 z3.扩展函数用windows32位动态连接库实现,建议使用MicrosoftVisual C++编程.
; k8 o. X9 z! t4.调用时在公式编辑器中写"动态库名称@函数名称"(参数表)即可,例如下面函数可以写为"FOXFUNC@MYMACLOSE"(5)! f: L; r; m: V: I3 o
5.动态连接库名称和函数名称可以自己定义.
% W0 L# N* m/ R! v0 ], p6.使用时必须将动态库拷贝到飞狐交易师安装目录下的FmlDLL子目录下使用.
9 O' X7 H  u- u! o*/
+ R6 A  K: p/ ^) K/ f+ ]# ~; ^2 e#ifdef__cplusplus, z; M3 O3 o- Z- r
extern"C"/ O& D8 W# P- ?5 R9 Z; F+ X! X) K) f
{
" w& q% O5 r2 P+ w! T#endif//__cplusplus
. L7 W+ A0 O/ ^///////////////////////////////////////////////////////////////////////////
4 @- j" F! W& U' n//分析周期+ {3 f) `( a) M* a* ]! a" i% b
enumDATA_TYPE8 I+ V3 X3 _9 e- T3 {( N6 b" k
{
3 E4 _1 ]' D  s3 j# `TICK_DATA=2,//分笔成交5 [7 m. m( m2 Q& B
MIN1_DATA,//1分钟线/ M1 B4 e9 e4 y$ r" v4 Y
MIN5_DATA,//5分钟线
2 g4 u# a" c: T! {3 z& g) {# I3 DMIN15_DATA,//15分钟线
: |0 S' o. X, aMIN30_DATA,//30分钟线
' _8 R: c3 d! _: k- U% y+ v& B5 CMIN60_DATA,//60分钟线
2 G: G3 _- B+ L1 L0 i7 ?DAY_DATA,//日线$ d' t9 B* u" E/ s; ^/ ]
WEEK_DATA,//周线
) O, {, @# l, W: X4 q5 S! \MONTH_DATA,//月线
3 Q. s2 w* n( L4 P* F; T9 A  BYEAR_DATA,//年线
  c) Q( V/ A' l& |MULTIDAY_DATA,//多日线; {& e. q1 d- q$ V
MULTIMIN_DATA//多分钟线/ |( w( U6 f1 m3 J
};
' m3 n/ l2 U! T" N0 }///////////////////////////////////////////////////////////////////////////* o, q  Q5 r  N- d2 k% W4 T
//定义取用股票基本数据的结构 只有 VC++ 6.0 能compile成功使用
* @; h& b5 a, N2 D( @typedefstruct tagSTKDATA . f/ E9 h* r6 G
{( |% k: S$ V3 Z% A4 _
_tm_; //时间,UCT+ ]5 E2 ~  @% R' W7 S; e
floatm_fOpen; //开盘 open% n2 v& [% R' O2 x, }/ Y
floatm_fHigh; //最高 high5 h7 C6 p& T5 C4 H
floatm_fLow; //最低 low
8 g: x4 G; h( g+ e# W1 Nfloatm_fClose; //收盘 close
& N5 M3 ]$ y) W3 Z' A7 jfloatm_fVolume; //成交量 Volume/ L0 c7 u) a9 }' M% G. p0 O
floatm_fAmount; //成交额 amount( M& g& J% A( I7 `! G
WORDm_wAdvance; //上涨家数 仅大盘有效" W: B, J# r( C6 K) w* \
WORDm_wDecline; //下跌家数 仅大盘有效( w5 l/ `( q+ B! Y7 l
}STKDATA;6 H+ Q. d9 v, }% G2 k! W& x$ L- V5 m
定义STKDATA为 tagSTKDATA的简单别名,STKDATA " G* \0 p4 i8 I" E  V
为真正方便使用名称,tagSTKDATA 为定目的的过水名称
) j/ ^/ G8 R/ a; [////////////////////////////////////////////////////////////////////////////+ Y( [3 U2 w2 D6 }# r8 ~) _6 t
//扩展数据,用于定义取用分笔成交数据的买卖盘 的结构7 r0 u5 t, G: M/ j  K. x
typedefunion tagSTKDATAEx5 l8 r9 ]- ~! Y0 @+ j5 O
{
& S7 ^, w# `; x2 X' i% Vstruct
6 O  T0 J: y2 H" i# m3 Y{
6 f4 i; i, c3 ^$ efloatm_fBuyPrice[3]; //买1--买3价floatm_fOpen; //开盘 open; g. [8 {& A6 y: |
floatm_fHigh; //最高 high
$ [7 C3 i6 X( E4 H- Sfloatm_fLow; //最低 low( Q4 L( i! D& L7 n
floatm_fClose; //收盘 close
1 \9 `3 U3 a7 D- ]5 V6 qfloatm_fVolume; //成交量 Volume; O% M$ q. l% \5 C& H. m8 A, q$ R
floatm_fAmount; //成交额 amount
. U# i8 a0 W! M6 pfloatm_fBuyVol[3]; //买1--买3量
* G% \7 E3 ^: {5 Yfloatm_fSellPrice[3]; //卖1--卖3价
4 ^' X8 W! x. Q% j4 hfloatm_fSellVol[3]; //卖1--卖3量% Z6 ^$ p5 [5 r& ~3 `3 g: `  X1 Z- N
};
# \) o. [3 E9 M$ C* E2 J9 e1 Kfloatm_fDataEx[12];
- ~- }1 }8 m; k: m; U8 H4 }( R3 r}STKDATAEx;7 [2 p+ ]4 ~6 `; S+ O. R: _
////////////////////////////////////////////////////////////////////////////
' K0 G! ?3 [* w//定义取用除权数据的结构
9 |* Z  }& n1 B( w# ]; g7 O& etypedefstruct tagSPLITDATA
3 A% V0 y2 l1 j% O{6 J, E) r9 o9 e6 l1 h0 n! f
time_tm_time; //时间,UCT
) V  ]1 {: g: A+ |/ V, `: J- M6 I0 [floatm_fHg; //红股
3 X) {4 v% q2 X/ G, nfloatm_fPg; //配股) X+ E; X, Q4 c7 n( W# B
floatm_fPgj; //配股价
; q4 w7 \. j9 m4 f1 D* d5 G% M' F; ofloatm_fHl; //红利
5 V( ?! j5 G+ J}SPLITDATA;
: \# d  f* l7 _0 W7 B! j6 B/////////////////////////////////////////////////////////////////////////////
" `* O9 x& ^" o8 B9 j/*财务数据顺序(m_pfFinData内容)/ A5 I8 K/ U5 ~1 H5 v! v; t
序号内容
6 _3 L' \& e, o; {, E' L0总股本(万股),
2 M5 T  H7 R3 i: S1 s) o1国家股,
* x3 \' b6 z8 a6 g% ^2发起人法人股,
4 _, ~  b1 ?2 A$ s  h: V% e3法人股,4 l& Z2 s7 z3 L& L* ~
4B股,! U3 ^6 D6 P3 f" R; k/ k, ], A
5H股,* ^: e" B/ f9 E
6流通A股,
  n6 L, }7 G7 q. Q9 a7职工股,
% U" w0 ^3 p- h; O8A2转配股,; a8 [# g4 S% l' s5 c
9总资产(千元),
- M) s) W! t5 z& o5 m$ i. c10流动资产,
, r9 G  h$ j- h5 c/ [11固定资产,/ s4 t# g% ?& O
12无形资产,
3 m9 _9 d  a' U$ a13长期投资,
- q$ x: j- N- y) ?4 N14流动负债,9 q, Q: v5 p- B% n! u( ?. R7 F
15长期负债,/ l2 T9 B# R5 e0 a
16资本公积金,* L: l& b$ n. X3 i. \& |* q
17每股公积金,
; F2 p/ b' K" H18股东权益,# d: f) a. \) }' y( X1 o3 |" G1 K
19主营收入,
8 A1 X5 T; r3 k+ w1 I20主营利润," j( V+ X3 R5 H( n' l
21其他利润,
- @# C" h0 x' j; k* ]22营业利润,
3 Y: d9 f# c4 ^3 @4 Z0 ?23投资收益,: P9 o) R8 U1 k/ q0 C+ B6 F
24补贴收入," j, d5 E/ d: B* T/ z8 m; }# r
25营业外收支,
( o0 P5 M7 E9 _$ G% h7 L26上年损益调整,7 e7 r$ C% k& E7 {2 `* G5 f
27利润总额,
; i  p0 y& ]5 Y4 a* D) h2 i28税后利润,
+ ~. e1 G& [# o3 H' j0 ^" }29净利润,
1 p7 N3 g8 y3 y' f) r30未分配利润,
2 u! W5 s+ W7 M  I3 c$ k31每股未分配,
. }: [* G7 O, V/ z3 j+ x* A( x9 }/ I32每股收益,, ?5 A6 s# |# o* t! _+ S: ^+ K. u
33每股净资产,2 ]( n8 @* L. b1 e
34调整每股净资,
4 W% s4 R$ x- Q+ Y/ o: G/ r" h35股东权益比,
3 x9 t/ U0 c+ E# M8 K36净资收益率: K, {! q8 n- @( S' B0 ?
*/( K; X2 T# L2 L! }, N( W* V
/////////////////////////////////////////////////////////////5 a# u0 C: _5 ]3 G: I
//定义取用caller函数传递参数项 的结构
- k3 [* R8 h9 a( Ftypedefstruct tagCALCPARAM: L- l/ _% [9 D& n0 f
{2 A; ]- d0 O! l2 z. d
union
% F. f. @1 T* \2 [{( i) h$ x: |0 f* E1 m
constfloat* m_pfParam; //指向序列参数的址标,指向一个浮点型数组pointertofloat variable parameter / ex. c,h,l,o, co2...co2=(c+o)/2
, ]" S# i; f- |$ w! Pconstfloat m_fParam; //数值参数 valueof parameter
- [1 ?& k# Z6 R* M+ s};  @& e4 r) e- L: Y
constint m_nParamStart; //序列参数有效起始位置thestart address of variable parameter / ex. c,h,l,o,co2.....
7 q* N! u; M  Q}CALCPARAM;
9 V4 L+ ^$ w3 Q# ~- t, V  J/////////////////////////////////////////////////////////////////////////////2 ]4 G1 K3 i6 p' E0 G
//定义全部取用址标 的总结构 (各指标指向前述各结构以便取的各结构的数据,接口信息数据的结构 )2 B9 f- n& n" Q5 s
typedefstruct tagCALCINFO
$ J9 x( R; ~4 x! v6 o{* T2 U: t6 q, U' Y$ r$ |
constDWORD m_dwSize; //结构大小
5 L5 @  `9 h  l9 SconstDWORD m_dwVersion; //调用软件版本(V2.10: 0x210)
( z7 g# K* K+ l, \, T, VconstDWORD m_dwSerial; //调用软件序列号# g/ p7 V' O$ L4 q& t
constchar* m_strStkLabel; //股票代码3 f) V2 b4 N: ]0 R( B5 K
constBOOL m_bIndex; //大盘* }' ?2 z" g/ M( c3 l% Y
constint m_nNumData; //数据数量(pData,pDataEx,pResultBuf数据数量)数据长度
! o% b5 M- I0 h  t: `. x4 nconstSTKDATA* m_pData; //常规数据,注意:当m_nNumData==0时可能为NULL* z: x4 o7 J6 o5 i
constSTKDATAEx* m_pDataEx; //扩展数据,分笔成交买卖盘,注意:可能为NULL
& |4 ^5 y3 ^8 O% U; x7 T9 {8 Gconstint m_nParam1Start; //参数1有效起始位置<0/ constant parameter >0 /variable parameter : C1 A1 B4 a+ A+ @
constfloat* m_pfParam1; //调用参数1/pointer to variable parameter 1
/ e: {1 x) z+ X4 ]  N1 k3 lconstfloat* m_pfParam2; //调用参数2/pointer to variable parameter 2( a% ~+ n, J, n  E
constfloat* m_pfParam3; //调用参数3/pointer to variable parameter 3
5 _5 ?3 }( o/ z! y* T; a1 |. W: Zconstfloat* m_pfParam4; //调用参数4/pointer to variable parameter 4
) |) _. M% `" I8 B8 W1 v' cfloat*m_pResultBuf; //结果缓冲区$ P- p2 |; M3 U/ X
constDWORD m_dataType; //数据类型
+ g" ]3 ~& `/ K$ v. F. V4 R% ]constfloat* m_pfFinData; //财务数据" t: p" e& s/ O
//以上与分析家兼容,所以沿用其结构和名称% f' _' n  f& N' o( u& \8 r2 y2 b
//以下为飞狐交易师扩展(fortagSTKDATAEx)
1 _% a* ~' S4 I) F/ B( iconstDWORD m_dwReserved; // 保留
. m/ C, j+ z( a) Z, V4 G' q2 aconstint m_nNumParam; // 调用参数数量: a: F/ w( ~: W  ~% G! {2 Y" M
constCALCPARAM* m_pCalcParam; // 调用参数数组7 z+ A- Q/ @) O0 u# E# ]6 n, A2 W
constDWORD m_dwReservedEx[4]; // 保留7 K! S0 p8 M$ Q* w5 H
char*m_strStkName; //股票名称, @/ K; D( G' W5 L  h
SPLITDATA*m_pSplitData; //除权数据$ I- I! w5 J) @
intm_nNumSplitData; //除权次数
/ b4 E+ V9 u& g: b) h}CALCINFO;
/ v% n7 Q; v7 x5 Y/*
4 l3 T) X" a" v; u注1:(与分析家兼容), w3 D8 ^2 x% Q/ A* K) s4 C3 t
1.函数调用参数由m_pfParam1--m_pfParam4带入,若为NULL则表示该参数无效.
9 B7 P$ s* A* r6 ]3 X! ?: A. V+ [2.当一个参数无效时,则其后的所有参数均无效.+ N; S7 o2 h6 T* N6 a5 S7 D( Y
如:m_pfParam2为NULL,则m_pfParam3,m_pfParam4一定为NULL.
/ P8 I; i1 H- L/ p! t: q3.参数1可以是常数参数或序列数参数,其馀参数只能为常数参数.
- |# R" F" k" x* V4.若m_nParam1Start<0,则参数1为常数参数,参数等于*m_pfParam1;
  ]6 T9 y% N6 ?) S) y; g% x5.若m_nParam1Start>=0,则参数1为序列数参数,m_pfParam1指向一个浮点型数组,
' U) S! z0 D, L* G数组大小为m_nNumData,数据有效范围为m_nParam1Start至 m_nNumData-1.4 D" |  F) W3 b4 b
在时间上m_pData[x]与 m_pfParam1[x]是一致的
+ A1 d8 D, Y1 C& m注2:(飞狐交易师扩展), r  q0 U- D  V
1.该扩展结构使调用参数在技术上可以是无限数目的,且每个参数都可为数值或序列,由公式中实际的调用参数决定。( Q& o+ Z1 |2 q  P( o$ x
2.CALCPARAM结构用于带入参数信息和实际数据,m_pCalcParam数组大小为m_nNumParam,数据有效范围为0 至m_nNumParam-1.
( f. R# C6 n) g( s6 t3.按参数的顺序,m_pCalcParam[0]为第一个参数的数据,m_pCalcParam[1]为第二个参数的数据...,为了保持兼容,原m_nParam1Start、m_pfParam1等5个属性依然有赋值。
# ~( d% `$ V) j. o! u, G4.若i位置的参数为数值,取用m_pCalcParam.m_fParam.
$ `% [; v  Y2 E* |# n) `: ~5.若i位置的参数为序列,取用m_pCalcParam.m_pfParam,数组大小为m_nNumData,数据有效范围为m_pCalcParam.m_nParamStart至 m_nNumData-1.若m_pCalcParam.m_nParamStart<0,则此数组中无有效数据。
- I% r/ Z. S% [# |  w6.由于可以调用多个序列,许多序列的计算可以先在公式中进行,然后作为调用的参数即可。. |$ c7 o( i  ]9 m2 C1 W
7.经此扩展,对分析家的DLL依然可以调用、兼容。0 C$ W1 y6 p9 i5 \7 R$ W
*/" g5 P0 Y; P" i+ F
///////////////////////////////////////////////////////////////////////////////////
$ h. B& s! ^# @' O9 p; c( Q. g/*函数输出
! C4 d6 e1 ]; s8 |, I- K__declspec(dllexport)int xxxxxxxx(CALCINFO* pData);# ]7 U: A: ~$ c6 S  C/ O) N
1.函数名称需全部大写.
8 M5 J2 ~% G  X( I2.函数必须以上述形式声明,请用实际函数名称替代xxxxxxxx;
7 T8 D; i" f1 f" ?( M5 |对于C++程序还需包括在extern"C" { } 括号中.
) S/ G$ o, j. w$ l. z4 m& y) o3.函数计算结果用pData->m_pResultBuf带回.+ o, ?  A7 V$ R: ?9 \
4.函数返回-1表示错误或全部数据无效,否则返回第一个有效值位置,即:+ C7 n8 X0 W$ d7 ^5 S8 X* ]& L9 b
m_pResultBuf[返回值]-- m_pResultBuf[m_nNumData-1]间为有效值.
: P! D* X% i. w" m8 v( a5.函数名称长度不能超过15字节,动态连接库文件名不能超过9字节(不包括扩展名),动态库名称不能叫SYSTEM,EXPLORER6 C, c$ `( R" t9 v: r: J9 T
*/! k4 ?8 n4 D( c
//示例函数,使用时用实际名称替换
7 l* m" C& j3 z. B# ]$ I__declspec(dllexport)int WINAPI MYMACLOSE(CALCINFO* pData);
. _5 P: _# l9 V& Z! W# ]& i__declspec(dllexport)int WINAPI SMOOTH(CALCINFO* pData);. ]1 P1 T6 x% ^
//__declspec(dllexport) int WINAPI MYMAVAR(CALCINFO* pData);
7 f2 w1 ^0 \" B# ]9 g. S__declspec(dllexport)int WINAPI MYBBI(CALCINFO* pData);
6 H- b) N- v& K; s//WINAPI = _stdcall
3 J4 [- i( a- ?6 ~#ifdef__cplusplus* s. j8 f' d4 I7 x3 }( |# x6 W9 c# S
}
% ~! t. a( L( j' n& M2 _#endif//__cplusplus5 d8 W3 n8 K- O! j
#endif//__FOXFUNC_H_INCLUDE
- f9 o1 g" ~7 O. A, `+ X: V. h4 ^9 |% s4 j1 E$ k$ J
//////////////////////////////////////////comment 注解& o( `' S4 L3 H( K, \
__declspec(dllexport)int WINAPI MYMAVAR(CALCINFO* pData)* a8 P% I+ ^( q
pData是指向 址标总结构 CALCINFO的 总址标) n" J& O" Y0 t
取用第二个参数数值floatfParam = *pData→m_pfParam2
8 r9 n$ X- i5 s取用第一个序列参数的址标constfloat* pValue = pData->m_pfParam1;
7 j3 I. @/ e& k( S! Q取用股票数据长度intndata = pData→m_nNumData;- C1 u3 i* u# I& ~+ y3 q8 i  b
第一个参数存在且为数值pData->m_pfParam1&& pData→m_nParam1Start<0' C" L" }" \* B/ h" h
第一个参数存在且为序列pData->m_pfParam1&& pData→m_nParam1Start>=01 r: f% T$ [5 Q6 \
第一个及第二个参数存在且为序列,第三个参数不存在pData->m_pfParam1&& pData->m_pfParam2 && pData->m_nParam1Start>=0&& pData->m_pfParam3==NULL
, C. d/ k* t: Y# ]8 @# P6 ^7 }constfloat* cpParam = pData->m_pfParam1; 定义cpParam为第一个序列参数的址标* x$ S2 J( ?1 S5 l
取用股票数据结构' _$ D1 K8 K# t8 w# R# i
pData→m_nNumData= 变数数据长度$ e9 A- m/ T6 y6 i
pData→m_pData= pointer to struc STKDATA 的址标
. |' T# i$ h# ~. h2 z2 @pData→m_pData[x]数据结构的第x个数据
6 S9 e2 a# d% z$ O7 Q3 Z6 [2 k' ^+ zpData→m_pData[x].m_fHigh数据结构的第x个数据中的 High
. f) B: z" Z0 a6 s% o$ v取用结果缓冲序列
0 \) U+ B2 g" Y7 TpData->m_pResultBuf
# k* j) m7 a+ W' a1 c( W' r取得第一个序列参数的起始序位,如 2,...5 , . 7...8 _  R# I' t4 ?8 w8 L3 g2 q! ~
intnFirst = pData->m_nParam1Start; ) U3 K; D, T* I0 [9 U& ^. Y. [( ^
for( i = nFirst+nPeriod-1; i < pData->m_nNumData; i++ )& x! u6 `0 {- E2 y( F
取得第二个数值参数的数值' c9 i/ \8 [5 i9 T  @
floatfParam = *pData->m_pfParam2;
  x3 _$ c+ E7 w- T, l+ RintnPeriod = (int)fParam;4 x1 C5 T& P  R1 {3 t9 J
取用第一个序列参数的址标constfloat* pValue = pData→m_pfParam1;. z! {& i3 H9 c" T# r- G$ s6 V
取用序列参数的单个直pValue
/ W1 n! W  K# X4 l# H取用缓冲序列的单个值pData->m_pResultBuf: o' E. u' g' p" [6 [6 U: T; i
constCALCPARAM* m_pCalcParam; // 调用参数数组
$ F) Z/ p) n  q3 i( w  e9 U- R- {m_pCalcParam为序列址标,指向各序列参数的指标6 L, O* w3 R) \6 P7 \
第一个序列参数pData→m_pCalcParam[0], t7 m8 C1 g. ]! E& y
constfloat* m_pfParam; //指向序列参数的址标/ K( X' s; w& x- C) s/ ?. O* Z
第一个序列参数的起始序位pData->m_pCalcParam[0].m_nParamStart0 A+ Z, O7 a* K8 G% e: Q0 I
第一个序列参数的址标constfloat* pValue1 = pData→m_pCalcParam[0].m_pfParam;
, e& G* i6 C7 d7 S9 O; K9 G, f+ M9 M! K取用第一个序列参数的单个直pValue1/ I4 ]. v8 {, B& K+ C9 a- g; _% D
第二个序列参数pData→m_pCalcParam[1]
+ Y& F" I) E1 e/ \* H* U第二个序列参数的起始序位pData->m_pCalcParam[1].m_nParamStart
. C% `3 z- x# g第二个序列参数的址标constfloat* pValue1 = pData→m_pCalcParam[1].m_pfParam;! I$ `) Z0 P+ s6 b' n! ~" J
取用第二个序列参数的单个直pValue2* r# o+ |; i  e% k7 p9 z* A
第三个序列参数pData→m_pCalcParam[2]
' B+ F4 R  h4 g4 L第三个序列参数的起始序位pData->m_pCalcParam[2].m_nParamStart
1 y8 k* Y$ G: M. \第三个序列参数的址标constfloat* pValue1 = pData→m_pCalcParam[2].m_pfParam;
) u; i' i( q- `( X取用第三个序列参数的单个直pValue3. K# ]- ?" O- I& c2 ~' p% T% a
第四个序列参数pData→m_pCalcParam[3]
3 ]8 a  f, {. y第四个序列参数的起始序位pData->m_pCalcParam[3].m_nParamStart5 z) ?' j3 g4 O# |% t2 a: y* a
第四个序列参数的址标constfloat* pValue1 = pData→m_pCalcParam[3].m_pfParam;/ M' u. H# e- B7 Z* `6 v3 o2 _$ {
取用第四个序列参数的单个直pValue4; V& B1 s# r+ ^% Q0 O( X- }
如果有四个序列参数,则取用序位最高的那一个序位
% i1 `7 ?% p' \if( pData->m_pCalcParam[0].m_nParamStart >= 0 &&
/ K7 n$ a8 f( @& d2 N* _pData->m_pCalcParam[1].m_nParamStart>= 0 &&
# x4 h' T6 e( o$ Z9 b  h% qpData->m_pCalcParam[2].m_nParamStart>= 0 &&; S' a  ~( k7 y  }
pData->m_pCalcParam[3].m_nParamStart>= 0 ) //4个序列都含有效数值& @+ ?5 }. k( l
{# u" t, q' g9 F& V% t9 j1 m- Q
//计算返回的序列的第一个有效值位置
  D4 ?; O6 K, ^& w' M+ N" WintnFirst = pData->m_pCalcParam[3].m_nParamStart;//已知返回的序列的第一个有效值位置与第4个序列一致- P/ z/ o0 T/ R4 S: R
//若不知,则
2 d7 K6 k% m2 [; v$ Z: n7 f$ y) J5 u/*
% I1 s% A3 o' n- ~+ NintnFirst = pData->m_pCalcParam[0].m_nParamStart;& ~2 A& t9 h- L% F* C  K' B
if( nFirst < pData->m_pCalcParam[1].m_nParamStart )
. I! `. S/ G! l1 v( [nFirst= pData->m_pCalcParam[1].m_nParamStart;! A5 q0 N8 ?# V1 I
if( nFirst < pData->m_pCalcParam[2].m_nParamStart ) / J1 b2 M4 R6 `' s# u5 S  A
nFirst= pData->m_pCalcParam[2].m_nParamStart;
5 R& D5 j9 x0 e' n0 P7 \if( nFirst < pData->m_pCalcParam[3].m_nParamStart ) $ y4 ]8 v. z( t8 z
nFirst= pData→m_pCalcParam[3].m_nParamStart;
7 l, o2 G) f: V( B. h+ dconstfloat* pValue1 = pData->m_pCalcParam[0].m_pfParam;' d/ {1 G( W" Z0 z: o8 g
constfloat* pValue2 = pData->m_pCalcParam[1].m_pfParam;
( Z" Z; Y$ P  c# z3 Y9 k8 Cconstfloat* pValue3 = pData->m_pCalcParam[2].m_pfParam;
$ P% C$ r4 T. ^- t$ ^1 Gconstfloat* pValue4 = pData->m_pCalcParam[3].m_pfParam;
* h2 S2 Y4 W1 g: S2 ^//-------------------- u  {% z9 j+ z% M. L) L
floatm_fOpen; //开盘 open
  S. a* k' t! ]floatm_fHigh; //最高 high
% D/ d" p. E+ t: Bfloatm_fLow; //最低 low9 V: e; |! `- e
floatm_fClose; //收盘 close
- G$ q5 z1 R. H: l9 P. w% a% Wfloatm_fVolume; //成交量 Volume" j5 b' a2 h" h% q- j
floatm_fAmount; //成交额 amount
, M6 n" O6 i& x调用收盘据
# F1 Y5 o! ?3 S  tpData→m_nNumData= 变数数据长度
, T( V: n/ n8 k, S: @pData→m_pData= pointer to struc STKDATA  ^$ s, [2 P$ D$ Y
pData→m_pData[x]第x个数据4 L0 D! r* f9 P* j2 i: w3 H1 k
pData→m_pData[x].m_fHigh第x个数据中的 High1 g8 T0 `1 J- p- }# B. \! _% C, m8 Q
@@@@@@@@@@@important !!!!!!!8 c+ e6 J: D' d( U
sinceVC++ 2008, cl.exe will make ‘pData→m_pData[i-j].m_fClose’ anerror
6 j5 k& b2 R1 ]5 C& t; F  c+ d4 Gso,pass the high,low,open and close just from the function parameter ,that is use ‘ CALCPARAM’ struct
! i% S# ^( h* ]/ F5 H: a( ^5 u2 upData->m_pData[i-j].m_fOpen// to use open , there is no way in using a varable for calculationoutside foxtrader
! K# U% ]/ ^# x3 n( @pData→m_pData[i-j].m_fHighto use high% q% J- R$ Q* J3 f& z. T& u0 @( P
pData->m_pData[i-j].m_fLow7 m( \) ?3 Z9 Z. j
pData->m_pData[i-j].m_fClose
9 ^4 B( c6 q+ O5 S; i. M1 [: a, sm_pData= pointer to struc STKDATA
- l# i$ O0 a( t4 K* y* Hincalling C++ dll function0 A. y0 d' {6 x2 h5 n$ c$ X3 J4 y
m_pDatais passed to pData (CALCINFO* pData . A CALCINFO* type pointer). Y0 z5 o  \& ~
touse a single value in variable ‘High’
  B" B: _2 M2 }0 D0 PpData→m_pData[i-j].m_fHighto use high! E$ x& u8 A: s* p: L
constfloat* m_pfParam1; //调用参数1/pointer to variable parameter 1 ) x1 R' X/ v  o& Z' A1 i' ]
constfloat* m_pfParam2; //调用参数2/pointer to variable parameter 23 r4 ~) o3 L5 @9 ~
constfloat* m_pfParam3; //调用参数3/pointer to variable parameter 3
1 H$ G3 i9 u% X5 z+ D* P& Mconstfloat* m_pfParam4;
( A' J/ k- x* Lm_pfParam1,m_pfParam2, m_pfParam3, m_pfParam4 = pointer to caller function 的参数
: r' O' M# k7 }6 o! T! l7 q* J9 I% zpData→m_pfParam1= pointer to 第一个(序列)参数7 \. m5 {$ S3 b! {4 g" a
pData→m_pfParam1[x]= 取用第一个(序列)参数的第x 个值
# p, g9 @# t& M9 N; t" Oconstfloat* cpParam = pData→m_pfParam1; =定义 cpParam为 pointerto 第一个(序列)参数  o$ \9 u4 a% A9 y2 e# b* K+ Q6 K8 H
cpParam[x] = 取用第一个(序列)参数的第x 个值$ x6 C2 D; h; q6 N- Q3 s  h
m_pResultBuf= 结果缓冲列% z) B0 x4 O: l+ L% ~* M% ^$ L, w
pData→m_pResultBuf= pointer to 结果缓冲列
5 S- a6 j) G0 z. x0 Q) \; vpData→m_pResultBuf[x] = 取用结果缓冲列的第 x个值
* b6 N, W& @% D" M//////////////////////////////////////////comment! l# w0 J7 s/ ]: H
//////////////////////////////////////////comment 注解" E6 b# H4 @8 f$ t9 U3 \1 A
constint m_nParam1Start; //统杅1衄虴宎弇离, b& t9 D! x( i" t
constfloat* m_pfParam1; //覃蚚统杅12 l! x; g8 y2 R" g' A
constfloat* m_pfParam2; //覃蚚统杅2
" Z7 P( U& x9 X7 Z3 Econstfloat* m_pfParam3; //覃蚚统杅3
( b8 R" W3 J1 `4 A. o) m3 T9 uconstfloat* m_pfParam4; //覃蚚统杅4,parameters must be <= 4$ s/ N# |( N( D+ X% l$ r
//const float* m_pfParam5; // parameters must be <= 42 K% M7 M! k* h5 {' U* }* K
//const float* m_pfParam6; * |+ B. e$ \4 e5 t! L9 B6 c
//const float* m_pfParam7; 6 b/ o0 J# C! F" |0 \- v
//const float* m_pfParam8;
1 m" G. O% z: y4 F) n& I//pData->m_pfParam1 && pData->m_pfParam2 &&pData->m_pfParam3 && pData->m_nParam1Start>=0 &&
: F& T0 m/ X6 ~# C. WpData->m_pCalcParam[0].m_nParamStart>=0&& pData->m_pCalcParam[1].m_nParamStart>=0
9 X& a) W; B! }  E0 T7 n' J&&pData->m_pCalcParam[2].m_nParamStart>=0)
8 B/ y# T, W; U& F7 Q0 j{
! s( P: J% m* R" ?. O, |floatfParam = *pData->m_pfParam4; //pointer ,pData->m_pCalcParam[3].m_nParamStart >= 0
" p$ Z* ~' O! n/ TintnPeriod = (int)fParam; //统杅1
! x2 ~. p& s  H* d! F/ m6 x# U//const float* cpParam = pData->m_pfParam2; // cpParam = pointer to第一个序列参数,cpParam = 取用第一个序列参数的第i 个值
0 C& ]/ J" k" ~" n1 Gconstfloat* cpParam1 =pData->m_pCalcParam[0].m_pfParam; // cpParam =pointer to 第一个序列参数,cpParam = 取用第一个序列参数的第i 个值/ k4 q% O& t- J" I3 U$ m1 u9 o9 {( Z
constfloat* cpParam2 =pData->m_pCalcParam[1].m_pfParam; // cpParam =pointer to 第一个序列参数,cpParam = 取用第一个序列参数的第i 个值4 L% q0 p: @/ [/ ]
constfloat* cpParam3 =pData->m_pCalcParam[2].m_pfParam; // cpParam =pointer to 第一个序列参数,cpParam = 取用第一个序列参数的第i 个值//parameters must be <= 45 {; L5 s+ o& B1 x9 {
//const float* cpParam4 =pData->m_pCalcParam[3].m_pfParam; //cpParam = pointer to 第一个序列参数,cpParam = 取用第一个序列参数的第i 个值& @$ }" m7 y/ Y, f2 g7 D
//const float* cpParam5 =pData->m_pCalcParam[4].m_pfParam; //cpParam = pointer to 第一个序列参数,cpParam = 取用第一个序列参数的第i 个值
! {! M) r, N9 f, O, {$ H//m_pData = const struct pointer to struct STKDATA , pointer to structSTKDATA , ( k+ t& }/ r! n0 ~7 \$ q
touse pData→m_pData[x].m_fClose) L' g- J. z2 V5 P
pData→m_pData[x]= | 1,2,3 , … , m_nNumParam | time_t m_time;
& x% k- V) w7 j# }( j$ O; s- W|1,2,3 , … , m_nNumParam | float m_fOime_t # r' _/ O6 f0 U6 \5 w$ E' f9 `4 u9 M
|1,2,3 , … , m_nNumParam | float m_fHigh;# F1 q  L" `* \' }3 C: Z
.. .
, k: q  p3 K; W, u+ c+ P2 s. _|1,2,3 , … , m_nNumParam | WORD m_wDecline;: P5 T) N& b$ u1 `& B
m_nNumParam= 数据high,close,open,low的长度
; N" m0 d' z) N+ etouse high:$ K+ }" V$ o1 w( {& `
pData→m_pData[x].m_fHigh& v1 x: M5 d$ K
contentof struct STKDATA
1 l$ a0 H& {6 b& M) xtime_tm_time; //时间,UCT; G6 Q' i/ o! I" E2 W5 q1 Z
floatm_fOpen; //开盘 open
& b/ Y  D" _/ `+ H! j* [floatm_fHigh; //最高 high2 v& S, f& D; c3 y9 L
floatm_fLow; //最低 low7 S1 u0 M  ^+ C' K0 t7 o
floatm_fClose; //收盘 close6 z3 z/ w' {! ~' A/ g. E1 y2 H
floatm_fVolume; //成交量 Volume
7 q& ]( E6 c- s% G$ B. `& afloatm_fAmount; //成交额 amount
% E6 N- o3 Z% N# W- SWORDm_wAdvance; //上涨家数 仅大盘有效2 _8 l& Z5 @, ?- ]4 a
WORDm_wDecline; //下跌家数 仅大盘有效3 y) V' t$ \0 U
调用传递参数及传回结果- L4 a3 X- c* _: Y; @+ B+ l
调用传递参数
/ c& o9 q' X+ e0 r(pData->m_pfParam1 && //参数1有效Param1exists
( ^2 e4 a# \0 c8 i' apData->m_nParam1Start<0&& //参数1为常数
  u& C' d1 d" dpData->m_pfParam2==NULL) //
/ e0 I2 `: O; blocalprocedure 定义使用变数3 G& i$ a. f# A; _: L
onstfloat* pValue = pData→m_pfParam1; //use constant参数1' X" {9 h% }* c. ^$ z; `7 V
intnFirst = pData->m_nParam1Start; //use 参数1效值起始位3 j$ ]" ^6 }3 @: ?5 |& X9 M
floatfParam = *pData->m_pfParam2; //use 参数2
  V* ?+ Z. C+ J0 c# k6 L, l6 Q8 J0 D9 rintnPeriod = (int)fParam; 9 n. c( x: \. z+ D, M
传回结果
, _. A, A, v0 \- j! zfTotal+= pValue[i-j];
! D$ q# D7 l/ Q# f7 O6 ^pData->m_pResultBuf; _0 _6 S3 ~; G5 O4 f
//////////////////////////////////////////comment




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