阳光飞狐

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

 找回密码
 手机注册

手机动态码快速登录

手机号快速注册登录

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

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

[复制链接]
跳转到指定楼层
1#
发表于 2019-8-11 16:09:40 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
许多年以前,我曾经在2 a( @$ w% P- w# d3 r
理想公式区发布了% d( j8 y5 ^& }/ t# i
"
" O8 F, M$ j7 E) ]如何用 Foxtrader(飞狐)连结 C++动态程式库 DLL80x86Macro Assembly (组合语言)
- m3 u! U9 \4 w: [( T3 }"
& u6 p, g0 I; N$ s0 `" r; A$ H
$ C1 U/ |" X* O' Y6 L现在更新foxtrader(飞狐交易师)
6 u: |* Q: s1 B9 D4 k" y/ ?' J
连结 DLL的方法9 q% M4 O: K# D5 W1 ?' R: B2 [) W

& ?, {1 e! Q! s" k" ~+ I. b0 mfoxtrader- - > DLL (C++ and assembly) = ( foxfunc.h + foxfunc.cpp +pow10.asm )
% \% E9 s: c* K8 l2 T, L7 Lgauss- - > DLL (C++ and assembly) = ( foxfunc.cpp + meigj.asm )
" N6 {7 B5 B: }. w, Wgauss只用到函数参数传递,所以使用新的 c++compiler, 不受影响# `0 P9 k" n2 C2 O: B6 t" m
foxtraderfoxfunc.h宣告的结构型态 (struct)2004vc++ 6.0 全部有效
+ l0 I% \4 C* z7 u
5 X& f; V& r6 ?7 \也就是这五个结构都能用
, `0 z9 w$ T+ e! vtypedefstruct tagSTKDATA
$ M3 |4 x: N5 p0 O- ?typedefunion tagSTKDATAEx4 z/ J9 e$ V" @
typedefstruct tagSPLITDATA
0 U2 w/ K6 j1 T( t; ytypedefstruct tagCALCPARAM
; Z/ E- E- S6 H3 _) ttypedefstruct tagCALCINFO
, O3 |3 j8 a- k4 y5 l
. Q. i- O. Y" b! {( P2008年起,vc++ 2008, vc++ 2010, vc++2017 struct的编译,已经完全 c++,不再相容于 C: E5 P' A# y- O4 Z+ t
也就是这五个结构中1 [* t; D) y+ ]& Q% s
typedefstruct tagSTKDATA
" b& r& @2 q" f  a# U, ktypedefunion tagSTKDATAEx0 {' S9 k* {# `& j. l  H- F) R
typedefstruct tagSPLITDATA & }3 h+ O1 G$ {, u1 D
typedefstruct tagCALCPARAM
- d' e; q/ \% r4 Y; Jtypedefstruct tagCALCINFO" W; s% o8 P: x0 y5 z3 h
只有这两个可以用
6 v8 f8 [" E1 K1 S) I2 ~/ E" Atypedefstruct tagCALCPARAM
/ x) I" R- {1 M% ftypedefstruct tagCALCINFO
7 r, W4 I" ^: K5 O6 f; `1 l4 r5 [值得庆幸的是,下面这个结构的函数参数传递个数可以有无数个
1 _3 L5 T9 |+ M# R% ^3 p* t" s) ktypedefstruct tagCALCPARAM  S5 k- c! Y# }8 f9 G
例如:foxtrader) V0 b. S+ f% b( X4 [; z+ @, w* @2 D
MA1:=MA(CLOSE,3);
; I2 x5 z, f8 U4 t* l$ P0 F; EMA2:=MA(CLOSE,6);
# n+ A2 j7 T& n$ P% `. e* AMA3:=MA(CLOSE,12);4 m6 F' U) [& v9 ~* w# b4 `
MA4:=MA(CLOSE,24);! ?. \2 q7 ~# a
MYBBI1:"MYFUNC2017@MYBBI"(MA1, MA2,MA3,MA4,MA3,MA4,5)*0.95,colorff00ff,linethick3; {2017 vc++ 15.0}
- l0 Z: f! l% N4 W) |4 a其中MYFUNC2017=MYFUNC2017.dll, MYBBI = MYFUNC2017.dll 中的MYBBI函数,这里 MYBBI函数传递的参数共有 79 m( e* ^3 @7 p- h1 G7 D3 `
下面这两式计算结果相同/ S$ [( ]6 N- ]
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 自行计算}
$ G' r3 G0 D6 R+ wMYBBI1:"MYFUNC2017@MYBBI"(MA1, MA2,MA3,MA4,MA3,MA4,6)*0.95,colorff00ff,linethick3; {2017 vc++ 15.0 , dll计算}% g7 c( C" G% g5 \4 ~
其他例子( f# H% S# h& X
oooq:="MYFUNC2008good@MYMACLOSE"(c,,c,c,6),colorffffff,linethick5;(---> pow10.asm)! l4 a# a- `% M
oooq1:"MYFUNC2010@MYMAVAR"(ma(c,5),5),colorgreen,linethick5;
# W) N7 o$ u9 z: W: D其中pow10.asm里面有很多不同定义或宣告被注解不用,那是因为后来在逐步侦测法修改语码中才发现在foxfunc.cpp主程式中,下面这行错误,也就是新的 compiler不再相容于 C,因此在pow10.asm里面被注解不用的定义或宣告中,有些应该是可以用的( G  \  x, P: t8 _
fTotal= pData->m_pData.m_fClose; // @@@@@@@ vc++ 2010 cl.exe 使pData->m_pData[i-j].m_fClose错误( J  p  `7 A# Y

1 D/ T7 c3 P9 G2 q5 w7 a9 p
8 J) B. S1 e# n' @////////////////////////////////////////////////////////foxfunc.h( s- M; ?3 J. l: @
#ifndef__FOXFUNC_H_INCLUDE5 N* N1 i+ [! Y  K: c
#define__FOXFUNC_H_INCLUDE
+ u; E' i2 m* F2 u  I/*
3 x0 i/ u/ F& K. A# z, N飞狐交易师“C语言接口”扩展程序调用接口规范V3.07 X7 V# E$ ]2 i3 g* T# ?' e# [
1.本规范适用于飞狐交易师V3.x公式系统.
; v6 Y7 T- g/ t2 F5 {& W2.扩展函数用于实现系统函数不能实现的特殊算法.7 L6 k/ ^3 i6 p9 y2 Z
3.扩展函数用windows32位动态连接库实现,建议使用MicrosoftVisual C++编程.- a! a' d* W' s. K8 d7 h
4.调用时在公式编辑器中写"动态库名称@函数名称"(参数表)即可,例如下面函数可以写为"FOXFUNC@MYMACLOSE"(5)
4 _' R, q4 q4 u8 C6 x5.动态连接库名称和函数名称可以自己定义.' y7 P2 H! r# f# s  l
6.使用时必须将动态库拷贝到飞狐交易师安装目录下的FmlDLL子目录下使用.
; ]4 u3 Q# c8 S4 @*/
- h0 }7 j; O1 I* }#ifdef__cplusplus
# Y6 @4 C3 e& C- F2 c. S8 `* N$ Yextern"C"
3 \7 v- N# U2 Q{% n/ Y! P* E8 Q  ]$ ^
#endif//__cplusplus% t4 U, s$ f9 G$ o) U
///////////////////////////////////////////////////////////////////////////& Q+ a& b; X: m% V
//分析周期
: q. d) b) e" c# u% J" QenumDATA_TYPE
0 N+ o8 J. p# A! D{9 z- A* F! h/ |% }1 y# E4 _" D
TICK_DATA=2,//分笔成交$ `3 Y8 N& G! r3 `' ]# T+ k* G
MIN1_DATA,//1分钟线+ x- [, J" @3 r! a! Z$ C4 r. [
MIN5_DATA,//5分钟线
/ T  }9 m, I! {% t% u! PMIN15_DATA,//15分钟线# v/ o0 u& A5 F9 D8 H( K, I
MIN30_DATA,//30分钟线& f( X; m/ g. ]+ m
MIN60_DATA,//60分钟线
8 e- R& T1 L) f/ pDAY_DATA,//日线6 n, l8 T+ {6 X! w' U0 J6 x
WEEK_DATA,//周线/ m9 V- Z! d$ a2 i
MONTH_DATA,//月线
9 {" D  O% M+ uYEAR_DATA,//年线
! |, T: O/ l" W& z4 N7 ^# W' xMULTIDAY_DATA,//多日线1 ?' ]# t6 n6 }
MULTIMIN_DATA//多分钟线
* N0 _7 O+ I7 w6 h* t};
5 E1 C' x* z! W! x' l. a$ ?/ o///////////////////////////////////////////////////////////////////////////' C4 v/ {* p) w& L" _1 f
//定义取用股票基本数据的结构 只有 VC++ 6.0 compile成功使用
# I+ \1 w) t4 @0 j1 t! }! qtypedefstruct tagSTKDATA
! }3 R4 x4 z+ E9 a{, h7 W8 a; I% O* k
_tm_; //时间,UCT
7 N  O: t: v2 d: l3 s9 q5 l/ Sfloatm_fOpen; //开盘 open
4 x% S7 g8 |# r! t* B$ jfloatm_fHigh; //最高 high1 s, P; t1 m) A! E9 z
floatm_fLow; //最低 low- N; w" ~  m5 k& }1 F
floatm_fClose; //收盘 close: ?) {+ x+ g7 r8 [" z# }- R* p7 h
floatm_fVolume; //成交量 Volume$ M/ I. J" F+ A2 Y# B% J# }
floatm_fAmount; //成交额 amount
0 R7 Q) j7 C. @9 D  r3 f& hWORDm_wAdvance; //上涨家数 仅大盘有效
2 w) c2 u1 e* {. iWORDm_wDecline; //下跌家数 仅大盘有效
5 o2 D  R1 c# L. Z; v/ y% d}STKDATA;
8 R* E2 `- b  O- V% L+ P. N: e定义STKDATAtagSTKDATA的简单别名,STKDATA : A$ {- a: Z1 h/ p8 h) O& M
为真正方便使用名称,tagSTKDATA 为定目的的过水名称4 U( }5 Z; o: B) p* n/ `6 ]
////////////////////////////////////////////////////////////////////////////
9 ~# }, d, _1 ]  u  G//扩展数据,用于定义取用分笔成交数据的买卖盘 的结构
3 P+ ?( q2 d: l- o. ztypedefunion tagSTKDATAEx% y$ F& F) |3 f' C& ~
{9 j4 N* r( P1 ]  T) f  J' H
struct
8 n' a. H; m1 N- H3 b2 \3 I{
* ?6 u! a4 S8 p' z9 @# lfloatm_fBuyPrice[3]; //1--3floatm_fOpen; //开盘 open
& L, D- W: o$ Hfloatm_fHigh; //最高 high* x& p, `. j. z, s4 K; m
floatm_fLow; //最低 low4 a! ^- N+ \( j/ r/ U0 a- p
floatm_fClose; //收盘 close8 @6 M( \$ A9 G( z
floatm_fVolume; //成交量 Volume2 ^/ o. R# B* c8 C
floatm_fAmount; //成交额 amount
' T; U: s0 [+ p+ }) h( J* s5 [floatm_fBuyVol[3]; //1--3- i, w% ~2 z5 A: }0 o9 A6 G$ o
floatm_fSellPrice[3]; //1--3( ^% m. o5 r: D, O' Z8 ?. L5 B  i
floatm_fSellVol[3]; //1--38 I& `2 g+ M2 w6 O  O* ], q) J
};
8 X  Z- T% e1 b7 f& cfloatm_fDataEx[12];$ ]! z9 N* N9 n6 x& @0 }0 {
}STKDATAEx;
. C  q% N9 \4 R2 ?////////////////////////////////////////////////////////////////////////////3 k  P9 k. @+ v+ {- a* q9 l
//定义取用除权数据的结构
; x$ s7 L, @) `% `8 s3 A' Mtypedefstruct tagSPLITDATA
* A8 @7 a& l" i{
" x1 m. D, U. g2 K5 t! f* ?* Mtime_tm_time; //时间,UCT
3 z1 g4 @- ?: P( X% |floatm_fHg; //红股: N, l2 A. X# A3 o+ s0 i
floatm_fPg; //配股6 m; X! u4 z1 N0 J+ _0 }1 Y
floatm_fPgj; //配股价1 o- L, `2 E' R3 y9 r0 H; u2 _$ k
floatm_fHl; //红利9 @1 ?# Y2 N! S$ ^' ^
}SPLITDATA;
9 |- _: L" i7 U# ~: V8 ^- t4 p/////////////////////////////////////////////////////////////////////////////' D$ h4 C  [/ X4 H( ?- X; M2 _+ i
/*财务数据顺序(m_pfFinData内容)6 c9 i' L+ k0 E* M# t6 c. M
序号内容* `6 J  l6 R$ Q0 ?) a
0总股本(万股),
( @& u- r9 o' p% ^1国家股,
/ [' L) Z' b0 Z# m5 R$ ]/ A; x2发起人法人股,
( E+ p( s. r* p0 ?, x4 B3法人股,: _! z. c, h9 s6 ]
4B,; k2 p( g3 ^- `8 q0 p
5H,
0 i" N% e0 d' ]6 d4 i6流通A,
$ I7 ]6 P$ z# \! a: L/ ^5 |4 z; \7职工股,$ T  J, y) n( w* [3 q. L
8A2转配股,/ ?! J# R6 I* H* B8 \2 d
9总资产(千元),+ t  }8 J+ o& R( l
10流动资产,, ]3 c  q' j+ f
11固定资产,
8 u/ G' S( \9 C* i2 P12无形资产,/ `' R( D0 d' v2 c6 d% c2 c
13长期投资,
  L6 n3 c0 ~8 k" x; T& i' n14流动负债,
, `" @# h7 j4 K" F2 C( F& M15长期负债,
1 D- |* t  ^2 O* r# B- U16资本公积金,
) H! I0 X2 X+ K7 |: U; O17每股公积金,
; G0 X0 W4 Y8 I& _1 R18股东权益,
. n- r$ G: S1 N1 Q4 P19主营收入,; P9 u" y- K# l3 {. }" \" R
20主营利润,+ y; ]5 P. r0 k3 G1 x3 [% Z
21其他利润,( n) ?0 D' g( I6 {+ e$ W- ?
22营业利润,, [; O* v- g: t0 `4 {' o$ ^! \4 d8 r, u* A
23投资收益,/ b2 |* V1 K/ h0 |; a! G' p0 _6 u
24补贴收入," _; @7 R& W% M& V
25营业外收支,
. C: {+ S3 A/ }; T3 D& i6 Q4 Y26上年损益调整,  E, o  G. k$ O% d* C8 U
27利润总额,
6 v7 @5 o: D8 @: [& }$ R  A! \% y28税后利润,3 @7 Y$ l2 L! @* i
29净利润,/ ]( n) L" r/ G% s
30未分配利润,
' _- y/ b7 l) T8 e; X9 q31每股未分配,, o3 E. b% I; a2 ~! G4 ]7 g# W( j
32每股收益,
, w: a4 R, {2 ^2 \+ A33每股净资产,
5 a9 _5 F/ {( b+ _' X34调整每股净资,
: {3 s1 G; B" a( Y, |35股东权益比,- E( I3 i- V2 a; s
36净资收益率4 R5 q3 H: s' y! A# K& p  `
*/- T7 a6 p( B+ {; S9 M' y
/////////////////////////////////////////////////////////////- v0 u. R) v# X9 n/ m- n2 f+ L0 n# E
//定义取用caller函数传递参数项 的结构& ]% ^. S1 e, S7 Y
typedefstruct tagCALCPARAM& v1 R% N3 I+ G/ t$ O3 L
{
; Q2 y1 R7 g( w$ e0 a/ E) cunion, E* u  D. ?& I, d5 a" M! z) V
{- x# X* D! a2 }& x9 t( _. L
constfloat* m_pfParam; //指向序列参数的址标,指向一个浮点型数组pointertofloat variable parameter / ex. c,h,l,o, co2...co2=(c+o)/2& y, o3 J" e2 T2 F. Q3 {
constfloat m_fParam; //数值参数 valueof parameter# f6 X6 V* R  J+ g! e9 Z
};
7 T+ {2 D9 L' ?- P, o% Tconstint m_nParamStart; //序列参数有效起始位置thestart address of variable parameter / ex. c,h,l,o,co2.....! }: I8 ?7 T+ x
}CALCPARAM;
5 W- f0 ?3 Q/ i1 M/ e5 v/////////////////////////////////////////////////////////////////////////////8 H( W  D( L& Y  i: d8 D' Y
//定义全部取用址标 的总结构 (各指标指向前述各结构以便取的各结构的数据,接口信息数据的结构 )/ j2 M# P; C, |- p8 X
typedefstruct tagCALCINFO
) u( @' ]# z, \$ q! Z/ J{- P7 ?1 {6 |* C7 G& o: Z
constDWORD m_dwSize; //结构大小- s" c+ j: x8 R2 A  s
constDWORD m_dwVersion; //调用软件版本(V2.10: 0x210)
( b5 Y6 _5 H* ~; ?4 KconstDWORD m_dwSerial; //调用软件序列号
% H$ e% N8 j. N1 iconstchar* m_strStkLabel; //股票代码
8 j  {$ U& i. YconstBOOL m_bIndex; //大盘
  P% |* P, D# ^% U$ K( R, iconstint m_nNumData; //数据数量(pData,pDataEx,pResultBuf数据数量)数据长度9 p2 _3 U" F+ J1 V# ?& \1 P
constSTKDATA* m_pData; //常规数据,注意:m_nNumData==0时可能为NULL
, O. ^% n, B* r' |; Z3 u  a7 jconstSTKDATAEx* m_pDataEx; //扩展数据,分笔成交买卖盘,注意:可能为NULL
& y, L" z/ P3 B# ^constint m_nParam1Start; //参数1有效起始位置<0/ constant parameter >0 /variable parameter
  h' e. b2 }* h4 k2 w, O# Nconstfloat* m_pfParam1; //调用参数1/pointer to variable parameter 1
; Y: Z  l" H' a; f% X, e5 r$ Cconstfloat* m_pfParam2; //调用参数2/pointer to variable parameter 2& b# O/ K3 J9 z* [
constfloat* m_pfParam3; //调用参数3/pointer to variable parameter 3
. G9 Q: c1 k" h% Hconstfloat* m_pfParam4; //调用参数4/pointer to variable parameter 4
2 J2 C% a7 U, k9 g; ?float*m_pResultBuf; //结果缓冲区
( n* b  Q4 o" Z8 p! UconstDWORD m_dataType; //数据类型
1 K; r0 q8 V4 z; V& mconstfloat* m_pfFinData; //财务数据: f7 S8 Q8 W# p8 E3 M9 l' J1 w
//以上与分析家兼容,所以沿用其结构和名称
# g5 r3 b4 e( V- \& |  f% v//以下为飞狐交易师扩展(fortagSTKDATAEx): d8 z2 v3 n5 B7 b* v
constDWORD m_dwReserved; // 保留0 @+ g) ?, g6 M# |0 ~
constint m_nNumParam; // 调用参数数量: c0 _: ?3 M9 D+ E
constCALCPARAM* m_pCalcParam; // 调用参数数组
# `; u9 G2 \4 G4 M2 UconstDWORD m_dwReservedEx[4]; // 保留, x0 U5 C8 S3 _+ h: ?# z, B+ k
char*m_strStkName; //股票名称
2 @) N  E( F9 W: E& qSPLITDATA*m_pSplitData; //除权数据; z- H( ^+ D, x9 U! h* Z, W" a0 T
intm_nNumSplitData; //除权次数0 u( V) {8 M0 @. f. n) T7 r
}CALCINFO;) m1 W& D. S" d" V  [
/*( @" i' Z  v* F. b& J
1:(与分析家兼容)
+ Y6 n- ~, A- y9 {, j9 J1.函数调用参数由m_pfParam1--m_pfParam4带入,若为NULL则表示该参数无效.3 j. V# b/ e1 U
2.当一个参数无效时,则其后的所有参数均无效." r2 @& e. f. `0 N+ }7 h9 `
:m_pfParam2NULL,m_pfParam3,m_pfParam4一定为NULL.
, n5 I1 C5 P: M& m3.参数1可以是常数参数或序列数参数,其馀参数只能为常数参数.
: `/ o. g) T- B; a  z4.m_nParam1Start<0,则参数1为常数参数,参数等于*m_pfParam1;
8 P" F' W# e8 k3 h. Y+ X# P( X5.m_nParam1Start>=0,则参数1为序列数参数,m_pfParam1指向一个浮点型数组,' f& T7 M. e0 P1 X3 C* ?
数组大小为m_nNumData,数据有效范围为m_nParam1Startm_nNumData-1.
0 ^! [5 W+ [: w在时间上m_pData[x]m_pfParam1[x]是一致的
1 U/ S3 B% u3 [" F, j2:(飞狐交易师扩展)
7 i5 D9 J5 Q$ t3 L. l# ]1.该扩展结构使调用参数在技术上可以是无限数目的,且每个参数都可为数值或序列,由公式中实际的调用参数决定。- n* h8 \/ A& T6 A" Z9 ?) _, Z
2.CALCPARAM结构用于带入参数信息和实际数据,m_pCalcParam数组大小为m_nNumParam,数据有效范围为0 m_nNumParam-1.
4 m$ v+ b. w5 ~; h7 {3.按参数的顺序,m_pCalcParam[0]为第一个参数的数据,m_pCalcParam[1]为第二个参数的数据...,为了保持兼容,原m_nParam1Startm_pfParam15个属性依然有赋值。
. b* V$ L, f) w1 A! t! X$ w4.i位置的参数为数值,取用m_pCalcParam.m_fParam.
3 x/ ]6 z7 G1 d( W! E6 Q  z0 Y5.i位置的参数为序列,取用m_pCalcParam.m_pfParam,数组大小为m_nNumData,数据有效范围为m_pCalcParam.m_nParamStartm_nNumData-1.m_pCalcParam.m_nParamStart<0,则此数组中无有效数据。1 Z. q7 ]$ d6 I* u8 P6 _/ G8 ]
6.由于可以调用多个序列,许多序列的计算可以先在公式中进行,然后作为调用的参数即可。. A4 r0 |: D9 ^: I8 @
7.经此扩展,对分析家的DLL依然可以调用、兼容。' t0 w* |2 N" j0 v8 Q- J. o$ w
*/* q& d0 |7 E, b/ k- ?  A
///////////////////////////////////////////////////////////////////////////////////4 G2 h& ^1 C) g5 c, L5 @0 S
/*函数输出
  o! H6 p& @- K, i1 v/ S__declspec(dllexport)int xxxxxxxx(CALCINFO* pData);
8 k" q9 x) v* p0 ?( u) h1.函数名称需全部大写.# F0 ^/ V# H( |% D7 E
2.函数必须以上述形式声明,请用实际函数名称替代xxxxxxxx;) r2 C# O& ]( c3 L# R' U9 V
对于C++程序还需包括在extern"C" { } 括号中.
+ h, s9 t4 z" \7 A+ ^. S3.函数计算结果用pData->m_pResultBuf带回.
. J* O8 M4 N' u6 ^5 c8 Q4.函数返回-1表示错误或全部数据无效,否则返回第一个有效值位置,:+ b, r& a, ?4 a/ r" y
m_pResultBuf[返回值]-- m_pResultBuf[m_nNumData-1]间为有效值.
4 S; |+ i/ R0 ]6 I5.函数名称长度不能超过15字节,动态连接库文件名不能超过9字节(不包括扩展名),动态库名称不能叫SYSTEM,EXPLORER* u2 Q& Q& t$ r: |2 `4 q, q) D. R
*/
2 Q3 T* o: |- K//示例函数,使用时用实际名称替换
. _2 S' d- k/ r8 q! D' s# l( s. N/ y__declspec(dllexport)int WINAPI MYMACLOSE(CALCINFO* pData);
% a( {4 k5 i( L__declspec(dllexport)int WINAPI SMOOTH(CALCINFO* pData);' y% k4 [8 n" ]  Q9 H& V6 L; N  W$ {
//__declspec(dllexport) int WINAPI MYMAVAR(CALCINFO* pData);/ D1 P; p% ]# l: k1 P# e$ Q
__declspec(dllexport)int WINAPI MYBBI(CALCINFO* pData);
5 C+ }$ a, v1 b8 }. [//WINAPI = _stdcall
2 @. D' F8 u7 |" A8 S2 K# S* `2 f#ifdef__cplusplus
- g% l( f/ U3 V! J+ Z$ p  t9 x}2 J( L; s4 A% ^6 J
#endif//__cplusplus) l0 K# b& U8 n9 c3 q
#endif//__FOXFUNC_H_INCLUDE
. Q9 ]5 i- l) V0 |* j% X, k$ M/ m; ^0 f5 `; E; p. k. y
//////////////////////////////////////////comment 注解
6 D" B$ T7 m6 W* ~$ B$ ^' a__declspec(dllexport)int WINAPI MYMAVAR(CALCINFO* pData)7 \# v9 W1 o( t: m& h1 ]2 @
pData是指向 址标总结构 CALCINFO的 总址标
' X% k  u  y+ r% i2 e: L) e3 x取用第二个参数数值floatfParam = *pData→m_pfParam2
* \7 I* l1 L6 b- v取用第一个序列参数的址标constfloat* pValue = pData->m_pfParam1;
2 x, I1 h. K- t# W' J1 V2 Y, u5 N取用股票数据长度intndata = pData→m_nNumData;
, c, ~! ?1 V5 w+ b第一个参数存在且为数值pData->m_pfParam1&& pData→m_nParam1Start<0
/ O4 j; k, ^1 l7 M$ h1 s6 [. W" }第一个参数存在且为序列pData->m_pfParam1&& pData→m_nParam1Start>=0
5 s" m7 c' [  x' i5 g第一个及第二个参数存在且为序列,第三个参数不存在pData->m_pfParam1&& pData->m_pfParam2 && pData->m_nParam1Start>=0&& pData->m_pfParam3==NULL% B6 s0 C7 r: F7 N, n
constfloat* cpParam = pData->m_pfParam1; 定义cpParam为第一个序列参数的址标: E. q7 @! ~9 @% @7 N
取用股票数据结构2 d! z! Q- n  |& ?
pData→m_nNumData= 变数数据长度6 o0 z1 x, z6 m. z9 L1 d# J
pData→m_pData= pointer to struc STKDATA 的址标
8 r/ ~. \7 ?' P. V; A* t1 ipData→m_pData[x]数据结构的第x个数据
3 e) y  Y" ^# l7 S( u' y! a0 ^  opData→m_pData[x].m_fHigh数据结构的第x个数据中的 High
$ @1 H) n$ E' O取用结果缓冲序列0 o' a2 P( @) M# z- C
pData->m_pResultBuf
6 u- t$ C7 G3 ~$ E2 m( e$ l取得第一个序列参数的起始序位,2,...5 , . 7...8 T0 }- z5 q# m, d1 H
intnFirst = pData->m_nParam1Start;
8 [$ ^* y7 O; Cfor( i = nFirst+nPeriod-1; i < pData->m_nNumData; i++ )  l; |& ^  B6 w+ X/ c" v7 M$ W
取得第二个数值参数的数值. V+ h/ S6 n5 S5 L) O0 |
floatfParam = *pData->m_pfParam2;
; G( g! f1 W. W! d: ~7 yintnPeriod = (int)fParam;2 S- u4 B+ q4 W1 W; b) _  P% C! ~
取用第一个序列参数的址标constfloat* pValue = pData→m_pfParam1;
+ B8 i# x! X# @# I取用序列参数的单个直pValue
$ H% ^% v3 M. \' r; K/ u取用缓冲序列的单个值pData->m_pResultBuf9 ~8 p! T; \! v1 J1 F& I3 S, v
constCALCPARAM* m_pCalcParam; // 调用参数数组+ f* n# \7 J1 f, a8 w
m_pCalcParam为序列址标,指向各序列参数的指标0 b- a# L9 `1 Q+ y4 H
第一个序列参数pData→m_pCalcParam[0]
5 }  G. ^" C) m- Y! o+ ^constfloat* m_pfParam; //指向序列参数的址标
, U$ H. R* [; ?8 j$ J! Q/ G. u第一个序列参数的起始序位pData->m_pCalcParam[0].m_nParamStart2 f# o; b/ E5 z: L1 m0 c
第一个序列参数的址标constfloat* pValue1 = pData→m_pCalcParam[0].m_pfParam;# D3 }: Z( d' A( j
取用第一个序列参数的单个直pValue1
1 l4 q# c) c7 [; W第二个序列参数pData→m_pCalcParam[1]
) w! x5 ~* H5 |8 J: I1 n第二个序列参数的起始序位pData->m_pCalcParam[1].m_nParamStart
' t" e# y+ m  y2 u$ m第二个序列参数的址标constfloat* pValue1 = pData→m_pCalcParam[1].m_pfParam;+ T- v) u' O: a1 ]1 T9 Q9 {9 ?
取用第二个序列参数的单个直pValue2
3 N% C% x5 D5 t第三个序列参数pData→m_pCalcParam[2]* n& ^& B  a; \4 b
第三个序列参数的起始序位pData->m_pCalcParam[2].m_nParamStart, A6 ?0 e1 u  F4 E5 u: K8 p% ^6 O9 Q
第三个序列参数的址标constfloat* pValue1 = pData→m_pCalcParam[2].m_pfParam;3 q! J5 O% Q2 S5 L9 |
取用第三个序列参数的单个直pValue3
0 |1 S- i  D0 f. Q/ F4 b6 m& j2 T第四个序列参数pData→m_pCalcParam[3]8 O+ P; a& \  K; b
第四个序列参数的起始序位pData->m_pCalcParam[3].m_nParamStart
! d' ]9 D5 m( q' e$ I  `第四个序列参数的址标constfloat* pValue1 = pData→m_pCalcParam[3].m_pfParam;/ p7 `" N2 T5 `2 F1 z& d; p. ~+ Q9 G9 H
取用第四个序列参数的单个直pValue4+ Y9 H2 ]( C( E' P! I* m
如果有四个序列参数,则取用序位最高的那一个序位
& |5 Y9 D+ x8 F, @1 }if( pData->m_pCalcParam[0].m_nParamStart >= 0 &&
' o* }3 ~7 w0 [5 u( BpData->m_pCalcParam[1].m_nParamStart>= 0 &&
, B4 v8 c8 J2 \- s0 ?( \pData->m_pCalcParam[2].m_nParamStart>= 0 &&8 H/ T1 N* e; }9 O) b2 P
pData->m_pCalcParam[3].m_nParamStart>= 0 ) //4个序列都含有效数值
' F4 s2 \  P/ Z{; e8 x# u( _; P; |& \5 H/ N1 C
//计算返回的序列的第一个有效值位置
2 U4 C' K% x3 z# a* fintnFirst = pData->m_pCalcParam[3].m_nParamStart;//已知返回的序列的第一个有效值位置与第4个序列一致/ X) _) c, {& ?& a, o1 B
//若不知,则7 k4 W( w2 n8 V6 Y
/*) c; I4 d; U; g( m+ ~4 g+ h
intnFirst = pData->m_pCalcParam[0].m_nParamStart;6 t8 E0 ?/ @- A& z. G
if( nFirst < pData->m_pCalcParam[1].m_nParamStart )   n. M+ ~5 B4 t4 t9 ^/ D. K
nFirst= pData->m_pCalcParam[1].m_nParamStart;
3 r3 ~" d2 i  V; C9 c8 Xif( nFirst < pData->m_pCalcParam[2].m_nParamStart ) * F2 }5 }3 p3 y
nFirst= pData->m_pCalcParam[2].m_nParamStart;; ~6 _7 Z1 l% _; @2 m% b% R( F( g
if( nFirst < pData->m_pCalcParam[3].m_nParamStart ) ' j& i7 q9 j' {
nFirst= pData→m_pCalcParam[3].m_nParamStart;! b! w1 R: {+ T' m  `
constfloat* pValue1 = pData->m_pCalcParam[0].m_pfParam;  [* p3 L9 f+ E# K. o8 N8 ]
constfloat* pValue2 = pData->m_pCalcParam[1].m_pfParam;
. {1 V# C$ D3 p) H- zconstfloat* pValue3 = pData->m_pCalcParam[2].m_pfParam;3 f3 F! L. k- h) a7 y
constfloat* pValue4 = pData->m_pCalcParam[3].m_pfParam;& u% U0 V1 L$ `0 M1 J- F( `+ Z
//-------------------* z$ R6 ]; E; s* Z  L
floatm_fOpen; //开盘 open
4 p' P" q9 d+ `' v6 gfloatm_fHigh; //最高 high( D1 \, x2 [4 \$ J0 Q
floatm_fLow; //最低 low
/ f+ Q, c5 |$ F' {) lfloatm_fClose; //收盘 close
% r" k; r# D' D$ [* Y' e/ ^floatm_fVolume; //成交量 Volume
0 i9 w1 M1 v: j! \4 g3 F( ~$ ^6 ofloatm_fAmount; //成交额 amount. u( _, y- c3 t  q
调用收盘据
9 R. ~# t. J/ p% BpData→m_nNumData= 变数数据长度9 p% i7 ?. r8 m! q" W: k: @
pData→m_pData= pointer to struc STKDATA
' s0 C7 J4 e" `pData→m_pData[x]x个数据
+ H( w3 i: X& Y/ u* ^" bpData→m_pData[x].m_fHighx个数据中的 High+ s; q* K7 t) ^, K' X
@@@@@@@@@@@important !!!!!!!/ t: T. c, z+ i) i8 }# t
sinceVC++ 2008, cl.exe will make ‘pData→m_pData[i-j].m_fClose’ anerror
7 ^& a( m) U9 ]4 tso,pass the high,low,open and close just from the function parameter ,that is use ‘ CALCPARAM’ struct" E  e0 R  {3 v8 Y4 t+ q  p% ~8 s
pData->m_pData[i-j].m_fOpen// to use open , there is no way in using a varable for calculationoutside foxtrader" u2 u8 g8 a. W: _) ?
pData→m_pData[i-j].m_fHighto use high( K; K# s* x  G8 G$ Z# T
pData->m_pData[i-j].m_fLow2 y2 t7 x) z0 G/ L4 `6 f
pData->m_pData[i-j].m_fClose
' O2 n) F; S3 O( H$ p6 Tm_pData= pointer to struc STKDATA
7 x* \# b. y* w( R; x* Y- Q. J( sincalling C++ dll function
4 Y8 x% H0 q$ V3 A  u( h7 Em_pDatais passed to pData (CALCINFO* pData . A CALCINFO* type pointer)
7 Z) @$ {* Q) @" f$ Ztouse a single value in variable ‘High’3 X& e0 m  v5 A/ r* c
pData→m_pData[i-j].m_fHighto use high
) X+ {& U& q6 [% n3 iconstfloat* m_pfParam1; //调用参数1/pointer to variable parameter 1 - Q7 i. W3 u( \% x2 S) E) g! r
constfloat* m_pfParam2; //调用参数2/pointer to variable parameter 29 M6 @# u' h% w
constfloat* m_pfParam3; //调用参数3/pointer to variable parameter 3, j& a) c/ F, b1 c% v; B2 }# k) J
constfloat* m_pfParam4; 6 q' b5 T1 V/ l. I# A
m_pfParam1,m_pfParam2, m_pfParam3, m_pfParam4 = pointer to caller function 的参数3 Q6 w5 e8 m5 m6 z1 q8 V7 W
pData→m_pfParam1= pointer to 第一个(序列)参数
+ O; h+ _  _: F, lpData→m_pfParam1[x]= 取用第一个(序列)参数的第x 个值1 i8 r  U0 S- N% Y' S( `; f
constfloat* cpParam = pData→m_pfParam1; =定义 cpParampointerto 第一个(序列)参数
( h" ?- e: Z% qcpParam[x] = 取用第一个(序列)参数的第x 个值2 @; N/ H% |& `
m_pResultBuf= 结果缓冲列" S9 D! M: w9 o$ r/ s* C
pData→m_pResultBuf= pointer to 结果缓冲列
8 l. U# W6 p$ V/ S3 J* I. n5 upData→m_pResultBuf[x] = 取用结果缓冲列的第 x个值+ V! g4 J/ y6 D* ?4 c
//////////////////////////////////////////comment: j% O) e+ S8 G& z% @* U/ I
//////////////////////////////////////////comment 注解
! g' @% \8 p- ^4 Z' Yconstint m_nParam1Start; //统杅1衄虴宎弇离
$ S# K! w' T5 D' i0 H$ w. mconstfloat* m_pfParam1; //覃蚚统杅1  B( v" g/ s4 n; y! H
constfloat* m_pfParam2; //覃蚚统杅2
$ R3 i" A% L  X3 a2 n: }8 X9 Mconstfloat* m_pfParam3; //覃蚚统杅32 `5 U0 Z+ D0 g- R) n5 v8 U0 {5 G
constfloat* m_pfParam4; //覃蚚统杅4,parameters must be <= 4
; X: C# ]- J  \; X//const float* m_pfParam5; // parameters must be <= 4
9 C6 b" G2 h4 R- g: P* L. N//const float* m_pfParam6;
. i, e6 R- A6 j& x//const float* m_pfParam7; * t, a. ]" f" ~3 I+ S- n
//const float* m_pfParam8;, i9 c$ O# `9 Z* r9 m
//pData->m_pfParam1 && pData->m_pfParam2 &&pData->m_pfParam3 && pData->m_nParam1Start>=0 &&; d0 Q0 d% {! j& \( r9 L8 N
pData->m_pCalcParam[0].m_nParamStart>=0&& pData->m_pCalcParam[1].m_nParamStart>=03 e8 A# U! ]7 N1 z$ a' d! _. x
&&pData->m_pCalcParam[2].m_nParamStart>=0) 3 ^8 a" K. D" u/ l- T
{
) b( a8 ~0 c, ~' T; U/ `* rfloatfParam = *pData->m_pfParam4; //pointer ,pData->m_pCalcParam[3].m_nParamStart >= 0
6 ^7 O3 D( \: J" jintnPeriod = (int)fParam; //统杅1
" U* ]: V+ a3 b- z( w  n8 \5 q//const float* cpParam = pData->m_pfParam2; // cpParam = pointer to第一个序列参数,cpParam = 取用第一个序列参数的第i 个值
7 ?! p3 Y1 B' y9 O+ g  Sconstfloat* cpParam1 =pData->m_pCalcParam[0].m_pfParam; // cpParam =pointer to 第一个序列参数,cpParam = 取用第一个序列参数的第i 个值, M3 _8 v# C- w$ F, v
constfloat* cpParam2 =pData->m_pCalcParam[1].m_pfParam; // cpParam =pointer to 第一个序列参数,cpParam = 取用第一个序列参数的第i 个值
& E0 p$ e; c! j! I0 |constfloat* cpParam3 =pData->m_pCalcParam[2].m_pfParam; // cpParam =pointer to 第一个序列参数,cpParam = 取用第一个序列参数的第i 个值//parameters must be <= 4* |/ I" f0 X4 Y5 Z7 w+ J; R8 \
//const float* cpParam4 =pData->m_pCalcParam[3].m_pfParam; //cpParam = pointer to 第一个序列参数,cpParam = 取用第一个序列参数的第i 个值
( n- R* i7 c' D+ A4 }8 f//const float* cpParam5 =pData->m_pCalcParam[4].m_pfParam; //cpParam = pointer to 第一个序列参数,cpParam = 取用第一个序列参数的第i 个值
3 k. |0 q2 _+ q1 d9 h3 m//m_pData = const struct pointer to struct STKDATA , pointer to structSTKDATA ,
) p. a! x8 [: w0 j0 Q8 x1 p, ktouse pData→m_pData[x].m_fClose
! u" {# T4 z4 f3 SpData→m_pData[x]= | 1,2,3 , … , m_nNumParam | time_t m_time;   B5 {6 y5 O3 T. g0 Z0 r
|1,2,3 , … , m_nNumParam | float m_fOime_t
. T0 ^6 W& g: J  ^; }. L|1,2,3 , … , m_nNumParam | float m_fHigh;& v+ a+ a2 ^" R6 V. \( j
.. .
5 ~# |- \& h: T8 B" e" S|1,2,3 , … , m_nNumParam | WORD m_wDecline;3 T& \6 I7 ~- P5 j5 E7 O( y: \, g- T
m_nNumParam= 数据high,close,open,low的长度! e# j# f+ i! I$ U5 U& J$ q9 z# _- I
touse high:5 a, G; Z3 h4 `$ M% U
pData→m_pData[x].m_fHigh
+ r+ Z- x+ Y4 j8 q( X6 ^% |( P! Jcontentof struct STKDATA
% p6 Q: `) z2 _/ y1 f' e( \0 }time_tm_time; //时间,UCT
1 S* i7 G: F& t# }; c$ q) X$ gfloatm_fOpen; //开盘 open( \, F) _6 |" S$ p* ?
floatm_fHigh; //最高 high
+ Z/ i/ K9 b0 l. s4 [floatm_fLow; //最低 low( W8 F: ^0 o( t( `
floatm_fClose; //收盘 close
. M% h& M) x1 C+ n5 h# jfloatm_fVolume; //成交量 Volume5 O" q  m1 P$ y0 _) ?# W
floatm_fAmount; //成交额 amount5 j0 l; k1 B- a
WORDm_wAdvance; //上涨家数 仅大盘有效
8 i# I% ~& O! u+ a! TWORDm_wDecline; //下跌家数 仅大盘有效; c1 u  W) v1 r) `# a& m# t# f
调用传递参数及传回结果! Y* R( s4 `' e( d2 A
调用传递参数/ Q! \7 }: u5 T: W8 A1 `
(pData->m_pfParam1 && //参数1有效Param1exists
+ s9 p: G5 E/ ~; ]  u% q, E8 IpData->m_nParam1Start<0&& //参数1为常数
9 Z2 a5 r6 a% B% F$ G6 [/ k) PpData->m_pfParam2==NULL) //
4 @3 g2 x; l" ]: q" Q& y7 h9 Jlocalprocedure 定义使用变数
2 q, q+ i8 A% Q* N) ronstfloat* pValue = pData→m_pfParam1; //use constant参数1; b' E% p! l4 P5 p
intnFirst = pData->m_nParam1Start; //use 参数1效值起始位% X3 u& _! M6 v& d0 D+ T
floatfParam = *pData->m_pfParam2; //use 参数2
" H$ r' U0 H$ [0 ^; x3 H( uintnPeriod = (int)fParam; 6 E' G7 ?  \! N4 {0 m
传回结果/ {# D  q$ t! a: t8 K4 D
fTotal+= pValue[i-j];# J4 K) \* k3 P" {
pData->m_pResultBuf
! S9 e9 Z. S8 E% S, v//////////////////////////////////////////comment

评分

1

查看全部评分

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

本版积分规则

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

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

Powered by Discuz! X3.2 Licensed

© 2001-2013 Comsenz Inc.

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