Overall Statistics |
Total Trades 2 Average Win 0% Average Loss 0% Compounding Annual Return -59.305% Drawdown 14.800% Expectancy 0 Net Profit 0% Sharpe Ratio -4.61 Loss Rate 0% Win Rate 0% Profit-Loss Ratio 0 Alpha -0.503 Beta -0.502 Annual Standard Deviation 0.129 Annual Variance 0.017 Information Ratio -4.506 Tracking Error 0.173 Treynor Ratio 1.187 Total Fees $4.00 |
using QuantConnect.Data.Consolidators; using QuantConnect.Data.Market; using QuantConnect.Indicators; using QuantConnect.Orders; using System; using System.Linq; namespace QuantConnect.Algorithm.CSharp { /// <summary> /// </summary> public class QCUMovingAverageCross : QCAlgorithm { int cnt = 0; const decimal tolerance = 0.00015m; private const string ticker = "EURUSD"; Symbol symbol; private ExponentialMovingAverage fast; private ExponentialMovingAverage slow; private AverageTrueRange atr; //private decimal price; //private OrderTicket orderLong = null; private OrderTicket orderShort = null; //private SimpleMovingAverage ma50; //private SimpleMovingAverage ma100; private SimpleMovingAverage ma100_h1; private SimpleMovingAverage ma100_m30; private SimpleMovingAverage ma100_m15; private SimpleMovingAverage ma50_m30; public override void Initialize() { // set up our analysis span SetStartDate(2016, 11, 01); SetEndDate(2016, 12, 01); SetCash(10000); symbol = AddForex(ticker, market: Market.Oanda).Symbol; //AddSecurity(SecurityType.Forex, ticker, Resolution.Minute); //price = Securities[ticker].Price; fast = EMA(symbol, 15, Resolution.Minute); slow = EMA(symbol, 50, Resolution.Hour); ma100_h1 = SMA(symbol, 100, Resolution.Hour); ma100_m15 = new SimpleMovingAverage(100); ma50_m30 = new SimpleMovingAverage(50); ma100_m30 = new SimpleMovingAverage(100); var fifteenMinuteConsolidator = new QuoteBarConsolidator(TimeSpan.FromMinutes(15)); SubscriptionManager.AddConsolidator(symbol, fifteenMinuteConsolidator); fifteenMinuteConsolidator.DataConsolidated += FifteenMinuteConsolidator_DataConsolidated; ; var thirtyMiutneConsolidator = new QuoteBarConsolidator(TimeSpan.FromMinutes(30)); SubscriptionManager.AddConsolidator(symbol, thirtyMiutneConsolidator); thirtyMiutneConsolidator.DataConsolidated += ThirtyMiutneConsolidator_DataConsolidated; ; atr = ATR(symbol, 450, MovingAverageType.Simple, Resolution.Minute); SetWarmUp(TimeSpan.FromDays(5)); } private void FifteenMinuteConsolidator_DataConsolidated(object sender, QuoteBar e) { ma100_m15.Update(new IndicatorDataPoint { Time = e.Time, Value = e.Value }); } private void ThirtyMiutneConsolidator_DataConsolidated(object sender, QuoteBar e) { ma50_m30.Update(new IndicatorDataPoint { Time = e.Time, Value = e.Value }); ma100_m30.Update(new IndicatorDataPoint { Time = e.Time, Value = e.Value }); } //private DateTime previous; public override void OnData(Slice data) { if (IsWarmingUp || !data.ContainsKey(symbol)) return; var qty = Portfolio[symbol].Quantity; //Debug("qty: " + qty); //price = Securities[ticker].Price; // define a small tolerance on our checks to avoid bouncing var atrLoss = atr * 0.3m; var atrProfit = atr * 0.15m; var stopLoss = Securities[symbol].Price - atrLoss; var takeProfit = Securities[symbol].Price + atrProfit; if (enterLong() && !Portfolio[symbol].Invested) { Debug("long symbol " + Securities[symbol].Price + " SL: " + stopLoss + " TP: " + takeProfit); var asd = StopLimitOrder(symbol, 10000, stopLoss, takeProfit, "test"); } /*if (enterShort()) { Debug("short symbol " + Securities[symbol].Price + " SL: " + stopLoss + " TP: " + takeProfit); orderShort = StopLimitOrder(symbol, -1000, stopLoss, takeProfit, "test"); }*/ // Here you can use LINQ to select the tickets you need. var openLongOrderTicket = Transactions.GetOrderTickets(o => o.Status == OrderStatus.Filled && o.Quantity > 0) .FirstOrDefault(); if (openLongOrderTicket != null) { var stopPrice = openLongOrderTicket.Get(OrderField.StopPrice); // Bug? //var newStopPrice = stopPrice; var newStopPrice = stopLoss; //decimal limitPrice = orderLong.Get(OrderField.LimitPrice); //var newLimitPrice = limitPrice; if (stopPrice > stopLoss) { Debug("Price: " + data[symbol].Price); openLongOrderTicket.Update(new UpdateOrderFields { StopPrice = newStopPrice }); Debug("orderLong modified - SL: " + newStopPrice); } // Liquidate(); } //previous = data.Time; cnt++; } public override void OnOrderEvent(OrderEvent orderEvent) { switch (orderEvent.Status) { case OrderStatus.New: break; case OrderStatus.Submitted: break; case OrderStatus.PartiallyFilled: break; case OrderStatus.Filled: break; case OrderStatus.Canceled: break; case OrderStatus.None: break; case OrderStatus.Invalid: break; case OrderStatus.CancelPending: break; default: break; } } public override void OnEndOfDay() { Log("EOD " + Time.ToShortDateString()); } private bool enterShort() { if (orderShort != null) return false; return true; } private bool enterLong() { var price = Securities[symbol].Price; if ((price > ma100_h1 * (1 + tolerance)) && (price > ma100_m30 * (1 + tolerance)) && (price > ma100_m15 * (1 + tolerance)) && (ma100_m30 > ma50_m30)) { return true; } return false; } } }