public async void CallApi() { var limit = 1; var queryParams = new BarSetRequest(Symbols, TimeFrame.FiveMinutes) { Limit = limit }; try { var bars = await AlpacaDataClient.GetBarSetAsync(queryParams); foreach (var candles in bars) { var pair = new KeyValuePair <string, IAgg>(candles.Key, candles.Value.FirstOrDefault()); IAgg agg = pair.Value; RefreshResult.AddOrUpdate(pair.Key, agg, (key, agg) => { return(agg); }); //pair.Key = candles.Key; //UpdateDictionary(pair); //var loop = candles; //var list = loop.ToKeyValuePairs().ToList(); //foreach (var item in list) //{ // var testvar = item;//RefreshResult = //} } } catch (Exception exc) { Logger.Info(exc.ToString()); } }
public IJoinedAgg(IAgg <Signal, R1> agg1, IAgg <Signal, R2> agg2, Func <R1, R2, R> resultSelector) : base(new JoinedAggState <R1, R2, R>( agg1.InitialState().Compile()(), agg2.InitialState().Compile()(), resultSelector ) ) { }
public void CheckRefreshResults(ConcurrentDictionary <string, IAgg> results) { var stringList = StringList; foreach (var element in stringList) { IAgg refreshBar = null; var found = results.TryGetValue(element, out refreshBar); if (found) { CompareNewBar(refreshBar, element); } } }
public async void CompareNewBar(IAgg bar, string symbol) { var id = StockList.Where(e => e.Symbol == symbol).Select(e => e.Id).FirstOrDefault(); var itemFlags = ActiveList.Where(e => e.SymbolId == id).ToList(); foreach (var item in itemFlags) { if (item.IsActive == "Y") { if (item.ExpirationDate >= DateTime.Now) { if (item.ComparisonType == "GreaterThan") { if (item.AlertPrice >= bar.Close) { var xx = item.BuySellFlag; var emailList = await GetUserEmails(); EmailEngine.SendTradeAlert(emailList); //send alert, //remove active flag in table, ActiveList.Remove(item); } } else if (item.ComparisonType == "LessThan") { if (item.AlertPrice <= bar.Close) { ActiveList.Remove(item); } } } else { //send tracker expired email, //update active flag ActiveList.Remove(item); } } else { ActiveList.Remove(item); } } }
public override async Task Perform(IAgg agg, IAccount account, IPosition position, ITrader trader) { if (_closed) { return; } if (agg.Time.AddMinutes(15) > _closingTime) { // market is closing, liquidate our positions and reset data Console.WriteLine("Market closing soon, closing positions..."); if (_lastOrder != null) { await _lastOrder.DeleteAsync(); } if (position.Quantity > 0) { await trader.SubmitOrderAsync(position.Quantity, null, OrderSide.Sell); } else { await trader.SubmitOrderAsync(-1 *position.Quantity, null, OrderSide.Buy); } _closingPrices.Clear(); _closed = true; return; } _closingPrices.Add(agg.Close); if (_closingPrices.Count <= 20) { Console.WriteLine($"Waiting for more data ({_closingPrices.Count} of 20)"); return; } _closingPrices.RemoveAt(0); decimal avg = _closingPrices.Average(); decimal diff = avg - agg.Close; // cancel the last order to ensure we don't have long and short orders // open at the same time (if the order already fulfilled, delete does nothing) if (_lastOrder != null) { await _lastOrder.DeleteAsync(); } // Make sure we know how much we should spend on our position. var buyingPower = account.BuyingPower; var equity = account.Equity; long multiplier = account.Multiplier; // Check how much we currently have in this position. int positionQuantity = position?.Quantity ?? 0; decimal positionValue = position?.MarketValue ?? 0; if (diff <= 0) { Console.WriteLine($"Price is above average; we want to short. (diff == {diff:C2})"); if (positionQuantity > 0) { // There is an existing long position we need to dispose of first Console.WriteLine($"Removing {positionValue:C2} long position."); _lastOrder = await trader.SubmitOrderAsync(positionQuantity, agg.Close, OrderSide.Sell); } else { // Allocate a percent of portfolio to short position decimal portfolioShare = -1 * diff / agg.Close * Scale; decimal targetPositionValue = -1 * equity * multiplier * portfolioShare; decimal amountToShort = targetPositionValue - positionValue; Console.WriteLine($"Target position: {targetPositionValue:C2}"); if (amountToShort < 0) { // We want to expand our existing short position. amountToShort *= -1; if (amountToShort > buyingPower) { amountToShort = buyingPower; } int qty = (int)(amountToShort / agg.Close); Console.WriteLine($"Adding {qty * agg.Close:C2} to short position."); _lastOrder = await trader.SubmitOrderAsync(qty, agg.Close, OrderSide.Sell); } else { // We want to shrink our existing short position. int qty = (int)(amountToShort / agg.Close); if (qty > -1 * positionQuantity) { qty = -1 * positionQuantity; } Console.WriteLine($"Removing {qty * agg.Close:C2} from short position"); _lastOrder = await trader.SubmitOrderAsync(qty, agg.Close, OrderSide.Buy); } } } else { Console.WriteLine($"Price is below average; we want to go long. (diff == {diff:C2})"); // Allocate a percent of our portfolio to long position. decimal portfolioShare = diff / agg.Close * Scale; decimal targetPositionValue = equity * multiplier * portfolioShare; decimal amountToLong = targetPositionValue - positionValue; Console.WriteLine($"Target position: {targetPositionValue:C2}"); if (positionQuantity < 0) { // There is an existing short position we need to dispose of first Console.WriteLine($"Removing {positionValue:C2} short position."); _lastOrder = await trader.SubmitOrderAsync(positionQuantity * -1, agg.Close, OrderSide.Buy); } else if (amountToLong > 0) { // We want to expand our existing long position. if (amountToLong > buyingPower) { amountToLong = buyingPower; } int qty = (int)(amountToLong / agg.Close); _lastOrder = await trader.SubmitOrderAsync(qty, agg.Close, OrderSide.Buy); Console.WriteLine($"Adding {qty * agg.Close:C2} to long position."); } else { // We want to shrink our existing long position. amountToLong *= -1; int qty = (int)(amountToLong / agg.Close); if (qty > positionQuantity) { qty = positionQuantity; } _lastOrder = await trader.SubmitOrderAsync(qty, agg.Close, OrderSide.Sell); Console.WriteLine($"Removing {qty * agg.Close:C2} from long position"); } } }
public abstract Task Perform(IAgg agg, IAccount account, IPosition position, ITrader trader);