Jump to content

Weird DllStructCreate problem need help


Recommended Posts

Ok, so I have been going at this for hours, and I finally had a break through, well sort of. I hardly know anything about dlls, so it might be my error I just don't know.

Here's the situation I have a valid open source .net program working and I am trying to recreate it in auto it. So I know what the correct output should be to compare it to.

Heres what it should be outputting:

OHLC: reqId=2 time=4/17/2007 4:00:00 AM open=473.91 high=476.38 low=471.6 close=472.8 volume=1621659

OHLC: reqId=2 time=4/18/2007 4:00:00 AM open=471.26 high=479.89 low=469.57 close=476.01 volume=2756627

Message: reqId=2 code=10 description=End of historical data now is 21:00:40.7031250

Here is what I am getting:

OHLC : reqId=0x00000002 time=2007/04/19 04:00:00 open=0 high=4.66726165096798e-062 low =-4.95295507965927e-136 close=9.45874673648795e-013 volume=15193829061689344

OHLC : reqId=0x00000002 time=2007/04/18 04:00:00 open=9223372036854775807 high=3.94265078188669e+234 low =-2.10648611329792e-037 close=-1.7835458927581e+259 volume=11839622812270592

Message: reqId=0x00000002 code=10 description=End of historical data Time is 9:09:07 PM

Interesting Part

Then when I change the OpenPrice to a float instead of a double it almost works except for the shift of the numbers, and the Volume:

OHLC : reqId=0x00000002 time=2007/04/19 04:00:00 open=0 high=474.48 low =481.95 close=469.59volume=15193829061689344

OHLC : reqId=0x00000002 time=2007/04/18 04:00:00 open=0 high=471.26 low =479.89 close=469.57 volume=11839622812270592

Message: reqId=0x00000002 code=10 description=End of historical data Time is 8:53:42 PM

Here is the pertinant code:

Global Const $StructDef_OTFEEDMSG_HIST_OHLC = "int  Timestamp; int64  Volume; double OpenPrice; double HighPrice; double LowPrice; double ClosePrice"

case $OTFEED_HIST_OHLC
        $struct= DllStructCreate($StructDef_OTFEEDMSG_HIST_OHLC, $lParam)
        $Timestamp=DllStructGetData($struct, "Timestamp")
        $Volume=DllStructGetData($struct, "Volume")
        $Open=DllStructGetData($struct, "OpenPrice")
        $High=DllStructGetData($struct, "HighPrice")
        $Low=DllStructGetData($struct, "LowPrice")
        $Close=DllStructGetData($struct, "ClosePrice")
        $sNewDate = _DateAdd( 's', $Timestamp, "1970/01/01 00:00:00")
        ConsoleWrite("OHLC : reqId="&$wParam&" time="&$sNewDate&" open="&$Open&" high="&$High&" low ="&$Low&" close="&$Close&" volume="&$Volume)

Func RequestHistData($exchange, $symbol, $begdate, $enddate)
  Local $aResult
  $iDateCalcbeg = _DateDiff( 's',"1970/01/01 00:00:00", $begdate&" 14:00:00")
  $iDateCalcend = _DateDiff( 's',"1970/01/01 00:00:00", $enddate&" 14:00:00")
  $aResult = DllCall($hDLL, "int", "RequestHistData", "str", $exchange, "str", $symbol, "int", $iDateCalcbeg, "int", $iDateCalcend, "int", 5, "int", 1)
  Writeln("RequestHistData returned: " & $aResult[0])
EndFunc

Here is the dll code

OTFEED_HIST_OHLC
    wParam = (int)RequestId;
    lParam = (LPARAM)(OTFEEDMSG_HIST_OHLC*);

        typedef struct  _OTFEEDMSG_HIST_OHLC
        {
            int  Timestamp;
            __int64  Volume;
            double OpenPrice;
            double HighPrice;
            double LowPrice;
            double ClosePrice;
        } OTFEEDMSG_HIST_OHLC;

Anyone have any ideas to what is wrong?

Any info is greatly appreciated, if anyone is interested in helping me debug this, I would gladly send all of the code

Edited by testmeout
Link to comment
Share on other sites

Ok so playing with it more I know have all the numbers working, but I have no clue why or how, if someone could explain I would greatly appreciate it.

Here is my patch

Global Const $StructDef_OTFEEDMSG_HIST_OHLC = "int Timestamp;float test;int64 Volume;double OpenPrice;double HighPrice;double LowPrice;double ClosePrice"

I just added the float test ; which has nothing to do with the dll and here is the output:

OHLC : reqId=0x00000002 time=2007/04/19 04:00:00 open=474.48 high=481.95 low =469.59 close=471.69 volume=3537589

OHLC : reqId=0x00000002 time=2007/04/18 04:00:00 open=471.26 high=479.89 low =469.57 close=476.01 volume=2756627

Message: reqId=0x00000002 code=10 description=End of historical data Time is 10:15:01 PM

It also works as int or anything else just needed a placeholder I guess

So yea! it works but I don't know why

Link to comment
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
 Share

  • Recently Browsing   0 members

    • No registered users viewing this page.
×
×
  • Create New...