void OpenTrade(FXW fw, string pair, bool buy, int lots, double limit, double stop, Trade masterTrade) { string serverTradeID = masterTrade.Id; Func <string, bool> tradeExists = id => fw.GetTrade(serverTradeID) != null; if (!tradeExists(serverTradeID)) { if (masterTradesPending.Contains(serverTradeID) || masterTradesSynced.Contains(serverTradeID)) { return; } masterTradesPending.Add(serverTradeID); PendingOrder po = null; Action <object, RequestEventArgs> reqiesFailedAction = (s, e) => { if (po != null && e.RequestId == po.RequestId) { masterTradesPending.Remove(serverTradeID); po = null; Log = new Exception(e.Error); } }; Action <Order> orderRemovedAvtion = order => { var o = order.FixStatus; }; Action <object, ErrorEventArgs> errorAction = (s, e) => { if (serverTradeID == e.Remark) { masterTradesPending.Remove(serverTradeID); po = null; Log = e.Error; } }; var rfh = new EventHandler <RequestEventArgs>(reqiesFailedAction); var orh = new OrderRemovedEventHandler(orderRemovedAvtion); var erh = new EventHandler <ErrorEventArgs>(errorAction); try { fw.RequestFailed += rfh; fw.OrderRemoved += orh; fw.Error += erh; po = fw.FixOrderOpen(pair, buy, lots, limit, stop, serverTradeID); //if (po != null) pendingTrade.GetUnKnown().ErrorMessage = "Waiting for " + po.RequestId; var done = SpinWait.SpinUntil( () => { Thread.Sleep(100); return(masterTradesPending.Contains(serverTradeID) && po != null && tradeExists(serverTradeID)); }, TimeSpan.FromSeconds(secondsToWaitForTrade)); if (tradeExists(serverTradeID)) { masterTradesSynced.Add(serverTradeID); } } catch (Exception exc) { Log = exc; } finally { masterTradesPending.Remove(serverTradeID); fw.RequestFailed -= rfh; fw.OrderRemoved -= orh; fw.Error -= erh; } } OpenTradeSchedulers.Remove(serverTradeID); }
void CloseLocalTrade(string tradeID) { try { if (masterTradesPending.Contains(tradeID)) { masterTradesPending.Remove(tradeID); } else { fwLocal.CloseTradeAsync(fwLocal.GetTrade(tradeID)); } } catch (Exception exc) { Log = exc; } }