[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

My experience with a DLL



PureBytes Links

Trading Reference Links


I finally took the time to master the PowerBasic 16 bit DLL compiler and
I generated a test DLL for TS 4.0.  I coded the Tillson T3 moving
average in the DLL and compared it with T3 written in EL.  Calculation
time for 30 years of daily SP500 close was 3.5 seconds for EL vs. 0.7
seconds for the DLL.  Improvement should be even more after subtracting
TS's overhead to load the price data.  The chart of both methods
overlayed perfectly to confirm the DLL implementation.  I used double
precision float variables in the DLL for intermediate results because
that is what I will use for future, more complex and accuracy critical
applications.  DLL file size was only 4.6K and far less than that will
subtract from TS's 64K program limit.

But, there was a problem that I had to work around and would like to
resolve.  I had no problem passing floats from TS to the DLL, but could
not pass a float from the DLL function back to TS.  I could however pass
an INT or a LONG to TS.  I settled on a LONG which gave more than
adequate resolution because in the DLL I multiply the final float result
by 1000 before converting to LONG, and then after TS converts this back
to float, I divide by 1000.  The factor could have just as well been
10000 because of the high dynamic range of a 32 bit signed integer.
This has no bearing on numerical accuracy where it counts - in the DLL,
where filters, FFT's, etc. will be done.  It only involves the last
transfer to TS where only conditional testing for buy - sell, plotting,
etc. will be done.

BUT, I still want to use either the FLOAT or LPFLOAT transfer to TS in
DefineDLLFunc: or understand why they don't work.  So, here are
questions:

1)   I assume I can use FLOAT or LPFLOAT without needing to activate
TS_KIT.DLL.  Is this correct?

2)   I programmed my DLL function to output a 32 bit pointer for the
address where its floating point result was.  LPFLOAT didn't work.  In
fact, LPLONG and LPINT didn't work either when I programmed my function
to output a 32 bit pointer for address of a LONG and then an INT result
respectively.  So, what is TS's LPxxx looking for?

3)   PBDLL will output C convention, Pascal convention and also some
other ways specific to VisualBasic.  It can also output a float for the
floating point processor stack.  I tried all of these to no avail.

I know that many of you are wizards at C++ version 1.52.  I am a very
proficient BASIC programmer, write utilities, test programs, and do a
lot of embedded DSP and control processor assembly as well, but I never
got around to mastering C.  So I ask that you please explain in terms of
memory, register and stack mapping rather than in C terminology.  I have
read a dozen documents (from Omega, Hashnums, Global-Pro, etc.) on
interfacing DLL's to TS, plus everything about DLL's on the "Omega List"
for the last two years, but still can't figure the parameter passing
rules for TS's DefineDLLFunc:.  Everything is explained as "how to use"
C++ version 1.5x.

Lastly, the PowerBasic 16 bit compiler is proving to be an excellent
accessory to TS4.  It is damn fast, generates lean code, and has all the
amenities of a structured high level language:  Functions, subroutines,
huge multi-dimensional arrays, global and local variables, array
sorting, etc.  And, program and data size is unlimited.  I will be
moving math stuff and some conditional testing into DLL's from now on.