Exemplo n.º 1
0
        public static TWTransactions Transactions(string accountNumber, DateTime?start, DateTime?end)
        {
            SetHeaders(Token);

            string url = "https://api.tastyworks.com/accounts/" + accountNumber + "/transactions?";

            if (start != null)
            {
                url += "start-date=" + String.Format("{0:yyyy'-'MM'-'dd'T'HH':'mm':'ss'Z'}", start) + "&";
            }
            if (end != null)
            {
                url += "end-date=" + String.Format("{0:yyyy'-'MM'-'dd'T'HH':'mm':'ss'Z'}", end);
            }

            string reply = Web.DownloadString(url);
            //Debug.WriteLine(reply);
            JObject package = JObject.Parse(reply);

            TWTransactions returnList = new TWTransactions();

            Int32         pages      = Convert.ToInt32(package["pagination"]["total-pages"]);
            Int32         pageOffset = 0;
            List <JToken> list       = package["data"]["items"].Children().ToList();

            do
            {
                foreach (JToken item in list)
                {
                    //Debug.WriteLine(item.ToString());

                    TWTransaction inst = new TWTransaction();
                    inst.TransID = Convert.ToInt32(item["id"]);
                    inst.Time    = Convert.ToDateTime(item["executed-at"]).ToUniversalTime();

                    inst.TransactionCode    = item["transaction-type"].ToString();
                    inst.TransactionSubcode = item["transaction-sub-type"].ToString();
                    if (item["action"] != null)
                    {
                        inst.Action = item["action"].ToString();
                    }
                    inst.Description = item["description"].ToString();
                    inst.AccountRef  = item["account-number"].ToString();

                    inst.Price  = Convert.ToDecimal(item["price"]);
                    inst.Fees   = Convert.ToDecimal(item["commission"]) + Convert.ToDecimal(item["clearing-fees"]) + Convert.ToDecimal(item["regulatory-fees"]);
                    inst.Amount = Convert.ToDecimal(item["value"]) * ((item["value-effect"].ToString() == "Debit") ? -1 : 1);

                    if ((inst.TransactionCode == "Trade") || (inst.TransactionCode == "Receive Deliver"))
                    {
                        inst.Symbol   = item["underlying-symbol"].ToString();
                        inst.Quantity = Convert.ToDecimal(item["quantity"]);

                        SymbolDecoder symbol = new SymbolDecoder(item["symbol"].ToString(), item["instrument-type"].ToString());
                        inst.InsType    = symbol.Type;
                        inst.ExpireDate = symbol.Expiration;
                        inst.Strike     = symbol.Strike;
                    }
                    CompleteInstance(inst);

                    returnList.Add(inst);
                }

                if (pages > 1)
                {
                    SetHeaders(Token);
                    reply   = Web.DownloadString(url + "&page-offset=" + ++pageOffset);
                    package = JObject.Parse(reply);
                    list    = package["data"]["items"].Children().ToList();
                }

                pages--;
            } while (pages > 0);

            return((returnList.Count > 0) ? returnList : null);
        }
Exemplo n.º 2
0
        public static TWPositions Positions(string accountNumber)
        {
            Dictionary <string, decimal> marketValues = new Dictionary <string, decimal>();
            Dictionary <string, Int32>   orderIds     = new Dictionary <string, Int32>();

            SetHeaders(Token);

            // retrieve current values
            string  reply   = Web.DownloadString("https://api.tastyworks.com/margin/accounts/" + accountNumber);
            JObject package = JObject.Parse(reply);

            List <JToken> list = package["data"]["underlyings"].Children().ToList();

            foreach (JToken item in list)
            {
                // capture the value of all of the options plus the underlaying
                JToken prices = item["marks"];
                foreach (JProperty price in prices)
                {
                    if (!marketValues.ContainsKey(price.Name))
                    {
                        marketValues.Add(price.Name, Convert.ToDecimal(price.Value));
                    }
                }

                // capture any orders associated with the underlying
                string symbol = item["underlying-symbol"].ToString();
                JToken orders = item["order-ids"];
                for (int i = 0; i < orders.Count(); i++)
                {
                    if (!orderIds.ContainsKey(symbol))
                    {
                        Int32 order = Convert.ToInt32(orders[i]);
                        orderIds.Add(symbol, order);
                    }
                }
            }

            SetHeaders(Token); // reset, lost after previous call

            // retrieve specific positions
            reply   = Web.DownloadString("https://api.tastyworks.com/accounts/" + accountNumber + "/positions");
            package = JObject.Parse(reply);

            TWPositions returnList = new TWPositions();

            list = package["data"]["items"].Children().ToList();

            foreach (JToken item in list)
            {
                TWPosition inst = new TWPosition();
                inst.Symbol       = item["underlying-symbol"].ToString();
                inst.OptionSymbol = item["symbol"].ToString();
                inst.Quantity     = Convert.ToDecimal(item["quantity"]);
                if (item["quantity-direction"].ToString() == "Short")
                {
                    inst.Quantity *= -1;
                }
                DateTime exp = Convert.ToDateTime(item["expires-at"]).Trim(TimeSpan.TicksPerDay);
                inst.PreviousClose = Convert.ToDecimal(item["close-price"]);
                if (inst.PreviousClose == 0)
                {
                    inst.PreviousClose = Convert.ToDecimal(item["average-open-price"]);
                }

                inst.Multiplier = Convert.ToDecimal(item["multiplier"]);;
                if (marketValues.ContainsKey(inst.OptionSymbol))
                {
                    inst.Market = marketValues[inst.OptionSymbol] * inst.Multiplier;
                }
                if (marketValues.ContainsKey(inst.Symbol))
                {
                    inst.UnderlyingPrice = marketValues[inst.Symbol];
                }

                inst.OrderActive = orderIds.ContainsKey(inst.Symbol);

                SymbolDecoder symbol = new SymbolDecoder(inst.OptionSymbol, item["instrument-type"].ToString());
                inst.Type    = symbol.Type;
                inst.ExpDate = symbol.Expiration;
                inst.Strike  = symbol.Strike;

                returnList.Add(inst.OptionSymbol.Length > 0 ? inst.OptionSymbol : inst.Symbol, inst);
            }


            return((returnList.Count > 0) ? returnList : null);
        }