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