//////////////////////////////////////////////////////////foxfunc.cpp/ y+ a+ U% r5 l
. k b. L: [; b) i) m9 A' N" d
//FoxFunc.cpp : Defines the entry point for the DLL application.9 q: y7 n9 F9 i/ K5 F+ O+ b
//$ d9 l. d% [; t
#include<string.h>; R+ J1 s% r# U! S
#include<stdio.h>
% D9 r( m+ z, y#include<io.h>
7 @5 O6 K4 ?, Q#include<math.h>
' S7 H2 F- ] u% |+ O#include<iostream>
) d! G( T4 z7 a% r' T#include"stdafx.h"
8 ]* z6 z( [1 v/ M3 k+ v% J#include"FoxFunc.h": `# [2 N% v+ Y
usingnamespace std;( S, K8 O: h3 O0 S4 e3 v- w
BOOLAPIENTRY DllMain( HANDLE hModule, 1 @/ `3 o9 D$ W3 M
DWORDul_reason_for_call, 3 ]/ e% ?" F$ K- W* ]
LPVOIDlpReserved
( g# }9 _3 x, C' w3 m& a)4 t1 w" |5 \/ X E+ Y$ E3 L, L
{
5 a: C. C9 m; I. A' Oswitch(ul_reason_for_call)
. { _6 F Q, |6 Q( S{
, A- H* Z. u! H# g; x5 O) R) e& KcaseDLL_PROCESS_ATTACH:3 I" Y: ]) l3 z* o
caseDLL_THREAD_ATTACH:
- I; z Z( _7 z j* D2 o% o7 o* kcaseDLL_THREAD_DETACH:- O* k% F% K+ d0 X5 f$ s
caseDLL_PROCESS_DETACH:
" J: [5 F' r; D# |$ X' T* J3 Ybreak;! K. G( [* F* A' U
}$ |% w' V0 T* ?4 K4 n! Z7 h
returnTRUE;
7 E8 E2 }- ^& ?8 u}) w* x& f) b9 N7 J
//计算收盘价的均价,一个常数参数,表示计算周期
. s5 o& g9 o( G& T; `5 \//调用方法:
+ [2 R+ ]3 p% t i+ f//"FOXFUNC@MYMACLOSE"(5)# C- L6 A$ ^( _. H2 V
/*
: z } Z7 S7 i$ G( I//extern "C" double __cdecl ppow10(double ctemp,doublelength); - - - > wrong, extern "C" is to declare pow10coming from a .dll or .lib
. d5 g" D& Q1 I# t" x! ?//extern "C" double ppow10(double ctemp,double length); - - -> both are the same
, K2 d9 V3 T+ O7 H. w* C6 c% K*/3 z+ O* {1 a; T6 j
extern"C" double __cdecl ppow10(double ,double );1 U$ l' ?- r- _5 _% K. t6 m- e
//double ppow10(double ,double ); 3 z, D4 B. x! h3 U) J
//call pow10() by __cdecl1 V: H! z1 K% I8 k# ?# G+ t
//!!!!!!!! use "C" for Microsoft visual C++ compiler- o+ ]/ ?$ |5 f
//!!!!!!!! use "C" for Microsoft visual C++ compiler
& X5 ?3 H, n/ o5 F) W//!!!!!!!! use "C" for Microsoft visual C++ compiler
! d- N" _: q. e//!!!!!!!! use "C" for Microsoft visual C++ compiler: ?& |# k$ y5 N+ B6 o. d/ T
//!!!!!!!! use "C" for Microsoft visual C++ compiler, \1 W. s, t3 M% ~
__declspec(dllexport)int WINAPI MYMACLOSE(CALCINFO* pData)
2 W P s8 u, ], [& {- M1 h{
& ]/ t; C: A' zif( // pData->m_pfParam1 && //参数1有效
: a! D! n) S1 [% N//pData->m_nParam1Start<0 && //参数1为常数
6 g, |) z$ \, E5 e8 h//pData->m_pfParam2==NULL ) //仅有一个参数
; J M0 {$ r( H) v//pData->m_pfParam1 && pData->m_pfParam2 &&pData->m_pfParam3 && pData->m_pfParam4
- l- \1 `2 X# d$ u3 ~% g/ T+ S//&& pData->m_pfParam5 && pData->m_pfParam6 &&pData->m_nParam1Start>=0 &&
# i% z* N. r* V7 r( A" q. }# J//pData->m_pfParam7==NULL)
3 [1 N5 K( J" ~, `( s//pData->m_pfParam1 && pData->m_pfParam2 &&pData->m_pfParam3 && pData->m_nParam1Start>=0 &&
' }3 F% Q4 R- ypData->m_pCalcParam[0].m_nParamStart>=0&& pData->m_pCalcParam[1].m_nParamStart>=0/ g3 w7 A. O9 P! G! \
&&pData->m_pCalcParam[2].m_nParamStart>=0)
1 w' w; ]$ C* Y( H8 U{
4 K# _1 @4 B# o2 G. FfloatfParam = *pData->m_pfParam4; //pointer ,pData->m_pCalcParam[3].m_nParamStart >= 0
) d0 }7 ]& j) {9 `* tintnPeriod = (int)fParam; //参数1
$ l! y/ k' G, l8 a0 ^" ?//const float* cpParam = pData->m_pfParam2; // cpParam = pointer to . r F @; g! i6 e
constfloat* cpParam2 =pData->m_pCalcParam[1].m_pfParam; // cpParam =pointer to + c8 }+ _0 U+ I4 V/ }; |
constfloat* cpParam3 =pData->m_pCalcParam[2].m_pfParam; // cpParam =pointer to
) a5 [8 y% S' i6 ^. M2 hconstfloat* cpParam4 =pData->m_pCalcParam[3].m_pfParam; // cpParam =pointer to
) R2 u+ n j q6 q3 R//const float* cpParam5 =pData->m_pCalcParam[4].m_pfParam; //cpParam = pointer to - Q5 W5 s; T E* z* Z+ [- [
//in foxtraderoooq:"MYFUNC2010@MYMACLOSE"(c,c,c,6),colorffffff,linethick5;// cpParam5 =pData->m_pCalcParam[4].m_pfParam ; @1 t* s& l: ^, K7 P
//pData->m_pCalcParam[5].m_fParam); //value
7 ?7 \- H$ T2 w) l' T//const float* pValue1 = pData->m_pCalcParam[0].m_pfParam;- B l2 d" [& S$ ?; E
//const float* pValue2 = pData->m_pCalcParam[1].m_pfParam;' E' o3 H& U: Y9 i% i: V4 ?
//const float* pValue3 = pData->m_pCalcParam[2].m_pfParam;
# A' I7 f: h8 r& h; Z2 g" _! Y//const float* pValue4 = pData->m_pCalcParam[3].m_pfParam;7 b9 F4 e7 H) D) r
//const float* pValue5 = pData->m_pCalcParam[4].m_pfParam;9 {+ ?" f. k( ]
if(nPeriod>0)
4 _) q5 M' z: d9 m, B/ \, P9 Y7 [{
& L3 T" ~$ D) ` k* x! @floatfTotal;- i# g2 {" J- m4 V! C7 u4 d1 w; w
inti, j;
, V2 r, {$ G7 W6 m( _' N7 kintndata = pData->m_nNumData;- f" }( @% e3 H" Z! y
//float yy[5000][1];
7 S$ C# ~% Z* F: vfor( i = nPeriod-1; i < pData->m_nNumData; i++)//计算nPeriod周期的均线,数据从nPeriod-1开始有效
7 M& i( n* [5 V5 N{
9 R( j m( }/ b, EfTotal= 0.0f;7 X/ b) V P- _& n3 d: M
doublelngth=5.0;. _+ s& K& B( r- ?4 ?& T) H$ U9 }
doublectemp=4.0;
* [+ I* Y6 P1 c* [1 \; }//float yy1[5000][1];6 \' ]) J6 H) {
for( j = 0; j < nPeriod; j++ ) //累加! Z& N$ S& X0 G9 E
{8 }$ V9 w3 d4 f. c( l* b& ~, f
fTotal= pData->m_pData.m_fClose; // @@@@@@@ vc++ 2010 cl.exe 使pData->m_pData[i-j].m_fClose错误
5 @+ i6 A+ B6 c6 G}
+ \1 s( M0 c4 c+ G" C//pData->m_pResultBuf = fTotal*1.03; //平均, Z7 {% `* x6 P; j& ]1 b8 d0 b6 G
fTotal= cpParam3;
) j9 R6 e( t% I, O0 tpData->m_pResultBuf= fTotal*1.03; //平均) k' o( v6 z% f6 i! Z$ k6 e
//ctemp = (double) pData->m_pResultBuf; // double & - - - >overload a float value , double * - - - > overload a pointer todouble+ U& |/ B- _3 R6 c
//pData->m_pResultBuf= (float) ppow10(ctemp,lngth); // float &- - - > overload a float value
, E/ p: M3 [5 c2 q' hpData->m_pResultBuf=(float) ppow10( (double) pData->m_pResultBuf,lngth); // float &- - - > overload a float value, (float) = overload5 t/ S5 O# H- O' _% O0 X% `
}
; M( H' G+ V& @ O7 o: k2 JreturnnPeriod-1;6 u+ }1 ?. n+ T8 [ o
}
! F' I* O3 m4 R' I) y F}0 P# M' ?/ L3 m6 t, O9 c7 o7 P
return-1;
, {/ [$ |! D2 _0 P}
- I8 Y; g4 ~; V, i6 i//计算均价,2个参数,参数1为待求均线的数据,参数2表示计算周期 K, _. o& |+ m$ M% q" p) R) x4 X
//调用方法:
- [* c3 Y3 `' r# b//"FOXFUNC@MYMAVAR"(CLOSE-OPEN,5)" `! i0 Q. b2 c5 n% r
__declspec(dllexport)int WINAPI MYMAVAR(CALCINFO* pData)
7 \! H" B/ u) {2 K$ f0 j* S{5 D- J0 ?" S1 Q
if(pData->m_pfParam1&& pData->m_pfParam2 && //参数1,2有效1 V1 L- o6 g! H. n2 B' \
pData->m_nParam1Start>=0&& //参数1为序列数
( t3 J8 S9 }0 W+ [' h- Z: i, OpData->m_pfParam3==NULL)//有2个参数: }* R) Q9 [* W/ \
{4 f/ Z6 t5 X) X# _# {1 A
constfloat* pValue = pData->m_pfParam1; //参数1
! C$ k2 M5 ^, x: ZintnFirst = pData->m_nParam1Start; //有效值起始位
~. ~2 {' A" O+ V/ b5 ofloatfParam = *pData->m_pfParam2; //参数2# Y/ b- a4 U/ l/ F
intnPeriod = (int)fParam;
) p% o6 {! J1 K6 H, K7 Y, I, Yif(nFirst >= 0 && nPeriod > 0 )& k8 s' {; m- t2 v1 u
{1 R8 P; X) P: d6 I, _
floatfTotal;" L, l. `* n9 [. F% B2 t
inti, j;
. b/ l& A0 n0 Y( Bfor( i = nFirst+nPeriod-1; i < pData->m_nNumData; i++ )
& z3 m3 x% G7 C: x: V/ J& g0 z{
, M" `6 Z' `: U. Q1 sfTotal= 0.0f;
) Q% Q2 G- C% K e% Zfor( j=0; j < nPeriod; j++ ) //累加
0 ^ @5 m) r* n: ifTotal+= pValue[i-j];4 L9 I$ X( E. i7 b
pData->m_pResultBuf= fTotal/nPeriod;//平均3 Z+ ^" j* |1 \% c$ w: r
}% H5 H3 ? w8 N7 ~+ |& Q* b
returnnFirst+nPeriod-1;2 _3 y3 n* c6 j3 k
}
+ [0 f6 o2 w" A2 n" ?; f# h}1 r- x+ g% b* C) q/ s5 }% ]' _
return-1;0 v( P8 m( g1 w. }1 [. F* x( a
}( g0 s2 q: `5 O
//计算多个序列的均值,5个参数,参数1-4为待求多个序列,参数5用于举例说明数值参数的用法,实际在此例中无需该参数
; m }7 _# [. }. ]. ?% K4 I/*
: `; ?& c( _6 J+ {, B2 B调用方法:! Y2 l4 q% M+ {! w# }. E7 m
MA1:=MA(CLOSE,3);
( Z+ ~( K% @/ l' E2 FMA2:=MA(CLOSE,6);
) k" v5 B0 @7 w& C |MA3:=MA(CLOSE,12);
% u. O/ O/ E YMA4:=MA(CLOSE,24);; z) O. n' p( P/ y. Z4 B8 J
MYBBI:"FOXFUNC@MYBBI"(MA1, MA2, MA3, MA4, 4);
$ Y y6 f ?0 B6 q7 S*/
. j+ ?# d* O0 k3 ^# e, H__declspec(dllexport)int WINAPI MYBBI(CALCINFO* pData)
: c) b! ]6 c5 |+ V' ~8 V' U- }0 z2 _{0 S) J- B( r* x8 Y9 Q3 t- w
if( pData->m_pCalcParam[0].m_nParamStart >= 0 &&
3 l8 { F' ^6 i0 p/ ~$ L! IpData->m_pCalcParam[1].m_nParamStart>= 0 &&% M9 O! J0 L( A$ M# J4 D
pData->m_pCalcParam[2].m_nParamStart>= 0 &&
6 w- | e2 l7 c' P1 p1 T+ v( g8 spData->m_pCalcParam[3].m_nParamStart>= 0 ) //4个序列都含有效数值/ M. R! X( y( g& n
{) O2 r) L$ c) V3 |
//计算返回的序列的第一个有效值位置% @9 o* g& C$ N0 V
intnFirst = pData->m_pCalcParam[2].m_nParamStart;//已知返回的序列的第一个有效值位置与第4个序列一致) @% V. V* R" S8 ?
//若不知,则
7 l7 J$ \1 d) x/ O6 Z* ~# h# B X( [( O/*
- U6 |, a3 R1 S0 K" t& h$ gintnFirst = pData->m_pCalcParam[0].m_nParamStart;
! w/ T2 o2 Q- bif( nFirst < pData->m_pCalcParam[1].m_nParamStart )
; P, g3 D4 L& Q: |8 [# i& F. ?nFirst= pData->m_pCalcParam[1].m_nParamStart;: O3 C! V. E. I6 x
if( nFirst < pData->m_pCalcParam[2].m_nParamStart ) ) M- G0 Q& x2 u5 c
nFirst= pData->m_pCalcParam[2].m_nParamStart;& } d( V1 Q) [/ s. i0 H+ \ X
if( nFirst < pData->m_pCalcParam[3].m_nParamStart )
2 {1 Y6 o+ o6 t1 S$ x1 VnFirst= pData->m_pCalcParam[3].m_nParamStart;
/ |" U" O* V8 E2 z7 s; u! M) ~8 y*/
6 ]* _- s1 q: f" P6 Bconstfloat* pValue1 = pData->m_pCalcParam[0].m_pfParam;1 f) t8 B/ p( \8 ^
constfloat* pValue2 = pData->m_pCalcParam[1].m_pfParam;1 `, @: f3 M2 I3 v: h6 g9 K
constfloat* pValue3 = pData->m_pCalcParam[2].m_pfParam;0 ]0 X: X2 ~, O' Y4 Y
constfloat* pValue4 = pData->m_pCalcParam[3].m_pfParam;( {6 z. M# w) q5 m2 U/ b9 _
constfloat* pValue5 = pData->m_pCalcParam[4].m_pfParam;3 W4 N( _1 b* G* N, H( [
constfloat* pValue6 = pData->m_pCalcParam[5].m_pfParam;
6 x! q/ I W4 R+ a7 h//const float* pValue1 = pData->m_pfParam1;
' Z7 O& V) w6 C+ q//const float* pValue2 = pData->m_pfParam2;3 g7 m4 G% e# ^) A" b
//const float* pValue3 = pData->m_pfParam3;. R) z0 P8 u9 p5 A
//int nNum = (int)(*pData->m_pfParam4);//实际上该例中已知nNum=4,在此用于说明数值参数的用法
8 b6 J2 n% t. [+ z$ E+ g' rintnNum = (int)(pData->m_pCalcParam[6].m_fParam);//实际上该例中已知nNum=4,在此用于说明数值参数的用法* h1 ]" N! g; \4 x, Z
for(int i = nFirst; i < pData->m_nNumData; i++ )7 j) v" I$ W; U$ u( ^2 o* F
{
6 e7 h6 W1 X5 Y5 |1 cpData->m_pResultBuf=
0 u u, f4 m2 Q//(pValue1 + pValue2 + pValue3 )/nNum;$ z! ?; b% D0 o8 j
(pValue1+ pValue2 + pValue3 + pValue4+pValue5 + pValue6)/nNum;
5 T& O7 Z" @' s& x9 }" k& z}" O3 z/ J0 H) V
returnnFirst;
6 U3 r- j/ ?6 X. |4 N}
% O9 H; `% R! [# }9 I5 ]6 v' {return-1;: a' F% g# V* f# ~! d {* W
}
5 B+ f. t' |! x
( y/ }! I3 }' T3 d. h: s9 l2 b( D9 H/ O0 S0 T0 ]9 d" y3 s+ B7 x5 L% o8 t q( c
3 a6 Z. |5 `& S5 {% E H
//////////////////////////////////////////////////////////////pow10.asm$ `/ U/ ?7 F) F& y$ j1 ?; k
;*******************************************************: L7 l* y: d J G% f
;* *
b6 x# q! ]% F, ?;* Delphi Run Library *2 D. q z: T0 g/ b
;* *9 K2 @/ W0 e5 H; j9 y; t
;* Copyright (c) 1996,98 Inprise Corporation *# z& i# ~8 G6 v/ I0 ^$ R# p f
;*--------------------------------------------------------------------------
, y, {/ I: z& f$ `;* To compile "tasm32 /ml pow10.asm" *
. c2 ~' J x* `1 R4 o2 h* ~;*--------------------------------------------------------------------------
# {( w l2 C. u3 i;*******************************************************
1 K: M, t' }8 q% P+ t3 V.386
7 K7 T# g0 F" f# N' @9 I) D& a* w;.MODEL flat,c (error must be in segement block must have segment
( D& a$ d/ f& q e5 r6 T$ @;!!!!!11 important if ',c' is not used , must use 'public _ppow10, and'_ppow10 proc'3 [4 {. W0 m+ Y% B3 c5 V
;!!!!!11 important if .MODEL flat,c is not used , must use ;_TEXTSEGMENT WORD PUBLIC4 a* k9 ~4 H5 j6 U8 p
;'CODE'..._TEXT ENDS and must use 'public _ppow10 and '_ppow10 proc', Q# L4 I& w4 x' J) L1 B6 `' H# y
.MODELflat,c ; just use .code, no need for segment,!!!!!11 important if',c' is used , must use 'public ppow10, and 'ppow10 proc'" e5 Z X+ c6 D
;ppow10 PROTO,aVal:PTR REAL8, bVal:PTR REAL8
: O0 z0 w% X& V* x;includeE:\Vsource\masm32\INCLUDE\windows.inc
3 m: R+ s' H: [2 o4 h9 L;includeE:\Vsource\masm32\INCLUDE\user32.inc
1 N! m; e* B+ N# C;includeE:\Vsource\masm32\INCLUDE\kernel32.inc" o1 ] P( f: j; w
PUBLICppow10
: O8 j1 m9 d- T0 ^0 W% O.CODE
% X$ D' {' P# C# `3 v4 D;DllEntryproc hInstance:HINSTANCE, reason:DWORD, reserved1:DWORD* U+ |" U {' E7 Q. E0 L! r0 F! u
;.if reason==DLL_PROCESS_ATTACH
8 b3 c- x$ i4 ^5 G, ^+ s K) B( x9 ^: e: A;invoke MessageBox,NULL,addr LoadMsg,addr AppName,MB_OK5 J# B& D8 y9 r6 M# M; [/ l
;.elseif reason==DLL_PROCESS_DETACH+ i: E) L9 P$ U+ @* a. `
;invoke MessageBox,NULL,addr UnloadMsg,addr AppName,MB_OK
: t! ?5 G& N/ M" q3 }- W$ V$ n;.elseif reason==DLL_THREAD_ATTACH+ H& M4 G/ H" z% v
;invoke MessageBox,NULL,addr ThreadCreated,addr AppName,MB_OK A0 l" i2 v& X8 s0 R6 l
;.else ; DLL_THREAD_DETACH
" ?% ?0 |+ h+ Q7 M2 r, s: h b;invoke MessageBox,NULL,addr ThreadDestroyed,addr AppName,MB_OK
' z- O7 n) R$ G$ a2 Q% ];.endif
% i% e, A" D u. ?;mov eax,TRUE% v: ^; L: L0 C v4 ~1 f' g
;ret4 j0 `+ C, t( b1 \ K
;DllEntryEndp( K( h4 o9 _/ L3 `8 W
;FUNCTION _Ppow10( double val, double pow: ) : Extended;
: r% \0 p' X! U1 p$ ^, X;_TEXTSEGMENT WORD PUBLIC 'CODE'6 i. }$ Z- |$ m" G! l' [0 f
;ppow10 PROC,aVal:PTR REAL8, bVal:PTR REAL8
5 b8 |' B- D9 s;ppow10 PROC,aVal:* Qword, bVal:Qword q4 O g* V$ v
ppow10PROC near
$ p% Z% r6 V0 V7 t) c9 ?, IXUEQU 8 ; for eip & ebp 2 D" C1 O7 m" D3 J! Q; j7 o* o& K
XDEQU 0 ; for edi, esi, ebx, ecx, edx
) H& T, r2 j9 Y: f& |; C% mfp_powerEQU QWORD PTR [ebp+XU+8]2 G2 O2 i2 Y. ]7 C
fp_valEQU QWORD PTR [ebp+XU]
! }1 U- K* R; }2 W& q. k. q' cvalEQU QWORD PTR [eBP-XD-8] ; USE STACK- ^- v! L5 E+ g. S p# p
powerEQU QWORD PTR [eBP-XD-16] ; USE STACK
1 e7 v/ \- a! e0 \" d0 ]: \ k3 Zpow10EQU QWORD PTR [eBP-XD-24] ; USE STACK3 E3 k% u+ O% D1 a8 P3 k; L# H4 m
FPower10:
, ]2 ]4 E# y1 M/ y6 Tpushebp: ~9 g* |6 c; J
movebp,esp+ A* E" t" R8 x
;push edi
* c) B+ P# p, _) } W+ w. s;push esi8 E/ f, O& Z9 Z
;push eax
5 \: A, D1 ^6 a7 M# W( X" G;push edx$ w8 H& e! I* ?( T
subesp,24
6 T2 s& |2 h J3 Y9 F- SFINIT
' o) L+ G' x$ Y5 wfldz
6 g& Q" R; Y) _( {3 a5 h. T5 Q6 pfstval D3 V. O. T; k
fstpower6 M. V3 d: I% v, \) `
fstppow10: g6 R. \' ?1 q" Z9 Y/ s; S
MOV EAX,8 MOV EDX,8; fldpi
6 q6 V8 k& ^. z! E9 h4 S/ y; J+ V* d fld fp_val ;st(0)=val; fld aVal;st(0)=val
/ V6 B2 W$ d2 q: yfstval
) ~& C4 Z9 k8 ?/ s;fld Arg2 ;st(0)=power
0 e" B! l) a! `9 r;fstp power' X" k3 O. m7 w1 k4 o
;fld val ;st(0)=val0 O2 P- p5 Z; L$ L. h/ l+ ]
;fmul val ;st(0)=val*val2 \* |2 w/ Y+ C# h0 l9 p' C% x; z
;fmul val ;st(0)=val*va*val& i& H; z5 y$ k, }0 S
;fadd st,st(0)9 M4 B5 D1 F# s5 e* c0 w& r
;fmul qword ptr [ebp+16] ;st(0)=power C8 q4 ?$ z0 X Q. a
;fadd st,st(0)
p8 r& i* `8 r9 f2 ~+ [$ [; m F;fwait
% w+ }& i; i% V7 M& O# Zaddesp,24
5 C; X4 @6 b' U6 K* W2 z;pop edx/ f$ a% E# z* U
;pop eax
* I/ p |+ I) A% |3 l;pop esi
! h; M7 Y, b( }" p;pop edi& N! n5 W9 e8 I9 C
movesp,ebp' y& f2 W9 d$ L$ C( k' _# i2 B
popebp
* e1 M. Q4 n& G$ ~;leave ; @@@@@@ important don't use leave in vc++ 2010! s! V5 P( U2 F. v' @5 Q
RET;return value = st(0)
: ]( m) X& D/ v; y, ippow10ENDP
- J5 c6 F: A- y; [% o;_TEXTENDS8 I- q5 V E0 m) J& u, v6 v
END
; i) O; [# b% ?7 y( ]7 _;END DllEntry |