【阳光飞狐__与财富同行】
标题:
飞狐交易师 (foxtrader) 连结 DLL 的方法
[打印本页]
作者:
ycng
时间:
2019-8-11 16:09
标题:
飞狐交易师 (foxtrader) 连结 DLL 的方法
许多年以前
,
我曾经在
+ v5 [! Z- d2 ` P( P+ m. @; q
理想公式区发布了
2 V6 X; u; M, B
"
; n7 I# R) [; n: @9 c
如何用
Foxtrader(
飞狐
)
连结
C++
动态程式库
DLL
及
80x86Macro Assembly (
组合语言
)
& v8 S8 K' u* W
"
9 n7 e& U" J, @; O |8 L$ L! @( k$ ?
! P% _; q- r! r& J. t5 b& \9 Y9 B0 ~
现在更新
foxtrader(
飞狐交易师
)
" @2 \6 ]; X# w5 T
连结
DLL
的方法
4 I% e2 J9 |- T
) q; S9 n i. }" @6 m
foxtrader- - > DLL (C++ and assembly) = ( foxfunc.h + foxfunc.cpp +pow10.asm )
% ?" R5 o2 C }0 Q* A: E# n. x, t/ G0 D
gauss- - > DLL (C++ and assembly) = ( foxfunc.cpp + meigj.asm )
! m3 ^! C/ W. A9 S9 c P7 J: J
gauss
只用到函数参数传递
,
所以使用新的
c++compiler,
不受影响
4 Q% b* ^7 H$ ~5 ]; m$ o2 t
foxtrader
的
foxfunc.h
宣告的结构型态
(struct)
在
2004vc++ 6.0
全部有效
! ~* `% v- j; W$ u/ x- [; |
% J% R: W( C3 O
也就是这五个结构都能用
# c! ]/ R5 S8 X
typedefstruct tagSTKDATA
" u' s! p- k3 ^- g/ t/ k
typedefunion tagSTKDATAEx
. P0 j5 e/ U; v" d& r6 R3 w
typedefstruct tagSPLITDATA
7 l+ R1 {+ @- c/ Y* K1 z) _5 L* b
typedefstruct tagCALCPARAM
* x) n0 x( c6 z; B' J0 r+ s
typedefstruct tagCALCINFO
5 W+ }1 {" l$ C
* c& K2 G) q0 Z8 w$ e
自
2008
年起
,vc++ 2008, vc++ 2010, vc++2017
对
struct
的编译
,
已经完全
c++
化
,
不再相容于
C
! d8 D: K, x9 m. H( z4 R
也就是这五个结构中
/ \( q7 B9 _/ S* s2 B: r
typedefstruct tagSTKDATA
2 y$ ^/ Q2 _% z, I
typedefunion tagSTKDATAEx
3 D2 N \) K; Q m$ q. @
typedefstruct tagSPLITDATA
8 `# |; F( |( I* x
typedefstruct tagCALCPARAM
6 S8 R* ]. ~' x9 \/ m
typedefstruct tagCALCINFO
9 u/ g' t ]; C! Y1 N
只有这两个可以用
4 M2 g: [3 D6 q/ [. s
typedefstruct tagCALCPARAM
) B4 d6 X" ^4 z3 M# P% R+ b
typedefstruct tagCALCINFO
. K) e7 Z2 @! ]/ E
值得庆幸的是
,
下面这个结构的函数参数传递个数可以有无数个
2 J! P8 ?5 s# P8 [9 F, s, U
typedefstruct tagCALCPARAM
8 B' R: C; Y) D: R
例如
:
在
foxtrader
中
6 ^2 r1 W2 N$ e) y
MA1:=MA(CLOSE,3);
5 I" z: [7 \" N; k
MA2:=MA(CLOSE,6);
% V( Y; m1 y+ b* G
MA3:=MA(CLOSE,12);
/ D4 ~5 t8 {5 n7 }
MA4:=MA(CLOSE,24);
9 C2 k2 h. P& g
MYBBI1:"MYFUNC2017@MYBBI"(MA1, MA2,MA3,MA4,MA3,MA4,5)*0.95,colorff00ff,linethick3; {2017 vc++ 15.0}
/ u1 Z4 w5 i \! j
其中
MYFUNC2017=MYFUNC2017.dll, MYBBI = MYFUNC2017.dll
中的
MYBBI
函数
,
这里
MYBBI
函数传递的参数共有
7
个
! t" F* Y+ c6 f6 d* x# D4 t" A& D) O
下面这两式计算结果相同
$ T4 B$ y. r% @; d, _
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
自行计算
}
% [: x0 F5 f% {: m7 x/ D
MYBBI1:"MYFUNC2017@MYBBI"(MA1, MA2,MA3,MA4,MA3,MA4,6)*0.95,colorff00ff,linethick3; {2017 vc++ 15.0 , dll
计算
}
: f; V; t7 w! j6 ~: k
其他例子
# v* d5 O4 I$ Y4 ]. _
oooq:="MYFUNC2008good@MYMACLOSE"(c,,c,c,6),colorffffff,linethick5;(---> pow10.asm)
: c2 i: F2 D. V% M! G6 o
oooq1:"MYFUNC2010@MYMAVAR"(ma(c,5),5),colorgreen,linethick5;
. k) D' N0 _5 }
其中
pow10.asm
里面有很多不同定义或宣告被注解不用
,
那是因为后来在逐步侦测法修改语码中才发现在
foxfunc.cpp
主程式中
,
下面这行错误
,
也就是新的
compiler
不再相容于
C,
因此在
pow10.asm
里面被注解不用的定义或宣告中
,
有些应该是可以用的
+ d+ B/ m4 _) F: V0 U- w( q* f
fTotal= pData->m_pData
.m_fClose; // @@@@@@@ vc++ 2010 cl.exe
使
pData->m_pData[i-j].m_fClose
错误
/ O+ K/ `9 g9 Q8 H, ~
3 w& G0 \1 v% ]/ ~6 F
' h' s5 i- |" |
////////////////////////////////////////////////////////foxfunc.h
# Z7 W( _5 W8 T% ^9 i, `: y2 Z
#ifndef
__FOXFUNC_H_INCLUDE
7 [6 _( r Z+ a" w3 _ f
#define
__FOXFUNC_H_INCLUDE
8 J; I5 H9 s7 I
/*
; V" V! I _ Q: f3 E1 e
飞狐交易师“
C
语言接口”扩展程序调用接口规范
V3.0
1 v9 b' b* a* D ?9 H; _- b
1.
本规范适用于飞狐交易师
V3.x
公式系统
.
# ?1 F( B3 h* c+ {1 F9 E1 T( P
2.
扩展函数用于实现系统函数不能实现的特殊算法
.
r. s4 z' R, B) M5 K1 z
3.
扩展函数用
windows32
位动态连接库实现
,
建议使用
MicrosoftVisual C++
编程
.
- ]. L5 b; \0 L- R1 F
4.
调用时在公式编辑器中写
"
动态库名称
@
函数名称
"(
参数表
)
即可
,
例如下面函数可以写为
"FOXFUNC@MYMACLOSE"(5)
7 s# H; R) A6 o2 Q- b; F: t4 c* A0 b
5.
动态连接库名称和函数名称可以自己定义
.
' Y! r4 |0 c1 l7 }' X1 a
6.
使用时必须将动态库拷贝到飞狐交易师安装目录下的
FmlDLL
子目录下使用
.
3 E5 r6 I6 X% `4 r3 e
*/
3 `, T6 m" p( u$ e3 K' z1 G( P _
#ifdef
__cplusplus
4 j6 s2 X* a: l& D3 W. q: g
extern"C"
; _& P- ?; m5 t, I. _+ d) C4 K0 \3 U
{
/ _/ F# Z; }" u( b8 X% n M
#endif
//__cplusplus
$ B. R$ q% k7 u1 p+ y
///////////////////////////////////////////////////////////////////////////
6 I* U B; K! S y" F9 `0 T
//
分析周期
* i9 R. i2 |) C4 a5 _
enumDATA_TYPE
8 p' t" ~ S& |2 [
{
; I: H( Y8 G$ J9 I; x4 T! ]
TICK_DATA=2,//
分笔成交
- p3 p' J4 G% r' |3 Y5 w# n
MIN1_DATA,//1
分钟线
1 o E% H- P) a
MIN5_DATA,//5
分钟线
9 H6 S8 w8 ^- P) Q* q) r# i+ D
MIN15_DATA,//15
分钟线
, ]: M; r- u0 Z& ?' h
MIN30_DATA,//30
分钟线
5 |$ B# {5 h1 P) P- U% e
MIN60_DATA,//60
分钟线
1 r& S: {4 C+ I9 r0 a% r
DAY_DATA,//
日线
& M; k' I% U' J
WEEK_DATA,//
周线
8 }5 ~$ S/ \9 P" u7 w/ E9 a n
MONTH_DATA,//
月线
1 G9 ^1 R1 F3 `8 Z
YEAR_DATA,//
年线
3 V3 Y( @: w! v1 m1 g" r& _
MULTIDAY_DATA,//
多日线
( w% r( p# R2 L% z2 c7 A
MULTIMIN_DATA//
多分钟线
/ l: Z, [# v0 t+ t! G
};
; }: P* s/ l$ p3 f, ]2 k% W4 R
///////////////////////////////////////////////////////////////////////////
, o8 k2 M5 A, S, J4 C! g# y6 @
//
定义取用股票基本数据的结构 只有
VC++ 6.0
能
compile
成功使用
- K; `# g9 V# P" f
typedefstruct tagSTKDATA
7 h& O) @; j! c% E
{
/ P, g8 l0 n. C
_tm_
; //
时间
,UCT
C4 q- f+ o( d6 k
floatm_fOpen; //
开盘
open
# u1 F J. |! ^6 g8 j. T+ V3 j
floatm_fHigh; //
最高
high
# t: v1 t7 [2 n3 M
floatm_fLow; //
最低
low
$ k& h ]6 g$ a. z+ l$ \4 H
floatm_fClose; //
收盘
close
' m2 @* S6 A! Q
floatm_fVolume; //
成交量
Volume
9 }# Z2 [) n) D, j! T6 w
floatm_fAmount; //
成交额
amount
: ^0 l/ w4 U! v7 c# e( r: M
WORDm_wAdvance; //
上涨家数 仅大盘有效
7 n& Y6 q9 L; L, [# S3 Z
WORDm_wDecline; //
下跌家数 仅大盘有效
% _$ L( p: \- M+ u
}STKDATA;
; K3 E9 ?/ x) b* K
定义
STKDATA
为
tagSTKDATA
的简单别名
,STKDATA
6 v5 g2 _2 w/ p- }: [
为真正方便使用名称
,tagSTKDATA
为定目的的过水名称
: b6 W* ?% V6 g
////////////////////////////////////////////////////////////////////////////
" N) _6 E9 r3 ?/ I6 A
//
扩展数据
,
用于定义取用分笔成交数据的买卖盘 的结构
; y0 x1 m. }9 e6 A- ^
typedefunion tagSTKDATAEx
* ~7 m# l9 `. ?0 u R. y$ n+ `
{
+ G' r$ @9 K3 L4 D
struct
2 W5 C: }9 j% i* z9 _+ J
{
3 s- {+ I1 o; B: b* {- V: S
floatm_fBuyPrice[3]; //
买
1--
买
3
价
floatm_fOpen; //
开盘
open
- H1 A$ J) l, T( S" O+ S
floatm_fHigh; //
最高
high
6 G; Y! M/ M& w
floatm_fLow; //
最低
low
0 x' h4 ~6 `5 h* B5 I0 d
floatm_fClose; //
收盘
close
: R* }6 s* @: e( O- T9 b+ L
floatm_fVolume; //
成交量
Volume
9 X& J |( |9 O. Q
floatm_fAmount; //
成交额
amount
$ G9 V2 ]- f% E/ _& u5 H
floatm_fBuyVol[3]; //
买
1--
买
3
量
) N7 ?- m; h3 C3 A! Y" f
floatm_fSellPrice[3]; //
卖
1--
卖
3
价
$ a, |4 P" ?" j: a% B' f
floatm_fSellVol[3]; //
卖
1--
卖
3
量
0 \- C, q" Q# i
};
$ t5 W& ]7 s. Q8 [- Q
floatm_fDataEx[12];
7 g/ Q, L* Q/ a3 C& l$ [! i" \
}STKDATAEx;
1 G' e$ R; T8 \' i# ?5 A [
////////////////////////////////////////////////////////////////////////////
) P" D+ D) i0 c
//
定义取用除权数据的结构
: I' i; o3 u$ G3 j7 P8 |
typedefstruct tagSPLITDATA
1 d8 b5 i* {- I. I7 L8 X% ~
{
4 A( H7 W' k3 ~0 {$ Y* F7 I7 ?4 X
time_tm_time; //
时间
,UCT
2 c+ X) y* i* P& s$ y# L) V' O
floatm_fHg; //
红股
. R6 n2 F f4 O% r/ h/ ^
floatm_fPg; //
配股
7 M( ^# I$ v- B9 I
floatm_fPgj; //
配股价
3 [6 x& {. ], p' ~% R
floatm_fHl; //
红利
# ?$ O1 i" {) ]; K6 S: L( z- i/ h
}SPLITDATA;
) S/ G4 P1 n, }6 j' \
/////////////////////////////////////////////////////////////////////////////
& v$ {1 \+ }% d
/*
财务数据顺序
(m_pfFinData
内容
)
k6 o2 t% c a+ |: s2 Z
序号内容
% ^1 Q; N s/ \+ ]5 D
0
总股本
(
万股
),
! c8 y: K8 g( R1 A3 G" j" t i m
1
国家股
,
, E: ^4 j# ?6 `$ G+ q1 j( i
2
发起人法人股
,
) e% F! r' u) E4 _& G, K+ t% e; x+ n
3
法人股
,
) ~7 R2 z! {9 f6 ]1 [ W& _
4B
股
,
/ a3 } H3 X( ^6 l! T
5H
股
,
6 W0 P0 E1 y7 v Q4 N% P
6
流通
A
股
,
9 }6 a# o0 C& W. H
7
职工股
,
/ u8 `1 H+ i# k6 G! ^- m& k, q
8A2
转配股
,
4 o; I( U; ^! R2 \% C" h
9
总资产
(
千元
),
8 d4 E& E* D" J
10
流动资产
,
! S7 J) d% ]: D# Y$ w
11
固定资产
,
1 n$ B$ w+ p6 m8 W! _' E
12
无形资产
,
% s u' }# Y6 V$ b8 W
13
长期投资
,
/ Q9 C( ]$ {1 F n
14
流动负债
,
2 M$ H" M1 S! `% X. F
15
长期负债
,
8 U$ D3 J1 o- h' g# k8 K, m
16
资本公积金
,
9 f. Q5 l0 N' _3 f1 A0 h
17
每股公积金
,
6 ^) P( h( }7 P
18
股东权益
,
_1 Q! M9 r! k
19
主营收入
,
6 o6 a2 `% o6 y
20
主营利润
,
9 G. ~# A3 M: U; `' ]' G1 F
21
其他利润
,
, S. R& Z8 b. P9 F+ \9 \) G- Z
22
营业利润
,
& e e; L3 S4 w" H' U! k& C
23
投资收益
,
1 V) r T, d& ~ e) O0 `
24
补贴收入
,
4 |% Y# w# g0 L$ [
25
营业外收支
,
8 ]& B. V! l! K4 M7 j0 p8 s2 ~( N
26
上年损益调整
,
, H: _; _/ ?% I' W" g
27
利润总额
,
/ J) c- F& N0 Y3 J
28
税后利润
,
0 |) C4 i( ~& K/ N
29
净利润
,
* V" h, }1 o( F
30
未分配利润
,
- ?& {7 G2 _& o1 q {9 _/ u, e
31
每股未分配
,
1 u. n; ?5 J. M
32
每股收益
,
) c* i/ i) V" {, V, n0 v
33
每股净资产
,
7 G; s3 O8 G0 I$ k. R, L, t
34
调整每股净资
,
1 q$ b) n, T( t: g
35
股东权益比
,
7 G' Z5 Q4 V8 O2 H5 O% }( ^
36
净资收益率
9 N9 z- L3 C: I* N' ^
*/
" G. g/ ~3 m) I+ n2 l* V3 k9 }: ~
/////////////////////////////////////////////////////////////
5 a' y H0 C0 A/ i5 N$ A# A
//
定义取用
caller
函数传递参数项 的结构
* Q# |; _5 k- ^5 ~! g% z( T
typedefstruct tagCALCPARAM
$ x4 v$ {! S% c4 s& h' ^, w
{
$ X1 g* _- L4 O3 N; a% M
union
, d9 f, s3 a& d4 Z' g0 X8 }; |
{
: t# ^- x W6 j+ b
constfloat* m_pfParam; //
指向序列参数的址标,指向一个浮点型数组
pointertofloat variable parameter / ex. c,h,l,o, co2...co2=(c+o)/2
& \; g9 L+ ]0 t/ z5 L& }; [2 ]
constfloat m_fParam; //
数值参数
valueof parameter
2 d5 T/ S. e6 y
};
! ?5 ?5 F, {, {! f$ R; P$ d! p
constint m_nParamStart; //
序列参数有效起始位置
thestart address of variable parameter / ex. c,h,l,o,co2.....
- Q! k& @' x2 E3 r' L5 I/ ^
}CALCPARAM;
+ b* T& E9 d. N$ v( F# U
/////////////////////////////////////////////////////////////////////////////
* v, Q5 Z7 S6 Q9 t4 P2 |) I3 \
//
定义全部取用址标 的总结构
(
各指标指向前述各结构以便取的各结构的数据
,
接口信息数据的结构
)
+ _% k/ ?; X5 `2 ]8 k; m" `9 M
typedefstruct tagCALCINFO
- `4 E8 Y- e" x( K3 { n& F
{
0 @$ h- d1 b$ d( t
constDWORD m_dwSize; //
结构大小
: n: B( ~2 K8 \6 ?" o
constDWORD m_dwVersion; //
调用软件版本
(V2.10: 0x210)
t. e! e3 r" @! r, d( k1 \. U z& a
constDWORD m_dwSerial; //
调用软件序列号
5 ?& k" ~& H$ c, b
constchar* m_strStkLabel; //
股票代码
j$ ~* O- x5 H- o* {' u8 h; z
constBOOL m_bIndex; //
大盘
3 {- g5 p; F; Q! q
constint m_nNumData; //
数据数量
(pData,pDataEx,pResultBuf
数据数量
)
数据长度
! Z' l, Q- F- b' `9 ^. C
constSTKDATA* m_pData; //
常规数据
,
注意
:
当
m_nNumData==0
时可能为
NULL
2 e9 L' i6 l: G1 ~1 c {" K+ _
constSTKDATAEx* m_pDataEx; //
扩展数据
,
分笔成交买卖盘
,
注意
:
可能为
NULL
$ w3 D5 L* q; ^7 a6 i N
constint m_nParam1Start; //
参数
1
有效起始位置
<0/ constant parameter >0 /variable parameter
" \% D4 L ?/ j" N' Z# ~7 R: c
constfloat* m_pfParam1; //
调用参数
1/pointer to variable parameter 1
9 x" u' p4 q% C% I( O& W2 I! b
constfloat* m_pfParam2; //
调用参数
2/pointer to variable parameter 2
5 ~+ k* T7 k6 u! h& c
constfloat* m_pfParam3; //
调用参数
3/pointer to variable parameter 3
6 J9 u4 Y6 v$ ?4 G0 C. B
constfloat* m_pfParam4; //
调用参数
4/pointer to variable parameter 4
) n4 L# \* H7 {+ g$ E4 j0 E
float*m_pResultBuf; //
结果缓冲区
* p. T$ L( S6 [2 o+ J
constDWORD m_dataType; //
数据类型
; \" K6 x3 o# {4 j& h: a6 Q
constfloat* m_pfFinData; //
财务数据
* ~" \$ J `! Y: n& G' O
//
以上与分析家兼容,所以沿用其结构和名称
. R5 R, S! R3 f
//
以下为飞狐交易师扩展
(fortagSTKDATAEx)
/ z8 s" M9 K* Z( t6 y7 E! X& v6 v3 P
constDWORD m_dwReserved; //
保留
! K1 ]! p, U: W2 ^
constint m_nNumParam; //
调用参数数量
, J+ z% a1 P; Y1 K @( o: ]+ m4 A
constCALCPARAM* m_pCalcParam; //
调用参数数组
5 g$ A! x. E' F/ [- D3 C h. V3 R5 J6 C7 y+ [
constDWORD m_dwReservedEx[4]; //
保留
" ^. f4 U9 g. G
char*m_strStkName; //
股票名称
8 d: p4 T0 h$ v, T, ^. ^2 W
SPLITDATA*m_pSplitData; //
除权数据
' c5 X) O) w( c- P y4 j g
intm_nNumSplitData; //
除权次数
2 P2 @5 u% d) L, P( a# a
}CALCINFO;
% x4 \" w7 ?" T, j) n
/*
! k( _' D6 ~* k8 p3 \
注
1:(
与分析家兼容
)
, |% p) }4 i: C# y" r5 @
1.
函数调用参数由
m_pfParam1--m_pfParam4
带入
,
若为
NULL
则表示该参数无效
.
8 |) X5 O' z$ K, p
2.
当一个参数无效时
,
则其后的所有参数均无效
.
. G, S& X t% S/ y2 Z( ]+ A, d4 d
如
:m_pfParam2
为
NULL,
则
m_pfParam3,m_pfParam4
一定为
NULL.
* Y7 p; o5 x4 |( X6 W9 R* N0 ~: F8 C
3.
参数
1
可以是常数参数或序列数参数
,
其馀参数只能为常数参数
.
0 l) J3 q/ e0 `- z% C$ [3 p
4.
若
m_nParam1Start<0,
则参数
1
为常数参数
,
参数等于
*m_pfParam1;
. Z& p/ W* ?8 w6 S7 P0 Z
5.
若
m_nParam1Start>=0,
则参数
1
为序列数参数
,m_pfParam1
指向一个浮点型数组
,
. g. n- b. v% t
数组大小为
m_nNumData,
数据有效范围为
m_nParam1Start
至
m_nNumData-1.
: S3 p) e( F& ]2 @: Z9 U
在时间上
m_pData[x]
与
m_pfParam1[x]
是一致的
9 w; J: h( e# [) X) E
注
2:(
飞狐交易师扩展
)
9 y2 N# F; z0 O& a- h
1.
该扩展结构使调用参数在技术上可以是无限数目的,且每个参数都可为数值或序列,由公式中实际的调用参数决定。
9 Q* T0 ~% V( v Y
2.CALCPARAM
结构用于带入参数信息和实际数据,
m_pCalcParam
数组大小为
m_nNumParam
,数据有效范围为
0
至
m_nNumParam-1.
# F; h' Y/ M0 a2 i, J% S3 V/ X( g
3.
按参数的顺序,
m_pCalcParam[0]
为第一个参数的数据,
m_pCalcParam[1]
为第二个参数的数据
...
,为了保持兼容,原
m_nParam1Start
、
m_pfParam1
等
5
个属性依然有赋值。
- V3 P" n' M( U7 V' \
4.
若
i
位置的参数为数值,取用
m_pCalcParam
.m_fParam.
# ^$ h# ] |7 o1 @, J4 @ x ~
5.
若
i
位置的参数为序列,取用
m_pCalcParam
.m_pfParam
,数组大小为
m_nNumData,
数据有效范围为
m_pCalcParam
.m_nParamStart
至
m_nNumData-1.
若
m_pCalcParam
.m_nParamStart<0,
则此数组中无有效数据。
9 _. V [1 q$ t
6.
由于可以调用多个序列,许多序列的计算可以先在公式中进行,然后作为调用的参数即可。
8 e( w$ o# }8 c0 |# P6 c6 _
7.
经此扩展,对分析家的
DLL
依然可以调用、兼容。
4 ^5 t6 k" u4 a) d% ]. A, V) O1 ]
*/
, h5 \& e, x+ W4 W
///////////////////////////////////////////////////////////////////////////////////
8 H, m( @% z1 a! G9 w: L
/*
函数输出
( C- ^! K( L: q) U; `
__declspec(dllexport)int xxxxxxxx(CALCINFO* pData);
: \3 f x: d% r8 a! q, G3 b
1.
函数名称需全部大写
.
4 R. p# {& F2 y3 k# t2 h
2.
函数必须以上述形式声明
,
请用实际函数名称替代
xxxxxxxx;
7 r( k$ Z$ J" t' Y2 I4 u
对于
C++
程序还需包括在
extern"C" { }
括号中
.
' J y1 p/ b7 t3 f, t
3.
函数计算结果用
pData->m_pResultBuf
带回
.
# v0 b' R' A" y: e6 R6 t- B: w
4.
函数返回
-1
表示错误或全部数据无效
,
否则返回第一个有效值位置
,
即
:
0 E( Z0 Z4 x, L, R- Q
m_pResultBuf[
返回值
]-- m_pResultBuf[m_nNumData-1]
间为有效值
.
* A4 g5 R$ _& P8 c5 u. p* x
5.
函数名称长度不能超过
15
字节
,
动态连接库文件名不能超过
9
字节
(
不包括扩展名
),
动态库名称不能叫
SYSTEM,EXPLORER
% E# \8 h9 t2 c
*/
! A y: M* s: D5 `, v* P1 N
//
示例函数
,
使用时用实际名称替换
8 N1 u% a& m U1 w
__declspec(dllexport)int WINAPI MYMACLOSE(CALCINFO* pData);
, r7 { J) w. P; T' C; a& S
__declspec(dllexport)int WINAPI SMOOTH(CALCINFO* pData);
7 Z7 a, ^0 n O, k. c
//__declspec(dllexport) int WINAPI MYMAVAR(CALCINFO* pData);
- t- M' q* L5 V/ e/ E% s. c6 }
__declspec(dllexport)int WINAPI MYBBI(CALCINFO* pData);
+ Z5 j1 K0 D, |! [) W, ?6 d' v! _, v) V
//WINAPI = _stdcall
1 U( P3 ]! r2 k4 f! U* U1 g3 \, v
#ifdef
__cplusplus
5 w6 j( p c: }* x% ]
}
/ V( \7 {+ X5 i& G- ?6 s
#endif
//__cplusplus
" }9 A% L, m, V" L: m! \+ N$ r4 ?9 y' b
#endif
//__FOXFUNC_H_INCLUDE
$ G3 H' N5 F/ H3 A
5 f$ u5 _5 k) F% i! Z. _# v
//////////////////////////////////////////comment
注解
' L( m" Q* d3 A
__declspec(dllexport)int WINAPI MYMAVAR(CALCINFO* pData)
2 y( ~; Z5 B- ^3 |
pData
是指向 址标总结构
CALCINFO
的 总址标
+ C2 b2 h; h3 Z, a$ o
取用第二个参数数值
floatfParam = *pData→m_pfParam2
& v" I( U& ~5 s+ D4 M6 N& Z
取用第一个序列参数的址标
constfloat* pValue = pData->m_pfParam1;
! j! n; \& L; `5 l0 V$ S
取用股票数据长度
intndata = pData→m_nNumData;
; @# n. {" P' k4 G" I( o" h+ L
第一个参数存在且为数值
pData->m_pfParam1&& pData→m_nParam1Start<0
1 z$ z) ^+ [* j4 H/ @" @! `
第一个参数存在且为序列
pData->m_pfParam1&& pData→m_nParam1Start>=0
9 x. k0 z3 q3 G% U; V
第一个及第二个参数存在且为序列
,
第三个参数不存在
pData->m_pfParam1&& pData->m_pfParam2 && pData->m_nParam1Start>=0&& pData->m_pfParam3==NULL
( n) _1 r9 g2 }) j
constfloat* cpParam = pData->m_pfParam1;
定义
cpParam
为第一个序列参数的址标
+ Z& Z2 H& H0 I* X8 o4 W& Y
取用股票数据结构
' b5 j. }. C( D5 F+ s0 E {" K
pData→m_nNumData=
变数数据长度
! J* Q7 l7 g! |$ b' y8 H2 \0 h
pData→m_pData= pointer to struc STKDATA
的址标
- V# z% O+ h: A4 f, R( f
pData→m_pData[x]
数据结构的第
x
个数据
9 ^; ?( H% s' K6 X' d
pData→m_pData[x].m_fHigh
数据结构的第
x
个数据中的
High
! x( w* {+ I8 g' E, [1 \
取用结果缓冲序列
* ?8 G2 y' X* K u8 y
pData->m_pResultBuf
. F8 |$ [2 I) \/ ]' h+ M1 H' L
取得第一个序列参数的起始序位
,
如
2,...5 , . 7...
) W# n# ~6 Q* o7 T( s; j
intnFirst = pData->m_nParam1Start;
, S6 m! D& U' C6 r) @
for( i = nFirst+nPeriod-1; i < pData->m_nNumData; i++ )
* C4 H; ^7 _9 d# S4 M: D
取得第二个数值参数的数值
3 M* @' q: M" G0 e! o
floatfParam = *pData->m_pfParam2;
& U1 s; i O: q! N! w' a5 N
intnPeriod = (int)fParam;
( ~& u" ~( L M7 c5 |# {/ I
取用第一个序列参数的址标
constfloat* pValue = pData→m_pfParam1;
% V% R) B, r' P7 z" g5 K% N
取用序列参数的单个直
pValue
" c! T( K. ^: E' [" @& F% |/ w
取用缓冲序列的单个值
pData->m_pResultBuf
8 P7 |8 x) s3 h
constCALCPARAM* m_pCalcParam; //
调用参数数组
" D- N: d- D6 [5 X
m_pCalcParam
为序列址标
,
指向各序列参数的指标
! s7 y7 Q% L3 G. G5 g
第一个序列参数
pData→m_pCalcParam[0]
9 b5 } k" y% Q9 I; T4 j
constfloat* m_pfParam; //
指向序列参数的址标
$ D: Q' L' W: r# R L; m
第一个序列参数的起始序位
pData->m_pCalcParam[0].m_nParamStart
2 l5 z Y0 D- X0 x+ A
第一个序列参数的址标
constfloat* pValue1 = pData→m_pCalcParam[0].m_pfParam;
- R. R' x! L- n7 g
取用第一个序列参数的单个直
pValue1
4 m# {; @/ h/ l
第二个序列参数
pData→m_pCalcParam[1]
' H! Y( M0 v4 X3 f; k/ w3 U& |
第二个序列参数的起始序位
pData->m_pCalcParam[1].m_nParamStart
1 ?9 i5 u" F5 e) A$ A
第二个序列参数的址标
constfloat* pValue1 = pData→m_pCalcParam[1].m_pfParam;
; P5 l- x1 |2 m+ l$ w4 L$ `, M
取用第二个序列参数的单个直
pValue2
2 M2 p% t: C6 F6 \
第三个序列参数
pData→m_pCalcParam[2]
- @) x+ I; c" x8 w+ ^" w& V
第三个序列参数的起始序位
pData->m_pCalcParam[2].m_nParamStart
% \! [* B3 h \/ s7 d P$ T
第三个序列参数的址标
constfloat* pValue1 = pData→m_pCalcParam[2].m_pfParam;
# E" y5 a0 E5 \# y5 \; g/ Z
取用第三个序列参数的单个直
pValue3
3 J: E/ p' z0 x
第四个序列参数
pData→m_pCalcParam[3]
. L1 G, E2 R* u; V1 t# \/ ?
第四个序列参数的起始序位
pData->m_pCalcParam[3].m_nParamStart
" D2 Z3 [* }0 h8 G- `% f
第四个序列参数的址标
constfloat* pValue1 = pData→m_pCalcParam[3].m_pfParam;
5 B3 N! i7 n; i* j
取用第四个序列参数的单个直
pValue4
, Q9 d; l' U! r$ U$ S2 u
如果有四个序列参数
,
则取用序位最高的那一个序位
* x/ R9 L" m- k: D; r( `* t, I
if( pData->m_pCalcParam[0].m_nParamStart >= 0 &&
9 z$ y* s% D' e& T6 G
pData->m_pCalcParam[1].m_nParamStart>= 0 &&
4 K& W9 z, C% U
pData->m_pCalcParam[2].m_nParamStart>= 0 &&
p8 q7 M6 P4 |* H! C
pData->m_pCalcParam[3].m_nParamStart>= 0 ) //4
个序列都含有效数值
; c2 x2 B5 x# \- C/ R2 C
{
! u1 `/ |* J3 Z
//
计算返回的序列的第一个有效值位置
4 [1 F+ d) i3 O( B# d/ U
intnFirst = pData->m_pCalcParam[3].m_nParamStart;//
已知返回的序列的第一个有效值位置与第
4
个序列一致
; A$ t& s4 x; L
//
若不知,则
3 H. C E0 A' y) [6 a' e' Z
/*
" V8 j; ^+ M) G3 G7 _/ z
intnFirst = pData->m_pCalcParam[0].m_nParamStart;
# B1 {( L9 `, ^0 G1 w
if( nFirst < pData->m_pCalcParam[1].m_nParamStart )
1 Z8 t! U0 v/ o
nFirst= pData->m_pCalcParam[1].m_nParamStart;
2 R H) r, R! p0 q" Z* N* T6 R
if( nFirst < pData->m_pCalcParam[2].m_nParamStart )
5 f. p- [$ h) G6 T( X" z
nFirst= pData->m_pCalcParam[2].m_nParamStart;
+ u3 T( D5 B' L5 y4 ]$ x& U2 `; `
if( nFirst < pData->m_pCalcParam[3].m_nParamStart )
( z D: N. U& H, P% x2 b1 j: a
nFirst= pData→m_pCalcParam[3].m_nParamStart;
0 k. ]3 x6 G& Q8 \5 q
constfloat* pValue1 = pData->m_pCalcParam[0].m_pfParam;
1 w! k! B) m/ c4 @+ n; Z
constfloat* pValue2 = pData->m_pCalcParam[1].m_pfParam;
. \2 ?- U! E6 [
constfloat* pValue3 = pData->m_pCalcParam[2].m_pfParam;
- a" y4 e, u2 U! c; K
constfloat* pValue4 = pData->m_pCalcParam[3].m_pfParam;
$ U" q D3 m5 l. `) m
//-------------------
1 |& `4 X7 ~1 q
floatm_fOpen; //
开盘
open
! b' ^- U! @+ q) h+ Y
floatm_fHigh; //
最高
high
) R: Q% l2 k, X: i0 n0 T# W6 ]0 J
floatm_fLow; //
最低
low
/ ]9 d/ u8 w$ d; [
floatm_fClose; //
收盘
close
' F @: A2 F9 z0 I ^( l( ~! _3 |$ k* X( ]
floatm_fVolume; //
成交量
Volume
/ S: M. r A* v
floatm_fAmount; //
成交额
amount
) d. z+ b+ W0 _ K- T
调用收盘据
9 u/ r5 U0 b# ~
pData→m_nNumData=
变数数据长度
5 [+ H6 ~1 ~$ x% [
pData→m_pData= pointer to struc STKDATA
- _$ O0 v4 w5 r' z$ b
pData→m_pData[x]
第
x
个数据
& Y# s7 R& L2 J2 L5 K$ z; K7 n
pData→m_pData[x].m_fHigh
第
x
个数据中的
High
8 h4 D6 j( D H6 ]
@@@@@@@@@@@important !!!!!!!
+ Y& Q! a Q. _+ x) D3 v
sinceVC++ 2008, cl.exe will make ‘pData→m_pData[i-j].m_fClose’ anerror
2 B4 C, H4 m3 u: G5 ^6 d
so,pass the high,low,open and close just from the function parameter ,that is use ‘ CALCPARAM’ struct
+ |- g# _" j6 Y" K- E% ]
pData->m_pData[i-j].m_fOpen// to use open , there is no way in using a varable for calculationoutside foxtrader
- @! _0 _1 ~. ^/ F; R! D1 B
pData→m_pData[i-j].m_fHighto use high
) I8 K& W4 B4 p) b& N6 I, Z
pData->m_pData[i-j].m_fLow
}3 E! l0 E. K0 |
pData->m_pData[i-j].m_fClose
) Q, [, `: a6 e6 Q% Z
m_pData= pointer to struc STKDATA
z- {8 T$ G9 |6 k1 B0 l6 Y
incalling C++ dll function
5 Q$ G( u# }. s* o( i7 D+ d
m_pDatais passed to pData (CALCINFO* pData . A CALCINFO* type pointer)
6 W9 B/ b5 U+ b% g* ~: w! X
touse a single value in variable ‘High’
# u" l k$ U3 J) H% B
pData→m_pData[i-j].m_fHighto use high
& [0 O/ H8 V: t9 R* S
constfloat* m_pfParam1; //
调用参数
1/pointer to variable parameter 1
' o( [3 R0 v! q* C
constfloat* m_pfParam2; //
调用参数
2/pointer to variable parameter 2
$ _5 a& s' y- Y6 s& m% w
constfloat* m_pfParam3; //
调用参数
3/pointer to variable parameter 3
( }" v* h: d/ O- d
constfloat* m_pfParam4;
4 A/ K/ {" C* s
m_pfParam1,m_pfParam2, m_pfParam3, m_pfParam4 = pointer to caller function
的参数
* r( N9 h7 _7 s! @! d m+ Q
pData→m_pfParam1= pointer to
第一个
(
序列
)
参数
; N, ?+ w3 k' F& k/ l
pData→m_pfParam1[x]=
取用第一个
(
序列
)
参数的第
x
个值
7 A) R+ p( U" h9 V1 U& v9 x
constfloat* cpParam = pData→m_pfParam1;
=定义
cpParam
为
pointerto
第一个
(
序列
)
参数
6 b/ [! s4 ]4 a! p4 U- Q5 w
cpParam[x] =
取用第一个
(
序列
)
参数的第
x
个值
! D: A. v1 p/ Z7 I
m_pResultBuf
= 结果缓冲列
4 @) ^' f4 `8 B/ T; x
pData→m_pResultBuf= pointer to
结果缓冲列
+ n1 S; X2 F6 s
pData→m_pResultBuf[x] =
取用结果缓冲列的第
x
个值
. E( n0 |# P6 P* a- R$ W6 x
//////////////////////////////////////////comment
- E+ K# H- f5 M# _ ~
//////////////////////////////////////////comment
注解
8 M- P5 t& S& h4 N
constint m_nParam1Start; //
统杅
1
衄虴宎弇离
& x* ]. t8 f9 R" k9 Q V
constfloat* m_pfParam1; //
覃蚚统杅
1
0 E- G% ^8 ]% ~0 o0 r
constfloat* m_pfParam2; //
覃蚚统杅
2
& s9 _! _" ]5 Y2 f p) y: i
constfloat* m_pfParam3; //
覃蚚统杅
3
3 R- S2 F& W0 E( O& h1 z% V+ [3 Z
constfloat* m_pfParam4; //
覃蚚统杅
4,parameters must be <= 4
: ~0 _4 F, a' @7 M2 o, A
//const float* m_pfParam5; // parameters must be <= 4
1 Y; ]. q: \, Z2 K5 j: l l5 h8 i- G
//const float* m_pfParam6;
' ^$ i: ]( ?& Q4 [ B$ X8 S
//const float* m_pfParam7;
' H9 L. J1 n( `# o) G! j$ t
//const float* m_pfParam8;
& L" {4 E0 o; |9 y( j! y2 ~9 d% T
//pData->m_pfParam1 && pData->m_pfParam2 &&pData->m_pfParam3 && pData->m_nParam1Start>=0 &&
. t3 g- h' u# H) Q$ H, H# r3 V# T
pData->m_pCalcParam[0].m_nParamStart>=0&& pData->m_pCalcParam[1].m_nParamStart>=0
5 _" e/ ~' n2 Y! a2 U
&&pData->m_pCalcParam[2].m_nParamStart>=0)
. g# M3 j# t& u# v* L
{
5 U J a1 {' p3 N N! \6 {
floatfParam = *pData->m_pfParam4; //pointer ,pData->m_pCalcParam[3].m_nParamStart >= 0
8 @! F ?3 @- P/ p6 j a
intnPeriod = (int)fParam; //
统杅
1
% d0 w3 K/ ]) y1 r
//const float* cpParam = pData->m_pfParam2; // cpParam = pointer to
第一个序列参数
,cpParam
=
取用第一个序列参数的第
i
个值
: r# ?% q. Z* D5 K8 J" g1 G/ L
constfloat* cpParam1 =pData->m_pCalcParam[0].m_pfParam; // cpParam =pointer to
第一个序列参数
,cpParam
=
取用第一个序列参数的第
i
个值
( O0 `: I) e* |; ]/ I( \8 a' Y
constfloat* cpParam2 =pData->m_pCalcParam[1].m_pfParam; // cpParam =pointer to
第一个序列参数
,cpParam
=
取用第一个序列参数的第
i
个值
! W Z, V5 X9 y, y# N" {
constfloat* cpParam3 =pData->m_pCalcParam[2].m_pfParam; // cpParam =pointer to
第一个序列参数
,cpParam
=
取用第一个序列参数的第
i
个值
//parameters must be <= 4
( ^- T* R1 K! J+ d' @# p R* z5 x
//const float* cpParam4 =pData->m_pCalcParam[3].m_pfParam; //cpParam = pointer to
第一个序列参数
,cpParam
=
取用第一个序列参数的第
i
个值
) f8 H( N2 `, Q$ i
//const float* cpParam5 =pData->m_pCalcParam[4].m_pfParam; //cpParam = pointer to
第一个序列参数
,cpParam
=
取用第一个序列参数的第
i
个值
0 F+ Z/ z( [7 X) H
//m_pData = const struct pointer to struct STKDATA , pointer to structSTKDATA ,
( p( P/ l" q1 {. o
touse pData→m_pData[x].m_fClose
$ L% J* W( F7 l/ A$ x% n2 g, q8 [- Q
pData→m_pData[x]= | 1,2,3 , … , m_nNumParam | time_t m_time;
3 L# k8 { N% w6 Z8 L/ t
|1,2,3 , … , m_nNumParam | float m_fOime_t
1 r/ E" @8 k6 d
|1,2,3 , … , m_nNumParam | float m_fHigh;
# b3 Y6 t+ p, {5 A! k7 I
.. .
' s, ?( T% s& @
|1,2,3 , … , m_nNumParam | WORD m_wDecline;
' N/ @( R3 S5 D2 d8 X3 Z2 \
m_nNumParam=
数据
high,close,open,low
的长度
" f! ^# C* ?7 \+ n1 ~9 ^
touse high:
. \& ?1 |; p( T/ h5 B
pData→m_pData[x].m_fHigh
2 L! ]& D0 @0 T$ }: h8 X5 `) L
contentof struct STKDATA
8 }/ o: o; l9 \+ Z' z
time_tm_time; //
时间
,UCT
9 x- |/ q9 I: w/ w/ |+ S' t0 `1 R
floatm_fOpen; //
开盘
open
. _7 ]. N9 C9 v8 u$ p1 C
floatm_fHigh; //
最高
high
2 e4 e# m. T0 w) r
floatm_fLow; //
最低
low
: f4 L4 t; @3 W1 o2 y7 m8 X
floatm_fClose; //
收盘
close
2 c) H0 x( |" l$ j' x+ x
floatm_fVolume; //
成交量
Volume
* c: R* y L: |5 w0 ^
floatm_fAmount; //
成交额
amount
. }9 ~5 i7 L8 @0 D- l, `
WORDm_wAdvance; //
上涨家数 仅大盘有效
4 K, F. M p! v/ x5 {) o) b+ r
WORDm_wDecline; //
下跌家数 仅大盘有效
" [7 g. a2 p+ _' w' ~4 V& V1 i
调用传递参数及传回结果
+ {, O% R5 z2 F! x6 f V
调用传递参数
' B9 \8 Z3 k5 H7 u' S
(pData->m_pfParam1 && //
参数
1
有效
Param1exists
7 Q9 W! G5 d6 y# U1 Z$ ^* L
pData->m_nParam1Start<0&& //
参数
1
为常数
( a% v4 T/ w7 e# Q7 B, ^
pData->m_pfParam2==NULL) //
4 @- S0 \# J; T3 d" H+ C( E- V) q! E
localprocedure
定义使用变数
/ K% _/ y+ X, `* S q+ N3 S% B
onstfloat* pValue = pData→m_pfParam1; //use constant
参数
1
# k: \, }2 t4 d) P* E$ C0 p
intnFirst = pData->m_nParam1Start; //use
参数
1
效值起始位
( T: E" _5 Y* K/ }
floatfParam = *pData->m_pfParam2; //use
参数
2
) ]' }' F5 r2 x; ^7 m& d* z$ d# `
intnPeriod = (int)fParam;
/ ^3 t/ J( S% a2 |+ ^7 B; G( a" Z9 d
传回结果
4 e8 n$ j! u( S/ X+ _
fTotal+= pValue[i-j];
/ f" [% q: a2 j0 O
pData->m_pResultBuf
* U3 D. g- N A, K- I! R# O1 H O! i
//////////////////////////////////////////comment
欢迎光临 【阳光飞狐__与财富同行】 (http://bbs.88158.cn/)
Powered by Discuz! X3.2