Daniel Ross V1
Wow, good work Jahlen you have really put up a nice challenge. I am going to call this "My one and only version cause my head hurts".
CREATE ASSEMBLY [SqlClassLibrary]
AUTHORIZATION [dbo]
FROM 0x4D5A90000300000004000000FFFF0000B800000000000000400000000000000000000000000000000000000000000000000000000000000000000000800000000E1FBA0E00B409CD21B8014CCD21546869732070726F6772616D2063616E6E6F742062652072756E20696E20444F53206D6F64652E0D0D0A2400000000000000504500004C010400B108724C0000000000000000E00002210B01080000320000000E0000000000004E51000000200000006000000000400000200000000200000400000000000000040000000000000000C000000004000000000000020040850000100000100000000010000010000000000000100000000000000000000000F45000005700000000800000C00800000000000000000000000000000000000000A000000C000000006000001C0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000200000080000000000000000000000082000004800000000000000000000002E7465787400000054310000002000000032000000040000000000000000000000000000200000602E736461746100007C000000006000000002000000360000000000000000000000000000400000C02E72737263000000C008000000800000000A000000380000000000000000000000000000400000402E72656C6F6300000C00000000A00000000200000042000000000000000000000000000040000042000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000030510000000000004800000002000500FC3B0000F814000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002602280100000A00002A00001B300F00DA0400000100001100730200000A1305730200000A1307730200000A1304730200000A1306730300000A0D730400000A130D730400000A130C0F00FE16020000016F0500000A13130F01FE16020000016F0500000A1311096F0600000A7201000070730700000A6F0800000A00096F0600000A7211000070730700000A6F0800000A00096F0600000A7229000070730700000A6F0800000A00096F0600000A7243000070730700000A6F0800000A00096F0600000A7263000070730700000A6F0800000A00096F0600000A727F000070730700000A6F0800000A00096F0600000A72A1000070730700000A6F0800000A00096F0600000A72C7000070730700000A6F0800000A00096F0600000A72F3000070730700000A6F0800000A00096F0600000A721B010070730700000A6F0800000A00730900000A130E00730A00000A13140011141B8D0D00000113161116167249010070A2001116171113A2001116187259010070A2001116191111A20011161A726F010070A2001116280B00000A6F0C00000A0011146F0D00000A00110E11146F0E00000A00110E72A30100706F0F00000A00110E6F1000000A6F0500000A1313110E72CB0100706F0F00000A00110E6F1100000A6F1200000A1311110E72ED0100706F0F00000A00110E6F1300000A26110E72310200706F0F00000A00110E6F1400000A130F38D0010000110F166F1500000A6F0500000A281600000A1308110F176F1500000A6F0500000A1312110F186F1500000A6F0500000A281600000A130A110F196F1500000A6F0500000A281600000A1309110F1A6F1500000A6F0500000A1310110F1B6F1500000A6F0500000A281700000A0C110F1C6F1500000A6F0500000A281600000A130B0011121317001117725003007016281800000A1640970000000011081112110A1109111008110B730C0000060A1110725403007016281800000A163337120506120D1206110A110B0811092809000006001200071205120712061204120D120C1109110B110A1110081108092806000006002B3600120506120C1204110A110B0811092808000006001200071205120712061204120D120C1109110B110A11100811080928050000060000389D000000001117725803007016281800000A163324001200071205120712061204120D120C1109110B110A1110081108092804000006002B68001117725C03007016281800000A163324001200071205120712061204120D120C1109110B110A1110081108092803000006002B33001117726003007016281800000A163322001200071205120712061204120D120C1109110B110A1110081108092803000006000000110F6F1900000A3A24FEFFFF110F6F1A00000A00001114731B00000A13150011156F1C00000A16166F1D00000A2611156F1C00000A17176F1D00000A2611156F1C00000A18186F1D00000A2611156F1C00000A19196F1D00000A2611156F1C00000A1A1A6F1D00000A2611156F1C00000A1B1B6F1D00000A2611156F1C00000A1C1C6F1D00000A2611156F1C00000A1D1D6F1D00000A2611156F1C00000A1E1E6F1D00000A2611156F1C00000A1F091F096F1D00000A26111572640300706F1E00000A001115096F1F00000A6F2000000A6F2100000A001115096F2200000A0011146F2300000A0000DE0E11152C0811156F2400000A0000DC11146F2500000A0000DE0E11142C0811146F2400000A0000DC002A00004130000002000000E5030000CC000000B10400000E00000000000001020000003B0100008F030000CA0400000E00000000000001133004006D07000002000011000204500E0A8C150000016F2600000A7404000002730D0000065105500E088C150000016F2600000A7403000002730B00000610010E0B725403007016281800000A16408603000002507B0F000004037B01000004282700000A1640450100000E06730400000A510E060E04500E088C150000016F2600000A7404000001510E09037B05000004408A00000003037B020000047D0100000403037B060000047D05000004030E0650186F2800000A282900000A7D02000004030E0650186F2A00000A282B00000A7D06000004030F0E0E0D0E0828070000060005500E088C15000001036F2C00000A000E065002507B0F0000048C050000016F2D00000A000E04500E088C150000010E06506F2C00000A0038890000000002500A06067B0C000004160E09DAD67D0C00000404500E0A8C1500000102506F2C00000A00030B07077B05000004160E09DAD67D0500000405500E088C15000001036F2C00000A00030F0E0E0D0E082807000006000E065002507B0F0000048C05000001037B050000048C150000016F2E00000A000E04500E088C150000010E06506F2C00000A0000382302000002507B0F000004037B02000004282700000A16402F0100000E06730400000A510E060E04500E088C150000016F2600000A7404000001510E09037B060000043372030E0650186F2800000A282900000A7D02000004030E0650186F2A00000A282B00000A7D06000004030F0E0E0D0E0828070000060005500E088C15000001036F2C00000A000E065002507B0F0000048C050000016F2D00000A000E04500E088C150000010E06506F2C00000A00388E00000000030B07077B06000004160E09DAD67D0600000402500A06067B0C000004160E09DAD67D0C000004045002507B0A0000048C1500000102506F2C00000A00030F0E0E0D0E0828070000060005500E088C15000001036F2C00000A000E065002507B0F0000048C05000001037B060000048C150000016F2E00000A000E04500E088C150000010E06506F2C00000A000038DC000000000E06730400000A510E060E04500E088C150000016F2600000A7404000001510E090E065002507B0F0000048C050000016F2F00000A282B00000A332A0E065002507B0F0000048C050000016F2D00000A000E04500E088C150000010E06506F2C00000A002B740002500A06067B0C000004160E09DAD67D0C0000040E065002507B0F0000048C050000010E065002507B0F0000048C050000016F2F00000A282B00000A0E09DA8C150000016F2E00000A00045002507B0A0000048C1500000102506F2C00000A000E04500E088C150000010E06506F2C00000A000000389C0300000002507B0F000004037B03000004282700000A1640570100000E07730400000A510E070E05500E088C150000016F2600000A7404000001510E09037B07000004409C00000003037B040000047D0300000403037B080000047D07000004030E07500E07506F3000000A19DA6F2800000A282900000A7D04000004030E07500E07506F3000000A19DA6F2A00000A282B00000A7D08000004030F0E0E0D0E0828070000060005500E088C15000001036F2C00000A000E075002507B0F0000048C050000016F2D00000A000E05500E088C150000010E07506F2C00000A00388900000000030B07077B07000004160E09DAD67D0700000402500A06067B0C000004160E09DAD67D0C00000404500E0A8C1500000102506F2C00000A00030F0E0E0D0E0828070000060005500E088C15000001036F2C00000A000E075002507B0F0000048C05000001037B070000048C150000016F2E00000A000E05500E088C150000010E07506F2C00000A0000382B02000002507B0F000004037B04000004282700000A16403F0100000E07730400000A510E070E05500E088C150000016F2600000A7404000001510E09037B080000044084000000030E07500E07506F3000000A19DA6F2800000A282900000A7D04000004030E07500E07506F3000000A19DA6F2A00000A282B00000A7D08000004030F0E0E0D0E0828070000060005500E088C15000001036F2C00000A000E075002507B0F0000048C050000016F2D00000A000E05500E088C150000010E07506F2C00000A00388900000000030B07077B08000004160E09DAD67D0800000402500A06067B0C000004160E09DAD67D0C00000404500E0A8C1500000102506F2C00000A00030F0E0E0D0E0828070000060005500E088C15000001036F2C00000A000E075002507B0F0000048C05000001037B080000048C150000016F2E00000A000E05500E088C150000010E07506F2C00000A000038D4000000000E07730400000A510E070E05500E088C150000016F2600000A7404000001510E090E075002507B0F0000048C050000016F2F00000A282B00000A332A0E075002507B0F0000048C050000016F2D00000A000E05500E088C150000010E07506F2C00000A002B6C00025002507B0C0000040E09DA7D0C0000040E075002507B0F0000048C050000010E075002507B0F0000048C050000016F2F00000A282B00000A0E09DA8C150000016F2E00000A0004500E0A8C1500000102506F2C00000A000E05500E088C150000010E07506F2C00000A00000000002A00000013300400C706000003000011000204500E0A8C150000016F2600000A7404000002730D0000065105500E088C150000016F2600000A7403000002730B00000610010E0B725403007016281800000A16402503000002507B0F000004037B01000004282700000A1640270100000E06730400000A510E060E04500E088C150000016F2600000A74040000015102507B0C000004037B05000004408700000003037B020000047D0100000403037B060000047D05000004030E0650186F2800000A282900000A7D02000004030E0650186F2A00000A282B00000A7D06000004030F0E0E0D0E0828070000060005500E088C15000001036F2C00000A000E065002507B0F0000048C050000016F2D00000A000E04500E088C150000010E06506F2C00000A002B6900030A06067B050000041602507B0C000004DAD67D05000004030F0E0E0D0E0828070000060005500E088C15000001036F2C00000A000E065002507B0F0000048C05000001037B050000048C150000016F2E00000A000E04500E088C150000010E06506F2C00000A000038E001000002507B0F000004037B02000004282700000A16400C0100000E06730400000A510E060E04500E088C150000016F2600000A74040000015102507B0C000004037B06000004336F030E0650186F2800000A282900000A7D02000004030E0650186F2A00000A282B00000A7D06000004030F0E0E0D0E0828070000060005500E088C15000001036F2C00000A000E065002507B0F0000048C050000016F2D00000A000E04500E088C150000010E06506F2C00000A002B6900030A06067B060000041602507B0C000004DAD67D06000004030F0E0E0D0E0828070000060005500E088C15000001036F2C00000A000E065002507B0F0000048C05000001037B060000048C150000016F2E00000A000E04500E088C150000010E06506F2C00000A000038BC000000000E06730400000A510E060E04500E088C150000016F2600000A74040000015102507B0C0000040E065002507B0F0000048C050000016F2F00000A282B00000A332A0E065002507B0F0000048C050000016F2D00000A000E04500E088C150000010E06506F2C00000A002B4F000E065002507B0F0000048C050000010E065002507B0F0000048C050000016F2F00000A282B00000A02507B0C000004DA8C150000016F2E00000A000E04500E088C150000010E06506F2C00000A00000038480300000002507B0F000004037B03000004282700000A1640390100000E07730400000A510E070E05500E088C150000016F2600000A74040000015102507B0C000004037B07000004409900000003037B040000047D0300000403037B080000047D07000004030E07500E07506F3000000A19DA6F2800000A282900000A7D04000004030E07500E07506F3000000A19DA6F2A00000A282B00000A7D08000004030F0E0E0D0E0828070000060005500E088C15000001036F2C00000A000E075002507B0F0000048C050000016F2D00000A000E05500E088C150000010E07506F2C00000A002B6900030A06067B070000041602507B0C000004DAD67D07000004030F0E0E0D0E0828070000060005500E088C15000001036F2C00000A000E075002507B0F0000048C05000001037B070000048C150000016F2E00000A000E05500E088C150000010E07506F2C00000A000038F501000002507B0F000004037B04000004282700000A1640210100000E07730400000A510E070E05500E088C150000016F2600000A74040000015102507B0C000004037B080000044081000000030E07500E07506F3000000A19DA6F2800000A282900000A7D04000004030E07500E07506F3000000A19DA6F2A00000A282B00000A7D08000004030F0E0E0D0E0828070000060005500E088C15000001036F2C00000A000E075002507B0F0000048C050000016F2D00000A000E05500E088C150000010E07506F2C00000A002B6900030A06067B080000041602507B0C000004DAD67D08000004030F0E0E0D0E0828070000060005500E088C15000001036F2C00000A000E075002507B0F0000048C05000001037B080000048C150000016F2E00000A000E05500E088C150000010E07506F2C00000A000038BC000000000E07730400000A510E070E05500E088C150000016F2600000A74040000015102507B0C0000040E075002507B0F0000048C050000016F2F00000A282B00000A332A0E075002507B0F0000048C050000016F2D00000A000E05500E088C150000010E07506F2C00000A002B4F000E075002507B0F0000048C050000010E075002507B0F0000048C050000016F2F00000A282B00000A02507B0C000004DA8C150000016F2E00000A000E05500E088C150000010E07506F2C00000A0000000004500E0A8C150000016F3100000A00002A0013300800BD010000040000110005500E088C150000016F3200000A2D2F7E3300000A7E3300000A7E3300000A7E3300000A16161616730A000006100105500E088C15000001036F3400000A000005500E088C150000016F2600000A7403000002730B0000061001037B010000040C037B020000040D037B030000040A037B040000040B037B050000041306037B060000041307037B070000041304037B080000041305000E0C130800110806282700000A163142060B110413050E0C0A0E091304080906071106110711041105730A000006100105500E088C15000001036F2C00000A00030F0E0E0D0E0828070000060038D000000000110806282700000A16333C11040E09D61304080906071106110711041105730A000006100105500E088C15000001036F2C00000A00030F0E0E0D0E08280700000600388800000000110807282700000A1631390E0C0B0E091305080906071106110711041105730A000006100105500E088C15000001036F2C00000A00030F0E0E0D0E082807000006002B4300110807282700000A16333711050E09D61305080906071106110711041105730A000006100105500E088C15000001036F2C00000A00030F0E0E0D0E0828070000060000002A000000133008000D020000050000110005500E088C150000016F3200000A2D2F7E3300000A7E3300000A7E3300000A7E3300000A16161616730A000006100105500E088C15000001036F3400000A000005500E088C150000016F2600000A7403000002730B0000061001037B010000040C037B020000040D037B030000040A037B040000040B037B050000041306037B060000041307037B070000041304037B080000041305087E3300000A282700000A1633170E0C7E3500000A283600000A0C1203FE15050000012B1B097E3300000A282700000A16330D0E0C7E3500000A283600000A0D00000E0C130800110808282700000A162F51097E3300000A282700000A162E02080D00110613070E0C0C0E091306080906071106110711041105730A000006100105500E088C15000001036F2C00000A00030F0E0E0D0E0828070000060038D000000000110808282700000A16333C11060E09D61306080906071106110711041105730A000006100105500E088C15000001036F2C00000A00030F0E0E0D0E08280700000600388800000000110809282700000A162F390E0C0D0E091307080906071106110711041105730A000006100105500E088C15000001036F2C00000A00030F0E0E0D0E082807000006002B4300110809282700000A16333711070E09D61307080906071106110711041105730A000006100105500E088C15000001036F2C00000A00030F0E0E0D0E0828070000060000002A00000013300300CE000000060000110003506F3700000A0A0616048C150000016F3800000A000617058C150000016F3800000A000618027B030000048C050000016F3800000A000619027B070000048C150000016F3800000A00061A027B010000048C050000016F3800000A00061B027B050000048C150000016F3800000A00061C027B040000048C050000016F3800000A00061D027B080000048C150000016F3800000A00061E027B020000048C050000016F3800000A00061F09027B060000048C150000016F3800000A0003506F1F00000A066F3900000A00002A000013300400ED000000070000110002500E048C15000001036F3400000A0005500E078C150000016F3200000A2D3304730400000A5104500E068C050000010E058C150000016F3A00000A0005500E078C1500000104506F3400000A0038960000000004730400000A510405500E078C150000016F2600000A74040000015104500E068C050000016F3B00000A2C4004500E068C050000016F3C00000A0A0450060450066F2A00000A282B00000A0E05D68C150000016F3D00000A0005500E078C1500000104506F2C00000A002B280004500E068C050000010E058C150000016F3A00000A0005500E078C1500000104506F2C00000A000000002A00000013300400ED000000080000110002500E048C15000001036F3400000A0005500E078C150000016F3200000A2D3304730400000A5104500E068C050000010E058C150000016F3A00000A0005500E078C1500000104506F3400000A0038960000000004730400000A510405500E078C150000016F2600000A74040000015104500E068C050000016F3B00000A2C4004500E068C050000016F3C00000A0A0450060450066F2A00000A282B00000A0E05D68C150000016F3D00000A0005500E078C1500000104506F2C00000A002B280004500E068C050000010E058C150000016F3A00000A0005500E078C1500000104506F2C00000A000000002A0000001330020047000000000000000002280100000A0002037D0100000402047D0200000402057D03000004020E047D04000004020E057D05000004020E067D06000004020E077D07000004020E087D08000004002A00133002006A000000000000000002280100000A0002037B010000047D0100000402037B020000047D0200000402037B030000047D0300000402037B040000047D0400000402037B050000047D0500000402037B060000047D0600000402037B070000047D0700000402037B080000047D08000004002A0000FE0002280100000A0002037D0900000402047D0D00000402057D0A000004020E047D0B000004020E057D0E000004020E077D0C000004020E067D0F000004002A133002005E000000000000000002280100000A0002037B090000047D0900000402037B0D0000047D0D00000402037B0A0000047D0A00000402037B0B0000047D0B00000402037B0E0000047D0E00000402037B0C0000047D0C00000402037B0F0000047D0F000004002A000042534A4201000100000000000C00000076322E302E35303732370000000005006C00000054070000237E0000C00700004C07000023537472696E6773000000000C0F0000840300002355530090120000100000002347554944000000A01200005802000023426C6F620000000000000002000001571502000900000000FA0133001600000100000025000000040000000F0000000D000000630000004B0000000E00000008000000010000000400000000003507010000000000060062005B000E0090007B000600C900B6000600D300B6000600DE005B000E00E6006F000E0095027F020E00A0027F020E00AE027F020E00BC027F020E00D1026F000E00F2026F00060001035B000A00B4038D030A00D4038D030E00F7037F020E002D047F020E005F046F000600A0045B001200CA04B4040600D4045B000E0019056F000E0059053E05060082056F0506009F056F056700B30500000600E205C20506000206C20506003F06200606004D062006060061065B000600890677060600A40677060600BF0677060600D80677060600F106770606000E07770600000000010000000000010001000100000029003A00050001000100010000004A003A00050001000A000100000055003A00050009000C000600B40162000600BC0162000600C50162000600CC0162000600D40166000600DD0166000600E70166000600EF01660006006701660006004D01660006003401660006004101660006002A027F00060037027F0006005F01620050200000000006186900130001005C200000000016009A00170001007825000000001600F0001F000300F42C00000000160075011F001200C8330000000016007C011F002100943500000000160085011F003000B0370000000016008E0143003F008C380000000016009D014E0043008839000000001600AC014E004B00843A000000000618690069005300D83A000000000618690079005B00503B000000000618690082005C00903B00000000061869008E00630000000100A40000000200AC0000000100FC00000002000301000003000A01000004001201000005001A01000006002101000007002701000008002E0100000900340100000A00410100000B004D0100000C00590100000D005F0100000E00670100000F00720100000100FC00000002000301000003000A01000004001201000005001A01000006002101000007002701000008002E0100000900340100000A00410100000B004D0100000C00590100000D005F0100000E00670100000F00720100000100FC00000002000301000003000A01000004001201000005001A01000006002101000007002701000008002E0100000900340100000A00410100000B004D0100000C00590100000D005F0100000E00670100000F00720100000100FC00000002000301000003000A01000004001201000005001A01000006002101000007002701000008002E0100000900340100000A00410100000B004D0100000C00590100000D005F0100000E00670100000F00720100000100960100000200720100000300670100000400340100000100A40100000200FC00000003002E01000004002101000005004D01000006004101000007005F0100000800340100000100A40100000200FC00000003002701000004001A01000005004D01000006004101000007005F0100000800340100000100F80100000200FD01000003000302000004000702000005000C02000006001202000007001902000008001E02000001002402000001003D02000002004502000003004F02000004005802000005006202000006006502000007006F020000010078020900690013001900690013003100690013002100690013000900C80294003100E6029800610069009D005900FD02A20039006900130049006900130069000803A80049000F039D0049002403130039002903AE00390038039D0039004803B4003900560394006900C802940039006603B80039007603BC0041008403C1007100C003C6007100CA03CB007900DE03D1004100EC03D8004100F103130051006900AE0051001A04DC008100FD02E100510046049D0031007104E80091007A04B80051008404ED0051009204F2004900F10313009900AC041300A100AC0413001900840322012900DA0427012100E204C1007100CA032F012100E904C1007100C00335011900F4043A012100FD0440012100F4043A0121008403220121007A04B8001900FD0440011900040551012900100562001900FD023A012900150562002900FD026701310021057001B100F40475019100FD027B012100FD023A01210004055101210028058601210033057501B90069001300C10069001300C90069009401D9006900ED00E10069001300E90069009D00F10069009A01F90069009A01010169009D00090169009D00110169009D00190169009D00210169009D00290169009D002000FB018F012E002302FA012E0003029F012E000B02A8012E001302B1012E001B02D0012E003B0206022E002B0200022E003302FA012E004B0242022E005B022D022E0043022D022E005302FA014000F3018F01F80045014C015601560181018B018B0104800000010000002F0FA86D0000000000002507000002000000000000000000000001000A00000000000800000000000000000000000A0013000000000002000000000000000000000001006F000000000002000000000000000000000001005B00000000000000003C4D6F64756C653E006D73636F726C6962004D6963726F736F66742E56697375616C42617369630053746F72656450726F636564757265730073746F636B4D61726B65745F434C52006F726465725374617465006F726465720053797374656D004F626A656374002E63746F720053797374656D2E446174610053797374656D2E446174612E53716C54797065730053716C537472696E67006F72646572426F6F6B0061536572766572006144617461626173650053797374656D2E436F6C6C656374696F6E7300486173687461626C6500536F727465644C69737400446563696D616C00446174615461626C650063616E63656C4F7264657200616F72646572006153746174650068746F72646572006874737461746500687453656C6C00687442757900736C53656C6C00736C42757900696E744F72646572426F6F6B00696E745175616E7469747900696E744F7264657252656600737472627300646563556E697400696E744576656E7449440064740064656C6574650075706461746541420075706461746541530073656E64726F7700617374617465006164644275790068744F726465720061646473656C6C0064656353656C6C0064656353656C6C3200646563427579006465634275793200696E7453656C6C5100696E7453656C6C513200696E744275795100696E7442757951320053656C6C0053656C6C320042757900427579320053656C6C510053656C6C51320042757951004275795132007374617465007374724576656E7454797065007374724253004576656E744964006576656E7454797065004F72646572526566004F72646572426F6F6B00425300556E69745072696365005175616E7469747900614F726465720053797374656D2E446174612E53716C436C69656E740053716C436F6D6D616E640053716C446174615265616465720053716C436F6E6E656374696F6E0053716C42756C6B436F707900546F537472696E670044617461436F6C756D6E436F6C6C656374696F6E006765745F436F6C756D6E730044617461436F6C756D6E0041646400537472696E6700436F6E636174007365745F436F6E6E656374696F6E537472696E67004F70656E007365745F436F6E6E656374696F6E007365745F436F6D6D616E645465787400457865637574655363616C6172006765745F436F6D6D616E645465787400457865637574654E6F6E51756572790045786563757465526561646572006765745F4974656D004D6963726F736F66742E56697375616C42617369632E436F6D70696C6572536572766963657300436F6E76657273696F6E7300546F496E746567657200546F446563696D616C004F70657261746F727300436F6D70617265537472696E67005265616400436C6F73650053716C42756C6B436F7079436F6C756D6E4D617070696E67436F6C6C656374696F6E006765745F436F6C756D6E4D617070696E67730053716C42756C6B436F7079436F6C756D6E4D617070696E67007365745F44657374696E6174696F6E5461626C654E616D650044617461526F77436F6C6C656374696F6E006765745F526F7773006765745F436F756E74007365745F426174636853697A65005772697465546F5365727665720049446973706F7361626C6500446973706F73650053797374656D2E436F6D706F6E656E744D6F64656C00436F6D706F6E656E7400496E74333200436F6D70617265004765744B6579004765744279496E646578007365745F4974656D0052656D6F766500436F6E7461696E734B6579005A65726F004F6E650044617461526F77004E6577526F7700496E6465784F664B6579005365744279496E646578004D6963726F736F66742E53716C5365727665722E5365727665720053716C50726F6365647572654174747269627574650053797374656D2E446961676E6F73746963730044656275676765724E6F6E55736572436F64654174747269627574650044656275676761626C6541747472696275746500446562756767696E674D6F6465730053797374656D2E52756E74696D652E436F6D70696C6572536572766963657300436F6D70696C6174696F6E52656C61786174696F6E734174747269627574650052756E74696D65436F6D7061746962696C6974794174747269627574650053797374656D2E52756E74696D652E496E7465726F705365727669636573004775696441747472696275746500436F6D56697369626C6541747472696275746500434C53436F6D706C69616E744174747269627574650053797374656D2E5265666C656374696F6E00417373656D626C7954726164656D61726B41747472696275746500417373656D626C79436F7079726967687441747472696275746500417373656D626C7950726F6475637441747472696275746500417373656D626C79436F6D70616E7941747472696275746500417373656D626C794465736372697074696F6E41747472696275746500417373656D626C795469746C654174747269627574650053716C436C6173734C6962726172790053716C436C6173734C6962726172792E646C6C00000000000F4500760065006E0074004900440000174F00720064006500720042006F006F006B00490044000019420065007300740042007500790050007200690063006500001F42006500730074004200750079005100750061006E007400690074007900001B4200650073007400530065006C006C005000720069006300650000214200650073007400530065006C006C005100750061006E00740069007400790000255300650063006F006E006400420065007300740042007500790050007200690063006500002B5300650063006F006E00640042006500730074004200750079005100750061006E00740069007400790000275300650063006F006E0064004200650073007400530065006C006C0050007200690063006500002D5300650063006F006E0064004200650073007400530065006C006C005100750061006E007400690074007900000F5300650072007600650072003D0000153B00440061007400610062006100730065003D0000333B0049006E00740065006700720061007400650064002000530065006300750072006900740079003D0074007200750065000027730065006C006500630074002000400040007300650072007600650072006E0061006D0065000021730065006C006500630074002000640062005F006E0061006D0065002800290000437400720075006E00630061007400650020007400610062006C0065002000640062006F002E004F00720064006500720042006F006F006B005300740061007400650000811D530045004C0045004300540020004500760065006E0074004900440020002C004500760065006E00740054007900700065002C004F0072006400650072005200650066006500720065006E00630065004E0075006D006200650072002C004F00720064006500720042006F006F006B00490044002C00420075007900530065006C006C0049006E00640069006300610074006F00720020002C0055006E00690074005000720069006300650020002C005100750061006E0074006900740079002000460052004F004D002000640062006F002E004F00720064006500720042006F006F006B004500760065006E007400730020006F006200650020006F00720064006500720020006200790020006500760065006E007400490044000003410000035300000344000003450000034300001D4F00720064006500720042006F006F006B0053007400610074006500000000CBA825416AD1E54A817D1625D0FFCAD30008B77A5C561934E08908B03F5F7F11D50A3A03200001070002011109110923000F01101210120C10120D10120D10120D10120D1012111012110808080E11150812190A000401120C10121908081300080110120D121010121110120D0808111508030611150206080F20080111151115111511150808080805200101120C02060E0B200701080E08080E1115080520010112100320000E042000122D042001010E0520010112310500010E1D0E0520010112250320001C0320000804200012210420011C08040001080E05000111150E060003080E0E0203200002042000124106200212450808042000124904200101080520010112192907181210120C11151219120D120D120D120D0808080812111211121D12210E0E0E0E122512291D0E0E0420011C1C070002081115111505000111151C040001081C052002011C1C042001011C0607021210120C040701120C042001021C1007091115111511151115080808081115080002111511151115042000125905200201081C0520010112590407011259042001081C03070108040100000005200101116904200101020801000301000000000801000800000000001E01000100540216577261704E6F6E457863657074696F6E5468726F7773012901002431653830626164392D383062392D346537362D383432312D643632633534303737613763000005010000000005010001000026010021436F7079726967687420C2A9205441464520517565656E736C616E64203230313000001401000F73746F636B4D61726B657420434C5200001401000F5441464520517565656E736C616E640000001C51000000000000000000003E510000002000000000000000000000000000000000000000000000305100000000000000000000000000000000000000005F436F72446C6C4D61696E006D73636F7265652E646C6C0000000000FF25002040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000B108724C0000000002000000600000001C6000001C3600005253445374923EFB6119CA4084490C3E6182E1F701000000433A5C64616E5C76625C73746F636B4D61726B657420434C525C73746F636B4D61726B657420434C525C6F626A5C44656275675C53716C436C6173734C6962726172792E70646200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000030003000000280000800E000000480000801000000060000080000000000000000000000000000002000200000078000080030000009000008000000000000000000000000000000100007F0000A80000800000000000000000000000000000010001000000C00000800000000000000000000000000000010000000000D80000000000000000000000000000000000010000000000E80000000000000000000000000000000000010000000000F800000000000000000000000000000000000100000000000801000088840000E80200000000000000000000708700002801000000000000000000009888000022000000000000000000000018810000700300000000000000000000700334000000560053005F00560045005200530049004F004E005F0049004E0046004F0000000000BD04EFFE0000010000000100A86D2F0F00000100A86D2F0F3F000000000000000400000002000000000000000000000000000000440000000100560061007200460069006C00650049006E0066006F00000000002400040000005400720061006E0073006C006100740069006F006E00000000000000B004D0020000010053007400720069006E006700460069006C00650049006E0066006F000000AC020000010030003000300030003000340062003000000040001000010043006F006D00700061006E0079004E0061006D006500000000005400410046004500200051007500650065006E0073006C0061006E0064000000480010000100460069006C0065004400650073006300720069007000740069006F006E0000000000730074006F0063006B004D00610072006B0065007400200043004C005200000040000F000100460069006C006500560065007200730069006F006E000000000031002E0030002E0033003800380037002E00320038003000370032000000000048001400010049006E007400650072006E0061006C004E0061006D0065000000530071006C0043006C006100730073004C006900620072006100720079002E0064006C006C0000006800210001004C006500670061006C0043006F007000790072006900670068007400000043006F0070007900720069006700680074002000A90020005400410046004500200051007500650065006E0073006C0061006E00640020003200300031003000000000005000140001004F0072006900670069006E0061006C00460069006C0065006E0061006D0065000000530071006C0043006C006100730073004C006900620072006100720079002E0064006C006C000000400010000100500072006F0064007500630074004E0061006D00650000000000730074006F0063006B004D00610072006B0065007400200043004C005200000044000F000100500072006F006400750063007400560065007200730069006F006E00000031002E0030002E0033003800380037002E00320038003000370032000000000048000F00010041007300730065006D0062006C0079002000560065007200730069006F006E00000031002E0030002E0033003800380037002E003200380030003700320000000000280000002000000040000000010004000000000080020000000000000000000000000000000000000000000000008000008000000080800080000000800080008080000080808000C0C0C0000000FF0000FF000000FFFF00FF000000FF00FF00FFFF0000FFFFFF0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007777777777777777777777777777700444444444444444444444444444447004FFFFFFFFFFFFFFFFFFFFFFFFFFF47004FFFFFFFFFFFFFFFFFFFFFFFFFFF47004FFFFFFFFFFFFFFFFFFFFFFFFFFF47004FFFFFFFFFFFFFFFFFFFFFFFFFFF47004FFFFFFFFFFFFFFFFFFFFFFFFFFF47004FFFFFFFFFFFFFFFFFFFFFFFFFFF47004FFFFFFFFFFFFFFFFFFFFFFFFFFF47004FFFFFFFFFFFFFFFFFFFFFFFFFFF47004FFFFFFFFFFFFFFFFFFFFFFFFFFF47004FFFFFFFFFFFFFFFFFFFFFFFFFFF47004FFFFFFFFFFFFFFFFFFFFFFFFFFF47004FFFFFFFFFFFFFFFFFFFFFFFFFFF47004FFFFFFFFFFFFFFFFFFFFFFFFFFF47004FFFFFFFFFFFFFFFFFFFFFFFFFFF47004FFFFFFFFFFFFFFFFFFFFFFFFFFF47004FFFFFFFFFFFFFFFFFFFFFFFFFFF47004FFFFFFFFFFFFFFFFFFFFFFFFFFF47004FFFFFFFFFFFFFFFFFFFFFFFFFFF4700488888888888888888888888888847004444444444444444444444444444470044C4C4C4C4C4C4C4C4C4ECECE49747004CCCCCCCCCCCCCCCCCCCCCCCCCCC40000444444444444444444444444444000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC00000018000000180000001800000018000000180000001800000018000000180000001800000018000000180000001800000018000000180000001800000018000000180000001800000018000000180000001800000018000000180000003C0000007FFFFFFFFFFFFFFFFFFFFFFFF2800000010000000200000000100040000000000C0000000000000000000000000000000000000000000000000008000008000000080800080000000800080008080000080808000C0C0C0000000FF0000FF000000FFFF00FF000000FF00FF00FFFF0000FFFFFF000000000000000000077777777777777744444444444444474FFFFFFFFFFFF8474FFFFFFFFFFFF8474FFFFFFFFFFFF8474FFFFFFFFFFFF8474FFFFFFFFFFFF8474FFFFFFFFFFFF8474FFFFFFFFFFFF8474FFFFFFFFFFFF84748888888888888474CCCCCCCCCCCCC47C4444444444444C000000000000000000000000000000000FFFF000080000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000FFFF0000FFFF00000000010002002020100001000400E8020000020010101000010004002801000003000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005000000C000000503100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
WITH PERMISSION_SET = EXTERNAL_ACCESS
GO
CREATE PROCEDURE [dbo].[orderBook]
@aServer [nvarchar](4000),
@aDatabase [nvarchar](4000)
WITH EXECUTE AS CALLER
AS
EXTERNAL NAME [SqlClassLibrary].[stockMarket_CLR.StoredProcedures].[orderBook]
GO
then use this
DECLARE @dbName AS NVARCHAR(128)
DECLARE @serverName AS NVARCHAR(128)
set @serverName= @@SERVERNAME
set @dbName= DB_NAME()
EXEC dbo.orderbook @servername,@dbName
and here is my code
Imports System
Imports System.Data
Imports System.Data.SqlClient
Imports System.Data.SqlTypes
Imports Microsoft.SqlServer.Server
Partial Public Class StoredProcedures
<Microsoft.SqlServer.Server.SqlProcedure()> _
Public Shared Sub orderBook(ByVal aServer As SqlString, ByVal aDatabase As SqlString)
Dim htOrder As New Hashtable
Dim htState As New Hashtable
Dim htBuy As New Hashtable
Dim htSell As New Hashtable
Dim dt As New DataTable
Dim slSell As New SortedList
Dim slBuy As New SortedList
Dim intEventID, intOrderRef, intOrderBook, intQuantity As Integer
Dim strEventType, strBS As String
Dim decUnit As Decimal
Dim aOrder As order
Dim aState As orderState
Dim strServer, strDatabase As String
strServer = aServer.ToString
strDatabase = aDatabase.ToString
'initiliase the datatable. this dt holds the data for the orderBookState table
dt.Columns.Add(New DataColumn("EventID"))
dt.Columns.Add(New DataColumn("OrderBookID"))
dt.Columns.Add(New DataColumn("BestBuyPrice"))
dt.Columns.Add(New DataColumn("BestBuyQuantity"))
dt.Columns.Add(New DataColumn("BestSellPrice"))
dt.Columns.Add(New DataColumn("BestSellQuantity"))
dt.Columns.Add(New DataColumn("SecondBestBuyPrice"))
dt.Columns.Add(New DataColumn("SecondBestBuyQuantity"))
dt.Columns.Add(New DataColumn("SecondBestSellPrice"))
dt.Columns.Add(New DataColumn("SecondBestSellQuantity"))
Dim sqlComm As New SqlCommand
Dim sqlDR As SqlDataReader
Using sqlconn As New SqlConnection
sqlconn.ConnectionString = "Server=" & strServer & ";Database=" & strDatabase & ";Integrated Security=true"
sqlconn.Open()
sqlComm.Connection = sqlconn
sqlComm.CommandText = "truncate table dbo.OrderBookState"
sqlComm.ExecuteNonQuery()
sqlComm.CommandText = "SELECT EventID ,EventType,OrderReferenceNumber,OrderBookID,BuySellIndicator ," & _
"UnitPrice ,Quantity FROM dbo.OrderBookEvents obe order by eventID"
sqlDR = sqlComm.ExecuteReader
While sqlDR.Read
intEventID = CInt(sqlDR(0).ToString)
strEventType = sqlDR(1).ToString
intOrderRef = CInt(sqlDR(2).ToString)
intOrderBook = CInt(sqlDR(3).ToString)
strBS = sqlDR(4).ToString
decUnit = CDec(sqlDR(5).ToString)
intQuantity = CInt(sqlDR(6).ToString)
Select Case strEventType
Case "A"
aOrder = New order(intEventID, strEventType, intOrderRef, intOrderBook, strBS, decUnit, intQuantity)
If strBS = "S" Then
addsell(htOrder, aOrder, slSell, htSell, intOrderRef, intQuantity, decUnit, intOrderBook)
updateAS(aOrder, aState, htOrder, htState, htSell, htBuy, slSell, slBuy, intOrderBook, intQuantity, intOrderRef, strBS, decUnit, intEventID, dt)
Else
addBuy(htOrder, aOrder, slBuy, htBuy, intOrderRef, intQuantity, decUnit, intOrderBook)
updateAB(aOrder, aState, htOrder, htState, htSell, htBuy, slSell, slBuy, intOrderBook, intQuantity, intOrderRef, strBS, decUnit, intEventID, dt)
End If
Case "D"
delete(aOrder, aState, htOrder, htState, htSell, htBuy, slSell, slBuy, intOrderBook, intQuantity, intOrderRef, strBS, decUnit, intEventID, dt)
Case "E"
cancelOrder(aOrder, aState, htOrder, htState, htSell, htBuy, slSell, slBuy, intOrderBook, intQuantity, intOrderRef, strBS, decUnit, intEventID, dt)
Case "C"
cancelOrder(aOrder, aState, htOrder, htState, htSell, htBuy, slSell, slBuy, intOrderBook, intQuantity, intOrderRef, strBS, decUnit, intEventID, dt)
End Select
End While
sqlDR.Close()
Using copy As New SqlBulkCopy(sqlconn)
copy.ColumnMappings.Add(0, 0)
copy.ColumnMappings.Add(1, 1)
copy.ColumnMappings.Add(2, 2)
copy.ColumnMappings.Add(3, 3)
copy.ColumnMappings.Add(4, 4)
copy.ColumnMappings.Add(5, 5)
copy.ColumnMappings.Add(6, 6)
copy.ColumnMappings.Add(7, 7)
copy.ColumnMappings.Add(8, 8)
copy.ColumnMappings.Add(9, 9)
copy.DestinationTableName = "OrderBookState"
copy.BatchSize = dt.Rows.Count
copy.WriteToServer(dt)
sqlconn.Close()
End Using
sqlconn.Dispose()
End Using
End Sub
Shared Sub cancelOrder(ByRef aorder As order, ByVal aState As orderState, ByRef htorder As Hashtable, ByRef htstate As Hashtable, ByRef htSell As Hashtable, ByRef htBuy As Hashtable, ByRef slSell As SortedList, ByRef slBuy As SortedList, ByVal intOrderBook As Integer, ByVal intQuantity As Integer, ByVal intOrderRef As Integer, ByVal strbs As String, ByVal decUnit As Decimal, ByVal intEventID As Integer, ByVal dt As DataTable)
aorder = New order(CType(htorder.Item(intOrderRef), order))
aState = New orderState(CType(htstate.Item(intOrderBook), orderState))
If strbs = "S" Then
If aorder.decUnit = aState.decSell Then
slSell = New SortedList
slSell = CType(htSell.Item(intOrderBook), SortedList)
If intQuantity = aState.intSellQ Then
aState.decSell = aState.decSell2
aState.intSellQ = aState.intSellQ2
aState.decSell2 = CDec(slSell.GetKey(2))
aState.intSellQ2 = CInt(slSell.GetByIndex(2))
sendrow(aState, dt, intEventID, intOrderBook)
htstate.Item(intOrderBook) = aState
slSell.Remove(aorder.decUnit)
htSell.Item(intOrderBook) = slSell
Else
aorder.intQuantity += -intQuantity
htorder.Item(intOrderRef) = aorder
aState.intSellQ += -intQuantity
htstate.Item(intOrderBook) = aState
sendrow(aState, dt, intEventID, intOrderBook)
slSell.Item(aorder.decUnit) = aState.intSellQ
htSell.Item(intOrderBook) = slSell
End If
ElseIf aorder.decUnit = aState.decSell2 Then
slSell = New SortedList
slSell = CType(htSell.Item(intOrderBook), SortedList)
If intQuantity = aState.intSellQ2 Then
aState.decSell2 = CDec(slSell.GetKey(2))
aState.intSellQ2 = CInt(slSell.GetByIndex(2))
sendrow(aState, dt, intEventID, intOrderBook)
htstate.Item(intOrderBook) = aState
slSell.Remove(aorder.decUnit)
htSell.Item(intOrderBook) = slSell
Else
aState.intSellQ2 += -intQuantity
aorder.intQuantity += -intQuantity
htorder.Item(aorder.intOrderRef) = aorder
sendrow(aState, dt, intEventID, intOrderBook)
htstate.Item(intOrderBook) = aState
slSell.Item(aorder.decUnit) = aState.intSellQ2
htSell.Item(intOrderBook) = slSell
End If
Else
slSell = New SortedList
slSell = CType(htSell.Item(intOrderBook), SortedList)
If intQuantity = CInt(slSell.Item(aorder.decUnit)) Then
slSell.Remove(aorder.decUnit)
htSell.Item(intOrderBook) = slSell
Else
aorder.intQuantity += -intQuantity
slSell.Item(aorder.decUnit) = CInt(slSell.Item(aorder.decUnit)) - intQuantity
htorder.Item(aorder.intOrderRef) = aorder
htSell.Item(intOrderBook) = slSell
End If
End If
Else
If aorder.decUnit = aState.decBuy Then
slBuy = New SortedList
slBuy = CType(htBuy.Item(intOrderBook), SortedList)
If intQuantity = aState.intBuyQ Then
aState.decBuy = aState.decBuy2
aState.intBuyQ = aState.intBuyQ2
aState.decBuy2 = CDec(slBuy.GetKey(slBuy.Count - 3))
aState.intBuyQ2 = CInt(slBuy.GetByIndex(slBuy.Count - 3))
sendrow(aState, dt, intEventID, intOrderBook)
htstate.Item(intOrderBook) = aState
slBuy.Remove(aorder.decUnit)
htBuy.Item(intOrderBook) = slBuy
Else
aState.intBuyQ += -intQuantity
aorder.intQuantity += -intQuantity
htorder.Item(intOrderRef) = aorder
sendrow(aState, dt, intEventID, intOrderBook)
htstate.Item(intOrderBook) = aState
slBuy.Item(aorder.decUnit) = aState.intBuyQ
htBuy.Item(intOrderBook) = slBuy
End If
ElseIf aorder.decUnit = aState.decBuy2 Then
slBuy = New SortedList
slBuy = CType(htBuy.Item(intOrderBook), SortedList)
If intQuantity = aState.intBuyQ2 Then
aState.decBuy2 = CDec(slBuy.GetKey(slBuy.Count - 3))
aState.intBuyQ2 = CInt(slBuy.GetByIndex(slBuy.Count - 3))
sendrow(aState, dt, intEventID, intOrderBook)
htstate.Item(intOrderBook) = aState
slBuy.Remove(aorder.decUnit)
htBuy.Item(intOrderBook) = slBuy
Else
aState.intBuyQ2 += -intQuantity
aorder.intQuantity += -intQuantity
htorder.Item(intOrderRef) = aorder
sendrow(aState, dt, intEventID, intOrderBook)
htstate.Item(intOrderBook) = aState
slBuy.Item(aorder.decUnit) = aState.intBuyQ2
htBuy.Item(intOrderBook) = slBuy
End If
Else
slBuy = New SortedList
slBuy = CType(htBuy.Item(intOrderBook), SortedList)
If intQuantity = CInt(slBuy.Item(aorder.decUnit)) Then
slBuy.Remove(aorder.decUnit)
htBuy.Item(intOrderBook) = slBuy
Else
aorder.intQuantity = aorder.intQuantity - intQuantity
slBuy.Item(aorder.decUnit) = CInt(slBuy.Item(aorder.decUnit)) - intQuantity
htorder.Item(intOrderRef) = aorder
htBuy.Item(intOrderBook) = slBuy
End If
End If
End If
End Sub
Shared Sub delete(ByRef aorder As order, ByVal aState As orderState, ByRef htorder As Hashtable, ByRef htstate As Hashtable, ByRef htSell As Hashtable, ByRef htBuy As Hashtable, ByRef slSell As SortedList, ByRef slBuy As SortedList, ByVal intOrderBook As Integer, ByVal intQuantity As Integer, ByVal intOrderRef As Integer, ByVal strbs As String, ByVal decUnit As Decimal, ByVal intEventID As Integer, ByVal dt As DataTable)
aorder = New order(CType(htorder.Item(intOrderRef), order))
aState = New orderState(CType(htstate.Item(intOrderBook), orderState))
If strbs = "S" Then
If aorder.decUnit = aState.decSell Then
slSell = New SortedList
slSell = CType(htSell.Item(intOrderBook), SortedList)
If aorder.intQuantity = aState.intSellQ Then
aState.decSell = aState.decSell2
aState.intSellQ = aState.intSellQ2
aState.decSell2 = CDec(slSell.GetKey(2))
aState.intSellQ2 = CInt(slSell.GetByIndex(2))
sendrow(aState, dt, intEventID, intOrderBook)
htstate.Item(intOrderBook) = aState
slSell.Remove(aorder.decUnit)
htSell.Item(intOrderBook) = slSell
Else
aState.intSellQ += -aorder.intQuantity
sendrow(aState, dt, intEventID, intOrderBook)
htstate.Item(intOrderBook) = aState
slSell.Item(aorder.decUnit) = aState.intSellQ
htSell.Item(intOrderBook) = slSell
End If
ElseIf aorder.decUnit = aState.decSell2 Then
slSell = New SortedList
slSell = CType(htSell.Item(intOrderBook), SortedList)
If aorder.intQuantity = aState.intSellQ2 Then
aState.decSell2 = CDec(slSell.GetKey(2))
aState.intSellQ2 = CInt(slSell.GetByIndex(2))
sendrow(aState, dt, intEventID, intOrderBook)
htstate.Item(intOrderBook) = aState
slSell.Remove(aorder.decUnit)
htSell.Item(intOrderBook) = slSell
Else
aState.intSellQ2 += -aorder.intQuantity
sendrow(aState, dt, intEventID, intOrderBook)
htstate.Item(intOrderBook) = aState
slSell.Item(aorder.decUnit) = aState.intSellQ2
htSell.Item(intOrderBook) = slSell
End If
Else
slSell = New SortedList
slSell = CType(htSell.Item(intOrderBook), SortedList)
If aorder.intQuantity = CInt(slSell.Item(aorder.decUnit)) Then
slSell.Remove(aorder.decUnit)
htSell.Item(intOrderBook) = slSell
Else
slSell.Item(aorder.decUnit) = CInt(slSell.Item(aorder.decUnit)) - aorder.intQuantity
htSell.Item(intOrderBook) = slSell
End If
End If
Else
If aorder.decUnit = aState.decBuy Then
slBuy = New SortedList
slBuy = CType(htBuy.Item(intOrderBook), SortedList)
If aorder.intQuantity = aState.intBuyQ Then
aState.decBuy = aState.decBuy2
aState.intBuyQ = aState.intBuyQ2
aState.decBuy2 = CDec(slBuy.GetKey(slBuy.Count - 3))
aState.intBuyQ2 = CInt(slBuy.GetByIndex(slBuy.Count - 3))
sendrow(aState, dt, intEventID, intOrderBook)
htstate.Item(intOrderBook) = aState
slBuy.Remove(aorder.decUnit)
htBuy.Item(intOrderBook) = slBuy
Else
aState.intBuyQ += -aorder.intQuantity
sendrow(aState, dt, intEventID, intOrderBook)
htstate.Item(intOrderBook) = aState
slBuy.Item(aorder.decUnit) = aState.intBuyQ
htBuy.Item(intOrderBook) = slBuy
End If
ElseIf aorder.decUnit = aState.decBuy2 Then
slBuy = New SortedList
slBuy = CType(htBuy.Item(intOrderBook), SortedList)
If aorder.intQuantity = aState.intBuyQ2 Then
aState.decBuy2 = CDec(slBuy.GetKey(slBuy.Count - 3))
aState.intBuyQ2 = CInt(slBuy.GetByIndex(slBuy.Count - 3))
sendrow(aState, dt, intEventID, intOrderBook)
htstate.Item(intOrderBook) = aState
slBuy.Remove(aorder.decUnit)
htBuy.Item(intOrderBook) = slBuy
Else
aState.intBuyQ2 += -aorder.intQuantity
sendrow(aState, dt, intEventID, intOrderBook)
htstate.Item(intOrderBook) = aState
slBuy.Item(aorder.decUnit) = aState.intBuyQ2
htBuy.Item(intOrderBook) = slBuy
End If
Else
slBuy = New SortedList
slBuy = CType(htBuy.Item(intOrderBook), SortedList)
If aorder.intQuantity = CInt(slBuy.Item(aorder.decUnit)) Then
slBuy.Remove(aorder.decUnit)
htBuy.Item(intOrderBook) = slBuy
Else
slBuy.Item(aorder.decUnit) = CInt(slBuy.Item(aorder.decUnit)) - aorder.intQuantity
htBuy.Item(intOrderBook) = slBuy
End If
End If
End If
htorder.Remove(intOrderRef)
End Sub
Shared Sub updateAB(ByRef aorder As order, ByVal aState As orderState, ByRef htorder As Hashtable, ByRef htstate As Hashtable, ByRef htSell As Hashtable, ByRef htBuy As Hashtable, ByRef slSell As SortedList, ByRef slBuy As SortedList, ByVal intOrderBook As Integer, ByVal intQuantity As Integer, ByVal intOrderRef As Integer, ByVal strbs As String, ByVal decUnit As Decimal, ByVal intEventID As Integer, ByVal dt As DataTable)
If Not htstate.ContainsKey(intOrderBook) Then
aState = New orderState(0, 0, 0, 0, 0, 0, 0, 0)
htstate.Add(intOrderBook, aState)
End If
aState = New orderState(CType(htstate.Item(intOrderBook), orderState))
Dim decSell, decSell2, decBuy, decBuy2 As Decimal
Dim intSellQ, intSellQ2, intBuyQ, intBuyQ2 As Integer
decSell = aState.decSell
decSell2 = aState.decSell2
decBuy = aState.decBuy
decBuy2 = aState.decBuy2
intSellQ = aState.intSellQ
intSellQ2 = aState.intSellQ2
intBuyQ = aState.intBuyQ
intBuyQ2 = aState.intBuyQ2
Select Case decUnit
Case Is > decBuy
decBuy2 = decBuy
intBuyQ2 = intBuyQ
decBuy = decUnit
intBuyQ = intQuantity
aState = New orderState(decSell, decSell2, decBuy, decBuy2, intSellQ, intSellQ2, intBuyQ, intBuyQ2)
htstate.Item(intOrderBook) = aState
sendrow(aState, dt, intEventID, intOrderBook)
Case Is = decBuy
intBuyQ += intQuantity
aState = New orderState(decSell, decSell2, decBuy, decBuy2, intSellQ, intSellQ2, intBuyQ, intBuyQ2)
htstate.Item(intOrderBook) = aState
sendrow(aState, dt, intEventID, intOrderBook)
Case Is > decBuy2
decBuy2 = decUnit
intBuyQ2 = intQuantity
aState = New orderState(decSell, decSell2, decBuy, decBuy2, intSellQ, intSellQ2, intBuyQ, intBuyQ2)
htstate.Item(intOrderBook) = aState
sendrow(aState, dt, intEventID, intOrderBook)
Case Is = decBuy2
intBuyQ2 += intQuantity
aState = New orderState(decSell, decSell2, decBuy, decBuy2, intSellQ, intSellQ2, intBuyQ, intBuyQ2)
htstate.Item(intOrderBook) = aState
sendrow(aState, dt, intEventID, intOrderBook)
End Select
End Sub
Shared Sub updateAS(ByRef aorder As order, ByVal aState As orderState, ByRef htorder As Hashtable, ByRef htstate As Hashtable, ByRef htSell As Hashtable, ByRef htBuy As Hashtable, ByRef slSell As SortedList, ByRef slBuy As SortedList, ByVal intOrderBook As Integer, ByVal intQuantity As Integer, ByVal intOrderRef As Integer, ByVal strbs As String, ByVal decUnit As Decimal, ByVal intEventID As Integer, ByVal dt As DataTable)
If Not htstate.ContainsKey(intOrderBook) Then
aState = New orderState(0, 0, 0, 0, 0, 0, 0, 0)
htstate.Add(intOrderBook, aState)
End If
aState = New orderState(CType(htstate.Item(intOrderBook), orderState))
Dim decSell, decSell2, decBuy, decBuy2 As Decimal
Dim intSellQ, intSellQ2, intBuyQ, intBuyQ2 As Integer
decSell = aState.decSell
decSell2 = aState.decSell2
decBuy = aState.decBuy
decBuy2 = aState.decBuy2
intSellQ = aState.intSellQ
intSellQ2 = aState.intSellQ2
intBuyQ = aState.intBuyQ
intBuyQ2 = aState.intBuyQ2
If decSell = 0 Then
decSell = decUnit + 1
decSell2 = 0
ElseIf decSell2 = 0 Then
decSell2 = decUnit + 1
End If
Select Case decUnit
Case Is < decSell
If decSell2 <> 0 Then
decSell2 = decSell
End If
intSellQ2 = intSellQ
decSell = decUnit
intSellQ = intQuantity
aState = New orderState(decSell, decSell2, decBuy, decBuy2, intSellQ, intSellQ2, intBuyQ, intBuyQ2)
htstate.Item(intOrderBook) = aState
sendrow(aState, dt, intEventID, intOrderBook)
Case Is = decSell
intSellQ += intQuantity
aState = New orderState(decSell, decSell2, decBuy, decBuy2, intSellQ, intSellQ2, intBuyQ, intBuyQ2)
htstate.Item(intOrderBook) = aState
sendrow(aState, dt, intEventID, intOrderBook)
Case Is < decSell2
decSell2 = decUnit
intSellQ2 = intQuantity
aState = New orderState(decSell, decSell2, decBuy, decBuy2, intSellQ, intSellQ2, intBuyQ, intBuyQ2)
htstate.Item(intOrderBook) = aState
sendrow(aState, dt, intEventID, intOrderBook)
Case Is = decSell2
intSellQ2 += intQuantity
aState = New orderState(decSell, decSell2, decBuy, decBuy2, intSellQ, intSellQ2, intBuyQ, intBuyQ2)
htstate.Item(intOrderBook) = aState
sendrow(aState, dt, intEventID, intOrderBook)
End Select
End Sub
Shared Sub sendrow(ByVal astate As orderState, ByRef dt As DataTable, ByVal intEventID As Integer, ByVal intOrderBook As Integer)
Dim row As DataRow
row = dt.NewRow
row.Item(0) = intEventID
row.Item(1) = intOrderBook
row.Item(2) = astate.decBuy
row.Item(3) = astate.intBuyQ
row.Item(4) = astate.decSell
row.Item(5) = astate.intSellQ
row.Item(6) = astate.decBuy2
row.Item(7) = astate.intBuyQ2
row.Item(8) = astate.decSell2
row.Item(9) = astate.intSellQ2
dt.Rows.Add(row)
End Sub
Shared Sub addBuy(ByRef htOrder As Hashtable, ByVal aorder As order, ByRef slBuy As SortedList, ByRef htBuy As Hashtable, ByVal intOrderRef As Integer, ByVal intQuantity As Integer, ByVal decUnit As Decimal, ByVal intOrderBook As Integer)
Dim intIndex As Integer
htOrder.Add(intOrderRef, aorder)
If Not htBuy.ContainsKey(intOrderBook) Then
slBuy = New SortedList
slBuy.Add(decUnit, intQuantity)
htBuy.Add(intOrderBook, slBuy)
Else
slBuy = New SortedList
slBuy = CType(htBuy.Item(intOrderBook), SortedList)
If slBuy.ContainsKey(decUnit) Then
intIndex = slBuy.IndexOfKey(decUnit)
slBuy.SetByIndex(intIndex, CInt(slBuy.GetByIndex(intIndex)) + intQuantity)
htBuy.Item(intOrderBook) = slBuy
Else
slBuy.Add(decUnit, intQuantity)
htBuy.Item(intOrderBook) = slBuy
End If
End If
End Sub
Shared Sub addsell(ByRef htOrder As Hashtable, ByVal aorder As order, ByRef slSell As SortedList, ByRef htSell As Hashtable, ByVal intOrderRef As Integer, ByVal intQuantity As Integer, ByVal decUnit As Decimal, ByVal intOrderBook As Integer)
Dim intIndex As Integer
htOrder.Add(intOrderRef, aorder)
If Not htSell.ContainsKey(intOrderBook) Then
slSell = New SortedList
slSell.Add(decUnit, intQuantity)
htSell.Add(intOrderBook, slSell)
Else
slSell = New SortedList
slSell = CType(htSell.Item(intOrderBook), SortedList)
If slSell.ContainsKey(decUnit) Then
intIndex = slSell.IndexOfKey(decUnit)
slSell.SetByIndex(intIndex, CInt(slSell.GetByIndex(intIndex)) + intQuantity)
htSell.Item(intOrderBook) = slSell
Else
slSell.Add(decUnit, intQuantity)
htSell.Item(intOrderBook) = slSell
End If
End If
End Sub
End Class
Public Class orderState
Public decSell, decSell2, decBuy, decBuy2 As Decimal
Public intSellQ, intSellQ2, intBuyQ, intBuyQ2 As Integer
Sub New(ByVal Sell As Decimal, ByVal Sell2 As Decimal, ByVal Buy As Decimal, ByVal Buy2 As Decimal, ByVal SellQ As Integer, ByVal SellQ2 As Integer, ByVal BuyQ As Integer, ByVal BuyQ2 As Integer)
decSell = Sell
decSell2 = Sell2
decBuy = Buy
decBuy2 = Buy2
intSellQ = SellQ
intSellQ2 = SellQ2
intBuyQ = BuyQ
intBuyQ2 = BuyQ2
End Sub
Sub New(ByVal state As orderState)
decSell = state.decSell
decSell2 = state.decSell2
decBuy = state.decBuy
decBuy2 = state.decBuy2
intSellQ = state.intSellQ
intSellQ2 = state.intSellQ2
intBuyQ = state.intBuyQ
intBuyQ2 = state.intBuyQ2
End Sub
End Class
Public Class order
Public intEventID, intOrderRef, intOrderBook, intQuantity As Integer
Public strEventType, strBS As String
Public decUnit As Decimal
Sub New(ByVal EventId As Integer, ByVal eventType As String, ByVal OrderRef As Integer, ByVal OrderBook As Integer, ByVal BS As String, ByVal UnitPrice As Decimal, ByVal Quantity As Integer)
intEventID = EventId
strEventType = eventType
intOrderRef = OrderRef
intOrderBook = OrderBook
strBS = BS
intQuantity = Quantity
decUnit = UnitPrice
End Sub
Sub New(ByVal aOrder As order)
intEventID = aOrder.intEventID
strEventType = aOrder.strEventType
intOrderRef = aOrder.intOrderRef
intOrderBook = aOrder.intOrderBook
strBS = aOrder.strBS
intQuantity = aOrder.intQuantity
decUnit = aOrder.decUnit
End Sub
End Class
@JAhlen what do we do when the eventType is E and unitPrice =0.00? as in eventID 222666. It looks as if the cursor solution, when the unitprice =0.00, puts the execution order through at the best buy price or best sell price accordingly, is that right?
@Daniel Ross When EventType is E you should always use the price from the referenced Add Order event (EventType A). As you can see in the example cursor solution you can handle the E event in exactly the same way as a C event.
@JAhlen, thanks mate for clarifying that. The part about the Execution price in the important notes gave me the impression that we had to use the unit price of the E event
@Daniel Ross Thanks for the comment. I have clarified the explanation under Important notes.
Just a question - I've replicated the functionality as is, but why is the best buy price the highest, and the best sell price the lowest? I would have thought it would be best to buy at the lowest price and sell at the highest price? I must be missing something!