//////////////////////////////////////////////////////////foxfunc.cpp
+ J8 `$ I) g; M$ W/ w; ^( ~
+ ~9 C* U3 h! S) {/ t6 C' P//FoxFunc.cpp : Defines the entry point for the DLL application.
. W5 S$ z/ e* W//
. @1 S9 g2 s4 G#include<string.h>' ]9 H7 L& \: N5 G
#include<stdio.h>- S4 Y) l( z- t! V3 ^
#include<io.h>
* [. a1 a# y2 W3 E. V" o& w#include<math.h>
- R1 H$ @2 a# B0 T0 K" \/ B#include<iostream>
0 n$ D$ Z4 O5 s#include"stdafx.h") z" J! M" |4 `4 X6 m) u8 `
#include"FoxFunc.h"- u) Q b; q, J& p
usingnamespace std;: v# A4 i0 X6 @7 B
BOOLAPIENTRY DllMain( HANDLE hModule, 6 s' w3 ^3 U' J0 }& L
DWORDul_reason_for_call,
0 S* e( s5 {) }+ i* GLPVOIDlpReserved. j' {% c& J: Z2 B- q
)
& U, }! g" A/ \! g, H{* T0 U5 p& N( T' s. S1 g2 f j6 f
switch(ul_reason_for_call)
5 }- A1 n5 R5 }& f J, Z5 f{
v `" i# U' H9 N7 |' acaseDLL_PROCESS_ATTACH:. x. m) O$ }' A6 O
caseDLL_THREAD_ATTACH:
! Q# J! U: j+ v% d# C8 |' BcaseDLL_THREAD_DETACH:0 j# _7 V% J, T8 N
caseDLL_PROCESS_DETACH:/ v% K$ B. c: A% D3 r* b
break;
$ R/ H* W: V4 \4 v+ f$ I g3 ]5 Z! b}
4 B8 J* U L" d- I" vreturnTRUE;
" F( a; K/ ]# k* I. D7 X, Q}+ U& \: X- \) D! |
//计算收盘价的均价,一个常数参数,表示计算周期) r6 G j0 C( X, G0 v5 G
//调用方法:
4 i4 l4 {2 R( q4 N$ x" y//"FOXFUNC@MYMACLOSE"(5)
$ f2 j/ A6 w, l5 F% w, w/*
' b( c; q+ H: j& Z! D* H4 v- {4 ^//extern "C" double __cdecl ppow10(double ctemp,doublelength); - - - > wrong, extern "C" is to declare pow10coming from a .dll or .lib
! [# b4 r) S& p. S# B# e9 c//extern "C" double ppow10(double ctemp,double length); - - -> both are the same
/ ~2 h# H' F, Z5 N2 `# u*// K' o4 T9 N1 `
extern"C" double __cdecl ppow10(double ,double );
# ~' p4 S) J7 @1 k) o//double ppow10(double ,double ); 7 z; |5 W0 k' Z# Y) ?
//call pow10() by __cdecl/ X: c- s, B+ \$ G1 e
//!!!!!!!! use "C" for Microsoft visual C++ compiler
+ i# q! W, z( ]4 i" `1 f r! P4 }/ A//!!!!!!!! use "C" for Microsoft visual C++ compiler
@$ V1 v# V' P' @+ t2 Q9 R//!!!!!!!! use "C" for Microsoft visual C++ compiler( r2 }8 n" o7 i1 i, [: h
//!!!!!!!! use "C" for Microsoft visual C++ compiler
2 ^7 ~) G3 @$ U1 G) Y4 ~& T7 h//!!!!!!!! use "C" for Microsoft visual C++ compiler
. g$ v6 F! Z. J0 I) R: m__declspec(dllexport)int WINAPI MYMACLOSE(CALCINFO* pData)
- n3 I$ ?1 p, m( D/ W, }{
& { U t! D r2 x3 |, i$ gif( // pData->m_pfParam1 && //参数1有效
0 Y6 @7 E8 }) p( T" [7 c//pData->m_nParam1Start<0 && //参数1为常数" K# |$ W8 N' X7 {
//pData->m_pfParam2==NULL ) //仅有一个参数, E/ X9 u5 l; v6 a- ]
//pData->m_pfParam1 && pData->m_pfParam2 &&pData->m_pfParam3 && pData->m_pfParam4$ J, g5 b$ P. m1 i
//&& pData->m_pfParam5 && pData->m_pfParam6 &&pData->m_nParam1Start>=0 &&# M/ K3 r. u' n$ b& `
//pData->m_pfParam7==NULL)
2 I$ x; ?% F" ^$ b//pData->m_pfParam1 && pData->m_pfParam2 &&pData->m_pfParam3 && pData->m_nParam1Start>=0 &&* c0 k& {- \3 P! t4 \
pData->m_pCalcParam[0].m_nParamStart>=0&& pData->m_pCalcParam[1].m_nParamStart>=00 n/ Z/ S4 r$ A# ^2 W
&&pData->m_pCalcParam[2].m_nParamStart>=0)
# m8 t4 R/ |5 f# F$ [; g, j: x* l{
; s$ u8 F0 ?: F' w5 FfloatfParam = *pData->m_pfParam4; //pointer ,pData->m_pCalcParam[3].m_nParamStart >= 0
+ x3 e3 a/ ~2 c, |3 TintnPeriod = (int)fParam; //参数1( w" P2 ? Y1 y( F
//const float* cpParam = pData->m_pfParam2; // cpParam = pointer to
" y$ i. D; Z' S9 iconstfloat* cpParam2 =pData->m_pCalcParam[1].m_pfParam; // cpParam =pointer to
1 \4 g; G- |7 |: N! h( D8 U) kconstfloat* cpParam3 =pData->m_pCalcParam[2].m_pfParam; // cpParam =pointer to
% e. t; O# c6 e* z' Qconstfloat* cpParam4 =pData->m_pCalcParam[3].m_pfParam; // cpParam =pointer to
3 o0 H- q8 D' l: v9 ?' W8 \//const float* cpParam5 =pData->m_pCalcParam[4].m_pfParam; //cpParam = pointer to ]. \8 M1 g6 H3 t$ C
//in foxtraderoooq:"MYFUNC2010@MYMACLOSE"(c,c,c,6),colorffffff,linethick5;// cpParam5 =pData->m_pCalcParam[4].m_pfParam 7 X5 v; U* X% j+ G- K: o$ H
//pData->m_pCalcParam[5].m_fParam); //value l6 U% Z* J/ l3 e$ Q6 `
//const float* pValue1 = pData->m_pCalcParam[0].m_pfParam;
& i3 t. m, v$ X) L//const float* pValue2 = pData->m_pCalcParam[1].m_pfParam;
" B3 y* D/ L( a, n" S+ Y/ r/ S//const float* pValue3 = pData->m_pCalcParam[2].m_pfParam;
5 E8 g" Q: ]/ W, i% P' D//const float* pValue4 = pData->m_pCalcParam[3].m_pfParam;" j$ s% @/ y h
//const float* pValue5 = pData->m_pCalcParam[4].m_pfParam;8 V. e7 h1 |" L+ _' T5 [# ^
if(nPeriod>0)! \2 r4 g3 v% q, w$ i P2 ]. Z
{2 l, @" a! y7 e8 o; E
floatfTotal;% `; `9 @/ T+ h/ z( h7 e$ V
inti, j; q% @% L2 A! O4 P
intndata = pData->m_nNumData;6 Z5 k: A$ I* A
//float yy[5000][1];- q1 A+ B. ~* k0 ^
for( i = nPeriod-1; i < pData->m_nNumData; i++)//计算nPeriod周期的均线,数据从nPeriod-1开始有效: {1 R' ?0 b0 v$ _5 ~
{( @! m9 W, K( J4 r) B' k- u
fTotal= 0.0f;7 b; P& D1 ?* H5 u
doublelngth=5.0;' D9 W( l# R9 t9 s
doublectemp=4.0;
# `2 g( e" u: D5 C0 O7 {3 }//float yy1[5000][1];
' v! n- f2 W1 T, ]for( j = 0; j < nPeriod; j++ ) //累加
) Z, X3 u" g4 D" W2 l{
) H9 m# r3 w7 Z' @fTotal= pData->m_pData.m_fClose; // @@@@@@@ vc++ 2010 cl.exe 使pData->m_pData[i-j].m_fClose错误
) J6 f% C* P, Z" |% d \5 ^}
! e+ V/ u o" \+ ?, x$ j/ u//pData->m_pResultBuf = fTotal*1.03; //平均
" Z9 Z/ @% e* I% h: y lfTotal= cpParam3;6 F f; ?& F3 n1 M7 U
pData->m_pResultBuf= fTotal*1.03; //平均4 z) U5 W: ^5 c5 a# p) \
//ctemp = (double) pData->m_pResultBuf; // double & - - - >overload a float value , double * - - - > overload a pointer todouble4 S% Q |9 V" H4 K. I
//pData->m_pResultBuf= (float) ppow10(ctemp,lngth); // float &- - - > overload a float value
; Q& ? q* Q0 r7 `4 }pData->m_pResultBuf=(float) ppow10( (double) pData->m_pResultBuf,lngth); // float &- - - > overload a float value, (float) = overload
; ^* t3 T) u* d5 }4 w& ^' _2 ~$ P}
/ S; ]5 u" f6 q& f Y3 _returnnPeriod-1;
0 `1 m h7 B( P( d" }3 N}" T/ u. c/ `% Q' d( { G, a' i
}
R) }( j0 K! X2 m4 ?: Vreturn-1;: a3 P8 ?* T- p/ ?* S" R
}
' [# m- |% d4 A//计算均价,2个参数,参数1为待求均线的数据,参数2表示计算周期
$ m' z. r7 j% i//调用方法:/ i a$ L8 l0 y. n" ^
//"FOXFUNC@MYMAVAR"(CLOSE-OPEN,5)
9 V( {% z4 f+ O! u( X__declspec(dllexport)int WINAPI MYMAVAR(CALCINFO* pData)
6 G' f0 K- l8 T# C, t2 ]# G{ j1 z% {( e3 L/ z0 n
if(pData->m_pfParam1&& pData->m_pfParam2 && //参数1,2有效' H5 U$ s, t1 G+ j. p
pData->m_nParam1Start>=0&& //参数1为序列数
) E0 L& h( d4 x" h) `* ]pData->m_pfParam3==NULL)//有2个参数
. C1 b4 I' j4 O+ h6 p{
- T+ |' A( \+ E& _& Q$ e9 tconstfloat* pValue = pData->m_pfParam1; //参数1+ x! ?" G* o4 _+ M% B- D
intnFirst = pData->m_nParam1Start; //有效值起始位& z! L" k/ y% \/ R- w, n( R
floatfParam = *pData->m_pfParam2; //参数27 Y# y# ]) l& E, {
intnPeriod = (int)fParam; ! P8 e' ?& `# `+ u. I, i4 D% C* `% g. E
if(nFirst >= 0 && nPeriod > 0 )
/ e. p8 r. Z) P1 ^{% F" p4 j" `9 |# K6 |
floatfTotal;
: Y0 ]: z; A- X) h$ q) ~inti, j;
8 ~* u, s5 a. X# ^8 c( K0 Wfor( i = nFirst+nPeriod-1; i < pData->m_nNumData; i++ )
- P, }$ `) _+ c* Y. m1 ^# X' G{
; i, k! o! Q4 s& ?0 W% e) G& q! L5 rfTotal= 0.0f;: U4 D# D1 Z9 Q7 @3 @, N: E: v
for( j=0; j < nPeriod; j++ ) //累加: b K. w8 Q5 U+ y: x: v
fTotal+= pValue[i-j];2 k1 b2 h' N' n6 P" ] I
pData->m_pResultBuf= fTotal/nPeriod;//平均
5 v6 d+ S$ A+ V7 J$ o}: Y# y+ i i% {0 W6 E: W2 |% G
returnnFirst+nPeriod-1;' N, Z4 A% r7 I; H) Y
} e1 `; }& k9 B' M, C1 l8 W
}5 s1 i2 \# i$ p4 A( m' `3 |
return-1;$ V! g! \) n2 O5 e$ Z8 q
}
& G/ q) D% M( V' Z- e0 \6 e; ]) |//计算多个序列的均值,5个参数,参数1-4为待求多个序列,参数5用于举例说明数值参数的用法,实际在此例中无需该参数
1 s3 W0 ?; n( g- p0 C/*
2 @* a! M& \# ]# C调用方法:0 { j# W# ~6 k3 i% ]
MA1:=MA(CLOSE,3);
/ \4 d7 [# {+ j4 X. W% n8 KMA2:=MA(CLOSE,6);
6 }) [! [# q( mMA3:=MA(CLOSE,12);
& Z" W% W* k4 S4 _. RMA4:=MA(CLOSE,24);( G6 g; @* Y$ V# A& y
MYBBI:"FOXFUNC@MYBBI"(MA1, MA2, MA3, MA4, 4);
, T( {% ^/ H# _- F6 N! v*/* D9 y- B2 B8 I6 f& @& [
__declspec(dllexport)int WINAPI MYBBI(CALCINFO* pData)
, m3 N! A+ L2 V; Y- `{) ?, U; n6 T0 {" \+ p5 T
if( pData->m_pCalcParam[0].m_nParamStart >= 0 &&2 v3 J% ^3 w" t& \2 `; h- `
pData->m_pCalcParam[1].m_nParamStart>= 0 &&
7 b6 q4 T- m6 o9 J* D, Z- DpData->m_pCalcParam[2].m_nParamStart>= 0 &&
" q) |- e, N! m8 l" @pData->m_pCalcParam[3].m_nParamStart>= 0 ) //4个序列都含有效数值- T5 c( R z; E% F; U0 Y
{; }6 q0 b- G* Q1 K; a8 H3 L
//计算返回的序列的第一个有效值位置
* J: N( A s$ B7 H) V) ~intnFirst = pData->m_pCalcParam[2].m_nParamStart;//已知返回的序列的第一个有效值位置与第4个序列一致2 s! R. P8 h3 N9 l$ q- W0 |* l! R& [
//若不知,则
7 r% z. M7 ]) x0 N* }/ X/*9 D! d! Y, L/ r7 j' @0 m% C
intnFirst = pData->m_pCalcParam[0].m_nParamStart;
4 e9 h& ^9 @( h5 t6 a& l+ \if( nFirst < pData->m_pCalcParam[1].m_nParamStart )
& Q: x1 Z2 |- B$ m, knFirst= pData->m_pCalcParam[1].m_nParamStart;
* i& L- [7 w0 {: S) \$ Gif( nFirst < pData->m_pCalcParam[2].m_nParamStart ) ' L7 f# z5 o w: v3 g& n
nFirst= pData->m_pCalcParam[2].m_nParamStart;
5 Y9 K( D7 H2 X4 rif( nFirst < pData->m_pCalcParam[3].m_nParamStart ) ; F3 w" y8 t. n: ], I. i% m. D' D
nFirst= pData->m_pCalcParam[3].m_nParamStart;
- E' i* e1 ]1 O/ r8 v*/# k# R# |7 Z* V0 X8 H
constfloat* pValue1 = pData->m_pCalcParam[0].m_pfParam;7 I8 I' M( i0 s) z# h7 S
constfloat* pValue2 = pData->m_pCalcParam[1].m_pfParam;( p! o/ \5 w0 v1 d- b
constfloat* pValue3 = pData->m_pCalcParam[2].m_pfParam;
: \4 D2 [+ ^! ^9 r% u: Rconstfloat* pValue4 = pData->m_pCalcParam[3].m_pfParam;7 h+ q4 x8 j& w0 F B2 C7 E
constfloat* pValue5 = pData->m_pCalcParam[4].m_pfParam;
& d1 l0 O0 F+ A5 qconstfloat* pValue6 = pData->m_pCalcParam[5].m_pfParam;- ^! i1 A7 j! Q* ~# P
//const float* pValue1 = pData->m_pfParam1;
9 y# M( \& g" \( u+ ?8 G+ P m- i//const float* pValue2 = pData->m_pfParam2;
! T2 s* |6 v% [! V( f" i//const float* pValue3 = pData->m_pfParam3;
5 N" a! d7 l" ], L! D1 _5 S//int nNum = (int)(*pData->m_pfParam4);//实际上该例中已知nNum=4,在此用于说明数值参数的用法" F0 v; r% }$ d/ E/ d, o
intnNum = (int)(pData->m_pCalcParam[6].m_fParam);//实际上该例中已知nNum=4,在此用于说明数值参数的用法
& y6 W H' k! ~2 \for(int i = nFirst; i < pData->m_nNumData; i++ )5 C# k( O1 s- D4 E+ g
{
4 p& e, F5 t9 `( F' bpData->m_pResultBuf= 4 @8 C @7 ]6 q" a
//(pValue1 + pValue2 + pValue3 )/nNum;
, t! F8 _# Z) t(pValue1+ pValue2 + pValue3 + pValue4+pValue5 + pValue6)/nNum;3 [. X% l: n$ A& B( g
}
! f- ~& S3 j) p4 j. a H, v5 \returnnFirst;* W& h! \+ x% o: r. v' f
}
& x: V; E% \1 g$ X% \. greturn-1;$ w+ | T" p) |9 b
}
5 P5 i' j: n2 g2 N' m+ n8 ?. Q1 c2 P- L' p( O
( ^! p8 e. o( A( v: j! {' C9 o
7 @5 A& h3 E' C6 @# T+ J0 j" Z
//////////////////////////////////////////////////////////////pow10.asm
6 S- ]1 W2 F7 P( I) m8 ?# n;*******************************************************
3 t: k( S( S3 u4 p;* *: v2 m0 t7 T# J K
;* Delphi Run Library *
4 ^* F7 O3 A' D9 V; S$ U# T;* *
: h% j# J9 t0 B* l2 H;* Copyright (c) 1996,98 Inprise Corporation *, A1 ]) e8 q# d ]
;*--------------------------------------------------------------------------& r$ c" m$ B+ M
;* To compile "tasm32 /ml pow10.asm" *
. D' v) ~8 x7 \' x6 {" d7 Z% u- f+ };*--------------------------------------------------------------------------
8 ]( ^$ e9 M8 y O7 s;*******************************************************4 K9 E! j& I& z% t" j; U: S; P
.386/ f. k' z8 ^( Q( h& W
;.MODEL flat,c (error must be in segement block must have segment
' T- {" g7 w( N# Q" V9 \9 P, f;!!!!!11 important if ',c' is not used , must use 'public _ppow10, and'_ppow10 proc'& N$ b, K A3 l8 F B
;!!!!!11 important if .MODEL flat,c is not used , must use ;_TEXTSEGMENT WORD PUBLIC
+ r W/ h+ h! D1 }7 J. {- `& w;'CODE'..._TEXT ENDS and must use 'public _ppow10 and '_ppow10 proc', c8 G0 Q, m4 s0 ^
.MODELflat,c ; just use .code, no need for segment,!!!!!11 important if',c' is used , must use 'public ppow10, and 'ppow10 proc', D2 s( \+ P \) [
;ppow10 PROTO,aVal:PTR REAL8, bVal:PTR REAL8
/ [" u r% D+ s# ~) T2 C( z;includeE:\Vsource\masm32\INCLUDE\windows.inc' F& K$ M' S' X: ~- @
;includeE:\Vsource\masm32\INCLUDE\user32.inc
4 M; ?: U( z" `;includeE:\Vsource\masm32\INCLUDE\kernel32.inc
" c$ h$ p0 h- b( T: `& i4 ]5 G: \6 |PUBLICppow104 K" D2 y# v7 x% l
.CODE
2 j- M8 R# O' ~4 r! C' l;DllEntryproc hInstance:HINSTANCE, reason:DWORD, reserved1:DWORD1 |" s( k5 N6 ]+ b" i
;.if reason==DLL_PROCESS_ATTACH
8 e3 E1 q j! b4 o2 [;invoke MessageBox,NULL,addr LoadMsg,addr AppName,MB_OK
c1 y' h4 F1 ~4 I* g;.elseif reason==DLL_PROCESS_DETACH: { C! h" @- U* p* h; r) e. K
;invoke MessageBox,NULL,addr UnloadMsg,addr AppName,MB_OK
# x. ?# n" x+ f, e6 u0 [;.elseif reason==DLL_THREAD_ATTACH
$ @& e6 j8 u* y8 Y( z; q% };invoke MessageBox,NULL,addr ThreadCreated,addr AppName,MB_OK
! { M6 {7 Q+ H5 c' L;.else ; DLL_THREAD_DETACH( Z* E, v$ l. H" D- ^- p9 I5 T; k
;invoke MessageBox,NULL,addr ThreadDestroyed,addr AppName,MB_OK6 u0 M% C+ i2 }9 B" e3 i+ y; h2 @+ w
;.endif G5 g& Q5 f- e2 c7 `
;mov eax,TRUE
4 D; z% a7 G( W/ h9 a; v;ret/ S1 }# R/ m$ E' {
;DllEntryEndp
( v; b9 m1 v, K& D' t! ~;FUNCTION _Ppow10( double val, double pow: ) : Extended; Q" C! ]$ R2 G/ D: c$ b' K
;_TEXTSEGMENT WORD PUBLIC 'CODE'8 h. i' F4 T8 K
;ppow10 PROC,aVal:PTR REAL8, bVal:PTR REAL86 S# k: Z. e' T# |
;ppow10 PROC,aVal:* Qword, bVal:Qword
9 O8 g& Y& \' I- N7 Jppow10PROC near* ]6 W+ p% U0 h! W; x1 k0 p
XUEQU 8 ; for eip & ebp , Q, }1 L$ s# T0 \
XDEQU 0 ; for edi, esi, ebx, ecx, edx Y- R6 F* j$ G* y+ j [
fp_powerEQU QWORD PTR [ebp+XU+8]
- t$ b( F* E/ {6 \) vfp_valEQU QWORD PTR [ebp+XU]
3 p% T5 ^* z9 J. q! uvalEQU QWORD PTR [eBP-XD-8] ; USE STACK& q1 B8 l% r. [+ R
powerEQU QWORD PTR [eBP-XD-16] ; USE STACK
( C. \$ f8 s' X2 I4 \pow10EQU QWORD PTR [eBP-XD-24] ; USE STACK
9 A, e0 ]9 I8 x% N! ^FPower10:
w2 h [8 B& j X8 upushebp
- F9 g0 X2 d0 Kmovebp,esp e* ]1 A/ i# u
;push edi$ z, h5 y v. }$ b( \4 ^, A
;push esi
0 ?$ ]" ^5 G9 D- O7 f5 O;push eax. O# U( y/ s$ Y) s: q. i
;push edx
; C% Z: E) y S% p2 Hsubesp,24
9 O7 {# t0 f( D- k' BFINIT
# j5 e% w: {3 L5 V2 ^6 U- u; V2 `: {fldz
7 Q, J7 b, p( Z$ m2 Hfstval
4 `" }2 R: e# R/ K9 ^fstpower" {4 h7 \! ^9 U* D0 P4 `
fstppow10
% ]2 O j( h! v MOV EAX,8 MOV EDX,8; fldpi
2 z& G: Z+ d( |& | fld fp_val ;st(0)=val; fld aVal;st(0)=val
8 ?& k# q* R2 m' ifstval
$ d4 Z3 D( k. F( c3 r9 m0 f;fld Arg2 ;st(0)=power
+ j9 o. m J0 |" d% d# S7 I;fstp power
. Z4 G1 T- v3 c. @- \/ k;fld val ;st(0)=val3 X) v& w, o' z
;fmul val ;st(0)=val*val" i) H2 ]* v( y/ R$ c- d
;fmul val ;st(0)=val*va*val
+ B! x' i1 [8 D3 |( T;fadd st,st(0)
! N% g% Z& m1 C; l5 t9 S+ U3 {8 U' v;fmul qword ptr [ebp+16] ;st(0)=power
6 b: ~, U' q3 J" ^;fadd st,st(0)
8 Y% Y# U3 m" ^$ r;fwait4 d0 E! V4 F+ d* Z
addesp,24" V+ L# F1 h+ d6 e' D
;pop edx
: |( b1 @& \' o& A# d O7 o( f! {;pop eax
" A+ K4 K6 q$ F;pop esi
' G& n' R1 G( K3 h( M/ E' e! \;pop edi; A- W* @# n/ Y
movesp,ebp4 q4 A- V- G0 [4 m! `
popebp
/ f& u2 _ N. o;leave ; @@@@@@ important don't use leave in vc++ 2010
: B4 e) x* N6 g1 T$ VRET;return value = st(0)
" E4 B( E7 @' ?; Y* R. Cppow10ENDP
; D9 U, ]. Q# Y! ~/ I;_TEXTENDS) n' g" m+ z- c6 l; C- I
END; n5 O- ^1 o5 ~% x* U" A
;END DllEntry |