Exemplo n.º 1
0
        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);
        }
Exemplo n.º 2
0
 void CloseLocalTrade(string tradeID)
 {
     try {
         if (masterTradesPending.Contains(tradeID))
         {
             masterTradesPending.Remove(tradeID);
         }
         else
         {
             fwLocal.CloseTradeAsync(fwLocal.GetTrade(tradeID));
         }
     } catch (Exception exc) { Log = exc; }
 }