Hi Everyone!
Why on added securities I'm getting securities with price = 0 ?
It makes my algorithm divide by zero.
Do I do something wrong?
Thanks!
namespace QuantConnect.Algorithm.CSharp
{
public class PStocks : QCAlgorithm
{
//Vars
SecurityChanges _changes = SecurityChanges.None;
//---------------------------------------------------------------------
//Current Stop Loss & Take Profit Orders
//List<SL_Order> _orders;
//---------------------------------------------------------------------
//Const Vars
const decimal _cash = 10000;
const Resolution _res = Resolution.Hour;
const int _stopLossPercent = 1;
const int _takeProfitPercent = 2;
const int _numberOfSymbols = 10;
const decimal _priceLimit = 10;
//---------------------------------------------------------------------
public override void Initialize()
{
SetStartDate(2010, 1, 1);
SetEndDate(2010, 7, 1);
SetCash(_cash);
//_orders = new List<SL_Order>(_numberOfSymbols);
UniverseSettings.Resolution = _res;
UniverseSettings.Leverage = 1m;
AddUniverse(CoarseSelectionFilter);
}
public void OnData(TradeBars data)
{
if(_changes == SecurityChanges.None) return;
var cashPerSymbol = (int)Math.Floor(Portfolio.Cash * 0.9m) / _numberOfSymbols;
foreach (var security in _changes.RemovedSecurities)
{
if (security.Invested)
{
Liquidate(security.Symbol);
}
}
foreach (var security in _changes.AddedSecurities)
{
var symbol = security.Symbol;
var currentPrice = security.Close;
Debug($"Security Symbol: {symbol}, Price: {currentPrice}");
var shares = (int)Math.Floor(cashPerSymbol / currentPrice);
var StopLimitOrderID = StopLimitOrder(symbol, shares, currentPrice - (currentPrice * _stopLossPercent / 100), currentPrice + (currentPrice * _takeProfitPercent / 100));
//_orders.Add(new SL_Order(StopLimitOrderID));
}
_changes = SecurityChanges.None;
}
public IEnumerable<Symbol> CoarseSelectionFilter(IEnumerable<CoarseFundamental> coarse)
{
var sortedByDollarVolume = coarse.OrderByDescending(x => x.DollarVolume);
var top = sortedByDollarVolume.Where(x => x.Price < _priceLimit).Take(_numberOfSymbols);
return top.Select(x => x.Symbol);
}
public override void OnSecuritiesChanged(SecurityChanges changes)
{
_changes = changes;
Log($"OnSecuritiesChanged({UtcTime:o}):: {changes}");
}
public override void OnOrderEvent(OrderEvent fill)
{
Log($"OnOrderEvent({UtcTime:o}):: {fill}");
}
public override void OnEndOfDay()
{
}
}
}