阳光飞狐

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

 找回密码
 手机注册

手机动态码快速登录

手机号快速注册登录

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

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

[复制链接]
跳转到指定楼层
1#
发表于 2019-8-11 16:09:40 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
许多年以前,我曾经在
6 X# U4 A2 A* {% U8 x理想公式区发布了2 ~/ v7 B6 }' b9 A% `( Q/ ?' w
"
( G2 Y2 s9 N6 O如何用 Foxtrader(飞狐)连结 C++动态程式库 DLL80x86Macro Assembly (组合语言)0 z' m1 \' z( V! a& ?3 e# p3 f# q
") d3 f+ b% X# ?$ g1 L4 U4 W1 ?) Q" Z  |
. g0 t9 {4 m8 c! E3 L5 K
现在更新foxtrader(飞狐交易师)
) p( y% |& l3 o
连结 DLL的方法
5 x$ I# Y0 R1 o0 a, J  t
$ [" V2 ?% ^" B- }3 \% ?7 sfoxtrader- - > DLL (C++ and assembly) = ( foxfunc.h + foxfunc.cpp +pow10.asm )
0 B; M8 @: [- Z# J. _; a  u- @gauss- - > DLL (C++ and assembly) = ( foxfunc.cpp + meigj.asm )
( N7 n' X, ^% a" Q" ^gauss只用到函数参数传递,所以使用新的 c++compiler, 不受影响: X* k* {# O0 y+ Q5 H& w6 K
foxtraderfoxfunc.h宣告的结构型态 (struct)2004vc++ 6.0 全部有效. N. E5 Y, C8 l( g

, I) Z# v+ F+ r也就是这五个结构都能用
9 n  |8 j; y6 R: Otypedefstruct tagSTKDATA 4 n- Q" q# R9 K- e
typedefunion tagSTKDATAEx
/ J# ]' a8 Q& p& G+ @* K8 C2 ptypedefstruct tagSPLITDATA
3 j" r! s4 W, U7 itypedefstruct tagCALCPARAM
/ a) f9 |$ `9 |2 c4 etypedefstruct tagCALCINFO+ O+ }, H1 q4 B) v7 r, {
5 D0 \; k& d# L& Z9 ^
2008年起,vc++ 2008, vc++ 2010, vc++2017 struct的编译,已经完全 c++,不再相容于 C- a  W2 [5 B7 u( j5 C
也就是这五个结构中
% N, `5 y% ^1 y$ H2 e& Rtypedefstruct tagSTKDATA
& C0 R" \, h8 t- Q* Ctypedefunion tagSTKDATAEx$ z  s! h- P! q* z3 L# N4 x
typedefstruct tagSPLITDATA 4 N+ r6 x% c: ]: M7 J4 H
typedefstruct tagCALCPARAM! W! }2 \& f; K% I/ O' {; M8 g
typedefstruct tagCALCINFO: |, t. j' D/ }9 I) {
只有这两个可以用
. P( W9 \- f/ ^9 H4 atypedefstruct tagCALCPARAM
' r# V5 S$ ^. B, Btypedefstruct tagCALCINFO6 r6 ]7 o4 X- ^# e
值得庆幸的是,下面这个结构的函数参数传递个数可以有无数个
& z5 v1 r" x; T' I# O* ctypedefstruct tagCALCPARAM
0 N, @  S7 z4 R# ?( u例如:foxtrader5 n  g6 r4 J' }5 S; d
MA1:=MA(CLOSE,3);1 Q5 f, j! {, M& M2 B. U6 d7 l8 t
MA2:=MA(CLOSE,6);! l. p6 D9 X9 p6 P' G0 a  C6 A
MA3:=MA(CLOSE,12);
) h! A& d1 p# R3 L# j6 NMA4:=MA(CLOSE,24);6 C5 i/ U$ e# U+ a; M9 Q( o$ y
MYBBI1:"MYFUNC2017@MYBBI"(MA1, MA2,MA3,MA4,MA3,MA4,5)*0.95,colorff00ff,linethick3; {2017 vc++ 15.0}
* I; [* E9 ^  ]2 D3 Y; J) m% F其中MYFUNC2017=MYFUNC2017.dll, MYBBI = MYFUNC2017.dll 中的MYBBI函数,这里 MYBBI函数传递的参数共有 71 |- _  @2 b8 ^) H0 \
下面这两式计算结果相同
8 w! W7 h  C5 s8 v2 ]% @- C4 ]. Axx:(MA(CLOSE,3)+MA(CLOSE,6)+MA(CLOSE,12),MA(CLOSE,24),MA(CLOSE,12),),MA(CLOSE,24)/6*0.95,color0000ff,linethick2;{foxtrader 自行计算}' R4 r5 \; d! n, S, ~
MYBBI1:"MYFUNC2017@MYBBI"(MA1, MA2,MA3,MA4,MA3,MA4,6)*0.95,colorff00ff,linethick3; {2017 vc++ 15.0 , dll计算}
6 {. T5 I4 U, o其他例子6 q0 u/ b9 ^( h- d/ F. v
oooq:="MYFUNC2008good@MYMACLOSE"(c,,c,c,6),colorffffff,linethick5;(---> pow10.asm)
0 r7 U5 v  `$ n1 X5 i8 loooq1:"MYFUNC2010@MYMAVAR"(ma(c,5),5),colorgreen,linethick5;
% G) Z+ c* L: A. r其中pow10.asm里面有很多不同定义或宣告被注解不用,那是因为后来在逐步侦测法修改语码中才发现在foxfunc.cpp主程式中,下面这行错误,也就是新的 compiler不再相容于 C,因此在pow10.asm里面被注解不用的定义或宣告中,有些应该是可以用的: w! |8 \6 ~% K% K
fTotal= pData->m_pData.m_fClose; // @@@@@@@ vc++ 2010 cl.exe 使pData->m_pData[i-j].m_fClose错误; L8 Y3 P. z4 Y, P4 ^* T- K. F6 D# t
0 r6 X& R0 A4 ~; P0 f

& ]1 `7 g" Y; ?3 A1 T////////////////////////////////////////////////////////foxfunc.h
* C% @+ n9 C4 }0 u+ x#ifndef__FOXFUNC_H_INCLUDE
& A+ V  G( n0 b7 N+ A9 H#define__FOXFUNC_H_INCLUDE7 g0 d" {" Y# Z0 m6 t
/*" {, ~' O- A; b  I  I! H
飞狐交易师“C语言接口”扩展程序调用接口规范V3.0+ \8 K# s' l7 x9 b; q( U& {; C
1.本规范适用于飞狐交易师V3.x公式系统.8 j2 j; @3 \7 ~3 {  I  e
2.扩展函数用于实现系统函数不能实现的特殊算法.
& R# Q& }, r2 M, S+ k) a& l3.扩展函数用windows32位动态连接库实现,建议使用MicrosoftVisual C++编程.
, P& U8 S9 z" P4.调用时在公式编辑器中写"动态库名称@函数名称"(参数表)即可,例如下面函数可以写为"FOXFUNC@MYMACLOSE"(5)$ g* R: n% d) o
5.动态连接库名称和函数名称可以自己定义.8 W1 \1 l. }9 G/ `
6.使用时必须将动态库拷贝到飞狐交易师安装目录下的FmlDLL子目录下使用.  ?+ j2 H4 j- U% p" l
*/
" A* p( R9 t# j, d9 i$ d% ~# ^#ifdef__cplusplus
( [1 b  m. D2 a' q0 g8 xextern"C"# b8 R( z4 U, G' n. k' b
{, R- z4 O* G# Z# z+ q
#endif//__cplusplus3 `4 Z  \1 c& J, w
///////////////////////////////////////////////////////////////////////////9 s- `8 R4 ~' R' P* V" R2 e
//分析周期- s$ o  X: P1 ~6 ~7 g' _" J3 l( B
enumDATA_TYPE
1 p& V" o* A  x{+ A3 P/ j! S; a  ~1 n5 Z3 V, z; W  n
TICK_DATA=2,//分笔成交
) E+ r& k4 o- L8 PMIN1_DATA,//1分钟线
' t  F: z$ J/ B$ XMIN5_DATA,//5分钟线
& N5 h0 s; @! B" z7 w, xMIN15_DATA,//15分钟线' z. B2 N' U, C5 K8 H
MIN30_DATA,//30分钟线$ T) L) A) w! d' L3 w
MIN60_DATA,//60分钟线- h$ R5 n! G4 r! ?( d% }1 A
DAY_DATA,//日线$ S: q0 _, X. U8 G( u
WEEK_DATA,//周线
6 x- X) E6 ~/ l  c. r( TMONTH_DATA,//月线! ~: {8 v. }, m2 g6 l4 {7 K
YEAR_DATA,//年线
; ]+ X. X* M) H, I, z3 ?6 ?MULTIDAY_DATA,//多日线3 w9 Q1 Q- m0 H
MULTIMIN_DATA//多分钟线
9 S% X! r* b, e) G8 Y3 v5 d* s- K) t};* ^1 {2 m3 D9 [$ B' X
///////////////////////////////////////////////////////////////////////////: |) b7 n; Y+ L$ \, P; ~' a
//定义取用股票基本数据的结构 只有 VC++ 6.0 compile成功使用
/ s! T, r/ ~3 p7 Z& T/ q7 _( Dtypedefstruct tagSTKDATA
/ _# @0 J. Q* ^0 B{# `& r# }$ b. ]! c3 u0 S
_tm_; //时间,UCT
7 r) j- @2 W; K/ d( ^' u8 R7 wfloatm_fOpen; //开盘 open
5 u1 D) P' @+ Lfloatm_fHigh; //最高 high" b8 a  V8 N/ T" h4 `6 ?
floatm_fLow; //最低 low. y# d5 Q$ {: `8 G% t
floatm_fClose; //收盘 close( U8 F; e+ Q( k5 i/ e( ^: w  p
floatm_fVolume; //成交量 Volume
, J1 j' ?9 j. q7 p! `' sfloatm_fAmount; //成交额 amount
8 u& [7 X! c# u3 p9 vWORDm_wAdvance; //上涨家数 仅大盘有效8 L' J6 {/ K# Z6 A% t
WORDm_wDecline; //下跌家数 仅大盘有效
, n, L8 F& I- `/ X( ?% m5 f, c}STKDATA;
0 X8 |- M7 D$ f! x7 [; Q8 l定义STKDATAtagSTKDATA的简单别名,STKDATA
% ]3 N2 ?( k# a1 O为真正方便使用名称,tagSTKDATA 为定目的的过水名称
. l* J* g; w( A& w7 H; ^8 ]////////////////////////////////////////////////////////////////////////////9 Q" p) _6 p; A$ [* M( E
//扩展数据,用于定义取用分笔成交数据的买卖盘 的结构, c: q+ A5 Y& t4 x9 P
typedefunion tagSTKDATAEx2 z  V4 s8 j1 S! f1 o; i6 q
{
0 m' G! `1 O5 f" k2 k4 Gstruct- Z3 n6 _, b5 ?( j5 L" P% ]# u( [
{
+ r" ^# O8 d) P6 _  N/ l: T7 qfloatm_fBuyPrice[3]; //1--3floatm_fOpen; //开盘 open
( m# J( U( ]  U& M. D) Sfloatm_fHigh; //最高 high
; e* Z# v7 s: F# l9 c! Pfloatm_fLow; //最低 low
! V( b4 A0 l" M# U3 ^: U; Bfloatm_fClose; //收盘 close
) v2 ~! Z3 U. V+ W9 ]floatm_fVolume; //成交量 Volume5 ~, |' x) q' M) f2 J
floatm_fAmount; //成交额 amount
) m' U( W- T0 g- wfloatm_fBuyVol[3]; //1--3- }7 x4 w. R4 \7 A
floatm_fSellPrice[3]; //1--3
) Q) X9 ], Q. \' A6 t* j9 Lfloatm_fSellVol[3]; //1--3+ @  G4 U1 k& p# X" t* K; n  E
};+ K" {5 O3 k: U' [4 t5 h
floatm_fDataEx[12];
; ?$ X: u# K1 p}STKDATAEx;. y/ R4 {2 c: A: ^- X* x. y
////////////////////////////////////////////////////////////////////////////! u3 c% @4 ]5 v' R& P0 r
//定义取用除权数据的结构
7 H+ R% l+ S) k! Y; T$ w2 R) Ftypedefstruct tagSPLITDATA # E6 P# j) Q7 f! I
{
$ y% W5 ]* i4 c7 \2 }+ h6 Ctime_tm_time; //时间,UCT5 |7 L7 j, ?6 n: l4 Q4 g
floatm_fHg; //红股$ k( K( @3 \( V9 I: ]1 I
floatm_fPg; //配股, |9 A: c/ `+ y2 _
floatm_fPgj; //配股价) O7 r; e, G8 {
floatm_fHl; //红利
7 v! P% ]" P9 ^  b}SPLITDATA;. E5 l& |. k: N; q- R  E. c* V) h
/////////////////////////////////////////////////////////////////////////////
6 M( Z' @2 d* Y* I/*财务数据顺序(m_pfFinData内容)$ B( G+ e2 ~% V1 e! u7 }. @
序号内容% S9 s4 ?' k) w# s2 [. J
0总股本(万股),
3 w' J$ a2 @% W  ~1国家股,
- D+ R, [! }& _) G# @2发起人法人股,; J: t% V6 N% {
3法人股,
! O/ P4 }  s' d- j. W4B,' S% b& J9 K- F9 ?
5H,
5 E/ e" J1 b! L2 t) R6 u4 Z6流通A,
7 |( U3 b  G, ?% ?2 d7职工股,5 S8 ^6 ]" n. z8 g9 J$ F
8A2转配股,) F% G* C1 V" E/ z+ u9 k
9总资产(千元),
/ s5 u$ r6 d1 i' J9 c& j9 n- ?+ P( d10流动资产,
: N, K: ^' ]4 B' S! `; W11固定资产,. ]$ L1 \' A: @' r+ h0 y0 |
12无形资产,: t- g  ]6 U% ?5 T  ]+ `1 q
13长期投资,
8 G7 ^' t% @* [6 @. r8 x* C14流动负债,
: D$ K2 G0 w1 A% ?15长期负债,
; a' c+ ?3 u2 X+ ?* F16资本公积金,* X( G4 H! T9 w  P1 p
17每股公积金,
" i/ ^3 H8 E) t/ ]2 `18股东权益,
4 W" j: k' e3 a4 Y3 N2 c+ D5 F! |/ ^19主营收入,2 Q8 L0 h  t& t5 }
20主营利润,
/ d. u. D5 ]1 d4 q21其他利润,
' d0 W! D/ V8 x, G, K" N6 m22营业利润,
, r! b8 k7 R* u: n& D- |$ W23投资收益,% S% w& m) e- \/ I( r
24补贴收入,* s. l& R! s1 g
25营业外收支,3 W6 z' c( \: }9 {6 D7 h5 r
26上年损益调整,1 C4 }; A' l- j' j
27利润总额,
5 j- u9 W! |4 d( c- ^6 ?8 h/ q' ?1 T28税后利润,
% r8 N% t6 J! O: t5 X" Q  \29净利润,
" |8 y/ T  s, S- [' X+ Y& `+ P% B30未分配利润,
# }# g  X8 T. V7 I8 u31每股未分配,
) J& _3 }) k9 E/ p' j, l32每股收益,
% X# o8 T$ ?% j, G; d3 Q) X33每股净资产,
$ c: b9 H) w$ @$ m34调整每股净资,, F) l2 j" B9 s# i3 r' a
35股东权益比,
9 l" E4 U7 ~' T5 d36净资收益率
" ~" Z" ~) e3 Y5 j" R*/
8 V7 G; M, ^0 X9 h1 o/////////////////////////////////////////////////////////////
, ~' J% K; f0 c9 B9 B//定义取用caller函数传递参数项 的结构
  b- U+ F2 P! Mtypedefstruct tagCALCPARAM9 l+ \# l, j! ]' J
{
% g1 h% O' A4 D0 L( lunion
; t1 X& g9 ^( ]8 p. w0 c- Z; T, y{6 A: m4 j- }+ I" r# n0 I0 P
constfloat* m_pfParam; //指向序列参数的址标,指向一个浮点型数组pointertofloat variable parameter / ex. c,h,l,o, co2...co2=(c+o)/2$ w8 ?) s' C, }7 S. u
constfloat m_fParam; //数值参数 valueof parameter: p! ]" u# ?1 W! y2 x  r
};" c! R! _6 [' I
constint m_nParamStart; //序列参数有效起始位置thestart address of variable parameter / ex. c,h,l,o,co2.....$ J; \# h, _9 i5 v  x2 [& z
}CALCPARAM;, M5 N2 ]7 T+ s+ X" E; `; p
/////////////////////////////////////////////////////////////////////////////* q: m  {5 t0 d5 m
//定义全部取用址标 的总结构 (各指标指向前述各结构以便取的各结构的数据,接口信息数据的结构 ). u" K7 K. D  |3 H  s0 r
typedefstruct tagCALCINFO
' V) q0 C- ?! Y; c$ I{
# h) y. Y" d; c' g1 `& Q6 x& xconstDWORD m_dwSize; //结构大小$ ~* e, p7 L- O0 ?! R7 U) ]& n3 R
constDWORD m_dwVersion; //调用软件版本(V2.10: 0x210). [# \" F1 b: X$ f
constDWORD m_dwSerial; //调用软件序列号+ J: n9 M' |% c7 l- ~
constchar* m_strStkLabel; //股票代码8 I' O/ Y0 c3 Q3 x% e
constBOOL m_bIndex; //大盘' J/ H: H0 G+ o3 X9 \+ A) Q
constint m_nNumData; //数据数量(pData,pDataEx,pResultBuf数据数量)数据长度
5 Y, ?% |$ z1 @4 Y& b( o; ^0 ~  m- L# gconstSTKDATA* m_pData; //常规数据,注意:m_nNumData==0时可能为NULL( M- o1 |4 W+ R5 d, p
constSTKDATAEx* m_pDataEx; //扩展数据,分笔成交买卖盘,注意:可能为NULL# W! O6 t' h8 o# o6 L' P6 x
constint m_nParam1Start; //参数1有效起始位置<0/ constant parameter >0 /variable parameter
  b- D4 s, [( B9 {constfloat* m_pfParam1; //调用参数1/pointer to variable parameter 1
/ D9 I$ A4 k3 }0 @* O4 P  k. T' kconstfloat* m_pfParam2; //调用参数2/pointer to variable parameter 2
5 n' e; A& o8 q9 mconstfloat* m_pfParam3; //调用参数3/pointer to variable parameter 3; A5 s* x2 |2 N7 K$ g& J# u$ @
constfloat* m_pfParam4; //调用参数4/pointer to variable parameter 4* ^' d1 y1 x" S+ _$ e9 j8 w+ j3 s6 n+ O) I
float*m_pResultBuf; //结果缓冲区
. ]8 ~: b  I$ y7 O7 NconstDWORD m_dataType; //数据类型
5 [% `# X, h0 \constfloat* m_pfFinData; //财务数据
  H" z  F% p, `$ D! B& ]7 D//以上与分析家兼容,所以沿用其结构和名称# o2 Z, `: M4 m  [: k4 A
//以下为飞狐交易师扩展(fortagSTKDATAEx)6 J6 y" Z& y4 ]7 O( C. p7 J
constDWORD m_dwReserved; // 保留1 f6 n& R* |! U8 F
constint m_nNumParam; // 调用参数数量
. q$ Q2 j! E& r( C' E+ mconstCALCPARAM* m_pCalcParam; // 调用参数数组
+ M; _( e  v: U. u- HconstDWORD m_dwReservedEx[4]; // 保留
/ j$ b9 I* }9 V) c% Z$ J7 [  ^) V3 achar*m_strStkName; //股票名称
3 [7 q, x; X( p+ s/ @) G& m' ESPLITDATA*m_pSplitData; //除权数据, I8 q3 W. c+ s
intm_nNumSplitData; //除权次数
9 G' R: h- D' O' N  ~. q2 W8 r}CALCINFO;( G2 V& E3 p( N6 ]% C
/*0 T+ W5 [' e9 i. R3 i9 @- Y+ {
1:(与分析家兼容)
, G" v3 M4 r% x3 |1 s5 u1.函数调用参数由m_pfParam1--m_pfParam4带入,若为NULL则表示该参数无效., p' u9 \2 C3 k  ~& s* r) k
2.当一个参数无效时,则其后的所有参数均无效.7 ?2 f( o2 C5 j
:m_pfParam2NULL,m_pfParam3,m_pfParam4一定为NULL.& }' F  P; ]9 |; T8 Z2 h+ i3 l9 n
3.参数1可以是常数参数或序列数参数,其馀参数只能为常数参数." @# I. A6 s; j
4.m_nParam1Start<0,则参数1为常数参数,参数等于*m_pfParam1;
$ N7 Y- x: r( z$ z* Q5.m_nParam1Start>=0,则参数1为序列数参数,m_pfParam1指向一个浮点型数组,
7 A4 {& v4 c' W. U2 ]9 F3 h  C数组大小为m_nNumData,数据有效范围为m_nParam1Startm_nNumData-1.
4 n+ G0 V6 X& K6 A5 W5 |* y; D在时间上m_pData[x]m_pfParam1[x]是一致的
  X7 B( n. N6 _2:(飞狐交易师扩展)5 r' X2 X2 f! ?- U6 D7 v
1.该扩展结构使调用参数在技术上可以是无限数目的,且每个参数都可为数值或序列,由公式中实际的调用参数决定。& I/ Q# @0 ?+ i
2.CALCPARAM结构用于带入参数信息和实际数据,m_pCalcParam数组大小为m_nNumParam,数据有效范围为0 m_nNumParam-1.; v+ `# n: e. r0 T
3.按参数的顺序,m_pCalcParam[0]为第一个参数的数据,m_pCalcParam[1]为第二个参数的数据...,为了保持兼容,原m_nParam1Startm_pfParam15个属性依然有赋值。
- Q" v2 p3 s8 C; r3 d8 }4.i位置的参数为数值,取用m_pCalcParam.m_fParam.6 Z: J7 F8 @; c6 s: T, L- K
5.i位置的参数为序列,取用m_pCalcParam.m_pfParam,数组大小为m_nNumData,数据有效范围为m_pCalcParam.m_nParamStartm_nNumData-1.m_pCalcParam.m_nParamStart<0,则此数组中无有效数据。" |3 n' f1 e- @, I! Y* Y
6.由于可以调用多个序列,许多序列的计算可以先在公式中进行,然后作为调用的参数即可。
( u$ X" ]( |% ]5 `3 p# |7.经此扩展,对分析家的DLL依然可以调用、兼容。9 H2 U8 A9 Y! j7 m
*/* A. B8 P/ ]/ l6 N
///////////////////////////////////////////////////////////////////////////////////& b. @6 g; f2 f4 q% w: a* ^6 K# X
/*函数输出
* e7 j0 _2 R: `* |0 f__declspec(dllexport)int xxxxxxxx(CALCINFO* pData);
8 a' p+ C( K) d2 U- _6 T1.函数名称需全部大写.
7 u; C; ]  `3 v5 a2.函数必须以上述形式声明,请用实际函数名称替代xxxxxxxx;4 F! a- J# k% K: d9 ]
对于C++程序还需包括在extern"C" { } 括号中.
2 Y; d0 P% `7 X& @3.函数计算结果用pData->m_pResultBuf带回.
. x& P. ^' e) F5 [4.函数返回-1表示错误或全部数据无效,否则返回第一个有效值位置,:
! a5 H; ^4 j' {m_pResultBuf[返回值]-- m_pResultBuf[m_nNumData-1]间为有效值.
. i5 s) S, h; B8 q, c4 `* p. [2 Y5.函数名称长度不能超过15字节,动态连接库文件名不能超过9字节(不包括扩展名),动态库名称不能叫SYSTEM,EXPLORER0 K* n1 a: B$ I0 h6 W, Y
*/8 K* a' Q, d% Y7 W1 v; x& q
//示例函数,使用时用实际名称替换' @& Q( {1 o9 _
__declspec(dllexport)int WINAPI MYMACLOSE(CALCINFO* pData);0 _( U  j9 Y! C0 \8 _
__declspec(dllexport)int WINAPI SMOOTH(CALCINFO* pData);
# f) C/ \* j5 g( \- O//__declspec(dllexport) int WINAPI MYMAVAR(CALCINFO* pData);7 G: @5 r5 ]% |: S/ I2 U
__declspec(dllexport)int WINAPI MYBBI(CALCINFO* pData);0 e. o$ d0 y# t' t- D
//WINAPI = _stdcall
+ Y  D4 \" T4 }* ]2 u/ s#ifdef__cplusplus
1 @* S9 r; m  T2 L, X}
  A% X/ G- q% S#endif//__cplusplus/ D; Y: y9 l5 O* d
#endif//__FOXFUNC_H_INCLUDE1 |0 g* a: f  F# r1 J% g# I# K
. i4 k! I& L4 y
//////////////////////////////////////////comment 注解3 U" Y& Q  }& ?) l: b
__declspec(dllexport)int WINAPI MYMAVAR(CALCINFO* pData)
* Y* @2 E+ Q' a6 M7 V; hpData是指向 址标总结构 CALCINFO的 总址标8 d0 R( s* k& b& C- |
取用第二个参数数值floatfParam = *pData→m_pfParam2 : r0 r0 r3 ]% a, @; C1 t
取用第一个序列参数的址标constfloat* pValue = pData->m_pfParam1;! e% _6 f7 g; S, X& R
取用股票数据长度intndata = pData→m_nNumData;
; [3 B. P8 u1 _% [" P9 {第一个参数存在且为数值pData->m_pfParam1&& pData→m_nParam1Start<0
- L) q/ \$ D1 ]" f第一个参数存在且为序列pData->m_pfParam1&& pData→m_nParam1Start>=07 M: g  l6 b5 P
第一个及第二个参数存在且为序列,第三个参数不存在pData->m_pfParam1&& pData->m_pfParam2 && pData->m_nParam1Start>=0&& pData->m_pfParam3==NULL
& K, c  Z4 `' D& k/ Q6 vconstfloat* cpParam = pData->m_pfParam1; 定义cpParam为第一个序列参数的址标. i" p5 v- q7 w: I/ ~9 D! g* s
取用股票数据结构/ i& ?( Z. p+ |. {, d9 c! p
pData→m_nNumData= 变数数据长度4 @( r5 d0 a2 g& f
pData→m_pData= pointer to struc STKDATA 的址标
7 g+ a% M  c* Z8 U5 O. B' O* fpData→m_pData[x]数据结构的第x个数据. B9 M* C0 I4 j7 @/ y% D: A* h
pData→m_pData[x].m_fHigh数据结构的第x个数据中的 High
+ ]1 z! A4 M' s0 k) D取用结果缓冲序列
' l; [; n2 L- A7 U  N5 U: q1 VpData->m_pResultBuf0 T' G3 g* v) M0 Z4 l+ c
取得第一个序列参数的起始序位,2,...5 , . 7...5 m6 E  R/ e3 G9 U
intnFirst = pData->m_nParam1Start;
, x3 F% M8 P" nfor( i = nFirst+nPeriod-1; i < pData->m_nNumData; i++ )+ D8 Y0 m: U. Y2 B, g0 ^: h" V
取得第二个数值参数的数值' U- r4 H1 U; [" u
floatfParam = *pData->m_pfParam2; : i4 z) F) x2 G/ |3 e
intnPeriod = (int)fParam;: H# z; A2 T& H  ~, @: b' }+ b) b! l
取用第一个序列参数的址标constfloat* pValue = pData→m_pfParam1;
& j% n' k4 _1 k0 L) Z2 U取用序列参数的单个直pValue
: g/ ^+ j, [: P( c% q1 f# V取用缓冲序列的单个值pData->m_pResultBuf" Y7 [, R4 `9 T, d  W
constCALCPARAM* m_pCalcParam; // 调用参数数组! T! @2 M1 G& l: Z; v5 `7 g
m_pCalcParam为序列址标,指向各序列参数的指标  l- Z' H' y# k; o& j
第一个序列参数pData→m_pCalcParam[0]% \8 m$ o) V' }9 g0 p$ v! z! Q
constfloat* m_pfParam; //指向序列参数的址标
7 U* n; d; D, P2 n% |) f2 P第一个序列参数的起始序位pData->m_pCalcParam[0].m_nParamStart
2 }8 h2 A) P  D. G$ Q+ l# u8 z% f5 B第一个序列参数的址标constfloat* pValue1 = pData→m_pCalcParam[0].m_pfParam;1 i) v+ v/ @; a' o
取用第一个序列参数的单个直pValue16 f8 t4 N/ c# R3 N
第二个序列参数pData→m_pCalcParam[1]
8 v; `* c( t: x+ C第二个序列参数的起始序位pData->m_pCalcParam[1].m_nParamStart
8 N" K0 z5 P8 B/ U0 `) B( Q第二个序列参数的址标constfloat* pValue1 = pData→m_pCalcParam[1].m_pfParam;# a0 t% ]2 g6 `
取用第二个序列参数的单个直pValue2: n- m# c- W) @7 [
第三个序列参数pData→m_pCalcParam[2]) }$ B* l7 j1 |# P# l  \
第三个序列参数的起始序位pData->m_pCalcParam[2].m_nParamStart9 e% [1 I8 z" r  _* n/ J( B% B4 c4 a; {
第三个序列参数的址标constfloat* pValue1 = pData→m_pCalcParam[2].m_pfParam;, h; y2 Z  F% A0 @" U9 l/ G3 p
取用第三个序列参数的单个直pValue3
/ n6 A8 A9 T2 W/ w& ^% s: k; _0 I第四个序列参数pData→m_pCalcParam[3]
4 q: A3 F* p6 r/ i7 L- K第四个序列参数的起始序位pData->m_pCalcParam[3].m_nParamStart
% S+ U, U) B/ {; Q6 L$ \/ P  i第四个序列参数的址标constfloat* pValue1 = pData→m_pCalcParam[3].m_pfParam;
3 o$ {" M7 `  l1 S; Z取用第四个序列参数的单个直pValue4
: W/ C. z- Y7 `7 @% [如果有四个序列参数,则取用序位最高的那一个序位
" ~( ?: m+ y6 A8 a! v1 Tif( pData->m_pCalcParam[0].m_nParamStart >= 0 &&, q1 l$ {: S) D4 @; P1 W
pData->m_pCalcParam[1].m_nParamStart>= 0 &&
5 \2 g4 t0 i4 e1 BpData->m_pCalcParam[2].m_nParamStart>= 0 &&
0 t: \0 e4 c: f7 V% r: zpData->m_pCalcParam[3].m_nParamStart>= 0 ) //4个序列都含有效数值: Z. P- S0 L7 z8 V, L
{$ b$ Z4 R" Z/ Y
//计算返回的序列的第一个有效值位置9 Q" r% E# o/ s1 m! f
intnFirst = pData->m_pCalcParam[3].m_nParamStart;//已知返回的序列的第一个有效值位置与第4个序列一致
- h+ M. m% s; y* G9 P) H//若不知,则9 Z* T: ~9 Q9 L) {- i
/*( h6 R3 O( K- B. T! v3 _
intnFirst = pData->m_pCalcParam[0].m_nParamStart;
+ O& x) N' h! v. tif( nFirst < pData->m_pCalcParam[1].m_nParamStart )
) P( X- A" |" y) @& W1 o+ U) T7 TnFirst= pData->m_pCalcParam[1].m_nParamStart;, k  ^$ [3 T( X6 Q( _. q4 x" Y
if( nFirst < pData->m_pCalcParam[2].m_nParamStart )   m' S: R2 A/ O) a& d
nFirst= pData->m_pCalcParam[2].m_nParamStart;
& f, V9 v. u' b# y, Wif( nFirst < pData->m_pCalcParam[3].m_nParamStart ) : z0 S4 E" D1 n: g3 G' C3 k9 Z
nFirst= pData→m_pCalcParam[3].m_nParamStart;5 y1 B2 Q2 K7 k: R, B
constfloat* pValue1 = pData->m_pCalcParam[0].m_pfParam;* Z4 [: |2 y1 B( [4 e% a# D7 f
constfloat* pValue2 = pData->m_pCalcParam[1].m_pfParam;
* w- s) G, r, l. p7 }3 U+ Econstfloat* pValue3 = pData->m_pCalcParam[2].m_pfParam;; s+ a4 f' y- Z4 M( v2 c, b/ O
constfloat* pValue4 = pData->m_pCalcParam[3].m_pfParam;$ u. [) {0 q7 }# f
//-------------------% K' E6 E6 q8 ~7 t+ M1 S  ^$ o
floatm_fOpen; //开盘 open8 ~$ p6 Q! J( H0 ~/ J' a7 D
floatm_fHigh; //最高 high1 o2 L7 c$ Q3 f/ k+ ~2 @- V  v7 \7 Z
floatm_fLow; //最低 low% f8 N* |' A9 _+ H7 ]2 Y& K
floatm_fClose; //收盘 close9 @) j% k0 R# n0 q6 p# e; L
floatm_fVolume; //成交量 Volume
: c9 X# L2 j1 E& C! Kfloatm_fAmount; //成交额 amount
$ A) ~' B2 B* \0 L& a" W调用收盘据4 k# A- G% Z) Q5 C' ]& n
pData→m_nNumData= 变数数据长度# j& w, {2 {/ }9 e: b; y* ^
pData→m_pData= pointer to struc STKDATA
. a7 L7 S; C# g5 p/ N5 a8 x3 n6 ypData→m_pData[x]x个数据( o4 @+ k: G( W& J- m3 O* x
pData→m_pData[x].m_fHighx个数据中的 High* H  k; n, [8 a: G7 n$ y# ], o4 b/ p
@@@@@@@@@@@important !!!!!!!! Q" y6 t2 \) [0 Z9 T; n1 l
sinceVC++ 2008, cl.exe will make ‘pData→m_pData[i-j].m_fClose’ anerror
( H9 e* W! A, dso,pass the high,low,open and close just from the function parameter ,that is use ‘ CALCPARAM’ struct$ K" ^- I: W* s8 t( O3 _
pData->m_pData[i-j].m_fOpen// to use open , there is no way in using a varable for calculationoutside foxtrader, V, P( s6 ^% [; Z( Q
pData→m_pData[i-j].m_fHighto use high
! F. |( D2 T1 B7 O  Y8 a0 V- wpData->m_pData[i-j].m_fLow
0 b2 O& ]6 |4 R. E6 wpData->m_pData[i-j].m_fClose2 _0 Y/ Z/ x) j' @" W2 [) O
m_pData= pointer to struc STKDATA
7 y( ^" D+ X3 n( e9 r% B( a% A$ [incalling C++ dll function2 o" M  K/ H' L$ U- U4 ~2 l
m_pDatais passed to pData (CALCINFO* pData . A CALCINFO* type pointer)' S( u  ?+ a- c* K" P" J- H% u1 \
touse a single value in variable ‘High’
+ c; O! l! {3 @: r( q/ T2 UpData→m_pData[i-j].m_fHighto use high
' K' E/ f' a( v' {+ }' kconstfloat* m_pfParam1; //调用参数1/pointer to variable parameter 1 % V* E7 t7 a9 d* w  |' B
constfloat* m_pfParam2; //调用参数2/pointer to variable parameter 2
) c1 T9 ?" Q3 E3 _constfloat* m_pfParam3; //调用参数3/pointer to variable parameter 3. D3 g* [% I( R: t. E1 W0 @& }7 a
constfloat* m_pfParam4; 7 s& n3 f' k2 I
m_pfParam1,m_pfParam2, m_pfParam3, m_pfParam4 = pointer to caller function 的参数4 ^9 N& @8 s( E+ n/ L& n" p6 e
pData→m_pfParam1= pointer to 第一个(序列)参数
# W: h% O, W, b  IpData→m_pfParam1[x]= 取用第一个(序列)参数的第x 个值8 K3 d8 |% ^! O$ c! o" B5 h5 q! G
constfloat* cpParam = pData→m_pfParam1; =定义 cpParampointerto 第一个(序列)参数( l, k5 k! [: d8 n9 k  Z
cpParam[x] = 取用第一个(序列)参数的第x 个值
1 b' J: \, y. [# G3 ?" N- G3 w! Hm_pResultBuf= 结果缓冲列' e% k& O2 D/ }' J
pData→m_pResultBuf= pointer to 结果缓冲列
/ x6 V  F7 ~; kpData→m_pResultBuf[x] = 取用结果缓冲列的第 x个值
; F! r) w1 C" S" n4 i2 i//////////////////////////////////////////comment
& P4 o+ z  x- l: R3 D  ~6 _, Q: j//////////////////////////////////////////comment 注解* {2 I2 I; e6 }$ L3 q& z/ A. Y
constint m_nParam1Start; //统杅1衄虴宎弇离$ v: x* X; x; S3 y" D
constfloat* m_pfParam1; //覃蚚统杅1
+ ?' f- N! W% _, N: H- Vconstfloat* m_pfParam2; //覃蚚统杅2
. C" e5 U5 o& Z" a1 l7 pconstfloat* m_pfParam3; //覃蚚统杅3) Q: Y$ T3 w2 J5 i
constfloat* m_pfParam4; //覃蚚统杅4,parameters must be <= 47 R& d8 I2 h$ }: y7 s: d
//const float* m_pfParam5; // parameters must be <= 4( ?# x- L8 u. p# `
//const float* m_pfParam6;
" u# b: W' h) C  }//const float* m_pfParam7; ' H' s, X/ p8 ^! J. o; I' Z; O' `$ Y
//const float* m_pfParam8;% x3 m8 P. R6 j5 o& J/ ~9 ]
//pData->m_pfParam1 && pData->m_pfParam2 &&pData->m_pfParam3 && pData->m_nParam1Start>=0 &&
& ^$ z5 }! y* A# jpData->m_pCalcParam[0].m_nParamStart>=0&& pData->m_pCalcParam[1].m_nParamStart>=0- ?" D: Q2 K) h. g$ `
&&pData->m_pCalcParam[2].m_nParamStart>=0) 4 B+ k4 A9 E7 W- H- _; B1 c7 Z
{+ P) P, w% ?' e( v+ o% F
floatfParam = *pData->m_pfParam4; //pointer ,pData->m_pCalcParam[3].m_nParamStart >= 0
+ W+ [  V' X' X. }' r& Z( _intnPeriod = (int)fParam; //统杅1" M; f- l, W7 s2 w
//const float* cpParam = pData->m_pfParam2; // cpParam = pointer to第一个序列参数,cpParam = 取用第一个序列参数的第i 个值
( S& I$ O- o1 A. e8 {+ pconstfloat* cpParam1 =pData->m_pCalcParam[0].m_pfParam; // cpParam =pointer to 第一个序列参数,cpParam = 取用第一个序列参数的第i 个值
$ e+ f! @+ b9 @constfloat* cpParam2 =pData->m_pCalcParam[1].m_pfParam; // cpParam =pointer to 第一个序列参数,cpParam = 取用第一个序列参数的第i 个值
; K3 O1 Q, l  l6 I. h: Nconstfloat* cpParam3 =pData->m_pCalcParam[2].m_pfParam; // cpParam =pointer to 第一个序列参数,cpParam = 取用第一个序列参数的第i 个值//parameters must be <= 4
8 C( P! N6 J+ K! _//const float* cpParam4 =pData->m_pCalcParam[3].m_pfParam; //cpParam = pointer to 第一个序列参数,cpParam = 取用第一个序列参数的第i 个值" z, K1 r1 `. K8 i$ i4 u
//const float* cpParam5 =pData->m_pCalcParam[4].m_pfParam; //cpParam = pointer to 第一个序列参数,cpParam = 取用第一个序列参数的第i 个值  G& B9 w2 h$ l% h
//m_pData = const struct pointer to struct STKDATA , pointer to structSTKDATA , / p& l1 l& Y$ S- {
touse pData→m_pData[x].m_fClose
, b) \( s2 q, W. T; S4 w2 L- t! Z8 @# xpData→m_pData[x]= | 1,2,3 , … , m_nNumParam | time_t m_time;
  d. o  J# F- @, }|1,2,3 , … , m_nNumParam | float m_fOime_t & D$ @3 L: U' }) T/ H
|1,2,3 , … , m_nNumParam | float m_fHigh;' N9 a, K, I1 @" `% ^
.. .7 @# B) h0 N, U( L# O  I
|1,2,3 , … , m_nNumParam | WORD m_wDecline;: E1 H" J( ?1 ^: ]0 e- {) B, b
m_nNumParam= 数据high,close,open,low的长度
0 u1 ?: Y; J2 A7 D* @3 m: Z0 g8 Wtouse high:
( Q* s& f+ x$ k1 YpData→m_pData[x].m_fHigh
: w8 X* ~: I& D5 Zcontentof struct STKDATA& I9 b5 K. K' C' m1 m
time_tm_time; //时间,UCT
9 y! a" f' N& b- _* P9 ^floatm_fOpen; //开盘 open, W9 [2 j0 C/ Z1 D- w
floatm_fHigh; //最高 high
% B5 d. _7 I. a0 s0 K4 P8 Afloatm_fLow; //最低 low3 c$ z3 Y6 ?/ \- T0 Y  G, b
floatm_fClose; //收盘 close
% w1 Q1 s. F+ ^, A; V8 ]% n+ Tfloatm_fVolume; //成交量 Volume
; y: h2 l& T. x4 z* Vfloatm_fAmount; //成交额 amount
0 Z$ m' M+ V( P, eWORDm_wAdvance; //上涨家数 仅大盘有效1 f3 [0 ]  a4 I# ]- X
WORDm_wDecline; //下跌家数 仅大盘有效) b+ V' P9 n5 a" {
调用传递参数及传回结果  b2 x1 I) W9 D, }3 j
调用传递参数1 k2 M6 s! i, ?# m3 r  V) L
(pData->m_pfParam1 && //参数1有效Param1exists
; B, G/ @; Z( K9 x: h' ZpData->m_nParam1Start<0&& //参数1为常数
3 }- `+ l( e! e- k* CpData->m_pfParam2==NULL) //
0 f/ o2 x/ Y  Y& l$ n/ U5 M: H: H. dlocalprocedure 定义使用变数
' j+ i, ^  f, C' I# V% I5 Constfloat* pValue = pData→m_pfParam1; //use constant参数1
5 X- U+ B8 n# UintnFirst = pData->m_nParam1Start; //use 参数1效值起始位% [* e1 {) |2 w$ {  R/ I* \
floatfParam = *pData->m_pfParam2; //use 参数26 `- A; _" r) S' a- ^9 t
intnPeriod = (int)fParam;
# C% l+ Z1 T" X& u+ c+ R2 f3 T传回结果
% P$ w; A+ H# D8 |% IfTotal+= pValue[i-j];
% A  i! e8 A$ @) O- ]pData->m_pResultBuf
8 V2 y+ z6 z7 F  U//////////////////////////////////////////comment

评分

1

查看全部评分

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

本版积分规则

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

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

Powered by Discuz! X3.2 Licensed

© 2001-2013 Comsenz Inc.

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