阳光飞狐

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

 找回密码
 手机注册

手机动态码快速登录

手机号快速注册登录

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

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

[复制链接]
跳转到指定楼层
1#
发表于 2019-8-11 16:09:40 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
许多年以前,我曾经在+ F$ C" A6 Y  L1 B. p% _
理想公式区发布了# g' N! e# e& f2 T- Q/ t  m( H0 c
"
1 G8 M2 L( A7 O$ L, b% Q# ?如何用 Foxtrader(飞狐)连结 C++动态程式库 DLL80x86Macro Assembly (组合语言)
) m( I# Y. T: `", F; C" o/ [) `) X
$ e) B3 Z8 C2 V' z* r/ e& O5 ?
现在更新foxtrader(飞狐交易师) $ q: w6 p" ?8 V. ~) k) `
连结 DLL的方法  v8 Y0 e! }- Z# q6 A
2 K, x- R! ?) A) j
foxtrader- - > DLL (C++ and assembly) = ( foxfunc.h + foxfunc.cpp +pow10.asm )9 |% X  |; N2 t% R
gauss- - > DLL (C++ and assembly) = ( foxfunc.cpp + meigj.asm )
5 {7 y+ h* v: l& Y, a" c4 Bgauss只用到函数参数传递,所以使用新的 c++compiler, 不受影响' F. w) H1 P  ?
foxtraderfoxfunc.h宣告的结构型态 (struct)2004vc++ 6.0 全部有效! Q% D/ f$ B& w2 q) l8 o
4 C7 J: K8 H9 q" |# g9 ^# O9 l
也就是这五个结构都能用
% J+ A. H+ ?7 P+ C" gtypedefstruct tagSTKDATA
" g' m1 D  F9 ~typedefunion tagSTKDATAEx
" v# h: s: l; wtypedefstruct tagSPLITDATA 4 Q, E4 [- A; P) E1 Z
typedefstruct tagCALCPARAM6 [$ v( l0 s. |  K$ T
typedefstruct tagCALCINFO
/ q4 P8 b$ C  R5 ^( K6 t' F* u' N% H0 c% m/ ]
2008年起,vc++ 2008, vc++ 2010, vc++2017 struct的编译,已经完全 c++,不再相容于 C
2 }9 ]% z' o6 E& z9 w也就是这五个结构中
; b- c: C+ D6 a! D" `% mtypedefstruct tagSTKDATA
# z0 P( q/ C) e/ m& s3 T% Xtypedefunion tagSTKDATAEx
6 m; ^( S; w# w% f! ]( D" Etypedefstruct tagSPLITDATA 5 w" }7 L4 p% \7 q$ f! R* ?# o0 F" m
typedefstruct tagCALCPARAM
/ F/ R* W. l, u' J& e5 E! t7 O  @typedefstruct tagCALCINFO! F+ l) R6 E1 t
只有这两个可以用
1 T! p6 y' X( T6 d3 r! j1 Q7 u8 ytypedefstruct tagCALCPARAM9 r' ^, k  i" G$ K7 }  E
typedefstruct tagCALCINFO
- p( l# V4 \* [3 \, w( z值得庆幸的是,下面这个结构的函数参数传递个数可以有无数个" Y% Q* Z, }- o
typedefstruct tagCALCPARAM
* s: C# [4 D# R3 g/ k% n/ ^9 t* n例如:foxtrader6 v' u9 _; t! N4 E
MA1:=MA(CLOSE,3);- O" i6 G. C# T4 M  A3 B1 S
MA2:=MA(CLOSE,6);
' p7 _9 J0 n+ h, f; V7 QMA3:=MA(CLOSE,12);7 J* o2 \2 p; E& K6 e9 `
MA4:=MA(CLOSE,24);8 b7 z! x* Y8 W; J, N' Q! ]) {
MYBBI1:"MYFUNC2017@MYBBI"(MA1, MA2,MA3,MA4,MA3,MA4,5)*0.95,colorff00ff,linethick3; {2017 vc++ 15.0}( a/ U5 X( a+ \: c! o! [# |
其中MYFUNC2017=MYFUNC2017.dll, MYBBI = MYFUNC2017.dll 中的MYBBI函数,这里 MYBBI函数传递的参数共有 77 }4 ]1 s! X  N
下面这两式计算结果相同
! }; f( L3 s6 D8 Z/ Nxx:(MA(CLOSE,3)+MA(CLOSE,6)+MA(CLOSE,12),MA(CLOSE,24),MA(CLOSE,12),),MA(CLOSE,24)/6*0.95,color0000ff,linethick2;{foxtrader 自行计算}
' q7 E3 k6 z& lMYBBI1:"MYFUNC2017@MYBBI"(MA1, MA2,MA3,MA4,MA3,MA4,6)*0.95,colorff00ff,linethick3; {2017 vc++ 15.0 , dll计算}
1 @7 H3 U, {, M8 e- l* |' u其他例子
. s6 i7 ?/ j; X5 noooq:="MYFUNC2008good@MYMACLOSE"(c,,c,c,6),colorffffff,linethick5;(---> pow10.asm)! P: B# s" d( R, B' M1 s- O
oooq1:"MYFUNC2010@MYMAVAR"(ma(c,5),5),colorgreen,linethick5;/ n# a( G9 u, b! N" h0 g
其中pow10.asm里面有很多不同定义或宣告被注解不用,那是因为后来在逐步侦测法修改语码中才发现在foxfunc.cpp主程式中,下面这行错误,也就是新的 compiler不再相容于 C,因此在pow10.asm里面被注解不用的定义或宣告中,有些应该是可以用的7 n. e5 ~& \' }
fTotal= pData->m_pData.m_fClose; // @@@@@@@ vc++ 2010 cl.exe 使pData->m_pData[i-j].m_fClose错误% W! \- U* i) l. }
0 b+ X5 `! p9 I. x
. f% d$ f! N" ~- l% l' t9 _
////////////////////////////////////////////////////////foxfunc.h
( X7 Q; Y3 P8 Z) Q* B+ `, w#ifndef__FOXFUNC_H_INCLUDE! v( G& i/ _  B( u* o5 P% q: D: r) ^
#define__FOXFUNC_H_INCLUDE* n% @0 V. q7 v. {3 Y
/*
% ~, m) E+ C, J' J2 f% p: t飞狐交易师“C语言接口”扩展程序调用接口规范V3.07 K# A4 l5 ~  Q$ t4 a- ]
1.本规范适用于飞狐交易师V3.x公式系统.' b% W# M" w, _8 n9 ~$ Q$ a' v
2.扩展函数用于实现系统函数不能实现的特殊算法.
" b$ z' M$ K& M7 t) I; Z, @. W, ?7 d3.扩展函数用windows32位动态连接库实现,建议使用MicrosoftVisual C++编程.
" T+ ~' S1 C$ q. i& ~3 g4.调用时在公式编辑器中写"动态库名称@函数名称"(参数表)即可,例如下面函数可以写为"FOXFUNC@MYMACLOSE"(5)
9 @2 B5 R- G2 I5.动态连接库名称和函数名称可以自己定义.
, f2 a+ t5 a( a0 d6.使用时必须将动态库拷贝到飞狐交易师安装目录下的FmlDLL子目录下使用.
  y3 ]: T7 t& D- l& I3 O; U*/
, G9 m# N- J& P( I; W/ a4 X#ifdef__cplusplus, j  S5 c# W* x2 I; ^" P% ]! M
extern"C"
0 M! s0 R. j# G{
, q5 J6 c4 e' P, H! q1 V#endif//__cplusplus: t" Q* C; b! T; o0 _, x% Z" `3 a( B
///////////////////////////////////////////////////////////////////////////3 L6 ^. Z: {+ e  {3 Q% ]& _
//分析周期
) m' N) T; Q, I" HenumDATA_TYPE
0 E3 T* n8 n$ k4 [{
$ ]7 W6 j( A  t1 N) ETICK_DATA=2,//分笔成交2 A- k' P# n& F0 J+ s
MIN1_DATA,//1分钟线
( S9 b7 [9 S$ |+ a  DMIN5_DATA,//5分钟线 & ]1 t# J; o6 N) L5 u! e$ n' [
MIN15_DATA,//15分钟线
5 ]& F8 l5 N% I/ [9 ]6 @/ v( e1 pMIN30_DATA,//30分钟线
4 e' N1 K- t% l8 p) G0 Y, s  w. ZMIN60_DATA,//60分钟线/ R1 C; ^# Z, x- [) ^+ U
DAY_DATA,//日线. p& V0 H& a0 V* f
WEEK_DATA,//周线/ V9 J5 x: V9 D, U6 L7 l
MONTH_DATA,//月线
+ a" C5 V- k2 H6 c4 l4 u/ w3 [YEAR_DATA,//年线; E0 ~! x! A6 I5 }9 B, w% n
MULTIDAY_DATA,//多日线& ]. K! C& m* k
MULTIMIN_DATA//多分钟线! G6 |" U) b# b; O# r5 u; K1 T' t
};
+ Q. f& B. N# E1 d0 |///////////////////////////////////////////////////////////////////////////1 P9 w3 _2 p' }
//定义取用股票基本数据的结构 只有 VC++ 6.0 compile成功使用4 {" u5 M# Z/ a+ t
typedefstruct tagSTKDATA
$ s3 t% X0 z# _! U- A/ o9 `{' c+ E% g, N9 u8 I! g; \
_tm_; //时间,UCT4 b- T9 z( |9 ~2 p# i
floatm_fOpen; //开盘 open
  s9 Y) N/ @" G# l2 ?' sfloatm_fHigh; //最高 high$ d8 V6 v. T" w+ ?/ Z
floatm_fLow; //最低 low( a( o! h- L% U( @. B
floatm_fClose; //收盘 close; d' y* F: k, R) _, x+ M
floatm_fVolume; //成交量 Volume. ~; Z$ l6 R2 i$ K
floatm_fAmount; //成交额 amount
' m8 {' S/ t2 T; ^. m+ xWORDm_wAdvance; //上涨家数 仅大盘有效
9 A# m$ @& B) }. a' x3 hWORDm_wDecline; //下跌家数 仅大盘有效( K7 D4 k8 P9 z, L
}STKDATA;- c3 A" }( u& `3 e# y
定义STKDATAtagSTKDATA的简单别名,STKDATA 2 n+ c. P+ E4 M" c
为真正方便使用名称,tagSTKDATA 为定目的的过水名称9 b2 J) v+ @5 Z; Q  D
///////////////////////////////////////////////////////////////////////////// `/ `- c1 W) F# ]& C
//扩展数据,用于定义取用分笔成交数据的买卖盘 的结构& c7 H3 I$ C: G8 E% b7 A
typedefunion tagSTKDATAEx! ^4 ^% p& W  Q" F8 u# F  P8 n
{
0 n& V  M$ D3 m0 T% C+ ]struct
* {4 r0 r+ p; H( c8 o{6 X7 v+ W$ z; O
floatm_fBuyPrice[3]; //1--3floatm_fOpen; //开盘 open. E5 O& V) Y( W9 o4 x
floatm_fHigh; //最高 high6 d1 D5 t0 t5 `% ?3 v, e
floatm_fLow; //最低 low* A7 O7 M5 [3 @5 [( \! c/ m
floatm_fClose; //收盘 close
& C1 F' M# U# F1 ?4 Y" f; Lfloatm_fVolume; //成交量 Volume, i" k+ T9 F. n1 e
floatm_fAmount; //成交额 amount
# E+ i) N; ^4 ]1 J) ]7 ?) h' x: B' Jfloatm_fBuyVol[3]; //1--3. o5 {' U4 Q  l0 Q6 b. n# P
floatm_fSellPrice[3]; //1--30 u: ]: H. b) o* |# B+ A5 B! {
floatm_fSellVol[3]; //1--30 S( M7 J/ A- M/ B  Z
};
, g% h: F$ U) s/ {! e8 T- g" mfloatm_fDataEx[12];
: U9 q6 P8 L" A0 D% A% d}STKDATAEx;2 ^* m" d4 e' l, s  y  ~/ z, X
////////////////////////////////////////////////////////////////////////////
$ v+ ?" `% c) {( ]9 F# _//定义取用除权数据的结构+ M" T6 R- ?) k
typedefstruct tagSPLITDATA ( \8 U% k8 ^/ h1 a9 N
{9 g* @4 o: \; U
time_tm_time; //时间,UCT  P& [9 r2 G) g4 v4 A- l
floatm_fHg; //红股1 `1 B: X9 v% \
floatm_fPg; //配股( Q  {, b8 V9 p& a; r( x% b+ Y
floatm_fPgj; //配股价
, [" }- X+ r% bfloatm_fHl; //红利
( y8 P" K& Q% v/ v* O9 K}SPLITDATA;* r2 p* [& H7 Y. C
/////////////////////////////////////////////////////////////////////////////; I0 F1 |. H0 ~2 \% H; l& @0 M
/*财务数据顺序(m_pfFinData内容)" N, \  O7 n# h
序号内容2 S& h/ t: M* N% T2 w4 M
0总股本(万股),- `3 Z: @4 t9 y* n  W
1国家股,0 z, I% }' j4 W, z* C% a8 j
2发起人法人股,
; {4 {3 s) E/ v3法人股,7 I: u6 J$ E4 K+ j5 T3 ^4 G
4B,
7 n# @* {) U9 X, I/ v+ f5H,
# F: q4 b# |, W) m+ P9 f& P0 H6流通A,9 _# F! j) K  Y, L- ]) w
7职工股,- Z- ^) i6 T; {7 O# ^+ j" U
8A2转配股,
( _5 ~2 S, ?! A, `% E5 m) P- l( e9总资产(千元),. y4 `, j8 k( ?2 j
10流动资产,
& a: ~+ I: ~) G4 k& n7 ?, w11固定资产,8 w, g- _. h. O0 k
12无形资产,5 J# |! I' Q: k
13长期投资,1 y4 ^! c9 J4 c4 w
14流动负债,: _/ S+ e/ X: ^0 S% T1 @/ d
15长期负债,* o( m. g6 `# N* z+ G- o' H
16资本公积金,. q( N' P3 B4 R8 i
17每股公积金,
. c: F4 f, ]) J7 n18股东权益,3 ]1 a+ n6 ?' X$ Q  [6 j* {
19主营收入,
" f) d5 G) @% O- ?$ w20主营利润,
1 r: t9 W( P2 R; D! V21其他利润,. I( i3 D* k+ R! ?3 P$ Q
22营业利润,8 s/ }' z' q6 ~! u/ V$ f& }& r7 i
23投资收益,7 L( T% {1 ^& w7 i* I' `% b
24补贴收入," C- W" q/ D: t- t$ s0 S, e
25营业外收支,, @0 [& }8 B1 j8 I; a) l
26上年损益调整,
4 N" h) K* f1 q7 d2 o2 e- `27利润总额,4 x. R  H" Q$ y# t0 _
28税后利润,, ?4 ~- @4 i: [' E5 i. I
29净利润,
3 Z% }( R( k1 j# |30未分配利润,1 y$ ^) v4 o- j9 ~1 U3 X* a. L
31每股未分配,
( D! O. @- g! K$ t32每股收益,3 _* N1 [( _# Z8 K
33每股净资产,
9 M% W$ {* |+ U8 d0 q$ l34调整每股净资,
/ D* v# u& K. g, }+ t6 |+ D; u% n! ~35股东权益比,
7 L6 C. e: A: `% H" I36净资收益率
1 C2 H) y- `, l. {, U+ X*/' a  W( S3 {" d; q/ {' D
/////////////////////////////////////////////////////////////) f# Z7 X! y; v  }
//定义取用caller函数传递参数项 的结构0 T6 @& z( K, X3 Y5 f. `& x2 n
typedefstruct tagCALCPARAM! S. p! u* U) ?2 s# E
{
$ ?& T$ z8 Z2 m  h5 qunion+ e& G6 b2 M, E. B# p" J' D
{- D8 [) p9 ^" \6 \
constfloat* m_pfParam; //指向序列参数的址标,指向一个浮点型数组pointertofloat variable parameter / ex. c,h,l,o, co2...co2=(c+o)/2& Z! y! Z& s# r  x* Q6 ]
constfloat m_fParam; //数值参数 valueof parameter
9 U' ?. F# o6 D- D0 o9 X/ c; Y};9 w9 D  ]6 e: J
constint m_nParamStart; //序列参数有效起始位置thestart address of variable parameter / ex. c,h,l,o,co2.....$ Y" {; V, t- j4 @
}CALCPARAM;. u$ \5 B4 J+ I% t$ s
/////////////////////////////////////////////////////////////////////////////
1 m+ W7 b; |: j6 }( q% {  T6 \//定义全部取用址标 的总结构 (各指标指向前述各结构以便取的各结构的数据,接口信息数据的结构 )
1 h6 ~# x7 N  a5 n( Z1 s9 Vtypedefstruct tagCALCINFO
7 v2 Q: `) D" G! \* A' ~& r6 F{
+ }4 ^5 f: R. Q2 ?4 [/ q& sconstDWORD m_dwSize; //结构大小
" \% r! G) U! [% v. rconstDWORD m_dwVersion; //调用软件版本(V2.10: 0x210)
8 x* H: b+ x* {, ]* r5 w, r) SconstDWORD m_dwSerial; //调用软件序列号
% q  `  P7 T( `9 e9 K2 Zconstchar* m_strStkLabel; //股票代码
5 t' Q) C8 `  u; f& fconstBOOL m_bIndex; //大盘
7 \$ t1 z5 C. r) \& q+ p( t7 m& j, {constint m_nNumData; //数据数量(pData,pDataEx,pResultBuf数据数量)数据长度
( y: o8 x: o8 o- KconstSTKDATA* m_pData; //常规数据,注意:m_nNumData==0时可能为NULL
8 B7 M6 d* u1 [  q! B% ?constSTKDATAEx* m_pDataEx; //扩展数据,分笔成交买卖盘,注意:可能为NULL  O" O. @" W7 V) R. ~! X
constint m_nParam1Start; //参数1有效起始位置<0/ constant parameter >0 /variable parameter   u9 ~" v, t9 R- ^
constfloat* m_pfParam1; //调用参数1/pointer to variable parameter 1 8 L# _" E' z: m
constfloat* m_pfParam2; //调用参数2/pointer to variable parameter 2
1 R( }' p( r# |  wconstfloat* m_pfParam3; //调用参数3/pointer to variable parameter 3
& H, K" x% l' X6 Y6 I6 B; |$ Y- |constfloat* m_pfParam4; //调用参数4/pointer to variable parameter 4
6 h/ g# H9 l4 ~1 V: j8 U" t: ofloat*m_pResultBuf; //结果缓冲区
# }: X! i( q6 B: ~( Z0 u. m  ~constDWORD m_dataType; //数据类型/ ?  C. {, K7 r3 a9 V
constfloat* m_pfFinData; //财务数据
9 E2 h$ X# {0 l& D) n//以上与分析家兼容,所以沿用其结构和名称+ W9 T. k( Y/ O( T% Q" N- ]% T
//以下为飞狐交易师扩展(fortagSTKDATAEx). N3 a4 X/ G2 Q2 I; v
constDWORD m_dwReserved; // 保留1 f5 H7 Y! G0 k* {* w- ~" A
constint m_nNumParam; // 调用参数数量
6 i# b5 ~) n( r, H0 G( d6 b3 OconstCALCPARAM* m_pCalcParam; // 调用参数数组! K6 \2 ^" V( k7 |% \: }( @
constDWORD m_dwReservedEx[4]; // 保留9 X$ D  ~  q: w, ]
char*m_strStkName; //股票名称3 M7 X# t2 ^6 v. `
SPLITDATA*m_pSplitData; //除权数据. q! [8 x& b4 U
intm_nNumSplitData; //除权次数2 |4 ^  s4 m  e) L6 @, J2 H) g
}CALCINFO;, Z1 U$ L* Q* D1 j! E: O9 A$ f4 h, J% q
/*
1 f. x7 |  X% Z- q2 b9 D& y# g- r1:(与分析家兼容)
5 {# j% D$ A$ o! h1.函数调用参数由m_pfParam1--m_pfParam4带入,若为NULL则表示该参数无效.
* E7 f7 E( u9 ]0 o; C3 n. g' J2.当一个参数无效时,则其后的所有参数均无效.$ D0 e+ n3 n) X' F
:m_pfParam2NULL,m_pfParam3,m_pfParam4一定为NULL.
, e( p; b) ~7 o3 S  y" e  F/ D3.参数1可以是常数参数或序列数参数,其馀参数只能为常数参数.
" T( i! |+ }5 S) i- z2 d0 M2 _4.m_nParam1Start<0,则参数1为常数参数,参数等于*m_pfParam1;+ k( A5 H1 _0 _- |
5.m_nParam1Start>=0,则参数1为序列数参数,m_pfParam1指向一个浮点型数组,/ P% A. `$ `( h& H
数组大小为m_nNumData,数据有效范围为m_nParam1Startm_nNumData-1." S9 L' I8 \7 ^% W; C6 S
在时间上m_pData[x]m_pfParam1[x]是一致的; h4 c6 |# J! w* n: T7 \7 I
2:(飞狐交易师扩展)& r9 z: u6 g  ^
1.该扩展结构使调用参数在技术上可以是无限数目的,且每个参数都可为数值或序列,由公式中实际的调用参数决定。
' \3 f% n; Y5 R% I. N9 w" I! q. B, _2.CALCPARAM结构用于带入参数信息和实际数据,m_pCalcParam数组大小为m_nNumParam,数据有效范围为0 m_nNumParam-1.
$ A- M+ @+ F/ a- Z) R& Q8 H3.按参数的顺序,m_pCalcParam[0]为第一个参数的数据,m_pCalcParam[1]为第二个参数的数据...,为了保持兼容,原m_nParam1Startm_pfParam15个属性依然有赋值。
- b) a1 V( S" x9 C7 x2 T& L4.i位置的参数为数值,取用m_pCalcParam.m_fParam.0 _5 e: d- @2 y$ E- D9 t' C
5.i位置的参数为序列,取用m_pCalcParam.m_pfParam,数组大小为m_nNumData,数据有效范围为m_pCalcParam.m_nParamStartm_nNumData-1.m_pCalcParam.m_nParamStart<0,则此数组中无有效数据。4 j6 K( c; ~" _
6.由于可以调用多个序列,许多序列的计算可以先在公式中进行,然后作为调用的参数即可。
/ u: q, `" p& F4 s8 M9 z7.经此扩展,对分析家的DLL依然可以调用、兼容。* M1 _9 I7 Q, a) }  m  p. \
*/+ N1 e9 a) \) Y
///////////////////////////////////////////////////////////////////////////////////" ]# b4 A; P9 g7 c
/*函数输出
: }. L& {0 ^$ s$ t. \__declspec(dllexport)int xxxxxxxx(CALCINFO* pData);8 A' y% r- {4 g8 l2 \0 z6 Y% \3 M
1.函数名称需全部大写.$ {" `5 x5 k% ~$ F) e, M" i6 j) J
2.函数必须以上述形式声明,请用实际函数名称替代xxxxxxxx;6 `3 Y- \* h& T# W
对于C++程序还需包括在extern"C" { } 括号中.% H" y" F' k9 V3 v
3.函数计算结果用pData->m_pResultBuf带回.) [$ I: ^& V9 W( k7 U
4.函数返回-1表示错误或全部数据无效,否则返回第一个有效值位置,:
" d+ a% }- B5 a5 P1 j7 V# c# ?% Vm_pResultBuf[返回值]-- m_pResultBuf[m_nNumData-1]间为有效值.
" m: `  O( `. j& h9 A5.函数名称长度不能超过15字节,动态连接库文件名不能超过9字节(不包括扩展名),动态库名称不能叫SYSTEM,EXPLORER- ^* s& @0 i, i, H
*/  c8 T; E; r+ Y# f
//示例函数,使用时用实际名称替换
  `/ E6 _$ R0 E3 g7 W. J! }. E- v__declspec(dllexport)int WINAPI MYMACLOSE(CALCINFO* pData);
" |1 d/ A9 m+ b7 r6 x__declspec(dllexport)int WINAPI SMOOTH(CALCINFO* pData);+ t9 L, ?& y. M) \& }& [
//__declspec(dllexport) int WINAPI MYMAVAR(CALCINFO* pData);
/ s: r  w7 p; `5 b4 i: }__declspec(dllexport)int WINAPI MYBBI(CALCINFO* pData);. M& a: ]" |/ t# g8 E5 K# S
//WINAPI = _stdcall
/ H+ R) X4 S7 ]# t: o# f% o7 q#ifdef__cplusplus
: q* ~" G6 ^$ @}0 A6 z; O0 p- [) d. {; S# D
#endif//__cplusplus
5 L( S# D2 C: [! W3 i, V- V% ^#endif//__FOXFUNC_H_INCLUDE- |  O4 t# \" X! W; S

4 _- |4 ?" p' c2 e( g//////////////////////////////////////////comment 注解
0 L+ k! B% o1 Y5 ^7 Y__declspec(dllexport)int WINAPI MYMAVAR(CALCINFO* pData)
+ q7 n. N2 E( _: s9 u# XpData是指向 址标总结构 CALCINFO的 总址标2 N' @" x) l" T  O. j, y1 {  ^
取用第二个参数数值floatfParam = *pData→m_pfParam2
1 ]3 E- Y$ e, j取用第一个序列参数的址标constfloat* pValue = pData->m_pfParam1;) C( x5 x) }6 R1 D8 z; I2 j
取用股票数据长度intndata = pData→m_nNumData;. w6 D( ?* ^- T' j5 [9 v4 J
第一个参数存在且为数值pData->m_pfParam1&& pData→m_nParam1Start<0& T- ~0 O& ]9 S1 b( p$ t
第一个参数存在且为序列pData->m_pfParam1&& pData→m_nParam1Start>=0
# H6 c/ j5 B/ I( A3 s/ `第一个及第二个参数存在且为序列,第三个参数不存在pData->m_pfParam1&& pData->m_pfParam2 && pData->m_nParam1Start>=0&& pData->m_pfParam3==NULL
+ V2 f$ Q' o& ^% ^  Cconstfloat* cpParam = pData->m_pfParam1; 定义cpParam为第一个序列参数的址标7 a+ S0 w3 ^( Y6 J
取用股票数据结构4 D7 S6 B' G2 l4 Q* g
pData→m_nNumData= 变数数据长度
- X+ `9 D1 `$ J; K8 ?3 rpData→m_pData= pointer to struc STKDATA 的址标
$ ^2 g8 j6 ^- {+ y# BpData→m_pData[x]数据结构的第x个数据
- X: K& u+ v+ |* A3 \( kpData→m_pData[x].m_fHigh数据结构的第x个数据中的 High
% O7 A7 B: O- V4 V9 A5 {取用结果缓冲序列5 k1 B% r/ _% U
pData->m_pResultBuf
# h  W( D& t+ q0 I4 t取得第一个序列参数的起始序位,2,...5 , . 7...3 y. W8 j3 ^, T+ a/ D5 D* M# l7 _
intnFirst = pData->m_nParam1Start;
7 g! F4 K) k% ~3 _for( i = nFirst+nPeriod-1; i < pData->m_nNumData; i++ )  G! T9 z, u9 f5 y' W# @
取得第二个数值参数的数值7 x; f% V% V$ \+ Q% z/ K
floatfParam = *pData->m_pfParam2;
0 R5 P: s: I3 @: l  H+ `3 _  K6 u  D+ }intnPeriod = (int)fParam;
) ~5 k6 c; [4 H; q# I" G8 A, k7 s取用第一个序列参数的址标constfloat* pValue = pData→m_pfParam1;' B& o1 r7 [, A/ _5 w
取用序列参数的单个直pValue
0 s3 [1 O4 Y3 ~. ?取用缓冲序列的单个值pData->m_pResultBuf( s. J1 R, P- D! D1 z0 G
constCALCPARAM* m_pCalcParam; // 调用参数数组
. X' U) s: |+ E& Dm_pCalcParam为序列址标,指向各序列参数的指标% ^. ^0 m! L, w7 s( r
第一个序列参数pData→m_pCalcParam[0]" N7 C/ }+ Q, }$ \: Q& c
constfloat* m_pfParam; //指向序列参数的址标
) O" A* R3 i- \' h: ]3 c, a* `* V3 `第一个序列参数的起始序位pData->m_pCalcParam[0].m_nParamStart
, T4 G, |9 D4 [/ Y5 Y* v第一个序列参数的址标constfloat* pValue1 = pData→m_pCalcParam[0].m_pfParam;% T3 A1 U- k0 u1 N5 U/ P
取用第一个序列参数的单个直pValue1& G/ T8 J% b: V5 w5 n& l! y& O% f% K
第二个序列参数pData→m_pCalcParam[1]) O- ^  ]0 R8 _  l/ N1 ~2 F
第二个序列参数的起始序位pData->m_pCalcParam[1].m_nParamStart9 Q  _. D2 u- z" u4 h
第二个序列参数的址标constfloat* pValue1 = pData→m_pCalcParam[1].m_pfParam;
. u* T5 W1 p7 @9 i! L取用第二个序列参数的单个直pValue2; W1 d5 R" q3 Q
第三个序列参数pData→m_pCalcParam[2]8 s& ]0 q: x" U7 q5 o$ ?- K
第三个序列参数的起始序位pData->m_pCalcParam[2].m_nParamStart  b8 L9 h1 J5 |+ @/ C. W0 m; A
第三个序列参数的址标constfloat* pValue1 = pData→m_pCalcParam[2].m_pfParam;
+ E2 `1 A1 z3 m$ D8 L取用第三个序列参数的单个直pValue3
8 A6 V! p" r9 D' a( ^第四个序列参数pData→m_pCalcParam[3]6 g# B8 }; x  @, l) A5 N
第四个序列参数的起始序位pData->m_pCalcParam[3].m_nParamStart
2 |. v5 J1 ?) C第四个序列参数的址标constfloat* pValue1 = pData→m_pCalcParam[3].m_pfParam;
. Y2 {& }; a5 I1 E& f取用第四个序列参数的单个直pValue48 O* y# ]. r1 c
如果有四个序列参数,则取用序位最高的那一个序位# E$ w' }- A9 i( N# T7 l
if( pData->m_pCalcParam[0].m_nParamStart >= 0 &&
3 R. S+ L/ Q/ f- O% |pData->m_pCalcParam[1].m_nParamStart>= 0 &&
. q  c( C' C' \/ ~: PpData->m_pCalcParam[2].m_nParamStart>= 0 &&, {% {5 B( `; I* C+ ~# f7 k
pData->m_pCalcParam[3].m_nParamStart>= 0 ) //4个序列都含有效数值  }) W9 X0 o* ]7 N& {1 P8 Y
{
5 m8 s3 B, r6 ~1 Z; L( p8 N//计算返回的序列的第一个有效值位置
& [! B! a* g5 P0 Z. U7 B9 W1 [8 SintnFirst = pData->m_pCalcParam[3].m_nParamStart;//已知返回的序列的第一个有效值位置与第4个序列一致) [: w+ M7 y, B- ~
//若不知,则3 s; N) p; `( j5 h
/*
+ r! J6 j9 _3 G+ G" o1 Q# L, u0 UintnFirst = pData->m_pCalcParam[0].m_nParamStart;
# ]6 O5 ]* Z1 t( {$ Tif( nFirst < pData->m_pCalcParam[1].m_nParamStart )
) \, ]+ Z( |7 }' Z- U" v. UnFirst= pData->m_pCalcParam[1].m_nParamStart;
/ q3 Q& \6 c6 w  u5 k# ]  q5 vif( nFirst < pData->m_pCalcParam[2].m_nParamStart ) 9 M0 Z3 i- T) B0 ~6 G9 @* {
nFirst= pData->m_pCalcParam[2].m_nParamStart;
3 R8 o( ?2 Y# cif( nFirst < pData->m_pCalcParam[3].m_nParamStart ) 2 e! T( N  z, ]
nFirst= pData→m_pCalcParam[3].m_nParamStart;3 B' H! G, d# M: l
constfloat* pValue1 = pData->m_pCalcParam[0].m_pfParam;) h3 q; V0 L& P. P) R. d  z' n
constfloat* pValue2 = pData->m_pCalcParam[1].m_pfParam;
& D! [+ ~9 \4 x2 W2 s+ s/ [constfloat* pValue3 = pData->m_pCalcParam[2].m_pfParam;
" p9 L+ l' `3 l) [) q3 L1 {constfloat* pValue4 = pData->m_pCalcParam[3].m_pfParam;
5 k% N# j; l. ~* v( X//-------------------4 _4 `  m/ r; X) |; F& x
floatm_fOpen; //开盘 open6 S6 `  H* W6 x% e( x, D/ ^; t: H
floatm_fHigh; //最高 high2 B# B, Z1 r" ^2 g7 g
floatm_fLow; //最低 low4 Y2 q# T# x" i5 F4 }. v
floatm_fClose; //收盘 close
/ P3 a$ A2 z2 X% ?  J5 k5 B; Cfloatm_fVolume; //成交量 Volume9 R* e2 H; N) _1 l, H! u3 T) Y
floatm_fAmount; //成交额 amount
  ~: r6 z0 O+ h& F调用收盘据  w! @! ?1 Z) \
pData→m_nNumData= 变数数据长度
! y# G$ F: |. l; Z9 JpData→m_pData= pointer to struc STKDATA
/ Y* n6 b+ i' ~! Z0 spData→m_pData[x]x个数据
3 j6 h, O5 ?" I' L6 H3 `pData→m_pData[x].m_fHighx个数据中的 High
6 Y. n1 t  P4 W2 L6 A4 I+ ~@@@@@@@@@@@important !!!!!!!
' T# r! P9 J2 @9 |sinceVC++ 2008, cl.exe will make ‘pData→m_pData[i-j].m_fClose’ anerror) N! P# T+ o& X' E/ X
so,pass the high,low,open and close just from the function parameter ,that is use ‘ CALCPARAM’ struct
# C8 Y- B' L+ BpData->m_pData[i-j].m_fOpen// to use open , there is no way in using a varable for calculationoutside foxtrader
) X9 _* Q  r( ]* i+ e9 m4 TpData→m_pData[i-j].m_fHighto use high% u, l$ F1 t6 a! P1 o
pData->m_pData[i-j].m_fLow
) U! l8 a! }  d, n! gpData->m_pData[i-j].m_fClose. g/ i- Y  j# e  X6 n
m_pData= pointer to struc STKDATA; w9 b% p4 a& t  Q$ o4 w* T
incalling C++ dll function
8 u1 U  |7 L* ^; wm_pDatais passed to pData (CALCINFO* pData . A CALCINFO* type pointer)5 a1 T- D1 H3 j" r
touse a single value in variable ‘High’% y4 A8 m1 G' g* T: L
pData→m_pData[i-j].m_fHighto use high& J  P7 L( ~; Z( L. M" Q- d9 C
constfloat* m_pfParam1; //调用参数1/pointer to variable parameter 1 " }9 H0 z1 {6 g" z* T6 `
constfloat* m_pfParam2; //调用参数2/pointer to variable parameter 26 z$ F; r+ b, ]; s
constfloat* m_pfParam3; //调用参数3/pointer to variable parameter 3# W6 T2 [, U) B) H6 _: ^; e, |
constfloat* m_pfParam4;
8 u( O. j' ]# Q8 j% `/ Em_pfParam1,m_pfParam2, m_pfParam3, m_pfParam4 = pointer to caller function 的参数0 U3 n% L% v* k; S* r
pData→m_pfParam1= pointer to 第一个(序列)参数' P4 I, S' c# L1 p
pData→m_pfParam1[x]= 取用第一个(序列)参数的第x 个值
; c; O1 f, l. g6 `2 M0 econstfloat* cpParam = pData→m_pfParam1; =定义 cpParampointerto 第一个(序列)参数
" v  b3 l' E6 D1 C0 d6 zcpParam[x] = 取用第一个(序列)参数的第x 个值. q. }: z& [$ p
m_pResultBuf= 结果缓冲列
: c0 W. ~5 C; b9 b8 @7 npData→m_pResultBuf= pointer to 结果缓冲列
, n2 y9 k8 ?+ E" }pData→m_pResultBuf[x] = 取用结果缓冲列的第 x个值
; h+ r/ g3 P# R5 P: {# a//////////////////////////////////////////comment4 d% m7 @  _6 K4 }# V) B
//////////////////////////////////////////comment 注解7 r+ c4 A6 ^8 Y, L! |( j& [
constint m_nParam1Start; //统杅1衄虴宎弇离8 N/ X( _+ v" w. e/ F# C
constfloat* m_pfParam1; //覃蚚统杅19 B% i* v3 t( [
constfloat* m_pfParam2; //覃蚚统杅2
% Z  @) H; D5 }; X  _constfloat* m_pfParam3; //覃蚚统杅38 t2 ]$ v* s4 X! e! r7 ^  A* ?# C3 X
constfloat* m_pfParam4; //覃蚚统杅4,parameters must be <= 45 L* o" O9 E5 v( ~* L3 }: g
//const float* m_pfParam5; // parameters must be <= 4: T, o% p! c3 A5 U
//const float* m_pfParam6;
- K- c* @9 O) ^$ z1 ^  t) {//const float* m_pfParam7; " G# ^; m, A- l: j$ b
//const float* m_pfParam8;" v( g  r2 \9 z% q" u: v$ C
//pData->m_pfParam1 && pData->m_pfParam2 &&pData->m_pfParam3 && pData->m_nParam1Start>=0 &&
7 o- h, D# _9 H' o% G% d  ppData->m_pCalcParam[0].m_nParamStart>=0&& pData->m_pCalcParam[1].m_nParamStart>=03 q2 i0 f( e, i/ C; V7 }$ H. {1 Y
&&pData->m_pCalcParam[2].m_nParamStart>=0) & ?% L* ~4 N0 j5 ~* h+ B
{
4 G/ J! \9 g+ H, yfloatfParam = *pData->m_pfParam4; //pointer ,pData->m_pCalcParam[3].m_nParamStart >= 07 ]6 N$ T' }  n% q  w& [2 J
intnPeriod = (int)fParam; //统杅1
3 G/ h1 q: H4 ^/ K2 P//const float* cpParam = pData->m_pfParam2; // cpParam = pointer to第一个序列参数,cpParam = 取用第一个序列参数的第i 个值5 z! e* m: }, i; @3 Q) A8 E0 q
constfloat* cpParam1 =pData->m_pCalcParam[0].m_pfParam; // cpParam =pointer to 第一个序列参数,cpParam = 取用第一个序列参数的第i 个值) n) x: T  }  d! S! g, ^
constfloat* cpParam2 =pData->m_pCalcParam[1].m_pfParam; // cpParam =pointer to 第一个序列参数,cpParam = 取用第一个序列参数的第i 个值7 n* z; e& N3 n3 K8 Y1 x& ]9 N
constfloat* cpParam3 =pData->m_pCalcParam[2].m_pfParam; // cpParam =pointer to 第一个序列参数,cpParam = 取用第一个序列参数的第i 个值//parameters must be <= 4
  p+ s# y6 s; D3 `0 j//const float* cpParam4 =pData->m_pCalcParam[3].m_pfParam; //cpParam = pointer to 第一个序列参数,cpParam = 取用第一个序列参数的第i 个值$ H+ p( ]1 f, M  v
//const float* cpParam5 =pData->m_pCalcParam[4].m_pfParam; //cpParam = pointer to 第一个序列参数,cpParam = 取用第一个序列参数的第i 个值# g3 Q+ u4 F, O" v; z8 E
//m_pData = const struct pointer to struct STKDATA , pointer to structSTKDATA ,
% {/ e4 z' H4 ytouse pData→m_pData[x].m_fClose3 e3 ~8 O+ Q$ D* D8 ~8 N/ p
pData→m_pData[x]= | 1,2,3 , … , m_nNumParam | time_t m_time; # }4 M& \- _& Y2 J3 |7 ~3 [
|1,2,3 , … , m_nNumParam | float m_fOime_t
* A+ X$ ]/ ]" F+ C|1,2,3 , … , m_nNumParam | float m_fHigh;1 C( `6 B1 \; q9 }# z: f8 H- O
.. .& e6 y9 x* A4 `: {; L
|1,2,3 , … , m_nNumParam | WORD m_wDecline;+ \' k0 x  `, O, L- i0 @: O6 a
m_nNumParam= 数据high,close,open,low的长度' l$ i+ q2 M4 I9 d, y. h3 [- `
touse high:
) k! i% q' D; y/ f+ w$ i& lpData→m_pData[x].m_fHigh
4 q! b  T6 G0 w; |+ Hcontentof struct STKDATA
% L5 B  O) ?( s3 Qtime_tm_time; //时间,UCT8 [) Q1 a! m4 G) c
floatm_fOpen; //开盘 open
) b2 r$ i9 @) M/ Kfloatm_fHigh; //最高 high1 F% E$ B+ \4 R7 G7 U3 F" ]
floatm_fLow; //最低 low- g" D% g1 P# v; j: ~
floatm_fClose; //收盘 close
; k6 s' a8 d0 z3 d8 xfloatm_fVolume; //成交量 Volume* e# H+ T" z4 L
floatm_fAmount; //成交额 amount7 E0 m0 ]$ `1 s4 n
WORDm_wAdvance; //上涨家数 仅大盘有效+ v' n: Y+ }/ L2 n1 k# v
WORDm_wDecline; //下跌家数 仅大盘有效- a: V* z1 T& N% w0 z
调用传递参数及传回结果
! o# N! i" |7 o. z2 i调用传递参数
' U) F; o8 u. @; P6 }(pData->m_pfParam1 && //参数1有效Param1exists" t; f2 B/ F: s
pData->m_nParam1Start<0&& //参数1为常数
; k4 b/ ~$ x8 W, q- ^, GpData->m_pfParam2==NULL) //
  O: e: K! ~/ }localprocedure 定义使用变数
2 Y3 H0 F5 s. z5 h9 Donstfloat* pValue = pData→m_pfParam1; //use constant参数1
; a$ Y- Y& _# ^% u6 TintnFirst = pData->m_nParam1Start; //use 参数1效值起始位7 n. ]# a0 ^# v+ i5 l
floatfParam = *pData->m_pfParam2; //use 参数2
9 ~% J( g/ i/ {intnPeriod = (int)fParam;
8 E; X- g4 K% K, z1 }$ `% U' }传回结果
3 l! O) x5 U' i' D$ `( _fTotal+= pValue[i-j];
5 d+ w" A+ F5 A: i' ]pData->m_pResultBuf7 @, Q- G5 W( H( A% k
//////////////////////////////////////////comment

评分

1

查看全部评分

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

本版积分规则

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

GMT+8, 2026-9-3 17:29 , Processed in 0.143784 second(s), 19 queries .

Powered by Discuz! X3.2 Licensed

© 2001-2013 Comsenz Inc.

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