//////////////////////////////////////////////////////////foxfunc.cpp
6 z6 Z$ {+ q. `' M6 N/ S8 ~
' V( |( F7 q4 p! h//FoxFunc.cpp : Defines the entry point for the DLL application.& ?4 z- f$ W- r$ R: J' K2 F
//
9 L1 L0 _& j2 _! R C2 x#include<string.h>0 t, i1 m) X. [7 F
#include<stdio.h>
! S8 E8 |$ s- Y* [#include<io.h>, j+ D* X6 Y% X( I/ P( h4 Q
#include<math.h>
/ ~/ ]4 _1 W! A' l7 F#include<iostream>
! u0 L! C: T( m: [7 c% m#include"stdafx.h"
' k* O8 Z# t6 v b8 Z7 [; X#include"FoxFunc.h"8 _8 B9 l5 o( q; R; p n, R
usingnamespace std;3 w! b+ a0 E9 P, }7 y E$ W
BOOLAPIENTRY DllMain( HANDLE hModule,
; m: i- X. L& N" ADWORDul_reason_for_call,
; V/ l5 |/ P) s5 ELPVOIDlpReserved7 l" {. C, A- C8 c8 j. i) z
)
; ^4 h N+ J$ Z# ~" r# x7 a{8 _+ P- F, k n, w7 O' S* m2 F9 e
switch(ul_reason_for_call)8 ~. l" a% c8 M% t& O; l' A
{( r0 `1 s! J6 O& A3 }6 R' T5 m- x
caseDLL_PROCESS_ATTACH:
0 \$ `" d2 J1 S3 p- w% T. ]caseDLL_THREAD_ATTACH:
5 T( l& ?' C- V- h$ Y& HcaseDLL_THREAD_DETACH:" a( c7 B5 E. j, k8 [$ `: I% L
caseDLL_PROCESS_DETACH:
4 I1 R. N4 Q3 p. C# |9 Abreak;: [0 H7 l9 X5 j1 h
}
/ ]. ^. p0 a! I1 g7 m1 _returnTRUE;
' X p( z* C2 X9 L8 B}
' v6 r4 l3 c, e* [2 A3 E//计算收盘价的均价,一个常数参数,表示计算周期' x0 L- j* \) L) B4 P A
//调用方法:7 F/ E% I7 q9 f+ v) d
//"FOXFUNC@MYMACLOSE"(5)
" z/ M5 l1 {* u4 r9 V8 h' y/*
2 J( ^2 ^$ d: ]* l0 b! J//extern "C" double __cdecl ppow10(double ctemp,doublelength); - - - > wrong, extern "C" is to declare pow10coming from a .dll or .lib+ i& K$ C. C5 D% s' K
//extern "C" double ppow10(double ctemp,double length); - - -> both are the same
9 P9 r* R! J% \& U*/" A, p W6 M+ c7 h1 u# I% e
extern"C" double __cdecl ppow10(double ,double );
' w: Q/ v3 r7 C' K0 Y+ H, g//double ppow10(double ,double ); ' d& V$ S& Z) I$ I: N" E8 \
//call pow10() by __cdecl5 A# {$ [$ B! @
//!!!!!!!! use "C" for Microsoft visual C++ compiler! @ \; }! A0 M# ^2 B
//!!!!!!!! use "C" for Microsoft visual C++ compiler j2 R. V9 L) X4 O/ E
//!!!!!!!! use "C" for Microsoft visual C++ compiler
& X: R1 a" p7 T" @//!!!!!!!! use "C" for Microsoft visual C++ compiler
" F5 P; ~: I9 ?) j//!!!!!!!! use "C" for Microsoft visual C++ compiler
5 f( P6 `" G. Q# [__declspec(dllexport)int WINAPI MYMACLOSE(CALCINFO* pData); r. ]1 K* f& E: i8 Z
{( ^2 O- |, F& d
if( // pData->m_pfParam1 && //参数1有效) x0 v3 b: S7 [, F0 Y$ ^% L8 n' r4 p
//pData->m_nParam1Start<0 && //参数1为常数
4 h4 J7 B v- U! Y//pData->m_pfParam2==NULL ) //仅有一个参数
( t6 m0 W$ b% e' Z//pData->m_pfParam1 && pData->m_pfParam2 &&pData->m_pfParam3 && pData->m_pfParam4- J/ t$ _4 s P2 }/ @
//&& pData->m_pfParam5 && pData->m_pfParam6 &&pData->m_nParam1Start>=0 &&
6 |. v) `! ^6 u! G( m) l//pData->m_pfParam7==NULL)5 S6 @2 Z- j) h' R
//pData->m_pfParam1 && pData->m_pfParam2 &&pData->m_pfParam3 && pData->m_nParam1Start>=0 &&7 o! _/ V$ E7 i( p
pData->m_pCalcParam[0].m_nParamStart>=0&& pData->m_pCalcParam[1].m_nParamStart>=0
+ ~5 ^& _# t' A! M2 a$ ~/ j' s7 T# J&&pData->m_pCalcParam[2].m_nParamStart>=0) 6 p3 }2 b& S/ B6 f2 |
{, M6 \, w8 z$ i
floatfParam = *pData->m_pfParam4; //pointer ,pData->m_pCalcParam[3].m_nParamStart >= 0
3 X; R5 [7 s8 _intnPeriod = (int)fParam; //参数1& J; d: d4 t' {, p. W& `5 O5 {
//const float* cpParam = pData->m_pfParam2; // cpParam = pointer to 3 P- Y$ e' }9 k& r; c
constfloat* cpParam2 =pData->m_pCalcParam[1].m_pfParam; // cpParam =pointer to
- M% N' _8 K- L5 y6 Lconstfloat* cpParam3 =pData->m_pCalcParam[2].m_pfParam; // cpParam =pointer to ( N: Y& ]% G. k' t T
constfloat* cpParam4 =pData->m_pCalcParam[3].m_pfParam; // cpParam =pointer to
- K Z# s( I. Z//const float* cpParam5 =pData->m_pCalcParam[4].m_pfParam; //cpParam = pointer to 3 h+ I% H4 @$ T) Z! J4 h0 B
//in foxtraderoooq:"MYFUNC2010@MYMACLOSE"(c,c,c,6),colorffffff,linethick5;// cpParam5 =pData->m_pCalcParam[4].m_pfParam 2 Q6 @+ a0 d S7 M9 @9 Q
//pData->m_pCalcParam[5].m_fParam); //value
5 t6 k5 |$ N$ ]4 S5 _//const float* pValue1 = pData->m_pCalcParam[0].m_pfParam;5 W" R3 F9 V+ ~6 U! V# A) A d
//const float* pValue2 = pData->m_pCalcParam[1].m_pfParam;% G7 L& E2 q+ h, I+ K. b; G) B
//const float* pValue3 = pData->m_pCalcParam[2].m_pfParam;; X9 Z# {5 y3 h
//const float* pValue4 = pData->m_pCalcParam[3].m_pfParam; F+ {) {6 |! G" q2 l
//const float* pValue5 = pData->m_pCalcParam[4].m_pfParam;
0 @. ~) @, n6 X: H! m4 i; }0 u7 x! dif(nPeriod>0)5 W% o, \, B6 h! T
{) |! l. {/ a; b1 ^
floatfTotal;
1 C+ h6 G3 K1 c6 p) {( F& ninti, j;
" N5 g }: J T+ C3 @intndata = pData->m_nNumData;3 i& D1 n+ E5 P$ _! P1 K
//float yy[5000][1];
- V W5 | m l' @) D7 t- f$ Jfor( i = nPeriod-1; i < pData->m_nNumData; i++)//计算nPeriod周期的均线,数据从nPeriod-1开始有效
7 c) @$ r+ ]0 k# {+ B8 {8 H{
# j( t F9 {7 r! Q0 kfTotal= 0.0f;& p" }7 B h2 Q1 K/ _/ T
doublelngth=5.0;
) D4 U- Q1 F- w) J$ n, n z/ wdoublectemp=4.0;/ a7 Z: m( F, K& b
//float yy1[5000][1];
6 u% O+ X$ {2 C: p, U2 D! N$ O+ Gfor( j = 0; j < nPeriod; j++ ) //累加
x' }: W, O+ |/ Y4 F2 A+ M{
0 h+ J, o7 m7 N' Q/ jfTotal= pData->m_pData.m_fClose; // @@@@@@@ vc++ 2010 cl.exe 使pData->m_pData[i-j].m_fClose错误, w2 O) d) d8 e1 `4 j' j
}0 J) o v7 Y9 s2 N6 Q
//pData->m_pResultBuf = fTotal*1.03; //平均* e$ g) D" e# x, X9 J* r9 c) M" \
fTotal= cpParam3;
8 e% O$ p, F3 A1 {8 N$ e* G6 IpData->m_pResultBuf= fTotal*1.03; //平均
! O0 k, `8 K1 s3 [/ ^//ctemp = (double) pData->m_pResultBuf; // double & - - - >overload a float value , double * - - - > overload a pointer todouble) A1 F% r W. \6 u y- A$ d+ }
//pData->m_pResultBuf= (float) ppow10(ctemp,lngth); // float &- - - > overload a float value
/ k5 n' U; ~8 w# j# \0 k( wpData->m_pResultBuf=(float) ppow10( (double) pData->m_pResultBuf,lngth); // float &- - - > overload a float value, (float) = overload
8 J& b8 d5 t1 c$ g& o* S" T}/ k9 Z# ^6 B- g( N, h
returnnPeriod-1;5 N, N. S+ S$ b5 x U @
}
^ U5 S8 i) ?}
+ }1 ~% V4 ], u6 Greturn-1;
3 f4 j: X/ }; z# J' R9 M# V) Q}7 o9 k7 P3 d# G* c8 |7 ^
//计算均价,2个参数,参数1为待求均线的数据,参数2表示计算周期
0 a }5 p1 r( m) h5 S, L7 E//调用方法:% z8 m2 c6 T9 ]# l( t
//"FOXFUNC@MYMAVAR"(CLOSE-OPEN,5)
0 T. O1 m- \* x$ a& |' o__declspec(dllexport)int WINAPI MYMAVAR(CALCINFO* pData)
7 V3 G% i; W' s; y/ H: E0 y6 j+ t/ ]& n{/ k% h! W- O( Z8 j- {
if(pData->m_pfParam1&& pData->m_pfParam2 && //参数1,2有效
0 h7 E3 I: {" z5 y5 z0 epData->m_nParam1Start>=0&& //参数1为序列数" V( T$ h# k+ y' m6 |
pData->m_pfParam3==NULL)//有2个参数, q( O p' X* a
{8 e$ r5 r: _" |/ U0 r$ D8 ?: ?9 R
constfloat* pValue = pData->m_pfParam1; //参数1
: {+ C3 _& D/ r; v/ [intnFirst = pData->m_nParam1Start; //有效值起始位; k0 I' w: e+ |5 ~
floatfParam = *pData->m_pfParam2; //参数2
3 I5 r) z- Y8 k7 b' ?intnPeriod = (int)fParam; / }7 u1 V0 T! B( O/ d! E
if(nFirst >= 0 && nPeriod > 0 )) A0 u! Y0 Q3 o1 e w T
{6 m4 o& }8 p, `5 U
floatfTotal;; s: a, L4 R+ u( h6 M
inti, j; K$ B4 A% Z! K; v4 J3 P
for( i = nFirst+nPeriod-1; i < pData->m_nNumData; i++ ). U; p& V8 L: R8 ~0 u
{1 a @5 H2 Q) I' h
fTotal= 0.0f;
5 B7 Z8 [/ W, R0 c3 J* Dfor( j=0; j < nPeriod; j++ ) //累加7 T+ i5 c' w: [- o' l" ?; ]
fTotal+= pValue[i-j];
( F7 \: u/ Q/ ^6 `% KpData->m_pResultBuf= fTotal/nPeriod;//平均2 q( \& l' u" R* O* i' c2 I
}8 A4 c" ^+ v$ c% o5 c$ S
returnnFirst+nPeriod-1;9 d9 J! n/ C9 X( [4 h/ c- H- I" E8 g
}
. F! m- D; D# h, R}
, F% ^( u- c" r, a' e' t' I* Ureturn-1;
5 E. r, T$ p' v, M# b; q}# I) Y; Y w, _3 }
//计算多个序列的均值,5个参数,参数1-4为待求多个序列,参数5用于举例说明数值参数的用法,实际在此例中无需该参数
; I' }$ h6 D8 s5 S* T$ @ d/*
5 M6 B' `9 f! H6 b, {调用方法:
" t# H$ E( B! W& N a5 Z) O8 a1 RMA1:=MA(CLOSE,3);
, I! W' v4 B. a7 W( H# r3 E; DMA2:=MA(CLOSE,6);
+ E1 v2 H. H% k3 s1 @$ ^- k5 g. pMA3:=MA(CLOSE,12);$ G; o8 @6 G& @# f+ @
MA4:=MA(CLOSE,24);2 `! `! P7 J5 c: s1 P, {9 Z
MYBBI:"FOXFUNC@MYBBI"(MA1, MA2, MA3, MA4, 4);
* P$ p/ \% [0 J0 Z9 ^# l*/
^' c( y1 O' S) ^$ C' z( ^( ]__declspec(dllexport)int WINAPI MYBBI(CALCINFO* pData)+ ~) ^) E$ j9 P3 z
{
# ?0 w$ g* b6 t; H) V! Oif( pData->m_pCalcParam[0].m_nParamStart >= 0 &&6 T" V5 ]4 Y4 d; f& U
pData->m_pCalcParam[1].m_nParamStart>= 0 &&
$ J# X2 f1 w6 \* HpData->m_pCalcParam[2].m_nParamStart>= 0 &&; y0 _4 t" P# Q/ s
pData->m_pCalcParam[3].m_nParamStart>= 0 ) //4个序列都含有效数值
A2 R6 g9 J7 z9 [{" v m2 R$ M- u) n; N- g* L
//计算返回的序列的第一个有效值位置2 q2 P; r4 o" e4 }( N1 z9 q( j
intnFirst = pData->m_pCalcParam[2].m_nParamStart;//已知返回的序列的第一个有效值位置与第4个序列一致
; U$ i7 D( h9 W O6 w//若不知,则, F7 J9 k: o2 Q. W
/*
' i; u+ [( ]/ a' RintnFirst = pData->m_pCalcParam[0].m_nParamStart;' K3 y( f0 N& e4 F q
if( nFirst < pData->m_pCalcParam[1].m_nParamStart ) ) c4 X) U$ N4 F+ |1 d: M$ n. `0 W. X
nFirst= pData->m_pCalcParam[1].m_nParamStart;& C0 a# Z; D8 S. g
if( nFirst < pData->m_pCalcParam[2].m_nParamStart ) o) a9 F# a3 ~ f& a
nFirst= pData->m_pCalcParam[2].m_nParamStart;
7 t4 H+ U- Q: v$ T* y; Wif( nFirst < pData->m_pCalcParam[3].m_nParamStart )
, |0 h0 M, G6 i" u8 e0 inFirst= pData->m_pCalcParam[3].m_nParamStart;3 }$ @: @% O7 t# s
*/, \0 c% ^) A7 P! y
constfloat* pValue1 = pData->m_pCalcParam[0].m_pfParam;
* W+ `5 g6 p: a2 `# M3 }constfloat* pValue2 = pData->m_pCalcParam[1].m_pfParam; K, V3 y! \, s. c: F( j
constfloat* pValue3 = pData->m_pCalcParam[2].m_pfParam;/ b/ o# r0 O' S7 \" I' n( E2 c
constfloat* pValue4 = pData->m_pCalcParam[3].m_pfParam;
8 O/ ]& ?9 v) g; L8 E- Q. Z- ~constfloat* pValue5 = pData->m_pCalcParam[4].m_pfParam;7 u* x4 g* ~! f
constfloat* pValue6 = pData->m_pCalcParam[5].m_pfParam;, _- y. n: P5 ^0 z, ]
//const float* pValue1 = pData->m_pfParam1;
7 C+ v9 N, w: }//const float* pValue2 = pData->m_pfParam2;
% Y9 R1 \( R5 I0 T+ n//const float* pValue3 = pData->m_pfParam3;2 q9 p3 n; t% @8 ?" ~
//int nNum = (int)(*pData->m_pfParam4);//实际上该例中已知nNum=4,在此用于说明数值参数的用法
" N" O y6 \1 Z# K# z6 a9 aintnNum = (int)(pData->m_pCalcParam[6].m_fParam);//实际上该例中已知nNum=4,在此用于说明数值参数的用法
. [& {& J4 \( l& x/ \8 Vfor(int i = nFirst; i < pData->m_nNumData; i++ ) Q# _" a8 s, c. @* m
{
( c$ m$ {' n: i: @7 f( ?; |$ {pData->m_pResultBuf=
; }2 T1 B0 q) F' [( M- R) h7 R//(pValue1 + pValue2 + pValue3 )/nNum;
! B4 e+ T- H5 \) i. g7 {(pValue1+ pValue2 + pValue3 + pValue4+pValue5 + pValue6)/nNum;/ t# ^. Y! C8 w
}9 }/ a2 t' C' F1 S
returnnFirst;
( m. l/ D' Z5 ^$ V. b# L; ], E}# q& e9 g+ O9 G, m7 [0 A- H
return-1;. v! U/ v. Y1 a2 ~- V4 J, _# O
}
9 Y3 V: ~' X# s
& x% c ^* y2 v* T7 t. z0 y! N4 q w
* M/ N X$ M& W+ I) e0 X; M
//////////////////////////////////////////////////////////////pow10.asm# D; [/ d6 M4 q6 ?" U2 ~2 n; Z+ n
;*******************************************************, n( e. s9 u) T, M' \7 Q3 N
;* *& f& n) h5 N) Q! m" @# P* y
;* Delphi Run Library *2 S6 k1 p, c3 \) Y3 d
;* *+ w R7 ?8 K' Q7 [2 b
;* Copyright (c) 1996,98 Inprise Corporation *9 ?4 r- k" V' P5 D( s
;*--------------------------------------------------------------------------
* n% E7 {2 M2 c g1 i O$ ^;* To compile "tasm32 /ml pow10.asm" *
0 ?; }" h& C/ D4 X;*--------------------------------------------------------------------------- {7 p, H) t3 ]* {
;*******************************************************
, K. f! Z7 s; _ c3 _3 P1 l7 O.3869 [9 B' ` x) I3 z- W l
;.MODEL flat,c (error must be in segement block must have segment
' j4 i) S4 s! O' q6 p4 q# N- |;!!!!!11 important if ',c' is not used , must use 'public _ppow10, and'_ppow10 proc'# v; {. k. _5 k$ B
;!!!!!11 important if .MODEL flat,c is not used , must use ;_TEXTSEGMENT WORD PUBLIC3 F7 L! o3 ~ k
;'CODE'..._TEXT ENDS and must use 'public _ppow10 and '_ppow10 proc'8 _( s$ N' e5 f" Q s7 A" c
.MODELflat,c ; just use .code, no need for segment,!!!!!11 important if',c' is used , must use 'public ppow10, and 'ppow10 proc'
# v6 n5 x2 g' h6 P! b' j;ppow10 PROTO,aVal:PTR REAL8, bVal:PTR REAL86 l" f9 s+ h. @! A8 @
;includeE:\Vsource\masm32\INCLUDE\windows.inc
& |4 R4 g) ?! M+ d( V4 E/ r;includeE:\Vsource\masm32\INCLUDE\user32.inc1 K$ n" B! Y% G1 h7 c
;includeE:\Vsource\masm32\INCLUDE\kernel32.inc
! Q/ E0 D! F$ q# T4 WPUBLICppow10' X9 i/ X4 D) s7 N( c0 U
.CODE
. F3 ~( o+ l# r2 I& z" v$ t;DllEntryproc hInstance:HINSTANCE, reason:DWORD, reserved1:DWORD/ h+ N1 D% a8 M; q
;.if reason==DLL_PROCESS_ATTACH
0 |% T7 u3 n" G/ w5 ^) v;invoke MessageBox,NULL,addr LoadMsg,addr AppName,MB_OK& @8 a1 a& E: \2 o
;.elseif reason==DLL_PROCESS_DETACH2 d5 {* y9 T1 E$ p
;invoke MessageBox,NULL,addr UnloadMsg,addr AppName,MB_OK* @4 u' J O9 m8 q% y
;.elseif reason==DLL_THREAD_ATTACH$ Y' x' }. M8 Q2 H: s0 @' P4 B
;invoke MessageBox,NULL,addr ThreadCreated,addr AppName,MB_OK
- k7 ~, {& M) n: I- F) ~;.else ; DLL_THREAD_DETACH
2 i* a3 U0 P1 C# M% S;invoke MessageBox,NULL,addr ThreadDestroyed,addr AppName,MB_OK9 t2 @; E3 z' h9 X2 e p4 k5 g
;.endif
8 ?4 j" ` g$ ?;mov eax,TRUE
( \8 {6 M+ E) j0 T;ret
0 W5 b! x1 q& E' K5 w. a;DllEntryEndp2 M2 t2 F/ A7 I
;FUNCTION _Ppow10( double val, double pow: ) : Extended;1 R3 C0 A" G5 {
;_TEXTSEGMENT WORD PUBLIC 'CODE'& s- f# l% @6 |
;ppow10 PROC,aVal:PTR REAL8, bVal:PTR REAL8/ w9 v$ m/ g2 [% r/ w
;ppow10 PROC,aVal:* Qword, bVal:Qword
6 _" p+ a- w* @ q4 hppow10PROC near5 [, l" w& C8 P; R; k
XUEQU 8 ; for eip & ebp . d w' X$ q- _% \
XDEQU 0 ; for edi, esi, ebx, ecx, edx
1 m: b! Q. }+ s' n$ g. Lfp_powerEQU QWORD PTR [ebp+XU+8], E B( |) k# J# B
fp_valEQU QWORD PTR [ebp+XU] 6 R3 O+ n+ |7 d; h$ X, T
valEQU QWORD PTR [eBP-XD-8] ; USE STACK# W5 R/ i. j$ u* ?# m# u/ u
powerEQU QWORD PTR [eBP-XD-16] ; USE STACK
& O+ w( z1 B8 H$ S5 jpow10EQU QWORD PTR [eBP-XD-24] ; USE STACK
4 P: ^4 E3 D% a2 c, t oFPower10:# R1 N; H) P& y4 P
pushebp
# x( b# _- h l9 J" C+ Kmovebp,esp
( U; a" r# J, b# C4 m;push edi
2 u% `% L1 P- X% \;push esi
* h. ?: f; }7 u6 s& x5 f. E;push eax
0 K* P- O" h1 d;push edx' m# J! p6 H' h( v& @
subesp,24. @1 |! N/ f9 P" C3 @3 A/ e; U
FINIT
6 I3 l; |4 w4 }7 M3 w Ifldz
5 j3 S5 b+ i' B7 ?( C) m: A* C. Cfstval2 o; k& P: ` L6 M6 Y
fstpower
3 R7 F9 `' {8 C) X0 r5 u# B6 Lfstppow10
* R. D! e. A# L) @ MOV EAX,8 MOV EDX,8; fldpi8 v( P2 {! Z, R2 B5 [, t
fld fp_val ;st(0)=val; fld aVal;st(0)=val
) T$ {; U4 D1 b" Z( l+ @, Q% E8 jfstval) [: K. e3 s x' q% J, ^
;fld Arg2 ;st(0)=power9 k% X/ T) J2 g, V8 U; @
;fstp power% @$ Z+ D) i" y# I
;fld val ;st(0)=val
( i X, ^2 ~. T' R;fmul val ;st(0)=val*val( i; t( o9 |+ D
;fmul val ;st(0)=val*va*val
8 O% i7 E( @! M) u" };fadd st,st(0)) j! W' T( E, A; e( G
;fmul qword ptr [ebp+16] ;st(0)=power
; _3 }' M+ R5 m+ J9 T;fadd st,st(0)# X" X" S8 R6 f k
;fwait, e8 J8 z9 t0 u9 w& w
addesp,244 m6 C/ F$ E, d5 Q( B
;pop edx3 c3 k3 Z; T+ q7 T6 \; [7 G! J' \, f
;pop eax
3 G* T2 _6 _& O: f! F0 H5 W;pop esi
, q' T" W& v# f0 Y;pop edi
' L$ m9 z3 D- j3 Zmovesp,ebp
7 H/ ~1 |7 M$ |% ?" S; A X( }popebp
H" o% P6 F+ ]; @;leave ; @@@@@@ important don't use leave in vc++ 2010/ S6 o2 H4 B% {
RET;return value = st(0)
$ c* i0 H3 s4 C) {, A7 \ppow10ENDP
; b1 t2 l( ~7 n( n;_TEXTENDS
N: S6 _; l& m. V/ U5 gEND) ]5 L! s8 `6 E/ D
;END DllEntry |