public void placeOrder(OrderDirections directions) { cancelOrder(); cache = new OrderCache(app); this.directions = directions; OrderBuilder bld = new OrderBuilder(cache); state = State.ConnectionPending; using (OrderWatcher watch = new OrderWatcher(cache, bld.OrderTag)) { cache.Start(); while (state != State.ConnectionDead && state != State.OrderFinished) { if (!WaitAny(10000, watch.WaitHandles)) { WriteLine("TIMED OUT WaitAny(10000) WAITING FOR RESPONSE"); break; } OrderWatcher.Action action; while (watch.GetNext(out action, out ord)) { switch (action) { case OrderWatcher.Action.Live: if (state == State.ConnectionPending) { WriteLine("SUBMITTING ORDER"); state = State.OrderPending; bld.SetAccount(Configuration.getValue("Configuration/Account/Bank"), Configuration.getValue("Configuration/Account/Branch"), Configuration.getValue("Configuration/Account/Customer"), Configuration.getValue("Configuration/Account/Deposit")); bld.SetBuySell(OrderBuilder.BuySell.BUY); bld.SetExpiration(OrderBuilder.Expiration.DAY); bld.SetRoute(directions.Route); bld.SetSymbol(directions.Symbol, getExchange(directions), OrderBuilder.SecurityType.STOCKOPT); bld.SetVolume(directions.Size); bld.SetPriceLimit(directions.LimitPrice); if (directions.Simulated) { WriteLine("Am sending simulated order"); } else { WriteLine("Am sending real order"); cache.SubmitOrder(bld); } } break; case OrderWatcher.Action.Dead: WriteLine("CONNECTION FAILED"); state = State.ConnectionDead; break; case OrderWatcher.Action.Order: DisplayOrder(ord); if (state == State.OrderPending && ord.Type == "UserSubmitOrder") { if (ord.CurrentStatus == "COMPLETED") { WriteLine("Order Completed"); state = State.OrderFinished; } else { WriteLine("Order UNEXPECTEDLY FINISHED"); state = State.OrderFinished; } } else if (state == State.CancelPending) { if (ord.CurrentStatus == "COMPLETED" || ord.CurrentStatus == "DELETED") { state = State.OrderFinished; } } if (ord.Type == "ExchangeTradeOrder") { WriteLine("GOT FILL FOR {0} {1} AT {2}", ord.Buyorsell, ord.Volume, ord.Price); } if (ord.Type == "ExchangeKillOrder") { WriteLine("GOT KILL"); } break; } // end switch } // end while getNext } // end while state } // end using watch WriteLine("DONE PLACING ORDER"); }
public void placeOrder(OrderDirections directions) { cancelOrder(); cache = new OrderCache(app); this.directions = directions; OrderBuilder bld = new OrderBuilder(cache); state = State.ConnectionPending; using (OrderWatcher watch = new OrderWatcher(cache, bld.OrderTag)) { cache.Start(); while (state != State.ConnectionDead && state != State.OrderFinished) { if (!WaitAny(10000, watch.WaitHandles) ) { WriteLine("TIMED OUT WaitAny(10000) WAITING FOR RESPONSE"); break; } OrderWatcher.Action action; while (watch.GetNext(out action, out ord)) { switch (action) { case OrderWatcher.Action.Live: if (state == State.ConnectionPending) { WriteLine("SUBMITTING ORDER"); state = State.OrderPending; bld.SetAccount(Configuration.getValue("Configuration/Account/Bank"), Configuration.getValue("Configuration/Account/Branch"), Configuration.getValue("Configuration/Account/Customer"), Configuration.getValue("Configuration/Account/Deposit")); bld.SetBuySell(OrderBuilder.BuySell.BUY); bld.SetExpiration(OrderBuilder.Expiration.DAY); bld.SetRoute(directions.Route); bld.SetSymbol(directions.Symbol, getExchange(directions), OrderBuilder.SecurityType.STOCKOPT); bld.SetVolume(directions.Size); bld.SetPriceLimit(directions.LimitPrice); if (directions.Simulated) { WriteLine("Am sending simulated order"); } else { WriteLine("Am sending real order"); cache.SubmitOrder(bld); } } break; case OrderWatcher.Action.Dead: WriteLine("CONNECTION FAILED"); state = State.ConnectionDead; break; case OrderWatcher.Action.Order: DisplayOrder(ord); if( state==State.OrderPending && ord.Type=="UserSubmitOrder" ) { if( ord.CurrentStatus=="COMPLETED") { WriteLine("Order Completed"); state = State.OrderFinished; } else { WriteLine("Order UNEXPECTEDLY FINISHED" ); state = State.OrderFinished; } } else if (state == State.CancelPending) { if( ord.CurrentStatus=="COMPLETED" || ord.CurrentStatus=="DELETED" ) state = State.OrderFinished; } if (ord.Type == "ExchangeTradeOrder") WriteLine("GOT FILL FOR {0} {1} AT {2}", ord.Buyorsell, ord.Volume, ord.Price); if (ord.Type == "ExchangeKillOrder") WriteLine("GOT KILL"); break; } // end switch } // end while getNext } // end while state } // end using watch WriteLine("DONE PLACING ORDER"); }