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); }
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); }