阳光飞狐

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

 找回密码
 手机注册

手机动态码快速登录

手机号快速注册登录

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

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

[复制链接]
跳转到指定楼层
1#
发表于 2019-8-11 16:09:40 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
许多年以前,我曾经在+ R1 I4 r4 o) q8 C4 x; E7 e3 B8 o$ T
理想公式区发布了
. v! @3 N" h* R+ g3 U% b$ E"
( l0 }# }- k7 e$ X+ f如何用 Foxtrader(飞狐)连结 C++动态程式库 DLL80x86Macro Assembly (组合语言). y- {: O1 a, N
". L0 A& i! \2 q! K; p
+ ~- ^& n- P) J- M) q6 H8 o
现在更新foxtrader(飞狐交易师)
3 S+ p0 t) _. p, d8 ^
连结 DLL的方法
# A. b" }; l6 f
: I1 ?& d4 x& ]foxtrader- - > DLL (C++ and assembly) = ( foxfunc.h + foxfunc.cpp +pow10.asm ). P5 u! V$ W! b+ g5 c* R- y. g
gauss- - > DLL (C++ and assembly) = ( foxfunc.cpp + meigj.asm )) C4 i+ H6 p3 M! @# [% J1 p
gauss只用到函数参数传递,所以使用新的 c++compiler, 不受影响
1 g4 K7 y6 F+ W$ I5 Nfoxtraderfoxfunc.h宣告的结构型态 (struct)2004vc++ 6.0 全部有效0 ~$ G/ h; F2 `& L

7 z/ f( q' k! o1 |& c也就是这五个结构都能用
# f4 g1 P& }' m1 r9 T  o1 }! Utypedefstruct tagSTKDATA ' q/ ]& [7 ?- M  h
typedefunion tagSTKDATAEx
8 [1 ]) a' Y: h( p- E6 Q+ qtypedefstruct tagSPLITDATA
. L9 e' Z6 J% \5 c! ]. k5 z7 Rtypedefstruct tagCALCPARAM2 x3 ]/ I) M+ x1 V% |7 M& @
typedefstruct tagCALCINFO, F, W3 d' u6 V0 }

! O) b3 P" I( K0 o7 v2008年起,vc++ 2008, vc++ 2010, vc++2017 struct的编译,已经完全 c++,不再相容于 C1 j# a+ h9 Y8 a. L
也就是这五个结构中. }& z+ n' d8 d% O- o' W
typedefstruct tagSTKDATA
" B# N1 ^3 t3 I- D% ~% dtypedefunion tagSTKDATAEx) n$ O( ]. K7 A4 P# G& v
typedefstruct tagSPLITDATA
! J& M4 z( C2 a1 \typedefstruct tagCALCPARAM, j2 ]: O: `, V6 f0 F3 @
typedefstruct tagCALCINFO
4 h+ G* j5 |7 z" K' B. @0 K只有这两个可以用( w- @/ ~7 O- @2 S; m
typedefstruct tagCALCPARAM" x1 l7 e5 r5 h3 r% K9 k
typedefstruct tagCALCINFO. W2 T% V9 p  ~/ n4 P
值得庆幸的是,下面这个结构的函数参数传递个数可以有无数个
: g% Z* {& ~) etypedefstruct tagCALCPARAM; Q5 L. |+ G* j; G' f  U
例如:foxtrader- z5 |. c$ U( {
MA1:=MA(CLOSE,3);
. G$ E( _( g: VMA2:=MA(CLOSE,6);
) E$ p) b4 E$ l* M$ Y% b# \  ^2 sMA3:=MA(CLOSE,12);
/ _# a+ j6 y1 ]# O! rMA4:=MA(CLOSE,24);. J8 \2 x/ c7 M4 p" I4 z- l' f
MYBBI1:"MYFUNC2017@MYBBI"(MA1, MA2,MA3,MA4,MA3,MA4,5)*0.95,colorff00ff,linethick3; {2017 vc++ 15.0}) Y+ {0 d2 I( ]1 l8 w4 J8 p( v
其中MYFUNC2017=MYFUNC2017.dll, MYBBI = MYFUNC2017.dll 中的MYBBI函数,这里 MYBBI函数传递的参数共有 7
: Z6 c" `) |: N下面这两式计算结果相同: F1 N& k5 }" Q3 E+ @8 B
xx:(MA(CLOSE,3)+MA(CLOSE,6)+MA(CLOSE,12),MA(CLOSE,24),MA(CLOSE,12),),MA(CLOSE,24)/6*0.95,color0000ff,linethick2;{foxtrader 自行计算}, O( z2 ~0 v* _: W
MYBBI1:"MYFUNC2017@MYBBI"(MA1, MA2,MA3,MA4,MA3,MA4,6)*0.95,colorff00ff,linethick3; {2017 vc++ 15.0 , dll计算}9 k0 ?3 D! @8 O1 ^: E
其他例子
2 D( [% d% A1 P& v0 n& X# \oooq:="MYFUNC2008good@MYMACLOSE"(c,,c,c,6),colorffffff,linethick5;(---> pow10.asm)
0 B! s, k. L0 X( K% boooq1:"MYFUNC2010@MYMAVAR"(ma(c,5),5),colorgreen,linethick5;  T) M5 x, y4 r: I, ]  G
其中pow10.asm里面有很多不同定义或宣告被注解不用,那是因为后来在逐步侦测法修改语码中才发现在foxfunc.cpp主程式中,下面这行错误,也就是新的 compiler不再相容于 C,因此在pow10.asm里面被注解不用的定义或宣告中,有些应该是可以用的+ t/ j6 j$ a& }# o9 G) y
fTotal= pData->m_pData.m_fClose; // @@@@@@@ vc++ 2010 cl.exe 使pData->m_pData[i-j].m_fClose错误. s# ^* W1 @  E7 U& \8 d: ?
" q: u( a& y, O& ~' @! A( k" a
9 _4 k# G& E1 Y* B
////////////////////////////////////////////////////////foxfunc.h
4 V% x2 [1 ?' {0 ?#ifndef__FOXFUNC_H_INCLUDE! x! P4 x6 G9 @% |- K" E  @" u
#define__FOXFUNC_H_INCLUDE  x- S+ G) a. ^
/*
+ Q8 T0 M3 s: z+ W5 k飞狐交易师“C语言接口”扩展程序调用接口规范V3.0
8 m( s9 [$ a# i1 V: z- j1.本规范适用于飞狐交易师V3.x公式系统." F' l0 f7 V% c1 B4 j
2.扩展函数用于实现系统函数不能实现的特殊算法.
" m( c. x0 t3 e/ I3.扩展函数用windows32位动态连接库实现,建议使用MicrosoftVisual C++编程." Z9 {5 L7 c4 B' n
4.调用时在公式编辑器中写"动态库名称@函数名称"(参数表)即可,例如下面函数可以写为"FOXFUNC@MYMACLOSE"(5)
( X0 w8 G. @. B, }8 E5 \) d6 \5.动态连接库名称和函数名称可以自己定义.
. ^5 j5 ?0 y) m3 E' y  ?# P; M# s) h6.使用时必须将动态库拷贝到飞狐交易师安装目录下的FmlDLL子目录下使用.# B& ~9 V( e4 \8 A
*/- N+ o" |& w* X8 Z$ z
#ifdef__cplusplus
: `$ q* s  l, e; C. g  qextern"C"" J6 o" R8 j5 {" \0 b
{$ {6 o3 O6 K3 X0 ~+ q
#endif//__cplusplus
! s+ `( _6 t5 x///////////////////////////////////////////////////////////////////////////
! ]8 z! Z) l7 C1 d+ a, _/ \! }//分析周期
5 e+ Q, v; O9 ?% O2 E3 J# y' k+ \enumDATA_TYPE: d) ~7 x% R: C" E
{+ r- U) J) x' A# g2 ]8 e8 a7 m
TICK_DATA=2,//分笔成交' d' ~' U7 r- g6 `6 T# S6 u% p6 z
MIN1_DATA,//1分钟线5 o/ _- [6 u3 A% J& A* @3 ^8 }
MIN5_DATA,//5分钟线 ) t- R5 b1 t. p- F
MIN15_DATA,//15分钟线
( z8 T* o% ]% F8 _1 y" h- mMIN30_DATA,//30分钟线9 |: b# ^1 o+ ]* y& p
MIN60_DATA,//60分钟线
( T/ \) @6 M4 w+ a5 n8 uDAY_DATA,//日线
1 r; S8 X2 w% _3 z" fWEEK_DATA,//周线
' C" m4 _& c" o! I6 _# |& kMONTH_DATA,//月线4 V  G3 `7 F( U4 v" g2 W8 I
YEAR_DATA,//年线( t' B5 F( f9 X, i
MULTIDAY_DATA,//多日线
# |9 r7 M* y  b* h  a  X4 y, ?MULTIMIN_DATA//多分钟线
! W1 I, i7 {- @- T' T1 v: t8 \};
4 Q  W7 F3 ]/ R" U6 g! `///////////////////////////////////////////////////////////////////////////
/ N0 S" O+ F4 h: b: U* M" {5 g- h; f//定义取用股票基本数据的结构 只有 VC++ 6.0 compile成功使用
9 `' q. Z/ O8 `9 B& stypedefstruct tagSTKDATA 9 M# W% K5 k& ]$ |6 D
{7 X' H: B: x+ `0 E% T4 ]* b: \
_tm_; //时间,UCT8 p+ t% `' L6 g0 Q- [; N* T
floatm_fOpen; //开盘 open, t1 \9 M5 [) t1 Y9 Z
floatm_fHigh; //最高 high+ Y! Z7 A: K( G) m) P  ~7 Y0 v
floatm_fLow; //最低 low& Q# b! D9 W& K" t' z( c
floatm_fClose; //收盘 close; N  E  l# D% R9 b
floatm_fVolume; //成交量 Volume2 R) y9 E6 y) i8 n5 I# l: J
floatm_fAmount; //成交额 amount
) u) J, C7 ?7 W4 W6 UWORDm_wAdvance; //上涨家数 仅大盘有效
- s/ T, J% i# h, p: d# z/ kWORDm_wDecline; //下跌家数 仅大盘有效" V/ G  n* G) _9 i6 z% T1 V# H2 f
}STKDATA;
( F, o/ T5 b* @. X6 g定义STKDATAtagSTKDATA的简单别名,STKDATA
7 D3 Y% ]; B$ N9 z2 @为真正方便使用名称,tagSTKDATA 为定目的的过水名称4 Z" ]- B) j$ K( L, \
////////////////////////////////////////////////////////////////////////////
8 ^; ~) a  p- x. ^( |//扩展数据,用于定义取用分笔成交数据的买卖盘 的结构
4 s; o9 J: N0 @9 n9 f4 Ytypedefunion tagSTKDATAEx9 ~' D- p9 x% W2 E$ o
{
9 G( D7 ^( ?, C$ ]struct
& e, L7 D; i" [4 t% I{
. E: A3 x( I3 n  O3 J# Sfloatm_fBuyPrice[3]; //1--3floatm_fOpen; //开盘 open! h: S3 @% i9 M2 w
floatm_fHigh; //最高 high
7 r+ [- q( \3 f2 Q9 l0 D) ^* q2 \floatm_fLow; //最低 low
) ?! H+ [* d3 [) ~; V# a- efloatm_fClose; //收盘 close( U; |2 t4 _4 t* X( V+ [( A/ w
floatm_fVolume; //成交量 Volume
% t3 e$ U7 G+ W2 l2 _% ^9 v& Yfloatm_fAmount; //成交额 amount
, g/ \; M5 w- q7 W# kfloatm_fBuyVol[3]; //1--3
: Z9 N  `9 R2 Z/ ~floatm_fSellPrice[3]; //1--3
' E) e! W/ \3 b( N9 s2 qfloatm_fSellVol[3]; //1--3
6 \: J4 j( t; u$ G7 d' U. M: t};
- X) U. |. g$ rfloatm_fDataEx[12];
; L$ K4 p, G, k; r% d! A}STKDATAEx;
5 l$ l" b& _+ L" S( d////////////////////////////////////////////////////////////////////////////
5 c- a6 r9 N3 ]% ?% g//定义取用除权数据的结构" \, B3 @! `9 E* g  W; S  |
typedefstruct tagSPLITDATA
+ E6 H$ z* B2 o( c{' r/ e6 [% X8 h0 S
time_tm_time; //时间,UCT
) j" I8 b* q, s9 `! Dfloatm_fHg; //红股
5 m/ Z9 b; Y6 Qfloatm_fPg; //配股
2 M. P/ U2 a! [) vfloatm_fPgj; //配股价
- t' ]- S7 H4 u5 ?5 ofloatm_fHl; //红利. ?7 F, F9 N/ ~$ e% p) z0 a
}SPLITDATA;& K6 J- m  [, L6 U( I
/////////////////////////////////////////////////////////////////////////////
$ b1 ]! D# n+ o$ X/*财务数据顺序(m_pfFinData内容)
# A: n# T$ y1 L8 z, F5 B! |5 D序号内容1 S6 e7 i8 `0 B3 F0 L
0总股本(万股),
8 K+ P5 Y' X5 V2 M- E1国家股,
% j7 M+ L: Z3 c, v3 _* T' O7 ]9 T/ M2发起人法人股,3 A' y2 m+ J' t7 t& g4 ?
3法人股,, _! K8 f) ?. e0 u. G$ f
4B,2 e+ C" Q* C: o9 Z: w
5H,6 H& D9 I6 ~% ^# _
6流通A,/ G5 ~$ u- @% t0 r- D0 |+ N; u
7职工股,
% K& P/ S. \! ~1 @$ K0 o8A2转配股,; x( @5 H) Y! c+ b* a
9总资产(千元),3 d8 E. B% z- N! \& k! `3 |
10流动资产,. g7 x3 N. e5 Y/ b
11固定资产,' N9 G. Z9 x0 {, m% y2 }: T3 u
12无形资产,$ G! i9 R3 Q: q. a+ |% V
13长期投资,
* T0 N9 M. L1 G) `+ s14流动负债,
# W4 i2 A& J5 s! I6 p8 t15长期负债,
) [( w0 G& C( z, Y* Q16资本公积金,3 ]3 S5 X  o" r, D0 ]7 ]2 g
17每股公积金,/ F% E% l0 r8 n/ L
18股东权益,
& V- {# Q4 h9 A$ N$ A  l19主营收入,3 f! G# c! u& g
20主营利润,' P; a: @& d' u4 f1 b
21其他利润,1 ^0 d2 j; Z. V* }
22营业利润,
+ s  t; A3 E; J3 b23投资收益,, e. l  C9 m9 H1 R9 E9 ~8 s
24补贴收入,
* b8 w  \" e! Y8 k) }/ u2 B25营业外收支,/ ]- l: i7 f$ O8 B/ i( X% G
26上年损益调整,
+ {- _( B3 d/ \4 i: P; n* L# K27利润总额,
/ @9 u( R: x2 e( n28税后利润,
8 W: Z  R6 t7 Y6 p. b# O+ o! ]29净利润,4 `/ B- g7 w1 n5 A. @  C! K# Q
30未分配利润,) Q& s+ r: O) E$ H, n4 B- [
31每股未分配,
6 D/ F6 f; G+ W32每股收益,1 t  t2 L# G2 ~& q7 ?
33每股净资产,/ s1 a, }3 O1 ~8 |
34调整每股净资,- z% O& T0 `( I! z+ u9 w7 t3 {" e
35股东权益比,1 \9 c: v" G  t0 ^; v8 e
36净资收益率
2 q. k: Y" S9 N" O5 W: G*/' H" h+ Y5 F8 z; a1 b
/////////////////////////////////////////////////////////////
; U7 ~: ^2 Q  r* s! y5 u; F//定义取用caller函数传递参数项 的结构
8 j& k" n% V" N* G/ p- etypedefstruct tagCALCPARAM4 s$ r  J: w3 D8 \
{9 w# K4 u! e4 o, O  |
union8 [4 v6 f! M7 [/ z1 `# x! C- z% ]
{
( Z' Y% t2 b: [% V5 ~1 V& L- j) p8 xconstfloat* m_pfParam; //指向序列参数的址标,指向一个浮点型数组pointertofloat variable parameter / ex. c,h,l,o, co2...co2=(c+o)/2
. U) Q6 m. b. ?) ^9 jconstfloat m_fParam; //数值参数 valueof parameter
% N9 e) s2 {8 F% X- m2 \};7 e9 Z) p. \) p6 U# K
constint m_nParamStart; //序列参数有效起始位置thestart address of variable parameter / ex. c,h,l,o,co2....., ?, z0 F! D' x5 F
}CALCPARAM;4 U5 Q7 [0 x3 a
/////////////////////////////////////////////////////////////////////////////
$ \  q/ @6 }# r* A" Y//定义全部取用址标 的总结构 (各指标指向前述各结构以便取的各结构的数据,接口信息数据的结构 )
$ N- g+ N+ x3 v: u" B+ g) Ctypedefstruct tagCALCINFO
- D; p; x; o1 o: m# \{
; |+ t, w; J! c8 q, i  WconstDWORD m_dwSize; //结构大小* g# B6 o/ a4 Z3 M1 e1 u
constDWORD m_dwVersion; //调用软件版本(V2.10: 0x210); l* S- A) c0 k7 K$ F! v: @
constDWORD m_dwSerial; //调用软件序列号
* b% F8 T) p. B2 B& T2 v0 Iconstchar* m_strStkLabel; //股票代码
% u3 S" n" M9 `4 JconstBOOL m_bIndex; //大盘
! F8 w: Y) j2 econstint m_nNumData; //数据数量(pData,pDataEx,pResultBuf数据数量)数据长度: v+ J, `! u8 V, M
constSTKDATA* m_pData; //常规数据,注意:m_nNumData==0时可能为NULL
6 n! j+ `5 i, o7 L$ l6 |constSTKDATAEx* m_pDataEx; //扩展数据,分笔成交买卖盘,注意:可能为NULL' \- i5 i% o3 ~( \3 `+ E
constint m_nParam1Start; //参数1有效起始位置<0/ constant parameter >0 /variable parameter
; L) Y1 C. Z7 }constfloat* m_pfParam1; //调用参数1/pointer to variable parameter 1
/ ^9 U/ Z* O" O+ nconstfloat* m_pfParam2; //调用参数2/pointer to variable parameter 25 T! t! a4 r, r! Z* m
constfloat* m_pfParam3; //调用参数3/pointer to variable parameter 3
8 f" [7 u* ]2 x6 t* h* r# qconstfloat* m_pfParam4; //调用参数4/pointer to variable parameter 4
: t0 J$ s8 @8 E; Kfloat*m_pResultBuf; //结果缓冲区3 y' b0 g) p: O7 ?) W' F. y7 C
constDWORD m_dataType; //数据类型' q% M: K: i) }/ L9 T
constfloat* m_pfFinData; //财务数据
. a+ S/ X! U( J" D5 e( v//以上与分析家兼容,所以沿用其结构和名称
& s: I: R8 n3 c( I& [' ~//以下为飞狐交易师扩展(fortagSTKDATAEx)2 {! C6 Y9 S' I: z
constDWORD m_dwReserved; // 保留0 q3 z( p1 u1 ]
constint m_nNumParam; // 调用参数数量
7 t/ q6 U- r3 O6 FconstCALCPARAM* m_pCalcParam; // 调用参数数组* M0 M4 r8 p/ x) T/ n9 ~4 {$ n
constDWORD m_dwReservedEx[4]; // 保留: u" a0 b7 Q! r; f1 H/ w
char*m_strStkName; //股票名称
4 l7 E2 M& E3 ?: V* N" q% \0 M6 RSPLITDATA*m_pSplitData; //除权数据/ `# U$ C9 z! v
intm_nNumSplitData; //除权次数8 [5 X$ U' e: Y% Y
}CALCINFO;& ~# v* K1 m6 ]0 e3 ]9 s* r# S
/*
% X, b. c' T% t) p# F1:(与分析家兼容)" N9 Q  j( l6 s+ X1 R4 g
1.函数调用参数由m_pfParam1--m_pfParam4带入,若为NULL则表示该参数无效.
( _8 H/ F- b8 `! X- _9 z$ q% H; d1 D2.当一个参数无效时,则其后的所有参数均无效.. K! @! q& L  d/ f/ ^
:m_pfParam2NULL,m_pfParam3,m_pfParam4一定为NULL.
* N' x# P3 C8 g0 b- x3.参数1可以是常数参数或序列数参数,其馀参数只能为常数参数.
. [- g* {5 _% }# x: f& ^* Q- H4.m_nParam1Start<0,则参数1为常数参数,参数等于*m_pfParam1;6 ?% N- d4 }4 c7 T7 o
5.m_nParam1Start>=0,则参数1为序列数参数,m_pfParam1指向一个浮点型数组,5 C+ p. g  {. t9 u. @3 O7 ?
数组大小为m_nNumData,数据有效范围为m_nParam1Startm_nNumData-1.$ Q1 `/ l- e) l) `& L4 m! v
在时间上m_pData[x]m_pfParam1[x]是一致的2 d+ T; u" F. g9 o$ C9 }
2:(飞狐交易师扩展)) {4 F+ R3 u6 ^; ^- G3 @8 x* G) P
1.该扩展结构使调用参数在技术上可以是无限数目的,且每个参数都可为数值或序列,由公式中实际的调用参数决定。
% D# k0 A( ~" R8 V# j" i9 `2.CALCPARAM结构用于带入参数信息和实际数据,m_pCalcParam数组大小为m_nNumParam,数据有效范围为0 m_nNumParam-1.
( i; R5 O2 g) v+ o- {; y3.按参数的顺序,m_pCalcParam[0]为第一个参数的数据,m_pCalcParam[1]为第二个参数的数据...,为了保持兼容,原m_nParam1Startm_pfParam15个属性依然有赋值。
& j- P: g: ~  ?" A' K4.i位置的参数为数值,取用m_pCalcParam.m_fParam.; z- Z( O0 W; n) |' k$ M5 k7 ~
5.i位置的参数为序列,取用m_pCalcParam.m_pfParam,数组大小为m_nNumData,数据有效范围为m_pCalcParam.m_nParamStartm_nNumData-1.m_pCalcParam.m_nParamStart<0,则此数组中无有效数据。( i4 z8 |* E  a* v! c  u
6.由于可以调用多个序列,许多序列的计算可以先在公式中进行,然后作为调用的参数即可。
# B+ @& j  z, ]2 `, u: G3 |7.经此扩展,对分析家的DLL依然可以调用、兼容。' t# {4 x0 x. P5 f1 A- I" @
*/
  D2 C2 g5 a  e- O& I+ a1 c' f5 {) k///////////////////////////////////////////////////////////////////////////////////; q7 W1 O: c; m+ [8 K5 P8 k: U
/*函数输出4 m! o( u% l# V* T7 E$ ?7 o
__declspec(dllexport)int xxxxxxxx(CALCINFO* pData);
3 o5 u0 J! O. d. x+ H. g$ ~1.函数名称需全部大写.# U* V3 B$ Q0 U2 u" z3 E
2.函数必须以上述形式声明,请用实际函数名称替代xxxxxxxx;: L2 @- \4 N' H$ C1 y2 u! U( s
对于C++程序还需包括在extern"C" { } 括号中.+ I" B4 Y2 N& V+ J" K  Z+ J
3.函数计算结果用pData->m_pResultBuf带回.% R* m: E+ F" Z+ n. r! J2 a: m: P0 ^
4.函数返回-1表示错误或全部数据无效,否则返回第一个有效值位置,:( G/ W7 _7 D9 @8 n  P
m_pResultBuf[返回值]-- m_pResultBuf[m_nNumData-1]间为有效值.
+ d) @" ~$ m5 {& v5.函数名称长度不能超过15字节,动态连接库文件名不能超过9字节(不包括扩展名),动态库名称不能叫SYSTEM,EXPLORER
. X2 u% f9 }9 D) @1 a* E$ d: ?1 x*/
- C1 D$ }! k, W. B# p8 U//示例函数,使用时用实际名称替换
/ i$ G8 ^$ P; o" F: C__declspec(dllexport)int WINAPI MYMACLOSE(CALCINFO* pData);% D" D" z* l4 q6 P5 U& ]
__declspec(dllexport)int WINAPI SMOOTH(CALCINFO* pData);
8 `7 H8 h, f, ^' S//__declspec(dllexport) int WINAPI MYMAVAR(CALCINFO* pData);
  e$ T  @- f# s1 |__declspec(dllexport)int WINAPI MYBBI(CALCINFO* pData);
7 S' I3 T7 |* v//WINAPI = _stdcall
" Z/ v0 I( m% T% M+ m: }#ifdef__cplusplus
& F1 D4 a4 V0 @) w+ C# W9 }}
$ I% z, k( B  I( N$ s#endif//__cplusplus
' i, e& ^( X5 ]- Q+ n' M* l% E#endif//__FOXFUNC_H_INCLUDE
! P5 d4 D5 ?. z/ X* e; L/ Y* h; e: T$ j
//////////////////////////////////////////comment 注解
1 s: }- U8 ^% ?; x4 R  y# e6 V__declspec(dllexport)int WINAPI MYMAVAR(CALCINFO* pData)
- `1 e2 J6 M7 \$ L) _7 XpData是指向 址标总结构 CALCINFO的 总址标
" D& w1 E! V4 k8 \取用第二个参数数值floatfParam = *pData→m_pfParam2
$ b  ^/ ^! E$ V/ D% v取用第一个序列参数的址标constfloat* pValue = pData->m_pfParam1;
& O+ Q8 `1 n  g6 d5 d取用股票数据长度intndata = pData→m_nNumData;
: z1 F" K# B4 S第一个参数存在且为数值pData->m_pfParam1&& pData→m_nParam1Start<0% N- Q$ W4 M6 J; `: t
第一个参数存在且为序列pData->m_pfParam1&& pData→m_nParam1Start>=0
8 q4 X/ \7 w, N- R& K. P第一个及第二个参数存在且为序列,第三个参数不存在pData->m_pfParam1&& pData->m_pfParam2 && pData->m_nParam1Start>=0&& pData->m_pfParam3==NULL
* x( r% f+ R; \3 f1 u8 v4 Vconstfloat* cpParam = pData->m_pfParam1; 定义cpParam为第一个序列参数的址标
) a7 e' V9 B$ d5 }. M取用股票数据结构
5 ^2 s3 [, a5 V  N# q; D; ]pData→m_nNumData= 变数数据长度, w' H! E. Q! z. ?* G! n8 M
pData→m_pData= pointer to struc STKDATA 的址标0 w* d( \, [! Z# ]' q# w- S+ d8 s
pData→m_pData[x]数据结构的第x个数据
+ d8 H3 d) ?# @* V0 cpData→m_pData[x].m_fHigh数据结构的第x个数据中的 High! a  T8 s8 ]+ g$ x+ ]
取用结果缓冲序列
2 B5 Z1 L' }) l; cpData->m_pResultBuf" F, ?* p4 \7 l1 o# s
取得第一个序列参数的起始序位,2,...5 , . 7...0 d7 `9 D/ a& `7 k+ z9 ]
intnFirst = pData->m_nParam1Start;
. m9 o: x) ?1 V/ I7 T# O8 f6 `' U# Dfor( i = nFirst+nPeriod-1; i < pData->m_nNumData; i++ )  j" S7 y% f$ J. w
取得第二个数值参数的数值
' y7 D' n5 e1 i1 M7 T9 jfloatfParam = *pData->m_pfParam2;
/ N: g( X- J+ j8 {1 ^* i" aintnPeriod = (int)fParam;. R* p) h- w8 o' l; ~# N6 e' z
取用第一个序列参数的址标constfloat* pValue = pData→m_pfParam1;
% d3 ^4 V4 U! Q8 m$ X: ^; Y) O1 q取用序列参数的单个直pValue
% L6 t' h$ J2 B9 z3 S  H取用缓冲序列的单个值pData->m_pResultBuf- `" d0 u  B% \2 T) A0 G' x# |
constCALCPARAM* m_pCalcParam; // 调用参数数组% }: ~7 }6 `  j4 G
m_pCalcParam为序列址标,指向各序列参数的指标9 G( j$ T( ~% c7 C, x! _
第一个序列参数pData→m_pCalcParam[0]
1 C! K! m' H$ J" l/ G  hconstfloat* m_pfParam; //指向序列参数的址标5 ^% X; |& A9 _0 e& |
第一个序列参数的起始序位pData->m_pCalcParam[0].m_nParamStart8 v( ~  ^4 F; N/ ^3 F& I
第一个序列参数的址标constfloat* pValue1 = pData→m_pCalcParam[0].m_pfParam;
& I! a* n# }2 b! M) O+ C7 j取用第一个序列参数的单个直pValue1
, h+ i5 Z3 P+ T% }0 y第二个序列参数pData→m_pCalcParam[1], P# T+ x6 \7 k2 ~0 t
第二个序列参数的起始序位pData->m_pCalcParam[1].m_nParamStart) N) R& F3 U& T# W4 X; O8 d  O) A
第二个序列参数的址标constfloat* pValue1 = pData→m_pCalcParam[1].m_pfParam;2 D! E6 o: M1 c' L' Z
取用第二个序列参数的单个直pValue2( j: k& o( e# U0 f- ?
第三个序列参数pData→m_pCalcParam[2]
' e% t1 v; F1 K4 w第三个序列参数的起始序位pData->m_pCalcParam[2].m_nParamStart  d  ~. o# I7 d9 L( H; P
第三个序列参数的址标constfloat* pValue1 = pData→m_pCalcParam[2].m_pfParam;( N% ]( l4 e, m4 |  ?8 K1 T- L
取用第三个序列参数的单个直pValue3/ j6 ]/ O0 V/ y! P
第四个序列参数pData→m_pCalcParam[3]) e; ^" L1 E3 }7 O% o
第四个序列参数的起始序位pData->m_pCalcParam[3].m_nParamStart; N  h: B9 R- i
第四个序列参数的址标constfloat* pValue1 = pData→m_pCalcParam[3].m_pfParam;
6 i9 u- L/ ~' \! k6 y, n  a) {+ h取用第四个序列参数的单个直pValue4; C; {" k1 E4 N% y/ o' T
如果有四个序列参数,则取用序位最高的那一个序位: ~' K) q5 ~6 {2 _0 J( b
if( pData->m_pCalcParam[0].m_nParamStart >= 0 &&
/ z+ E- J* ^( L4 {6 A0 J: I  mpData->m_pCalcParam[1].m_nParamStart>= 0 &&
) e; Y! P+ F4 i! n5 @  `5 q% t) IpData->m_pCalcParam[2].m_nParamStart>= 0 &&
9 s. X8 M3 k  s; u" {* |pData->m_pCalcParam[3].m_nParamStart>= 0 ) //4个序列都含有效数值) s$ \/ s2 G, U# [0 o: Y) Z6 d
{: V" A( g2 z0 F; V. i0 _8 `! B6 |
//计算返回的序列的第一个有效值位置* X8 Q0 o* x: x
intnFirst = pData->m_pCalcParam[3].m_nParamStart;//已知返回的序列的第一个有效值位置与第4个序列一致( j  U' V* e/ r
//若不知,则9 ], Q( x, |# t% \4 I5 X
/*
# t( _7 P# n1 D% ~intnFirst = pData->m_pCalcParam[0].m_nParamStart;
/ C( x6 `  ]( L7 s8 Kif( nFirst < pData->m_pCalcParam[1].m_nParamStart )
; h# j+ x7 C; W! B" }) y0 d2 GnFirst= pData->m_pCalcParam[1].m_nParamStart;
2 @4 X2 X$ t4 j- K8 ]if( nFirst < pData->m_pCalcParam[2].m_nParamStart )
& A8 f' @' @$ E- b7 {6 H8 ^nFirst= pData->m_pCalcParam[2].m_nParamStart;
; Z+ E. V1 G* P3 xif( nFirst < pData->m_pCalcParam[3].m_nParamStart )
6 \: T( X1 P1 {+ @+ E% P" G4 UnFirst= pData→m_pCalcParam[3].m_nParamStart;/ T! @# i0 l8 w! G! S, u
constfloat* pValue1 = pData->m_pCalcParam[0].m_pfParam;5 W+ ]7 K8 L# V1 z% L  I% i) `
constfloat* pValue2 = pData->m_pCalcParam[1].m_pfParam;' r9 _: J3 _2 L3 y2 w6 G
constfloat* pValue3 = pData->m_pCalcParam[2].m_pfParam;
- `7 |# ]* }, h  y/ Bconstfloat* pValue4 = pData->m_pCalcParam[3].m_pfParam;* `8 w4 G, T. f/ z8 D
//-------------------
; ]3 Q& V' ]' G, X6 hfloatm_fOpen; //开盘 open
+ R. c$ D) y5 X( x, T+ ]# ofloatm_fHigh; //最高 high4 n( B( X1 l+ i2 b9 U6 r; v" I
floatm_fLow; //最低 low
+ P3 F' r4 e; @7 n- U" |floatm_fClose; //收盘 close
: m1 }3 }/ ~& k) Q% Hfloatm_fVolume; //成交量 Volume
* ^  p3 v' [) ^- |: {/ P2 Wfloatm_fAmount; //成交额 amount4 x0 Y7 b" r& j" W
调用收盘据: X& H* ?: Q$ a2 K
pData→m_nNumData= 变数数据长度
. Z- D' Z# J1 H3 z0 NpData→m_pData= pointer to struc STKDATA
- K) S2 A( |( W1 f7 [& j7 g- \* p- bpData→m_pData[x]x个数据
( i5 t  s$ h$ w, P  s2 n' ~pData→m_pData[x].m_fHighx个数据中的 High
% ^4 J# Q8 O5 I2 _# P# ]. L$ {! J" I@@@@@@@@@@@important !!!!!!!; W, ?* v3 `  L6 p4 S2 N& W, Y
sinceVC++ 2008, cl.exe will make ‘pData→m_pData[i-j].m_fClose’ anerror
7 W4 ~8 e5 a& i6 R3 g% _8 J" ?so,pass the high,low,open and close just from the function parameter ,that is use ‘ CALCPARAM’ struct7 A7 m7 u; _8 t% K1 V
pData->m_pData[i-j].m_fOpen// to use open , there is no way in using a varable for calculationoutside foxtrader
8 Y; A- u2 X( F9 A$ l/ DpData→m_pData[i-j].m_fHighto use high, g6 j% A7 H/ W$ {) ?, }
pData->m_pData[i-j].m_fLow
$ o* m. a0 k% E; n# H! |pData->m_pData[i-j].m_fClose
2 D! H, i( f- o3 Y+ C5 n* _m_pData= pointer to struc STKDATA$ J4 o: X! J; f4 O' M6 m, |! r
incalling C++ dll function- v8 G7 K2 I5 g( |. t
m_pDatais passed to pData (CALCINFO* pData . A CALCINFO* type pointer)
6 u3 N0 Q( z9 m: m; |* k1 d- T1 rtouse a single value in variable ‘High’
  T2 k; A+ h5 }# Z1 |$ {: h1 q' ]pData→m_pData[i-j].m_fHighto use high7 Y8 B6 T7 j( d3 b! @) I, E
constfloat* m_pfParam1; //调用参数1/pointer to variable parameter 1 / F- j( b7 I/ }! [; ~! b- w  A
constfloat* m_pfParam2; //调用参数2/pointer to variable parameter 2
& W6 _& ^+ T8 k  D% Zconstfloat* m_pfParam3; //调用参数3/pointer to variable parameter 3
8 z! t7 M- M0 L6 C2 x& c- Lconstfloat* m_pfParam4; 3 y5 N0 H" t) I8 w9 j
m_pfParam1,m_pfParam2, m_pfParam3, m_pfParam4 = pointer to caller function 的参数
( A* f" O' @! cpData→m_pfParam1= pointer to 第一个(序列)参数/ ~7 ?# \+ u9 T. V
pData→m_pfParam1[x]= 取用第一个(序列)参数的第x 个值
/ c% F, o1 w. B- ]1 Aconstfloat* cpParam = pData→m_pfParam1; =定义 cpParampointerto 第一个(序列)参数0 o; ~3 I9 N  O+ N0 d
cpParam[x] = 取用第一个(序列)参数的第x 个值' l8 R- m) U9 A- V; o& N! L
m_pResultBuf= 结果缓冲列. y5 Y+ ~7 a/ T  M* n3 N% F
pData→m_pResultBuf= pointer to 结果缓冲列* g1 s3 B: i$ c' `0 y# I
pData→m_pResultBuf[x] = 取用结果缓冲列的第 x个值
! u+ Y+ y1 E6 \" R0 l//////////////////////////////////////////comment0 `9 ]' S+ O! \( {8 [8 O4 P* N
//////////////////////////////////////////comment 注解3 K" j6 ~: b4 y+ A% b
constint m_nParam1Start; //统杅1衄虴宎弇离
' Z# d3 ^$ k7 ~2 Xconstfloat* m_pfParam1; //覃蚚统杅1: x* P2 e& {, |( o
constfloat* m_pfParam2; //覃蚚统杅2  t) |: u7 ]  c( i( e$ J
constfloat* m_pfParam3; //覃蚚统杅3/ [9 ?! C4 V( Y$ k
constfloat* m_pfParam4; //覃蚚统杅4,parameters must be <= 4
8 e; ^8 \" ]! `//const float* m_pfParam5; // parameters must be <= 42 }4 S; f0 R0 e$ D1 y/ a
//const float* m_pfParam6; . d5 s' v' V/ J, G& h3 n
//const float* m_pfParam7; 0 v5 Y! p8 j: B. `% W: u
//const float* m_pfParam8;
4 C  c1 L7 H6 x4 F/ \- p' _( w//pData->m_pfParam1 && pData->m_pfParam2 &&pData->m_pfParam3 && pData->m_nParam1Start>=0 &&
# |; z1 J) G8 p' Q4 \' d  n( `pData->m_pCalcParam[0].m_nParamStart>=0&& pData->m_pCalcParam[1].m_nParamStart>=0
8 {& O& a) V1 @# T: ?&&pData->m_pCalcParam[2].m_nParamStart>=0) 2 c6 z& k6 D  Q6 @
{
, l3 U5 @; J5 P" c1 wfloatfParam = *pData->m_pfParam4; //pointer ,pData->m_pCalcParam[3].m_nParamStart >= 0
5 ]+ v) |' D- Z9 h4 q, CintnPeriod = (int)fParam; //统杅1
* n# h$ k; e& `8 w' F! ^( `//const float* cpParam = pData->m_pfParam2; // cpParam = pointer to第一个序列参数,cpParam = 取用第一个序列参数的第i 个值
3 [+ s, E5 C9 f. U3 mconstfloat* cpParam1 =pData->m_pCalcParam[0].m_pfParam; // cpParam =pointer to 第一个序列参数,cpParam = 取用第一个序列参数的第i 个值* m' p/ k3 D; `; Y$ K& _
constfloat* cpParam2 =pData->m_pCalcParam[1].m_pfParam; // cpParam =pointer to 第一个序列参数,cpParam = 取用第一个序列参数的第i 个值
2 @$ x2 I/ }$ z( R/ a4 _. a- Qconstfloat* cpParam3 =pData->m_pCalcParam[2].m_pfParam; // cpParam =pointer to 第一个序列参数,cpParam = 取用第一个序列参数的第i 个值//parameters must be <= 41 J; ~2 y% }" O, M4 e5 g
//const float* cpParam4 =pData->m_pCalcParam[3].m_pfParam; //cpParam = pointer to 第一个序列参数,cpParam = 取用第一个序列参数的第i 个值
( n4 q: V, y" h2 a, ]//const float* cpParam5 =pData->m_pCalcParam[4].m_pfParam; //cpParam = pointer to 第一个序列参数,cpParam = 取用第一个序列参数的第i 个值0 @2 R) `/ A. r* R- G8 b" v
//m_pData = const struct pointer to struct STKDATA , pointer to structSTKDATA , 1 W4 T# S8 w  U$ ^
touse pData→m_pData[x].m_fClose
) n6 T5 U- [) q& g  p% ppData→m_pData[x]= | 1,2,3 , … , m_nNumParam | time_t m_time;
$ v+ T3 ~# q8 }& [: b|1,2,3 , … , m_nNumParam | float m_fOime_t
; v6 D4 G& f2 S# F# U5 @- ?|1,2,3 , … , m_nNumParam | float m_fHigh;8 v0 Z6 X! X+ ]* `
.. .
  K' [7 g. E7 `( A0 `8 `# c|1,2,3 , … , m_nNumParam | WORD m_wDecline;
# H# m/ r( v: C8 Fm_nNumParam= 数据high,close,open,low的长度
. Y/ b* w* _( w# Q( r9 U+ y; a+ G/ Jtouse high:2 K" \# D: X8 }5 O% b  H
pData→m_pData[x].m_fHigh
6 F7 v% d/ \4 T: C2 ycontentof struct STKDATA, ?6 A6 d; h: z( Y7 g: m
time_tm_time; //时间,UCT( `" U! P5 w$ H3 E: ~
floatm_fOpen; //开盘 open! M1 o! d' M3 R% t
floatm_fHigh; //最高 high
, ^' P0 W- i. ifloatm_fLow; //最低 low2 _, c; N  B/ [
floatm_fClose; //收盘 close1 ^' q. N, s! \4 J* n1 A
floatm_fVolume; //成交量 Volume  B3 t/ r- g" J- d) S, q0 `6 z
floatm_fAmount; //成交额 amount
$ ]# O3 A3 E, r/ Q+ m& _* N* J7 QWORDm_wAdvance; //上涨家数 仅大盘有效# y' O* N( b6 I
WORDm_wDecline; //下跌家数 仅大盘有效
& {+ H5 R+ x; o& J调用传递参数及传回结果
; w) A4 C, w( }& L调用传递参数
1 [; y3 ]) C* P4 w6 x(pData->m_pfParam1 && //参数1有效Param1exists
# B% ^1 s/ Q1 `) [/ m1 h5 O. T1 \pData->m_nParam1Start<0&& //参数1为常数% L: B: D, O& {- |% }6 z8 q) q
pData->m_pfParam2==NULL) //
( |: W1 Q- q# f+ s( \localprocedure 定义使用变数# u& L. u" C# S3 ]9 s
onstfloat* pValue = pData→m_pfParam1; //use constant参数1
) Z1 {* i  ?6 }, JintnFirst = pData->m_nParam1Start; //use 参数1效值起始位
& l5 S' u3 L. F) m) rfloatfParam = *pData->m_pfParam2; //use 参数2: }. z) \7 \% ^: z, w
intnPeriod = (int)fParam;
" Q4 |, p' x# S$ o传回结果
5 k( d% g. T6 ^$ tfTotal+= pValue[i-j];
7 }, Z$ W- J: D: j! e7 G# CpData->m_pResultBuf- ]' F0 j# ]7 p: j
//////////////////////////////////////////comment

评分

1

查看全部评分

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

本版积分规则

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

GMT+8, 2026-6-3 00:46 , Processed in 0.152133 second(s), 19 queries .

Powered by Discuz! X3.2 Licensed

© 2001-2013 Comsenz Inc.

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