阳光飞狐

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

 找回密码
 手机注册

手机动态码快速登录

手机号快速注册登录

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

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

[复制链接]
跳转到指定楼层
1#
发表于 2019-8-11 16:09:40 | 只看该作者 回帖奖励 |正序浏览 |阅读模式
许多年以前,我曾经在9 b& ^$ @$ T. L
理想公式区发布了
' l- y/ ^( [4 j3 P"9 I! D" Q% E2 [
如何用 Foxtrader(飞狐)连结 C++动态程式库 DLL80x86Macro Assembly (组合语言)
" @  X" o' w: F$ C8 ~2 i"1 i, D3 B8 b' C  {) h" `! i3 \+ V* g
) w, b. q" T+ t- i, R, u: y+ \/ U$ N  H
现在更新foxtrader(飞狐交易师) # X7 t! l3 t2 V6 M5 A* }1 y
连结 DLL的方法) A/ m' E5 G8 d8 a& Q% c8 h' [

4 |- r- C5 {* j" @8 G$ O8 D$ mfoxtrader- - > DLL (C++ and assembly) = ( foxfunc.h + foxfunc.cpp +pow10.asm )
4 p# ~0 @, t! Rgauss- - > DLL (C++ and assembly) = ( foxfunc.cpp + meigj.asm )
% N, \2 w; \, Xgauss只用到函数参数传递,所以使用新的 c++compiler, 不受影响  M2 u8 K' o$ I* }+ \- s" O
foxtraderfoxfunc.h宣告的结构型态 (struct)2004vc++ 6.0 全部有效. D6 x& A5 S' i" M5 S2 c
. J/ f$ F, G6 O/ ?# n9 T# T
也就是这五个结构都能用/ H* C1 F, f: B  N
typedefstruct tagSTKDATA ! ?2 f6 B7 u& [: v
typedefunion tagSTKDATAEx
* v' W% _+ E; d9 n9 w+ _$ ~typedefstruct tagSPLITDATA 5 ?7 p4 U" |' O
typedefstruct tagCALCPARAM# q' x4 ^0 `6 b* B. s1 h! b) ]
typedefstruct tagCALCINFO: x+ c! ~: a* J8 W) \5 r
7 m" y4 o8 F( l$ Z6 u
2008年起,vc++ 2008, vc++ 2010, vc++2017 struct的编译,已经完全 c++,不再相容于 C
$ U; \' ^/ [2 z+ n也就是这五个结构中$ x) b" L3 H5 n; X, \- n( ]
typedefstruct tagSTKDATA
4 g3 J5 d" d, B* f: u: ]typedefunion tagSTKDATAEx( w+ O& i+ s9 H) p; o2 d
typedefstruct tagSPLITDATA / f3 F9 m1 {  S% W3 \( T* K7 C
typedefstruct tagCALCPARAM: ^) h9 o5 u4 O
typedefstruct tagCALCINFO/ x0 X& `; T1 C; e* i# f7 ^
只有这两个可以用
" O2 C4 W4 c7 l  stypedefstruct tagCALCPARAM
  |5 \) K, Y1 d$ `typedefstruct tagCALCINFO
) n5 K6 `( N6 K, D0 X& M值得庆幸的是,下面这个结构的函数参数传递个数可以有无数个( T. [1 }0 ~. g1 g
typedefstruct tagCALCPARAM
* ^& `; i4 }( q) t6 N3 ?例如:foxtrader
; Z" X/ h3 E2 k7 x; _2 xMA1:=MA(CLOSE,3);
% I" C( Y( _, R9 s3 \MA2:=MA(CLOSE,6);5 `. X3 Q1 y; z/ R% w4 X
MA3:=MA(CLOSE,12);
, D/ T# I* C& q8 }MA4:=MA(CLOSE,24);7 p) N3 T5 N2 @3 i$ ?2 s7 Z; c
MYBBI1:"MYFUNC2017@MYBBI"(MA1, MA2,MA3,MA4,MA3,MA4,5)*0.95,colorff00ff,linethick3; {2017 vc++ 15.0}2 ]" F. c9 `5 R
其中MYFUNC2017=MYFUNC2017.dll, MYBBI = MYFUNC2017.dll 中的MYBBI函数,这里 MYBBI函数传递的参数共有 7
, b' p" q. Q% y* g9 Y下面这两式计算结果相同
/ @+ x' [. c# U2 r4 X* Dxx:(MA(CLOSE,3)+MA(CLOSE,6)+MA(CLOSE,12),MA(CLOSE,24),MA(CLOSE,12),),MA(CLOSE,24)/6*0.95,color0000ff,linethick2;{foxtrader 自行计算}
/ M$ K: \$ M6 Y- J6 ^( MMYBBI1:"MYFUNC2017@MYBBI"(MA1, MA2,MA3,MA4,MA3,MA4,6)*0.95,colorff00ff,linethick3; {2017 vc++ 15.0 , dll计算}/ y0 U$ A) Y- y" z
其他例子
! B' H, X$ m; x/ n" |1 Xoooq:="MYFUNC2008good@MYMACLOSE"(c,,c,c,6),colorffffff,linethick5;(---> pow10.asm)- o. A1 Y( R- @
oooq1:"MYFUNC2010@MYMAVAR"(ma(c,5),5),colorgreen,linethick5;
  N, p/ g# F8 d7 Y" [- w. M( {其中pow10.asm里面有很多不同定义或宣告被注解不用,那是因为后来在逐步侦测法修改语码中才发现在foxfunc.cpp主程式中,下面这行错误,也就是新的 compiler不再相容于 C,因此在pow10.asm里面被注解不用的定义或宣告中,有些应该是可以用的7 O: K: h2 `) D6 x
fTotal= pData->m_pData.m_fClose; // @@@@@@@ vc++ 2010 cl.exe 使pData->m_pData[i-j].m_fClose错误& Z' \% e  F1 Z0 G: f, q1 V

; k6 S5 u# z. X: D* R
  _7 L! |* ]' G////////////////////////////////////////////////////////foxfunc.h
. b6 h4 ~) Z$ k8 M( ]#ifndef__FOXFUNC_H_INCLUDE  S. n! K# K) C4 z9 Z
#define__FOXFUNC_H_INCLUDE$ m9 ?9 t  y# l! w
/*. m9 a. [% S1 b4 {$ y) G( q, r
飞狐交易师“C语言接口”扩展程序调用接口规范V3.0
- U9 R8 \! y, L. q, n8 a1.本规范适用于飞狐交易师V3.x公式系统.
  `) ^7 \2 |) q% V- y1 R/ T, y2.扩展函数用于实现系统函数不能实现的特殊算法.* K, x/ W8 C5 f2 {
3.扩展函数用windows32位动态连接库实现,建议使用MicrosoftVisual C++编程.+ C& S& `" C" g7 U
4.调用时在公式编辑器中写"动态库名称@函数名称"(参数表)即可,例如下面函数可以写为"FOXFUNC@MYMACLOSE"(5)
) B9 V6 g$ P  i3 o0 }: R. l- C5.动态连接库名称和函数名称可以自己定义.
( n$ J! e4 |. [6.使用时必须将动态库拷贝到飞狐交易师安装目录下的FmlDLL子目录下使用.2 T: ?9 I7 a' k6 E/ f
*/
, k: B- o2 {6 ?& J: r% h#ifdef__cplusplus
) g/ f6 Z0 {/ w" Z- [! ^- Bextern"C", w$ w, L6 @) X* ^" e
{
- [* \: a, \4 a0 I: u6 K1 i, X#endif//__cplusplus
. c" e8 d& z+ @4 v& t: P' c$ W$ [///////////////////////////////////////////////////////////////////////////& ^$ }" N; R* E! _
//分析周期. Z& g4 E5 b2 S6 J9 \
enumDATA_TYPE
4 q3 C! K7 E4 d5 Y/ ]{4 `( G; L4 \$ n5 N
TICK_DATA=2,//分笔成交
4 ~3 ]3 Z1 d9 L) @) G, s2 XMIN1_DATA,//1分钟线
$ a6 ~: c2 q7 g# WMIN5_DATA,//5分钟线
; J0 T; l. J% O* SMIN15_DATA,//15分钟线
" n! c$ Z- T5 P1 P& yMIN30_DATA,//30分钟线9 b+ d2 m9 J6 Z9 \5 m
MIN60_DATA,//60分钟线  H% ^6 o7 p  }8 [+ u
DAY_DATA,//日线
- N: T$ v  Z' [WEEK_DATA,//周线
5 R. T+ \% F1 o/ E( _4 ~! a) YMONTH_DATA,//月线$ F# ^: f8 _) K5 c
YEAR_DATA,//年线% M  `: Y! b' X3 J! l
MULTIDAY_DATA,//多日线
! n4 i5 ?# c$ GMULTIMIN_DATA//多分钟线
  f! D. k: n) W};
$ A: _2 O7 m* Y% `* l///////////////////////////////////////////////////////////////////////////: ^7 b% A8 Y0 X: s& C; w  H& k
//定义取用股票基本数据的结构 只有 VC++ 6.0 compile成功使用2 j  i+ [0 I+ s9 ^
typedefstruct tagSTKDATA
5 c+ }" O6 B! O' B: }% K{
, f" M7 b6 n+ H_tm_; //时间,UCT
: l) a# W/ q! \3 j5 ^floatm_fOpen; //开盘 open/ v  i. F9 d. Z; ?/ M+ v- y8 T
floatm_fHigh; //最高 high# C- @/ [1 N+ F7 }9 X! O
floatm_fLow; //最低 low
* a+ g: U! B5 e$ z& jfloatm_fClose; //收盘 close
# x( Z" a6 x9 hfloatm_fVolume; //成交量 Volume; ~' U- S9 J! d
floatm_fAmount; //成交额 amount
% S: p1 s8 d5 r# v( u. S9 PWORDm_wAdvance; //上涨家数 仅大盘有效
3 |: J) N) H2 @9 W1 i8 P9 tWORDm_wDecline; //下跌家数 仅大盘有效
, y9 }& H; m+ K: o. f}STKDATA;
* W( j  F% ~2 {0 h) J定义STKDATAtagSTKDATA的简单别名,STKDATA / I1 n) J" Z$ |3 R
为真正方便使用名称,tagSTKDATA 为定目的的过水名称6 J2 K! c, v! u1 F* m7 G
////////////////////////////////////////////////////////////////////////////9 f9 c; I& X4 e6 [8 y; O
//扩展数据,用于定义取用分笔成交数据的买卖盘 的结构9 }7 B3 b$ _$ Y% I- C' }0 g1 i
typedefunion tagSTKDATAEx1 P7 {+ L9 S/ i2 s
{
& R" u. m5 J: O# G3 @/ c/ G4 G& wstruct
+ q! G% ]9 K, _- `6 c$ h, e( J6 [{$ o- E; ^2 X+ |. }4 t
floatm_fBuyPrice[3]; //1--3floatm_fOpen; //开盘 open
  O9 ~3 n! X) {' G+ ufloatm_fHigh; //最高 high
' F( T$ S8 a# Y" y0 Gfloatm_fLow; //最低 low
  ?4 ]6 J, I( e0 bfloatm_fClose; //收盘 close% P/ O& V8 s' t! N( m& p2 V5 P
floatm_fVolume; //成交量 Volume
2 e: r7 o2 l, E& K! }# \floatm_fAmount; //成交额 amount
- L. h$ z0 N: H" G' ofloatm_fBuyVol[3]; //1--3
* v/ ~3 m. \, D/ Y* pfloatm_fSellPrice[3]; //1--38 Y0 c5 a" V' K
floatm_fSellVol[3]; //1--3
6 k& D4 X, ]7 ]4 t( R};& [; c; T* s6 g$ H+ c6 e( a
floatm_fDataEx[12];
  r! o# D/ l, ^0 m) H- |: G}STKDATAEx;
6 e' F0 W/ J* K# [& f9 H////////////////////////////////////////////////////////////////////////////
2 g: i2 I1 D( [0 K+ s2 n" D//定义取用除权数据的结构1 Y4 m$ v6 ^& q% B* A
typedefstruct tagSPLITDATA
" b8 @  {  H; u2 y  K# r* M{3 J8 j- E5 Y( V7 Q6 n5 v
time_tm_time; //时间,UCT1 Y/ M0 _. U- g" c$ C7 |
floatm_fHg; //红股
9 l. C" P! }; _floatm_fPg; //配股% q6 o; s5 Q# g0 q: \: B
floatm_fPgj; //配股价
8 c) A9 W0 H% d. f5 f6 |8 q3 Q% rfloatm_fHl; //红利, ]4 n& D8 {5 r, E" B
}SPLITDATA;
# [& w! ?- K5 b+ Q$ U8 r. V/////////////////////////////////////////////////////////////////////////////
4 q3 w# _5 I$ d/ y' Q8 d) ~/*财务数据顺序(m_pfFinData内容)
  T: O8 x1 v0 [0 \5 y  }序号内容' x2 F/ X" |4 p' a9 ~
0总股本(万股),
, Q: X! C. r8 S& @5 p/ [2 [+ d" @1国家股,
) L) G2 p+ f  o& E% y2发起人法人股,
5 Z4 t9 m9 a& Z) x+ r; J3 t3法人股,: G+ I. e4 P! \  f/ g
4B,5 C  {. H! t; A# g
5H," p6 G" _! \8 P, K5 |% N
6流通A,
5 s+ R/ P, g( a+ |' b; W3 J7职工股,
3 z3 x% I  [  P; w: e$ r5 u8A2转配股,
5 L$ R/ I+ \( G  C  d9总资产(千元),
" D0 b" G' A/ d) T6 a! O10流动资产,  G2 v6 h& W9 H& m3 [4 a
11固定资产,
& r3 _; A) a/ {' R6 s# R8 @$ X0 j12无形资产,# F2 \- }7 l, h& O4 V
13长期投资,9 X5 f3 u7 _3 @' v# N
14流动负债,& o! i# D3 P7 `+ e
15长期负债,
2 u1 t& h/ H, s( P  b0 b1 y/ }2 X16资本公积金,
: y# d# h* C; P' J" k17每股公积金,
) c* a4 h( ]: M1 a# H% t8 v1 u18股东权益,
7 r" }, |( j) C6 s3 R, \$ {9 C19主营收入,: f7 ~8 j" J1 X* d7 l
20主营利润,
( |  Y+ }$ p- x. n1 p0 v. K21其他利润,/ S- Q) u$ {7 m6 i( F) X# P  _
22营业利润,
; l' z5 E6 {5 [6 d0 {5 t23投资收益,
1 G$ M; @; U& w# y" E3 j9 v24补贴收入,
- F/ a7 e; x, x% p1 R+ S# ]25营业外收支,
# p$ ^8 q* P0 |0 s26上年损益调整,  J" H( R8 I1 ^4 x  c: `- V
27利润总额,; @, R- ~. N5 [; o! c9 h- d
28税后利润,
. c8 J( M$ O; J9 [29净利润,
* G2 ~$ O" K8 F9 \: {9 {. J9 u30未分配利润,
4 Z: m! {7 Z5 F5 g  w) @31每股未分配,# o9 Z5 `+ R* R! p+ i
32每股收益,
3 j7 m/ W7 M# Q, ~9 f33每股净资产,7 P! Z3 A7 {7 Z$ h! b7 L
34调整每股净资,
! d5 k) ^1 m% u35股东权益比,8 }. _$ n" R! y% _3 i9 Q# Y
36净资收益率
/ j  P4 I, e8 |  Q& g4 m- |- c*/
" D# Q" E- Z( o  u5 g+ l: W3 \/////////////////////////////////////////////////////////////: V* s9 Q5 m# [7 T5 u4 G
//定义取用caller函数传递参数项 的结构: q  M  K+ b4 u) g  z
typedefstruct tagCALCPARAM
: j7 Q; p; x) U2 ]) g( s. Y{8 g' S" u, S8 m' }0 ~9 `+ \9 K7 I
union
% B7 o# U& V! O- _$ I  E6 P{
: r2 j4 W. k) A. B) R  dconstfloat* m_pfParam; //指向序列参数的址标,指向一个浮点型数组pointertofloat variable parameter / ex. c,h,l,o, co2...co2=(c+o)/2
, c- o/ `0 U" M9 ?) p; l$ u8 [6 aconstfloat m_fParam; //数值参数 valueof parameter  v- e: k& ^) e' m2 x5 B
};
  y/ f3 p5 ?/ j. J7 E2 [: V3 ~constint m_nParamStart; //序列参数有效起始位置thestart address of variable parameter / ex. c,h,l,o,co2.....
) t: \3 b* m- o}CALCPARAM;" {0 I- b) l/ O9 C8 J% E- [
/////////////////////////////////////////////////////////////////////////////8 W: D9 d1 M; Y$ w' W
//定义全部取用址标 的总结构 (各指标指向前述各结构以便取的各结构的数据,接口信息数据的结构 )+ T  S( e' P* g) G: R% t. W, y
typedefstruct tagCALCINFO
* u- [0 I: L2 J+ T6 h, a{
; Y% r& P, M4 k: d! V3 c* F$ V: {constDWORD m_dwSize; //结构大小% _% U0 H- b- O  A
constDWORD m_dwVersion; //调用软件版本(V2.10: 0x210)
/ i& e# k% R+ rconstDWORD m_dwSerial; //调用软件序列号
, N- C% V3 I) E( \/ M! g* sconstchar* m_strStkLabel; //股票代码
# m0 {: t- a- h8 l( R9 [constBOOL m_bIndex; //大盘% C# i! ^- ?2 {$ F* _% c
constint m_nNumData; //数据数量(pData,pDataEx,pResultBuf数据数量)数据长度8 @* \, M3 m3 [4 p9 n2 N# l+ m) Z
constSTKDATA* m_pData; //常规数据,注意:m_nNumData==0时可能为NULL
" K0 [" b9 ?& l: c/ F- u8 c) O1 Z8 tconstSTKDATAEx* m_pDataEx; //扩展数据,分笔成交买卖盘,注意:可能为NULL
0 p) M, {# H! k4 X0 `/ {( p% Hconstint m_nParam1Start; //参数1有效起始位置<0/ constant parameter >0 /variable parameter ) L, g+ g7 {$ ^+ L
constfloat* m_pfParam1; //调用参数1/pointer to variable parameter 1
% ^) ]7 z6 q& D2 F; Econstfloat* m_pfParam2; //调用参数2/pointer to variable parameter 2
# U3 b$ e( a. d% kconstfloat* m_pfParam3; //调用参数3/pointer to variable parameter 3
5 O: U: H6 w: r4 \constfloat* m_pfParam4; //调用参数4/pointer to variable parameter 4
+ L' N0 n. Q7 M5 tfloat*m_pResultBuf; //结果缓冲区
, Y9 T4 |* B; o4 C: M* Q# N8 p, B, ?constDWORD m_dataType; //数据类型$ H2 l$ M' l! ]/ L* ~
constfloat* m_pfFinData; //财务数据7 {, L! V% L+ q4 ^
//以上与分析家兼容,所以沿用其结构和名称5 S1 [. O9 b5 S& Y! I
//以下为飞狐交易师扩展(fortagSTKDATAEx)
- M* s; Z3 }! H+ i% d5 GconstDWORD m_dwReserved; // 保留" M, E( `0 r! R% p0 a
constint m_nNumParam; // 调用参数数量
) }* x: v7 `3 CconstCALCPARAM* m_pCalcParam; // 调用参数数组  N! b- z9 A- V$ x) m
constDWORD m_dwReservedEx[4]; // 保留5 ^2 b' \" v' ~" N# @
char*m_strStkName; //股票名称: b  u. l! d' e7 g) u! e  {( n5 u
SPLITDATA*m_pSplitData; //除权数据
1 D0 F1 G+ T+ J% Iintm_nNumSplitData; //除权次数5 J4 r$ n7 {6 n3 \2 h
}CALCINFO;7 K! \; k! A* x- @
/*
! r- k7 P0 r7 Z- \* ?1 P) n1 x! H1:(与分析家兼容)
2 m! X0 X4 ~. V, k. N4 k1.函数调用参数由m_pfParam1--m_pfParam4带入,若为NULL则表示该参数无效.
( G. [7 b. w% O% G5 Y2.当一个参数无效时,则其后的所有参数均无效.6 [, ~4 P' n' X+ n) H
:m_pfParam2NULL,m_pfParam3,m_pfParam4一定为NULL.
% H) f1 f' R8 X7 @1 g9 a- ?9 {3.参数1可以是常数参数或序列数参数,其馀参数只能为常数参数.4 I$ B* e1 p% i1 H: T7 H: S. P1 X# B
4.m_nParam1Start<0,则参数1为常数参数,参数等于*m_pfParam1;) Q2 X* H) d" H7 `, K& E
5.m_nParam1Start>=0,则参数1为序列数参数,m_pfParam1指向一个浮点型数组,/ t" @: j4 H. c; \2 n9 x4 Q
数组大小为m_nNumData,数据有效范围为m_nParam1Startm_nNumData-1.) [- {# {8 u0 d0 h9 D4 l
在时间上m_pData[x]m_pfParam1[x]是一致的
: M! W3 t( X) [3 w6 k2:(飞狐交易师扩展)
/ t- G9 V* i0 F0 |  G8 B) `8 u" P1.该扩展结构使调用参数在技术上可以是无限数目的,且每个参数都可为数值或序列,由公式中实际的调用参数决定。
; M( R9 B; }; F1 m, h. L( |2.CALCPARAM结构用于带入参数信息和实际数据,m_pCalcParam数组大小为m_nNumParam,数据有效范围为0 m_nNumParam-1.: Q# H4 x) F! f" ]# H
3.按参数的顺序,m_pCalcParam[0]为第一个参数的数据,m_pCalcParam[1]为第二个参数的数据...,为了保持兼容,原m_nParam1Startm_pfParam15个属性依然有赋值。0 P6 e& i0 @/ a% |
4.i位置的参数为数值,取用m_pCalcParam.m_fParam.
5 \6 V7 f" L& p' r0 a0 O' G5 y5.i位置的参数为序列,取用m_pCalcParam.m_pfParam,数组大小为m_nNumData,数据有效范围为m_pCalcParam.m_nParamStartm_nNumData-1.m_pCalcParam.m_nParamStart<0,则此数组中无有效数据。
) ^3 G7 c" A% {! J. h6.由于可以调用多个序列,许多序列的计算可以先在公式中进行,然后作为调用的参数即可。' S* j6 v: ]. N8 ~" y$ s4 {
7.经此扩展,对分析家的DLL依然可以调用、兼容。
* k) n: i( y( W*/$ K2 z# R( C& N, e: L
///////////////////////////////////////////////////////////////////////////////////
) m% C3 o2 `. a4 W5 }0 n! T/*函数输出7 l) m/ s+ X4 @* Z( ~8 B
__declspec(dllexport)int xxxxxxxx(CALCINFO* pData);1 z5 X  ~% e0 C" a, o
1.函数名称需全部大写.
. c$ v5 q% S$ O. P2.函数必须以上述形式声明,请用实际函数名称替代xxxxxxxx;$ }$ U( T4 T; P
对于C++程序还需包括在extern"C" { } 括号中.$ `2 Q2 n' |5 a- j
3.函数计算结果用pData->m_pResultBuf带回.
% Y) i( M; |/ Y: K8 E8 c/ g4.函数返回-1表示错误或全部数据无效,否则返回第一个有效值位置,:6 m1 r' T4 O& O- b
m_pResultBuf[返回值]-- m_pResultBuf[m_nNumData-1]间为有效值.  c! m' p8 s: [1 O6 g
5.函数名称长度不能超过15字节,动态连接库文件名不能超过9字节(不包括扩展名),动态库名称不能叫SYSTEM,EXPLORER
: y# M" d2 L+ w*/
7 e0 a. B( R7 h2 [4 e8 D//示例函数,使用时用实际名称替换- W5 b2 M' B, \! F: J, p
__declspec(dllexport)int WINAPI MYMACLOSE(CALCINFO* pData);, {. j0 i( h5 }% A; Q$ b
__declspec(dllexport)int WINAPI SMOOTH(CALCINFO* pData);) n( E# ]- h/ A( p" V) Q
//__declspec(dllexport) int WINAPI MYMAVAR(CALCINFO* pData);
# j7 u) U, V; [# I8 _8 _5 w__declspec(dllexport)int WINAPI MYBBI(CALCINFO* pData);2 x0 k( M$ V5 H. \; `
//WINAPI = _stdcall5 g7 l5 q7 g* A8 ]
#ifdef__cplusplus
+ D* t$ ^( N; z. p1 d: k8 k3 M}
( |8 [/ T" q8 c& S#endif//__cplusplus* n" x' `& p% A1 d
#endif//__FOXFUNC_H_INCLUDE; `3 s1 r3 X, a
: s5 p  }8 [2 l) W9 p
//////////////////////////////////////////comment 注解
9 N% }, v& ^% C__declspec(dllexport)int WINAPI MYMAVAR(CALCINFO* pData)
& @1 R0 s9 i# }9 ipData是指向 址标总结构 CALCINFO的 总址标
. y4 w" |" v8 v2 x  F取用第二个参数数值floatfParam = *pData→m_pfParam2 2 Z1 X: m! V: Y5 B9 c2 b
取用第一个序列参数的址标constfloat* pValue = pData->m_pfParam1;
7 N- B: T: t& h' x7 u( r7 C取用股票数据长度intndata = pData→m_nNumData;2 l% x1 v& N- i8 n" ^/ K# a! J
第一个参数存在且为数值pData->m_pfParam1&& pData→m_nParam1Start<01 f. A; j+ K. q0 I
第一个参数存在且为序列pData->m_pfParam1&& pData→m_nParam1Start>=06 {8 F; y; @4 ^& f  c
第一个及第二个参数存在且为序列,第三个参数不存在pData->m_pfParam1&& pData->m_pfParam2 && pData->m_nParam1Start>=0&& pData->m_pfParam3==NULL* x' K" I# }5 X6 C& G2 Y# H
constfloat* cpParam = pData->m_pfParam1; 定义cpParam为第一个序列参数的址标. Z+ e% V# C) C- \) s, p
取用股票数据结构
. @/ P" E! U$ w% d3 OpData→m_nNumData= 变数数据长度5 f+ N$ A4 a' ^) N% A! `
pData→m_pData= pointer to struc STKDATA 的址标4 f  H, i* g4 k: |# `
pData→m_pData[x]数据结构的第x个数据
7 ]+ U& c. h7 E: \' r7 ?; {, E4 @4 GpData→m_pData[x].m_fHigh数据结构的第x个数据中的 High
) h& @) T/ O% |2 j7 ^7 [9 O取用结果缓冲序列
) J4 E+ M* i: V' O$ wpData->m_pResultBuf4 Z9 q3 Z  g- T; V. L9 @
取得第一个序列参数的起始序位,2,...5 , . 7...6 K9 ?6 l& Q6 O
intnFirst = pData->m_nParam1Start; / p) _- h! W  A9 c& H
for( i = nFirst+nPeriod-1; i < pData->m_nNumData; i++ )
* h) ~6 ]1 l' K, w( F1 _5 O取得第二个数值参数的数值
8 c* c8 ^7 y. x  X* L1 nfloatfParam = *pData->m_pfParam2; ' h/ @* T2 V: `+ o1 f* r7 I
intnPeriod = (int)fParam;9 t. S2 K+ J- L6 k
取用第一个序列参数的址标constfloat* pValue = pData→m_pfParam1;
+ ?$ C+ n% u2 _( h取用序列参数的单个直pValue
- U( C. s2 J4 Y取用缓冲序列的单个值pData->m_pResultBuf
2 ~; y) y" R% Q+ z7 R8 g; n" IconstCALCPARAM* m_pCalcParam; // 调用参数数组6 F" Q& e8 X3 n$ m8 e7 |/ _
m_pCalcParam为序列址标,指向各序列参数的指标
' u6 D) Z6 {/ |: {第一个序列参数pData→m_pCalcParam[0]
0 Y( ?% r9 Q1 h( W3 cconstfloat* m_pfParam; //指向序列参数的址标
$ G5 w: }: S4 U5 I4 y4 X" M9 h4 O第一个序列参数的起始序位pData->m_pCalcParam[0].m_nParamStart
8 ~0 F& \) n$ I9 u# c第一个序列参数的址标constfloat* pValue1 = pData→m_pCalcParam[0].m_pfParam;9 n" Z  h0 s7 i7 f) q: n
取用第一个序列参数的单个直pValue1
' F5 ?/ n  ^) f/ z5 C* Q第二个序列参数pData→m_pCalcParam[1]
, g- D* E  g# Y第二个序列参数的起始序位pData->m_pCalcParam[1].m_nParamStart
# ?3 e. K; k( r第二个序列参数的址标constfloat* pValue1 = pData→m_pCalcParam[1].m_pfParam;! t7 ?( U& G# y+ x# O$ j) h
取用第二个序列参数的单个直pValue2% w" L$ x) r* [. @3 g
第三个序列参数pData→m_pCalcParam[2]
4 ~3 E) p+ m! Z8 \, s第三个序列参数的起始序位pData->m_pCalcParam[2].m_nParamStart0 I  G( h6 @$ a+ c- ~- t5 [
第三个序列参数的址标constfloat* pValue1 = pData→m_pCalcParam[2].m_pfParam;- J  i* R' O; `  i  n
取用第三个序列参数的单个直pValue3
  i" w) p4 e; t- k7 s第四个序列参数pData→m_pCalcParam[3]& E6 j2 ?  m0 K5 z3 q) Q7 Q
第四个序列参数的起始序位pData->m_pCalcParam[3].m_nParamStart
! H% I+ s; P' e" i第四个序列参数的址标constfloat* pValue1 = pData→m_pCalcParam[3].m_pfParam;; r  ^6 `9 f, m( W8 G
取用第四个序列参数的单个直pValue4. {) d! {! X! Y! [; u
如果有四个序列参数,则取用序位最高的那一个序位9 j6 O3 ^: Z9 a. u- h. o% C% Q! ^) D$ c
if( pData->m_pCalcParam[0].m_nParamStart >= 0 &&
$ t6 A! ^4 e; M9 m' s' J0 Z% {: O" D1 k( opData->m_pCalcParam[1].m_nParamStart>= 0 &&
' v$ u3 e( S6 q! v# u7 f; c% mpData->m_pCalcParam[2].m_nParamStart>= 0 &&
; i3 `, x: L) c- G) _: [) apData->m_pCalcParam[3].m_nParamStart>= 0 ) //4个序列都含有效数值
: v0 [, E& A. o0 _8 b# t* C$ E{/ i; a! `- w% F
//计算返回的序列的第一个有效值位置
  ~" x! S4 n8 R* m9 bintnFirst = pData->m_pCalcParam[3].m_nParamStart;//已知返回的序列的第一个有效值位置与第4个序列一致! ]2 W) Z- h3 P3 s9 a3 N
//若不知,则
# u) m) [, {, |, y/*
' B! l+ {. P% l. j7 C) ?0 IintnFirst = pData->m_pCalcParam[0].m_nParamStart;/ s) @! O. F# B7 ^7 B7 Y  u2 O
if( nFirst < pData->m_pCalcParam[1].m_nParamStart )
! V: o& _- }4 ?5 ?: m. xnFirst= pData->m_pCalcParam[1].m_nParamStart;
# X6 q- P( d4 d% k" X; Eif( nFirst < pData->m_pCalcParam[2].m_nParamStart )
1 K  K8 V" A7 mnFirst= pData->m_pCalcParam[2].m_nParamStart;( Y6 \. T# @8 O; a" |) Q
if( nFirst < pData->m_pCalcParam[3].m_nParamStart ) ( D/ E6 r3 M$ y
nFirst= pData→m_pCalcParam[3].m_nParamStart;- L, o% w' l" Y+ h9 V6 Y
constfloat* pValue1 = pData->m_pCalcParam[0].m_pfParam;4 b" m2 J' o" M
constfloat* pValue2 = pData->m_pCalcParam[1].m_pfParam;
( h! I1 b0 y+ w: K# kconstfloat* pValue3 = pData->m_pCalcParam[2].m_pfParam;
) n  `* B; o4 Z/ g. u# jconstfloat* pValue4 = pData->m_pCalcParam[3].m_pfParam;
/ \3 \" j# s  u- j. o4 b  F% v( Z//-------------------# y! f* f7 c# i1 ~! o; U; d/ w3 D
floatm_fOpen; //开盘 open
5 O8 e3 Z, Y* V" i9 ]9 l* {" gfloatm_fHigh; //最高 high
/ P$ n4 |; }" O7 Z3 `8 Y5 Mfloatm_fLow; //最低 low/ a, [4 F* B# X9 A* c8 X( `5 i( M
floatm_fClose; //收盘 close& N+ N9 j  `5 d! F, b1 x' @
floatm_fVolume; //成交量 Volume
* t" f5 Y( s3 P0 l( `% K" ofloatm_fAmount; //成交额 amount3 t3 Q+ f; M" Q/ l) f' b
调用收盘据
( R- K+ d$ a8 PpData→m_nNumData= 变数数据长度; C" X* x9 Q3 t/ a5 U( g
pData→m_pData= pointer to struc STKDATA. g' X+ ]/ i0 |: `2 h5 A3 B' B
pData→m_pData[x]x个数据. Z1 h1 q  K2 Y7 }
pData→m_pData[x].m_fHighx个数据中的 High( Y+ X7 ~& g2 R; b
@@@@@@@@@@@important !!!!!!!% ^1 z6 ?. B4 e( P) X
sinceVC++ 2008, cl.exe will make ‘pData→m_pData[i-j].m_fClose’ anerror
1 p: r. n5 ]0 {5 O$ s! @so,pass the high,low,open and close just from the function parameter ,that is use ‘ CALCPARAM’ struct+ c. Y$ H% F! @" Z
pData->m_pData[i-j].m_fOpen// to use open , there is no way in using a varable for calculationoutside foxtrader
/ \  p" Q% U  |8 r( X( g* v* SpData→m_pData[i-j].m_fHighto use high  m8 ?, l/ E9 D# K
pData->m_pData[i-j].m_fLow7 T; D- q. c% _( A
pData->m_pData[i-j].m_fClose
' _+ d" f% c( Q: E4 O& I5 }- [& d( A. Fm_pData= pointer to struc STKDATA
8 f& }9 s) D+ t, k! R8 e+ Yincalling C++ dll function3 W# H4 F3 t" J2 O) S' E
m_pDatais passed to pData (CALCINFO* pData . A CALCINFO* type pointer)9 ]7 ]" s6 {! x
touse a single value in variable ‘High’
) l0 z5 s2 R. P7 T3 ppData→m_pData[i-j].m_fHighto use high
2 K9 P% b6 E* e1 }1 f! cconstfloat* m_pfParam1; //调用参数1/pointer to variable parameter 1
5 n, F. u# B+ y8 G7 G9 j* d. @4 Dconstfloat* m_pfParam2; //调用参数2/pointer to variable parameter 2
6 X* F9 T, V: |1 ]' wconstfloat* m_pfParam3; //调用参数3/pointer to variable parameter 34 G( X* I' u/ w
constfloat* m_pfParam4;
- b4 T: z$ `) p* `8 O, ^( c9 s9 Z) I3 t: Vm_pfParam1,m_pfParam2, m_pfParam3, m_pfParam4 = pointer to caller function 的参数
8 `! ]: h1 u+ d+ F9 j3 q6 y* h9 UpData→m_pfParam1= pointer to 第一个(序列)参数' J! T0 o8 {. O& t
pData→m_pfParam1[x]= 取用第一个(序列)参数的第x 个值
( g; y' Y! E" |3 K# n% {constfloat* cpParam = pData→m_pfParam1; =定义 cpParampointerto 第一个(序列)参数
( S! W& k) }( V; S$ ^2 S+ vcpParam[x] = 取用第一个(序列)参数的第x 个值
$ h2 u5 e: ~. O* t' dm_pResultBuf= 结果缓冲列
, h5 z( T6 X* w! l" ~9 SpData→m_pResultBuf= pointer to 结果缓冲列
8 P- Z; o0 B1 L1 ~pData→m_pResultBuf[x] = 取用结果缓冲列的第 x个值" m# S8 A1 v% R1 Z$ c
//////////////////////////////////////////comment
9 g7 p8 o5 `: N' q7 G( G& n2 l//////////////////////////////////////////comment 注解" V- [# {" i) G' U+ ^
constint m_nParam1Start; //统杅1衄虴宎弇离
! v. I: D! e3 Yconstfloat* m_pfParam1; //覃蚚统杅1
$ p8 _" {/ \9 S8 Cconstfloat* m_pfParam2; //覃蚚统杅2
3 b  O# k' G- \8 Jconstfloat* m_pfParam3; //覃蚚统杅3& y4 Q! r1 O) K- }( }
constfloat* m_pfParam4; //覃蚚统杅4,parameters must be <= 4
/ A2 M9 h: O6 d, j( c  x" r2 q//const float* m_pfParam5; // parameters must be <= 4, ^9 [5 Y' X- o1 ]" f, l1 ^
//const float* m_pfParam6; % x% v% p8 i& ^- s2 ?$ E1 p- F# Y
//const float* m_pfParam7; . a& k' }0 q; E
//const float* m_pfParam8;
  d! C" t7 d, j( e+ o//pData->m_pfParam1 && pData->m_pfParam2 &&pData->m_pfParam3 && pData->m_nParam1Start>=0 &&
  D9 u4 S" v; A8 M# c; ]" ~! rpData->m_pCalcParam[0].m_nParamStart>=0&& pData->m_pCalcParam[1].m_nParamStart>=0
' f  Z+ D" M  {$ C&&pData->m_pCalcParam[2].m_nParamStart>=0) - X1 ], i" y5 B/ C
{6 m. I+ V8 J8 M% q
floatfParam = *pData->m_pfParam4; //pointer ,pData->m_pCalcParam[3].m_nParamStart >= 0; B' q. i$ V0 R" h  t( x
intnPeriod = (int)fParam; //统杅1
/ s% [* l4 S& e//const float* cpParam = pData->m_pfParam2; // cpParam = pointer to第一个序列参数,cpParam = 取用第一个序列参数的第i 个值
6 c, n. H# M4 @) z8 X( fconstfloat* cpParam1 =pData->m_pCalcParam[0].m_pfParam; // cpParam =pointer to 第一个序列参数,cpParam = 取用第一个序列参数的第i 个值) [2 @' n- p" t. J" I* o
constfloat* cpParam2 =pData->m_pCalcParam[1].m_pfParam; // cpParam =pointer to 第一个序列参数,cpParam = 取用第一个序列参数的第i 个值/ k2 @" |8 ~: {
constfloat* cpParam3 =pData->m_pCalcParam[2].m_pfParam; // cpParam =pointer to 第一个序列参数,cpParam = 取用第一个序列参数的第i 个值//parameters must be <= 4
1 X7 H7 M; [: s+ L+ R) Q//const float* cpParam4 =pData->m_pCalcParam[3].m_pfParam; //cpParam = pointer to 第一个序列参数,cpParam = 取用第一个序列参数的第i 个值6 {  W$ @& a8 ]' V; b- a' x
//const float* cpParam5 =pData->m_pCalcParam[4].m_pfParam; //cpParam = pointer to 第一个序列参数,cpParam = 取用第一个序列参数的第i 个值/ l5 Z0 `# R2 A5 ~( I
//m_pData = const struct pointer to struct STKDATA , pointer to structSTKDATA , 7 N1 e0 v6 D4 w# q' P
touse pData→m_pData[x].m_fClose
' o% a* |  g$ j# ?& `5 EpData→m_pData[x]= | 1,2,3 , … , m_nNumParam | time_t m_time;
9 G  c1 t) g! u8 E, i; A* k: Q|1,2,3 , … , m_nNumParam | float m_fOime_t
( s0 @; W  N# X|1,2,3 , … , m_nNumParam | float m_fHigh;
/ O" L: I. E7 `.. .
5 T- S( F  {# ||1,2,3 , … , m_nNumParam | WORD m_wDecline;
8 |5 o/ Y/ [1 y8 Hm_nNumParam= 数据high,close,open,low的长度
8 U& d% i1 b4 B" m1 e0 i6 }& Jtouse high:. Y# ?2 h$ B* `% ~( S; M! i
pData→m_pData[x].m_fHigh
, n/ h- M& s2 c+ J" U/ B" ^' }contentof struct STKDATA
" [1 R( j% [5 H0 v6 Q& W) Etime_tm_time; //时间,UCT  d- o7 n7 `7 B
floatm_fOpen; //开盘 open
4 B, v" U- m( ofloatm_fHigh; //最高 high8 Q6 X2 v5 C$ }
floatm_fLow; //最低 low! z  M. H/ L# u! V
floatm_fClose; //收盘 close7 {+ b9 j/ P; h- s  [0 E3 T
floatm_fVolume; //成交量 Volume5 e' t4 o3 K2 V. ~  W, s
floatm_fAmount; //成交额 amount
+ b. b- m1 z1 |9 nWORDm_wAdvance; //上涨家数 仅大盘有效
1 T( Z5 X8 n& l% k3 _0 M6 TWORDm_wDecline; //下跌家数 仅大盘有效/ p" i; X9 z& |, b) ~1 f) U( L6 f
调用传递参数及传回结果, W0 z, [% s% s4 s
调用传递参数
' G* L- D" x" z' \/ @+ y, i(pData->m_pfParam1 && //参数1有效Param1exists# t9 }; X& G: K8 ^' Q5 `9 U3 e
pData->m_nParam1Start<0&& //参数1为常数
4 w. F8 l. c$ n7 opData->m_pfParam2==NULL) //  Y; j: E3 ]6 o# I, H6 h
localprocedure 定义使用变数8 K! G$ P8 O( h: T; v
onstfloat* pValue = pData→m_pfParam1; //use constant参数1
* h  Z0 `0 e+ w& v5 S1 pintnFirst = pData->m_nParam1Start; //use 参数1效值起始位2 h3 d2 y) G- }
floatfParam = *pData->m_pfParam2; //use 参数2
4 C) q6 f; q2 W1 A0 y9 JintnPeriod = (int)fParam;
6 o9 b& ^: V4 W7 r传回结果. S' O$ d1 s% q- x4 J# q0 ?' d* q
fTotal+= pValue[i-j];
% i; t/ {+ G8 x/ F/ j0 |1 [# ppData->m_pResultBuf
3 V% b% F/ F$ x//////////////////////////////////////////comment

评分

1

查看全部评分

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

本版积分规则

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

GMT+8, 2026-6-3 00:52 , Processed in 0.148860 second(s), 20 queries .

Powered by Discuz! X3.2 Licensed

© 2001-2013 Comsenz Inc.

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