阳光飞狐

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

 找回密码
 手机注册

手机动态码快速登录

手机号快速注册登录

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

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

[复制链接]
跳转到指定楼层
1#
发表于 2019-8-11 16:09:40 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
许多年以前,我曾经在1 r( H1 Q% R" Z. U, U% u# R) H
理想公式区发布了. c: t, X4 H9 J
"
' g) z7 e8 M$ Q- y* g; j/ r如何用 Foxtrader(飞狐)连结 C++动态程式库 DLL80x86Macro Assembly (组合语言)! H! J/ C; n$ U
"
7 u& \1 s9 w# Q' x) b# N
; ^% x. r$ A  c$ n) t8 C现在更新foxtrader(飞狐交易师) $ E! G/ }* x6 L6 ^
连结 DLL的方法
# Z. k) n# j, p4 U0 i& _" V0 j+ C) K/ m  K) U
foxtrader- - > DLL (C++ and assembly) = ( foxfunc.h + foxfunc.cpp +pow10.asm )
+ W5 y7 E! n7 d, T1 ]3 Ogauss- - > DLL (C++ and assembly) = ( foxfunc.cpp + meigj.asm )
# r  n' @( v( ~% s# t6 ~9 v7 Xgauss只用到函数参数传递,所以使用新的 c++compiler, 不受影响! x( Z4 C0 u: O. \+ E
foxtraderfoxfunc.h宣告的结构型态 (struct)2004vc++ 6.0 全部有效
! \% F6 }1 d( M1 t1 j  u2 k) C
9 ?/ X  _: j% P2 x, z+ g也就是这五个结构都能用; W2 G3 S# n0 s$ G" [! L" {& {
typedefstruct tagSTKDATA
/ L" R# j& q2 g, k2 Wtypedefunion tagSTKDATAEx2 z4 e7 c) R# q1 t4 x/ y8 M
typedefstruct tagSPLITDATA / k  p4 Z% J1 g1 V& Z3 q
typedefstruct tagCALCPARAM! s" `. a2 T2 y2 L
typedefstruct tagCALCINFO7 H- U0 G3 h) j! ?# ^/ v4 g9 X
2 k' I0 T+ q$ w$ P4 O& J9 M' b
2008年起,vc++ 2008, vc++ 2010, vc++2017 struct的编译,已经完全 c++,不再相容于 C
9 v" |; J' S1 s1 |& A$ B也就是这五个结构中
% Z+ W/ F, a  ?% p; d* U9 t: Xtypedefstruct tagSTKDATA
8 j8 h' j5 h+ ]typedefunion tagSTKDATAEx
9 m% h7 `3 Y; d6 S/ B. ?typedefstruct tagSPLITDATA
* R0 i& n. {' ]: D: \2 htypedefstruct tagCALCPARAM
4 m  b5 H1 H) h& ktypedefstruct tagCALCINFO
# w& [  i1 L( K" v. \7 m只有这两个可以用
9 i0 ^5 ?  P% ]typedefstruct tagCALCPARAM1 o+ H$ D  W& a2 j
typedefstruct tagCALCINFO
9 ]$ ^# ^' y4 l; F值得庆幸的是,下面这个结构的函数参数传递个数可以有无数个1 P% _1 ?! D' }" P
typedefstruct tagCALCPARAM
( J. C7 f/ L0 j2 O0 t例如:foxtrader
. P/ Y7 A1 B5 B/ PMA1:=MA(CLOSE,3);: m* O% }  a1 N8 R& P
MA2:=MA(CLOSE,6);
2 M# i- d( S, G+ MMA3:=MA(CLOSE,12);0 _  H# h6 t" A5 I. Y" J" q( O
MA4:=MA(CLOSE,24);
& M, E- E7 g/ i1 ?$ F. ], T4 lMYBBI1:"MYFUNC2017@MYBBI"(MA1, MA2,MA3,MA4,MA3,MA4,5)*0.95,colorff00ff,linethick3; {2017 vc++ 15.0}
& [+ I9 _# S7 B8 a$ x9 f) \其中MYFUNC2017=MYFUNC2017.dll, MYBBI = MYFUNC2017.dll 中的MYBBI函数,这里 MYBBI函数传递的参数共有 7! Z5 C1 p  _' Y" }) {  \
下面这两式计算结果相同. ^, j5 D5 u; L6 m+ j/ G
xx:(MA(CLOSE,3)+MA(CLOSE,6)+MA(CLOSE,12),MA(CLOSE,24),MA(CLOSE,12),),MA(CLOSE,24)/6*0.95,color0000ff,linethick2;{foxtrader 自行计算}
% I7 q) {, U" p+ p4 VMYBBI1:"MYFUNC2017@MYBBI"(MA1, MA2,MA3,MA4,MA3,MA4,6)*0.95,colorff00ff,linethick3; {2017 vc++ 15.0 , dll计算}7 l3 E$ y, \- P9 a3 u2 K
其他例子0 _2 i8 Z+ g. p" ^7 J. Q
oooq:="MYFUNC2008good@MYMACLOSE"(c,,c,c,6),colorffffff,linethick5;(---> pow10.asm). K6 v! _# Q- I3 ~0 v  o, l6 V5 q
oooq1:"MYFUNC2010@MYMAVAR"(ma(c,5),5),colorgreen,linethick5;
( `2 N, u( I; f; b# T1 S! L0 P其中pow10.asm里面有很多不同定义或宣告被注解不用,那是因为后来在逐步侦测法修改语码中才发现在foxfunc.cpp主程式中,下面这行错误,也就是新的 compiler不再相容于 C,因此在pow10.asm里面被注解不用的定义或宣告中,有些应该是可以用的
" \, Y) W1 ^6 D6 y0 bfTotal= pData->m_pData.m_fClose; // @@@@@@@ vc++ 2010 cl.exe 使pData->m_pData[i-j].m_fClose错误
2 z! T! b1 U. ~- p. _( G! K; }+ ~, z9 s3 l, V

2 t4 g' P# ]2 M  o////////////////////////////////////////////////////////foxfunc.h
4 E4 C  F8 v+ c, G#ifndef__FOXFUNC_H_INCLUDE' |0 m+ }; [+ c
#define__FOXFUNC_H_INCLUDE
+ i  u1 t1 S  _! k( }/*
. _1 c8 N& l. X/ ]. j+ X飞狐交易师“C语言接口”扩展程序调用接口规范V3.0
, J" n, D& {) |0 p4 a6 g- e  {1.本规范适用于飞狐交易师V3.x公式系统.' B& ~- d) r6 _/ Q, Y6 j
2.扩展函数用于实现系统函数不能实现的特殊算法.2 E4 h' j9 N- b. M
3.扩展函数用windows32位动态连接库实现,建议使用MicrosoftVisual C++编程.
, m" U" M0 X/ _- I# i, S7 ~! Y4.调用时在公式编辑器中写"动态库名称@函数名称"(参数表)即可,例如下面函数可以写为"FOXFUNC@MYMACLOSE"(5)
) l" e7 s1 t! }* ~5.动态连接库名称和函数名称可以自己定义.' _6 W! _& q5 [5 k" W
6.使用时必须将动态库拷贝到飞狐交易师安装目录下的FmlDLL子目录下使用., M! M: a7 u5 L+ E* |
*/
( l; X8 J  X, ^( l3 p1 Q#ifdef__cplusplus
/ e% [+ Q9 V  q% y: wextern"C"
5 k+ o) P& X6 u' b. S0 C6 T- j{) e- Z! {  M, L- l- a
#endif//__cplusplus$ {+ ?; j4 h* ?
///////////////////////////////////////////////////////////////////////////. r& _# H& k' K! Q4 `) ?+ L+ D
//分析周期% {9 |8 R  g1 X  Y8 J" i$ f
enumDATA_TYPE' B' k7 i$ T2 S
{4 k- _* o% q; V- P. O
TICK_DATA=2,//分笔成交
7 P8 @, z2 m* W3 W# T6 Z$ C$ `MIN1_DATA,//1分钟线
% ]; Y7 I) B, C) |1 T; H1 G7 ^( OMIN5_DATA,//5分钟线
7 i2 Q1 K- L1 |. u' |2 bMIN15_DATA,//15分钟线
4 l7 Q, V6 {& n3 Y1 `: U  e* iMIN30_DATA,//30分钟线# ~, y5 C  \/ l0 B, M3 @
MIN60_DATA,//60分钟线6 Q' `6 m5 |7 Z# {0 u
DAY_DATA,//日线
3 |% {- l  F0 _$ k& Z# S* CWEEK_DATA,//周线
" F: B0 H1 W7 P" L" tMONTH_DATA,//月线1 p& `* i% U% x( _
YEAR_DATA,//年线
/ u6 d# i" q& U+ V! ?; M6 rMULTIDAY_DATA,//多日线
; s! g1 f) H6 FMULTIMIN_DATA//多分钟线$ D/ V4 A/ P2 U6 I$ ^
};
! u2 }1 w% Y* |///////////////////////////////////////////////////////////////////////////
9 y' W) ^0 @$ R//定义取用股票基本数据的结构 只有 VC++ 6.0 compile成功使用4 E( h( `0 y, G8 l- ~+ }
typedefstruct tagSTKDATA 5 y. d8 m7 f6 C
{
1 P( g$ G; V! k! \- q, ]$ w_tm_; //时间,UCT1 @: Z/ J7 o% g+ C
floatm_fOpen; //开盘 open2 O1 i% q' B" S" {! p/ b% F8 k
floatm_fHigh; //最高 high7 }2 Z! y. K9 g! b7 U
floatm_fLow; //最低 low, i7 |# p: P  m1 ~- r% z
floatm_fClose; //收盘 close
9 J5 \* O: n+ X# `' z/ gfloatm_fVolume; //成交量 Volume
& k* j3 j5 ?* \0 f' z. b& A; Yfloatm_fAmount; //成交额 amount
% C* p8 y" O* d8 l" H7 [WORDm_wAdvance; //上涨家数 仅大盘有效
$ t6 M: w/ R; }5 UWORDm_wDecline; //下跌家数 仅大盘有效
& W. Q- h2 Q/ k& c1 b$ _" r}STKDATA;
* X- q' A$ t+ k4 I  g定义STKDATAtagSTKDATA的简单别名,STKDATA
8 {/ X& E$ u5 D: g: q6 I2 a为真正方便使用名称,tagSTKDATA 为定目的的过水名称: k" j' Q5 e- g) B
////////////////////////////////////////////////////////////////////////////& {$ W5 y/ M& _! o
//扩展数据,用于定义取用分笔成交数据的买卖盘 的结构
/ o3 d  X# K  x5 Itypedefunion tagSTKDATAEx4 x; N4 L& o/ V6 T8 t- S+ ?2 ^
{# y  E9 Y% Y, l0 h0 ?) J
struct
( n+ a* u) I& x% s% Y9 g{
- @9 K! D( G* @% i0 b3 cfloatm_fBuyPrice[3]; //1--3floatm_fOpen; //开盘 open
+ i7 p; n* w+ g5 x- F% W5 X+ O3 nfloatm_fHigh; //最高 high
% |: M/ j( m- C7 R$ g# }9 s- u. l8 Cfloatm_fLow; //最低 low
7 P$ m: ]9 x5 A" o) gfloatm_fClose; //收盘 close6 q, L' H" Y$ S- _9 Z# o: h; ^' J
floatm_fVolume; //成交量 Volume9 V5 T: ^1 L+ l! Z" N4 [
floatm_fAmount; //成交额 amount
; _2 \  p& L" e, r" ]3 @floatm_fBuyVol[3]; //1--33 }7 ~$ R! P; G8 d& g0 O+ e; [
floatm_fSellPrice[3]; //1--3- r7 \7 G! \1 o: X
floatm_fSellVol[3]; //1--3, \3 `0 g. Z6 {6 {4 X9 Y/ d% J2 v
};
" E4 Y6 @5 ?$ u$ V5 ifloatm_fDataEx[12];
3 L/ V1 F! Y9 r2 V; |}STKDATAEx;( M* \. Q2 `) M# F
////////////////////////////////////////////////////////////////////////////
; n- M; e, t1 v% F) s//定义取用除权数据的结构9 v& K$ N  ^. s* H  q3 d6 I
typedefstruct tagSPLITDATA ; J" Y) g  T3 i' V
{
$ |( J8 |8 \$ o( Stime_tm_time; //时间,UCT
- _5 y$ k2 \) J  nfloatm_fHg; //红股
2 |& G, z6 ?2 H+ M$ y7 R7 hfloatm_fPg; //配股
; Z0 Y; B) }9 N6 H0 V' bfloatm_fPgj; //配股价  |2 K$ @5 a+ t6 M5 Y
floatm_fHl; //红利  `7 f! @; I, U" k3 [3 ~0 j
}SPLITDATA;
2 K' E% Q' |, ]7 O: x4 z  U. M$ K/////////////////////////////////////////////////////////////////////////////
- u, I3 c# B+ f$ J/*财务数据顺序(m_pfFinData内容)
& f% i2 W2 a6 f4 b9 z+ S' J% q3 X* Y3 L序号内容5 b$ P1 K! |+ B9 F5 v7 ?) t. g
0总股本(万股),
* V, e* T* K) T2 T  z* {- z1国家股,4 f. K5 B' u( E' v. U, g1 U6 S
2发起人法人股,
, y+ K5 t, c7 Q# f- x. Z3法人股,
, Y9 x" j- K' {" r2 h/ x4B,
( w* ]* K3 x; U- \2 o6 o1 g5H,
8 w7 M7 L; i. n1 p( x6流通A,
; U  y  I- Z. m7职工股,$ h  M, a2 P' K: E; ~& B
8A2转配股,
+ C; p5 g2 _7 x' @. F9总资产(千元),
# Y: u; d8 N5 W$ l2 K* U10流动资产,8 N" P7 ^! Z* {! c1 M0 {. {
11固定资产,: g. d  t: P9 `  j
12无形资产,
$ S' [5 f' N- D2 @2 S0 U" ^# N13长期投资,
+ n8 N! R5 @; ]2 ^0 i1 r' w14流动负债,
8 }" ]2 R/ G5 ]15长期负债,
$ a' n' \% Y& B* z$ e16资本公积金,3 d  [( D" \' z( c. _0 n
17每股公积金,* d5 D2 }5 [3 o4 Z5 T7 v" _
18股东权益,3 c4 U- q: o) s1 G6 X
19主营收入,6 v- m$ j" S7 x4 W6 z6 v
20主营利润,
/ K  d9 G. s, ^8 C. _21其他利润,: C/ r9 M. g9 F2 @/ f
22营业利润,
! m/ E( d. a( w' E6 P2 t23投资收益,
3 }  ?* ^( U2 t* o  i24补贴收入,: H4 ]; h7 y' e$ k, ^% k2 R6 M
25营业外收支,
; A# n" \3 X; J9 r/ B' k- r& f26上年损益调整,
$ }+ V) B6 x6 X7 E! _$ \! E27利润总额,
) A, ]$ j, J/ `2 H7 ^28税后利润,
, u" S- T/ m+ Z. s1 L0 E29净利润,( [1 f: t/ V2 ^$ ]$ k  p
30未分配利润,
" _* {/ f+ r* a" N7 k* H; i7 x( m31每股未分配,
0 p7 u' @( M) a  q* u! _32每股收益,6 }7 G$ R9 Q% ]
33每股净资产,% Y0 h; c3 F- M4 r$ E
34调整每股净资,% R) R! r/ {; N8 o
35股东权益比,% v: ]0 |: y, A! U% k- h. _
36净资收益率2 p2 T5 k+ f8 w- C, l; X
*/1 X' J) O1 ]1 e3 B" t" _( H; y! y9 Z
/////////////////////////////////////////////////////////////
1 v& Y3 W- E/ Z0 j& L! j6 F//定义取用caller函数传递参数项 的结构
- q5 p) F8 c) B1 Itypedefstruct tagCALCPARAM1 [: l) c2 |! \* E% @
{/ t! w2 \. N% h  ]- {
union6 h9 W. d2 s8 l( \- H
{
: Z" u" k9 U) G$ uconstfloat* m_pfParam; //指向序列参数的址标,指向一个浮点型数组pointertofloat variable parameter / ex. c,h,l,o, co2...co2=(c+o)/2  R' Z3 Q: i9 Z) `
constfloat m_fParam; //数值参数 valueof parameter
1 ~: P. f- ^9 {: C};1 c' y- Z+ q( Y
constint m_nParamStart; //序列参数有效起始位置thestart address of variable parameter / ex. c,h,l,o,co2.....$ S/ U, n3 ?+ V2 q0 G' i) S
}CALCPARAM;. s" y6 B9 Z1 z8 V! [$ k7 ^
/////////////////////////////////////////////////////////////////////////////
$ O  S; S1 v6 j+ [" _! d) j6 v9 N0 R//定义全部取用址标 的总结构 (各指标指向前述各结构以便取的各结构的数据,接口信息数据的结构 )+ q5 v! L5 H, U' S; t# T
typedefstruct tagCALCINFO
( t6 R, o; y, ]( O{: J9 K; z6 F3 ?+ ^
constDWORD m_dwSize; //结构大小0 p( E0 u) z' \' y: p) _
constDWORD m_dwVersion; //调用软件版本(V2.10: 0x210)
8 W$ ]- X: \& ?) R( m! gconstDWORD m_dwSerial; //调用软件序列号
7 {$ \* k: r3 j4 [constchar* m_strStkLabel; //股票代码
4 I2 |$ f* d6 q9 I5 F1 zconstBOOL m_bIndex; //大盘9 ~* r; u% U4 K7 h' G
constint m_nNumData; //数据数量(pData,pDataEx,pResultBuf数据数量)数据长度
  X# ^" O3 R' U% r- |+ DconstSTKDATA* m_pData; //常规数据,注意:m_nNumData==0时可能为NULL; h; L) E2 B  L- n' p# c5 |
constSTKDATAEx* m_pDataEx; //扩展数据,分笔成交买卖盘,注意:可能为NULL
0 a% s/ A# S4 R4 A- k$ e) F& A% g  rconstint m_nParam1Start; //参数1有效起始位置<0/ constant parameter >0 /variable parameter
/ {. n/ e& T0 X4 r; u+ gconstfloat* m_pfParam1; //调用参数1/pointer to variable parameter 1
. z( k& ~2 K: e3 sconstfloat* m_pfParam2; //调用参数2/pointer to variable parameter 2* N6 I( X; s5 A8 l3 B) R
constfloat* m_pfParam3; //调用参数3/pointer to variable parameter 3
' X. U2 ^7 U' ?) jconstfloat* m_pfParam4; //调用参数4/pointer to variable parameter 4
, y! d5 R+ v5 d; z8 O' Y4 Pfloat*m_pResultBuf; //结果缓冲区
( h: N2 e" T; \' MconstDWORD m_dataType; //数据类型
/ `  a- V9 }  _  r4 wconstfloat* m_pfFinData; //财务数据
* W4 r3 w# }' O' H+ z) W3 ?//以上与分析家兼容,所以沿用其结构和名称
. O! z; a$ d& O' U* Q; @//以下为飞狐交易师扩展(fortagSTKDATAEx)6 b6 G6 k, c8 e, g8 p
constDWORD m_dwReserved; // 保留
* i: I& ]# Z) ]* s& h  k8 Jconstint m_nNumParam; // 调用参数数量) e: M+ M5 O- h3 v: _
constCALCPARAM* m_pCalcParam; // 调用参数数组) W6 Z" v& N' L) p* \! v$ j6 |
constDWORD m_dwReservedEx[4]; // 保留
; ^& l: k$ w* i9 u" schar*m_strStkName; //股票名称8 r+ N! f# `* X+ t9 C3 L* k+ r
SPLITDATA*m_pSplitData; //除权数据
2 x$ H" t0 x( _+ l+ M. k% [intm_nNumSplitData; //除权次数
# A" B( @: D. W5 m& P3 @) A}CALCINFO;
  v- E1 M& G5 B: Y# M: e' d% C/*
  P3 I7 D) R  G( C" _  l* p1:(与分析家兼容)
8 a0 A4 V# W6 c, z5 U1.函数调用参数由m_pfParam1--m_pfParam4带入,若为NULL则表示该参数无效.
/ P6 W+ Y& z+ n( H3 H' t9 b& x2.当一个参数无效时,则其后的所有参数均无效.0 p: s2 W& H$ N, k, S
:m_pfParam2NULL,m_pfParam3,m_pfParam4一定为NULL.0 S/ P, N) l# P( r* v1 |
3.参数1可以是常数参数或序列数参数,其馀参数只能为常数参数.
" X- e1 V" J7 \' G; s, \1 j1 w4.m_nParam1Start<0,则参数1为常数参数,参数等于*m_pfParam1;9 l: {. n# ?% @# W# M( S, M: ^- r
5.m_nParam1Start>=0,则参数1为序列数参数,m_pfParam1指向一个浮点型数组,
6 r: s2 c& Z/ M, s3 V& F数组大小为m_nNumData,数据有效范围为m_nParam1Startm_nNumData-1.8 n9 z# Q; E$ c1 X$ q' l
在时间上m_pData[x]m_pfParam1[x]是一致的
! j+ z. `1 p. y$ R) W2:(飞狐交易师扩展)
5 v2 m. }" r9 T6 M1.该扩展结构使调用参数在技术上可以是无限数目的,且每个参数都可为数值或序列,由公式中实际的调用参数决定。
2 y7 T- e+ D8 f0 C2.CALCPARAM结构用于带入参数信息和实际数据,m_pCalcParam数组大小为m_nNumParam,数据有效范围为0 m_nNumParam-1.
' t2 A# N/ h" k9 |  E8 c3.按参数的顺序,m_pCalcParam[0]为第一个参数的数据,m_pCalcParam[1]为第二个参数的数据...,为了保持兼容,原m_nParam1Startm_pfParam15个属性依然有赋值。- o' t+ F, |9 l9 H+ R% x- Q3 C
4.i位置的参数为数值,取用m_pCalcParam.m_fParam.0 Y3 Y1 k5 y0 J0 d. l
5.i位置的参数为序列,取用m_pCalcParam.m_pfParam,数组大小为m_nNumData,数据有效范围为m_pCalcParam.m_nParamStartm_nNumData-1.m_pCalcParam.m_nParamStart<0,则此数组中无有效数据。# F( L5 ^% d! j. E5 z+ W1 L4 F- B
6.由于可以调用多个序列,许多序列的计算可以先在公式中进行,然后作为调用的参数即可。+ n0 v- Y$ |! M" G# M1 d( {7 @
7.经此扩展,对分析家的DLL依然可以调用、兼容。
4 N+ P( \+ y4 i, o" G0 r8 q8 O& w  z*/
/ M. q0 x- X0 C4 `///////////////////////////////////////////////////////////////////////////////////
) l- G/ ~! D6 z3 b& V, [) v7 e( C/*函数输出
( ]$ C( n+ X6 H# c/ f( ~! ?: [3 m__declspec(dllexport)int xxxxxxxx(CALCINFO* pData);' M6 f5 \/ L3 \( ], `9 d
1.函数名称需全部大写.
8 V, H( e4 J4 {+ F1 b$ ]5 G2.函数必须以上述形式声明,请用实际函数名称替代xxxxxxxx;: K8 n) A% P2 H  F* B' E
对于C++程序还需包括在extern"C" { } 括号中.
" \1 K: j( J3 s0 p; F7 M, j3.函数计算结果用pData->m_pResultBuf带回.
8 g, e/ y* {4 Q' w. Q- O4 w4.函数返回-1表示错误或全部数据无效,否则返回第一个有效值位置,:
. d' Y" P( v- wm_pResultBuf[返回值]-- m_pResultBuf[m_nNumData-1]间为有效值.) d, z6 @3 H! Z, y: B7 A
5.函数名称长度不能超过15字节,动态连接库文件名不能超过9字节(不包括扩展名),动态库名称不能叫SYSTEM,EXPLORER6 @, g8 N+ |, `' x  `( n
*/
2 P/ b$ R4 D6 a  u0 P. \! |0 E//示例函数,使用时用实际名称替换
. B9 N( g# d5 v; J3 l; d3 X__declspec(dllexport)int WINAPI MYMACLOSE(CALCINFO* pData);" ?% v$ b9 m* _! f
__declspec(dllexport)int WINAPI SMOOTH(CALCINFO* pData);1 [. F+ Q  F- V+ c- `9 n
//__declspec(dllexport) int WINAPI MYMAVAR(CALCINFO* pData);
: y( ?; @0 j/ j3 P7 G__declspec(dllexport)int WINAPI MYBBI(CALCINFO* pData);
' t0 g2 X2 _) ^2 x3 @$ P7 Z//WINAPI = _stdcall
5 \* `& i% d3 C9 K3 g4 `! R& D#ifdef__cplusplus- ^  D! ^- `8 M* w7 o+ D" m( E
}7 M- G# M: L$ `! `& k
#endif//__cplusplus
; `6 Q) x1 {# p6 m* A6 \+ Z#endif//__FOXFUNC_H_INCLUDE
: Z# V+ M3 p% p0 l6 N1 K! n
3 W' L) _: C; n/ C3 c6 ]5 n9 \//////////////////////////////////////////comment 注解( z  A) L! R" d
__declspec(dllexport)int WINAPI MYMAVAR(CALCINFO* pData)
- ~' R& U1 x3 S3 lpData是指向 址标总结构 CALCINFO的 总址标
# U& i6 V+ f2 n% ?" N/ ~) o! b取用第二个参数数值floatfParam = *pData→m_pfParam2 * J) Q2 h2 _3 A
取用第一个序列参数的址标constfloat* pValue = pData->m_pfParam1;$ X4 t2 j) [* o
取用股票数据长度intndata = pData→m_nNumData;
" K8 S) A# T1 t' R& G+ S第一个参数存在且为数值pData->m_pfParam1&& pData→m_nParam1Start<0
6 J) e6 [, p0 [& D第一个参数存在且为序列pData->m_pfParam1&& pData→m_nParam1Start>=0
9 D/ {1 N3 x2 U# h; S) l第一个及第二个参数存在且为序列,第三个参数不存在pData->m_pfParam1&& pData->m_pfParam2 && pData->m_nParam1Start>=0&& pData->m_pfParam3==NULL
5 {" X; C$ o0 S9 F9 lconstfloat* cpParam = pData->m_pfParam1; 定义cpParam为第一个序列参数的址标1 ]5 I1 ^" Z3 }7 c* P) ~% Z
取用股票数据结构. a% i' j# B+ Q) H6 Z
pData→m_nNumData= 变数数据长度& b) u. v. t3 K$ d: d
pData→m_pData= pointer to struc STKDATA 的址标
8 P  s! e# E' K  t+ I! {( h: j; qpData→m_pData[x]数据结构的第x个数据
4 k; g3 @$ V' k; X6 \4 h0 a  C$ x$ zpData→m_pData[x].m_fHigh数据结构的第x个数据中的 High- X: I; X0 I  f* @$ t" f
取用结果缓冲序列
9 d- {) c/ P9 w3 u; VpData->m_pResultBuf
1 L, H' c. \1 T; \; k取得第一个序列参数的起始序位,2,...5 , . 7...
1 i* c2 I, _6 I& E. w* UintnFirst = pData->m_nParam1Start; * _. {; c* m4 G# M6 B' F
for( i = nFirst+nPeriod-1; i < pData->m_nNumData; i++ )
; I2 x- h3 J% r; @! i取得第二个数值参数的数值! }8 N9 d1 ?  _# h3 q$ W
floatfParam = *pData->m_pfParam2; ; d( ]6 u% S1 j7 ?5 N
intnPeriod = (int)fParam;. }+ ?8 Q+ ?8 o! z  \$ o
取用第一个序列参数的址标constfloat* pValue = pData→m_pfParam1;# {  ~$ R2 D9 O; H
取用序列参数的单个直pValue$ W% L  ^  R7 b
取用缓冲序列的单个值pData->m_pResultBuf" V, [7 }; k1 r1 ^$ m0 g
constCALCPARAM* m_pCalcParam; // 调用参数数组' ~9 w& ^% u" t
m_pCalcParam为序列址标,指向各序列参数的指标
# s1 W/ X8 p0 e5 N& q- t2 ~. ~第一个序列参数pData→m_pCalcParam[0]( {! I: l1 f" e) Y& s5 i; q+ }5 `
constfloat* m_pfParam; //指向序列参数的址标
. q, L% ^: M& O% K7 a! D) }第一个序列参数的起始序位pData->m_pCalcParam[0].m_nParamStart
0 s# R1 z9 K0 y. j* S" [( v第一个序列参数的址标constfloat* pValue1 = pData→m_pCalcParam[0].m_pfParam;
  C" N! _1 z$ W4 E& p取用第一个序列参数的单个直pValue10 Q( `! h& d* h' u6 Q- J6 o
第二个序列参数pData→m_pCalcParam[1]5 D, h& o/ ~( n* M8 {$ w7 Z: e; y
第二个序列参数的起始序位pData->m_pCalcParam[1].m_nParamStart& H9 T! f7 x3 @" ^
第二个序列参数的址标constfloat* pValue1 = pData→m_pCalcParam[1].m_pfParam;0 ?4 h0 z+ m! h+ ^1 H5 ~- I
取用第二个序列参数的单个直pValue2
7 B, C" M) S" N* t9 E7 b; j第三个序列参数pData→m_pCalcParam[2]& \# B- [. e5 G8 S& s
第三个序列参数的起始序位pData->m_pCalcParam[2].m_nParamStart
& K. p& m3 J: V& s第三个序列参数的址标constfloat* pValue1 = pData→m_pCalcParam[2].m_pfParam;- q3 b# j' a% M8 c: W. N$ g' d  u" e
取用第三个序列参数的单个直pValue3
& n' L/ c6 V- g: M8 x; X) r9 T  T第四个序列参数pData→m_pCalcParam[3]) }! r" H+ f; x8 T
第四个序列参数的起始序位pData->m_pCalcParam[3].m_nParamStart: D, }  u6 ~" P0 M
第四个序列参数的址标constfloat* pValue1 = pData→m_pCalcParam[3].m_pfParam;8 ]+ u( h1 t  m2 z6 g  w; c
取用第四个序列参数的单个直pValue4
( M3 N  D5 B, H9 H7 z  V如果有四个序列参数,则取用序位最高的那一个序位4 y9 Q& |) D4 |3 O$ }6 v) L. d7 z% s
if( pData->m_pCalcParam[0].m_nParamStart >= 0 &&
# k  r. k* d$ {) u7 [/ ^2 o+ R5 cpData->m_pCalcParam[1].m_nParamStart>= 0 &&
" V7 d3 v! t# [pData->m_pCalcParam[2].m_nParamStart>= 0 &&
5 o" H; u% }6 q$ f; y& M4 bpData->m_pCalcParam[3].m_nParamStart>= 0 ) //4个序列都含有效数值' l# o: t1 [8 n& Y& P, d
{/ d8 O: g, L' S2 d: P' G
//计算返回的序列的第一个有效值位置
1 Y4 h: k! e0 h% z0 }/ B$ h7 TintnFirst = pData->m_pCalcParam[3].m_nParamStart;//已知返回的序列的第一个有效值位置与第4个序列一致$ q( L2 E9 }2 B. L, G6 y; w
//若不知,则
9 l' n9 U" x. z: N( H( b/*7 R2 l# s+ J0 k' z3 g: M* \
intnFirst = pData->m_pCalcParam[0].m_nParamStart;" ]* Z* Z0 v3 [
if( nFirst < pData->m_pCalcParam[1].m_nParamStart )
% Q6 }% i# w. h! BnFirst= pData->m_pCalcParam[1].m_nParamStart;
; ?* D0 ?- F5 J; m1 ]if( nFirst < pData->m_pCalcParam[2].m_nParamStart ) 1 ^, G# a4 I9 n' r+ q
nFirst= pData->m_pCalcParam[2].m_nParamStart;, e! j( ]( z4 W3 \; R. X8 s; D
if( nFirst < pData->m_pCalcParam[3].m_nParamStart )
3 i, @6 g  _# jnFirst= pData→m_pCalcParam[3].m_nParamStart;
7 N& n% K$ `/ ]# wconstfloat* pValue1 = pData->m_pCalcParam[0].m_pfParam;
' W. |1 j2 K# I4 g2 e9 cconstfloat* pValue2 = pData->m_pCalcParam[1].m_pfParam;- h" R  K* v0 `& v; b. ?( E
constfloat* pValue3 = pData->m_pCalcParam[2].m_pfParam;
4 D* u0 i8 K3 zconstfloat* pValue4 = pData->m_pCalcParam[3].m_pfParam;& ~1 a) Q& k# u1 z* C# L4 Z4 u6 l7 g* E
//-------------------' P$ K, A5 a# \, j+ A/ Y. S0 ~
floatm_fOpen; //开盘 open
$ O& T  r! y+ `9 Wfloatm_fHigh; //最高 high
' Y% v9 i) c! w' j3 b  d; ifloatm_fLow; //最低 low
8 w( U5 M* H% m1 ffloatm_fClose; //收盘 close0 f4 Q* y$ j2 ~% ]6 S
floatm_fVolume; //成交量 Volume+ F. Q8 ]" [- N+ m: e! y! V+ S
floatm_fAmount; //成交额 amount5 T6 N! P0 u6 Q+ N7 s
调用收盘据
$ _2 g% b; J; V2 X9 ~. ^# D0 Y# ?/ EpData→m_nNumData= 变数数据长度% \8 ~. E7 i. P0 K8 C1 u/ k
pData→m_pData= pointer to struc STKDATA
5 n3 y. K" R& A- Q" t2 g% E3 _pData→m_pData[x]x个数据2 V  X  B5 r0 h1 |4 [2 A( U! x
pData→m_pData[x].m_fHighx个数据中的 High, z& u% d8 Y. t) g7 i$ c- p1 b
@@@@@@@@@@@important !!!!!!!  q. a1 @6 k+ @4 ^! r& U
sinceVC++ 2008, cl.exe will make ‘pData→m_pData[i-j].m_fClose’ anerror
- C( z3 C9 C) G" Z8 G% Mso,pass the high,low,open and close just from the function parameter ,that is use ‘ CALCPARAM’ struct, o1 T+ H9 M7 h$ k: ]6 d
pData->m_pData[i-j].m_fOpen// to use open , there is no way in using a varable for calculationoutside foxtrader
, }9 |2 e; A) E& i6 N* K7 GpData→m_pData[i-j].m_fHighto use high
, F- f) y5 b. epData->m_pData[i-j].m_fLow' L; W( Q9 {/ G" v( t
pData->m_pData[i-j].m_fClose
+ i9 [5 G( d1 w4 q6 B" ym_pData= pointer to struc STKDATA8 T' u% a! j/ y7 ?
incalling C++ dll function
% R# _8 |5 F! n4 M, R/ N2 tm_pDatais passed to pData (CALCINFO* pData . A CALCINFO* type pointer)/ G  N3 V( ^/ `8 F0 D
touse a single value in variable ‘High’
7 b5 E/ M9 A" t7 `' h/ dpData→m_pData[i-j].m_fHighto use high" ]  p2 M3 Z% `* y
constfloat* m_pfParam1; //调用参数1/pointer to variable parameter 1
$ n5 V+ D6 _8 hconstfloat* m_pfParam2; //调用参数2/pointer to variable parameter 25 z' @9 U4 ^/ l" U; ?+ H3 _# f
constfloat* m_pfParam3; //调用参数3/pointer to variable parameter 3
3 f3 W  @( l: Y$ v. b* \constfloat* m_pfParam4;
% Q3 N! f" @% u& Z9 b( G' Mm_pfParam1,m_pfParam2, m_pfParam3, m_pfParam4 = pointer to caller function 的参数
1 A  L5 B3 j* i% `" y  upData→m_pfParam1= pointer to 第一个(序列)参数
5 m& O1 m, F$ j: s8 y8 _pData→m_pfParam1[x]= 取用第一个(序列)参数的第x 个值  g; i* P7 G& e$ v
constfloat* cpParam = pData→m_pfParam1; =定义 cpParampointerto 第一个(序列)参数, V' V! A$ f) t6 j6 `; O1 n
cpParam[x] = 取用第一个(序列)参数的第x 个值
3 D3 T4 e. R6 ^. um_pResultBuf= 结果缓冲列
% L) r1 M2 @0 \$ m2 P, XpData→m_pResultBuf= pointer to 结果缓冲列6 L7 ?* ^: I" q+ y$ f
pData→m_pResultBuf[x] = 取用结果缓冲列的第 x个值: \$ x0 [. t. X3 v+ p& q  R5 X
//////////////////////////////////////////comment
$ e, b+ s. n5 T, {% \//////////////////////////////////////////comment 注解
& k( ?" T$ K2 }9 G2 M) G. D& iconstint m_nParam1Start; //统杅1衄虴宎弇离8 x" z5 P" I! D" {& c: e" k
constfloat* m_pfParam1; //覃蚚统杅1$ P  ~- e) ^. p# c
constfloat* m_pfParam2; //覃蚚统杅2
! X6 q- E' f6 ?$ E6 x, hconstfloat* m_pfParam3; //覃蚚统杅3% f2 Z- B; [* w7 |! t. i
constfloat* m_pfParam4; //覃蚚统杅4,parameters must be <= 4
7 h# l) |6 j. f* W. h, e* D* F* L//const float* m_pfParam5; // parameters must be <= 4$ B. P, t4 M- f( c/ V) y: a
//const float* m_pfParam6; 5 X/ \3 g% N& r' Z1 c
//const float* m_pfParam7; # J/ w+ j5 H) x4 `8 C7 E& ]7 R
//const float* m_pfParam8;
& }& Q. T0 S7 @//pData->m_pfParam1 && pData->m_pfParam2 &&pData->m_pfParam3 && pData->m_nParam1Start>=0 &&
; Q8 Q* @8 L1 Y5 c+ JpData->m_pCalcParam[0].m_nParamStart>=0&& pData->m_pCalcParam[1].m_nParamStart>=01 e- S0 u7 [2 c  Y: U
&&pData->m_pCalcParam[2].m_nParamStart>=0) - L" l( l. O- D# m: T
{
( q7 L0 M' v# ?& [7 Z" lfloatfParam = *pData->m_pfParam4; //pointer ,pData->m_pCalcParam[3].m_nParamStart >= 05 t7 n' K& x% Q
intnPeriod = (int)fParam; //统杅19 E3 B6 l: \; c; ~
//const float* cpParam = pData->m_pfParam2; // cpParam = pointer to第一个序列参数,cpParam = 取用第一个序列参数的第i 个值# ~% z8 ]" K, ~+ P* f
constfloat* cpParam1 =pData->m_pCalcParam[0].m_pfParam; // cpParam =pointer to 第一个序列参数,cpParam = 取用第一个序列参数的第i 个值
0 i- O" F+ d; n8 ^' C9 o/ \constfloat* cpParam2 =pData->m_pCalcParam[1].m_pfParam; // cpParam =pointer to 第一个序列参数,cpParam = 取用第一个序列参数的第i 个值
6 u9 ^! B7 g5 V. t9 V2 W8 I* G' rconstfloat* cpParam3 =pData->m_pCalcParam[2].m_pfParam; // cpParam =pointer to 第一个序列参数,cpParam = 取用第一个序列参数的第i 个值//parameters must be <= 4( e. K% @9 U# T( _
//const float* cpParam4 =pData->m_pCalcParam[3].m_pfParam; //cpParam = pointer to 第一个序列参数,cpParam = 取用第一个序列参数的第i 个值( ]& ~' |1 B. T) e
//const float* cpParam5 =pData->m_pCalcParam[4].m_pfParam; //cpParam = pointer to 第一个序列参数,cpParam = 取用第一个序列参数的第i 个值
& g; i* F: v. |8 X5 g# t' U% T8 [//m_pData = const struct pointer to struct STKDATA , pointer to structSTKDATA ,
9 F' _2 E3 k$ Y0 ytouse pData→m_pData[x].m_fClose
, ~& w3 O3 |1 i* Q$ Z2 }pData→m_pData[x]= | 1,2,3 , … , m_nNumParam | time_t m_time;
+ c# m* G) R4 I* c) u; k7 q|1,2,3 , … , m_nNumParam | float m_fOime_t
! |7 d. M  ^" W) B9 w6 z! s: T9 j|1,2,3 , … , m_nNumParam | float m_fHigh;
2 s9 h6 B8 s9 R% ]9 i& R) S.. .
0 W9 @% d8 V7 z: [6 ~8 @; N, Z|1,2,3 , … , m_nNumParam | WORD m_wDecline;0 I" `) J- B% C$ L& `# E
m_nNumParam= 数据high,close,open,low的长度" Y6 v/ u$ `& h% j
touse high:
2 F1 G% J$ P( bpData→m_pData[x].m_fHigh
3 e3 H8 G* R) ^- T; tcontentof struct STKDATA/ O, q2 [7 t" r' T
time_tm_time; //时间,UCT" F- H4 @" r3 D! ?$ x- G1 J2 ^
floatm_fOpen; //开盘 open
% S: T$ Q% V! I4 f0 xfloatm_fHigh; //最高 high
- B7 k  w! P# M8 T% B9 r+ W8 Q( ufloatm_fLow; //最低 low
. }; [6 u6 M1 R; F# Qfloatm_fClose; //收盘 close
( [  H$ g' @: O0 Cfloatm_fVolume; //成交量 Volume# W/ P: f5 h7 H* z
floatm_fAmount; //成交额 amount
2 D4 o% N. j' B, ?" aWORDm_wAdvance; //上涨家数 仅大盘有效
' Z# q8 M4 Z6 {$ A* Q+ GWORDm_wDecline; //下跌家数 仅大盘有效
& v# T: Z; d: ^1 \- P调用传递参数及传回结果: I9 _; z/ H9 b. y5 U7 N
调用传递参数
3 W- H) h) \% U3 S4 F(pData->m_pfParam1 && //参数1有效Param1exists7 e; V$ H0 B! i) u1 `& }* b
pData->m_nParam1Start<0&& //参数1为常数  F) H5 h7 C9 G- U6 B
pData->m_pfParam2==NULL) //' r' A' `9 ~7 r8 h, W- v
localprocedure 定义使用变数
# G6 S4 |2 k9 N* e, t9 Ronstfloat* pValue = pData→m_pfParam1; //use constant参数1% W4 S$ {$ ]3 m* w9 o+ ^
intnFirst = pData->m_nParam1Start; //use 参数1效值起始位
7 d3 A5 A' L& _/ ?- d! I& y$ j3 EfloatfParam = *pData->m_pfParam2; //use 参数23 Y) ~6 g  q8 F6 l) g7 V( e
intnPeriod = (int)fParam; & g- D% A3 j7 [+ f
传回结果
1 Q3 x( s: v. o3 A7 m, zfTotal+= pValue[i-j];$ L% j& @' r; k) o$ T5 m
pData->m_pResultBuf: h& y1 b4 F/ N  ]7 B9 C' Y1 u
//////////////////////////////////////////comment

评分

1

查看全部评分

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

本版积分规则

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

GMT+8, 2026-9-4 03:09 , Processed in 0.226908 second(s), 20 queries .

Powered by Discuz! X3.2 Licensed

© 2001-2013 Comsenz Inc.

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