阳光飞狐

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

 找回密码
 手机注册

手机动态码快速登录

手机号快速注册登录

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

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

[复制链接]
跳转到指定楼层
1#
发表于 2019-8-11 16:09:40 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
许多年以前,我曾经在
' U, p  z4 f0 G' y- w理想公式区发布了
8 w6 y2 s* ~; o' v' {  a, K, X8 M6 S"
% m( `0 _9 m: Z, u+ Z$ l  \6 G, r如何用 Foxtrader(飞狐)连结 C++动态程式库 DLL80x86Macro Assembly (组合语言)
5 ]" [) h6 t) W# ]  n7 e"
7 B  e3 Y# e# {2 i" j
+ b8 j  X% ?0 c2 P# b$ P现在更新foxtrader(飞狐交易师) ) g6 S# q* A4 j2 Y
连结 DLL的方法
* O% P! W7 _: C! o8 V& M1 o! g8 Y& }% |9 G# M5 |# I% S2 P6 p' D% f
foxtrader- - > DLL (C++ and assembly) = ( foxfunc.h + foxfunc.cpp +pow10.asm )
# R0 a2 O& L* n. l  L' cgauss- - > DLL (C++ and assembly) = ( foxfunc.cpp + meigj.asm ), O! f8 q# ~1 @" s
gauss只用到函数参数传递,所以使用新的 c++compiler, 不受影响8 v% @$ q# C1 P* F" P) W+ p/ n8 g
foxtraderfoxfunc.h宣告的结构型态 (struct)2004vc++ 6.0 全部有效
/ \# H8 t/ h7 x: v" U/ m
9 S) L# T7 i& B+ _& y9 A/ R# S也就是这五个结构都能用
+ E) u* n3 b' H  y; @5 D/ ~typedefstruct tagSTKDATA : S+ K) L* F/ T( \& J1 J' {5 z
typedefunion tagSTKDATAEx5 ~3 f8 Q9 T% z% m% h. k* F$ J, z
typedefstruct tagSPLITDATA . y3 r* P1 g- Y! M
typedefstruct tagCALCPARAM
& ^5 G' b5 ]3 s* I/ N* X: ctypedefstruct tagCALCINFO3 n" D3 }4 A) {) v

$ P* }& f! ?: v" V; N* ~8 N2008年起,vc++ 2008, vc++ 2010, vc++2017 struct的编译,已经完全 c++,不再相容于 C
2 |4 w8 _' L/ P/ K也就是这五个结构中2 ?; c1 W7 b6 p4 q
typedefstruct tagSTKDATA
" t; k7 I+ m% X4 a& R! X; Ntypedefunion tagSTKDATAEx# e2 V2 m, U8 _, P
typedefstruct tagSPLITDATA 8 n" J; u- k& q% y" C% e
typedefstruct tagCALCPARAM) ?6 k0 F. _# m- |
typedefstruct tagCALCINFO7 I' ]1 B* ^# t
只有这两个可以用# q: ~/ q/ b" T# T' v
typedefstruct tagCALCPARAM
3 V5 c( ~- s+ d, S4 Vtypedefstruct tagCALCINFO  g6 E: p6 k2 E# u, r
值得庆幸的是,下面这个结构的函数参数传递个数可以有无数个
$ q6 ?+ Y# c1 J% O' m: etypedefstruct tagCALCPARAM% G5 t0 t; A! J" d' U
例如:foxtrader" L0 M. M9 B* c; e" y
MA1:=MA(CLOSE,3);
! O1 R* x( L1 ?0 c4 w, T  n& pMA2:=MA(CLOSE,6);: X5 t/ l! O9 X4 R* t0 q
MA3:=MA(CLOSE,12);: {  ^% ]6 w2 E5 x: }1 {, A9 o6 o
MA4:=MA(CLOSE,24);% G1 C) _" i9 a' V& f6 b7 M+ ]
MYBBI1:"MYFUNC2017@MYBBI"(MA1, MA2,MA3,MA4,MA3,MA4,5)*0.95,colorff00ff,linethick3; {2017 vc++ 15.0}" J' z8 s+ @4 R
其中MYFUNC2017=MYFUNC2017.dll, MYBBI = MYFUNC2017.dll 中的MYBBI函数,这里 MYBBI函数传递的参数共有 7. C: M  h1 Z$ Z/ Q/ ~! }( l) \0 i
下面这两式计算结果相同/ X2 |& M( J+ u" ^# [2 w) 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 自行计算}! l& b# d$ m' N  t5 K$ R) |$ V
MYBBI1:"MYFUNC2017@MYBBI"(MA1, MA2,MA3,MA4,MA3,MA4,6)*0.95,colorff00ff,linethick3; {2017 vc++ 15.0 , dll计算}: P& p( c, U5 p1 ?
其他例子) s% V* e7 x; S
oooq:="MYFUNC2008good@MYMACLOSE"(c,,c,c,6),colorffffff,linethick5;(---> pow10.asm)
* l" R) U5 Z7 B3 s1 K5 @oooq1:"MYFUNC2010@MYMAVAR"(ma(c,5),5),colorgreen,linethick5;8 y$ I4 p5 g. z; i5 b
其中pow10.asm里面有很多不同定义或宣告被注解不用,那是因为后来在逐步侦测法修改语码中才发现在foxfunc.cpp主程式中,下面这行错误,也就是新的 compiler不再相容于 C,因此在pow10.asm里面被注解不用的定义或宣告中,有些应该是可以用的; \! ?$ K1 k: u2 W0 k
fTotal= pData->m_pData.m_fClose; // @@@@@@@ vc++ 2010 cl.exe 使pData->m_pData[i-j].m_fClose错误6 W/ p" t4 V$ z: d
3 l- A$ [, P' @

* R/ m0 `6 N" O  W- a/ z////////////////////////////////////////////////////////foxfunc.h& V6 H2 r0 T" }9 P. V
#ifndef__FOXFUNC_H_INCLUDE' W- U2 P" B0 s6 j% g- D
#define__FOXFUNC_H_INCLUDE" Z  X8 x) N& g" j( k
/*
9 e& e% K' Q1 T. Y& p9 |飞狐交易师“C语言接口”扩展程序调用接口规范V3.00 i4 B  A$ t8 `' Y  c
1.本规范适用于飞狐交易师V3.x公式系统.9 B. U# ~2 M/ Y: r6 p) C. {9 H$ M
2.扩展函数用于实现系统函数不能实现的特殊算法.
# i: j  k* J* E" |0 e. B. s3.扩展函数用windows32位动态连接库实现,建议使用MicrosoftVisual C++编程.% ]* g5 }, W% W& j/ L1 d
4.调用时在公式编辑器中写"动态库名称@函数名称"(参数表)即可,例如下面函数可以写为"FOXFUNC@MYMACLOSE"(5)
6 X5 ?- w$ _' I5.动态连接库名称和函数名称可以自己定义.
* ~. r- o4 u, b7 j/ q9 ?6.使用时必须将动态库拷贝到飞狐交易师安装目录下的FmlDLL子目录下使用.
* ^& |" c/ Y2 R*/7 X& D/ n2 I. I+ t* c: M# {
#ifdef__cplusplus3 j. i3 K& P3 z! n, }6 ^
extern"C"
) s; B8 }6 z! d{
. z! z* M$ y0 l5 F- [1 |#endif//__cplusplus
7 d/ {1 S' |3 |///////////////////////////////////////////////////////////////////////////  S. c- b# V: f" G- B+ Y( f
//分析周期& r' G! Z4 g0 L! b# O
enumDATA_TYPE/ D8 e. B/ a' P4 O
{
: p1 f  Q  L. R8 o2 d2 O, U  Y2 VTICK_DATA=2,//分笔成交" K. d" o7 b* ]4 `; C. Q  y! |. F
MIN1_DATA,//1分钟线2 c$ F( q* S% x" b  L  s" _
MIN5_DATA,//5分钟线 8 W* ?- o& r% J7 A9 o/ ?
MIN15_DATA,//15分钟线
1 Y" h! D, ]1 Z: d' sMIN30_DATA,//30分钟线
; [" y3 F. a8 t  K" b5 hMIN60_DATA,//60分钟线
# K4 M7 h( b0 Q$ J. K* VDAY_DATA,//日线; S9 {* j, G' |4 h3 h+ b
WEEK_DATA,//周线
& t, n' f5 a5 [# O# ~2 ?# BMONTH_DATA,//月线9 ^5 A, P7 G; w9 }5 _  Z" f7 q% f
YEAR_DATA,//年线- ]0 l& \9 N% T8 m: u0 U( `- [
MULTIDAY_DATA,//多日线
  K9 H0 h" N) h  Z6 ^) Q9 X) wMULTIMIN_DATA//多分钟线
' ]2 t% x% N1 U* ]. y+ ?};% K0 k& v; ]6 @8 t5 i
///////////////////////////////////////////////////////////////////////////9 x0 i! g* }7 Q4 P9 y
//定义取用股票基本数据的结构 只有 VC++ 6.0 compile成功使用
- [* u$ d8 v( @: u* k3 Y7 V( Ftypedefstruct tagSTKDATA 4 u, Y' _' t' {2 y
{
7 C* M/ d" J4 N_tm_; //时间,UCT) i& Q( j0 x" N' z5 e
floatm_fOpen; //开盘 open7 x5 S' Q% `3 S$ r8 T" o
floatm_fHigh; //最高 high
1 U. b; X. U/ Y/ z) ~" {5 Nfloatm_fLow; //最低 low' I% B# O6 x9 V& J
floatm_fClose; //收盘 close
  x; P+ U# \3 J: F2 G! cfloatm_fVolume; //成交量 Volume
' U8 m- P) ]2 O/ g+ {  F3 p4 _& H$ [floatm_fAmount; //成交额 amount
8 ^7 F& K# {9 N: ^/ oWORDm_wAdvance; //上涨家数 仅大盘有效1 N; v" W8 v2 O' I' @" m5 y
WORDm_wDecline; //下跌家数 仅大盘有效+ M, a3 {. i' I7 K1 ~$ ?
}STKDATA;
0 b! r3 D* y) u  k1 O6 z! L. n定义STKDATAtagSTKDATA的简单别名,STKDATA
! g% i3 ~  \( N; m2 ]为真正方便使用名称,tagSTKDATA 为定目的的过水名称" |/ o6 a- W, p6 s. t  |  }
////////////////////////////////////////////////////////////////////////////
1 X5 Y$ b) r" x//扩展数据,用于定义取用分笔成交数据的买卖盘 的结构
) P* E  f& U2 y! m2 j3 b! d; ]; \typedefunion tagSTKDATAEx5 _  ^: w" g3 v, E/ q2 o
{3 J  x2 x; h4 X9 f; a  u9 P: f: B+ Q; {
struct
( |$ o2 Y: ?5 @. }{; h) k7 o1 p2 h4 s- Z- }
floatm_fBuyPrice[3]; //1--3floatm_fOpen; //开盘 open$ h! z, p6 q& D
floatm_fHigh; //最高 high/ W' ^' T( j6 F6 z
floatm_fLow; //最低 low
6 T7 A$ x# c5 l0 D# }  q+ m, v6 X1 pfloatm_fClose; //收盘 close3 I7 u! h: J; C! g" ^
floatm_fVolume; //成交量 Volume4 r& O/ e; O) u
floatm_fAmount; //成交额 amount
5 h9 f5 L5 V6 I- a% c7 P5 nfloatm_fBuyVol[3]; //1--3
( P' t* Z" B* j9 efloatm_fSellPrice[3]; //1--32 ~) H! g$ i+ T- z. \9 o6 v
floatm_fSellVol[3]; //1--3
4 p( J0 J7 t9 T};
4 \. o; C9 s; ]4 Y6 d& l1 F/ F) Lfloatm_fDataEx[12];
7 T, T5 u2 t. e3 w! ~$ Z}STKDATAEx;% _8 _$ ~7 {( W: I
///////////////////////////////////////////////////////////////////////////// a* [7 T5 |4 C* R
//定义取用除权数据的结构% ~. L6 ~; b3 r- B
typedefstruct tagSPLITDATA ( x9 Y4 f) X" ~1 k+ m
{4 m  H4 y: P1 L6 N! c
time_tm_time; //时间,UCT
( z: {5 R/ ^- Bfloatm_fHg; //红股; ^  y- M1 c6 J1 D6 L3 C! `& P
floatm_fPg; //配股
/ _4 ^! c: r. g1 e# G: tfloatm_fPgj; //配股价
2 ?4 Z8 N; M' q3 t: y. G; l9 {floatm_fHl; //红利
1 r( |. e& \4 \4 e: m! |" _, }}SPLITDATA;) b/ P0 G: N  Y. H
/////////////////////////////////////////////////////////////////////////////
" Y0 y6 a9 q9 N7 T% m7 K, R; c/*财务数据顺序(m_pfFinData内容)' }4 V, t4 O; q% c- J0 z
序号内容
6 W6 t  T9 |, A0总股本(万股),
! t* E' k" `9 {. ~3 d1国家股,  ?' ?" y) w* S; {- D: P
2发起人法人股,
! e; c" ]- e& l' J8 V3法人股,
8 p5 M/ }% V: j4B,
! z/ w4 Q, r4 R8 s6 {5H,' t) W1 I7 Z! \; e
6流通A,, I; ~) n9 ?2 B" w* K+ a
7职工股,
5 O1 a  J; g9 _" W2 M1 X( g8A2转配股,8 v! [; n1 k/ E8 ]
9总资产(千元),; P7 b) {- Z8 b7 q0 L, d
10流动资产,
4 s) Z3 o) x$ S! O4 b11固定资产,
, h! J  e& d3 n6 o# \' y$ e0 r12无形资产,5 R- E* |& @8 f1 w/ Q
13长期投资,7 X! k( c' J* Z! G2 F
14流动负债,
/ @) i! I/ h8 H0 t. I/ a% m' Y/ E15长期负债,  f1 p5 q& p7 w) m% @
16资本公积金,2 I+ y5 s5 P% |  L
17每股公积金,( l( C) s: y2 b2 ~/ G0 n. b2 G
18股东权益,4 U% p9 m0 d, Q2 E
19主营收入,8 d! J" M& u) \- Z% E7 t5 j
20主营利润,( W' `% j" y9 H+ a
21其他利润,% I- G( X8 m3 A0 E. j8 S
22营业利润,5 p; B4 n+ v, o- p' S2 M
23投资收益,' z. J, x& i8 h# `
24补贴收入,
) G. x7 t7 u' o" O7 c- q25营业外收支,
$ O9 ?( q+ Q- u26上年损益调整,
2 r! z8 n, K. `: U- T; c" o27利润总额,
. ~7 Y; i& Q. O& J" R7 k# l28税后利润," T" |6 @* \4 E0 c2 ^' o2 _% ^4 B
29净利润,
  p: [. _5 B3 k4 I3 h9 `. l+ f30未分配利润,5 A  v+ w! f9 U
31每股未分配,8 x5 W4 b& w5 {2 V
32每股收益,4 {1 P$ V5 }# a* M  _- {* L
33每股净资产,
- v, t- y1 N# e$ ~34调整每股净资,  N, D/ X: |8 Y5 x- C' G! ?2 D6 q
35股东权益比,3 Q1 o' s- H7 A3 w. |" z7 ~
36净资收益率8 o2 v2 \0 r* K1 h
*/
% c% Y" W# e3 r0 L* L- O/////////////////////////////////////////////////////////////
5 \$ Q9 q4 V( A% l//定义取用caller函数传递参数项 的结构
0 K5 U, l$ p# _- o3 R4 g/ ]typedefstruct tagCALCPARAM! F& p* h6 [% r5 t
{( {( N( p3 h- Y* M' U
union
8 J; m- G8 P& W{
, b$ z- q2 \/ ^, j( N4 Econstfloat* m_pfParam; //指向序列参数的址标,指向一个浮点型数组pointertofloat variable parameter / ex. c,h,l,o, co2...co2=(c+o)/2# p3 F7 r( K  s3 I- R; M+ J
constfloat m_fParam; //数值参数 valueof parameter
8 P- _+ h; ]4 @+ B6 ]; ]};
% r, o8 @& `2 n, U+ I. g7 Lconstint m_nParamStart; //序列参数有效起始位置thestart address of variable parameter / ex. c,h,l,o,co2.....# e& t' D3 D1 K+ c8 \1 @
}CALCPARAM;
1 `, L2 w- b$ r( d/////////////////////////////////////////////////////////////////////////////
. w3 r; J# K6 w# k$ v//定义全部取用址标 的总结构 (各指标指向前述各结构以便取的各结构的数据,接口信息数据的结构 )7 Y6 Q; i5 |. T  P( X1 G6 ]* E# r
typedefstruct tagCALCINFO
8 p9 B  ]. G; i5 K2 m! }{
6 Z, X- u7 J/ T( G5 dconstDWORD m_dwSize; //结构大小
% t1 J& G' ^5 a+ ~& Y9 MconstDWORD m_dwVersion; //调用软件版本(V2.10: 0x210)  {- S+ {! N% y/ e; E4 ^) w" Y1 w# B3 a) x
constDWORD m_dwSerial; //调用软件序列号* X+ p4 j6 }4 F# v1 C
constchar* m_strStkLabel; //股票代码0 t4 A  n# c$ e; r! W
constBOOL m_bIndex; //大盘# t" @1 F* W$ ^% S
constint m_nNumData; //数据数量(pData,pDataEx,pResultBuf数据数量)数据长度- m) t8 W$ l" k* \
constSTKDATA* m_pData; //常规数据,注意:m_nNumData==0时可能为NULL
6 L" V6 v& g* L- O! JconstSTKDATAEx* m_pDataEx; //扩展数据,分笔成交买卖盘,注意:可能为NULL0 `+ p9 _4 i/ q
constint m_nParam1Start; //参数1有效起始位置<0/ constant parameter >0 /variable parameter
. s" |! N8 @- z6 C% v$ [/ o+ Zconstfloat* m_pfParam1; //调用参数1/pointer to variable parameter 1 7 F  m# ]! [4 k# B+ O0 f
constfloat* m_pfParam2; //调用参数2/pointer to variable parameter 2
/ M7 H$ j! \' U1 J4 Gconstfloat* m_pfParam3; //调用参数3/pointer to variable parameter 3
/ o. u4 K4 @. r/ P  {5 B: lconstfloat* m_pfParam4; //调用参数4/pointer to variable parameter 4& C) L" ]- q4 U. U  P0 ?
float*m_pResultBuf; //结果缓冲区1 E( |0 o! @( j7 D8 z
constDWORD m_dataType; //数据类型
! g) q1 j' r/ i% J, f, t- `constfloat* m_pfFinData; //财务数据+ R. i1 Z$ _: G1 f  {0 ?
//以上与分析家兼容,所以沿用其结构和名称
) R. L/ M* s4 F1 Q' H//以下为飞狐交易师扩展(fortagSTKDATAEx)% I- o- I/ Z2 f. z5 j/ W
constDWORD m_dwReserved; // 保留$ _) R* [/ \) V* G
constint m_nNumParam; // 调用参数数量
% Z# [9 S( U. J1 RconstCALCPARAM* m_pCalcParam; // 调用参数数组: y$ q' A1 r2 A, c& Y8 j
constDWORD m_dwReservedEx[4]; // 保留  q( W6 c3 C! O0 Q$ p/ e2 k
char*m_strStkName; //股票名称! B8 f3 x3 U5 ]! U# y  }! o7 t8 {
SPLITDATA*m_pSplitData; //除权数据: H) t. _: k! ]" ?' Y/ _. r9 n
intm_nNumSplitData; //除权次数
! x4 m% l) u3 I' @7 C3 ^6 q4 s}CALCINFO;# S1 T0 V" m$ f1 C; M% `/ h0 O# l
/*
0 V1 B% j9 k  j7 F1 s; T' \1:(与分析家兼容)' A& e# g4 B% A  j) f! [( v
1.函数调用参数由m_pfParam1--m_pfParam4带入,若为NULL则表示该参数无效.0 N( h" {' G2 a: E+ k
2.当一个参数无效时,则其后的所有参数均无效.% Q+ S& L+ |( p. e, @
:m_pfParam2NULL,m_pfParam3,m_pfParam4一定为NULL.4 ]: U- T5 m, ^; `) Z
3.参数1可以是常数参数或序列数参数,其馀参数只能为常数参数.4 m$ f" `0 W! `* Y9 M9 N4 s
4.m_nParam1Start<0,则参数1为常数参数,参数等于*m_pfParam1;5 u. l) j- j; K( e, [5 s" |4 s' ^
5.m_nParam1Start>=0,则参数1为序列数参数,m_pfParam1指向一个浮点型数组,
( H4 [' v5 |# {- P1 i( Q$ e数组大小为m_nNumData,数据有效范围为m_nParam1Startm_nNumData-1.
& M( e7 I2 p& J/ c在时间上m_pData[x]m_pfParam1[x]是一致的" |5 J8 D# Y& p' z
2:(飞狐交易师扩展)8 R/ `0 o5 T0 g) U
1.该扩展结构使调用参数在技术上可以是无限数目的,且每个参数都可为数值或序列,由公式中实际的调用参数决定。: @) D/ y& _* h  [0 F+ h
2.CALCPARAM结构用于带入参数信息和实际数据,m_pCalcParam数组大小为m_nNumParam,数据有效范围为0 m_nNumParam-1.
6 z; C5 u+ A! T- ?3.按参数的顺序,m_pCalcParam[0]为第一个参数的数据,m_pCalcParam[1]为第二个参数的数据...,为了保持兼容,原m_nParam1Startm_pfParam15个属性依然有赋值。
4 c& u2 J3 ]& T3 }" k+ F# B2 ]4.i位置的参数为数值,取用m_pCalcParam.m_fParam.
% z( w2 i- J6 K+ n& C  `. ^8 K8 Y5.i位置的参数为序列,取用m_pCalcParam.m_pfParam,数组大小为m_nNumData,数据有效范围为m_pCalcParam.m_nParamStartm_nNumData-1.m_pCalcParam.m_nParamStart<0,则此数组中无有效数据。. G2 L' C6 F9 q. u, i- \% x. s* H
6.由于可以调用多个序列,许多序列的计算可以先在公式中进行,然后作为调用的参数即可。  p/ [/ Z6 J- `5 G
7.经此扩展,对分析家的DLL依然可以调用、兼容。
% v1 ?: F' y  V7 }) b1 z*/
' S1 J% D( }# r8 Y0 B' i# i///////////////////////////////////////////////////////////////////////////////////
* ]6 ~7 {' K: i; J7 X" y- }) Z* _/*函数输出
7 T' v/ ]  Y' `  K# _' O__declspec(dllexport)int xxxxxxxx(CALCINFO* pData);
% s; Q5 Y+ A7 X/ r' c7 h1.函数名称需全部大写.
" d/ N4 ]) k& }3 T, H  _2.函数必须以上述形式声明,请用实际函数名称替代xxxxxxxx;, |& [' j# _  m% O. ^
对于C++程序还需包括在extern"C" { } 括号中.
; [% S9 f* l& a0 N7 X! ?9 j$ E3.函数计算结果用pData->m_pResultBuf带回.
  T+ H8 f: F2 _, Q% D7 J% N* m" |4.函数返回-1表示错误或全部数据无效,否则返回第一个有效值位置,:
# n: s+ c' y5 }m_pResultBuf[返回值]-- m_pResultBuf[m_nNumData-1]间为有效值.4 {; N: m1 D/ S: H9 E+ `
5.函数名称长度不能超过15字节,动态连接库文件名不能超过9字节(不包括扩展名),动态库名称不能叫SYSTEM,EXPLORER
" w1 X2 L0 w) I3 q. l" p+ @*/( c" D2 x5 O- G4 X
//示例函数,使用时用实际名称替换
+ l% S9 C7 k- d0 q$ [__declspec(dllexport)int WINAPI MYMACLOSE(CALCINFO* pData);
# t9 m! I$ ?+ ?7 V) N4 Q1 C; n__declspec(dllexport)int WINAPI SMOOTH(CALCINFO* pData);. Z- e" ^1 _( y" o/ r, `: E/ [
//__declspec(dllexport) int WINAPI MYMAVAR(CALCINFO* pData);
, P: |% p; J: y  q- A__declspec(dllexport)int WINAPI MYBBI(CALCINFO* pData);
1 g8 ]& J6 X, D//WINAPI = _stdcall9 i1 B7 P  v( ~) u5 @; O+ `" d
#ifdef__cplusplus
/ Z) D* @: H1 h- Z" f}
8 E: L6 b! \' _1 _0 M#endif//__cplusplus2 Q( B& R* L" Q+ n. b( o+ Z: A; c
#endif//__FOXFUNC_H_INCLUDE' X" v4 ^$ @/ ~1 q" r
3 J- y# ~1 @4 _) [) @
//////////////////////////////////////////comment 注解) X9 K2 W+ M6 i7 K( B2 W# n2 O) q, Q7 G" K; t
__declspec(dllexport)int WINAPI MYMAVAR(CALCINFO* pData)+ V9 ]& x( a0 G, c# Y* K) U4 K" n- J
pData是指向 址标总结构 CALCINFO的 总址标2 ?# A0 p) j  U) l9 X
取用第二个参数数值floatfParam = *pData→m_pfParam2
4 d7 f' G: D; V; y# A取用第一个序列参数的址标constfloat* pValue = pData->m_pfParam1;
/ X& h! w0 @9 \' D# {* l2 I" k取用股票数据长度intndata = pData→m_nNumData;
( Q6 }" Z% a& l+ M5 [第一个参数存在且为数值pData->m_pfParam1&& pData→m_nParam1Start<0! X: K1 R' X% n$ e& N  @! s
第一个参数存在且为序列pData->m_pfParam1&& pData→m_nParam1Start>=08 Y, f7 S0 b$ P2 o
第一个及第二个参数存在且为序列,第三个参数不存在pData->m_pfParam1&& pData->m_pfParam2 && pData->m_nParam1Start>=0&& pData->m_pfParam3==NULL" E1 q/ f' ]/ i3 S
constfloat* cpParam = pData->m_pfParam1; 定义cpParam为第一个序列参数的址标
# c" W4 L& ~; j4 m+ ]. A取用股票数据结构
1 j  J! C, G3 h) p* PpData→m_nNumData= 变数数据长度$ @% Y2 S* r- H' ~- @5 |
pData→m_pData= pointer to struc STKDATA 的址标- \" I' W. z  M. S: B1 b
pData→m_pData[x]数据结构的第x个数据8 \/ ^, x1 c& ~$ P* C/ F
pData→m_pData[x].m_fHigh数据结构的第x个数据中的 High8 z2 r  Q7 g6 G$ F  t7 L0 L
取用结果缓冲序列
7 V4 \* W4 u9 `+ X3 RpData->m_pResultBuf
% v5 L, Q' E6 ?( i取得第一个序列参数的起始序位,2,...5 , . 7...* L9 J5 w- H- _5 G: h' |, i5 S' D
intnFirst = pData->m_nParam1Start; : o6 J& ^5 K8 Q* N% r
for( i = nFirst+nPeriod-1; i < pData->m_nNumData; i++ )' }- N# A3 w' G; Z9 T/ w0 |
取得第二个数值参数的数值
* K! k9 A: q  k* HfloatfParam = *pData->m_pfParam2;
. l7 l* ?' |$ @2 t) \intnPeriod = (int)fParam;
% Y* g! V+ O' Q! m; n取用第一个序列参数的址标constfloat* pValue = pData→m_pfParam1;1 o! V1 S! d. ]3 u! I# R
取用序列参数的单个直pValue
. ^# ~" q' A9 F8 h5 k) @% `取用缓冲序列的单个值pData->m_pResultBuf
  E" C7 t! O6 A: Q9 u4 ^! |. NconstCALCPARAM* m_pCalcParam; // 调用参数数组/ y2 Z: f) L8 r" P: I0 l) K- P
m_pCalcParam为序列址标,指向各序列参数的指标7 j4 R4 Q7 Z# P" [' i! y
第一个序列参数pData→m_pCalcParam[0]  ?/ V0 [7 Z1 S- H. _5 J
constfloat* m_pfParam; //指向序列参数的址标$ j. P, V3 t- l( y( ~
第一个序列参数的起始序位pData->m_pCalcParam[0].m_nParamStart5 S+ s  }  T! t9 Z% z
第一个序列参数的址标constfloat* pValue1 = pData→m_pCalcParam[0].m_pfParam;
/ N, Q2 e$ N' d$ y! O. J' g; k# z取用第一个序列参数的单个直pValue1
) f  b  }7 V% s) B" }第二个序列参数pData→m_pCalcParam[1]
+ T( ]6 Y7 z/ n& _* I2 m( b/ s第二个序列参数的起始序位pData->m_pCalcParam[1].m_nParamStart# g. a! i9 y# D6 _5 q! M6 g$ K
第二个序列参数的址标constfloat* pValue1 = pData→m_pCalcParam[1].m_pfParam;2 I7 E, d6 Z  v. Y3 F0 a& d$ d
取用第二个序列参数的单个直pValue2" {9 Z* G6 h: Q5 n6 c
第三个序列参数pData→m_pCalcParam[2]+ ]; R0 c& {$ L3 {
第三个序列参数的起始序位pData->m_pCalcParam[2].m_nParamStart
5 Q/ \( M+ B* ^; ^) t第三个序列参数的址标constfloat* pValue1 = pData→m_pCalcParam[2].m_pfParam;
1 [' x0 x2 I% H6 ?( U9 b取用第三个序列参数的单个直pValue32 e- h$ u& F$ V8 x3 a' D
第四个序列参数pData→m_pCalcParam[3]) G7 d  S1 L7 B1 v7 l
第四个序列参数的起始序位pData->m_pCalcParam[3].m_nParamStart8 W3 Z  d  P, J% l0 g
第四个序列参数的址标constfloat* pValue1 = pData→m_pCalcParam[3].m_pfParam;) |3 b$ O2 R6 u4 H+ N
取用第四个序列参数的单个直pValue4  Y4 \, T9 o! M1 o8 l: `6 J
如果有四个序列参数,则取用序位最高的那一个序位3 s' F* u" E6 N) D) F
if( pData->m_pCalcParam[0].m_nParamStart >= 0 &&
5 w. H  T3 a  g9 i: ^0 ipData->m_pCalcParam[1].m_nParamStart>= 0 &&
  N2 e0 O: [6 D, O$ |" lpData->m_pCalcParam[2].m_nParamStart>= 0 &&6 p$ J+ V2 o, {. n$ @
pData->m_pCalcParam[3].m_nParamStart>= 0 ) //4个序列都含有效数值0 h) h6 p! U5 G
{* r4 Y9 y0 Q) R, K, d9 H$ @& N; U
//计算返回的序列的第一个有效值位置5 I: D  M8 |7 O* \
intnFirst = pData->m_pCalcParam[3].m_nParamStart;//已知返回的序列的第一个有效值位置与第4个序列一致. c" Q$ K$ v* S" e" e. M+ F
//若不知,则+ p: ?. {$ k: [+ a* k5 }) _
/*4 }; R: h0 m, q0 T: _
intnFirst = pData->m_pCalcParam[0].m_nParamStart;7 |2 K& f6 U) M% Q1 q# w0 _: X$ [
if( nFirst < pData->m_pCalcParam[1].m_nParamStart ) ) p3 p6 L9 H" j8 |; Z3 P
nFirst= pData->m_pCalcParam[1].m_nParamStart;
7 m3 Z' q; }+ d7 a% uif( nFirst < pData->m_pCalcParam[2].m_nParamStart ) % E  }" F3 c! {& u
nFirst= pData->m_pCalcParam[2].m_nParamStart;
6 m; I7 P8 k' Y. B4 o" B/ B# m/ U: Z( iif( nFirst < pData->m_pCalcParam[3].m_nParamStart ) 3 c5 V& ]- t0 J8 e4 w9 m
nFirst= pData→m_pCalcParam[3].m_nParamStart;
* h* _1 z  ~$ g2 Econstfloat* pValue1 = pData->m_pCalcParam[0].m_pfParam;2 i5 L  `- `8 ^# Y+ h! s1 Y
constfloat* pValue2 = pData->m_pCalcParam[1].m_pfParam;
- `7 _: d& P/ p* Y3 D4 q' {1 dconstfloat* pValue3 = pData->m_pCalcParam[2].m_pfParam;  U! |* O- z( C' l  x2 v
constfloat* pValue4 = pData->m_pCalcParam[3].m_pfParam;
7 a& L5 U+ Q2 F& Z/ e//-------------------
1 p4 V/ J$ ~. [7 y7 H  Efloatm_fOpen; //开盘 open, K3 z  Y; i7 K9 Z
floatm_fHigh; //最高 high
4 i$ t: r' c% T4 f2 o6 p- o! mfloatm_fLow; //最低 low. B: ?$ M0 `# v4 b
floatm_fClose; //收盘 close0 I/ i' w3 @- h9 L
floatm_fVolume; //成交量 Volume
- A' e# d. x( P$ d( q  Lfloatm_fAmount; //成交额 amount. e1 O) ?* m4 r7 w: @
调用收盘据
6 B* x/ ]0 D: J0 T, q& l& H6 N: wpData→m_nNumData= 变数数据长度
: Z: C" F( r/ rpData→m_pData= pointer to struc STKDATA, Q! m; A+ d1 [8 m
pData→m_pData[x]x个数据8 {: ^& q2 s* d9 D$ r6 ?* l1 ~
pData→m_pData[x].m_fHighx个数据中的 High
! D  o  V3 A& m  u# B# Z* d$ h: R+ J@@@@@@@@@@@important !!!!!!!
7 k( t3 {2 R" h5 S' \sinceVC++ 2008, cl.exe will make ‘pData→m_pData[i-j].m_fClose’ anerror
3 h3 {: P4 C& ]so,pass the high,low,open and close just from the function parameter ,that is use ‘ CALCPARAM’ struct
3 y, X, s# ^0 R5 d& k5 A, q) n7 HpData->m_pData[i-j].m_fOpen// to use open , there is no way in using a varable for calculationoutside foxtrader
. B6 h" q5 Y; \8 A$ HpData→m_pData[i-j].m_fHighto use high# R* }- M3 _: j& b. ~) m8 l7 p
pData->m_pData[i-j].m_fLow
7 ]& i/ s3 G' `& V: wpData->m_pData[i-j].m_fClose5 U2 h" L7 ]7 J! C# n$ `) g& a
m_pData= pointer to struc STKDATA1 l$ }* {6 M3 y$ _
incalling C++ dll function( l4 A9 X) b: a  @
m_pDatais passed to pData (CALCINFO* pData . A CALCINFO* type pointer)$ l2 ]9 R2 ^9 }. I
touse a single value in variable ‘High’/ l% `& ]- F3 `& B- b
pData→m_pData[i-j].m_fHighto use high
2 T' q) `7 l+ P. s: Kconstfloat* m_pfParam1; //调用参数1/pointer to variable parameter 1 ! l' H9 I( f) i) X# J, k' I* d2 S
constfloat* m_pfParam2; //调用参数2/pointer to variable parameter 2
+ G; [3 e" z3 r0 ~: h, I9 N( d6 tconstfloat* m_pfParam3; //调用参数3/pointer to variable parameter 3" s2 L7 _7 L7 k( n- Q
constfloat* m_pfParam4;
+ L1 @* s7 S+ t9 km_pfParam1,m_pfParam2, m_pfParam3, m_pfParam4 = pointer to caller function 的参数* F4 l/ V, {5 X; e
pData→m_pfParam1= pointer to 第一个(序列)参数1 c# `: k7 e4 O/ b- @
pData→m_pfParam1[x]= 取用第一个(序列)参数的第x 个值
# N; w* c, I( {& ~3 t7 Jconstfloat* cpParam = pData→m_pfParam1; =定义 cpParampointerto 第一个(序列)参数
0 I# m0 @  W$ Y( \0 IcpParam[x] = 取用第一个(序列)参数的第x 个值
/ c/ N9 p5 F% _6 s% Wm_pResultBuf= 结果缓冲列  e# C, }& S) e4 Q
pData→m_pResultBuf= pointer to 结果缓冲列
, h2 C; }4 x( M( r6 apData→m_pResultBuf[x] = 取用结果缓冲列的第 x个值2 D/ b$ H- M% K6 f* a
//////////////////////////////////////////comment
7 ?' T: P8 F+ Z3 M2 u//////////////////////////////////////////comment 注解
: b6 G; O" i, X. fconstint m_nParam1Start; //统杅1衄虴宎弇离
/ R* Q5 ]  i; K+ ^; v& K: xconstfloat* m_pfParam1; //覃蚚统杅12 A9 N. k9 c" Z
constfloat* m_pfParam2; //覃蚚统杅21 z- q1 V8 [: \+ e9 m
constfloat* m_pfParam3; //覃蚚统杅3: f2 }1 f( R: U- q6 J7 j$ m
constfloat* m_pfParam4; //覃蚚统杅4,parameters must be <= 4
) k# ]( z5 k% q//const float* m_pfParam5; // parameters must be <= 4
1 o- Z, a5 w7 Z1 T//const float* m_pfParam6;
+ `1 b7 z& i  r) J//const float* m_pfParam7; ) d6 J4 m$ c* A1 h( y7 \, K4 [1 r
//const float* m_pfParam8;+ M' N5 p/ \/ }, g4 i7 R
//pData->m_pfParam1 && pData->m_pfParam2 &&pData->m_pfParam3 && pData->m_nParam1Start>=0 &&
- ?# ?1 d6 L( F4 u9 |, w+ RpData->m_pCalcParam[0].m_nParamStart>=0&& pData->m_pCalcParam[1].m_nParamStart>=0
! P/ W5 V. W+ v+ y- R- V% q&&pData->m_pCalcParam[2].m_nParamStart>=0) ) T# h% \7 n+ |  t
{
  G2 S! z) E; w# A) qfloatfParam = *pData->m_pfParam4; //pointer ,pData->m_pCalcParam[3].m_nParamStart >= 0: h& g- {# q/ ?: ^1 @
intnPeriod = (int)fParam; //统杅1
) t! T/ J0 @0 X; f; y' }7 I//const float* cpParam = pData->m_pfParam2; // cpParam = pointer to第一个序列参数,cpParam = 取用第一个序列参数的第i 个值" `) o) r- [$ E: J/ |1 D( _
constfloat* cpParam1 =pData->m_pCalcParam[0].m_pfParam; // cpParam =pointer to 第一个序列参数,cpParam = 取用第一个序列参数的第i 个值
! K" R9 B; f2 vconstfloat* cpParam2 =pData->m_pCalcParam[1].m_pfParam; // cpParam =pointer to 第一个序列参数,cpParam = 取用第一个序列参数的第i 个值
! Q4 ?% R6 {5 O8 yconstfloat* cpParam3 =pData->m_pCalcParam[2].m_pfParam; // cpParam =pointer to 第一个序列参数,cpParam = 取用第一个序列参数的第i 个值//parameters must be <= 4, Y+ \7 F0 \& m; n7 R- \0 k
//const float* cpParam4 =pData->m_pCalcParam[3].m_pfParam; //cpParam = pointer to 第一个序列参数,cpParam = 取用第一个序列参数的第i 个值6 z8 z6 B, n" }0 n8 D! Y  H
//const float* cpParam5 =pData->m_pCalcParam[4].m_pfParam; //cpParam = pointer to 第一个序列参数,cpParam = 取用第一个序列参数的第i 个值
2 E- c( h, i2 L" ~9 G//m_pData = const struct pointer to struct STKDATA , pointer to structSTKDATA ,
1 l5 m: Y) P2 S0 e9 qtouse pData→m_pData[x].m_fClose
- f2 v$ J& C0 a( |pData→m_pData[x]= | 1,2,3 , … , m_nNumParam | time_t m_time;   D, j$ g0 U+ z4 X
|1,2,3 , … , m_nNumParam | float m_fOime_t
" M3 j$ {: z! r, H|1,2,3 , … , m_nNumParam | float m_fHigh;+ n0 K; \  b# Q. o" b  \6 b
.. .
* O6 D' B: F$ k6 o% i|1,2,3 , … , m_nNumParam | WORD m_wDecline;! ?5 E1 W6 t$ a/ O9 z3 u' O
m_nNumParam= 数据high,close,open,low的长度
1 {/ j2 K, }: ntouse high:
" S, K+ h. d7 ]' }8 [pData→m_pData[x].m_fHigh3 o( H6 E2 N) Y3 z
contentof struct STKDATA
# o$ u' r& }3 m: u8 p' k6 ytime_tm_time; //时间,UCT* a. D) Z, C. M/ w
floatm_fOpen; //开盘 open
% r: P: ^: a& N# e4 H9 c! Xfloatm_fHigh; //最高 high
5 B4 k8 L* ~+ |9 j0 Ffloatm_fLow; //最低 low2 h3 T$ D$ @6 G2 P
floatm_fClose; //收盘 close
( B4 Z8 |$ x/ m0 Y, h" |) Rfloatm_fVolume; //成交量 Volume8 q; p3 g$ t$ _
floatm_fAmount; //成交额 amount5 g; ^0 k( O- }* x
WORDm_wAdvance; //上涨家数 仅大盘有效; t! Q- p+ e: A( ?
WORDm_wDecline; //下跌家数 仅大盘有效" H$ _5 Z4 ?' _( p
调用传递参数及传回结果3 X7 q/ g$ c. a. L
调用传递参数
. }- a$ v  R. D) c/ U( f9 M3 P5 B(pData->m_pfParam1 && //参数1有效Param1exists
( X$ s4 Y5 h6 vpData->m_nParam1Start<0&& //参数1为常数0 [9 P6 c1 ]; ]7 ?% y( y
pData->m_pfParam2==NULL) //
) f" U: I! X. p6 Y* \) xlocalprocedure 定义使用变数
3 G& o8 j, F( eonstfloat* pValue = pData→m_pfParam1; //use constant参数1' R* W. \% Z7 F/ D9 \/ o7 d4 C0 N
intnFirst = pData->m_nParam1Start; //use 参数1效值起始位: N5 ?! z. }) c6 A! o
floatfParam = *pData->m_pfParam2; //use 参数2
& G0 L9 N7 F: ^2 qintnPeriod = (int)fParam; 1 j: f' `7 O! a( |0 V- O% Y8 w
传回结果
9 J( G$ J* d2 u, V# W) ifTotal+= pValue[i-j];
# ]+ _. t/ ^9 I2 z$ {' O6 gpData->m_pResultBuf# i# V6 V# F8 F" ~1 a# m) C# t7 U! B
//////////////////////////////////////////comment

评分

1

查看全部评分

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

本版积分规则

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

GMT+8, 2026-7-19 22:58 , Processed in 0.152584 second(s), 19 queries .

Powered by Discuz! X3.2 Licensed

© 2001-2013 Comsenz Inc.

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