Overall Statistics |
Total Trades 2 Average Win 2.91% Average Loss 0% Compounding Annual Return 155.636% Drawdown 0.700% Expectancy 0 Net Profit 2.913% Sharpe Ratio 4.583 Loss Rate 0% Win Rate 100% Profit-Loss Ratio 0 Alpha 0.635 Beta -0.079 Annual Standard Deviation 0.133 Annual Variance 0.018 Information Ratio 1.883 Tracking Error 0.171 Treynor Ratio -7.741 Total Fees $2.00 |
using System; using QuantConnect.Securities; using QuantConnect.Orders.Fees; using QuantConnect.Notifications; using QuantConnect.Orders; using QuantConnect.Data.Market; using QuantConnect.Packets; using QuantConnect.Util; using System.Reflection; using QuantConnect.Scheduling; namespace QuantConnect { public class BasicTemplateAlgorithm : QCAlgorithm { string symbol = "IMI"; int _quantity; decimal _pct; decimal _stopPct; bool trigger = false; bool first = true; bool notif = true; static string globalString; static decimal _globalSkim; static decimal timeFrame; static decimal _symPrice; static readonly decimal EqualWeightPercentage = 1m/3; //DateTime lastTradeTime; //DateTime dayTime; //bool boolstate = false; public override void Initialize() { SetBrokerageModel(BrokerageName.TradierBrokerage, AccountType.Cash); //set date for backtesting SetStartDate(2016, 03, 7); SetEndDate(DateTime.Now.Date.AddDays(-1)); SetCash(2750); //returns five percent of investible cash var fivePct = Portfolio.Cash/3 * .025m; var threePct = Portfolio.Cash/3 * .03m; //set global variable from local variable _pct = threePct; //set stop percentage equal to one third of cash minus previous value _stopPct = Portfolio.Cash/3 - fivePct; AddSecurity(SecurityType.Equity, symbol, Resolution.Second, fillDataForward: true, extendedMarketHours: false, leverage: 1); //Plot(symbol, 30); //resolution time frame consolidation AKA: turns our second resolution into minutes TradeBarConsolidator consolidator = new TradeBarConsolidator(TimeSpan.FromMinutes(1)); consolidator.DataConsolidated += MinHandler; SubscriptionManager.AddConsolidator(symbol, consolidator); /*TradeBarConsolidator dayconsolidator = new TradeBarConsolidator(TimeSpan.FromDays(1)); dayconsolidator.DataConsolidated += DayHandler; SubscriptionManager.AddConsolidator(symbol, dayconsolidator);*/ } public void MinHandler(object sender, TradeBar data) { // handle each minute here if (_symPrice > timeFrame) { timeFrame = data.High; //Log("" + timeFrame); } } /*public Maximum MAX(Symbol symbol) { var maxi = symbol.Price; return; }*/ /*} public void DayHandler(object sender, TradeBar data) { // handle day data //lastTradeTime = data.Time; }*/ public void OnData(TradeBars data) { /*if (Time - lastTradeTime.Date < TimeSpan.FromDays(1)); { //only trade once a day at market open return; } Log("" + Time);*/ var hi = data[symbol].High; Log("" + hi); TimeSpan elapsedTime = new TimeSpan(0,3,0); Schedule.Event() .EveryDay(symbol) .Every(elapsedTime) .Run(() => { Notify.Sms("+15126454560", "Update " + globalString); }); // update high price every minute var highPrice = _quantity * timeFrame; var newStopLoss = highPrice * .03m; var newStopLosss = newStopLoss * .10m; var highPriceStop = newStopLoss - newStopLosss; var currentPriceStop = _globalSkim *.03m; var symPrice = data[symbol].Price; _symPrice = symPrice; var readableProfits = Portfolio.TotalUnrealizedProfit; var time = DateTime.Now; string messageString = String.Format("{0} \nTime: {1} \nPrice: {2} \nProfit: {3} \nHigh {4}", symbol, time.ToShortTimeString(), symPrice.ToString(), readableProfits, timeFrame.ToString()); //Decimal.ToInt32(readableProfits)); globalString = messageString; //int quantity = (int)Math.Floor(Portfolio.Cash / data[symbol].Close / 3); var equalWeightedPorfolioSize = Portfolio.TotalPortfolioValue/3; var shareCount = CalculateOrderQuantity(symbol, EqualWeightPercentage); if (first) { first = false; Order(symbol, shareCount, tag: "Order Target Value: $" + Math.Round(equalWeightedPorfolioSize, 2)); Notify.Sms("+15126454560", "Buy " + messageString); } var holdings = Portfolio[symbol].Quantity; _quantity = holdings; var skimProfits = holdings * symPrice; _globalSkim = skimProfits; if (Portfolio.HoldStock) { // set trigger equal to true if profits are greater than 3 percent of invested portfolio cash if (readableProfits > _pct) { trigger = true; //Order(symbol, -_quantity); if(notif) { notif = false; Notify.Sms("+15126454560", "The trigger price has been reached!" + globalString); } } //sell if profits go below high profit stop if (trigger == true && currentPriceStop < highPriceStop) { Notify.Sms("+15126454560", "Gain Sell " + globalString); //Log("h" + highPriceStop); //Log("c" + currentPriceStop); Order(symbol, -_quantity); } // sell if profits go below 5% invested portfolio cash if (_globalSkim < _stopPct) { Notify.Sms("+15126454560", "Loss Sell " + globalString); Order(symbol, -_quantity); } // sell on close Schedule.Event() .EveryDay(symbol) .BeforeMarketClose(symbol, 1) .Run(() => { Notify.Sms("+15126454560", "End Of Day Sell " + globalString); Order(symbol, -_quantity); }); } } } }