Michael. I think you missed the difference between the Points() and the CooOrds() arrays. Points was meant to hold real world x,y,z and CoOrds the screen points. You are scaling the the Points() array when you load it and using the PointsToScreen Sub, which is just a one to one copy, and so are losing your real world valuues. The D2D.PointsToScreen does work but the X,Y parameters to it are the integer Screen max and min values, not the real world ones. It scales the real world values in Points to Screen values in CoOrds leaving Points unscaled so you can do real world calculations using those Points() values.
You should call D2DPointsToScreen at about line 107 in Stock.bas instead of doing the scaling of Points() there and Sub PlotPoints, and any other screen plotting, should use CoOrds().
EDIT :- Line 134 in Klaus' modified version