阳光飞狐

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

 找回密码
 手机注册

手机动态码快速登录

手机号快速注册登录

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

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

[复制链接]
跳转到指定楼层
1#
发表于 2019-8-11 16:09:40 | 只看该作者 回帖奖励 |正序浏览 |阅读模式
许多年以前,我曾经在
8 T; }1 M) b) O6 p5 K3 X理想公式区发布了
8 T5 T6 r$ y. T"
/ P0 r8 X( W- e4 V% s' u) w如何用 Foxtrader(飞狐)连结 C++动态程式库 DLL80x86Macro Assembly (组合语言)& h1 P' ~/ G3 S
"; w1 m' P& s2 z9 ^

  x. p8 ^  u7 N8 n+ T6 F现在更新foxtrader(飞狐交易师) 3 D8 J+ j# L8 Z8 `4 e) L$ G
连结 DLL的方法& n& c0 B; k2 c

/ k& B1 @0 d6 S4 S1 a: Efoxtrader- - > DLL (C++ and assembly) = ( foxfunc.h + foxfunc.cpp +pow10.asm )
- m1 Z& P3 R6 X9 e8 J1 vgauss- - > DLL (C++ and assembly) = ( foxfunc.cpp + meigj.asm )
$ |( H  M* C/ \4 e4 F! Tgauss只用到函数参数传递,所以使用新的 c++compiler, 不受影响
* s, l" n! w! f% |. M9 ~0 i  k# pfoxtraderfoxfunc.h宣告的结构型态 (struct)2004vc++ 6.0 全部有效
( T( d! M3 `9 P4 n& {! R' w( j* D; Y1 p
也就是这五个结构都能用
' ^' ]2 c) r7 w6 _" w6 H& d, {typedefstruct tagSTKDATA # d6 w. u& m' T
typedefunion tagSTKDATAEx
. |  ^, G* g' @# htypedefstruct tagSPLITDATA ! C; Z  i0 l9 G: D6 L
typedefstruct tagCALCPARAM$ \; m; Y( V. L5 w
typedefstruct tagCALCINFO
+ y0 e! Z- J6 L8 W9 h, r
9 Z: l! Y: O, c, p* m4 h9 h2008年起,vc++ 2008, vc++ 2010, vc++2017 struct的编译,已经完全 c++,不再相容于 C
# s: Y1 ~; H! }  d8 {1 O" |$ k也就是这五个结构中* ]7 I7 v: i+ }' M* T* @
typedefstruct tagSTKDATA
  s" O! }' i) j7 [7 p8 wtypedefunion tagSTKDATAEx
8 S1 {( _0 ?4 i7 I' x- f2 s( dtypedefstruct tagSPLITDATA   x4 a9 s9 }1 {7 j. x" d% g
typedefstruct tagCALCPARAM
  ~  @! i" f# o8 htypedefstruct tagCALCINFO% N- h4 ]$ U) n* R5 ?' d
只有这两个可以用
, f$ t5 [/ Q( o2 Ktypedefstruct tagCALCPARAM( A- U1 _  c; i% q% D! z- C
typedefstruct tagCALCINFO3 p5 |$ }0 ~6 P; ?. Q6 o, ?$ D
值得庆幸的是,下面这个结构的函数参数传递个数可以有无数个6 N$ x1 ?8 Y/ f, V
typedefstruct tagCALCPARAM2 L3 j" }3 Z& f0 f8 K; e
例如:foxtrader) y" C7 e' l4 W- f' }" i
MA1:=MA(CLOSE,3);
- U+ J6 h3 B6 u  RMA2:=MA(CLOSE,6);
! G0 M# E( \4 q9 i* NMA3:=MA(CLOSE,12);
, Z; e- N' T: U/ f/ F9 V7 x3 Z* MMA4:=MA(CLOSE,24);4 s* U% g' M( j5 @0 Y+ a
MYBBI1:"MYFUNC2017@MYBBI"(MA1, MA2,MA3,MA4,MA3,MA4,5)*0.95,colorff00ff,linethick3; {2017 vc++ 15.0}( f( c; b. L, X8 T; G
其中MYFUNC2017=MYFUNC2017.dll, MYBBI = MYFUNC2017.dll 中的MYBBI函数,这里 MYBBI函数传递的参数共有 7
: L" V2 V9 c& c: r/ y+ \) ~下面这两式计算结果相同' |5 I0 `$ ?- y  U
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 自行计算}
9 E  F9 W4 z& J6 W, G" FMYBBI1:"MYFUNC2017@MYBBI"(MA1, MA2,MA3,MA4,MA3,MA4,6)*0.95,colorff00ff,linethick3; {2017 vc++ 15.0 , dll计算}3 f( T: P7 \- S
其他例子
' e/ {& H9 R' D  Y3 ?! E# ioooq:="MYFUNC2008good@MYMACLOSE"(c,,c,c,6),colorffffff,linethick5;(---> pow10.asm)3 @# j8 K3 a) h( t  ?6 q
oooq1:"MYFUNC2010@MYMAVAR"(ma(c,5),5),colorgreen,linethick5;
& i4 l' x! O: ~) T. {- [+ h% Y/ Y其中pow10.asm里面有很多不同定义或宣告被注解不用,那是因为后来在逐步侦测法修改语码中才发现在foxfunc.cpp主程式中,下面这行错误,也就是新的 compiler不再相容于 C,因此在pow10.asm里面被注解不用的定义或宣告中,有些应该是可以用的) O& n. K) P  k
fTotal= pData->m_pData.m_fClose; // @@@@@@@ vc++ 2010 cl.exe 使pData->m_pData[i-j].m_fClose错误
6 b* e6 z: T: k* ~3 [; x- O. Z6 I' j1 H5 ~( J+ ~: q4 B- C
8 n: |2 M1 w' p
////////////////////////////////////////////////////////foxfunc.h& d) w% M& e4 D9 Y' ~4 h
#ifndef__FOXFUNC_H_INCLUDE
& C7 v8 k: V8 l5 n( A+ a. H6 }- J#define__FOXFUNC_H_INCLUDE" b7 C; e8 Q* }
/*. x& ~1 Z; i4 O! I4 O
飞狐交易师“C语言接口”扩展程序调用接口规范V3.0
4 ?: j+ ]9 M$ V9 U1.本规范适用于飞狐交易师V3.x公式系统.2 y# ^9 f* |: O# y' P, A: Z* m
2.扩展函数用于实现系统函数不能实现的特殊算法.* K2 x1 \- H" y) q# }# b
3.扩展函数用windows32位动态连接库实现,建议使用MicrosoftVisual C++编程.
" n) L; J+ [0 N. o% @9 H4.调用时在公式编辑器中写"动态库名称@函数名称"(参数表)即可,例如下面函数可以写为"FOXFUNC@MYMACLOSE"(5), j( l# W, h  f  O: i
5.动态连接库名称和函数名称可以自己定义.
( \7 o' j2 `2 `5 a0 q; @6.使用时必须将动态库拷贝到飞狐交易师安装目录下的FmlDLL子目录下使用.
  m0 I+ I, V/ V% t* _  m*/) w7 A4 R$ F9 C- {; p
#ifdef__cplusplus) K1 o7 @% t4 K/ i1 o7 E( @
extern"C"
" |- q+ ^3 B1 w  [; }* h+ g{( j- Q, i" i% Y7 x$ D$ i+ P1 _
#endif//__cplusplus
) L% t8 d* K  Y% C///////////////////////////////////////////////////////////////////////////
2 F2 j( @5 s3 P//分析周期/ [5 H, B$ D) n# f, o
enumDATA_TYPE' c) C9 U- m% k+ ~) p% `7 ^
{
3 M; _4 K& m& k6 f. L4 Z7 r- CTICK_DATA=2,//分笔成交
" D) p8 p$ R  g" G5 e# qMIN1_DATA,//1分钟线6 D4 n! u6 Z' }' Y8 Z5 w( X
MIN5_DATA,//5分钟线 % r7 z2 t; v$ V, h: @4 w/ a
MIN15_DATA,//15分钟线
7 ^' v0 w, w; d) nMIN30_DATA,//30分钟线
3 C9 v7 j- F* t, q1 F. W4 BMIN60_DATA,//60分钟线+ \9 A) r5 e0 v! g2 B
DAY_DATA,//日线* }4 O0 a+ ^' u# x7 \/ d
WEEK_DATA,//周线& K) M, F" v* U9 p1 @
MONTH_DATA,//月线2 N) l  s. T/ W1 H- j. o
YEAR_DATA,//年线! l3 K% J- i* O7 g& g% {
MULTIDAY_DATA,//多日线
- _; U3 b: y: v) {3 sMULTIMIN_DATA//多分钟线
% ?+ k- E0 I: W( g+ k};
% e/ S. }) o  y$ e" j///////////////////////////////////////////////////////////////////////////
% X" d6 S8 D2 K+ P: y9 V//定义取用股票基本数据的结构 只有 VC++ 6.0 compile成功使用2 O' I8 |! g' g+ Y$ h. ~
typedefstruct tagSTKDATA
& a8 X) ^4 k* F; Z# P4 P8 s" f{
6 {5 S- r6 X- t7 L_tm_; //时间,UCT
: V4 \* e# N0 Y4 C  w" I1 |; dfloatm_fOpen; //开盘 open
7 z& l7 z* M* m3 O- G0 X% `5 Z9 afloatm_fHigh; //最高 high
4 M! |1 H1 O  k9 B$ w, P3 [+ Vfloatm_fLow; //最低 low$ e* g) w/ q  F1 Q
floatm_fClose; //收盘 close
% M' {1 F  [, I" }floatm_fVolume; //成交量 Volume0 {! e/ J  ^6 d3 |) C$ o8 w
floatm_fAmount; //成交额 amount
" x9 w* Z/ o) C1 r! gWORDm_wAdvance; //上涨家数 仅大盘有效
7 Z! G4 J( k# j( ~( V# m& y; E3 bWORDm_wDecline; //下跌家数 仅大盘有效. l+ ?( J7 U* Z6 Q' s8 U
}STKDATA;
- w$ l, j0 }$ j/ c1 f定义STKDATAtagSTKDATA的简单别名,STKDATA 7 G" b3 E2 J6 b, ?4 r: `5 D0 G) e
为真正方便使用名称,tagSTKDATA 为定目的的过水名称
0 \3 C/ a$ x0 S2 R////////////////////////////////////////////////////////////////////////////
5 h: h- l0 C" K//扩展数据,用于定义取用分笔成交数据的买卖盘 的结构6 Q1 u+ }4 l. }+ e4 {8 f# d) q: b. h
typedefunion tagSTKDATAEx
0 H% n: t7 R8 ^$ J{
$ [  i' c$ E( E3 X) F& mstruct- Z3 G8 A6 H) a/ _. N
{
+ `0 j! d( k) Dfloatm_fBuyPrice[3]; //1--3floatm_fOpen; //开盘 open9 \0 i/ N- [. G
floatm_fHigh; //最高 high$ T3 ]7 E, k' Y
floatm_fLow; //最低 low
. X3 h0 a6 a+ d# }5 pfloatm_fClose; //收盘 close; O- |+ `6 ?, E) @" e  U
floatm_fVolume; //成交量 Volume5 i/ `/ x/ y, W. C! w. V! D' `& E4 I* p1 J
floatm_fAmount; //成交额 amount4 J/ R, S) c6 [7 U- ^4 F6 I
floatm_fBuyVol[3]; //1--3" X6 a8 p4 M) R9 V3 n3 M: j* m
floatm_fSellPrice[3]; //1--3
0 s5 U# A( y) S/ L0 G7 X( z+ Kfloatm_fSellVol[3]; //1--3
* v- t2 q) O. J, n* I};
: K" ^* w1 Z9 F/ k! m' ufloatm_fDataEx[12];
8 M, Z0 ?. Q! g& h8 v" l}STKDATAEx;# H. h9 S$ \0 }
////////////////////////////////////////////////////////////////////////////5 `9 k% A- {0 p1 S1 e4 \
//定义取用除权数据的结构
3 c# `0 F/ p/ p- T2 z% V+ t9 ztypedefstruct tagSPLITDATA
# E4 z$ C- m8 @( G0 W5 ~{- ~) I! ]6 i- x4 S/ a1 d
time_tm_time; //时间,UCT& @3 D0 N: L9 A& a1 a
floatm_fHg; //红股4 O6 K( G) q: J
floatm_fPg; //配股
5 H, ?$ F- Y4 Zfloatm_fPgj; //配股价
7 q9 t# M; s" i# wfloatm_fHl; //红利
% U9 @/ X! @! p5 f0 A$ c( o}SPLITDATA;
% @: |! `3 r& l% l# a0 ~/////////////////////////////////////////////////////////////////////////////8 y: E, m, v9 t
/*财务数据顺序(m_pfFinData内容)& S# z- l4 l" J! B# h
序号内容' K$ s& F& [& r4 G% G- M; N; K9 _
0总股本(万股),
- Y* m: M/ G" ~1国家股,
3 @& r2 z7 _8 f* S) U2发起人法人股,/ Q2 z7 E. s( R, k' d  H( K
3法人股,
* ^; J1 W; y4 r5 ~3 r, P; Y. u4B,
: g$ y: C$ P2 A5H,/ X3 l$ b# m- O' h& K. v
6流通A,
% v, ]$ n- v+ x5 ^. y: I7职工股,
" a8 d+ D8 m- _+ ?8A2转配股,
2 t) Q* K% v$ R+ I( n, P4 }, D9总资产(千元),# b0 n2 n( m4 D$ ~
10流动资产,
& e& g0 d8 {. G+ S& r# [11固定资产,# @" P! d( L2 H" X" m
12无形资产,
: @, H4 Q& M9 ?4 k13长期投资,1 x* M+ v) t8 [# Q* Y' p4 m
14流动负债,% U% s# f, s2 Z
15长期负债,1 U1 C4 J, N) U! u
16资本公积金,! E4 z) c. u" V, Z( e% m
17每股公积金,. i0 v  T+ v2 ]; f2 i
18股东权益,
/ T5 ]0 a8 c6 u19主营收入,: z  k# T' f) |, O% m7 d5 Z4 c
20主营利润,  ~( P* P' j' I' {0 m( M8 \% v
21其他利润,  r0 U- Z( @/ X. [# l- H9 ^
22营业利润,
5 Z' d% }. S3 x  m4 F& O9 F23投资收益,$ l7 p" R4 P- O8 ~. G3 ]- {" c
24补贴收入,0 l; |3 H) x3 q
25营业外收支,2 E' V! P7 L5 \# J- B0 [2 I
26上年损益调整,
6 f/ i3 w& x  ^7 L8 U27利润总额,
9 h0 {( U$ b1 _2 E' M% I# W" R28税后利润,
6 w5 ~  q& T: w) {29净利润,
  [2 {# E- K6 ?, J' W30未分配利润,
) D: y, ~) {# o- o9 {31每股未分配,2 C( ]9 c( ]2 h" F
32每股收益,% [, P  I* {& i+ I7 N
33每股净资产,; U9 K9 D9 ?2 Q. I4 y, |6 D5 d7 p
34调整每股净资,4 E/ D( d1 T- w% p5 Q0 G7 C- t
35股东权益比,9 y* @- ]# p5 U1 k; o! w4 _
36净资收益率
1 p* [; f% p( R4 [! M*/
; _- H& L3 {8 r4 H; C4 e/////////////////////////////////////////////////////////////3 q  F; @! U/ x& X
//定义取用caller函数传递参数项 的结构( W( x4 L! T3 m8 k/ D
typedefstruct tagCALCPARAM& n6 K; _# E; j6 O0 n; ~. C
{! a* v4 z) U: G0 U/ F) D5 s& u4 ^# S
union  ]% b. M0 W8 \+ C! I; ~+ ?
{6 {0 g) |7 O( b! @4 v, I
constfloat* m_pfParam; //指向序列参数的址标,指向一个浮点型数组pointertofloat variable parameter / ex. c,h,l,o, co2...co2=(c+o)/2
' m8 Y: W4 U3 x% `. N$ l! Cconstfloat m_fParam; //数值参数 valueof parameter
3 Q# G9 d& M5 h& Z+ `% p" p/ H};2 z; Q! i/ n' |0 e4 v
constint m_nParamStart; //序列参数有效起始位置thestart address of variable parameter / ex. c,h,l,o,co2.....) g! J7 o& r( c7 Z$ Z
}CALCPARAM;
3 _' T9 v7 k* }: J. v% E2 |( B; x; f5 V* |: S/////////////////////////////////////////////////////////////////////////////
* `) B6 K# w2 q- A. ~! T//定义全部取用址标 的总结构 (各指标指向前述各结构以便取的各结构的数据,接口信息数据的结构 )
' \( s' p  |7 M8 y: N9 mtypedefstruct tagCALCINFO$ t: _6 o) j7 c
{
" N0 W: c4 j+ pconstDWORD m_dwSize; //结构大小$ p% H6 d9 o) C
constDWORD m_dwVersion; //调用软件版本(V2.10: 0x210)
, R* f- e' b6 oconstDWORD m_dwSerial; //调用软件序列号% S$ B: t  J& X( c! Q
constchar* m_strStkLabel; //股票代码: e7 j! N/ G+ p
constBOOL m_bIndex; //大盘
) H1 U% S! V0 c) {constint m_nNumData; //数据数量(pData,pDataEx,pResultBuf数据数量)数据长度
/ z) {( b0 v) X/ M, m; @1 d, ]! oconstSTKDATA* m_pData; //常规数据,注意:m_nNumData==0时可能为NULL
7 f5 R+ R: m8 ^constSTKDATAEx* m_pDataEx; //扩展数据,分笔成交买卖盘,注意:可能为NULL
1 g9 U; b4 }& l6 xconstint m_nParam1Start; //参数1有效起始位置<0/ constant parameter >0 /variable parameter 4 ]( j3 V$ I6 W: c( \) \+ ^$ Z
constfloat* m_pfParam1; //调用参数1/pointer to variable parameter 1 ) l1 u3 q1 J6 P# s# W
constfloat* m_pfParam2; //调用参数2/pointer to variable parameter 2
7 Z! a8 U  s4 `& n2 f- u/ o& Oconstfloat* m_pfParam3; //调用参数3/pointer to variable parameter 39 D/ A  W% F7 ~
constfloat* m_pfParam4; //调用参数4/pointer to variable parameter 49 c" Y8 v) h" |1 ]  \
float*m_pResultBuf; //结果缓冲区
8 {2 z: f% L2 A7 }% mconstDWORD m_dataType; //数据类型( q( \5 o" K% A. W
constfloat* m_pfFinData; //财务数据
, Z$ Z( m* Z! X' |( G( V//以上与分析家兼容,所以沿用其结构和名称
* w% P  f7 [* U9 }: c//以下为飞狐交易师扩展(fortagSTKDATAEx)
2 H/ L% x9 X1 PconstDWORD m_dwReserved; // 保留  k+ z6 ^8 L% A) _4 e$ x, t
constint m_nNumParam; // 调用参数数量0 L2 e& O8 W* |; n
constCALCPARAM* m_pCalcParam; // 调用参数数组
+ j4 i/ a( P6 e& V; h" E! \0 XconstDWORD m_dwReservedEx[4]; // 保留
9 ^4 y" U- l5 w6 ?  z7 z- w3 V7 ^char*m_strStkName; //股票名称2 u0 X. ~5 w# C
SPLITDATA*m_pSplitData; //除权数据
9 t! E5 i& F$ ?2 z% w% ?- b2 Aintm_nNumSplitData; //除权次数5 e. r+ b3 l6 q: C6 p6 b, n# Q
}CALCINFO;  g4 b' A- w/ W
/*! b% t6 D/ S. {9 z2 f
1:(与分析家兼容)
0 x- q* k* s+ W, @1.函数调用参数由m_pfParam1--m_pfParam4带入,若为NULL则表示该参数无效.
: m5 l* J; B9 U6 n2.当一个参数无效时,则其后的所有参数均无效.
) Q2 j8 {3 a, |7 m9 t' w% e: _:m_pfParam2NULL,m_pfParam3,m_pfParam4一定为NULL.  K0 o# Q. W$ C" W
3.参数1可以是常数参数或序列数参数,其馀参数只能为常数参数.
. ]% J0 O5 P* _; B4.m_nParam1Start<0,则参数1为常数参数,参数等于*m_pfParam1;
! X) d% j! L4 y5 o5.m_nParam1Start>=0,则参数1为序列数参数,m_pfParam1指向一个浮点型数组,
6 C+ b8 x4 k6 a* E6 L; n数组大小为m_nNumData,数据有效范围为m_nParam1Startm_nNumData-1.
1 K; p; G! f* B8 Z0 O' G1 |, Q在时间上m_pData[x]m_pfParam1[x]是一致的
" q3 \. s1 [0 m, B/ r# b' _2:(飞狐交易师扩展)$ |' t" ^2 i: h
1.该扩展结构使调用参数在技术上可以是无限数目的,且每个参数都可为数值或序列,由公式中实际的调用参数决定。
3 h2 _* R: O, v3 m% R; l2.CALCPARAM结构用于带入参数信息和实际数据,m_pCalcParam数组大小为m_nNumParam,数据有效范围为0 m_nNumParam-1.- Z2 R9 S4 {- L1 B& k7 e- u
3.按参数的顺序,m_pCalcParam[0]为第一个参数的数据,m_pCalcParam[1]为第二个参数的数据...,为了保持兼容,原m_nParam1Startm_pfParam15个属性依然有赋值。: e% y  f& K* m6 Z3 O
4.i位置的参数为数值,取用m_pCalcParam.m_fParam.6 G& R5 E' Q8 E5 B& s
5.i位置的参数为序列,取用m_pCalcParam.m_pfParam,数组大小为m_nNumData,数据有效范围为m_pCalcParam.m_nParamStartm_nNumData-1.m_pCalcParam.m_nParamStart<0,则此数组中无有效数据。- g! q1 |4 A9 t0 Q6 G
6.由于可以调用多个序列,许多序列的计算可以先在公式中进行,然后作为调用的参数即可。
3 |4 |# g* w( D: v0 g9 y. R- D7.经此扩展,对分析家的DLL依然可以调用、兼容。
' r& E8 X" g+ j4 D6 I*/
( m* ?; _" V0 O, G- G' b///////////////////////////////////////////////////////////////////////////////////) O% e/ `. o- d4 i, K0 R! e
/*函数输出
) K7 H5 B& ]; {__declspec(dllexport)int xxxxxxxx(CALCINFO* pData);
- V; ~; E0 [4 M% w! G1.函数名称需全部大写.
+ l5 l* [: ?& [5 f. z# F4 i: ?2.函数必须以上述形式声明,请用实际函数名称替代xxxxxxxx;- |9 T' }- W" f! B3 C- h9 y1 _3 x
对于C++程序还需包括在extern"C" { } 括号中.
! U& N8 p/ o  w  b1 C- n: p3 Y3.函数计算结果用pData->m_pResultBuf带回.
7 q2 y9 @2 B9 M# ]7 l4.函数返回-1表示错误或全部数据无效,否则返回第一个有效值位置,:
1 t6 x: B$ a8 c9 ^m_pResultBuf[返回值]-- m_pResultBuf[m_nNumData-1]间为有效值.7 N2 a) e. b( w1 A
5.函数名称长度不能超过15字节,动态连接库文件名不能超过9字节(不包括扩展名),动态库名称不能叫SYSTEM,EXPLORER
+ Z( c( F' x3 J* W& w*/
/ w5 h, g6 x) i6 I$ }//示例函数,使用时用实际名称替换
3 O8 s! C; e* l5 F( O__declspec(dllexport)int WINAPI MYMACLOSE(CALCINFO* pData);
* i6 y6 ]" `9 h3 s& Q( I__declspec(dllexport)int WINAPI SMOOTH(CALCINFO* pData);8 B9 g* T2 Z+ E' V3 x
//__declspec(dllexport) int WINAPI MYMAVAR(CALCINFO* pData);
( m. b( M2 I) ~. x__declspec(dllexport)int WINAPI MYBBI(CALCINFO* pData);
! g. O7 o, Z3 n; f  M* t( b) X//WINAPI = _stdcall+ M- T; ?/ B4 Y  L. T
#ifdef__cplusplus
, I6 ?: l: M) b6 i. ]; o2 W1 I}! U, ]2 G) n# s/ }7 J
#endif//__cplusplus
" }! E4 ~7 O( B' X; u" B#endif//__FOXFUNC_H_INCLUDE9 j8 L; l, v' }% }+ v, E( W

, a% P" P' J+ q//////////////////////////////////////////comment 注解
7 t6 L- G! Z3 @: C__declspec(dllexport)int WINAPI MYMAVAR(CALCINFO* pData)
! ~* L' U' v- t% c6 apData是指向 址标总结构 CALCINFO的 总址标
2 b8 l* R' R3 p8 y) G取用第二个参数数值floatfParam = *pData→m_pfParam2
1 d7 {. m- I' ?, A0 d! p: `' [取用第一个序列参数的址标constfloat* pValue = pData->m_pfParam1;* K( j  L+ w5 G
取用股票数据长度intndata = pData→m_nNumData;
! X- ?) U+ E8 A" O第一个参数存在且为数值pData->m_pfParam1&& pData→m_nParam1Start<0
& D7 |$ f! \* L+ ?! t第一个参数存在且为序列pData->m_pfParam1&& pData→m_nParam1Start>=00 F& r" N8 _* I' m1 |
第一个及第二个参数存在且为序列,第三个参数不存在pData->m_pfParam1&& pData->m_pfParam2 && pData->m_nParam1Start>=0&& pData->m_pfParam3==NULL  y! i* W7 j+ n9 i1 ^
constfloat* cpParam = pData->m_pfParam1; 定义cpParam为第一个序列参数的址标
" Y$ d6 \6 ?; v8 o2 G% z取用股票数据结构
# S: M, L4 Y" M' S4 R: |' IpData→m_nNumData= 变数数据长度
8 C. f; @; q0 ?* RpData→m_pData= pointer to struc STKDATA 的址标0 T8 W+ F8 e6 a. O
pData→m_pData[x]数据结构的第x个数据1 j6 g! q6 [" y, n( H- P! j
pData→m_pData[x].m_fHigh数据结构的第x个数据中的 High' |2 D3 A9 z$ Y; x
取用结果缓冲序列1 X- A, p5 h  t) B4 Z6 X
pData->m_pResultBuf
# r2 B2 K+ @6 Q6 b7 U1 P0 \取得第一个序列参数的起始序位,2,...5 , . 7...+ a1 ?5 t! x7 ~  A6 R, \: G' ~
intnFirst = pData->m_nParam1Start; # g: w, O6 v, [! ]- e5 _5 W/ q6 \
for( i = nFirst+nPeriod-1; i < pData->m_nNumData; i++ )  a' B0 G. y1 V1 _& f8 M
取得第二个数值参数的数值
9 i! N  y( w* f2 B& c+ S( UfloatfParam = *pData->m_pfParam2; , I! L4 d3 K: W/ V/ ?
intnPeriod = (int)fParam;% C# V! {* N/ q$ S" {$ v/ e( _. m
取用第一个序列参数的址标constfloat* pValue = pData→m_pfParam1;$ J8 S# G3 G5 I- ?' [
取用序列参数的单个直pValue5 K! s+ G" M, e# \
取用缓冲序列的单个值pData->m_pResultBuf1 B. H& {+ `' |6 B( R6 c+ Q
constCALCPARAM* m_pCalcParam; // 调用参数数组
5 X9 j, @' q% e( p. c8 }m_pCalcParam为序列址标,指向各序列参数的指标
1 o* X$ @  X+ X$ N$ U7 r- O- L9 J第一个序列参数pData→m_pCalcParam[0]
5 H: e3 @( H& r( [; {% U7 m# }constfloat* m_pfParam; //指向序列参数的址标) U$ v  H! g7 o" E/ l
第一个序列参数的起始序位pData->m_pCalcParam[0].m_nParamStart
& D0 s" Q& m( v' Y$ @' E  i+ b* `第一个序列参数的址标constfloat* pValue1 = pData→m_pCalcParam[0].m_pfParam;: P8 U; c* G+ u- A. z1 w- m/ s/ M% k0 H2 `
取用第一个序列参数的单个直pValue1
) J. n1 _) Y$ G! j( E5 Y9 `第二个序列参数pData→m_pCalcParam[1]! o) @, ?" y1 k2 @7 n6 b
第二个序列参数的起始序位pData->m_pCalcParam[1].m_nParamStart
2 T3 B# ]* ^8 K: g3 W- b. `9 G6 T第二个序列参数的址标constfloat* pValue1 = pData→m_pCalcParam[1].m_pfParam;9 e& |; W( I6 _- n7 }) K0 w
取用第二个序列参数的单个直pValue2& Y4 E+ T5 Y8 A
第三个序列参数pData→m_pCalcParam[2], o: Q% j2 F8 F" o! y$ o& ~) U" A
第三个序列参数的起始序位pData->m_pCalcParam[2].m_nParamStart
: `& I% U! g% G) T& a, @* B第三个序列参数的址标constfloat* pValue1 = pData→m_pCalcParam[2].m_pfParam;+ z5 y4 I4 w; @* M; Q
取用第三个序列参数的单个直pValue3  {2 X5 ]$ m, J: E% [! K
第四个序列参数pData→m_pCalcParam[3]
2 t2 w$ h- d0 M& S5 B4 A第四个序列参数的起始序位pData->m_pCalcParam[3].m_nParamStart
1 j0 z6 |, J# v第四个序列参数的址标constfloat* pValue1 = pData→m_pCalcParam[3].m_pfParam;, H2 c* y- G. {$ J
取用第四个序列参数的单个直pValue4
1 b( L/ ], Y$ i: K8 G+ R! u$ K如果有四个序列参数,则取用序位最高的那一个序位, y$ ?/ Y/ _& v" B( P) v3 z
if( pData->m_pCalcParam[0].m_nParamStart >= 0 &&
; w2 p7 H* [  p6 V' C' |; @pData->m_pCalcParam[1].m_nParamStart>= 0 &&$ f% c5 y. Q. X, G/ r" D1 D1 X4 L
pData->m_pCalcParam[2].m_nParamStart>= 0 &&) _; T( g4 V  V' Z) j) X
pData->m_pCalcParam[3].m_nParamStart>= 0 ) //4个序列都含有效数值" L+ v! c$ J) t' w9 E1 F: P
{! Z# p* P6 v# U; D
//计算返回的序列的第一个有效值位置
4 F9 e0 d/ V# j; J( w: zintnFirst = pData->m_pCalcParam[3].m_nParamStart;//已知返回的序列的第一个有效值位置与第4个序列一致
6 A4 [$ W) O  P2 h2 v1 d' q//若不知,则
4 y2 B" K  j" c- E  ]1 m/*2 M' u8 u. i* @9 I. Q% z. f
intnFirst = pData->m_pCalcParam[0].m_nParamStart;
9 Z  k! q5 ]- _if( nFirst < pData->m_pCalcParam[1].m_nParamStart ) 2 r: @- V& H7 t; D6 ]! l
nFirst= pData->m_pCalcParam[1].m_nParamStart;
7 v% }/ d0 Y- s. c7 rif( nFirst < pData->m_pCalcParam[2].m_nParamStart )
4 s' f* H# z: A" j2 u% DnFirst= pData->m_pCalcParam[2].m_nParamStart;9 M& d% v9 {& f' q7 n7 |: i
if( nFirst < pData->m_pCalcParam[3].m_nParamStart ) ) Z% s  g5 q7 e! o
nFirst= pData→m_pCalcParam[3].m_nParamStart;
* [) q1 S! X& |constfloat* pValue1 = pData->m_pCalcParam[0].m_pfParam;3 J9 O5 E) n3 }* j) j
constfloat* pValue2 = pData->m_pCalcParam[1].m_pfParam;) X- a6 R: W8 n& i6 T: \. q
constfloat* pValue3 = pData->m_pCalcParam[2].m_pfParam;
% h/ b, |* z8 v8 ]* x" nconstfloat* pValue4 = pData->m_pCalcParam[3].m_pfParam;" `- r/ R: q/ m$ s( Y
//-------------------
" d5 \% [; y" F/ r0 T9 o: Nfloatm_fOpen; //开盘 open. L0 i" u: n: g3 ?
floatm_fHigh; //最高 high3 O5 |! t3 b/ D; X8 S8 g1 Z
floatm_fLow; //最低 low: L% [3 Z& Y& o, a- d4 Y& R
floatm_fClose; //收盘 close, m8 Q6 L6 z# Y
floatm_fVolume; //成交量 Volume
) s9 g5 p) d( b' A- H5 ?floatm_fAmount; //成交额 amount
% f7 ^' p" J3 F调用收盘据6 d; I% e% V1 V+ i8 A, f2 v' j
pData→m_nNumData= 变数数据长度- K  N4 ~/ q/ R6 s2 k$ y: y
pData→m_pData= pointer to struc STKDATA
, X8 h! x2 {. e( cpData→m_pData[x]x个数据
; V1 I4 e; z: ?9 s% epData→m_pData[x].m_fHighx个数据中的 High8 _$ q9 h! Z1 s: ], h, r) ?
@@@@@@@@@@@important !!!!!!!9 v0 o+ V# j* T, {0 E
sinceVC++ 2008, cl.exe will make ‘pData→m_pData[i-j].m_fClose’ anerror( ?" G3 F; W% X; a. h
so,pass the high,low,open and close just from the function parameter ,that is use ‘ CALCPARAM’ struct& m/ C# D$ v& H  K, e
pData->m_pData[i-j].m_fOpen// to use open , there is no way in using a varable for calculationoutside foxtrader& k7 s! t  L% i9 d$ d: k2 H7 H
pData→m_pData[i-j].m_fHighto use high
5 P& a) B( f* b- r0 ]/ ^pData->m_pData[i-j].m_fLow
% }5 s: w2 w% H4 g& fpData->m_pData[i-j].m_fClose
' R0 D/ ]; G! G! w: s4 a2 d4 |# }7 \9 ym_pData= pointer to struc STKDATA9 s6 _$ u9 B$ m$ G7 u
incalling C++ dll function
/ O+ C+ J( X2 V6 V3 k6 bm_pDatais passed to pData (CALCINFO* pData . A CALCINFO* type pointer)
8 o! ]- K$ z6 i+ U& |8 v; btouse a single value in variable ‘High’
- r  D8 B. b+ `$ g! n: {" @pData→m_pData[i-j].m_fHighto use high( p' V  y' n1 J3 ?, s. s
constfloat* m_pfParam1; //调用参数1/pointer to variable parameter 1
, L$ l/ Q& F$ {/ `7 Gconstfloat* m_pfParam2; //调用参数2/pointer to variable parameter 28 q: {/ l( s+ {
constfloat* m_pfParam3; //调用参数3/pointer to variable parameter 3
% E' w. m- [8 E* H* jconstfloat* m_pfParam4; & ?; Y6 ~9 ]/ b* B$ d+ N
m_pfParam1,m_pfParam2, m_pfParam3, m_pfParam4 = pointer to caller function 的参数
; V8 w# B" H  ?7 D( P/ bpData→m_pfParam1= pointer to 第一个(序列)参数. o) E9 k* g3 `& V& W3 H( F
pData→m_pfParam1[x]= 取用第一个(序列)参数的第x 个值
: B) E# M" g8 W# B8 vconstfloat* cpParam = pData→m_pfParam1; =定义 cpParampointerto 第一个(序列)参数: Y! L3 a6 {! E8 q% J
cpParam[x] = 取用第一个(序列)参数的第x 个值1 s  _4 e# C* b% }
m_pResultBuf= 结果缓冲列
0 P& B6 M8 @- W. z6 T- MpData→m_pResultBuf= pointer to 结果缓冲列
. c4 I3 j" \. e. x2 g( F+ l$ UpData→m_pResultBuf[x] = 取用结果缓冲列的第 x个值0 P7 x- H0 i% S  M6 ^
//////////////////////////////////////////comment. l  ?. [4 B- H- c# o+ g  U& x
//////////////////////////////////////////comment 注解
/ X( y8 M5 ~  x5 g& Xconstint m_nParam1Start; //统杅1衄虴宎弇离
8 T" l0 o$ b: F2 e* U. R/ `constfloat* m_pfParam1; //覃蚚统杅1) Q2 V8 e7 W* z) N6 F
constfloat* m_pfParam2; //覃蚚统杅2
- ^: \+ o* N* X/ D1 V6 y9 ?" m, Bconstfloat* m_pfParam3; //覃蚚统杅34 n. p3 ]9 M( z/ y. u( T
constfloat* m_pfParam4; //覃蚚统杅4,parameters must be <= 49 h) }) d( i' |% R! I* u
//const float* m_pfParam5; // parameters must be <= 4# G& q! G1 |( [: L
//const float* m_pfParam6;
9 ^' W4 }7 m$ C% @0 P+ W0 L% R//const float* m_pfParam7;
* a6 l+ W+ K. c) D6 [//const float* m_pfParam8;
; ]+ \6 N- {; t% u6 {//pData->m_pfParam1 && pData->m_pfParam2 &&pData->m_pfParam3 && pData->m_nParam1Start>=0 &&4 C8 ]) J8 w+ z9 c$ ^+ b
pData->m_pCalcParam[0].m_nParamStart>=0&& pData->m_pCalcParam[1].m_nParamStart>=0: j  @  {  y1 G& Z9 F: K
&&pData->m_pCalcParam[2].m_nParamStart>=0) $ {9 J& a/ F9 W7 C
{
- Y3 l( B  Z3 W! W% L. b% qfloatfParam = *pData->m_pfParam4; //pointer ,pData->m_pCalcParam[3].m_nParamStart >= 0. ^1 v* O9 T- G2 O, w
intnPeriod = (int)fParam; //统杅1! S' s: U8 @9 O0 b& f
//const float* cpParam = pData->m_pfParam2; // cpParam = pointer to第一个序列参数,cpParam = 取用第一个序列参数的第i 个值6 @3 C' ]% u3 d; i, P: O
constfloat* cpParam1 =pData->m_pCalcParam[0].m_pfParam; // cpParam =pointer to 第一个序列参数,cpParam = 取用第一个序列参数的第i 个值" \1 f+ C: L; t% `" q# p7 k% ^
constfloat* cpParam2 =pData->m_pCalcParam[1].m_pfParam; // cpParam =pointer to 第一个序列参数,cpParam = 取用第一个序列参数的第i 个值
$ X$ b, N4 Q) R+ x& g4 U# r/ j9 lconstfloat* cpParam3 =pData->m_pCalcParam[2].m_pfParam; // cpParam =pointer to 第一个序列参数,cpParam = 取用第一个序列参数的第i 个值//parameters must be <= 4
# B; k3 j0 b7 \: h//const float* cpParam4 =pData->m_pCalcParam[3].m_pfParam; //cpParam = pointer to 第一个序列参数,cpParam = 取用第一个序列参数的第i 个值
( W/ Q' K: U2 s. k//const float* cpParam5 =pData->m_pCalcParam[4].m_pfParam; //cpParam = pointer to 第一个序列参数,cpParam = 取用第一个序列参数的第i 个值7 n- K- E* ^, W! B
//m_pData = const struct pointer to struct STKDATA , pointer to structSTKDATA ,
7 a/ k6 F* \' a5 _9 {touse pData→m_pData[x].m_fClose
3 p  ^" W6 S8 T$ epData→m_pData[x]= | 1,2,3 , … , m_nNumParam | time_t m_time;
. c6 U3 I8 Y* h; f|1,2,3 , … , m_nNumParam | float m_fOime_t ' O" e% H" s3 k& [" ?8 J( ^" s
|1,2,3 , … , m_nNumParam | float m_fHigh;
0 k7 N- L' ?) @.. .
3 K+ J: e9 T9 I5 w: }$ m3 p|1,2,3 , … , m_nNumParam | WORD m_wDecline;
. V; y) i1 J/ n" H8 W- H; B+ U& N3 Rm_nNumParam= 数据high,close,open,low的长度# M+ `4 L7 Z  _  Z' S. F1 v* [
touse high:- I, X3 e1 j* v  @  Q. n
pData→m_pData[x].m_fHigh
$ H3 D* H6 k( ]$ l2 tcontentof struct STKDATA( h5 }$ d2 J& a% D0 o/ `
time_tm_time; //时间,UCT
4 N# S) o3 V2 H( ofloatm_fOpen; //开盘 open
8 [) ]% {' }5 z# b4 Afloatm_fHigh; //最高 high
4 N% ?, ^' u, z3 k# ?floatm_fLow; //最低 low
/ ]2 f2 a% |+ q4 q4 z' x/ Dfloatm_fClose; //收盘 close
! j- D: ?* o+ b; K& p: o5 Ffloatm_fVolume; //成交量 Volume
# T1 F0 [, v; h! Jfloatm_fAmount; //成交额 amount& E9 u9 l. c. ]
WORDm_wAdvance; //上涨家数 仅大盘有效# N- ~  B2 R& X4 l: f
WORDm_wDecline; //下跌家数 仅大盘有效
# O4 s, n$ |4 ^1 C$ @6 ~1 W3 m调用传递参数及传回结果
0 a& w5 j7 S$ @& E3 N调用传递参数% K& U; ~! I' k
(pData->m_pfParam1 && //参数1有效Param1exists% b; R2 E. g3 J8 b
pData->m_nParam1Start<0&& //参数1为常数  ~) ?( T) Z) `; s
pData->m_pfParam2==NULL) //
5 [. r% {' `# v2 Llocalprocedure 定义使用变数
! B5 }9 Q' g  B8 X6 e; A' sonstfloat* pValue = pData→m_pfParam1; //use constant参数1
, k  i2 q9 K" R' n1 N( Z% g: mintnFirst = pData->m_nParam1Start; //use 参数1效值起始位
* S1 |: D7 `* T. {* {$ J6 l7 wfloatfParam = *pData->m_pfParam2; //use 参数2! _! [# O5 d$ r" f. @- u+ f
intnPeriod = (int)fParam; 8 v+ [; T  R8 K: Y+ N  R
传回结果+ |( k3 L) P7 g$ Z
fTotal+= pValue[i-j];# ]) ~2 f% m9 p1 D1 A3 u% H! O
pData->m_pResultBuf
9 [# n7 n; N" y1 b/ p+ H  c//////////////////////////////////////////comment

评分

1

查看全部评分

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

本版积分规则

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

GMT+8, 2026-9-3 18:27 , Processed in 0.139013 second(s), 20 queries .

Powered by Discuz! X3.2 Licensed

© 2001-2013 Comsenz Inc.

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