阳光飞狐

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

 找回密码
 手机注册

手机动态码快速登录

手机号快速注册登录

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

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

[复制链接]
跳转到指定楼层
1#
发表于 2019-8-11 16:09:40 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
许多年以前,我曾经在2 |" }3 N+ J% T. m, [! F
理想公式区发布了
1 [7 M5 P9 |1 c9 G' S' x; x" c"
' @4 V2 z( y6 X# m4 p" \$ m( B如何用 Foxtrader(飞狐)连结 C++动态程式库 DLL80x86Macro Assembly (组合语言)& H/ L* _6 |2 ?3 F$ ~
"
' x* P* M. l* z5 w
/ m( c* }% w& @% F现在更新foxtrader(飞狐交易师) 8 m$ Y6 T* J! D6 D4 K+ h5 D% P/ {( J
连结 DLL的方法/ Q; C1 p. i( O& G5 u1 \3 \

/ q' e; f; i/ U8 Y; \* u, Hfoxtrader- - > DLL (C++ and assembly) = ( foxfunc.h + foxfunc.cpp +pow10.asm )
. t2 U& i6 @8 _/ m. R1 @7 F! Bgauss- - > DLL (C++ and assembly) = ( foxfunc.cpp + meigj.asm )
! S" B+ l* T; C* L2 y7 V& _2 egauss只用到函数参数传递,所以使用新的 c++compiler, 不受影响
2 q$ J/ N) ]& o8 I1 J3 \' W: _foxtraderfoxfunc.h宣告的结构型态 (struct)2004vc++ 6.0 全部有效
. l! J/ e1 I+ E3 z, _# o6 o0 y& c/ y% g* U, `+ g' s9 n4 @# g
也就是这五个结构都能用
; v$ J" X3 z% vtypedefstruct tagSTKDATA ! ?9 Q4 g+ q) l- y
typedefunion tagSTKDATAEx! Z: P, K/ g8 B! ^- b* @! y
typedefstruct tagSPLITDATA
' D: _( f$ Z& ~typedefstruct tagCALCPARAM7 x, H: }' ~  g% O  L6 k
typedefstruct tagCALCINFO
. s; R# K: B: R8 }" Z
! l2 o4 b2 J3 h4 u/ l2 J3 X2008年起,vc++ 2008, vc++ 2010, vc++2017 struct的编译,已经完全 c++,不再相容于 C9 q. i  S! L  D& ^: \
也就是这五个结构中3 k2 }* ~  C* ~3 C8 @& ~
typedefstruct tagSTKDATA
6 b3 X) N2 W* [$ O; d, p; B  atypedefunion tagSTKDATAEx5 `3 J3 ~0 `# S8 A' [
typedefstruct tagSPLITDATA
$ n% G' j  f5 S  k% Otypedefstruct tagCALCPARAM
3 U3 n: u' w* v) U) Btypedefstruct tagCALCINFO' h/ R1 [( b4 P7 M0 R* n; p* L
只有这两个可以用
: Y( C2 c' o4 o# Z! A9 ?4 Mtypedefstruct tagCALCPARAM
8 v. d7 l" L, o( L) etypedefstruct tagCALCINFO  X+ w/ D5 o- N/ j& E* }1 f* u8 H
值得庆幸的是,下面这个结构的函数参数传递个数可以有无数个
2 f- z" A/ I+ I8 O* D% M8 Gtypedefstruct tagCALCPARAM  g9 L/ [3 I8 L; \/ U
例如:foxtrader3 ^. g1 V9 ~( B8 T
MA1:=MA(CLOSE,3);4 i' H% t3 p7 I7 N, N
MA2:=MA(CLOSE,6);
7 `% x- l) V  G0 PMA3:=MA(CLOSE,12);
% l$ U/ j5 X4 cMA4:=MA(CLOSE,24);
, w: i& V% I  y+ T% wMYBBI1:"MYFUNC2017@MYBBI"(MA1, MA2,MA3,MA4,MA3,MA4,5)*0.95,colorff00ff,linethick3; {2017 vc++ 15.0}
3 F% d$ t$ @/ \7 X其中MYFUNC2017=MYFUNC2017.dll, MYBBI = MYFUNC2017.dll 中的MYBBI函数,这里 MYBBI函数传递的参数共有 7
9 `# W* d7 `- o5 n+ G下面这两式计算结果相同
3 i! I7 o, [0 q. ]4 h/ yxx:(MA(CLOSE,3)+MA(CLOSE,6)+MA(CLOSE,12),MA(CLOSE,24),MA(CLOSE,12),),MA(CLOSE,24)/6*0.95,color0000ff,linethick2;{foxtrader 自行计算}
; x1 R) S' Y7 }0 U7 OMYBBI1:"MYFUNC2017@MYBBI"(MA1, MA2,MA3,MA4,MA3,MA4,6)*0.95,colorff00ff,linethick3; {2017 vc++ 15.0 , dll计算}
8 i1 f* @1 ]6 u4 T5 e; Z其他例子) {: n: H; j# C: ^! U
oooq:="MYFUNC2008good@MYMACLOSE"(c,,c,c,6),colorffffff,linethick5;(---> pow10.asm)- q$ b, ^( y4 c2 C
oooq1:"MYFUNC2010@MYMAVAR"(ma(c,5),5),colorgreen,linethick5;
6 C; ^5 J5 W. }' ], U% n/ u8 C其中pow10.asm里面有很多不同定义或宣告被注解不用,那是因为后来在逐步侦测法修改语码中才发现在foxfunc.cpp主程式中,下面这行错误,也就是新的 compiler不再相容于 C,因此在pow10.asm里面被注解不用的定义或宣告中,有些应该是可以用的0 R5 G0 x! [; f6 a
fTotal= pData->m_pData.m_fClose; // @@@@@@@ vc++ 2010 cl.exe 使pData->m_pData[i-j].m_fClose错误
) C- q6 [, N( B9 Y5 `
) u+ ~+ X6 i4 _/ G: V7 x& V- Y1 [- @/ {; Z
////////////////////////////////////////////////////////foxfunc.h
  ]4 X1 y6 O% r$ }* c& _* q#ifndef__FOXFUNC_H_INCLUDE
: H  D6 {/ M; V, B$ g#define__FOXFUNC_H_INCLUDE, o7 q* K4 W0 J8 e0 C- q
/*
" `6 m& I4 d0 ^" n$ ?# [: R飞狐交易师“C语言接口”扩展程序调用接口规范V3.0
1 \- n/ y( u5 o+ V, _1.本规范适用于飞狐交易师V3.x公式系统./ |. m: I% |  a1 c7 n9 Y
2.扩展函数用于实现系统函数不能实现的特殊算法.. v* ~6 S; r3 p: \1 G
3.扩展函数用windows32位动态连接库实现,建议使用MicrosoftVisual C++编程.
( z  v: u: o4 U$ N3 d4.调用时在公式编辑器中写"动态库名称@函数名称"(参数表)即可,例如下面函数可以写为"FOXFUNC@MYMACLOSE"(5)
- f3 J: e% S  y) a& k; y) p5.动态连接库名称和函数名称可以自己定义.$ A( x# y5 d( \  u1 h
6.使用时必须将动态库拷贝到飞狐交易师安装目录下的FmlDLL子目录下使用.
8 U% w$ O% J& m*/. P- i4 _( C* M* V* P+ b
#ifdef__cplusplus
6 o9 G8 Y) b) h) a8 D, yextern"C") X: q. }# `2 d
{
4 B8 k2 t# X- l3 D6 u( D# {1 k- j#endif//__cplusplus+ ]" b* P3 J, t% r
///////////////////////////////////////////////////////////////////////////
7 A. g1 }: [9 \//分析周期
$ ]6 \3 J( p' u$ Y  p/ q8 eenumDATA_TYPE0 g/ m  W! m2 `5 c" \' d9 M
{: h9 ?9 @6 j; h7 R* o) ?
TICK_DATA=2,//分笔成交# @9 y! Y) U  X  F2 C/ ]
MIN1_DATA,//1分钟线, X; F4 }: q$ M$ b' b% b* y
MIN5_DATA,//5分钟线 " w( }+ Y: }+ {1 L8 ~
MIN15_DATA,//15分钟线
# q  j8 `$ A  ?8 h- IMIN30_DATA,//30分钟线. j8 t" A4 P& D  y3 Q6 c
MIN60_DATA,//60分钟线
* m: ^; j) u0 K. H: ]DAY_DATA,//日线) X- K. V6 v8 c
WEEK_DATA,//周线
# o5 h  ^* ^* _1 o! W, f3 a! oMONTH_DATA,//月线
$ [$ K/ K: d; F5 O* g) TYEAR_DATA,//年线+ o1 L% x4 |1 S$ z4 E
MULTIDAY_DATA,//多日线
2 g( B- Q! ^, L* F) ^MULTIMIN_DATA//多分钟线
( N8 k8 L0 [- D  R) P" x' b};
2 [. e4 a5 i: W4 d$ E$ N///////////////////////////////////////////////////////////////////////////
  M9 |6 g2 T+ e; X* v6 {4 S//定义取用股票基本数据的结构 只有 VC++ 6.0 compile成功使用
+ F. v$ ~% ?8 [: `" N) `typedefstruct tagSTKDATA
. |1 |! r! J& ^$ I/ V8 q1 g5 r{/ t8 ~+ w$ Q) k, ?; Q# }; C
_tm_; //时间,UCT4 F8 Z4 e8 p1 O9 ~* j9 k
floatm_fOpen; //开盘 open$ M! O6 T  \) H! C
floatm_fHigh; //最高 high8 m# b3 M& y- @( [  J8 l7 z
floatm_fLow; //最低 low4 C8 P+ \4 x& W; H9 G# n* O
floatm_fClose; //收盘 close
0 t# R0 Z0 g0 z6 O6 p! h0 V, |  dfloatm_fVolume; //成交量 Volume5 h7 _' M' @0 J/ \5 L3 u; A
floatm_fAmount; //成交额 amount
0 ?: U; [& _! k; m# P% j1 F$ S& |! NWORDm_wAdvance; //上涨家数 仅大盘有效! Q7 Y8 C- z) l
WORDm_wDecline; //下跌家数 仅大盘有效
6 _$ l! V& ^8 H+ h, X}STKDATA;5 G- Z  W2 }9 Z; ]7 Q" |) m" Z
定义STKDATAtagSTKDATA的简单别名,STKDATA
5 q: O- p6 t3 ~# Z2 k为真正方便使用名称,tagSTKDATA 为定目的的过水名称, V$ K* {+ P4 c) f6 y, [
////////////////////////////////////////////////////////////////////////////
; ^6 g9 h  `' K9 J//扩展数据,用于定义取用分笔成交数据的买卖盘 的结构6 {- X3 q) F# ^" P1 k1 O4 E+ O
typedefunion tagSTKDATAEx& }2 G. J( R& q) I9 Q9 U% P
{
" x( V4 s4 B3 q4 istruct
0 q4 N2 F3 U0 t; l* q8 l( u2 r{' |) Q" `) @. u: F
floatm_fBuyPrice[3]; //1--3floatm_fOpen; //开盘 open
- O% ^4 l7 j, N% E5 hfloatm_fHigh; //最高 high
/ l7 g7 a% l8 A0 ffloatm_fLow; //最低 low* C6 @0 E* J$ r5 D( A! q7 \
floatm_fClose; //收盘 close
1 F( X( a: _  E/ l  s$ Afloatm_fVolume; //成交量 Volume
0 ]0 @3 b; ]6 Q1 a( h, l. o! Xfloatm_fAmount; //成交额 amount
8 [7 C* X5 d/ b! R. U* _  Kfloatm_fBuyVol[3]; //1--3
9 b9 v' r+ X( t0 k( n5 jfloatm_fSellPrice[3]; //1--3
$ Z. o/ j# l0 v* j( }( N: n9 ]1 Pfloatm_fSellVol[3]; //1--3: [: I; X% D/ }3 d: `0 V$ U' I& X
};, @* i7 I3 J0 p4 a) k/ |# Z
floatm_fDataEx[12];
# u. s7 ~$ \# B$ q/ S6 |}STKDATAEx;
3 s: a2 K0 N/ U9 _( V+ y8 e////////////////////////////////////////////////////////////////////////////
+ Q5 V) z9 Q. i/ B//定义取用除权数据的结构
- d  {( d1 p* o/ _typedefstruct tagSPLITDATA
, I# D! A  N, K$ n1 i% ]) }! K{
( A2 v% c3 I( K/ ptime_tm_time; //时间,UCT: A& d  i! s+ b7 j7 ?1 p
floatm_fHg; //红股
, P: I- {- S# x$ Y. U# Tfloatm_fPg; //配股
# M8 b: v' R) J, tfloatm_fPgj; //配股价" }$ i& E1 M  {/ K. ?
floatm_fHl; //红利, I2 `/ t& W4 `* c% s+ K
}SPLITDATA;
6 ?0 s9 f; U% C: @; y, b/////////////////////////////////////////////////////////////////////////////' S$ u  a; C3 B) I; u; I
/*财务数据顺序(m_pfFinData内容)4 q0 _1 ?6 \1 m" r7 F2 F- ^8 h5 m
序号内容% b. n" u: s, \# E" U
0总股本(万股)," y3 Z; b: k! p  r
1国家股,
# ^$ P  g/ t5 e, d8 E* C9 S' k, Z8 Z2发起人法人股,
5 u6 j: g( |# I# ^' }) O3法人股,: f3 S: [" x9 o' X& _
4B,3 {+ A' v6 d8 Y* b8 E. C- R7 f/ f8 a0 g
5H,
( H2 T3 P4 u* e2 b6流通A,
1 H. L( U, l( F3 s9 e7职工股,
6 o5 h! R9 ^9 N6 ]4 N7 u8A2转配股,
- z1 X4 I2 b# p2 Q- a) B9总资产(千元),& ^( y' O1 w5 ?% _% I
10流动资产,  M* b% q" `/ e& p9 d
11固定资产,
( u4 z  I. k0 u/ F! b12无形资产,: L* G) [/ j1 G* ~
13长期投资,. p- E. z( ?0 s1 t) b6 G  C
14流动负债,
8 r6 O' [1 I1 {0 V15长期负债,0 C% D) ?* x5 v
16资本公积金,  x! L' y$ v$ I8 b
17每股公积金,. i5 }* M" B5 a! t* M
18股东权益,
' }: B" ]  F# G$ q) L19主营收入,( T' A% p$ [" `# ~+ O4 z/ `! c. q
20主营利润,
( |; A) f" o3 p: C9 c# c21其他利润,8 e* z, f! f2 P
22营业利润,
/ L6 k1 G  Z" u6 f) T0 A9 \23投资收益,
! L& S  E: t1 }" h24补贴收入,: }% N3 K& p5 k) i) A9 {
25营业外收支,9 x) r3 t- d' p$ c5 B3 H
26上年损益调整,
; u* s) ^5 R& h! Y+ S  q- p27利润总额,
/ Z: \( S5 A  B. Q6 |28税后利润,1 h# Z$ I, S5 c% r' D
29净利润,  d0 x# v7 P! ^' K6 \
30未分配利润,. |; W/ ~/ S7 N: l' K, B
31每股未分配,9 W% b. v2 O) t  _
32每股收益,
) Y) {; Q5 [. e33每股净资产,
& w" s, y& {* Y, S34调整每股净资,+ Y6 b, a- o8 U- U
35股东权益比,+ D  D' W- W/ O  [1 }; d
36净资收益率
& c( c! ^9 K3 a5 e  C. g& `, E; O*/
0 f* H) _' O6 [1 Z* r/////////////////////////////////////////////////////////////7 L8 x) q6 _4 x/ b" k/ S
//定义取用caller函数传递参数项 的结构" Z: T1 }! B( G; _* k7 }
typedefstruct tagCALCPARAM
! C* {! }4 G1 U0 x{
: V; t- R+ p% qunion( J4 t4 S4 j& f1 t, \8 [# T3 j- M
{
2 _% ?! Q$ g, Y1 }3 f# V' Y& a' `' R1 @& \constfloat* m_pfParam; //指向序列参数的址标,指向一个浮点型数组pointertofloat variable parameter / ex. c,h,l,o, co2...co2=(c+o)/2
' v: w' }* ~' k) e2 @* J" Rconstfloat m_fParam; //数值参数 valueof parameter- L  ^: R  L" U7 N1 Y
};* e. R3 j0 A4 j5 d7 s. V
constint m_nParamStart; //序列参数有效起始位置thestart address of variable parameter / ex. c,h,l,o,co2.....  I* Y2 J! L8 w: p
}CALCPARAM;! r, ]) B1 L0 O5 B8 p9 |0 x
/////////////////////////////////////////////////////////////////////////////
3 ?% w0 {- u) l$ b: l* Z( D; o. A//定义全部取用址标 的总结构 (各指标指向前述各结构以便取的各结构的数据,接口信息数据的结构 )
( Z/ Q$ O; }  Z) I1 jtypedefstruct tagCALCINFO
& ~' k- e  B6 d2 q0 }{& l6 K# Q6 U3 y
constDWORD m_dwSize; //结构大小& c1 O& n. Z5 M& T/ s# I
constDWORD m_dwVersion; //调用软件版本(V2.10: 0x210)
2 j9 Z7 m  t7 `8 `, }8 U3 {constDWORD m_dwSerial; //调用软件序列号
" z1 m8 L5 G# }; U, Xconstchar* m_strStkLabel; //股票代码
! k4 s, T- u& d+ L( econstBOOL m_bIndex; //大盘5 B$ J) e, K! z+ ^1 z0 i
constint m_nNumData; //数据数量(pData,pDataEx,pResultBuf数据数量)数据长度
5 l4 e% y8 }6 E/ Q( @$ econstSTKDATA* m_pData; //常规数据,注意:m_nNumData==0时可能为NULL
: q) _: l$ |+ uconstSTKDATAEx* m_pDataEx; //扩展数据,分笔成交买卖盘,注意:可能为NULL/ H8 U0 ^5 P: h. a3 w
constint m_nParam1Start; //参数1有效起始位置<0/ constant parameter >0 /variable parameter
( X2 ?  l9 `" N' tconstfloat* m_pfParam1; //调用参数1/pointer to variable parameter 1   p2 O" t$ d. v0 ]; q
constfloat* m_pfParam2; //调用参数2/pointer to variable parameter 2
. j( A5 [4 _! s) N- K* econstfloat* m_pfParam3; //调用参数3/pointer to variable parameter 3% r& q: H: l) c* r& ^- U/ [
constfloat* m_pfParam4; //调用参数4/pointer to variable parameter 40 m2 M/ f1 g4 ], g
float*m_pResultBuf; //结果缓冲区& h' @( Y5 ~  b
constDWORD m_dataType; //数据类型; y' C  W6 C/ ]% S4 z! ~+ Y2 N
constfloat* m_pfFinData; //财务数据" X# R* ^0 y; s4 M$ x- _
//以上与分析家兼容,所以沿用其结构和名称
0 x% z; ]. Q* z- [4 T9 J//以下为飞狐交易师扩展(fortagSTKDATAEx)" D3 X+ L; |- x; u
constDWORD m_dwReserved; // 保留3 d; c. J7 Q* w/ f2 R
constint m_nNumParam; // 调用参数数量) ]" @9 z7 a! q
constCALCPARAM* m_pCalcParam; // 调用参数数组
" |2 w+ q) _1 m% S8 cconstDWORD m_dwReservedEx[4]; // 保留' }+ V8 W7 Q+ L, M7 ?1 S
char*m_strStkName; //股票名称
5 |4 j' O8 }3 kSPLITDATA*m_pSplitData; //除权数据: N; O7 b" K, f7 Q7 A' \
intm_nNumSplitData; //除权次数7 w! `* x( X  K$ ]9 @6 k
}CALCINFO;( _: F" `9 N8 ?
/*
$ _9 M) m4 `" N( c1:(与分析家兼容)
0 c& Z1 G" k; j. w1.函数调用参数由m_pfParam1--m_pfParam4带入,若为NULL则表示该参数无效.. H1 P4 `% E( r' n- R' R' d- w  T
2.当一个参数无效时,则其后的所有参数均无效.9 {( a1 O- J2 j2 d, a
:m_pfParam2NULL,m_pfParam3,m_pfParam4一定为NULL.9 h4 n8 N/ [' n3 ~! e9 _) p
3.参数1可以是常数参数或序列数参数,其馀参数只能为常数参数.
8 c5 e7 g' s5 _, f# @3 T- [4.m_nParam1Start<0,则参数1为常数参数,参数等于*m_pfParam1;
* R! l& o' v6 o- u5.m_nParam1Start>=0,则参数1为序列数参数,m_pfParam1指向一个浮点型数组,* O7 s2 n, v9 y- ^/ A+ T5 H; H9 y/ F$ M
数组大小为m_nNumData,数据有效范围为m_nParam1Startm_nNumData-1.' ^6 Y* w: s& @+ s
在时间上m_pData[x]m_pfParam1[x]是一致的9 N. h4 W2 w' o8 f& V4 [
2:(飞狐交易师扩展)
: G; Z5 Q) d; {$ O5 U, y& W: [1.该扩展结构使调用参数在技术上可以是无限数目的,且每个参数都可为数值或序列,由公式中实际的调用参数决定。
* ]) ~2 q, u7 X+ P7 l2.CALCPARAM结构用于带入参数信息和实际数据,m_pCalcParam数组大小为m_nNumParam,数据有效范围为0 m_nNumParam-1.
! [+ C+ }& N1 g4 a" A  W3.按参数的顺序,m_pCalcParam[0]为第一个参数的数据,m_pCalcParam[1]为第二个参数的数据...,为了保持兼容,原m_nParam1Startm_pfParam15个属性依然有赋值。2 Q" `* U4 r6 i9 J
4.i位置的参数为数值,取用m_pCalcParam.m_fParam.
3 T1 W+ F8 H1 ~& y5.i位置的参数为序列,取用m_pCalcParam.m_pfParam,数组大小为m_nNumData,数据有效范围为m_pCalcParam.m_nParamStartm_nNumData-1.m_pCalcParam.m_nParamStart<0,则此数组中无有效数据。2 P) D# s* W1 {+ X2 C
6.由于可以调用多个序列,许多序列的计算可以先在公式中进行,然后作为调用的参数即可。
2 i* k, l% U1 v0 r) L7.经此扩展,对分析家的DLL依然可以调用、兼容。
% t5 [3 [" p7 D6 q3 f# d. |+ K*/
* \$ A- Q& o% q* W///////////////////////////////////////////////////////////////////////////////////5 s  t  w' x9 ?2 y/ U) e
/*函数输出% Z/ m! N" ?! I: a7 v" ^: [6 M  b
__declspec(dllexport)int xxxxxxxx(CALCINFO* pData);+ Q" ~3 M. x8 s+ E. \/ z: H8 s
1.函数名称需全部大写.. o+ h6 h5 L' g% n
2.函数必须以上述形式声明,请用实际函数名称替代xxxxxxxx;
8 T. r. z: [. I( U: N3 ]对于C++程序还需包括在extern"C" { } 括号中.
. E) D: C* g4 l2 u$ H6 P3.函数计算结果用pData->m_pResultBuf带回.
, T2 Y+ P. ^& u# n! M$ [- _5 s4.函数返回-1表示错误或全部数据无效,否则返回第一个有效值位置,:4 g6 g. U" `' N; `1 \
m_pResultBuf[返回值]-- m_pResultBuf[m_nNumData-1]间为有效值.8 E3 q$ T$ n& b& C4 b; n4 ^
5.函数名称长度不能超过15字节,动态连接库文件名不能超过9字节(不包括扩展名),动态库名称不能叫SYSTEM,EXPLORER
# f, ]2 E0 {/ s/ x# P3 {*/
/ h& `2 U" H) i3 \$ E: h) g8 p//示例函数,使用时用实际名称替换; s( ~! |% }+ r0 `" Q7 W
__declspec(dllexport)int WINAPI MYMACLOSE(CALCINFO* pData);1 }$ t1 K0 |  ]" U* L% e8 X
__declspec(dllexport)int WINAPI SMOOTH(CALCINFO* pData);# s/ Z) Z$ j) [# i% ?6 C
//__declspec(dllexport) int WINAPI MYMAVAR(CALCINFO* pData);6 Y9 P0 _0 d4 _
__declspec(dllexport)int WINAPI MYBBI(CALCINFO* pData);
& ?( k1 B7 e3 C" n2 Y( b( P. X3 @) B//WINAPI = _stdcall: m% r4 \8 R$ w: ^0 \6 k2 a. {
#ifdef__cplusplus. {. q% X' {9 @6 `) ]$ U2 h6 ?
}
' |9 K5 ~/ W) @5 b#endif//__cplusplus% k& I  V+ J+ C( P3 w
#endif//__FOXFUNC_H_INCLUDE! g2 k2 L) W; y' Y: i; k
0 N/ u( Z& N9 G4 g( o. A. b
//////////////////////////////////////////comment 注解: L: p* f) F7 E1 `7 x4 u
__declspec(dllexport)int WINAPI MYMAVAR(CALCINFO* pData)
" q) s) |0 @: E: C. jpData是指向 址标总结构 CALCINFO的 总址标! S6 X6 k- r3 p. Q; Y# R
取用第二个参数数值floatfParam = *pData→m_pfParam2 9 W( |  }* [9 f- A* m9 E/ s6 R' c# i
取用第一个序列参数的址标constfloat* pValue = pData->m_pfParam1;
1 }5 I" Z2 H' ?取用股票数据长度intndata = pData→m_nNumData;! N2 W. q5 G, A
第一个参数存在且为数值pData->m_pfParam1&& pData→m_nParam1Start<0
% ?- {1 O& |5 e% v. W* A第一个参数存在且为序列pData->m_pfParam1&& pData→m_nParam1Start>=09 a1 \# `0 l2 L7 \4 c
第一个及第二个参数存在且为序列,第三个参数不存在pData->m_pfParam1&& pData->m_pfParam2 && pData->m_nParam1Start>=0&& pData->m_pfParam3==NULL
1 y$ m) V' s! m+ ]constfloat* cpParam = pData->m_pfParam1; 定义cpParam为第一个序列参数的址标- {8 v; [8 t+ a3 s; K  W
取用股票数据结构" }! n; D6 |& t% R! D
pData→m_nNumData= 变数数据长度, t" p% B8 i; J( I
pData→m_pData= pointer to struc STKDATA 的址标
7 D  A6 m, l, v! X. G; B5 S" {pData→m_pData[x]数据结构的第x个数据7 `& n. e: _( h
pData→m_pData[x].m_fHigh数据结构的第x个数据中的 High
3 i0 E  U/ Q+ ^! p8 U! Z! v5 t+ S  G取用结果缓冲序列
* h  w1 W+ C6 `1 a6 }- J- bpData->m_pResultBuf
0 k7 ^' @5 F8 G3 e+ W+ F0 j取得第一个序列参数的起始序位,2,...5 , . 7.../ S. T1 z" n  A
intnFirst = pData->m_nParam1Start; + ~* A5 l+ J7 k# L+ o# D& X
for( i = nFirst+nPeriod-1; i < pData->m_nNumData; i++ )
' K* {5 I5 W, w# t取得第二个数值参数的数值
1 I( j8 \* L$ a/ w7 X9 nfloatfParam = *pData->m_pfParam2; : {) o7 a& _% A  O$ g
intnPeriod = (int)fParam;
, G1 I$ C7 ]0 K: j+ a* N取用第一个序列参数的址标constfloat* pValue = pData→m_pfParam1;) F* M( h/ a  ]+ B
取用序列参数的单个直pValue
! b  I0 y) F3 C- c, t取用缓冲序列的单个值pData->m_pResultBuf
/ |9 C. _! D0 H7 S* p( HconstCALCPARAM* m_pCalcParam; // 调用参数数组1 K9 \6 E: o/ e6 \) K' A& x
m_pCalcParam为序列址标,指向各序列参数的指标2 `" k* p  I' [7 t
第一个序列参数pData→m_pCalcParam[0]+ [1 ~# P/ w2 L& f; ~) J. `: E
constfloat* m_pfParam; //指向序列参数的址标
& q& h- Z  f. `" k& M5 R第一个序列参数的起始序位pData->m_pCalcParam[0].m_nParamStart& Y+ Q- y2 L7 j; d
第一个序列参数的址标constfloat* pValue1 = pData→m_pCalcParam[0].m_pfParam;9 i: _8 {6 Y1 ^0 ]; N0 }/ Q
取用第一个序列参数的单个直pValue1
2 A7 }7 f$ P6 L' D2 z第二个序列参数pData→m_pCalcParam[1]
4 n2 w+ K+ o& o4 {第二个序列参数的起始序位pData->m_pCalcParam[1].m_nParamStart4 q- F* V) D0 x, h1 e( R
第二个序列参数的址标constfloat* pValue1 = pData→m_pCalcParam[1].m_pfParam;5 r7 F; g' x* w+ t& S
取用第二个序列参数的单个直pValue2) n" E5 \3 l' u1 _: d! P
第三个序列参数pData→m_pCalcParam[2]
9 L4 \: \% b0 U# a第三个序列参数的起始序位pData->m_pCalcParam[2].m_nParamStart( C! r" Q" v+ i. k- a1 c
第三个序列参数的址标constfloat* pValue1 = pData→m_pCalcParam[2].m_pfParam;  A6 {9 @6 P  z
取用第三个序列参数的单个直pValue3
7 Z- O3 y8 e9 t; h第四个序列参数pData→m_pCalcParam[3]/ d7 C& B4 F  A9 d
第四个序列参数的起始序位pData->m_pCalcParam[3].m_nParamStart
# h; i7 @2 L. P$ A& N  |& |1 Z第四个序列参数的址标constfloat* pValue1 = pData→m_pCalcParam[3].m_pfParam;! o7 \+ U- T7 R* M; c( a
取用第四个序列参数的单个直pValue4& z, ], m; R4 }9 ~; a( Q$ ?9 o
如果有四个序列参数,则取用序位最高的那一个序位
# `1 y5 g( d$ r7 Wif( pData->m_pCalcParam[0].m_nParamStart >= 0 &&* P1 Y5 o* e2 c+ Y" |. Q3 e4 ~
pData->m_pCalcParam[1].m_nParamStart>= 0 &&: n' `0 ~$ y- h% ]
pData->m_pCalcParam[2].m_nParamStart>= 0 &&
/ y5 t5 R: F" y! B' U( ypData->m_pCalcParam[3].m_nParamStart>= 0 ) //4个序列都含有效数值" ~' q7 ]8 A; a5 u. F
{
3 S, P! S4 P9 i% T. Y1 V2 ?3 `//计算返回的序列的第一个有效值位置: l3 q2 |% Q9 h7 R! R: L9 J6 y
intnFirst = pData->m_pCalcParam[3].m_nParamStart;//已知返回的序列的第一个有效值位置与第4个序列一致* B6 y# {5 [/ K+ D. [
//若不知,则
+ E" n; h: U: r- y. o  f/*' z# G& D8 O. K. J% f9 c
intnFirst = pData->m_pCalcParam[0].m_nParamStart;
- o8 G) g- ?9 G7 ~, H6 c1 {( f7 oif( nFirst < pData->m_pCalcParam[1].m_nParamStart )
# l. u* D; {! b" OnFirst= pData->m_pCalcParam[1].m_nParamStart;
$ }) t: e, \1 B  `- B6 J, B) Jif( nFirst < pData->m_pCalcParam[2].m_nParamStart ) . m# u3 I8 W" ^0 R2 l
nFirst= pData->m_pCalcParam[2].m_nParamStart;
4 O+ b0 ^1 g& q% {2 oif( nFirst < pData->m_pCalcParam[3].m_nParamStart ) 6 Y; H# L; W3 Y) f* s& R
nFirst= pData→m_pCalcParam[3].m_nParamStart;; v$ j# H, x) a6 o( M1 D: e( j
constfloat* pValue1 = pData->m_pCalcParam[0].m_pfParam;, m4 }' i4 v+ d) l5 h. I$ Y* |
constfloat* pValue2 = pData->m_pCalcParam[1].m_pfParam;. g, f" s- J( U3 }
constfloat* pValue3 = pData->m_pCalcParam[2].m_pfParam;
( }7 @+ B1 t# N" x$ E/ Zconstfloat* pValue4 = pData->m_pCalcParam[3].m_pfParam;3 X$ ?0 T) z0 O* f& A5 C
//-------------------; s0 t5 \; \2 S6 `5 b" \
floatm_fOpen; //开盘 open0 b5 w: J- v; U$ ^1 L9 a
floatm_fHigh; //最高 high
# x. @' g1 n. C% w( D, Kfloatm_fLow; //最低 low
1 A  }' u7 J! i0 Bfloatm_fClose; //收盘 close
; J; i  e+ U( ]0 H( `! Xfloatm_fVolume; //成交量 Volume% [$ C0 o/ p& J/ ^) {0 B8 ~
floatm_fAmount; //成交额 amount! Q: P* d, v& k1 @+ o1 K% k/ q
调用收盘据
# i" q8 j3 U2 x1 Y" }$ |pData→m_nNumData= 变数数据长度6 _, z0 m3 m9 k& g! f. d
pData→m_pData= pointer to struc STKDATA
, D' v: b3 C( b2 ?  cpData→m_pData[x]x个数据( q! K/ i( w; N2 D) b. y# c, I
pData→m_pData[x].m_fHighx个数据中的 High" W' A) L$ J$ t) m0 w
@@@@@@@@@@@important !!!!!!!8 x8 X3 y9 n/ q
sinceVC++ 2008, cl.exe will make ‘pData→m_pData[i-j].m_fClose’ anerror
  D) h2 D  b2 }. @. O  |& b* \- `so,pass the high,low,open and close just from the function parameter ,that is use ‘ CALCPARAM’ struct
8 o% S! F' n8 K% p7 a* BpData->m_pData[i-j].m_fOpen// to use open , there is no way in using a varable for calculationoutside foxtrader
0 t: h( E0 y0 ^% gpData→m_pData[i-j].m_fHighto use high6 q2 S/ K  m7 o4 C4 X) W+ A
pData->m_pData[i-j].m_fLow: I$ z/ C; e( S6 m
pData->m_pData[i-j].m_fClose9 h/ [# n  q$ g7 j
m_pData= pointer to struc STKDATA4 Y, c! ~4 q1 o) I( e6 T
incalling C++ dll function
+ |5 V9 w3 n; H: d  p+ \- T% H$ ~m_pDatais passed to pData (CALCINFO* pData . A CALCINFO* type pointer)
: J% c) x* W+ b, W- Ytouse a single value in variable ‘High’3 c; [  I& u- m* Z
pData→m_pData[i-j].m_fHighto use high/ V. P2 C: x0 u: w" }
constfloat* m_pfParam1; //调用参数1/pointer to variable parameter 1
" k+ r% t8 F# z/ Q; jconstfloat* m_pfParam2; //调用参数2/pointer to variable parameter 2
6 c( s0 U( U$ R& _  i- X, Mconstfloat* m_pfParam3; //调用参数3/pointer to variable parameter 3' E& `$ w8 |& u% x
constfloat* m_pfParam4;
- F& E; Y1 J# ~2 y' L+ bm_pfParam1,m_pfParam2, m_pfParam3, m_pfParam4 = pointer to caller function 的参数
, [7 I3 V0 D/ f2 gpData→m_pfParam1= pointer to 第一个(序列)参数3 H+ m4 D# f" X/ Q1 ?% d. e; |
pData→m_pfParam1[x]= 取用第一个(序列)参数的第x 个值
8 U0 g/ Z8 M" @. Y& \constfloat* cpParam = pData→m_pfParam1; =定义 cpParampointerto 第一个(序列)参数9 {* o$ [; ?& w* e( S
cpParam[x] = 取用第一个(序列)参数的第x 个值
: a( J6 F+ V, J4 `7 s' V% dm_pResultBuf= 结果缓冲列; g$ W! M' x8 X/ @7 D2 D
pData→m_pResultBuf= pointer to 结果缓冲列
  s- @7 d# {  ?& ]1 g% O' h, e, J! jpData→m_pResultBuf[x] = 取用结果缓冲列的第 x个值5 }+ F( J" s4 R
//////////////////////////////////////////comment: O1 n/ M/ V7 D8 A4 u
//////////////////////////////////////////comment 注解
; y6 @! C; n7 B+ |constint m_nParam1Start; //统杅1衄虴宎弇离) _4 m( `: k5 L. S! R
constfloat* m_pfParam1; //覃蚚统杅13 n% E3 v9 g: J
constfloat* m_pfParam2; //覃蚚统杅2
: k: x7 g& n/ q4 h& c7 D  c! econstfloat* m_pfParam3; //覃蚚统杅3
; g- ]+ A) U2 f' ~1 B8 ]constfloat* m_pfParam4; //覃蚚统杅4,parameters must be <= 4
3 E& G& f7 R% D) ^) Y//const float* m_pfParam5; // parameters must be <= 46 @  x+ d) a& _! S5 q3 V
//const float* m_pfParam6;
& X2 ]- O* s3 l* B1 N# G% N& Z//const float* m_pfParam7; ) m% y/ T+ N9 i4 x* H9 n8 M) ~
//const float* m_pfParam8;
1 i" B; J" O" r% X( ~( [( Z, A, C//pData->m_pfParam1 && pData->m_pfParam2 &&pData->m_pfParam3 && pData->m_nParam1Start>=0 &&
$ }) v# s: U9 {2 j. `7 w' CpData->m_pCalcParam[0].m_nParamStart>=0&& pData->m_pCalcParam[1].m_nParamStart>=0+ L8 I5 l$ _5 t  [) n
&&pData->m_pCalcParam[2].m_nParamStart>=0)   m* E3 p, r( o. }( A( d
{% {. G, Y9 T* r. B+ O3 G* O$ E
floatfParam = *pData->m_pfParam4; //pointer ,pData->m_pCalcParam[3].m_nParamStart >= 0+ n6 z/ n; l) H) t- k
intnPeriod = (int)fParam; //统杅1
$ r( z! N( D, l, [$ K: M//const float* cpParam = pData->m_pfParam2; // cpParam = pointer to第一个序列参数,cpParam = 取用第一个序列参数的第i 个值
, M5 H+ e7 f) g$ D1 U) Sconstfloat* cpParam1 =pData->m_pCalcParam[0].m_pfParam; // cpParam =pointer to 第一个序列参数,cpParam = 取用第一个序列参数的第i 个值7 s& t6 h0 H; s9 ?( ^; u
constfloat* cpParam2 =pData->m_pCalcParam[1].m_pfParam; // cpParam =pointer to 第一个序列参数,cpParam = 取用第一个序列参数的第i 个值- w0 g2 ~5 _7 `1 j% c6 A- Q
constfloat* cpParam3 =pData->m_pCalcParam[2].m_pfParam; // cpParam =pointer to 第一个序列参数,cpParam = 取用第一个序列参数的第i 个值//parameters must be <= 4( x& W1 k7 y- ~) F
//const float* cpParam4 =pData->m_pCalcParam[3].m_pfParam; //cpParam = pointer to 第一个序列参数,cpParam = 取用第一个序列参数的第i 个值# v! b9 d" y* e( z8 ]
//const float* cpParam5 =pData->m_pCalcParam[4].m_pfParam; //cpParam = pointer to 第一个序列参数,cpParam = 取用第一个序列参数的第i 个值
6 O" y9 p+ p1 z//m_pData = const struct pointer to struct STKDATA , pointer to structSTKDATA ,
3 H& R% `  }% v- I! I: Y, Ntouse pData→m_pData[x].m_fClose! d+ N+ B. s8 g5 q" \7 [/ I! E
pData→m_pData[x]= | 1,2,3 , … , m_nNumParam | time_t m_time; % O1 j0 G1 ?  \7 Q2 J, u/ Z* R
|1,2,3 , … , m_nNumParam | float m_fOime_t
+ ^. O! H% N  P; h1 \+ |- g8 O) v) }|1,2,3 , … , m_nNumParam | float m_fHigh;
1 h! k" \: Z. P3 E) m3 l! F; @0 i.. .- {* z4 [* s0 y
|1,2,3 , … , m_nNumParam | WORD m_wDecline;
' `. Q# g& [! N9 j# Rm_nNumParam= 数据high,close,open,low的长度/ |% G, h& c" B8 Q* K
touse high:
0 L4 S: G5 v( {/ y& G2 ]pData→m_pData[x].m_fHigh8 H5 k. I' k( V/ [# _
contentof struct STKDATA
1 ?6 X( Y: r( x; ?, `* vtime_tm_time; //时间,UCT; H3 s, ]3 m- `; }; P2 I
floatm_fOpen; //开盘 open( }7 U3 \) o. m
floatm_fHigh; //最高 high8 L1 S# t4 x$ w: h; R' q
floatm_fLow; //最低 low/ h: t0 s- }) q) ?5 q: f
floatm_fClose; //收盘 close* P) F0 v2 K* W) v2 ^) n" a: A1 L
floatm_fVolume; //成交量 Volume
& Q9 q# R! {9 f- W9 u) d$ n( ifloatm_fAmount; //成交额 amount
  L8 V, c, P- k( KWORDm_wAdvance; //上涨家数 仅大盘有效( i. ~3 B0 `9 H! K- w( A
WORDm_wDecline; //下跌家数 仅大盘有效
* c& g3 _2 G: J3 C* H调用传递参数及传回结果
: ~. D$ v( D0 W% r" X, ?" e( l调用传递参数2 V: |$ _6 [3 M& O2 j- G% s3 J& p
(pData->m_pfParam1 && //参数1有效Param1exists# p4 [7 u% s5 m" H( ]
pData->m_nParam1Start<0&& //参数1为常数- k( _5 p2 Q/ y- u; W
pData->m_pfParam2==NULL) //2 }& J) }" j: \% w
localprocedure 定义使用变数( f9 `! ]8 a+ j3 J; ]
onstfloat* pValue = pData→m_pfParam1; //use constant参数12 S8 @; u$ |4 u& R, J  u$ x* |. `2 k( c6 p
intnFirst = pData->m_nParam1Start; //use 参数1效值起始位, r! U) M* ~) K  i3 E
floatfParam = *pData->m_pfParam2; //use 参数2
% R/ e1 j7 e/ d! j/ z4 s& ?1 }intnPeriod = (int)fParam;
! ~- Z  x" l& S! B, N传回结果; t0 H7 X2 u- a: A" ~' n' C
fTotal+= pValue[i-j];( k% r# A. |; O5 A
pData->m_pResultBuf
% B" C# Q2 p( Y( A  _/ F//////////////////////////////////////////comment

评分

1

查看全部评分

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

本版积分规则

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

GMT+8, 2026-9-3 17:31 , Processed in 0.254957 second(s), 20 queries .

Powered by Discuz! X3.2 Licensed

© 2001-2013 Comsenz Inc.

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