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