//////////////////////////////////////////////////////////foxfunc.cpp; b, X3 E1 ]! i* b* K( B+ W" P8 {
3 N; H2 ~, I* ~9 ^- A
//FoxFunc.cpp : Defines the entry point for the DLL application.+ }1 T6 h/ X% w! }. g& G* o. j
//
0 |$ `. _( l$ \5 q V- w#include<string.h>$ S9 ? }- {- C9 H* `8 N
#include<stdio.h>8 P+ t5 b7 G; P/ A" V
#include<io.h>5 v! ~3 y9 j! o7 ~
#include<math.h>
9 z; G# l$ g4 x- N1 i: p#include<iostream>( H+ r R [$ o) |" Q
#include"stdafx.h"
' g. l z6 {' k8 |1 _6 x#include"FoxFunc.h"
) |# w+ q9 J W/ @# Y7 X b" Uusingnamespace std;% [: D: c9 t4 D2 B# ]. {
BOOLAPIENTRY DllMain( HANDLE hModule, ; J' `) G3 m. n. f' h: K: \' m+ j
DWORDul_reason_for_call, % x* e/ N, A+ U& c0 U5 Y% V
LPVOIDlpReserved8 A* _% S7 _- z5 ^. O+ {/ `# M6 P3 ?
)
- t" A+ h2 z# C3 J& Y( v7 ]{3 l" X0 G' G/ r% C( E# f
switch(ul_reason_for_call)9 n" o' a/ P7 i' i6 M7 J i# o/ S
{; S9 q$ [9 G/ N6 j
caseDLL_PROCESS_ATTACH: Z/ j* S- g$ \* ^
caseDLL_THREAD_ATTACH:. g9 g# O9 O; ^9 ^# t. F, W
caseDLL_THREAD_DETACH:% _' J( u$ K9 F5 A2 ?2 m
caseDLL_PROCESS_DETACH:
" E$ c- u" k: i$ l. f3 c, R Dbreak;
( Z6 z' w: e1 X+ }9 G6 s; D}6 v7 A& M& S! ^" F
returnTRUE;! u, | P5 e, p" Z1 n
}/ H' r% J! X7 r2 ?1 ?
//计算收盘价的均价,一个常数参数,表示计算周期1 H* Y: r# f9 l! ~3 \9 R
//调用方法:
p. S: D h, [: f/ {4 `6 W//"FOXFUNC@MYMACLOSE"(5)
+ i4 ?- r3 n$ R( S# j/ O/*
" o, u, _# `% Y- N//extern "C" double __cdecl ppow10(double ctemp,doublelength); - - - > wrong, extern "C" is to declare pow10coming from a .dll or .lib
9 S& d: i( O% G; g//extern "C" double ppow10(double ctemp,double length); - - -> both are the same$ Z: T& \ I! M2 k( y
*/
+ s4 \' o p8 K. W. T. r2 o; Hextern"C" double __cdecl ppow10(double ,double );0 Q3 [& ^! B. v S5 @: ]
//double ppow10(double ,double ); * S* _1 M% G' q i
//call pow10() by __cdecl" d0 [ `6 @5 {, P/ Y# _2 h( a
//!!!!!!!! use "C" for Microsoft visual C++ compiler% S4 j) e! |- ~2 L1 J% B: \& q
//!!!!!!!! use "C" for Microsoft visual C++ compiler) r, d5 Q: J- o- }. X8 |% _
//!!!!!!!! use "C" for Microsoft visual C++ compiler
( N8 p% F; V6 d, {# z3 a* v% U//!!!!!!!! use "C" for Microsoft visual C++ compiler
7 T% f1 E( { k5 g" m8 a//!!!!!!!! use "C" for Microsoft visual C++ compiler
8 [% M; o! h4 q1 {% |# p. C__declspec(dllexport)int WINAPI MYMACLOSE(CALCINFO* pData)
7 z7 W3 Z" X) n2 X{. p, ? X6 q, b1 V
if( // pData->m_pfParam1 && //参数1有效
# F; D8 H) \) h# v//pData->m_nParam1Start<0 && //参数1为常数
. \6 L6 I6 o/ @0 L//pData->m_pfParam2==NULL ) //仅有一个参数; g7 K$ Y5 M6 f- o. h ~, j
//pData->m_pfParam1 && pData->m_pfParam2 &&pData->m_pfParam3 && pData->m_pfParam4
- }9 m3 {1 [) a! ^) L6 z1 N//&& pData->m_pfParam5 && pData->m_pfParam6 &&pData->m_nParam1Start>=0 &&
' D* |; S, u k. i//pData->m_pfParam7==NULL)( m! p# c/ ]6 n" m
//pData->m_pfParam1 && pData->m_pfParam2 &&pData->m_pfParam3 && pData->m_nParam1Start>=0 &&4 @1 g: a& W8 Q
pData->m_pCalcParam[0].m_nParamStart>=0&& pData->m_pCalcParam[1].m_nParamStart>=05 C8 M# q% b3 Y" k$ L% V- D
&&pData->m_pCalcParam[2].m_nParamStart>=0)
8 ~: q; w" s$ I, ~{
. n6 l1 _. _% S# T( {1 }- [; O0 ofloatfParam = *pData->m_pfParam4; //pointer ,pData->m_pCalcParam[3].m_nParamStart >= 09 `8 z- f) G, S
intnPeriod = (int)fParam; //参数1 F$ _ i( n G9 z: {$ w
//const float* cpParam = pData->m_pfParam2; // cpParam = pointer to
2 h7 x4 @! | v- r6 r8 C2 |constfloat* cpParam2 =pData->m_pCalcParam[1].m_pfParam; // cpParam =pointer to 3 w* p& a+ L$ u2 ~
constfloat* cpParam3 =pData->m_pCalcParam[2].m_pfParam; // cpParam =pointer to
" b+ N% p& ]% t5 c6 _4 ~constfloat* cpParam4 =pData->m_pCalcParam[3].m_pfParam; // cpParam =pointer to
$ a5 N& w- {: d5 ]//const float* cpParam5 =pData->m_pCalcParam[4].m_pfParam; //cpParam = pointer to % V' A( `6 p/ F2 F, L
//in foxtraderoooq:"MYFUNC2010@MYMACLOSE"(c,c,c,6),colorffffff,linethick5;// cpParam5 =pData->m_pCalcParam[4].m_pfParam
( q2 {; {$ u" X$ U1 d//pData->m_pCalcParam[5].m_fParam); //value
6 W/ d6 @/ L% C% N- q) r) x//const float* pValue1 = pData->m_pCalcParam[0].m_pfParam;
. k: H% n2 T# Q0 F' W; g; r3 z" O//const float* pValue2 = pData->m_pCalcParam[1].m_pfParam;
3 ?* a1 k" o5 B. M; B//const float* pValue3 = pData->m_pCalcParam[2].m_pfParam; Y; m& ^6 `9 U% b# m7 B1 w
//const float* pValue4 = pData->m_pCalcParam[3].m_pfParam;
3 I2 B+ J& B8 a$ q. ^//const float* pValue5 = pData->m_pCalcParam[4].m_pfParam;
! _: U' z5 |9 H: T9 Lif(nPeriod>0)9 V/ z, x2 P, i0 ]
{
2 D" _! h( \" G5 NfloatfTotal;1 D0 b1 D& t& ~
inti, j;3 ^; m$ A& w, f- W# P) t' W" [
intndata = pData->m_nNumData;
3 S0 k& X5 y+ H/ J* }//float yy[5000][1];
; y; k9 a; `+ q& u# m; [for( i = nPeriod-1; i < pData->m_nNumData; i++)//计算nPeriod周期的均线,数据从nPeriod-1开始有效* e) Y% l$ X4 {6 ^/ e
{% j9 M8 C( e5 m" l; q. {$ I% }
fTotal= 0.0f; v" I. u0 }. |
doublelngth=5.0;
8 d6 T2 d- Z* B/ [- W7 `doublectemp=4.0;/ j* g8 Q T0 {$ S
//float yy1[5000][1];" y+ p2 @4 b* W6 {% Z
for( j = 0; j < nPeriod; j++ ) //累加
0 I* N& H, j5 U0 m: l1 U0 p{
9 s3 O0 c$ g2 SfTotal= pData->m_pData.m_fClose; // @@@@@@@ vc++ 2010 cl.exe 使pData->m_pData[i-j].m_fClose错误' }, @" j$ b* E' o& n* H; l) C
}
& q4 C5 E1 E1 N @//pData->m_pResultBuf = fTotal*1.03; //平均8 H. }( N- I0 _0 W3 ?/ O+ A
fTotal= cpParam3;# I3 U2 E8 h- @: T' V5 I
pData->m_pResultBuf= fTotal*1.03; //平均7 m5 V! y; D% y o; a
//ctemp = (double) pData->m_pResultBuf; // double & - - - >overload a float value , double * - - - > overload a pointer todouble8 I2 ~) _7 x! x! T
//pData->m_pResultBuf= (float) ppow10(ctemp,lngth); // float &- - - > overload a float value
, y8 H3 `+ C) B& qpData->m_pResultBuf=(float) ppow10( (double) pData->m_pResultBuf,lngth); // float &- - - > overload a float value, (float) = overload
2 K% m/ P( L8 h}: O% A/ B" L% S+ N' m3 i, r
returnnPeriod-1;5 \9 C0 L6 n2 s4 n
}
5 ?6 u" w1 J3 t) J}
$ j+ ]0 t: w$ o- \3 V4 z( hreturn-1;
, o* j5 s$ o2 z/ b$ l9 \6 b}
- D( p3 W& R2 l& L# m: m//计算均价,2个参数,参数1为待求均线的数据,参数2表示计算周期
) [3 G$ Q6 [- q7 c N: e( R//调用方法:
- ~+ h7 o4 j7 P6 h# A1 b- z0 O//"FOXFUNC@MYMAVAR"(CLOSE-OPEN,5), Y( i: Q* I4 d s ]* Y
__declspec(dllexport)int WINAPI MYMAVAR(CALCINFO* pData)9 G) l9 `8 v. v7 @$ Z" N8 @3 \
{
' t6 \9 l2 R5 D* `0 m% }if(pData->m_pfParam1&& pData->m_pfParam2 && //参数1,2有效' X. D) H4 Z$ L8 `+ \
pData->m_nParam1Start>=0&& //参数1为序列数5 r9 z5 I7 P. Y! y) ]3 i- R* J
pData->m_pfParam3==NULL)//有2个参数
6 y( A: x* ]3 @* Y+ k0 l1 B{: _+ w7 z8 j! b" Q
constfloat* pValue = pData->m_pfParam1; //参数1
1 D4 Z4 v# \5 ~" Z; U# PintnFirst = pData->m_nParam1Start; //有效值起始位
7 @) h; |. T: g1 Y0 I% ZfloatfParam = *pData->m_pfParam2; //参数2
& b; ?6 y9 h5 I# `( rintnPeriod = (int)fParam; . Q t! K _4 r
if(nFirst >= 0 && nPeriod > 0 )$ y- t- d1 r: F/ f5 {
{* m. f. D* E# p0 o# ^
floatfTotal;
# x( A0 ]8 i% ~+ N6 Ainti, j;
% T6 a' J* R/ d: vfor( i = nFirst+nPeriod-1; i < pData->m_nNumData; i++ )5 D( @% ^$ M, {% q
{7 ~" S i3 d' D0 A
fTotal= 0.0f;& V4 m( B, S! m
for( j=0; j < nPeriod; j++ ) //累加- |. d- b5 G7 F3 }* N+ n
fTotal+= pValue[i-j];# \ P# H& X$ J, S9 o5 G, _
pData->m_pResultBuf= fTotal/nPeriod;//平均
9 _. _5 k8 G$ }- j7 L}( u3 O+ e$ i" y3 s2 O. i
returnnFirst+nPeriod-1;/ q; n$ W8 \ I! J
}1 ^& R8 d5 h4 N9 |7 z& s; a) |( o
}* }# ?9 e- G6 B! Z
return-1;
; |/ A3 x5 p1 M3 t. d}& D2 m' h" V/ h0 X# A# n8 a
//计算多个序列的均值,5个参数,参数1-4为待求多个序列,参数5用于举例说明数值参数的用法,实际在此例中无需该参数
- L: p. v4 X6 j! x8 P2 Y/*
# B) X% y. j7 i, [& n; p* M调用方法:; C J1 r% W( v$ q9 j
MA1:=MA(CLOSE,3);) R3 ^" `3 E" m
MA2:=MA(CLOSE,6);2 R! l: W8 [3 ?6 U' ~7 p! U8 D
MA3:=MA(CLOSE,12);9 p. O, h" ]6 @6 g. J. v$ s1 c
MA4:=MA(CLOSE,24);# c7 ]* L$ k5 x
MYBBI:"FOXFUNC@MYBBI"(MA1, MA2, MA3, MA4, 4);1 [9 _- Y/ @: T( |5 }) O0 `
*/4 [$ y- o* a3 @2 U; ?. c
__declspec(dllexport)int WINAPI MYBBI(CALCINFO* pData)
% B$ V$ ?2 p& @+ p{
3 W4 C6 z. F9 U5 G% @6 E! L$ ?- d( gif( pData->m_pCalcParam[0].m_nParamStart >= 0 &&
! l% g- J3 U# U2 jpData->m_pCalcParam[1].m_nParamStart>= 0 &&& k M! H" ?( H
pData->m_pCalcParam[2].m_nParamStart>= 0 &&3 ]2 ]9 c, _/ U6 v! `8 T9 w
pData->m_pCalcParam[3].m_nParamStart>= 0 ) //4个序列都含有效数值0 \/ k/ X" w% v7 L! l
{% j+ ~5 \5 O: U4 K6 p; K& I$ F- F6 i
//计算返回的序列的第一个有效值位置
1 ?" r" T" Q# e, ~" x U' v# iintnFirst = pData->m_pCalcParam[2].m_nParamStart;//已知返回的序列的第一个有效值位置与第4个序列一致
0 O+ A! f) v* J7 `4 t//若不知,则
, ?. a* m4 ?& v1 b- ~* H+ s4 Z/*6 n: W2 H3 _0 ] }! P% C, }
intnFirst = pData->m_pCalcParam[0].m_nParamStart;# I9 u" Z& f- y# A
if( nFirst < pData->m_pCalcParam[1].m_nParamStart )
% N% b! \3 u; q, n0 _nFirst= pData->m_pCalcParam[1].m_nParamStart;! B0 F0 r; J! E& n8 f" k
if( nFirst < pData->m_pCalcParam[2].m_nParamStart ) & b( _8 q, [: L: d0 z& [
nFirst= pData->m_pCalcParam[2].m_nParamStart;
, u3 W- K5 ^3 Z9 Jif( nFirst < pData->m_pCalcParam[3].m_nParamStart )
' J( a5 k8 M# p/ r0 ]& TnFirst= pData->m_pCalcParam[3].m_nParamStart;
" U8 _1 ~4 j- E- o r*/1 j: a N6 u6 Z0 v2 Z
constfloat* pValue1 = pData->m_pCalcParam[0].m_pfParam;
+ A3 u; G2 Y" C8 Aconstfloat* pValue2 = pData->m_pCalcParam[1].m_pfParam;, K( s6 Y; k& L( N
constfloat* pValue3 = pData->m_pCalcParam[2].m_pfParam;; @$ w' A3 R- l& m. d
constfloat* pValue4 = pData->m_pCalcParam[3].m_pfParam;1 p, R: z/ s) e. d, {0 y ]
constfloat* pValue5 = pData->m_pCalcParam[4].m_pfParam;$ G7 y! z* {9 _! G; Z
constfloat* pValue6 = pData->m_pCalcParam[5].m_pfParam;4 ?* D* {6 Y! Y( @( M
//const float* pValue1 = pData->m_pfParam1;/ ^2 R, G E- b- W, a. q* K
//const float* pValue2 = pData->m_pfParam2;/ R6 w1 e, y6 c% G! P
//const float* pValue3 = pData->m_pfParam3;+ }$ @, @1 M+ U: N% d
//int nNum = (int)(*pData->m_pfParam4);//实际上该例中已知nNum=4,在此用于说明数值参数的用法
P0 z1 A& `* Q1 HintnNum = (int)(pData->m_pCalcParam[6].m_fParam);//实际上该例中已知nNum=4,在此用于说明数值参数的用法
& @4 |$ y: a: }$ }9 Bfor(int i = nFirst; i < pData->m_nNumData; i++ )2 C% j6 R. C1 Q1 }
{
3 b h. M1 L O3 W: R( j- hpData->m_pResultBuf=
( }6 }2 t0 [4 ^% g//(pValue1 + pValue2 + pValue3 )/nNum;# E" S* B8 B6 H2 B1 ]
(pValue1+ pValue2 + pValue3 + pValue4+pValue5 + pValue6)/nNum;
& n0 O- c' e& X3 R}
8 x) p" n1 i+ ]/ t" `' KreturnnFirst;
' v& h+ A2 S" X# k$ y! w}' h4 C% ]$ L) m% H3 e
return-1;
, `: f/ x2 x* \0 N}
/ M; m+ ~9 M( [8 y: c q
- J3 K1 V5 p% R% h' d$ y6 c: Y9 _/ W
" [2 h# x- D# B8 K$ i7 M# b
//////////////////////////////////////////////////////////////pow10.asm6 Q! v& H6 y) b+ p. h
;*******************************************************- j5 P _( C% I) Z. @- j6 y' [
;* *
V7 [: `0 P9 E w;* Delphi Run Library *
' p3 E3 ^- H5 d- _;* * |5 C0 s% f/ e4 C
;* Copyright (c) 1996,98 Inprise Corporation *
) G. U) }" z# v( @;*--------------------------------------------------------------------------
. Y* j( F: q: w$ d2 @;* To compile "tasm32 /ml pow10.asm" *
) f4 b% K- k' `;*--------------------------------------------------------------------------
7 V8 {' [% Q! [; ^, M( C- e;*******************************************************
# t3 e! u* k- |.386& k5 P; j6 o) ~1 X
;.MODEL flat,c (error must be in segement block must have segment
, m7 Q4 R) U9 r1 n/ k6 V3 {;!!!!!11 important if ',c' is not used , must use 'public _ppow10, and'_ppow10 proc'- w* W, {+ F, q# i
;!!!!!11 important if .MODEL flat,c is not used , must use ;_TEXTSEGMENT WORD PUBLIC1 a+ q1 Z% p0 v( s+ ~7 B3 u
;'CODE'..._TEXT ENDS and must use 'public _ppow10 and '_ppow10 proc'
0 I" m9 l0 c9 |+ J% C9 E8 ?.MODELflat,c ; just use .code, no need for segment,!!!!!11 important if',c' is used , must use 'public ppow10, and 'ppow10 proc'2 @. H: j. @! ^2 O# {. V3 W
;ppow10 PROTO,aVal:PTR REAL8, bVal:PTR REAL8% C" l" E) I- p
;includeE:\Vsource\masm32\INCLUDE\windows.inc2 t; i! c" X1 s: `2 G
;includeE:\Vsource\masm32\INCLUDE\user32.inc
4 D0 O7 H& |) B) d;includeE:\Vsource\masm32\INCLUDE\kernel32.inc5 D9 z0 x8 C2 @7 s' t
PUBLICppow10
1 b4 t: \5 @8 f% L/ e/ h1 y.CODE; n1 o, J- P% L) w9 h( \1 O6 m8 q
;DllEntryproc hInstance:HINSTANCE, reason:DWORD, reserved1:DWORD9 b. M$ X& Z3 V# P
;.if reason==DLL_PROCESS_ATTACH
' d$ `2 X, ]% c$ x;invoke MessageBox,NULL,addr LoadMsg,addr AppName,MB_OK
1 s- {) y% P& h- [ G% @2 Y9 m;.elseif reason==DLL_PROCESS_DETACH2 |6 f. K1 K# P0 N
;invoke MessageBox,NULL,addr UnloadMsg,addr AppName,MB_OK0 Q. L& f, ^/ o
;.elseif reason==DLL_THREAD_ATTACH
0 f& B! G0 D) a6 H3 K; K;invoke MessageBox,NULL,addr ThreadCreated,addr AppName,MB_OK7 y. ]/ d' K' _% @6 _+ m
;.else ; DLL_THREAD_DETACH
+ |; L: E4 j+ \/ }* Y- O;invoke MessageBox,NULL,addr ThreadDestroyed,addr AppName,MB_OK
4 E; p L: K& z2 L2 M3 E;.endif, K& r1 d! e2 L Z- ]6 y3 j
;mov eax,TRUE
/ m$ [3 g# T& A3 Q5 h;ret0 ^4 i- F; s7 W3 x5 c, v+ E
;DllEntryEndp
: `1 H" N4 O+ U% ~9 p;FUNCTION _Ppow10( double val, double pow: ) : Extended;' S: G0 k8 V# ~1 G+ n
;_TEXTSEGMENT WORD PUBLIC 'CODE'2 E- Y5 S) L, R0 m N; L1 ?6 F
;ppow10 PROC,aVal:PTR REAL8, bVal:PTR REAL8
" T; u- P5 I x7 V;ppow10 PROC,aVal:* Qword, bVal:Qword
8 S5 c* d* T% D# S9 B3 tppow10PROC near B, m$ O2 `# K4 \1 {
XUEQU 8 ; for eip & ebp
+ t2 D: C: W. r7 h$ JXDEQU 0 ; for edi, esi, ebx, ecx, edx) q$ C' T7 p! [. |
fp_powerEQU QWORD PTR [ebp+XU+8]
% B( I- G& W* X& W% Cfp_valEQU QWORD PTR [ebp+XU]
5 f0 u: u1 w, H- u5 [; F. `valEQU QWORD PTR [eBP-XD-8] ; USE STACK! w6 y1 |8 } j7 r k, @" h
powerEQU QWORD PTR [eBP-XD-16] ; USE STACK z9 F+ o( U- | T
pow10EQU QWORD PTR [eBP-XD-24] ; USE STACK7 B1 \$ |% f* p' W
FPower10:: x/ G, _+ a3 z- v1 y& U
pushebp
! O0 l# {- d' w1 _movebp,esp6 J+ q2 o% l; L- f
;push edi8 g8 l- S0 m9 y2 o) x. i% f q: D
;push esi4 X4 ~* n& S1 }( B, u; }
;push eax
! q- z* {9 b" B2 s b$ I;push edx
4 X" ], X" @# n2 T( Wsubesp,24
6 s. F, \2 a% X2 p8 S1 ZFINIT9 M3 O) }0 _% p: W' \. ]
fldz8 W x( o- b; F( f; q4 ?, U
fstval- H I6 q6 m- K6 o# A. d
fstpower
6 F# G% |; ]1 Q/ G. g, M7 d" Yfstppow10 o0 z% f; D7 [4 a1 U( @
MOV EAX,8 MOV EDX,8; fldpi
) O$ E( t" S+ c1 R+ ^- k! j fld fp_val ;st(0)=val; fld aVal;st(0)=val& V; F9 K+ x5 L8 o' }* X9 y- I" a
fstval
1 e$ f& ~8 S8 |* \. w1 e* K: K; D;fld Arg2 ;st(0)=power' [( X# g+ [! p( m: ~2 F7 P
;fstp power* }" Y% x! v. B; s
;fld val ;st(0)=val
q5 g; {6 M5 E; X7 {% @9 K;fmul val ;st(0)=val*val
- m, u9 @; ]: m( z9 a;fmul val ;st(0)=val*va*val) t3 V+ N4 r+ B! Y8 O
;fadd st,st(0)
; l7 |8 r! \9 g% };fmul qword ptr [ebp+16] ;st(0)=power0 v! F! Y; P! L0 H8 L( O; M6 |
;fadd st,st(0)
/ q6 U% U) B2 ]& X3 ]0 o* ?6 M, C; ^;fwait" `5 \; Z# O# k6 ]9 V
addesp,24
3 e0 T% G& I& h;pop edx0 t/ K* l; _+ {4 q4 _/ G- V
;pop eax, a# r/ J7 Z3 I% z9 W) }3 T6 l
;pop esi
" e. k; T8 c A;pop edi
$ `; y, E0 f8 imovesp,ebp" J+ ?8 L' M6 W% y
popebp7 Q; [' s7 V3 U5 v: u; v7 r" S6 A
;leave ; @@@@@@ important don't use leave in vc++ 2010 x; w9 c l- O, n
RET;return value = st(0)! u, G- a$ M/ G- Y
ppow10ENDP
8 u% }8 }- _# c" l0 W;_TEXTENDS. ?! K& {. C) n6 D/ m" v7 j9 }6 i
END) T& h4 O& E y
;END DllEntry |