阳光飞狐

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

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

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

[复制链接]
跳转到指定楼层
1#
发表于 2019-8-11 16:09:40 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
许多年以前,我曾经在# J9 \. Q: C- H1 J% x
理想公式区发布了
2 `* P* K7 _' J' E* _. K0 Y- u"2 m9 I, M* M. `2 I2 [$ \  c
如何用 Foxtrader(飞狐)连结 C++动态程式库 DLL及 80x86Macro Assembly (组合语言)1 R4 H9 w$ \* W9 V  d' c6 }: M
"2 H( h6 l3 Z' }; e
9 v- E6 X. O; A) ^
现在更新foxtrader(飞狐交易师) " }$ a8 |2 Z7 o8 `& X; R/ z6 _
连结 DLL的方法
( e$ j2 ]# A! ]" G; g; D% E7 w& x$ A6 D  [6 s
foxtrader- - > DLL (C++ and assembly) = ( foxfunc.h + foxfunc.cpp +pow10.asm )- d. {& A. l2 b& Z# D# p# e/ j& l
gauss- - > DLL (C++ and assembly) = ( foxfunc.cpp + meigj.asm )1 T9 m' I; ]1 Y
gauss只用到函数参数传递,所以使用新的 c++compiler, 不受影响( Y7 u+ r# H- I& T4 X7 V# w( E
foxtrader的 foxfunc.h宣告的结构型态 (struct)在 2004vc++ 6.0 全部有效1 f$ ~! E- N9 j8 {. `

8 Z8 O9 n0 O$ i也就是这五个结构都能用
5 ]3 k) h7 h  L6 V/ s) {7 Itypedefstruct tagSTKDATA ) R. U3 K7 m. m$ }( t- X/ B
typedefunion tagSTKDATAEx
9 K# f8 @& m" p" N: t; Z' [6 ztypedefstruct tagSPLITDATA
. i+ |6 Q8 U, A. h% n7 B/ m/ I: stypedefstruct tagCALCPARAM- g. F- ~) ]$ z1 g; O. `) n
typedefstruct tagCALCINFO
) F& k* M% u$ e2 ?- I+ t, ^
9 S! G; q$ S9 m, Q5 G+ g- L; ]自2008年起,vc++ 2008, vc++ 2010, vc++2017 对struct的编译,已经完全 c++化,不再相容于 C
- g( Q' f5 b/ z' [# m7 J也就是这五个结构中
$ |' v: [. |9 t# P) \typedefstruct tagSTKDATA ! O: h7 \2 ]9 }# K+ d
typedefunion tagSTKDATAEx
7 I+ ~7 e; J6 o6 ctypedefstruct tagSPLITDATA 5 S: K6 x# d/ e
typedefstruct tagCALCPARAM
9 b% E) T3 ]! B6 @8 h6 }/ A$ ^, xtypedefstruct tagCALCINFO
, ~, @, @5 N6 D9 l4 G只有这两个可以用
2 T3 R6 @6 q! t0 |' ^typedefstruct tagCALCPARAM3 U# @; w% `9 V5 S
typedefstruct tagCALCINFO  j3 P7 ~/ n0 p  E' o" S
值得庆幸的是,下面这个结构的函数参数传递个数可以有无数个% I6 g: U2 T0 }. m
typedefstruct tagCALCPARAM
6 W( j0 M& R! K4 `% c8 A' {% i例如:在 foxtrader中. I" @' C* X% v. Q; C# j  M
MA1:=MA(CLOSE,3);
# J7 M6 X- a3 ?7 _" g5 lMA2:=MA(CLOSE,6);
% ~9 G5 W7 U9 w& M, s5 K9 ]MA3:=MA(CLOSE,12);
# h" w; h& c+ K0 P/ l0 IMA4:=MA(CLOSE,24);
  O' `  E7 n( ^MYBBI1:"MYFUNC2017@MYBBI"(MA1, MA2,MA3,MA4,MA3,MA4,5)*0.95,colorff00ff,linethick3; {2017 vc++ 15.0}- b2 `3 g, D! R2 s$ @3 I
其中MYFUNC2017=MYFUNC2017.dll, MYBBI = MYFUNC2017.dll 中的MYBBI函数,这里 MYBBI函数传递的参数共有 7个" h& J4 [: W* h- H8 Q, T9 T
下面这两式计算结果相同
+ j7 D! A  x. Y) V& Qxx:(MA(CLOSE,3)+MA(CLOSE,6)+MA(CLOSE,12),MA(CLOSE,24),MA(CLOSE,12),),MA(CLOSE,24)/6*0.95,color0000ff,linethick2;{foxtrader 自行计算}# N) \: i* j0 F. \
MYBBI1:"MYFUNC2017@MYBBI"(MA1, MA2,MA3,MA4,MA3,MA4,6)*0.95,colorff00ff,linethick3; {2017 vc++ 15.0 , dll计算}
/ i+ ]+ E  L9 i: j( i其他例子! H/ G. Z& b4 |0 B2 N' \3 \
oooq:="MYFUNC2008good@MYMACLOSE"(c,,c,c,6),colorffffff,linethick5;(---> pow10.asm)1 E* I* t6 w' v! g2 ^, k$ A
oooq1:"MYFUNC2010@MYMAVAR"(ma(c,5),5),colorgreen,linethick5;
5 T3 P- y$ M# h: W4 Q1 ^其中pow10.asm里面有很多不同定义或宣告被注解不用,那是因为后来在逐步侦测法修改语码中才发现在foxfunc.cpp主程式中,下面这行错误,也就是新的 compiler不再相容于 C,因此在pow10.asm里面被注解不用的定义或宣告中,有些应该是可以用的9 o( V: C8 T4 Z) Y
fTotal= pData->m_pData.m_fClose; // @@@@@@@ vc++ 2010 cl.exe 使pData->m_pData[i-j].m_fClose错误
$ _& `8 c" U6 x1 a( `
3 x- p0 f; P' Q; k% _, u. q: q4 K! I' F% z- t  _; m
////////////////////////////////////////////////////////foxfunc.h
9 C# j5 q& p7 F2 f* L$ X#ifndef__FOXFUNC_H_INCLUDE
, ~7 C; f/ c, @& C- f#define__FOXFUNC_H_INCLUDE
% B- u; u6 z! @0 ~/*
( }: y# j9 ~+ U( O5 Y7 S. G7 m! b8 j飞狐交易师“C语言接口”扩展程序调用接口规范V3.0
' Q3 j, o& x& e/ y7 m" B  |1.本规范适用于飞狐交易师V3.x公式系统.
  k6 W6 I% Q3 t- g8 T# O; ?3 v0 H( d9 P2.扩展函数用于实现系统函数不能实现的特殊算法.
% k4 K( y% H! E2 J) X3.扩展函数用windows32位动态连接库实现,建议使用MicrosoftVisual C++编程.
' w, u" e, W+ w" \) V. g6 N* D4.调用时在公式编辑器中写"动态库名称@函数名称"(参数表)即可,例如下面函数可以写为"FOXFUNC@MYMACLOSE"(5)
/ F# g* ~/ k# ]2 z/ a" f5.动态连接库名称和函数名称可以自己定义.* R4 E" _' h5 F+ R, V: [1 ~
6.使用时必须将动态库拷贝到飞狐交易师安装目录下的FmlDLL子目录下使用.
! I5 S6 S+ \7 J*// f" W( ]. n* v! G6 m
#ifdef__cplusplus* w5 x! j: i6 @* y+ l' R1 k- @
extern"C"
  ~: C( p8 _+ ^# L. B; T1 ^{
9 ^# x2 ]( o: W) m+ A! W4 l#endif//__cplusplus
; z5 W5 l2 g7 |, n  A///////////////////////////////////////////////////////////////////////////
0 b3 X( f* j  C//分析周期
* F! t! {* M) n, r& a3 TenumDATA_TYPE
3 B1 k0 F9 }; S9 l& q2 V" |# V4 Q$ i{" p5 h. c4 l2 `& K) o
TICK_DATA=2,//分笔成交
5 z5 j9 x9 \. R; q& C3 sMIN1_DATA,//1分钟线: k2 |! [  i' p  a* F. ~1 z( p
MIN5_DATA,//5分钟线
1 Q* G+ I2 o, I' g; P2 y5 I* C0 [7 uMIN15_DATA,//15分钟线7 U" h' h5 N( m. g
MIN30_DATA,//30分钟线
9 T: b; y% N7 G- {; KMIN60_DATA,//60分钟线( a% ?3 F; F* C! d( c9 S, |/ C
DAY_DATA,//日线3 @0 {* W0 x# I; P) _% V. C
WEEK_DATA,//周线
9 P6 d+ p4 p; Q  u6 b# C* {MONTH_DATA,//月线! v# O. ^9 f, ]8 t
YEAR_DATA,//年线1 s2 p8 z- I$ p3 V+ U
MULTIDAY_DATA,//多日线
, f! T9 M, k6 z# V; WMULTIMIN_DATA//多分钟线! B' s) h, X. {5 n
};0 n+ j% M: W: h6 y5 V
///////////////////////////////////////////////////////////////////////////# N3 b9 m% O6 U+ s
//定义取用股票基本数据的结构 只有 VC++ 6.0 能compile成功使用5 ~) p! \% n( I2 R' E& ^
typedefstruct tagSTKDATA ) M$ \* }% y( ~6 l
{4 `4 l' a  `) `% x: p
_tm_; //时间,UCT; u9 }1 v1 |: X# Q) O
floatm_fOpen; //开盘 open
" f3 V5 q9 c( k% h7 k# P' }floatm_fHigh; //最高 high1 I; e" k" f  h/ h3 b# J7 d
floatm_fLow; //最低 low
& N/ J4 |8 K! @; i8 A3 }floatm_fClose; //收盘 close
0 p/ F0 A% z& J+ ]& R3 z0 |floatm_fVolume; //成交量 Volume
& d( S; m! b8 o0 U6 j9 `floatm_fAmount; //成交额 amount
2 h# L7 U$ _. V" aWORDm_wAdvance; //上涨家数 仅大盘有效+ b+ ^. f5 @4 L3 A! D8 v
WORDm_wDecline; //下跌家数 仅大盘有效
1 f3 ^0 H4 H7 J; K$ ~}STKDATA;
0 b  f7 s8 q- D5 R+ m) q$ A+ O1 o定义STKDATA为 tagSTKDATA的简单别名,STKDATA
3 p- ?1 v' Q4 A# H为真正方便使用名称,tagSTKDATA 为定目的的过水名称
, T* R1 T# R5 I4 \7 A* |////////////////////////////////////////////////////////////////////////////8 H2 D/ [  f! }# @  m% \* |! o; u
//扩展数据,用于定义取用分笔成交数据的买卖盘 的结构
1 ?4 p3 Z: \6 @  q  htypedefunion tagSTKDATAEx
+ ]" L/ R4 K0 S{
3 n' `4 |# T* J3 L5 Vstruct
4 S( v+ m, p$ i8 ?{
/ M3 @6 x/ J- w$ X- S5 lfloatm_fBuyPrice[3]; //买1--买3价floatm_fOpen; //开盘 open: X7 x; n5 ]% j; N5 F$ W
floatm_fHigh; //最高 high1 j$ a9 _  [* f+ K# J6 t# c
floatm_fLow; //最低 low
6 z! \7 w$ W- }floatm_fClose; //收盘 close% k" X' x4 ^& F) u2 ~! j' ?
floatm_fVolume; //成交量 Volume9 S6 Z  j) i! N8 @  t/ [+ a: C
floatm_fAmount; //成交额 amount
1 c: [4 w5 A$ \* qfloatm_fBuyVol[3]; //买1--买3量; A0 `/ ]5 `6 E) X3 @) {
floatm_fSellPrice[3]; //卖1--卖3价4 I  `2 b9 h2 w, b8 j  R
floatm_fSellVol[3]; //卖1--卖3量
* d7 a1 r; U% ]1 l! R% G};
% v) b& a; s4 f; p: s) ?floatm_fDataEx[12];
' c: R& s9 [4 x8 Y6 n# V! z' L5 {}STKDATAEx;2 z) ^6 X, q7 T( G6 s
////////////////////////////////////////////////////////////////////////////6 b' Y! t! i) u' j' |- n2 b6 t' q
//定义取用除权数据的结构
: @( u3 c$ I! b5 }2 Otypedefstruct tagSPLITDATA " Z: d- I( d0 B  c
{
% y2 x" t' N, ?% ftime_tm_time; //时间,UCT) P& g+ u5 X: V
floatm_fHg; //红股
0 K3 I; V) C! Ufloatm_fPg; //配股
  n3 f5 Z1 ?6 g. jfloatm_fPgj; //配股价
( G" m4 y8 j5 k- [1 _+ b! C) Vfloatm_fHl; //红利5 A5 T  t6 W) O! ~+ J3 d
}SPLITDATA;- J+ J4 l& n1 N$ r
/////////////////////////////////////////////////////////////////////////////+ {  X6 A2 M% `: n: i; t! s( {" F' i
/*财务数据顺序(m_pfFinData内容)
  a' Q! @8 ~4 s! e8 ^* l; k1 l, m* P" f序号内容: F+ O8 u: o$ \. M0 \( E
0总股本(万股),
  I! P0 ]5 m. f% p' W1国家股,9 u- T8 @* T# C5 u8 A# ^" o, U
2发起人法人股,0 I! o$ R0 H# A2 t
3法人股,  _7 h/ \& ^3 X4 E" P
4B股,! B: n1 R+ i1 E) [  G
5H股,$ N6 E) ?) ?7 G# I
6流通A股,
2 _' ?2 R( k% L3 q/ z0 Q7职工股,: y* e! v6 a, q  |$ [
8A2转配股,. _7 }8 M1 l. h( S
9总资产(千元),
& Z6 ]3 v* M7 ]! |10流动资产,
' y0 w$ U: v2 }0 u' t0 o  G11固定资产,
* k" ]1 w! L8 I$ }! N1 X12无形资产,
+ H& V3 `. P6 E13长期投资,1 f  _7 l+ T# S) i
14流动负债,
* p. L5 w. k7 O15长期负债,
) k. h( W( V/ ?! i16资本公积金,
: [! D/ _9 F" R& O17每股公积金," W$ C8 f) u* k5 v0 J( g
18股东权益,8 t# p/ G4 f: D. z& g$ _
19主营收入,
# L  i/ U1 \. l$ G4 r3 h5 C20主营利润,# H! T; @% k. \9 o
21其他利润,
, Z" ?: e" d" Z/ f3 y22营业利润,
' }8 G+ g$ d6 G23投资收益,
7 P& m. |/ W* @0 v8 G4 z; D; Y  R24补贴收入,. S& V7 Z; ~$ ?/ }# {4 J: Q
25营业外收支,
2 O0 q& a( w) x% z5 J4 f9 ^26上年损益调整,- b! q) L9 S5 t# u3 d/ a
27利润总额,* q. i! I2 z: }% z6 K2 `8 \
28税后利润,- ^/ C0 e4 G4 d  q5 L& R
29净利润,
( [, R5 F  H+ n- N0 q8 ^30未分配利润,. \, [8 B8 I, f7 s' {6 e
31每股未分配,
- Q$ _! Z4 i$ [32每股收益,  Y: H* p# ^, C0 ~6 y3 Y- \. ^
33每股净资产,
. b# [, A  w' q' k0 Z34调整每股净资,) l6 @" V  o/ s  T* V% n3 Y$ n
35股东权益比,
- p; R# v6 U* B0 t  S; b& O3 O/ D36净资收益率
2 p% ]* f) ^8 M% F" y2 W! b*/" T7 d1 j$ D, ^3 n+ Q2 s% P6 |
/////////////////////////////////////////////////////////////" d0 \5 C4 j: X) ?
//定义取用caller函数传递参数项 的结构* J9 H& M- A+ j6 ~
typedefstruct tagCALCPARAM
& v; k. v( ~; t{1 |, e# r  P6 O- i" F
union
5 t5 T+ [; z9 ~7 I+ n0 Z{
3 [8 v/ L, a" t3 x( Aconstfloat* m_pfParam; //指向序列参数的址标,指向一个浮点型数组pointertofloat variable parameter / ex. c,h,l,o, co2...co2=(c+o)/2
' O3 A0 I/ ?6 e# Q+ Wconstfloat m_fParam; //数值参数 valueof parameter5 A, D$ l+ o: I3 q
};
2 R' I/ p, z3 N! S; q( Q5 Aconstint m_nParamStart; //序列参数有效起始位置thestart address of variable parameter / ex. c,h,l,o,co2.....- c0 M7 r2 o9 _+ m3 }3 u
}CALCPARAM;
, o' e6 n" {3 E/////////////////////////////////////////////////////////////////////////////
# Q/ V2 {/ i9 [3 L9 z) E' |//定义全部取用址标 的总结构 (各指标指向前述各结构以便取的各结构的数据,接口信息数据的结构 )
% ]" s3 V+ n' Itypedefstruct tagCALCINFO" I& ?+ D2 T0 U8 K
{  i2 Z9 V4 ?( K( f% C# A
constDWORD m_dwSize; //结构大小
, g7 k3 W/ w: qconstDWORD m_dwVersion; //调用软件版本(V2.10: 0x210)
) k% m: L3 o" p5 c9 SconstDWORD m_dwSerial; //调用软件序列号, }% F; w) ~1 C0 t. G0 k
constchar* m_strStkLabel; //股票代码
7 ~0 P- t9 {6 R3 [constBOOL m_bIndex; //大盘
0 U0 K% K  C- M' }constint m_nNumData; //数据数量(pData,pDataEx,pResultBuf数据数量)数据长度/ |7 N* f- K- r, p
constSTKDATA* m_pData; //常规数据,注意:当m_nNumData==0时可能为NULL
  U/ z! [6 a; M$ z; |. TconstSTKDATAEx* m_pDataEx; //扩展数据,分笔成交买卖盘,注意:可能为NULL# h' X  ~' D5 F2 o2 H
constint m_nParam1Start; //参数1有效起始位置<0/ constant parameter >0 /variable parameter   J9 }/ ]! N0 h. n
constfloat* m_pfParam1; //调用参数1/pointer to variable parameter 1 # _$ V/ w8 {, k" A- D; ?
constfloat* m_pfParam2; //调用参数2/pointer to variable parameter 28 B1 I% }: S  n* I, r6 S/ ~/ ]
constfloat* m_pfParam3; //调用参数3/pointer to variable parameter 3
6 t$ N. v% Q# o/ k' ]8 fconstfloat* m_pfParam4; //调用参数4/pointer to variable parameter 47 ^! |: D, u* |! a) U* M
float*m_pResultBuf; //结果缓冲区" j1 F& j1 q+ S7 w
constDWORD m_dataType; //数据类型
: r2 x: O' J9 Q$ _$ Lconstfloat* m_pfFinData; //财务数据
7 \% H# {- A1 z//以上与分析家兼容,所以沿用其结构和名称! A; t9 a" H) ^4 G2 D
//以下为飞狐交易师扩展(fortagSTKDATAEx)& A1 x+ R  A1 S6 X
constDWORD m_dwReserved; // 保留
" z* l4 I% P! g1 Y8 Vconstint m_nNumParam; // 调用参数数量4 A- E& H3 s; l" d, X) Z8 |* D
constCALCPARAM* m_pCalcParam; // 调用参数数组3 s1 q9 r" w7 n' n5 \
constDWORD m_dwReservedEx[4]; // 保留
1 }7 o0 ]: t4 L' U" ?0 kchar*m_strStkName; //股票名称
0 R5 i4 R* J' s/ U. jSPLITDATA*m_pSplitData; //除权数据- ]2 S7 d# F, x) l- r
intm_nNumSplitData; //除权次数
4 T0 U' ]* }3 [" M}CALCINFO;# h# c# g; z6 G& t. [
/*$ I9 Y3 {* b' K. }
注1:(与分析家兼容)
# _% {$ {+ v% G% z  B4 k1.函数调用参数由m_pfParam1--m_pfParam4带入,若为NULL则表示该参数无效.
' G" b1 s& f) T8 p/ e. L2.当一个参数无效时,则其后的所有参数均无效.. K, O" l# [, y2 G+ v8 Q% u
如:m_pfParam2为NULL,则m_pfParam3,m_pfParam4一定为NULL.
, T) y: j# @  ]4 h- n# U) H3 X3.参数1可以是常数参数或序列数参数,其馀参数只能为常数参数.
6 W. c- H) }2 [+ n4.若m_nParam1Start<0,则参数1为常数参数,参数等于*m_pfParam1;3 o& R; T- H5 q; i/ |4 t
5.若m_nParam1Start>=0,则参数1为序列数参数,m_pfParam1指向一个浮点型数组,& l8 d/ [. V2 L& t7 W0 \" V' k
数组大小为m_nNumData,数据有效范围为m_nParam1Start至 m_nNumData-1.
8 F3 E, R6 t1 v" d在时间上m_pData[x]与 m_pfParam1[x]是一致的
, k, {, N; X& u3 G6 x; W注2:(飞狐交易师扩展), k( M. e  K$ d4 ]$ Y$ v! Z  A
1.该扩展结构使调用参数在技术上可以是无限数目的,且每个参数都可为数值或序列,由公式中实际的调用参数决定。3 c# V. B& f/ ~
2.CALCPARAM结构用于带入参数信息和实际数据,m_pCalcParam数组大小为m_nNumParam,数据有效范围为0 至m_nNumParam-1.
; D( [- {# S7 B3 B6 `3.按参数的顺序,m_pCalcParam[0]为第一个参数的数据,m_pCalcParam[1]为第二个参数的数据...,为了保持兼容,原m_nParam1Start、m_pfParam1等5个属性依然有赋值。- o8 |. ?; U( O
4.若i位置的参数为数值,取用m_pCalcParam.m_fParam.
6 U, S( s% V% c* |, X9 _5 `5.若i位置的参数为序列,取用m_pCalcParam.m_pfParam,数组大小为m_nNumData,数据有效范围为m_pCalcParam.m_nParamStart至 m_nNumData-1.若m_pCalcParam.m_nParamStart<0,则此数组中无有效数据。
$ X7 q$ I9 y: C6 U$ x, V6 B1 u6.由于可以调用多个序列,许多序列的计算可以先在公式中进行,然后作为调用的参数即可。
/ c% g) K6 K+ N! w3 m2 ^7.经此扩展,对分析家的DLL依然可以调用、兼容。8 c! ?2 d3 x* G
*/1 D6 _. W0 H" Q- y& i
///////////////////////////////////////////////////////////////////////////////////5 p  S0 U5 U, f' c5 ~4 `
/*函数输出4 I& h; b- x2 g9 ]
__declspec(dllexport)int xxxxxxxx(CALCINFO* pData);5 x: A( p* g( o3 |$ N. @- Z
1.函数名称需全部大写.) h/ p2 h* C% \4 C+ X
2.函数必须以上述形式声明,请用实际函数名称替代xxxxxxxx;9 x! L, u3 p. A, T( `4 y1 C
对于C++程序还需包括在extern"C" { } 括号中.* x& c5 ^, N: i! e) f3 D# V& r
3.函数计算结果用pData->m_pResultBuf带回.
9 ^5 N7 r6 f! }1 G4 ?7 }4.函数返回-1表示错误或全部数据无效,否则返回第一个有效值位置,即:
& _2 Y0 z% `8 q% d5 [m_pResultBuf[返回值]-- m_pResultBuf[m_nNumData-1]间为有效值.
7 c' N- y. s  N# n- L7 G5.函数名称长度不能超过15字节,动态连接库文件名不能超过9字节(不包括扩展名),动态库名称不能叫SYSTEM,EXPLORER- o/ c- m3 _, m, }6 p+ L  \
*/
, B+ m4 q$ V- [//示例函数,使用时用实际名称替换/ [! B; o9 o1 I! N9 A
__declspec(dllexport)int WINAPI MYMACLOSE(CALCINFO* pData);  V) `; k) `* s6 M5 v3 [9 n2 c
__declspec(dllexport)int WINAPI SMOOTH(CALCINFO* pData);
# O7 v5 n$ M1 G4 ^3 _//__declspec(dllexport) int WINAPI MYMAVAR(CALCINFO* pData);
/ b0 ]; k4 m1 P. t! h: F__declspec(dllexport)int WINAPI MYBBI(CALCINFO* pData);2 z" h+ L) Z' B, i9 m
//WINAPI = _stdcall5 Q2 X/ ?: j" y% }7 n  V$ U! J( R
#ifdef__cplusplus9 f# N6 `! |' |2 _
}
4 W8 ^6 r1 J2 ]1 F1 p2 W5 M#endif//__cplusplus& E: G" y) }. N% k
#endif//__FOXFUNC_H_INCLUDE4 P5 O7 m! m' ~3 B/ n8 m, y
) n0 }% s* g3 k: O
//////////////////////////////////////////comment 注解
. x+ b/ w$ |+ u( {, {, i__declspec(dllexport)int WINAPI MYMAVAR(CALCINFO* pData)5 a- n# `7 P3 r: j- _4 o5 x
pData是指向 址标总结构 CALCINFO的 总址标
' x: J5 j- ^2 ?- o取用第二个参数数值floatfParam = *pData→m_pfParam2 ( ^8 S# E8 |8 Z! u$ z+ Y8 V' H
取用第一个序列参数的址标constfloat* pValue = pData->m_pfParam1;, w6 p3 ]+ M( l- ?
取用股票数据长度intndata = pData→m_nNumData;. B$ C3 {8 z( ^  L! e2 P. b0 S
第一个参数存在且为数值pData->m_pfParam1&& pData→m_nParam1Start<0+ v# k+ \+ J  j( R
第一个参数存在且为序列pData->m_pfParam1&& pData→m_nParam1Start>=0
- F" k6 V- V3 I1 X1 G/ l6 x第一个及第二个参数存在且为序列,第三个参数不存在pData->m_pfParam1&& pData->m_pfParam2 && pData->m_nParam1Start>=0&& pData->m_pfParam3==NULL! X; X: T$ {+ R2 G: h4 h/ u
constfloat* cpParam = pData->m_pfParam1; 定义cpParam为第一个序列参数的址标
# T" B' N4 t0 u* ~, j# K4 r: w, }" Y取用股票数据结构* Q- ]) p/ |' e( y& R- M" c0 S% t
pData→m_nNumData= 变数数据长度
/ O8 _5 q! q7 W/ E7 Q- kpData→m_pData= pointer to struc STKDATA 的址标
* u6 C6 u0 g4 k7 ^7 B( hpData→m_pData[x]数据结构的第x个数据
- @- ]- `$ E$ N8 M. C$ a% vpData→m_pData[x].m_fHigh数据结构的第x个数据中的 High
: F8 J; V: a0 `取用结果缓冲序列$ h, Q: J/ ~/ i$ I4 l
pData->m_pResultBuf+ A/ Z9 p8 i, Z: V2 W
取得第一个序列参数的起始序位,如 2,...5 , . 7...
9 a/ {7 R, ?0 h( VintnFirst = pData->m_nParam1Start; % U+ }: H9 x1 j  G
for( i = nFirst+nPeriod-1; i < pData->m_nNumData; i++ )
( R/ o: w. ~) g! m; w/ p5 s取得第二个数值参数的数值9 T$ i3 P# U) x
floatfParam = *pData->m_pfParam2; 8 s& }' r! u1 J: m8 i/ ~
intnPeriod = (int)fParam;
& Q5 ~; l% ?3 W0 Z% _6 d取用第一个序列参数的址标constfloat* pValue = pData→m_pfParam1;
3 U+ |; G0 k8 q+ w4 v取用序列参数的单个直pValue
9 C4 U* y7 b) y- V, J取用缓冲序列的单个值pData->m_pResultBuf
5 C- l: `5 B# M1 m# P1 ^1 Y0 BconstCALCPARAM* m_pCalcParam; // 调用参数数组
8 \8 p, u4 ?3 o8 H2 F9 i1 @m_pCalcParam为序列址标,指向各序列参数的指标/ s# }, E$ A1 C, D+ Z/ a- W0 \
第一个序列参数pData→m_pCalcParam[0]
* @( `4 P& }) ?5 aconstfloat* m_pfParam; //指向序列参数的址标
0 g$ s1 J  \% Q6 j第一个序列参数的起始序位pData->m_pCalcParam[0].m_nParamStart
3 q4 Z0 l1 c/ _2 `5 @" {第一个序列参数的址标constfloat* pValue1 = pData→m_pCalcParam[0].m_pfParam;
; @1 k1 Z1 T) P; T2 k3 Q  r" I取用第一个序列参数的单个直pValue12 t4 A. Z: Q! A+ ?3 f* H% i
第二个序列参数pData→m_pCalcParam[1]
+ J" X6 V1 W- G. `/ [  x# J第二个序列参数的起始序位pData->m_pCalcParam[1].m_nParamStart, n* b& r4 ]+ [: S) a2 A
第二个序列参数的址标constfloat* pValue1 = pData→m_pCalcParam[1].m_pfParam;  \6 w+ N1 D. g3 |/ x8 l& Y
取用第二个序列参数的单个直pValue25 l1 _! J& T( r" P+ P: G
第三个序列参数pData→m_pCalcParam[2], D. d& B  U( ^* @
第三个序列参数的起始序位pData->m_pCalcParam[2].m_nParamStart5 ^9 A8 T, n; G/ K3 B/ V
第三个序列参数的址标constfloat* pValue1 = pData→m_pCalcParam[2].m_pfParam;1 Z& Z6 Y9 N& K
取用第三个序列参数的单个直pValue35 E/ s! _. }' ?8 N2 j
第四个序列参数pData→m_pCalcParam[3]
  b5 G  f' T" D( \第四个序列参数的起始序位pData->m_pCalcParam[3].m_nParamStart) v. `2 k# l' H1 u/ v5 [
第四个序列参数的址标constfloat* pValue1 = pData→m_pCalcParam[3].m_pfParam;  o. M7 J. A9 |$ V6 V; K# ?6 Q( ^  Z
取用第四个序列参数的单个直pValue4; v. f7 K$ x% {0 x$ C9 s
如果有四个序列参数,则取用序位最高的那一个序位" d5 @& r+ p  K: h7 M8 g3 K
if( pData->m_pCalcParam[0].m_nParamStart >= 0 &&0 {( s5 B) H2 U
pData->m_pCalcParam[1].m_nParamStart>= 0 &&6 _$ s' h, Z! ]  }2 P7 E
pData->m_pCalcParam[2].m_nParamStart>= 0 &&& H: G7 |8 L1 H+ U, h6 q* X( m$ E
pData->m_pCalcParam[3].m_nParamStart>= 0 ) //4个序列都含有效数值/ f6 s3 j* i- L) C
{
* z! ?. l' M( `7 \/ T. G" ^1 o7 f//计算返回的序列的第一个有效值位置3 U: Y: r  M8 k* A0 |
intnFirst = pData->m_pCalcParam[3].m_nParamStart;//已知返回的序列的第一个有效值位置与第4个序列一致
0 X, r. `# F% f' R. F, p//若不知,则
5 y/ T, E# Q: j) ?6 e/*
# L0 _7 @/ c' f$ j+ t; T6 yintnFirst = pData->m_pCalcParam[0].m_nParamStart;$ w2 w2 ?" z3 x+ b( x# G
if( nFirst < pData->m_pCalcParam[1].m_nParamStart )
2 e9 D( o$ O" N' D: {$ \' p8 tnFirst= pData->m_pCalcParam[1].m_nParamStart;
! X& i3 Z7 c% P; Hif( nFirst < pData->m_pCalcParam[2].m_nParamStart )
) ?; b4 }! a4 ^5 e4 ?nFirst= pData->m_pCalcParam[2].m_nParamStart;5 V( L$ m' S' }
if( nFirst < pData->m_pCalcParam[3].m_nParamStart ) $ e' J! `0 |$ F* |- ?" S$ t
nFirst= pData→m_pCalcParam[3].m_nParamStart;
. R% {8 o& N: m& g( Xconstfloat* pValue1 = pData->m_pCalcParam[0].m_pfParam;
, p, R. L8 B. ~( ~1 K8 Wconstfloat* pValue2 = pData->m_pCalcParam[1].m_pfParam;: \& m' l% g" Z- z
constfloat* pValue3 = pData->m_pCalcParam[2].m_pfParam;& H% C7 l: B' |1 v& c  }
constfloat* pValue4 = pData->m_pCalcParam[3].m_pfParam;
8 X, N3 n' h# A//-------------------
. R$ @& |7 z/ ?. ufloatm_fOpen; //开盘 open
* [+ T( D7 o( _2 M0 S7 ]) F4 O$ H  ffloatm_fHigh; //最高 high: I  [5 @+ W' \! R1 w* S$ K2 g
floatm_fLow; //最低 low
$ ^* ?' s5 I2 Q* s5 B; kfloatm_fClose; //收盘 close4 h1 ~# V( k+ K7 `
floatm_fVolume; //成交量 Volume) [6 G8 {) ?6 a$ ?! g) d1 {8 O
floatm_fAmount; //成交额 amount
$ C6 X3 A  q) s+ z; t* P. R3 P# x调用收盘据
3 B! N* q+ D0 B' R* q0 ~* QpData→m_nNumData= 变数数据长度. c/ W6 W7 s. J' ?. A& n" ^
pData→m_pData= pointer to struc STKDATA' B+ G* x5 t3 ]& ^: y& s$ M
pData→m_pData[x]第x个数据- l; k$ ]* n' T: P
pData→m_pData[x].m_fHigh第x个数据中的 High
6 P# K, b6 f4 x; D: f1 n  z" H- n@@@@@@@@@@@important !!!!!!!% |" p* C! S# J! ]( `
sinceVC++ 2008, cl.exe will make ‘pData→m_pData[i-j].m_fClose’ anerror4 F$ m  M) o: k( W7 S/ g
so,pass the high,low,open and close just from the function parameter ,that is use ‘ CALCPARAM’ struct, R$ P$ @( L* Q  O
pData->m_pData[i-j].m_fOpen// to use open , there is no way in using a varable for calculationoutside foxtrader; q$ ]- L% d+ j" C' g
pData→m_pData[i-j].m_fHighto use high3 y1 u" e8 y* p3 k
pData->m_pData[i-j].m_fLow
4 I, v2 T- F& R0 B. T7 LpData->m_pData[i-j].m_fClose
) _( x& G2 ~8 r& _m_pData= pointer to struc STKDATA5 O6 r" D7 a0 M& Q+ E3 i1 u+ E5 D& ^
incalling C++ dll function
1 _, n3 s+ Q1 s2 O8 K9 f2 q9 fm_pDatais passed to pData (CALCINFO* pData . A CALCINFO* type pointer); O; d8 C: H+ z/ s; [# S. x6 K
touse a single value in variable ‘High’
, c% R2 t( ~8 K" EpData→m_pData[i-j].m_fHighto use high
* h! [8 K4 K/ K: Y" ^constfloat* m_pfParam1; //调用参数1/pointer to variable parameter 1
- H0 }' l2 E/ T& n) W6 q7 }* Jconstfloat* m_pfParam2; //调用参数2/pointer to variable parameter 2* Q7 I. X7 D. R
constfloat* m_pfParam3; //调用参数3/pointer to variable parameter 3
6 ?& i: ]* _7 P2 dconstfloat* m_pfParam4;
7 y- L3 l( y, Y# o! i: em_pfParam1,m_pfParam2, m_pfParam3, m_pfParam4 = pointer to caller function 的参数/ r4 A7 a: y; s* o, {4 l$ K# {
pData→m_pfParam1= pointer to 第一个(序列)参数% T( u# \1 R( ^. P. S, G
pData→m_pfParam1[x]= 取用第一个(序列)参数的第x 个值
, s. b" x: _7 F6 }9 C' P5 e; I* Q# Iconstfloat* cpParam = pData→m_pfParam1; =定义 cpParam为 pointerto 第一个(序列)参数6 o( p8 c$ |+ v9 V" [# N
cpParam[x] = 取用第一个(序列)参数的第x 个值: v9 A* A- p0 M4 D. x" ^* F
m_pResultBuf= 结果缓冲列
0 C3 `( w( ?7 n0 T: ipData→m_pResultBuf= pointer to 结果缓冲列
4 a3 s5 ]1 J) Y0 K4 H( @! apData→m_pResultBuf[x] = 取用结果缓冲列的第 x个值) a6 }, P" O* Q( F8 ?. i7 [( }
//////////////////////////////////////////comment5 o) x3 D6 n: P8 y$ V5 o3 V
//////////////////////////////////////////comment 注解
6 x" E# w  g1 s5 U% }constint m_nParam1Start; //统杅1衄虴宎弇离5 _* W, O% {2 v% ~3 d/ j! X
constfloat* m_pfParam1; //覃蚚统杅1
( f# H% r$ a7 V- c( W( ^7 Bconstfloat* m_pfParam2; //覃蚚统杅26 h7 U1 o4 f5 C4 m
constfloat* m_pfParam3; //覃蚚统杅3( v- f" f, H9 D. `
constfloat* m_pfParam4; //覃蚚统杅4,parameters must be <= 4
9 a% w7 k: @% {//const float* m_pfParam5; // parameters must be <= 45 o8 v! ]3 c, y, u0 p
//const float* m_pfParam6; : C! a* G) `" ]( X
//const float* m_pfParam7;
5 [# @( G9 J) r6 B. ^8 E//const float* m_pfParam8;% l) f6 ~+ F6 e% E' i
//pData->m_pfParam1 && pData->m_pfParam2 &&pData->m_pfParam3 && pData->m_nParam1Start>=0 &&- T) m6 v9 j8 W( e4 ~3 j
pData->m_pCalcParam[0].m_nParamStart>=0&& pData->m_pCalcParam[1].m_nParamStart>=0
+ c& a. c# N2 w/ f& D- A&&pData->m_pCalcParam[2].m_nParamStart>=0) 7 W4 x: K/ ]& T% l
{! B; f: A) O' f! [) y
floatfParam = *pData->m_pfParam4; //pointer ,pData->m_pCalcParam[3].m_nParamStart >= 0
+ I5 N, u. F& e- G8 LintnPeriod = (int)fParam; //统杅1& ]8 @) W: U) a. U4 x
//const float* cpParam = pData->m_pfParam2; // cpParam = pointer to第一个序列参数,cpParam = 取用第一个序列参数的第i 个值5 H# M2 z" f9 i: R7 I# R
constfloat* cpParam1 =pData->m_pCalcParam[0].m_pfParam; // cpParam =pointer to 第一个序列参数,cpParam = 取用第一个序列参数的第i 个值
2 H# F# q6 O2 hconstfloat* cpParam2 =pData->m_pCalcParam[1].m_pfParam; // cpParam =pointer to 第一个序列参数,cpParam = 取用第一个序列参数的第i 个值: ]# l) |! C: p2 [
constfloat* cpParam3 =pData->m_pCalcParam[2].m_pfParam; // cpParam =pointer to 第一个序列参数,cpParam = 取用第一个序列参数的第i 个值//parameters must be <= 47 \+ ]2 M" G) F6 z( O
//const float* cpParam4 =pData->m_pCalcParam[3].m_pfParam; //cpParam = pointer to 第一个序列参数,cpParam = 取用第一个序列参数的第i 个值
' M, y0 u; z8 D4 R//const float* cpParam5 =pData->m_pCalcParam[4].m_pfParam; //cpParam = pointer to 第一个序列参数,cpParam = 取用第一个序列参数的第i 个值
: J% S+ k- X1 z2 I/ W+ a//m_pData = const struct pointer to struct STKDATA , pointer to structSTKDATA ,
( I$ r& t' G' i$ e5 I9 C# `touse pData→m_pData[x].m_fClose3 o. R; c$ W4 G) x, Q  M
pData→m_pData[x]= | 1,2,3 , … , m_nNumParam | time_t m_time; - h6 @, D% P) I0 m6 x" \
|1,2,3 , … , m_nNumParam | float m_fOime_t ' ^. n: h+ C9 e
|1,2,3 , … , m_nNumParam | float m_fHigh;9 c8 H& l7 c7 |$ @" L
.. .4 v6 s& k0 ?6 w# M
|1,2,3 , … , m_nNumParam | WORD m_wDecline;# `- ]$ C0 w1 ~$ g* i2 ^
m_nNumParam= 数据high,close,open,low的长度3 c0 W' l5 {& {$ l  U5 W
touse high:: `6 q4 a) I0 S3 {. {
pData→m_pData[x].m_fHigh
0 w, v: F+ y, ]* zcontentof struct STKDATA
( [( O) @# [" K+ r  P+ ~; Z% g+ m+ stime_tm_time; //时间,UCT2 [) H/ d* Z" R4 h9 }3 P
floatm_fOpen; //开盘 open- z- ?' Q  P7 X4 Q
floatm_fHigh; //最高 high4 u  S% q* a" G2 L) i) d' T
floatm_fLow; //最低 low
0 l/ ^7 g- U6 j5 vfloatm_fClose; //收盘 close2 B. d/ d2 X+ M8 Z6 v- A
floatm_fVolume; //成交量 Volume, j( n) c( {& ]9 K" P0 F# a8 A" w
floatm_fAmount; //成交额 amount
3 q& b0 j3 a/ q' D7 g4 XWORDm_wAdvance; //上涨家数 仅大盘有效
" x. _- p6 V9 ]; CWORDm_wDecline; //下跌家数 仅大盘有效
. x0 `8 X4 g8 k( X* J" `调用传递参数及传回结果
2 `8 N8 L' O3 [; v9 [调用传递参数
  b6 g' y8 f5 g+ _; v(pData->m_pfParam1 && //参数1有效Param1exists
( H3 T; h2 T" BpData->m_nParam1Start<0&& //参数1为常数! [/ b3 x* t9 o+ J; j7 A$ ]
pData->m_pfParam2==NULL) //
2 q( f6 H8 _( g) [" D# Blocalprocedure 定义使用变数; c' d) I2 ~! {8 R+ Q7 \
onstfloat* pValue = pData→m_pfParam1; //use constant参数1
, \* J& ?9 k7 W, ]intnFirst = pData->m_nParam1Start; //use 参数1效值起始位
/ ?) ]2 u. ~! a+ j+ _floatfParam = *pData->m_pfParam2; //use 参数2
8 o* ]! z  G. O& k( UintnPeriod = (int)fParam; : g) R; s8 V" t
传回结果/ O* w% a0 t# V7 w
fTotal+= pValue[i-j];; I7 Q& i: R' R) g
pData->m_pResultBuf
# \& Y2 A- b0 y% v3 k6 ]//////////////////////////////////////////comment

评分

1

查看全部评分

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

本版积分规则

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

GMT+8, 2026-10-19 19:45 , Processed in 0.125755 second(s), 19 queries .

Powered by Discuz! X3.2 Licensed

© 2001-2013 Comsenz Inc.

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