Archive for October, 2011

Documenting the Greek Engine – OmniGraffle Pro

Monday, October 31st, 2011

I have started the documentation of some of the parts of my Greek Engine, starting with our use of redis as a cache service. This documentation is written for our QA Testers, but it ultimately needs to be translated to non-technical speak for the operations and testers folks that will come along later in the lifecycle of the project. As an additional visual aid, I started with just about the only thing I had that would make Visio-like drawings: ZeusDraw. It's OK, and I've certainly done plenty in it, but it's not the same as a real layout program like Visio on Windows, or even OmniGraffle from OmniGroup.

Still… at $200 for the Pro version - that which can read/write Visio files, it's a lot for something that I don't need all that often. Still… it's a sweet looking application. Something I would really like to have, but it's hard justifying the cost for this one project.

So I finished the first version of the block diagram of the Workspace and data feeds and realized that I needed to spend the money if I really wanted to make these look nice, and useful. So it looks like I'm going to do these over in OmniGraffle Pro as soon as we load up my PayPal account with enough money to cover the $200 the app costs from the Mac App Store.

Creating a Trade Message Accumulator (cont.)

Friday, October 28th, 2011

High-Tech Greek Engine

Today I finished up the trade message accumulator component for the Greek Engine and put it into play on the feeds from the exchanges. It's something that's been needed, and I'm hoping it's going to be able to accurately track the volume on each exchange for each instrument, but I'm not really certain that the volume numbers are all that reliable. I've seen a lot of pretty wild data from the exchanges, and I know that the prices are far more important than the sizes, and I've seen enough problems in the prices to suspect that the volumes may be accurately tracked and accumulated, but they probably aren't going to yield a really superior data stream.

It should be a lot closer, but I'm not willing to bet anything on these numbers - at least not yet.

Creating a Trade Message Accumulator

Thursday, October 27th, 2011

bug.gif

I've run into a problem with my Ticker Plant feeds, and the best solution to the problem is to create a component that can fit in-line with the feeds and "promote" and "embellish" the trade messages (prints) with the current volume traded as well as per-exchange volumes traded. The issue is that if I allow these trade messages to conflate, information about the individual trade will be lost. Sure, the most recent data will survive, but the volume change represented by the conflated trade will be gone forever.

What I needed was a very simple, very lightweight, component that would take the stream of trades and aggregate the volumes - as well as the high, low, open values, and then "attach" those values to a new trade message - one that is a subclass of the original, and so can take it's place in all the processing, but also includes this cumulative volume and limit values.

Today has been spent creating this and fixing issues associated with it. There's a lot of little things to write including the serialization and deserialization of the component, and the handling of this new message type, as well as automated tests to make sure I'm accumulating things properly. It's close, and I just need to write a few more tests, but for now they day is over and I need a break.

MarsEdit 3.3.5 is Out

Wednesday, October 26th, 2011

MarsEdit 3

Daniel released MarsEdit 3.3.5 with some nice support for right-to-left languages. Pretty nice internationalization, actually. I'm not sure I'm interested in doing that level of work, but I'm sure glad someone is. MarsEdit is a wonderful program and I use it every day that I'm not overloaded. It's something that's really enabled high quality postings on my journal. Very nice work.

Google Chrome dev 16.0.912.12 is Out

Wednesday, October 26th, 2011

Google Chrome

This morning Google Chrome dev 16.0.912.12 was released and I picked it up. When I went to the release notes site, I saw that Google Chrome 15.0.874.102 was released to stable which just blows me away. That means that stable and beta are both 15.x.x.x and dev is on 16.x.x.x - that's not going to stay that way for long. I'm guessing dev is jumping to 17.x.x.x pretty soon. Additionally, there were no release notes for 16.0.912.12 at the time the code was available. So maybe it's coming sooner than later.

Always interesting times.

[10/28] UPDATE: don't blink - they just released 16.0.912.15 with typically sparse release notes. That's less than a day after the last release. Yup… it's about to jump to 17.* soon…

Creating a Solid, Reliable C++ Wrapper for hiredis Library

Tuesday, October 25th, 2011

Redis Database

Most of today has been spent trying to get my simple C++ wrapper around the hiredis C library for redis working in a way that allows for a significantly more robust usage pattern than I originally had. Specifically, all was fine until I shut off the redis server, and then my client would try to recover and reconnect and end up dumping core. The problems are only made worse by the fact that I really had no support docs on the hiredis site - only the source code, which is optimistic in the extreme. No argument checks, etc. make it ripe for a problem if it's not used exactly right.

Clearly, I wasn't using it exactly right, and those misusage patterns were what was causing the code dumps. So the first thing was to track down what I was doing wrong, and that meant that I really needed to become much more familiar with the hiredis source code. To be fair, it's a decent open source library, but it's missing so much that would have added so little to the runtime load and would have made it far more robust to the kinds of misusage patterns I had in place. After all, my code worked, so it's not that it was totally wrong, it's just that when things started to go badly, the things that you needed to do become far more important than when things are going well.

For example, if I wanted to send multiple commands to the redis server at once, you can run several redisAppendCommand() calls, but each really needs to be checked for it's return value. This isn't clear in the code, but it's very important in the actual system. Then there's the calls to redisGetReply() - typically one for each call to redisAppendCommand() - but not always. Again, you need to check for the critical REDIS_ERR_IO error that indicates that the redis context (connection object) is now so far gone that it has to be abandoned.

Then there's the reconnection logic. It's not horrible, but you have to be careful that you don't pass in any NULLs. There simply is no checking on the hiredis code to ensure that NULL arguments are skipped. It's simple to do, but it's not there - not at all.

In the end, I got something working, but it was hours of code dissection and gdb work to figure out what was going wrong and what needed to be done to handle the disconnected server and then the proper reconnection. Not fun, and several times I was wondering if it just wouldn't be easier to write my own as it's all TCP/telnet based anyway… but I kept going and in the end I have something that's reliable and solid. But it was nasty to get here.

Rounding Can Really Be a Pain in the Rump

Tuesday, October 25th, 2011

bug.gif

This morning I had a funny little bug in the Greek Engine that was really a hold-over from my Ticker Plants, regarding the creation of the security ID - the 128-bit version of the complete instrument description for use in maps, keys, etc. The problem was that the exchange codecs were correct in their work, it was the creation of the security ID that was at fault, and I needed to dig there to find the solution.

Basically, I pack the components of the instrument definition into a 128-bit unsigned integer, and to so this efficiently, I need to have a pointer that points to where the next component needs to be "dropped in". When I got to the strike, which was passed in as a double, I had the code:

  // finally, slam down the strike
  *((uint32_t *)ptr) = htonl((uint32_t)(aStrike * 1000));
  // swap the network order bytes to host order
  byteSwap();

and because of the (aStrike * 1000), I was getting 64.099 when I should have been getting 64.10, among other rounding errors. What I needed to do was pretty simple, but essential to get the right answer:

  // finally, slam down the strike
  *((uint32_t *)ptr) = htonl((uint32_t)(aStrike * 1000.0 + 0.5));
  // swap the network order bytes to host order
  byteSwap();

and with that, we got the right numbers. We even got the right thousandths place in the case of 8.125, for example. I'm sure there was partly the need to cast the 1000 into a double, but the additional movement by a half was the thing that brought it home.

Now we're OK.

Dropping Join/Part Messages from Colloquy and Adium

Monday, October 24th, 2011

Colloquy.jpg

One of the things that I haven't liked about Colloquy and Adium is that for the sake of accuracy, they have all the join/part and connect/disconnect messages. The problem is that on busy IRC channels, or even some days when my friends on Adium are in and out, those messages are the vast majority of the messages I see in the window. That's not the ideal situation for me, so I was looking for a way to clean those messages out.

Unfortunately, there is no option on either app to remove these messages. Luckily, I found this in a conversation in the Colloquy chat room. It's how to change the CSS for the join/part messages so that they don't show. Neat idea! You just have to Option-Click on the Apperance button in Preferences and it'll pull it up in an editor, and you can add:

  .event {
    display: none;
  }

and then a quick /reload style in Colloquy and the join/part messages are gone!

Adium.jpg

With this, I decided that it might be worth trying it on Adium as well. After all, I know from my own hacking on the Adium themes that they are CSS and HTML driven as well. In Adium, you need to get to the theme in question and then add:

  .status {
    display: none;
  }

to that file, and restart Adium and you're done!

These two changes are great! They allow me to keep more of the conversation in the window without scrolling. What a wonderful change!

Getting C++ Constructors Right is Vitally Important

Monday, October 24th, 2011

bug.gif

I ran into a problem that completely reinforces my belief that coding standards are a very good thing. And I was the culprit here - but only because I missed it, not by choice. What I had was a constructor for a Dividends set - basically dates and values in a table that needs to be treated as a single unit. The copy constructor for the instance looked like this:

  Dividends::Dividends( const Dividends & anOther )
  {
    // let the '=' operator do all the heavy lifting
    this->operator=((Dividends &)anOther);
  }

and the operator=() method looked like this:

  Dividends & Dividends::operator=( Dividends & anOther )
  {
    if (this != & anOther) {
      boost::detail::spinlock::scoped_lock   lock(mDivsMutex);
      mSetName = anOther.mSetName;
      mSecurityKey = anOther.mSecurityKey;
      mDivs = anOther.mDivs;
      mUpdateTimestamp = anOther.mUpdateTimestamp;
    }
    return *this;
  }

Now the trick here is to realize that the Boost spin lock is really just an atomic integer that they wrap with CAS operations. It's good, but it really needs to be initialized properly or it's not going to function well. What I'm doing in the copy constructor isn't wrong in the sense that it's logic is wrong, but the implementation is horrible.

When I saw this, it was clear to me what the bug was: the spin lock wasn't initialized properly, and the use of it in the operator=() method was locking the thread. Bad news. The solution was simple:

  Dividends::Dividends( const Dividends & anOther ) :
      mSetName(anOther.mSetName),
      mSecurityKey(anOther.mSecurityKey),
      mDivs(anOther.mDivs),
      mDivsMutex(),
      mUpdateTimestamp(anOther.mUpdateTimestamp)
  {
    // the initialized values do everything I need
  }

and the advantages are clear: since we're constructing a new instance, locking the new instance isn't necessary - no one knows it's there. Also, we properly initialize the mutex, and that's everything in this problem.

Standards. Get them. Live with them.

Breaking Out Fundamental Data for Greek Engine

Monday, October 24th, 2011

High-Tech Greek Engine

This morning we realized that some of the fundamental data we are using in the Greek Engine is not fixed for each security, but in fact, is dependent on the prime broker for that trade. This means that we needed to take that piece of data out of the security definitions table, and make it a separate data table, with set names, and all that noise, so that we could define the right rate in the profiles.

It's a complicated way of saying we took what we believed to be a dependent variable in the Greek Engine and made it independent. The upshot of that is that we needed to be able to handle data source updates as well, and that means threading this new independent variable's updating scheme through out the code. Not horrible, but it takes time to do it right and update all the classes where the control logic needs to flow.

In the end, I wanted to get this done before lunch, and I just made it. Nicely done, as the last time I did this it took me all day.