public void BasicStopAndLimit() { long id = 1; sho = new REGSHO_ShortTracker(); sho.SendDebugEvent += new DebugDelegate(rt.d); sho.VerboseDebugging = true; Order o = new OrderImpl(); // take a position o = new BuyLimit(sym, 100, 21.18m, id++); o.Account = ACCT; Assert.IsFalse(sho.isOrderShort(o), "entry buy never a short."); sho.GotOrder(o); Assert.IsTrue(o.Fill(TickImpl.NewTrade(sym, 21.14m, 100)), "unable to fill order"); Trade t = (Trade)o; Assert.IsTrue(t.isValid && t.isFilled, "not a valid trade"); sho.GotFill(t); // accept two exits o = new SellStop(sym, 100, 21.09m, id++); o.Account = ACCT; Assert.IsFalse(sho.isOrderShort(o), "first exit was wrongly a short"); sho.GotOrder(o); o = new SellLimit(sym, 100, 21.19m, id++); o.Account = ACCT; Assert.IsTrue(sho.isOrderShort(o), "second exit was wrongly a sell"); sho.GotOrder(o); }
public void BasicWithAccount() { long id = 1; sho = new REGSHO_ShortTracker(); sho.SendDebugEvent += new DebugDelegate(rt.d); Order o = new OrderImpl(); // take a position sho.GotPosition(new PositionImpl(sym, 100, 300, 0, ACCT)); // accept two exits o = new SellLimit(sym, 100, 200, id++); o.Account = ACCT; Assert.IsFalse(sho.isOrderShort(o)); sho.GotOrder(o); o = new SellLimit(sym, 200, 105, id++); o.Account = ACCT; Assert.IsFalse(sho.isOrderShort(o)); sho.GotOrder(o); // send another short o = new SellStop(sym, 300, 99); o.Account = ACCT; Assert.IsTrue(sho.isOrderShort(o)); }
public void Basics() { Broker broker = new Broker(); broker.GotFill += new FillDelegate(broker_GotFill); broker.GotOrder += new OrderDelegate(broker_GotOrder); OrderImpl o = new OrderImpl(); int error = broker.SendOrderStatus(o); Assert.AreNotEqual((int)MessageTypes.OK, error); Assert.That(orders == 0); Assert.That(fills == 0); o = new BuyMarket(s, 100); broker.SendOrderStatus(o); Assert.That(orders == 1); Assert.That(fills == 0); Assert.That(broker.Execute(TickImpl.NewTrade(s, 10, 200)) == 1); Assert.That(fills == 1); // test that a limit order is not filled outside the market o = new BuyLimit(s, 100, 9); broker.SendOrderStatus(o); Assert.AreEqual(0, broker.Execute(TickImpl.NewTrade(s, 10, 100))); Assert.That(fills == 1); // redudant but for counting // test that limit order is filled inside the market Assert.AreEqual(1, broker.Execute(TickImpl.NewTrade(s, 8, 100))); Assert.That(fills == 2); OrderImpl x = new OrderImpl(); // test that a market order is filled when opposite book exists o = new SellLimit(s, 100, 11); x = new BuyMarket(s, 100); const string t2 = "trader2"; x.Account = t2; broker.SendOrderStatus(o); broker.SendOrderStatus(x); Assert.AreEqual(3, fills); // test that a market order is not filled when no book exists // on opposite side // clear existing orders broker.CancelOrders(); o = new SellMarket(s, 100); o.Account = t2; broker.SendOrderStatus(o); Assert.AreEqual(3, fills); }
public void FillThenStopAndLimitOversell() { long id = 1; sho = new REGSHO_ShortTracker(); sho.SendDebugEvent += new DebugDelegate(rt.d); sho.VerboseDebugging = true; lastids.Clear(); Order o = new OrderImpl(); // send some initial orders so(new SellLimit(sym, 100, 25.83m, id++)); so(new SellStop(sym, 100, 25.83m, id++)); o = new SellStop(sym, 200, 25.83m, id++); so(o); // cancel first two orders sho.GotCancel(lastids[0]); sho.GotCancel(lastids[1]); // fill last order Assert.IsTrue(o.Fill(TickImpl.NewTrade(sym, 25.80m, 200)), "missing initial fill"); sho.GotFill((Trade)o); // check pending size Assert.AreEqual(0, pendingsize(sym), "had pending size after cancels and fills"); // flat position sho.GotPosition(new PositionImpl(sym, 0, 0, 0, ACCT)); // take a position o = new BuyLimit(sym, 100, 25.83m, id++); o.Account = ACCT; Assert.IsFalse(sho.isOrderShort(o), "entry buy never a short."); sho.GotOrder(o); Assert.IsTrue(o.Fill(TickImpl.NewTrade(sym, 25.80m, 100)), "unable to fill order"); Trade t = (Trade)o; Assert.IsTrue(t.isValid && t.isFilled, "not a valid trade"); sho.GotFill(t); // accept two exits o = new SellStop(sym, 100, 21.09m, id++); o.Account = ACCT; Assert.IsFalse(sho.isOrderShort(o), "first exit was wrongly a short"); sho.GotOrder(o); o = new SellLimit(sym, 100, 21.19m, id++); o.Account = ACCT; Assert.IsTrue(sho.isOrderShort(o), "second exit was wrongly a sell"); sho.GotOrder(o); }
public void FillBidAsk() { const string s = "TST"; // market should fill on trade but not on quote OrderImpl o = new BuyMarket(s, 100); Assert.That(o.FillBidAsk(TickImpl.NewAsk(s, 9, 100))); Assert.That(!o.FillBidAsk(TickImpl.NewTrade(s, 9, 100))); Assert.That(!o.FillBidAsk(TickImpl.NewBid(s, 8, 100))); // buy limit // limit should fill if order price is inside market o = new BuyLimit(s, 100, 10m); Assert.That(o.FillBidAsk(TickImpl.NewAsk(s, 9, 100))); // shouldn't fill outside market o = new BuyLimit(s, 100, 10m); Assert.That(!o.FillBidAsk(TickImpl.NewTrade(s, 11, 100))); Assert.That(!o.FillBidAsk(TickImpl.NewAsk(s, 11, 100))); Assert.That(!o.FillBidAsk(TickImpl.NewBid(s, 10, 100))); // sell limit // limit should fill if order price is inside market o = new SellLimit(s, 100, 10m); Assert.That(o.FillBidAsk(TickImpl.NewBid(s, 11, 100))); // shouldn't fill outside market o = new SellLimit(s, 100, 10m); Assert.That(!o.FillBidAsk(TickImpl.NewTrade(s, 9, 100))); // buy stop o = new BuyStop(s, 100, 10m); Assert.That(o.FillBidAsk(TickImpl.NewAsk(s, 11, 100))); // shouldn't fill outside market o = new BuyStop(s, 100, 10m); Assert.That(!o.FillBidAsk(TickImpl.NewTrade(s, 9, 100))); // sell stop o = new SellStop(s, 100, 10m); Assert.That(o.FillBidAsk(TickImpl.NewBid(s, 9, 100))); // shouldn't fill outside market o = new SellStop(s, 100, 10m); Assert.That(!o.FillBidAsk(TickImpl.NewTrade(s, 11, 100))); // always fail filling an invalid tick o = new BuyMarket(s, 100); Assert.IsFalse(o.FillBidAsk(TickImpl.NewTrade(s, 0, 0))); }
public void DoubleBasicWithFlat() { long id = 1; sho = new REGSHO_ShortTracker(); sho.SendDebugEvent += new DebugDelegate(sho_SendDebugEvent); sho.VerboseDebugging = true; Order o = new OrderImpl(); // take a position sho.GotPosition(new PositionImpl(sym, 89.7m, 100)); // accept two exits o = new SellStop(sym, 100, 89.65m, id++); long stop1 = o.id; Assert.IsFalse(sho.isOrderShort(o), "entry1: first sell was incorrectly short"); sho.GotOrder(o); o = new SellLimit(sym, 100, 89.75m, id++); long profit1 = o.id; Assert.IsTrue(sho.isOrderShort(o), "entry1: second sell was incorrectly sell"); sho.GotOrder(o); // flat o = new SellStop(sym, 100, 89.65m, stop1); o.Fill(TickImpl.NewTrade(sym, 89.62m, 100)); sho.GotFill((Trade)o); sho.GotCancel(profit1); // do again // take a position o = new BuyMarket(sym, 100); o.id = id++; o.Fill(TickImpl.NewTrade(sym, 89.64m, 100)); sho.GotFill((Trade)o); // accept two exits o = new SellStop(sym, 100, 89.65m, id++); Assert.IsFalse(sho.isOrderShort(o), "entry2: first sell was incorrectly short"); sho.GotOrder(o); o = new SellLimit(sym, 100, 89.75m, id++); Assert.IsTrue(sho.isOrderShort(o), "entry2: second sell was incorrectly NOT short"); sho.GotOrder(o); }
void PlaceHistoricalOrder(Tick t) // this function converts a historical quote into an order // and places it on a special order book replay uses to determine // the BBO for historical tick streams and the BBO between historical ticks // and the other order books { if (t.isTrade) { return; } if (t.depth != 0) { return; } if (t.hasAsk) { // if we already have a book for this side we can get rid of it foreach (long oid in hasHistBook(t.symbol, false)) { SimBroker.CancelOrder(oid); } OrderImpl o = new SellLimit(t.symbol, t.AskSize, t.ask); o.date = t.date; o.time = t.time; o.Exchange = t.oe; SimBroker.SendOrderAccount(o, HISTBOOK); } if (t.hasBid) { // if we already have a book for this side we can get rid of it foreach (long oid in hasHistBook(t.symbol, true)) { SimBroker.CancelOrder(oid); } OrderImpl o = new BuyLimit(t.symbol, t.BidSize, t.bid); o.date = t.date; o.time = t.time; o.Exchange = t.be; SimBroker.SendOrderAccount(o, HISTBOOK); } }
public void Fill() { const string s = "TST"; // market should fill on trade but not on quote OrderImpl o = new BuyMarket(s, 100); Assert.That(o.Fill(TickImpl.NewTrade(s, 9, 100))); Assert.That(!o.Fill(TickImpl.NewBid(s, 8, 100))); // buy limit // limit should fill if order price is inside market o = new BuyLimit(s, 100, 10m); Assert.That(o.Fill(TickImpl.NewTrade(s, 9, 100))); // shouldn't fill outside market o = new BuyLimit(s, 100, 10m); Assert.That(!o.Fill(TickImpl.NewTrade(s, 11, 100))); // sell limit // limit should fill if order price is inside market o = new SellLimit(s, 100, 10m); Assert.That(o.Fill(TickImpl.NewTrade(s, 11, 100))); // shouldn't fill outside market o = new SellLimit(s, 100, 10m); Assert.That(!o.Fill(TickImpl.NewTrade(s, 9, 100))); // buy stop o = new BuyStop(s, 100, 10m); Assert.That(o.Fill(TickImpl.NewTrade(s, 11, 100))); // shouldn't fill outside market o = new BuyStop(s, 100, 10m); Assert.That(!o.Fill(TickImpl.NewTrade(s, 9, 100))); // sell stop o = new SellStop(s, 100, 10m); Assert.That(o.Fill(TickImpl.NewTrade(s, 9, 100))); // shouldn't fill outside market o = new SellStop(s, 100, 10m); Assert.That(!o.Fill(TickImpl.NewTrade(s, 11, 100))); // always fail filling an invalid tick o = new BuyMarket(s, 100); Assert.IsFalse(o.Fill(TickImpl.NewTrade(s, 0, 0))); // always fail filling invalid order o = new BuyLimit(s, 100, 10); OrderImpl x = new OrderImpl(); Assert.IsFalse(o.Fill(x)); // always fail filling an order that doesn't cross market x = new BuyMarket(s, 100); Assert.IsFalse(o.Fill(x)); const string t2 = "trader2"; // suceed on crossing market x = new SellMarket(s, 100); x.Account = t2; Assert.IsTrue(o.Fill(x)); // fail when accounts are the same x = new SellMarket(s, 100); x.Account = o.Account; Assert.IsFalse(o.Fill(x)); // fail on match outside of market x = new SellLimit(s, 100, 11); x.Account = t2; Assert.IsFalse(o.Fill(x)); // succeed on limit cross o = new BuyLimit(s, 100, 10); x = new SellLimit(s, 100, 10); x.Account = t2; Assert.IsTrue(o.Fill(x)); // make sure we can stop cross o = new SellStop(s, 100, 10); x = new BuyMarket(s, 100); x.Account = t2; Assert.IsTrue(o.Fill(x)); }
public void IdentityLimits() { string sym = "SPY"; bool side = false; int size = -256; decimal Limit = 134.40m; string comment = "Hello, World!"; // not checked for long id = 8675309; // not checked for Order orig = new LimitOrder(sym, side, size, Limit); Order comp; comp = new LimitOrder(sym, size, Limit, id); Assert.AreEqual(orig.symbol, comp.symbol, "Symbol, SignedLimit"); Assert.AreEqual(orig.side, comp.side, "Side, SignedLimit"); Assert.AreEqual(orig.size, comp.size, "Size, SignedLimit"); Assert.AreEqual(orig.stopp, comp.stopp, "Stop SignedLimit"); Assert.AreEqual(orig.price, comp.price, "Price, SignedLimit"); comp = new LimitOrder(sym, side, size, Limit, id); Assert.AreEqual(orig.symbol, comp.symbol, "Symbol, LimitID"); Assert.AreEqual(orig.side, comp.side, "Side, LimitID"); Assert.AreEqual(orig.size, comp.size, "Size, LimitID"); Assert.AreEqual(orig.stopp, comp.stopp, "Stop LimitID"); Assert.AreEqual(orig.price, comp.price, "Price, LimitID"); comp = new LimitOrder(sym, side, size, Limit, comment); Assert.AreEqual(orig.symbol, comp.symbol, "Symbol, LimitComment"); Assert.AreEqual(orig.side, comp.side, "Side, LimitComment"); Assert.AreEqual(orig.size, comp.size, "Size, LimitComment"); Assert.AreEqual(orig.stopp, comp.stopp, "Stop LimitComment"); Assert.AreEqual(orig.price, comp.price, "Price, LimitComment"); comp = new SellLimit(sym, size, Limit); Assert.AreEqual(orig.symbol, comp.symbol, "Symbol, SellLimit"); Assert.AreEqual(orig.side, comp.side, "Side, SellLimit"); Assert.AreEqual(orig.size, comp.size, "Size, SellLimit"); Assert.AreEqual(orig.stopp, comp.stopp, "Stop SellLimit"); Assert.AreEqual(orig.price, comp.price, "Price, SellLimit"); comp = new SellLimit(sym, size, Limit, id); Assert.AreEqual(orig.symbol, comp.symbol, "Symbol, SellLimitID"); Assert.AreEqual(orig.side, comp.side, "Side, SellLimitID"); Assert.AreEqual(orig.size, comp.size, "Size, SellLimitID"); Assert.AreEqual(orig.stopp, comp.stopp, "Stop SellLimitID"); Assert.AreEqual(orig.price, comp.price, "Price, SellLimitID"); comp = new SellLimit(sym, size, Limit, comment); Assert.AreEqual(orig.symbol, comp.symbol, "Symbol, SellLimitComment"); Assert.AreEqual(orig.side, comp.side, "Side, SellLimitComment"); Assert.AreEqual(orig.size, comp.size, "Size, SellLimitComment"); Assert.AreEqual(orig.stopp, comp.stopp, "Stop SellLimitComment"); Assert.AreEqual(orig.price, comp.price, "Price, SellLimitComment"); side = true; orig = new LimitOrder(sym, side, size, Limit); comp = new BuyLimit(sym, size, Limit); Assert.AreEqual(orig.symbol, comp.symbol, "Symbol, BuyLimit"); Assert.AreEqual(orig.side, comp.side, "Side, BuyLimit"); Assert.AreEqual(orig.size, comp.size, "Size, BuyLimit"); Assert.AreEqual(orig.stopp, comp.stopp, "Stop BuyLimit"); Assert.AreEqual(orig.price, comp.price, "Price, BuyLimit"); comp = new BuyLimit(sym, size, Limit, id); Assert.AreEqual(orig.symbol, comp.symbol, "Symbol, BuyLimitID"); Assert.AreEqual(orig.side, comp.side, "Side, BuyLimitID"); Assert.AreEqual(orig.size, comp.size, "Size, BuyLimitID"); Assert.AreEqual(orig.stopp, comp.stopp, "Stop BuyLimitID"); Assert.AreEqual(orig.price, comp.price, "Price, BuyLimitID"); comp = new BuyLimit(sym, size, Limit, comment); Assert.AreEqual(orig.symbol, comp.symbol, "Symbol, BuyLimitComment"); Assert.AreEqual(orig.side, comp.side, "Side, BuyLimitComment"); Assert.AreEqual(orig.size, comp.size, "Size, BuyLimitComment"); Assert.AreEqual(orig.stopp, comp.stopp, "Stop BuyLimitComment"); Assert.AreEqual(orig.price, comp.price, "Price, BuyLimitComment"); }