Overall Statistics
/*
* TODO dont reload data for first minutes if same contract?
 *
*/

using System;
using System.Collections.Generic;
using System.Linq;
using QuantConnect.Brokerages;
using QuantConnect.Data;
using QuantConnect.Data.Market;
using QuantConnect.Indicators;
using QuantConnect.Orders;
using QuantConnect.Securities;

namespace QuantConnect.Algorithm.CSharp
{
    /// <summary>
    /// in up trend, plays BB20 rebound
    /// we exit all at 2BB top
    /// we exit half at 1std up
    /// we stop at trailing pull level once profit taken(running lower band or mid band)
    /// we stop at pull level before

    /// once profit taken, exit logic is we go back below one of the thresholds 2std
    /// stop loss logic is once a threshold(u, m, d) is crossed we set it to 1std below threshold

    /// </summary>
    public class AaPullbackFx : QCAlgorithm
    {
        Security _contract = null;

        private decimal _stopLoss = 0;
        private int _trade_count = 0;
        private decimal _portfolio_ref_value = 100000;

		
		private string SYMBOL = "EURUSD";
		
        public override void Initialize()
        {
            SetBrokerageModel(BrokerageName.InteractiveBrokersBrokerage, AccountType.Margin);
            SetStartDate(year:2017, month:9, day:6);
            SetEndDate(year: 2017, month: 9, day: 10);
            
            SetCash(_portfolio_ref_value);
            _contract = AddSecurity(SecurityType.Forex, SYMBOL, Resolution.Minute);
           
        }

        public override void OnData(Slice slice)
        {
            var tickSize = Securities[SYMBOL].SymbolProperties.MinimumPriceVariation;
            var cBar = slice.Bars[SYMBOL];
			Log("bar - H: " + cBar.High.ToString("#.00000") + "  L: " + cBar.Low.ToString("#.00000") + " C: " + cBar.Close.ToString("#.00000"));

            if (!Portfolio.Invested && _trade_count == 0)
            {
                //Log("Pullback recovery trigger: price @ " + futureBar.Close.ToString("#.00000") + " BBD @ " + _bdown[1].ToString("#.00000") + " - std @" + std.ToString("#.00000") );
                SetHoldings(SYMBOL, 1);
                _trade_count++;
                
                _stopLoss = 1.1908m;
                Log("Buying: Price is @ " + cBar.Close.ToString("#.00000") + " STOP is @ " + _stopLoss.ToString("#.00000") );
            }
            
            //we wait for all orders to be filled
            if (Portfolio[Securities[SYMBOL].Symbol].Quantity>0 && Transactions.GetOpenOrders().Count == 0)
            {
            	
                var orders = Transactions.GetOpenOrders(SYMBOL);
                if (orders.Count == 0)
                {
                    decimal qty = Portfolio[SYMBOL].Quantity;
                    Log("Setting stop loss @ " + _stopLoss.ToString());
                    StopMarketOrder(SYMBOL, -qty, _stopLoss);
                }
            }
        }

        public override void OnEndOfDay()
        {
            //Plot("Indicator Signal", "EOD", IsDownTrend ? -1 : IsUpTrend ? 1 : 0);
            Log("EOD***********************");
            _portfolio_ref_value = Portfolio.TotalPortfolioValue;
        }

        public override void OnOrderEvent(OrderEvent orderEvent)
        {
            var order = Transactions.GetOrderById(orderEvent.OrderId);
            string msg = "OrderEvent: " + order.Status.ToString() + ": " + order.Direction.ToString() + " " + order.Quantity.ToString("#.0") + " " + order.Symbol;
            if (order.Type == OrderType.StopMarket)
            {
                var o = ((QuantConnect.Orders.StopMarketOrder) order);
                msg += " - STOP @ " + o.StopPrice.ToString("#.00000");                
            }
            else if (order.Type == OrderType.Market)
            {
                
            }
            else if (order.Type == OrderType.Limit)
            {
                var o = ((QuantConnect.Orders.LimitOrder)order);
                msg += " - LIMIT @ " + o.LimitPrice.ToString("#.00000");
            }
            if (order.Status == OrderStatus.Filled)
            {
            	msg += " - filled @ " + order.Price.ToString("#.00000");
            }
            Log(msg);
        }
    }
}