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