阳光飞狐

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

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

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

[复制链接]
跳转到指定楼层
1#
发表于 2019-8-11 16:09:40 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
许多年以前,我曾经在
( v  R" O& `. U( [: k; K6 i理想公式区发布了
# h- D. Y7 ?! A1 L) s"
7 d" \) C& K3 q0 Q如何用 Foxtrader(飞狐)连结 C++动态程式库 DLL及 80x86Macro Assembly (组合语言)7 f  u* V' ?2 V' O8 A
"
; Y$ t5 r9 \3 \4 }/ X$ e4 u( ~( ?
现在更新foxtrader(飞狐交易师)
3 X! ]: v7 x/ S  f, U
连结 DLL的方法' L! p0 v8 H. R. z* u+ Z5 H: J
5 W5 {5 j6 `( a
foxtrader- - > DLL (C++ and assembly) = ( foxfunc.h + foxfunc.cpp +pow10.asm )9 I  m( j: F4 J9 A$ Z+ O
gauss- - > DLL (C++ and assembly) = ( foxfunc.cpp + meigj.asm )
2 X( l" k2 _3 w# I$ O! {gauss只用到函数参数传递,所以使用新的 c++compiler, 不受影响
8 R6 Y6 w0 Z# Hfoxtrader的 foxfunc.h宣告的结构型态 (struct)在 2004vc++ 6.0 全部有效
! j1 z$ `0 m/ G0 ^, ?0 \
( C, h( b7 h) H7 T也就是这五个结构都能用3 V! ~5 z" }% e  {" U0 a1 ]
typedefstruct tagSTKDATA
/ A  [  H/ Y* D+ K0 G3 y: Ntypedefunion tagSTKDATAEx
- {; w" @' |6 Z$ [7 D: dtypedefstruct tagSPLITDATA 4 x9 u9 l; E# x7 ^- m  G4 J
typedefstruct tagCALCPARAM: Q+ `, `3 u+ E
typedefstruct tagCALCINFO8 B& l* l# E6 I3 s% C- l. f3 W

) F* S6 e2 U9 M  j% _0 `自2008年起,vc++ 2008, vc++ 2010, vc++2017 对struct的编译,已经完全 c++化,不再相容于 C
' {, m% I( C' h( b2 g: Z也就是这五个结构中! ?7 r2 g' W4 [; o( R1 D
typedefstruct tagSTKDATA 0 L. [4 s4 Q8 L7 x% F' ?! X  Y4 a& `) J0 M
typedefunion tagSTKDATAEx
' z1 P+ E6 J' C/ e1 Btypedefstruct tagSPLITDATA
2 ], e" ^3 c  w' p5 Mtypedefstruct tagCALCPARAM
7 Z% v  _! T4 @typedefstruct tagCALCINFO
5 D8 j: }! \/ j3 f7 ]只有这两个可以用  b  a8 N7 I) H$ w- K
typedefstruct tagCALCPARAM
$ |8 y6 l- k# A8 Htypedefstruct tagCALCINFO
3 Y" i( e9 Z( z9 s值得庆幸的是,下面这个结构的函数参数传递个数可以有无数个
; m$ D2 v9 q& k/ H2 x' ytypedefstruct tagCALCPARAM; Y) T* c+ {9 D  a
例如:在 foxtrader中. B0 X$ S6 q$ r  E1 U* Z9 ~
MA1:=MA(CLOSE,3);
( H1 I" `2 [8 q4 g5 uMA2:=MA(CLOSE,6);
; Q- W; H* c4 b5 G5 d1 \% ~MA3:=MA(CLOSE,12);
/ @9 l* X* o/ |, X+ R7 u  B9 RMA4:=MA(CLOSE,24);
6 z0 Z# y6 n2 W( f: bMYBBI1:"MYFUNC2017@MYBBI"(MA1, MA2,MA3,MA4,MA3,MA4,5)*0.95,colorff00ff,linethick3; {2017 vc++ 15.0}
' S" k) C  V' g其中MYFUNC2017=MYFUNC2017.dll, MYBBI = MYFUNC2017.dll 中的MYBBI函数,这里 MYBBI函数传递的参数共有 7个. O1 j) \$ `4 F" F8 [
下面这两式计算结果相同
% g* m' D5 n- G4 Y- Wxx:(MA(CLOSE,3)+MA(CLOSE,6)+MA(CLOSE,12),MA(CLOSE,24),MA(CLOSE,12),),MA(CLOSE,24)/6*0.95,color0000ff,linethick2;{foxtrader 自行计算}
1 E5 C$ v6 z" Y2 g$ p4 D( QMYBBI1:"MYFUNC2017@MYBBI"(MA1, MA2,MA3,MA4,MA3,MA4,6)*0.95,colorff00ff,linethick3; {2017 vc++ 15.0 , dll计算}- C; Y( Y! V! {' U% I* P9 {' Z
其他例子
. y& ^1 v/ e2 J# U6 moooq:="MYFUNC2008good@MYMACLOSE"(c,,c,c,6),colorffffff,linethick5;(---> pow10.asm)( C, o3 U' x' ^2 H3 K
oooq1:"MYFUNC2010@MYMAVAR"(ma(c,5),5),colorgreen,linethick5;
0 W( d- w7 v, w9 Q1 U" G其中pow10.asm里面有很多不同定义或宣告被注解不用,那是因为后来在逐步侦测法修改语码中才发现在foxfunc.cpp主程式中,下面这行错误,也就是新的 compiler不再相容于 C,因此在pow10.asm里面被注解不用的定义或宣告中,有些应该是可以用的: f' }3 W; _8 Q% e$ J
fTotal= pData->m_pData.m_fClose; // @@@@@@@ vc++ 2010 cl.exe 使pData->m_pData[i-j].m_fClose错误
7 `( Z7 V# `/ O$ n9 b
4 U. p$ ]& x* F% s8 C$ x+ ?9 O5 j+ U% _& r8 W
////////////////////////////////////////////////////////foxfunc.h# s+ v' @0 K$ v- M$ }: f
#ifndef__FOXFUNC_H_INCLUDE
- P- Q$ i+ G$ m#define__FOXFUNC_H_INCLUDE
$ M3 B; s1 U% o- x' b+ j( }/*
( @4 P: ]- L2 x8 ^" l( A8 {飞狐交易师“C语言接口”扩展程序调用接口规范V3.0- a1 r# _2 C9 G# h7 M" ~0 s4 Y# i; h
1.本规范适用于飞狐交易师V3.x公式系统.+ |+ u) E4 W4 M* s% {# w  m' P5 k
2.扩展函数用于实现系统函数不能实现的特殊算法.
* O5 A! U9 s% {2 R3.扩展函数用windows32位动态连接库实现,建议使用MicrosoftVisual C++编程.
, Z: w( t: S# b% C9 P4.调用时在公式编辑器中写"动态库名称@函数名称"(参数表)即可,例如下面函数可以写为"FOXFUNC@MYMACLOSE"(5)1 v/ e3 Y9 }7 U4 t# A4 S0 A
5.动态连接库名称和函数名称可以自己定义.
6 t$ g6 n7 }6 v6.使用时必须将动态库拷贝到飞狐交易师安装目录下的FmlDLL子目录下使用./ g) B( ?! \/ H2 k+ {( L
*/
7 ~5 ]. ?# q9 C( ]#ifdef__cplusplus
/ P' K1 r% l5 D+ J# Vextern"C"
- ~" r& s! |, ^( ^5 q{! c0 y" r( g7 @% J" f' U* U- ~
#endif//__cplusplus8 A/ u% q. K5 M  o
///////////////////////////////////////////////////////////////////////////
4 F) O* z1 M- h3 x' q3 B! ^//分析周期
1 H$ o4 w) R& l6 ]enumDATA_TYPE
/ E3 M% i: W& a" L7 n' T{
8 Z1 b  `: ~" m! E4 h2 VTICK_DATA=2,//分笔成交
6 c9 C, f, q" p8 Y' iMIN1_DATA,//1分钟线
% E+ [# T8 O. B; B8 w" aMIN5_DATA,//5分钟线
8 r3 l; R7 h& @6 a. C( tMIN15_DATA,//15分钟线3 u% j$ J8 F6 a" p" j' f; y/ S" a) N
MIN30_DATA,//30分钟线
) q5 j5 O" U7 G! c; xMIN60_DATA,//60分钟线
4 c. j! J# I7 [: h' S3 d+ KDAY_DATA,//日线
! j' \+ A/ e6 rWEEK_DATA,//周线8 U3 S7 N( k0 {( I- M$ d+ o
MONTH_DATA,//月线
- P8 H3 u' C6 c+ K1 g5 PYEAR_DATA,//年线8 [* x; W6 e- m4 R3 M1 X: [" b. x: t
MULTIDAY_DATA,//多日线5 t9 ]3 g  B. N; p" H. X
MULTIMIN_DATA//多分钟线
; V) V" w* S( m9 D: P  }3 I: F};
3 H8 z  O9 I" S; ~1 {! |///////////////////////////////////////////////////////////////////////////0 I- ~/ h% p) J
//定义取用股票基本数据的结构 只有 VC++ 6.0 能compile成功使用
. D3 i+ N6 x% e4 d7 R- c* Otypedefstruct tagSTKDATA 9 a4 n- \! v7 q5 @9 L5 B
{# S8 X& r7 h1 m- L7 W6 d
_tm_; //时间,UCT. y1 U9 j. I& z9 j8 j0 z
floatm_fOpen; //开盘 open
& U9 A; @  Z# y7 g6 cfloatm_fHigh; //最高 high0 p& `$ `. i( r; t
floatm_fLow; //最低 low
2 t% A# m, Y, Lfloatm_fClose; //收盘 close5 x9 D4 v7 i- B; |
floatm_fVolume; //成交量 Volume
5 ]# {  Z$ w% o8 O" f7 a" V# Pfloatm_fAmount; //成交额 amount
. a6 ^- v6 ~& w  ?WORDm_wAdvance; //上涨家数 仅大盘有效$ r3 [- b; w3 E7 ]7 K# k8 Y- J
WORDm_wDecline; //下跌家数 仅大盘有效
2 X! |! u; H  I+ O}STKDATA;
& j' k  e4 K$ q+ ?+ ^% ~8 M定义STKDATA为 tagSTKDATA的简单别名,STKDATA
! ], [$ m0 ?% w& d为真正方便使用名称,tagSTKDATA 为定目的的过水名称) i+ ~' P% U% T+ w& M, L
////////////////////////////////////////////////////////////////////////////
4 J& P% S1 P! B4 P: h4 {//扩展数据,用于定义取用分笔成交数据的买卖盘 的结构
- f2 ~! F0 k7 Y# {" ~5 x* z9 D! f# Q* Atypedefunion tagSTKDATAEx
1 q; c6 m- _/ b" W) v4 F! {1 G{9 V- x) D/ D2 @/ l: h
struct
' S3 v' ^. X; G* @3 k  z{1 k+ l  f/ P1 _0 c8 k- |9 M
floatm_fBuyPrice[3]; //买1--买3价floatm_fOpen; //开盘 open
2 Z0 Y$ M" j2 X% mfloatm_fHigh; //最高 high
/ |2 H! j. P0 X8 T+ \floatm_fLow; //最低 low0 Q& F( {0 u  j3 D
floatm_fClose; //收盘 close
+ f: f3 `" y% b! b' Z/ C" o7 o) Nfloatm_fVolume; //成交量 Volume
9 i8 k2 A4 |" i; J3 dfloatm_fAmount; //成交额 amount
6 [3 s/ y. _" ~& @' I' wfloatm_fBuyVol[3]; //买1--买3量# Q" r& j" D7 e5 k; o
floatm_fSellPrice[3]; //卖1--卖3价9 e  L, ?* e. a7 ?+ R7 R. J
floatm_fSellVol[3]; //卖1--卖3量
4 q% X1 m% `/ ?};
* y- q* n  G$ J) n# u* S( _. V; qfloatm_fDataEx[12];
8 h: G& o  E- Q) p* c3 ^/ j}STKDATAEx;  M, t0 D3 y# a% L
////////////////////////////////////////////////////////////////////////////* ^  h% M& ~2 e; G
//定义取用除权数据的结构2 V  k' C  B! @5 L5 W" w
typedefstruct tagSPLITDATA 6 n% C" Q5 v6 L1 g0 c, K
{
% [7 f( j( ^; k& D# Y7 vtime_tm_time; //时间,UCT& G0 F  r3 ?; @' _6 j$ g
floatm_fHg; //红股" I2 |0 E9 B* O/ g+ j
floatm_fPg; //配股
: n6 f- g& k( nfloatm_fPgj; //配股价, J+ Z. E5 \8 H3 S! {* y+ u
floatm_fHl; //红利
4 Y* S9 k; h2 N9 U( }}SPLITDATA;5 B% w% h3 @" F8 q" k: {( s
/////////////////////////////////////////////////////////////////////////////
4 u& |# B: H. {7 `1 h. v: Y9 l1 i/*财务数据顺序(m_pfFinData内容)' m6 Y& Y, f1 s# f7 E* S
序号内容4 r) T; d% A5 f7 B8 b
0总股本(万股),$ u9 f: d; s/ Z% p; q
1国家股,
9 y& p8 ?" }3 z" G* M* P2发起人法人股,
% O+ N9 c# O0 h. n4 v+ u- X3法人股,- Y, N5 Z; g. Z$ D+ z) r
4B股,/ b& f6 I. P: ^1 Q1 S2 `2 _
5H股,
! `! r" m0 R6 q& l3 Y" b6流通A股,9 g* ?! ?8 i2 e, w& W7 ?+ N' K$ {6 x
7职工股,
; j7 P) m5 j. T" ^8A2转配股,. z1 Z! n' _& \6 A; O
9总资产(千元),
- I, \5 |* u' c% r: a. n10流动资产,
- y( |8 `9 S( O. n5 R. A* S6 J11固定资产,7 j1 ^8 @+ J- X& U3 j. X: D0 _4 D: v  U3 Q
12无形资产,& E% e+ P0 o7 V( N! S- v
13长期投资,. w/ E' _( O) ]* e# B7 l. c& [
14流动负债,
9 t( U; \2 z4 y4 s+ c15长期负债,1 z- S, L( p* p! u  v3 X
16资本公积金,
% r: |6 i( z8 X7 N9 y: t; B5 m' b! U17每股公积金,
* I. ?2 A  K0 O18股东权益,
3 m. ~- j& ^) `1 O! B0 P19主营收入,
: e$ E3 I& Q* X, T- U20主营利润,
% J0 O1 R' t. |& m% t/ `21其他利润,
+ O  U! q+ X7 g+ t' ^22营业利润,
9 o# J6 c! X3 n! C3 W/ p23投资收益,  B* I" x2 _1 y* t" `
24补贴收入,
, c* S  B. L8 y! Q' ~2 [$ p/ D25营业外收支,
* l! l0 R/ |1 y7 i+ M26上年损益调整,
  i1 ~9 w; V: @/ t( ^- W3 a- z2 P27利润总额,1 X, |/ e6 _8 H) j5 s2 r
28税后利润," s0 I3 K1 @( }8 d" q0 j- w% G9 \0 ^
29净利润,! ~; d2 z  ~7 ^5 S
30未分配利润,
, Y4 r( b5 R1 v1 V31每股未分配,
* Z- O% V) Z! u0 D3 a32每股收益,! R$ c& h  \& s
33每股净资产,
# e6 Q% T8 f4 I2 ~0 Z' b  i34调整每股净资,
% K! j1 h5 {+ {6 t% I4 X9 `35股东权益比,
+ q0 {. P4 t4 \0 Z, |36净资收益率% {" m! k  V( j  F- S2 C5 y
*/" B5 V+ q4 ^4 T9 a
/////////////////////////////////////////////////////////////# O6 V5 {' K0 X9 a3 o
//定义取用caller函数传递参数项 的结构" @3 o2 m) @) N6 O
typedefstruct tagCALCPARAM3 m  U% K3 V; r
{
. v7 u. X' b) Kunion( o* A7 N2 T2 O  d. a. f2 a% b
{
) h6 \" g$ W7 i0 \. h) n6 o# L6 pconstfloat* m_pfParam; //指向序列参数的址标,指向一个浮点型数组pointertofloat variable parameter / ex. c,h,l,o, co2...co2=(c+o)/2
9 a, @' v0 F% V1 b8 [6 i3 Aconstfloat m_fParam; //数值参数 valueof parameter
# C- K1 w0 _4 j+ y1 \};5 i7 u  |# L, y
constint m_nParamStart; //序列参数有效起始位置thestart address of variable parameter / ex. c,h,l,o,co2.....( K, r" S+ U) x3 s8 N- @
}CALCPARAM;- T9 z+ f! u3 B$ Q$ V
/////////////////////////////////////////////////////////////////////////////
& L6 d" c  |" q6 t" d8 x: u5 @8 q//定义全部取用址标 的总结构 (各指标指向前述各结构以便取的各结构的数据,接口信息数据的结构 )
9 o2 K4 \2 p, L9 Btypedefstruct tagCALCINFO+ T+ g, e" J7 L+ i3 n" U5 i& L: m# X5 b
{6 F8 ?) u/ _3 O; M$ V$ l
constDWORD m_dwSize; //结构大小
* n9 }7 E2 R# b) t, |/ \3 xconstDWORD m_dwVersion; //调用软件版本(V2.10: 0x210)2 J  S7 e4 q2 x0 f7 Y) `
constDWORD m_dwSerial; //调用软件序列号1 z3 f6 ^4 @+ N7 u/ {$ O. _% Q
constchar* m_strStkLabel; //股票代码' ?: g  W+ R/ P* i9 ]) l3 l
constBOOL m_bIndex; //大盘
+ o9 O$ N5 X, @; p" h+ T& Rconstint m_nNumData; //数据数量(pData,pDataEx,pResultBuf数据数量)数据长度- J: T# g3 @0 v/ E' j1 w
constSTKDATA* m_pData; //常规数据,注意:当m_nNumData==0时可能为NULL6 W7 v$ i% ~' W; \/ y
constSTKDATAEx* m_pDataEx; //扩展数据,分笔成交买卖盘,注意:可能为NULL5 V- L( v  T2 h( u5 Y
constint m_nParam1Start; //参数1有效起始位置<0/ constant parameter >0 /variable parameter 2 U3 u! L6 a2 ^. ^, ]$ f; b
constfloat* m_pfParam1; //调用参数1/pointer to variable parameter 1 : }; P3 {1 `! l! O' Y: g
constfloat* m_pfParam2; //调用参数2/pointer to variable parameter 22 n! l: g, V( K7 v
constfloat* m_pfParam3; //调用参数3/pointer to variable parameter 3
5 ?3 N6 f' v% b2 |4 l' i- v# hconstfloat* m_pfParam4; //调用参数4/pointer to variable parameter 4
9 O' T* G! K8 I$ Z; F  mfloat*m_pResultBuf; //结果缓冲区
2 }/ H; u3 o4 z5 K' a2 Z' XconstDWORD m_dataType; //数据类型' v2 l% x% }! q- g$ \. O, |) ^
constfloat* m_pfFinData; //财务数据- ?2 f% S# N* h  f7 `4 g( Z% Q
//以上与分析家兼容,所以沿用其结构和名称
2 s8 Y" C9 F' u9 S) {: x  q* B//以下为飞狐交易师扩展(fortagSTKDATAEx)
( M2 m! P+ ]/ L% ]; }- VconstDWORD m_dwReserved; // 保留% U: @2 z4 \4 A4 N/ ~
constint m_nNumParam; // 调用参数数量
" ?* Q8 p5 a! k  M+ x) rconstCALCPARAM* m_pCalcParam; // 调用参数数组
& v7 Z  Y5 Z& z# i: V4 _; EconstDWORD m_dwReservedEx[4]; // 保留
9 ^8 g0 _1 s5 D# \! S- L8 ~char*m_strStkName; //股票名称
0 w2 W( W# k5 N6 rSPLITDATA*m_pSplitData; //除权数据" U; ^5 m( W/ A( _; `) W3 J
intm_nNumSplitData; //除权次数5 k7 p6 k5 ?3 w
}CALCINFO;
* A3 [& t% \9 F) C# |& f: a# u  {/*
, b, d& A: y' D% h注1:(与分析家兼容)0 ?$ e+ j. {- e( O
1.函数调用参数由m_pfParam1--m_pfParam4带入,若为NULL则表示该参数无效.9 E( V2 V  X( ^3 [, x/ N
2.当一个参数无效时,则其后的所有参数均无效.
0 [" _2 F4 V0 H如:m_pfParam2为NULL,则m_pfParam3,m_pfParam4一定为NULL.& F7 l9 r( n( }1 c9 N1 t/ Q
3.参数1可以是常数参数或序列数参数,其馀参数只能为常数参数.
: z8 {3 {# F+ d* j* h; A4.若m_nParam1Start<0,则参数1为常数参数,参数等于*m_pfParam1;2 h5 e! P; G' n+ T; i
5.若m_nParam1Start>=0,则参数1为序列数参数,m_pfParam1指向一个浮点型数组,
1 R# d8 k7 g5 J0 c) T8 `数组大小为m_nNumData,数据有效范围为m_nParam1Start至 m_nNumData-1.% t( c9 g' X' M0 J- V! _
在时间上m_pData[x]与 m_pfParam1[x]是一致的
5 ^' j, K5 F( C  U. n6 i4 B# n注2:(飞狐交易师扩展)" p' q' g3 I& ^: \
1.该扩展结构使调用参数在技术上可以是无限数目的,且每个参数都可为数值或序列,由公式中实际的调用参数决定。: l& k: `, ~) K3 b; E& n* ]
2.CALCPARAM结构用于带入参数信息和实际数据,m_pCalcParam数组大小为m_nNumParam,数据有效范围为0 至m_nNumParam-1.  O/ T$ j) N1 W3 g. b
3.按参数的顺序,m_pCalcParam[0]为第一个参数的数据,m_pCalcParam[1]为第二个参数的数据...,为了保持兼容,原m_nParam1Start、m_pfParam1等5个属性依然有赋值。
1 ~/ m( A+ j- \+ h4.若i位置的参数为数值,取用m_pCalcParam.m_fParam.$ n+ E- F/ _  ^
5.若i位置的参数为序列,取用m_pCalcParam.m_pfParam,数组大小为m_nNumData,数据有效范围为m_pCalcParam.m_nParamStart至 m_nNumData-1.若m_pCalcParam.m_nParamStart<0,则此数组中无有效数据。
0 H3 M3 m/ M: O" d  ^& `  G6.由于可以调用多个序列,许多序列的计算可以先在公式中进行,然后作为调用的参数即可。/ _) h. ~& ~: J! t2 a2 N
7.经此扩展,对分析家的DLL依然可以调用、兼容。) M) ~! I+ v- J- Q$ i. A# S0 u
*/
$ Q+ [, f( T8 f' t5 [4 w- j///////////////////////////////////////////////////////////////////////////////////! M5 D( s$ }  k0 S6 L
/*函数输出# g: Y8 O" ~. N8 J
__declspec(dllexport)int xxxxxxxx(CALCINFO* pData);' ~. K3 b( Q7 L. F
1.函数名称需全部大写., G4 ]* m6 G+ H) H( K$ U- L
2.函数必须以上述形式声明,请用实际函数名称替代xxxxxxxx;
4 z! K4 d4 J6 ^3 ^4 U: J对于C++程序还需包括在extern"C" { } 括号中.9 ]) x, ?2 c! T
3.函数计算结果用pData->m_pResultBuf带回.
1 S" C, {4 A1 D, K3 M. o4.函数返回-1表示错误或全部数据无效,否则返回第一个有效值位置,即:1 o- j9 H  E1 H3 T" u" y5 ]
m_pResultBuf[返回值]-- m_pResultBuf[m_nNumData-1]间为有效值./ ~( p, V+ Q2 T3 w0 d4 ]' G& k
5.函数名称长度不能超过15字节,动态连接库文件名不能超过9字节(不包括扩展名),动态库名称不能叫SYSTEM,EXPLORER
) ?" C, {, @5 a4 p8 _, s  N. n*/
1 `+ d0 C, @. g' p2 S. {//示例函数,使用时用实际名称替换
6 D+ d5 j8 F% l# ~! @. X; ~__declspec(dllexport)int WINAPI MYMACLOSE(CALCINFO* pData);5 K1 s8 r& h, @8 e$ P, E2 `
__declspec(dllexport)int WINAPI SMOOTH(CALCINFO* pData);+ h7 ?1 b: @0 P8 J& D; `  x
//__declspec(dllexport) int WINAPI MYMAVAR(CALCINFO* pData);
6 g: o0 q2 ^" R, _1 N( ~__declspec(dllexport)int WINAPI MYBBI(CALCINFO* pData);/ A1 g/ i" Y- `& Y- R
//WINAPI = _stdcall: U* F2 J6 W& ]: X" m
#ifdef__cplusplus
5 h# I( ]" f/ f8 G% H}. [6 _/ c$ z! q1 C3 a/ i
#endif//__cplusplus
# Z9 E- B" h$ b* Z1 T8 B#endif//__FOXFUNC_H_INCLUDE
; [( I8 L' O/ r  G3 N" Q) @, N5 w9 E" k- F: ]% W( y6 S4 K) Y
//////////////////////////////////////////comment 注解
1 X5 }* j& l) d, A6 y1 o6 k__declspec(dllexport)int WINAPI MYMAVAR(CALCINFO* pData)+ ?/ a, U1 P) n6 R' W  T' W, i
pData是指向 址标总结构 CALCINFO的 总址标
" N" Z9 i6 x- Q  f: t1 V取用第二个参数数值floatfParam = *pData→m_pfParam2
2 p, \) m; J* n5 l7 x3 C取用第一个序列参数的址标constfloat* pValue = pData->m_pfParam1;
4 q% f; i/ ?0 E* B6 H& }& M3 R7 T取用股票数据长度intndata = pData→m_nNumData;
; {1 M) Q2 z8 K# o& z) D( n' H9 ~第一个参数存在且为数值pData->m_pfParam1&& pData→m_nParam1Start<0
% t" e6 ~: N" B4 c9 q8 S第一个参数存在且为序列pData->m_pfParam1&& pData→m_nParam1Start>=0
( _1 B1 a9 N' R8 n第一个及第二个参数存在且为序列,第三个参数不存在pData->m_pfParam1&& pData->m_pfParam2 && pData->m_nParam1Start>=0&& pData->m_pfParam3==NULL  S4 m$ ]. N! @" y" K1 W$ `6 M! F- V. h4 V
constfloat* cpParam = pData->m_pfParam1; 定义cpParam为第一个序列参数的址标, Z/ n; \4 c9 {! z# x
取用股票数据结构, z) k) S5 t4 i
pData→m_nNumData= 变数数据长度
! [; L8 E2 `; Q& j, b, p: z6 ]pData→m_pData= pointer to struc STKDATA 的址标; h6 J( R" \0 H  F; z  j& m
pData→m_pData[x]数据结构的第x个数据/ E/ x# x  ~3 H" K4 ]& d/ W
pData→m_pData[x].m_fHigh数据结构的第x个数据中的 High7 @4 ^$ L% Y( q5 d* o5 S, j
取用结果缓冲序列+ l# h1 C) z$ W, b9 ^
pData->m_pResultBuf
: z- f; p) c$ a$ e$ M1 `* z6 a7 [' I取得第一个序列参数的起始序位,如 2,...5 , . 7...1 s& k, y5 I) m- v6 o
intnFirst = pData->m_nParam1Start;
4 e  G# T: V! f% h+ H& L; g2 qfor( i = nFirst+nPeriod-1; i < pData->m_nNumData; i++ ). z- N) h* B9 r! B' \" u
取得第二个数值参数的数值5 B: B! U# o7 T6 U* _- n
floatfParam = *pData->m_pfParam2; 0 t% @$ ~+ e4 C
intnPeriod = (int)fParam;
# X4 \* k6 N, ^7 Z取用第一个序列参数的址标constfloat* pValue = pData→m_pfParam1;
$ A- }: Q$ r& g  s6 {7 k取用序列参数的单个直pValue
7 w+ {% Q+ h% A取用缓冲序列的单个值pData->m_pResultBuf8 I: g, _/ g+ p* S
constCALCPARAM* m_pCalcParam; // 调用参数数组
4 c3 X  n% g/ p$ _m_pCalcParam为序列址标,指向各序列参数的指标
5 ^0 \3 Y5 i! @* i第一个序列参数pData→m_pCalcParam[0]$ L7 A: P2 W: ^* p, k" {
constfloat* m_pfParam; //指向序列参数的址标9 `1 p+ x6 s9 l' E
第一个序列参数的起始序位pData->m_pCalcParam[0].m_nParamStart' [3 d: s, s( P; \6 M2 P
第一个序列参数的址标constfloat* pValue1 = pData→m_pCalcParam[0].m_pfParam;
' l- A5 C- ]1 l; _. s+ ~7 G; n取用第一个序列参数的单个直pValue14 P! R; s0 f' \* L& a
第二个序列参数pData→m_pCalcParam[1]3 p/ j9 u5 i+ h- w4 u
第二个序列参数的起始序位pData->m_pCalcParam[1].m_nParamStart# O" y+ o: P* x( U1 i  H! k
第二个序列参数的址标constfloat* pValue1 = pData→m_pCalcParam[1].m_pfParam;
' M7 f2 I, y+ \$ P0 W/ g7 o取用第二个序列参数的单个直pValue2
* }- X% g; T, a" K# t  H第三个序列参数pData→m_pCalcParam[2]% _( a7 W1 y6 Q% h  @, ^
第三个序列参数的起始序位pData->m_pCalcParam[2].m_nParamStart& |6 G0 F# t# [; s
第三个序列参数的址标constfloat* pValue1 = pData→m_pCalcParam[2].m_pfParam;
4 ?4 W/ W4 _+ |9 A; i0 j取用第三个序列参数的单个直pValue3
$ ?2 x5 ?3 @4 F5 ?, e第四个序列参数pData→m_pCalcParam[3]& n# q  j' y# H
第四个序列参数的起始序位pData->m_pCalcParam[3].m_nParamStart! r6 r" w3 F' ]2 P4 |7 }
第四个序列参数的址标constfloat* pValue1 = pData→m_pCalcParam[3].m_pfParam;
/ f2 V5 c2 |9 X8 e. Z/ T4 B; x取用第四个序列参数的单个直pValue4+ D9 u1 t. j9 o% F/ O( G" d) u
如果有四个序列参数,则取用序位最高的那一个序位: P% m3 z3 `/ S, C3 p3 h
if( pData->m_pCalcParam[0].m_nParamStart >= 0 &&
/ k3 f3 U+ X$ ApData->m_pCalcParam[1].m_nParamStart>= 0 &&
- k7 k3 _, `  A- b  |* W  q8 L# xpData->m_pCalcParam[2].m_nParamStart>= 0 &&* Y8 Z8 {! X- C7 }
pData->m_pCalcParam[3].m_nParamStart>= 0 ) //4个序列都含有效数值. p( K9 u$ Q* J. y3 e6 M6 y4 R; n
{$ a% H5 D3 G7 n9 P, r
//计算返回的序列的第一个有效值位置2 B5 E' Z3 J% ^  v8 f& @
intnFirst = pData->m_pCalcParam[3].m_nParamStart;//已知返回的序列的第一个有效值位置与第4个序列一致
) A  A0 A5 O( e: M" b# A* Q//若不知,则
, f) g3 Z1 q5 g! J% c7 T8 M; I/*6 B; l1 J" K* E! w0 l9 L& U
intnFirst = pData->m_pCalcParam[0].m_nParamStart;
5 E6 r$ Y" e0 ?9 uif( nFirst < pData->m_pCalcParam[1].m_nParamStart )
" _( U$ e. X+ {( |7 |nFirst= pData->m_pCalcParam[1].m_nParamStart;
: a/ ~1 t6 E+ e* ^+ Xif( nFirst < pData->m_pCalcParam[2].m_nParamStart )
6 t1 l& D$ {1 L9 }nFirst= pData->m_pCalcParam[2].m_nParamStart;4 t& f* S3 L6 a& J
if( nFirst < pData->m_pCalcParam[3].m_nParamStart )   d3 u, ^& E# ~" m$ D7 s
nFirst= pData→m_pCalcParam[3].m_nParamStart;$ v4 N1 L8 d: Z+ |8 r! k1 K3 H
constfloat* pValue1 = pData->m_pCalcParam[0].m_pfParam;
# j( L" Q! k. z: v0 X3 y7 ]  Gconstfloat* pValue2 = pData->m_pCalcParam[1].m_pfParam;* q9 _' [" |' ~% C2 x4 a' }7 Q
constfloat* pValue3 = pData->m_pCalcParam[2].m_pfParam;. |' U; f' V: @8 t* l: a. l, l0 D, k
constfloat* pValue4 = pData->m_pCalcParam[3].m_pfParam;$ ~5 `/ v% H0 Z+ e2 X6 j7 d
//-------------------
- K+ J8 o* k2 R# Q  ]) ?floatm_fOpen; //开盘 open
9 r( Y/ \/ ?7 ^5 ufloatm_fHigh; //最高 high
7 F3 ^& c8 m5 F  g$ o5 d1 f5 vfloatm_fLow; //最低 low
. c3 i% d9 s* ~. o3 _9 Vfloatm_fClose; //收盘 close
7 Z# Z1 k+ u- O/ wfloatm_fVolume; //成交量 Volume
; C, R$ A, w) Z- Nfloatm_fAmount; //成交额 amount
2 j2 r7 \; c0 g7 D* S" k8 Q& a调用收盘据3 p) B: {+ b- U( u/ H& @
pData→m_nNumData= 变数数据长度2 K' V! f8 Q4 O/ W! c" N
pData→m_pData= pointer to struc STKDATA1 S! {4 B  p+ H
pData→m_pData[x]第x个数据) A! Y4 \- G$ a8 S& U, i
pData→m_pData[x].m_fHigh第x个数据中的 High
1 F8 P& E% u. {) r5 ^5 \@@@@@@@@@@@important !!!!!!!
4 R6 J# D% l5 H6 P( y2 Q7 Z4 r; wsinceVC++ 2008, cl.exe will make ‘pData→m_pData[i-j].m_fClose’ anerror
9 J$ L* m4 [9 k) t+ u1 u8 _) Tso,pass the high,low,open and close just from the function parameter ,that is use ‘ CALCPARAM’ struct
1 Q6 ~; z2 x0 ^/ P2 k3 A6 bpData->m_pData[i-j].m_fOpen// to use open , there is no way in using a varable for calculationoutside foxtrader
  }; k5 Y% L  i, T' g) ipData→m_pData[i-j].m_fHighto use high; q$ C' x0 l! r. l
pData->m_pData[i-j].m_fLow
) ~: m- N0 M' K" A" K4 D: _pData->m_pData[i-j].m_fClose# I  Z0 z9 P1 g1 `! `% q
m_pData= pointer to struc STKDATA, w& N( [7 r" E. v
incalling C++ dll function8 @+ {2 G/ p" ?$ M! w& K
m_pDatais passed to pData (CALCINFO* pData . A CALCINFO* type pointer): P6 j9 j  F! ?3 k' o
touse a single value in variable ‘High’+ L9 k4 Q/ {6 p# r0 Z
pData→m_pData[i-j].m_fHighto use high
$ ?! A/ r4 C3 y4 N% W( ~" Aconstfloat* m_pfParam1; //调用参数1/pointer to variable parameter 1 - g' I5 R4 [) B6 L8 x' [0 I* c
constfloat* m_pfParam2; //调用参数2/pointer to variable parameter 2
5 ~0 A4 H6 s9 }4 H" ~. p* w8 P. _constfloat* m_pfParam3; //调用参数3/pointer to variable parameter 3
  `* \# @6 h, M9 H* oconstfloat* m_pfParam4;
; Y7 P5 `" I% j3 `m_pfParam1,m_pfParam2, m_pfParam3, m_pfParam4 = pointer to caller function 的参数& e' ?! E) E7 b6 T6 t3 i* u
pData→m_pfParam1= pointer to 第一个(序列)参数
) Z  b! w" j) D+ c2 A7 K5 dpData→m_pfParam1[x]= 取用第一个(序列)参数的第x 个值! l+ k: J! g1 _# ]
constfloat* cpParam = pData→m_pfParam1; =定义 cpParam为 pointerto 第一个(序列)参数" C3 m4 X5 P. S2 F; L
cpParam[x] = 取用第一个(序列)参数的第x 个值
; A9 [! K  p, U* rm_pResultBuf= 结果缓冲列- V, K0 V  e2 U+ I$ ~* P
pData→m_pResultBuf= pointer to 结果缓冲列
9 d$ p* R8 ^# ?: L; t! TpData→m_pResultBuf[x] = 取用结果缓冲列的第 x个值, L& o/ Y& B+ [4 @
//////////////////////////////////////////comment
9 d; l* G7 a* d/ b& K+ X//////////////////////////////////////////comment 注解
( l+ X$ \# j& q8 |$ L1 s& ~constint m_nParam1Start; //统杅1衄虴宎弇离- y( Y  @: S* H' Y) o1 G% F
constfloat* m_pfParam1; //覃蚚统杅1
+ w0 [$ x3 }8 o( B4 C, Yconstfloat* m_pfParam2; //覃蚚统杅2  L5 v3 I' ?0 l3 O
constfloat* m_pfParam3; //覃蚚统杅3
( }6 o4 d. N3 Q7 P8 R0 g3 U. Xconstfloat* m_pfParam4; //覃蚚统杅4,parameters must be <= 47 }) H1 U) y2 q1 v* [
//const float* m_pfParam5; // parameters must be <= 4
8 V. U# O' O! B5 I; O4 S$ F//const float* m_pfParam6; $ A4 j$ v6 _9 j9 C/ R
//const float* m_pfParam7;
, C3 J4 _/ _; k/ O4 m0 r4 v//const float* m_pfParam8;
' [. K7 T4 A- ^1 J; \! I//pData->m_pfParam1 && pData->m_pfParam2 &&pData->m_pfParam3 && pData->m_nParam1Start>=0 &&
3 s1 r  o4 E% o( w3 Q! hpData->m_pCalcParam[0].m_nParamStart>=0&& pData->m_pCalcParam[1].m_nParamStart>=0
. l' H, f7 X4 L% n* a/ w. Q# m&&pData->m_pCalcParam[2].m_nParamStart>=0) 0 H) j3 T; [, A; m* L
{1 ]+ P3 H6 F. B9 G5 p: L+ E
floatfParam = *pData->m_pfParam4; //pointer ,pData->m_pCalcParam[3].m_nParamStart >= 00 o) n$ q! ?% \4 ]# J, M0 k
intnPeriod = (int)fParam; //统杅1$ t: X% R6 T3 Y
//const float* cpParam = pData->m_pfParam2; // cpParam = pointer to第一个序列参数,cpParam = 取用第一个序列参数的第i 个值
3 x2 W$ `5 v, r- lconstfloat* cpParam1 =pData->m_pCalcParam[0].m_pfParam; // cpParam =pointer to 第一个序列参数,cpParam = 取用第一个序列参数的第i 个值
' |4 i/ @! x$ W. I6 B: dconstfloat* cpParam2 =pData->m_pCalcParam[1].m_pfParam; // cpParam =pointer to 第一个序列参数,cpParam = 取用第一个序列参数的第i 个值& q  |8 R$ C# J" I
constfloat* cpParam3 =pData->m_pCalcParam[2].m_pfParam; // cpParam =pointer to 第一个序列参数,cpParam = 取用第一个序列参数的第i 个值//parameters must be <= 45 Z  F" H2 A( V" t9 E. @) H
//const float* cpParam4 =pData->m_pCalcParam[3].m_pfParam; //cpParam = pointer to 第一个序列参数,cpParam = 取用第一个序列参数的第i 个值  t' m, c3 R+ V  `
//const float* cpParam5 =pData->m_pCalcParam[4].m_pfParam; //cpParam = pointer to 第一个序列参数,cpParam = 取用第一个序列参数的第i 个值0 H- D# ^2 d' R6 v' C! H6 V1 T) a" X2 e
//m_pData = const struct pointer to struct STKDATA , pointer to structSTKDATA , # ]" r& U( L7 s" `+ ?5 f1 @
touse pData→m_pData[x].m_fClose/ k3 ~4 U0 x/ s
pData→m_pData[x]= | 1,2,3 , … , m_nNumParam | time_t m_time; 4 a% u& _  o3 @  Z, n. C
|1,2,3 , … , m_nNumParam | float m_fOime_t
3 ], f7 L7 y7 i|1,2,3 , … , m_nNumParam | float m_fHigh;8 L# {9 x( f% E; {8 g
.. ., N2 O. v/ F! h# A9 e
|1,2,3 , … , m_nNumParam | WORD m_wDecline;
) u+ J2 x% O9 V; j3 W0 xm_nNumParam= 数据high,close,open,low的长度
4 m2 D& y% B/ Ktouse high:0 D( R1 M' x  ^7 ~
pData→m_pData[x].m_fHigh( O. y3 J$ b4 s2 Y
contentof struct STKDATA9 h. K4 j" B3 O: Y7 w' C
time_tm_time; //时间,UCT
3 K3 I" k9 p6 ?4 |+ mfloatm_fOpen; //开盘 open
" y0 g; u9 C8 z8 t; Jfloatm_fHigh; //最高 high# ]" u! H% F' O/ {/ ?$ N- T
floatm_fLow; //最低 low
# B2 D" A& b* P; B9 g$ o) Yfloatm_fClose; //收盘 close6 T' a) N: w( k$ p! r
floatm_fVolume; //成交量 Volume8 S3 K3 X. y) J
floatm_fAmount; //成交额 amount( P/ _4 `& n( G. U9 [9 o& E, n
WORDm_wAdvance; //上涨家数 仅大盘有效
% U. Y+ f  e4 M8 f" [+ T- oWORDm_wDecline; //下跌家数 仅大盘有效# D6 C8 p: [& f: a# c
调用传递参数及传回结果
4 o! C! [* @& q0 |( w: t9 {, O调用传递参数
5 @, h0 U% Q! @7 O4 y- N(pData->m_pfParam1 && //参数1有效Param1exists- \* \# Y1 e1 a
pData->m_nParam1Start<0&& //参数1为常数- k& |; y0 b2 y* O3 h- |
pData->m_pfParam2==NULL) //& ~- E. c  k5 A) G0 _
localprocedure 定义使用变数1 C& r* P9 c$ X5 C+ G4 B8 e/ O
onstfloat* pValue = pData→m_pfParam1; //use constant参数1( U% R# a3 u  v
intnFirst = pData->m_nParam1Start; //use 参数1效值起始位" b! e! h* Z0 D9 f1 B
floatfParam = *pData->m_pfParam2; //use 参数2
4 Y: G6 m4 f/ IintnPeriod = (int)fParam; 9 F2 Y6 Q, n. y: e+ ]6 _5 l- R
传回结果' ?( d- D4 g, L
fTotal+= pValue[i-j];# r% f5 o" A2 q
pData->m_pResultBuf7 q8 R- {1 l( U- d
//////////////////////////////////////////comment

评分

1

查看全部评分

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

本版积分规则

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

GMT+8, 2026-10-19 20:42 , Processed in 0.145685 second(s), 19 queries .

Powered by Discuz! X3.2 Licensed

© 2001-2013 Comsenz Inc.

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