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

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

作者: ycng    时间: 2019-8-11 16:09
标题: 飞狐交易师 (foxtrader) 连结 DLL 的方法
许多年以前,我曾经在
8 Z6 r. e- H9 R* x# x9 k' T理想公式区发布了% E; g1 J( g1 h( s+ c. b
"
9 _  f- {& W8 A如何用 Foxtrader(飞狐)连结 C++动态程式库 DLL80x86Macro Assembly (组合语言)' p& P: S8 p! {  \7 @7 ~# ?
"- Z. E' t! U) V2 C
# G1 _7 E0 Q. O6 t4 O3 {( c: d
现在更新foxtrader(飞狐交易师)
) p/ Z6 I; {# O$ }3 N
连结 DLL的方法
) Y; H' x) S: l1 p* p6 [2 g8 y5 B6 _% h% U+ }1 T/ O/ L
foxtrader- - > DLL (C++ and assembly) = ( foxfunc.h + foxfunc.cpp +pow10.asm )6 \% }0 z5 c2 S1 u& i' k5 O# c* t' H" j
gauss- - > DLL (C++ and assembly) = ( foxfunc.cpp + meigj.asm )
4 A0 U/ d0 B: A, ggauss只用到函数参数传递,所以使用新的 c++compiler, 不受影响
. l  i1 b. J' t' b1 ?8 Afoxtraderfoxfunc.h宣告的结构型态 (struct)2004vc++ 6.0 全部有效& E6 ~, Q! B3 [( u6 g* ^2 g
/ d# B. ^/ a4 t) t& I' r6 t* ^, ]
也就是这五个结构都能用, J. A1 b+ x4 G; \& ?
typedefstruct tagSTKDATA
2 B0 |+ E- E; a: g# c" {( i3 D" U  [typedefunion tagSTKDATAEx3 O1 W+ H( x9 b- `
typedefstruct tagSPLITDATA
  i' }6 P) X: K9 E) V7 a, B% vtypedefstruct tagCALCPARAM
' h- ]& Y, N5 V7 ?4 `7 p; g. Etypedefstruct tagCALCINFO/ F# b7 J# u: U

; l+ P: F1 d% P* @1 [2008年起,vc++ 2008, vc++ 2010, vc++2017 struct的编译,已经完全 c++,不再相容于 C. d5 |- ?3 g& R, j# D. _
也就是这五个结构中
2 S) ?% Q) k7 R0 Z/ c" Etypedefstruct tagSTKDATA , z7 P: z* d9 I
typedefunion tagSTKDATAEx# ?  Z4 C# l1 h( e# l7 `* X" \( o4 r
typedefstruct tagSPLITDATA % Q8 ?& {* {' C$ Z
typedefstruct tagCALCPARAM
  N& N+ A3 i8 `$ ~! x7 ?, F- z1 Ktypedefstruct tagCALCINFO
% _) w- y( q' Y! Z. P只有这两个可以用
1 e4 Z7 E0 o" Q  y' m3 v( Stypedefstruct tagCALCPARAM
# b+ Y( m% M* ^$ ?/ p7 ~typedefstruct tagCALCINFO6 ~/ {+ X# Q0 z3 d9 m
值得庆幸的是,下面这个结构的函数参数传递个数可以有无数个
# B' x! E* j# a# W4 e$ U! a5 otypedefstruct tagCALCPARAM
9 {9 {* ^1 I) h& M, _* p. e例如:foxtrader: P- s3 a2 U! ^% T" t9 T
MA1:=MA(CLOSE,3);0 g7 Z5 h# S- T# v: z
MA2:=MA(CLOSE,6);
2 m6 |7 `0 S$ L3 x7 \MA3:=MA(CLOSE,12);2 Q' \1 f; Z9 r  Z5 _0 F
MA4:=MA(CLOSE,24);+ L/ c2 _) l* |. k" _
MYBBI1:"MYFUNC2017@MYBBI"(MA1, MA2,MA3,MA4,MA3,MA4,5)*0.95,colorff00ff,linethick3; {2017 vc++ 15.0}
$ f3 @8 }% @. t$ m" B$ t: S5 o1 {其中MYFUNC2017=MYFUNC2017.dll, MYBBI = MYFUNC2017.dll 中的MYBBI函数,这里 MYBBI函数传递的参数共有 7  K3 S8 R/ @! ^3 p
下面这两式计算结果相同
3 w3 t2 \+ J% E5 k" pxx:(MA(CLOSE,3)+MA(CLOSE,6)+MA(CLOSE,12),MA(CLOSE,24),MA(CLOSE,12),),MA(CLOSE,24)/6*0.95,color0000ff,linethick2;{foxtrader 自行计算}
8 }9 s' P2 n1 VMYBBI1:"MYFUNC2017@MYBBI"(MA1, MA2,MA3,MA4,MA3,MA4,6)*0.95,colorff00ff,linethick3; {2017 vc++ 15.0 , dll计算}* m" Q1 p( n) q# K: m; v
其他例子( @& Q" u$ H" a  @
oooq:="MYFUNC2008good@MYMACLOSE"(c,,c,c,6),colorffffff,linethick5;(---> pow10.asm)& z+ e' c; w7 ~7 J
oooq1:"MYFUNC2010@MYMAVAR"(ma(c,5),5),colorgreen,linethick5;
# b* p) {: C1 ^1 ^其中pow10.asm里面有很多不同定义或宣告被注解不用,那是因为后来在逐步侦测法修改语码中才发现在foxfunc.cpp主程式中,下面这行错误,也就是新的 compiler不再相容于 C,因此在pow10.asm里面被注解不用的定义或宣告中,有些应该是可以用的, N2 D$ N3 r' H  b+ P* {
fTotal= pData->m_pData.m_fClose; // @@@@@@@ vc++ 2010 cl.exe 使pData->m_pData[i-j].m_fClose错误. s5 K- ]. }  x4 m
3 R6 E" x- h. g9 r; u5 K% F

0 N. c5 r( g. L( P& \6 v////////////////////////////////////////////////////////foxfunc.h
' p3 `. f2 h: ]! w* F3 F: l* o#ifndef__FOXFUNC_H_INCLUDE2 a( z; w1 N- \! ]
#define__FOXFUNC_H_INCLUDE( }0 ^) ?$ v# ^: d* G! J+ @& }/ l
/*- u0 s2 Q! `8 \3 b8 ~- G8 P. T
飞狐交易师“C语言接口”扩展程序调用接口规范V3.0+ ~7 B  E* [# ~( @  e* |1 ?; E7 ?8 a9 y
1.本规范适用于飞狐交易师V3.x公式系统.+ g) c8 S$ Y. Q' {/ ^9 S
2.扩展函数用于实现系统函数不能实现的特殊算法.% d' V( F' ?8 R
3.扩展函数用windows32位动态连接库实现,建议使用MicrosoftVisual C++编程.2 C2 R  X' k; t
4.调用时在公式编辑器中写"动态库名称@函数名称"(参数表)即可,例如下面函数可以写为"FOXFUNC@MYMACLOSE"(5)
. g2 ~4 l* ~, U5.动态连接库名称和函数名称可以自己定义.9 ^8 O! _5 k. v& W9 p0 O
6.使用时必须将动态库拷贝到飞狐交易师安装目录下的FmlDLL子目录下使用.# M1 R1 e! x) D6 L; Z! Y9 u+ f
*/  ]7 I- x" L6 t2 Z! D/ u" h: r
#ifdef__cplusplus
) N9 v2 i$ e9 q3 a' |  ~+ i8 w0 `extern"C") s2 _9 L3 |/ q$ N% I* Z
{" L' ^( D: J6 J; P- v
#endif//__cplusplus
4 T$ z( J* p% l# M% P5 a///////////////////////////////////////////////////////////////////////////
8 h6 g( Y, X* [* k//分析周期
  t- B$ x. |- F, H% r0 }6 AenumDATA_TYPE
" i% k1 A" h9 I+ e{
1 r/ B6 k) X9 I+ w  y. RTICK_DATA=2,//分笔成交
2 Y/ }3 S( n1 b" H" HMIN1_DATA,//1分钟线
# ^+ q4 P) i: n5 Y: MMIN5_DATA,//5分钟线 & h6 H, ~* O# I4 D2 ~5 v& X
MIN15_DATA,//15分钟线* ~, n1 U1 F' }% O# |& F! @
MIN30_DATA,//30分钟线
4 a" @( n# ]" \MIN60_DATA,//60分钟线- x4 S9 c- G3 b/ d8 i
DAY_DATA,//日线
* o' U# `. o+ \WEEK_DATA,//周线
  v) f9 H3 c9 {; R( `  |MONTH_DATA,//月线1 E/ n! O* i$ |
YEAR_DATA,//年线
8 [% O6 I2 b# |- j. ^$ MMULTIDAY_DATA,//多日线2 @2 X, U6 E) Y5 ^) s5 `
MULTIMIN_DATA//多分钟线5 y, H1 F) z$ m* \
};# q7 b1 d5 A( o. V4 q, H0 W$ K
///////////////////////////////////////////////////////////////////////////
1 O7 \2 V- U! z, j. {//定义取用股票基本数据的结构 只有 VC++ 6.0 compile成功使用: H- g% H9 Y; r3 e( U' c2 e
typedefstruct tagSTKDATA
5 y+ A7 c: i- @8 J3 T{; [* Q, b- T7 \/ ?5 b1 [
_tm_; //时间,UCT
  X7 ]! B* d, B, v6 k+ d- Yfloatm_fOpen; //开盘 open8 p( M2 Q: V8 f% K+ R
floatm_fHigh; //最高 high
" X" F- J: f7 j, ^floatm_fLow; //最低 low
( q' C. K! D, P5 s2 v5 l& R# ffloatm_fClose; //收盘 close7 L1 o. n- F8 {' u7 o8 O6 ^0 d
floatm_fVolume; //成交量 Volume6 V: s. u- g% J. [6 m0 D( T
floatm_fAmount; //成交额 amount' \9 m% `- I+ u# m& q
WORDm_wAdvance; //上涨家数 仅大盘有效
  r, y6 m- u2 H8 kWORDm_wDecline; //下跌家数 仅大盘有效' G+ E( x) ?. h7 i3 o7 G% T
}STKDATA;$ X) s) X& ~$ v- n0 l8 s' ^+ x% P
定义STKDATAtagSTKDATA的简单别名,STKDATA , z! `! M3 Y) l' s, w
为真正方便使用名称,tagSTKDATA 为定目的的过水名称
4 P* {0 U+ b  h- f6 `( ?////////////////////////////////////////////////////////////////////////////
$ Y# e- Q; p: f  k  [//扩展数据,用于定义取用分笔成交数据的买卖盘 的结构5 t3 l1 m1 r# [! G/ P  [5 u
typedefunion tagSTKDATAEx$ `. |1 x. w1 J/ \. f  p' a
{4 C+ U- n2 ~! y; m  r+ P
struct
; L$ w% ]( K4 _* q- a, Y{& O5 r- a4 T0 D4 O0 z! C
floatm_fBuyPrice[3]; //1--3floatm_fOpen; //开盘 open
' O& ~! S1 q' O3 ifloatm_fHigh; //最高 high& L! C) A6 |, T" I" D/ ^( Z
floatm_fLow; //最低 low7 L1 V6 A& m0 K0 Q3 V5 M; N4 a& e7 I
floatm_fClose; //收盘 close
; C) Y. U4 X7 T* A2 rfloatm_fVolume; //成交量 Volume
) f/ E; r3 T1 cfloatm_fAmount; //成交额 amount, n$ n8 @) f1 ?( P5 D
floatm_fBuyVol[3]; //1--34 Z  d! V/ W/ b# B# n6 S
floatm_fSellPrice[3]; //1--3) r  i/ {1 {4 _4 D9 _8 [3 _$ A4 j; m
floatm_fSellVol[3]; //1--3% P) d1 Y% V. C5 ~
};* m1 g" \7 x$ B: n
floatm_fDataEx[12];
+ a% r# ?+ M# p# h}STKDATAEx;  r+ S- Z& Q( q! v( p" a! v2 T' J
////////////////////////////////////////////////////////////////////////////6 x0 k7 B0 ?! m& S5 P
//定义取用除权数据的结构
( _2 }7 a: H5 W. {$ Rtypedefstruct tagSPLITDATA
& _) `0 \- a' K, E* p& H: C{- ~$ v! |* a# J) S0 `
time_tm_time; //时间,UCT3 j, W2 i3 ?7 b3 G+ o- ]  H0 k
floatm_fHg; //红股
& Y: T9 \9 _9 }8 a) s+ `floatm_fPg; //配股' j! G7 v1 \/ H' N) o
floatm_fPgj; //配股价
2 i* K3 m+ t2 u& ?1 r' a9 ~floatm_fHl; //红利8 L/ l' G1 f1 ]4 ]0 ^
}SPLITDATA;
  l% u+ v# Y; l8 g+ s/////////////////////////////////////////////////////////////////////////////
) d0 t; N/ h# g  a9 |- F5 a/*财务数据顺序(m_pfFinData内容)6 r) _* I9 j6 |( w2 V
序号内容
1 B* O0 g* q. v* N, _3 ^5 x1 i0总股本(万股),9 y. {, r! F1 ~/ A5 A! j4 X
1国家股,- d  h5 \: t, C/ ~6 w7 `$ F
2发起人法人股,
  N  |* L" V3 D6 R4 r3法人股,
/ Q# ^$ n, d8 @+ C4B,3 d7 i! X! x1 e$ u, D8 T5 B3 C: z7 M. V& ?
5H,
/ K5 K# d3 p0 J2 h1 Z/ Z6流通A,% s( o  Q0 p8 g6 P! C; R5 v# p
7职工股,( }# ?& M& W( K& v% v
8A2转配股,
  r  Q2 u) W9 d1 U; y( i8 x5 p9总资产(千元),, Y$ g. m; f( l" t+ L/ V/ h
10流动资产,
! M$ t% v4 D( G% P( _( G11固定资产,7 L/ y! G6 p+ s( H$ U
12无形资产,5 O- C. j- j; P0 X3 a
13长期投资,
9 u$ E$ X0 I0 m* y) c14流动负债,
. n: X+ V6 P7 R8 j15长期负债,& A) L' r4 H4 O, D1 Z
16资本公积金,$ w4 v9 i1 K5 j% \4 h9 C+ u
17每股公积金,
6 Y5 `0 G8 ^( o5 G7 d" g18股东权益,8 r3 W3 W8 \* N$ p/ A$ N0 f
19主营收入,
# B# O, k, e# [( g8 U0 x20主营利润,
1 M# o) ?, o8 p1 |* x21其他利润,# g/ {7 c  S& `1 c: g
22营业利润,
+ T2 O& b$ x8 Q7 f, j( d, _1 P23投资收益,4 n& V/ w2 J: `( G# O
24补贴收入,
3 w  S0 |$ p' I, I0 `0 ^3 Z25营业外收支,
9 y! k& d+ i4 r4 d26上年损益调整,
" o" Y# ~& B& x27利润总额,
0 `' I7 M! J! \7 I+ j, h28税后利润,
8 H" ^3 e( C' r3 j4 v9 L2 m29净利润,
- u5 g' f9 S6 j& |% E30未分配利润,% G8 p; X4 b/ _0 H# Q5 R5 y
31每股未分配,
' o( X( M+ y! P' G5 r) Z0 L8 i32每股收益,2 j( U, L1 s0 @& H) P; j' X
33每股净资产,
4 o3 D9 t2 x0 m6 w34调整每股净资,
9 ]: w# c! p+ _4 i35股东权益比," P, d& P* l$ v9 W+ ~( a, I
36净资收益率
6 J3 L: Z, [: X+ p0 u# u/ X*/: r9 I1 L' p. Y1 P8 R5 x& b& b
/////////////////////////////////////////////////////////////
9 g0 r  e2 M4 W4 F6 z, R. J+ W: y//定义取用caller函数传递参数项 的结构
- ?3 }) l( T# u6 rtypedefstruct tagCALCPARAM
/ r% [/ ^6 B/ F" m{
8 D. W/ G4 q# yunion
2 W+ m9 w% M! }2 `" G{) y/ N  t: P# B. \
constfloat* m_pfParam; //指向序列参数的址标,指向一个浮点型数组pointertofloat variable parameter / ex. c,h,l,o, co2...co2=(c+o)/2
# |7 y1 ^4 W6 ~. `constfloat m_fParam; //数值参数 valueof parameter# L8 ]) z& o/ ~3 v7 |* p' S4 p$ I2 I
};
4 S/ o. {' ?/ g  `, @( iconstint m_nParamStart; //序列参数有效起始位置thestart address of variable parameter / ex. c,h,l,o,co2.....; q: Y$ V" n4 I& i/ D3 p$ Y
}CALCPARAM;, u9 m; w, d# U( E: h
/////////////////////////////////////////////////////////////////////////////
' n2 j- T( F5 W3 l! O$ d# X//定义全部取用址标 的总结构 (各指标指向前述各结构以便取的各结构的数据,接口信息数据的结构 ). X1 N, X- L; _; g: L5 F% R
typedefstruct tagCALCINFO
4 I* q# Z$ q8 ~/ b( e{" Y3 Q5 R7 D! t# |! S3 G
constDWORD m_dwSize; //结构大小6 L% s, ~- M; u! M
constDWORD m_dwVersion; //调用软件版本(V2.10: 0x210)
' |5 X* V5 o7 w/ V& IconstDWORD m_dwSerial; //调用软件序列号. L" U' ~2 v( U8 X6 m5 d
constchar* m_strStkLabel; //股票代码
2 ^8 h% V* K7 M- b: q) u3 RconstBOOL m_bIndex; //大盘
' t  Z# h5 G: h" X1 a# Aconstint m_nNumData; //数据数量(pData,pDataEx,pResultBuf数据数量)数据长度
7 T, m1 X  t# b8 Q+ h7 u; gconstSTKDATA* m_pData; //常规数据,注意:m_nNumData==0时可能为NULL
, v4 D+ R4 }  p6 F2 J+ ~9 W8 cconstSTKDATAEx* m_pDataEx; //扩展数据,分笔成交买卖盘,注意:可能为NULL
  |- u0 S5 ~1 Z' Q/ ?, |% Zconstint m_nParam1Start; //参数1有效起始位置<0/ constant parameter >0 /variable parameter & q  h- |/ Y% Q7 N
constfloat* m_pfParam1; //调用参数1/pointer to variable parameter 1
1 x  [# \, J3 n% X% W% J- N- z, pconstfloat* m_pfParam2; //调用参数2/pointer to variable parameter 24 H6 s0 t; q, b; n
constfloat* m_pfParam3; //调用参数3/pointer to variable parameter 3
6 h' a6 x& W( c* J, ^constfloat* m_pfParam4; //调用参数4/pointer to variable parameter 47 q% _& ]9 U7 h' D# O1 A
float*m_pResultBuf; //结果缓冲区
$ r2 ]. T3 k1 D8 Q& UconstDWORD m_dataType; //数据类型
1 s3 `. ]2 S4 k4 t& P7 O5 Bconstfloat* m_pfFinData; //财务数据+ L' o: S7 K) v& M* ?4 V
//以上与分析家兼容,所以沿用其结构和名称
7 q% }2 k" l( R' s1 b( n% C//以下为飞狐交易师扩展(fortagSTKDATAEx)- H4 Q* O% c5 x' P# F# G7 ~
constDWORD m_dwReserved; // 保留' O( h7 e! z, w. H
constint m_nNumParam; // 调用参数数量5 V" ], M4 N  }4 D! L( o
constCALCPARAM* m_pCalcParam; // 调用参数数组
' H9 E) K0 G( J1 C/ `constDWORD m_dwReservedEx[4]; // 保留
$ H8 L. @' `3 Q2 E5 c& lchar*m_strStkName; //股票名称
5 K6 j" V+ O5 [- w$ {5 o% YSPLITDATA*m_pSplitData; //除权数据
% M$ Y1 y- a& g" ?6 v: V( Cintm_nNumSplitData; //除权次数
2 C; g! P# t. k. G2 |}CALCINFO;$ ~9 r. V. }4 C% w  r% i3 N: S
/*
4 g, m6 I0 m7 U  B. t1:(与分析家兼容)
4 x9 {$ T  S$ _1.函数调用参数由m_pfParam1--m_pfParam4带入,若为NULL则表示该参数无效.7 z. k" x% ^  a8 t' |
2.当一个参数无效时,则其后的所有参数均无效.2 {& B/ x2 |4 l& n
:m_pfParam2NULL,m_pfParam3,m_pfParam4一定为NULL.0 _3 p$ w! w+ L! |
3.参数1可以是常数参数或序列数参数,其馀参数只能为常数参数.
, Y/ K) E: U- }3 p3 u2 F4.m_nParam1Start<0,则参数1为常数参数,参数等于*m_pfParam1;
0 w4 z1 H- i& Z0 g6 w# I1 b5.m_nParam1Start>=0,则参数1为序列数参数,m_pfParam1指向一个浮点型数组,8 w" w, }0 `0 r8 T5 v
数组大小为m_nNumData,数据有效范围为m_nParam1Startm_nNumData-1.
. _1 Z3 _2 ]" ~2 ]- m: N, Q在时间上m_pData[x]m_pfParam1[x]是一致的, p( @7 p! X1 T- a
2:(飞狐交易师扩展)* a' X( v! f1 o' {
1.该扩展结构使调用参数在技术上可以是无限数目的,且每个参数都可为数值或序列,由公式中实际的调用参数决定。6 h) p9 E9 [& p) B
2.CALCPARAM结构用于带入参数信息和实际数据,m_pCalcParam数组大小为m_nNumParam,数据有效范围为0 m_nNumParam-1.
# Z8 T- J' f& D% r3.按参数的顺序,m_pCalcParam[0]为第一个参数的数据,m_pCalcParam[1]为第二个参数的数据...,为了保持兼容,原m_nParam1Startm_pfParam15个属性依然有赋值。
+ a) `) }4 g: x  n0 I' ^. ~, j; ~0 y4.i位置的参数为数值,取用m_pCalcParam.m_fParam.8 Q4 E( n& \( @- s1 i: I. W  A
5.i位置的参数为序列,取用m_pCalcParam.m_pfParam,数组大小为m_nNumData,数据有效范围为m_pCalcParam.m_nParamStartm_nNumData-1.m_pCalcParam.m_nParamStart<0,则此数组中无有效数据。  @7 [4 p7 t- p1 k0 m- a
6.由于可以调用多个序列,许多序列的计算可以先在公式中进行,然后作为调用的参数即可。
) \  [& b  t' f- t( ~( M7.经此扩展,对分析家的DLL依然可以调用、兼容。. A8 I3 q" {! F- t
*/( A, I! n1 k: l/ k
///////////////////////////////////////////////////////////////////////////////////
" L7 b2 V7 Z% v' m+ ~/ f/*函数输出) R* |6 ?& d5 c" [2 ?
__declspec(dllexport)int xxxxxxxx(CALCINFO* pData);) `/ o6 @+ V# M* C$ ^2 C+ m
1.函数名称需全部大写.
9 e% `- h) P+ [0 T9 R+ J8 Z, A2.函数必须以上述形式声明,请用实际函数名称替代xxxxxxxx;, X& y$ y2 O% ?5 W' |
对于C++程序还需包括在extern"C" { } 括号中./ t5 T7 O6 Z, g# l" L
3.函数计算结果用pData->m_pResultBuf带回.8 `8 s- J1 Z+ t& @* V& T
4.函数返回-1表示错误或全部数据无效,否则返回第一个有效值位置,:
8 w" n7 E& w+ w7 Ym_pResultBuf[返回值]-- m_pResultBuf[m_nNumData-1]间为有效值.( c1 f9 _, q. q3 t
5.函数名称长度不能超过15字节,动态连接库文件名不能超过9字节(不包括扩展名),动态库名称不能叫SYSTEM,EXPLORER( i. B6 \% R: K) z9 D' {
*/% Z3 e- z$ }! E- r+ f
//示例函数,使用时用实际名称替换
: Q" v7 g8 V: R__declspec(dllexport)int WINAPI MYMACLOSE(CALCINFO* pData);
' U( w% y9 Q4 p8 w! j: n) H( w__declspec(dllexport)int WINAPI SMOOTH(CALCINFO* pData);
  r9 V0 i2 f- i# Q: H- s( f//__declspec(dllexport) int WINAPI MYMAVAR(CALCINFO* pData);6 z( ]/ T% A( ~7 n3 X1 R
__declspec(dllexport)int WINAPI MYBBI(CALCINFO* pData);1 N( @/ k2 w7 K/ h% z6 }- ]/ Q
//WINAPI = _stdcall
2 \! O6 m# o" I8 h#ifdef__cplusplus7 N* q7 E  x8 y: L/ w, D
}
* v2 f$ i5 o+ v#endif//__cplusplus
" p: x1 M& a' o#endif//__FOXFUNC_H_INCLUDE# C- b* ~2 I0 ~4 R: g

- G" m% l4 ?# t- a& O9 Y5 i//////////////////////////////////////////comment 注解& I2 S. [. p; L) P1 w3 b" \
__declspec(dllexport)int WINAPI MYMAVAR(CALCINFO* pData)& D: ~8 O5 l4 z4 Z0 z" C
pData是指向 址标总结构 CALCINFO的 总址标
/ V6 d0 X4 f) f; z5 \取用第二个参数数值floatfParam = *pData→m_pfParam2 " K* i$ p8 g+ T1 ^( s/ M# ?
取用第一个序列参数的址标constfloat* pValue = pData->m_pfParam1;" {& N+ n6 [6 n+ ?* p
取用股票数据长度intndata = pData→m_nNumData;' x9 h, L* P9 d6 f
第一个参数存在且为数值pData->m_pfParam1&& pData→m_nParam1Start<0
. f0 R; h: A( N! \+ N第一个参数存在且为序列pData->m_pfParam1&& pData→m_nParam1Start>=03 b5 ]$ Q) y. C5 ?
第一个及第二个参数存在且为序列,第三个参数不存在pData->m_pfParam1&& pData->m_pfParam2 && pData->m_nParam1Start>=0&& pData->m_pfParam3==NULL
- y) U# g$ s$ u, i& n( sconstfloat* cpParam = pData->m_pfParam1; 定义cpParam为第一个序列参数的址标& l$ N; N( p. E* o! M, I9 ]- u
取用股票数据结构% {$ y0 T* \' I* h7 ^
pData→m_nNumData= 变数数据长度! B' T  t4 d" J
pData→m_pData= pointer to struc STKDATA 的址标) t$ x! }1 c2 x# I
pData→m_pData[x]数据结构的第x个数据
! q2 @2 Q- `8 H$ {pData→m_pData[x].m_fHigh数据结构的第x个数据中的 High7 I* I$ k5 ]3 d7 _# z- w2 o; I
取用结果缓冲序列
2 r! u. a; \& K# P( M1 L8 JpData->m_pResultBuf) V# v- n" S; t! b
取得第一个序列参数的起始序位,2,...5 , . 7...
6 J, K) d  F, q! ]intnFirst = pData->m_nParam1Start;
# B7 s$ I" ~, Pfor( i = nFirst+nPeriod-1; i < pData->m_nNumData; i++ )1 G/ H3 p% p9 `* o) S4 @+ O  S
取得第二个数值参数的数值
6 e8 x' [+ v3 p6 o, }" B2 b4 P& nfloatfParam = *pData->m_pfParam2; ! V4 Q. s. O! e! y! d# [
intnPeriod = (int)fParam;6 c) U* |% s6 i. ?
取用第一个序列参数的址标constfloat* pValue = pData→m_pfParam1;
, z- ^! `8 b( w+ C4 ?$ @- ~  s取用序列参数的单个直pValue
! w8 Q9 c! k. G( Z$ d+ M0 @取用缓冲序列的单个值pData->m_pResultBuf- j5 ]: i" e' o
constCALCPARAM* m_pCalcParam; // 调用参数数组) B1 j8 b5 ]) ^0 \& O% M" @
m_pCalcParam为序列址标,指向各序列参数的指标
! a% z% S9 _+ j0 m% b第一个序列参数pData→m_pCalcParam[0]' D' y  B& j! m# n
constfloat* m_pfParam; //指向序列参数的址标6 V% N- V( a$ F$ g: v) ~3 F
第一个序列参数的起始序位pData->m_pCalcParam[0].m_nParamStart
8 @! W2 I6 `" y% o  H; ~6 q第一个序列参数的址标constfloat* pValue1 = pData→m_pCalcParam[0].m_pfParam;7 j& \0 ~! N8 }/ r9 F
取用第一个序列参数的单个直pValue1( d! o9 v9 M% q4 i
第二个序列参数pData→m_pCalcParam[1]
6 Y. ?$ j& }7 X+ M( U& P2 V+ A第二个序列参数的起始序位pData->m_pCalcParam[1].m_nParamStart
- B6 t" J. x2 X  w& O' K1 J2 }第二个序列参数的址标constfloat* pValue1 = pData→m_pCalcParam[1].m_pfParam;
# s; X5 J% g7 q: p- N1 D( X取用第二个序列参数的单个直pValue2
5 k# {$ Q) g9 V3 |/ n. J. {: l第三个序列参数pData→m_pCalcParam[2]1 b& h6 W* f2 M  s& g$ s) s' }
第三个序列参数的起始序位pData->m_pCalcParam[2].m_nParamStart
9 C" k. a, u( z  L5 R' i第三个序列参数的址标constfloat* pValue1 = pData→m_pCalcParam[2].m_pfParam;
( S2 a3 Q) l" K2 v  z取用第三个序列参数的单个直pValue3
# C) O3 R( L3 R$ j& I第四个序列参数pData→m_pCalcParam[3]
4 d$ K' L/ H: r- H7 e7 V1 `( _2 _第四个序列参数的起始序位pData->m_pCalcParam[3].m_nParamStart& u7 W+ s" H) E2 G& q5 e
第四个序列参数的址标constfloat* pValue1 = pData→m_pCalcParam[3].m_pfParam;
1 x8 v' o" u! u" ~, K取用第四个序列参数的单个直pValue4
& C/ G/ V. D5 `  ~1 g# z) @) G& R如果有四个序列参数,则取用序位最高的那一个序位4 d1 `1 u* S$ R; u; Y3 T3 p! b
if( pData->m_pCalcParam[0].m_nParamStart >= 0 &&
  e7 Z* u* O6 V; @/ o  @& rpData->m_pCalcParam[1].m_nParamStart>= 0 &&
* k9 [/ @/ e+ NpData->m_pCalcParam[2].m_nParamStart>= 0 &&
: O0 _, q; V5 _1 q2 |! KpData->m_pCalcParam[3].m_nParamStart>= 0 ) //4个序列都含有效数值/ C7 H1 a: [7 [  y# i2 }0 d! m" `
{) S2 v9 R( M( x& A& Q- |' q3 C) X
//计算返回的序列的第一个有效值位置& J& H) B" [! {9 Z4 v( U: Z1 q; z
intnFirst = pData->m_pCalcParam[3].m_nParamStart;//已知返回的序列的第一个有效值位置与第4个序列一致  y8 a6 p+ [% N% Q  W& Y
//若不知,则+ W+ q/ A# ~( h+ z5 r" W
/*
1 }  r% V2 f" z3 K( Q0 S+ F) tintnFirst = pData->m_pCalcParam[0].m_nParamStart;
- h$ [' j4 a. Tif( nFirst < pData->m_pCalcParam[1].m_nParamStart ) 0 a/ C* H" ^# l; v8 N& j& a# n* n
nFirst= pData->m_pCalcParam[1].m_nParamStart;
' X3 a/ M# c- j# J( g5 {if( nFirst < pData->m_pCalcParam[2].m_nParamStart )
% F* o% b9 t2 _8 d, h7 u! q& EnFirst= pData->m_pCalcParam[2].m_nParamStart;
1 T2 {  N2 z1 m& {1 u( K; ~+ Uif( nFirst < pData->m_pCalcParam[3].m_nParamStart ) , o! e4 I. m7 y  w: ~. z3 _, E
nFirst= pData→m_pCalcParam[3].m_nParamStart;/ S7 t9 `2 T7 g: q" z/ ]
constfloat* pValue1 = pData->m_pCalcParam[0].m_pfParam;& J6 r; O. y+ m, B
constfloat* pValue2 = pData->m_pCalcParam[1].m_pfParam;" i5 c* W7 U% ?
constfloat* pValue3 = pData->m_pCalcParam[2].m_pfParam;" }0 Z5 A1 Y' o' u
constfloat* pValue4 = pData->m_pCalcParam[3].m_pfParam;' A: ?) F* a0 T6 E
//-------------------
6 w  n7 M  n3 c  o7 ?8 a. s1 Gfloatm_fOpen; //开盘 open
8 [+ f  ?1 g  k; r8 Yfloatm_fHigh; //最高 high
% `: L% J  E6 ^. Ffloatm_fLow; //最低 low
( g% X& {" z! _2 @/ u# S$ K, ~floatm_fClose; //收盘 close
' k4 l9 u/ d3 F; {" Ifloatm_fVolume; //成交量 Volume
1 {$ u. v4 m/ B/ w+ Afloatm_fAmount; //成交额 amount' H2 e7 H, o4 C3 {8 [" ^" o6 h4 Q; W, }
调用收盘据
8 U6 \8 p& {2 `# B0 @pData→m_nNumData= 变数数据长度
! U; ^: g. g$ {/ u. N  q: Y0 `pData→m_pData= pointer to struc STKDATA7 a" q- s1 E* Z, t  s  V
pData→m_pData[x]x个数据
% z4 w" H' j1 hpData→m_pData[x].m_fHighx个数据中的 High: \( ]( J2 X. h. O8 I2 v
@@@@@@@@@@@important !!!!!!!) h" v* {0 y  C7 U4 {6 W; p
sinceVC++ 2008, cl.exe will make ‘pData→m_pData[i-j].m_fClose’ anerror
1 Z: s" j1 X3 z4 Z  Q0 Q1 ~so,pass the high,low,open and close just from the function parameter ,that is use ‘ CALCPARAM’ struct
! \4 ?3 }  s, G- `$ E4 m" r. e; }pData->m_pData[i-j].m_fOpen// to use open , there is no way in using a varable for calculationoutside foxtrader
% D8 o: i3 l5 g6 F- ~: @4 {' HpData→m_pData[i-j].m_fHighto use high
! c% F$ q& [! R: ^2 e$ {pData->m_pData[i-j].m_fLow
7 x( |9 }: M. ]6 spData->m_pData[i-j].m_fClose
1 }$ e! @# S5 t. ~. cm_pData= pointer to struc STKDATA
5 w, c4 z0 B- E+ D+ g1 mincalling C++ dll function
% z6 K: w. M" N6 e3 }! {m_pDatais passed to pData (CALCINFO* pData . A CALCINFO* type pointer)
6 W! ~& W* ~& P, r9 ~  D' |* Ytouse a single value in variable ‘High’+ J: ]; g" y# {
pData→m_pData[i-j].m_fHighto use high/ l/ R! n, j& u- E% D2 Q
constfloat* m_pfParam1; //调用参数1/pointer to variable parameter 1 " m" n4 d- F: I' G
constfloat* m_pfParam2; //调用参数2/pointer to variable parameter 2' y- A7 \- j6 p% w1 h7 W- v. c& S( m
constfloat* m_pfParam3; //调用参数3/pointer to variable parameter 3. P% W8 u/ r2 W- |, F; V( e# D+ u
constfloat* m_pfParam4; # Z! o8 ~8 D3 R- e& K+ C( ^" n
m_pfParam1,m_pfParam2, m_pfParam3, m_pfParam4 = pointer to caller function 的参数1 a& M- C" p  |* U2 s6 Z- s5 f
pData→m_pfParam1= pointer to 第一个(序列)参数
# W3 u/ O3 [3 H; kpData→m_pfParam1[x]= 取用第一个(序列)参数的第x 个值0 ~1 I1 z" v. M: j0 _$ n! r
constfloat* cpParam = pData→m_pfParam1; =定义 cpParampointerto 第一个(序列)参数
$ O8 h* N" l9 v% TcpParam[x] = 取用第一个(序列)参数的第x 个值
! d  _% B4 A3 Z( i" g: o- @m_pResultBuf= 结果缓冲列+ {" @# p# _9 c4 y/ M( G, b" r. x
pData→m_pResultBuf= pointer to 结果缓冲列
& K4 J) F( M# d, v5 \1 t1 O$ mpData→m_pResultBuf[x] = 取用结果缓冲列的第 x个值
! W- [+ ~4 p1 a& `% ^//////////////////////////////////////////comment$ p8 v+ S( G; e! F# \
//////////////////////////////////////////comment 注解
; m% r' }5 u6 i  }3 I0 D6 T0 s* D8 `9 @constint m_nParam1Start; //统杅1衄虴宎弇离3 p6 l- T0 M' z9 W
constfloat* m_pfParam1; //覃蚚统杅1. n) I. o; H, Q! T+ b2 b8 U
constfloat* m_pfParam2; //覃蚚统杅2
/ j0 R: X# f! G# lconstfloat* m_pfParam3; //覃蚚统杅3. k* N  I# W! ]6 x, K
constfloat* m_pfParam4; //覃蚚统杅4,parameters must be <= 4' @% V1 O$ w4 s& o0 d
//const float* m_pfParam5; // parameters must be <= 49 g; ?- ]. Q6 u) I; c7 H: ?5 Y
//const float* m_pfParam6;
7 z2 K9 s2 a6 a$ A& N3 @//const float* m_pfParam7;
% ^# l; a$ y! M  p/ s/ f//const float* m_pfParam8;
- a5 P% Z/ b6 Y7 u; J4 N' O& G% f//pData->m_pfParam1 && pData->m_pfParam2 &&pData->m_pfParam3 && pData->m_nParam1Start>=0 &&5 B  o$ F$ y- b$ Q4 s" i; ~
pData->m_pCalcParam[0].m_nParamStart>=0&& pData->m_pCalcParam[1].m_nParamStart>=0
& f6 }7 `2 t5 D: M/ n&&pData->m_pCalcParam[2].m_nParamStart>=0) ( Q+ B% `+ X# o6 m* s
{
9 _& X5 o) C3 H2 kfloatfParam = *pData->m_pfParam4; //pointer ,pData->m_pCalcParam[3].m_nParamStart >= 06 u# j* |. N- w& P
intnPeriod = (int)fParam; //统杅1
8 X2 P4 H# O" x! w% T0 {0 x) I//const float* cpParam = pData->m_pfParam2; // cpParam = pointer to第一个序列参数,cpParam = 取用第一个序列参数的第i 个值
- S7 H& c1 ~4 l  {3 kconstfloat* cpParam1 =pData->m_pCalcParam[0].m_pfParam; // cpParam =pointer to 第一个序列参数,cpParam = 取用第一个序列参数的第i 个值
7 k" p: R2 Q% ?+ }# R- O0 Fconstfloat* cpParam2 =pData->m_pCalcParam[1].m_pfParam; // cpParam =pointer to 第一个序列参数,cpParam = 取用第一个序列参数的第i 个值2 x' e; y% s* b  ^, k
constfloat* cpParam3 =pData->m_pCalcParam[2].m_pfParam; // cpParam =pointer to 第一个序列参数,cpParam = 取用第一个序列参数的第i 个值//parameters must be <= 4
7 Q9 Z0 a) b9 z, i8 @3 ~//const float* cpParam4 =pData->m_pCalcParam[3].m_pfParam; //cpParam = pointer to 第一个序列参数,cpParam = 取用第一个序列参数的第i 个值/ H) ^, g! `- u7 B" |: K
//const float* cpParam5 =pData->m_pCalcParam[4].m_pfParam; //cpParam = pointer to 第一个序列参数,cpParam = 取用第一个序列参数的第i 个值
, `# B- ]3 L' a; X//m_pData = const struct pointer to struct STKDATA , pointer to structSTKDATA ,
8 U  \' G6 \4 b' ?touse pData→m_pData[x].m_fClose
: W) V; u# h6 Q1 r* v3 G. w/ ypData→m_pData[x]= | 1,2,3 , … , m_nNumParam | time_t m_time;
3 a  P" G* U# t$ K6 K|1,2,3 , … , m_nNumParam | float m_fOime_t 8 H# \# F" F3 D- E; n) `: C- F
|1,2,3 , … , m_nNumParam | float m_fHigh;% ~2 O5 Q( t, j; B5 V, y; X2 _, V6 l. r
.. .
" \5 b4 z( g* V1 _  F|1,2,3 , … , m_nNumParam | WORD m_wDecline;5 V/ H( y. t8 K" _1 R7 q9 {- j
m_nNumParam= 数据high,close,open,low的长度" ?; L! m8 M' ?) O) E4 s( t$ L
touse high:1 \- Z2 c# i5 e9 g
pData→m_pData[x].m_fHigh
& b3 B5 w2 v$ V' Scontentof struct STKDATA$ \( a# m0 `3 D3 ?& K" c" P
time_tm_time; //时间,UCT) g& {% H4 o, J0 b) U
floatm_fOpen; //开盘 open/ _) i1 \, U( M7 i# \
floatm_fHigh; //最高 high4 F3 ^  }) ~! L( N' ~, G, m. y
floatm_fLow; //最低 low$ p3 i- I1 l9 M; t: H8 Y
floatm_fClose; //收盘 close
" }* b, Y% z7 T3 l) s' Hfloatm_fVolume; //成交量 Volume7 g2 w3 V9 a1 k# _% ?5 I  f: ^1 C
floatm_fAmount; //成交额 amount
- K' U$ T2 [6 o5 LWORDm_wAdvance; //上涨家数 仅大盘有效8 b# M4 x- p* g3 ?7 r1 ^
WORDm_wDecline; //下跌家数 仅大盘有效4 ?* c: f8 T1 h
调用传递参数及传回结果' D5 q; l7 L, T: u% x
调用传递参数$ w, U" `  m3 C, q8 m! V
(pData->m_pfParam1 && //参数1有效Param1exists' O* ^) d+ }* x; q: _/ {0 t
pData->m_nParam1Start<0&& //参数1为常数) q& [0 K' V# Z8 E9 Z, @
pData->m_pfParam2==NULL) //* P- C" o5 ^/ ^" r, _8 m1 x
localprocedure 定义使用变数6 i/ X% E* k7 y  T* S
onstfloat* pValue = pData→m_pfParam1; //use constant参数1
/ d8 e# ^# J: ^7 [+ PintnFirst = pData->m_nParam1Start; //use 参数1效值起始位
5 \5 G' H, O( x9 y3 s; HfloatfParam = *pData->m_pfParam2; //use 参数2$ C4 _$ m! m8 r3 ~* P3 h
intnPeriod = (int)fParam; + S' r+ r4 P5 H+ d: }
传回结果
& q+ m3 w0 w4 |" c$ s0 {) ^; B7 N! D$ ffTotal+= pValue[i-j];
8 S$ Y4 n" v9 {5 O) N9 ApData->m_pResultBuf2 ]0 H3 i  K4 o* ^" L
//////////////////////////////////////////comment




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