Overall Statistics
Total Trades
0
Average Win
0%
Average Loss
0%
Compounding Annual Return
0%
Drawdown
0%
Expectancy
0
Net Profit
0%
Sharpe Ratio
0
Loss Rate
0%
Win Rate
0%
Profit-Loss Ratio
0
Alpha
0
Beta
0
Annual Standard Deviation
0
Annual Variance
0
Information Ratio
0
Tracking Error
0
Treynor Ratio
0
Total Fees
$0.00
namespace QuantConnect
{
    public partial class BootCampTask : QCAlgorithm
    {
    	private struct _tradeInfo
        {
            public decimal stopLimit;
            public bool isShort;
            public TradeBar tradeBar;
        }
        
        private Dictionary<string, TradeBar> MyStocks = new Dictionary<string, TradeBar>();
        private string[] _stocks = new string[] { "TSLA", "AMD", "BAC", "SYMC", "HP" };
    	
        public override void Initialize()
        {
            SetStartDate(2017, 1, 1);
            SetEndDate(2019, 8, 1);
            SetCash(10000);
            AddEquity("SPY", Resolution.Minute);
            
            for(int i = 0; i < _stocks.Length; i++)
            {
                AddEquity(_stocks[i], Resolution.Minute);
                MyStocks.Add(_stocks[i], null);
                Consolidate(_stocks[i], TimeSpan.FromMinutes(30), OnDataConsolidation);
            }
            
            Schedule.On(DateRules.EveryDay(), TimeRules.At(13,30), CloseAllPositions);
        }
        
        private void OnDataConsolidation(TradeBar bar)
        {
            if(bar.Time.Hour == 9 && bar.Time.Minute == 30)
            {
                MyStocks[bar.Symbol] = bar;
            }
        }
        
        private void CloseAllPositions()
        {
        	for(int i = 0; i < _stocks.Length; i++)
        	{
        		Liquidate(_stocks[i]);
        		MyStocks[_stocks[i]] = null;
        	}
        }
        
        private void ClosePosition(string symbol)
        {
        	Liquidate(symbol);
        	MyStocks[symbol] = null;
        }
        
        public override void OnData(Slice data)
        {
        	for(int i = 0; i < _stocks.Length; i++)
        	{
        		if(!Portfolio[_stocks[i]].Invested && MyStocks[_stocks[i]] != null)
        		{
        			if(data[_stocks[i]].Close > MyStocks[_stocks[i]].High)
        			{
        				SetHoldings(_stocks[i], 1/_stocks.Length);
        			}
        			
        			if(data[_stocks[i]].Close < MyStocks[_stocks[i]].Low)
        			{
	        			SetHoldings(_stocks[i], -1/_stocks.Length);
        			}
        		}
        	}
        }
    }
}
/*
 * QUANTCONNECT.COM - Democratizing Finance, Empowering Individuals.
 * Lean Algorithmic Trading Engine v2.0. Copyright 2014 QuantConnect Corporation.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 *
*/

using System;
using System.Collections.Generic;
using QuantConnect.Algorithm.Framework.Portfolio;

namespace QuantConnect.Algorithm.Framework.Risk
{
    /// <summary>
    /// Provides an implementation of <see cref="IRiskManagementModel"/> that limits the drawdown
    /// per holding to the specified percentage
    /// </summary>
    public class MaximumDrawdownPercentPerSecurity : RiskManagementModel
    {
        private readonly decimal _maximumDrawdownPercent;

        /// <summary>
        /// Initializes a new instance of the <see cref="MaximumDrawdownPercentPerSecurity"/> class
        /// </summary>
        /// <param name="maximumDrawdownPercent">The maximum percentage drawdown allowed for any single security holding,
        /// defaults to 5% drawdown per security</param>
        public MaximumDrawdownPercentPerSecurity(
            decimal maximumDrawdownPercent = 0.04m
            )
        {
            _maximumDrawdownPercent = -Math.Abs(maximumDrawdownPercent);
        }

        /// <summary>
        /// Manages the algorithm's risk at each time step
        /// </summary>
        /// <param name="algorithm">The algorithm instance</param>
        /// <param name="targets">The current portfolio targets to be assessed for risk</param>
        public override IEnumerable<IPortfolioTarget> ManageRisk(QCAlgorithm algorithm, IPortfolioTarget[] targets)
        {
            foreach (var kvp in algorithm.Securities)
            {
                var security = kvp.Value;

                if (!security.Invested)
                {
                    continue;
                }

                var pnl = security.Holdings.UnrealizedProfitPercent;
                if (pnl < _maximumDrawdownPercent)
                {
                    // liquidate
                    yield return new PortfolioTarget(security.Symbol, 0);
                }
            }
        }
    }
}