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 |
using System; using System.Collections; using System.Collections.Generic; using QuantConnect.Scheduling; using QuantConnect.Securities; using NodaTime; using QuantConnect.Data; using QuantConnect.Data.Market; using QuantConnect.Models; using System.ComponentModel; using System.Diagnostics; using System.Drawing; using System.Drawing.Drawing2D; namespace QuantConnect { public class RolloverTest : QCAlgorithm { #region Variables // Symbol symbol = QuantConnect.Symbol .Create("EURUSD", SecurityType.Forex, Market.Oanda); // private int candlesBack = 30; // Default setting for CandlesBack private int rSIPeriod = 21; // Default setting for RSIPeriod private int momentumPeriod = 20; // Default setting for MomentumPeriod private decimal firstTradeLots = 1M; // Default setting for FirstTradeLots private decimal secondTradeLots = 3M; // Default setting for SecondTradeLots private int pipsToTrade2 = 20; // Default setting for PipsToTrade2 private decimal firstTradeProfitDollars = 1.000M; // Default setting for FirstTradeProfitDollars private decimal secondTradeProfitDollars = 1.000M; // Default setting for SecondTradeProfitDollars private decimal stopLossInDollars = 0M; private bool breakEven = false; private decimal breakEvenAtProfit = 50M; // User defined variables (add any user defined variables below) private RelativeStrengthIndex _rsi; private Momentum _mom; private RollingWindow<int> mp, cc; public RollingWindow<IndicatorDataPoint> _rsiwindow; public RollingWindow<IndicatorDataPoint> _momwindow; RollingWindow<QuoteBar> _datawindow; // public DateTime myTime0, myTime1, theTime; // private int lastKDS = 0, lastKDB = 0, tradesTotal = 0; private decimal priceForSecond = 0, profits = 0; private bool _breakEven = false, buysNotAllowed = false, sellsNotAllowed = false; private string orderType = ""; // int CurrentBar = 0; int LastBar = 0; decimal TickSize = 0.0001M; #endregion public override void Initialize() { //Initialize SetStartDate(2013, 1, 1); SetEndDate(2014, 12, 31); SetCash(25000); // var forex = AddForex(symbol,Resolution.Minute); // var pipette = Securities[symbol].SymbolProperties.MinimumPriceVariation; // pipetteEURUSD is 0.00001 // pipetteUSDJPY is 0.001 TickSize = pipette*10M; firstTradeLots = firstTradeLots*(int)Securities[symbol].SymbolProperties.LotSize; secondTradeLots = secondTradeLots*(int)Securities[symbol].SymbolProperties.LotSize; // _rsi = RSI(symbol, rSIPeriod, MovingAverageType.Simple, Resolution.Minute); _mom = MOM(symbol, momentumPeriod, Resolution.Minute); // _rsiwindow = new RollingWindow<IndicatorDataPoint>(candlesBack); _momwindow = new RollingWindow<IndicatorDataPoint>(candlesBack); _datawindow = new RollingWindow<QuoteBar>(candlesBack); // // Here is where the RollingWindow is updated with the latest observation. _rsi.Updated += (object sender, IndicatorDataPoint updated) => { _rsiwindow.Add(updated); }; // // Here is where the RollingWindow is updated with the latest observation. _mom.Updated += (object sender, IndicatorDataPoint updated) => { _momwindow.Add(updated); }; // mp = new RollingWindow<int>(candlesBack); cc = new RollingWindow<int>(candlesBack); // myTime0 = new DateTime(0); myTime1 = new DateTime(0); theTime = new DateTime(0); // Name = ""; // } private void OnData(TradeBars data) { if (!_rsiwindow.IsReady) return; if (!_momwindow.IsReady) return; if(!_datawindow.IsReady) return; // TradeBar SymbolTradebar = data[symbol]; // mp[0] = Portfolio[symbol].IsLong ? 1 : Portfolio[symbol].IsShort ? -1 : 0; cc[0] = Portfolio[symbol].Quantity; // myTime1 = myTime0; myTime0 = data[symbol].Time; // profits = Portfolio.TotalUnrealizedProfit; // LastBar = CurrentBar; CurrentBar++; // if (CurrentBar<candlesBack+10) return; // if (mp[0]>0) { if (mp[1]<1 || cc[1]<cc[0]) tradesTotal++; priceForSecond = Securities[symbol].Holdings.AveragePrice-pipsToTrade2*TickSize; } else if (mp[0]<0) { if (mp[1]>-1 || cc[1]<cc[0]) tradesTotal++; priceForSecond = Securities[symbol].Holdings.AveragePrice+pipsToTrade2*TickSize; } // if (tradesTotal==0) { _breakEven = false; orderType = "BuySell"; } else if (tradesTotal==1 && profits>=firstTradeProfitDollars) { CloseAllTrades(); _breakEven = false; tradesTotal = 0; orderType = "BuySell"; theTime = myTime1; } else if (tradesTotal==2 && profits>=secondTradeProfitDollars) { CloseAllTrades(); _breakEven = false; tradesTotal = 0; orderType = "BuySell"; theTime = myTime1; } // if (stopLossInDollars>0 && tradesTotal>0 && profits<=-stopLossInDollars) { CloseAllTrades(); _breakEven = false; tradesTotal = 0; orderType = "BuySell"; theTime = myTime1; } // if (breakEven && !_breakEven && profits>=breakEvenAtProfit) _breakEven = true; // if (_breakEven && profits<=0) { CloseAllTrades(); _breakEven = false; tradesTotal = 0; orderType = "BuySell"; theTime = myTime1; } // if (tradesTotal<2) { if (theTime<myTime1) { if (!buysNotAllowed && ((orderType=="BuySell" && tradesTotal==0) || (orderType=="Buy" && tradesTotal==1 && data[symbol].Close<=priceForSecond)) && RSIBuyCheck(1, SymbolTradebar)) OpenTrade("Buy", data[symbol].Close); if (!sellsNotAllowed && ((orderType=="BuySell" && tradesTotal==0) || (orderType=="Sell" && tradesTotal==1 && data[symbol].Close>=priceForSecond)) && RSISellCheck(1, SymbolTradebar)) OpenTrade("Sell", data[symbol].Close); theTime = myTime1; } } } private void OpenTrade(string type, decimal Close) { int lots = (int)firstTradeLots; // if (tradesTotal==1) lots = (int)secondTradeLots; // if (type=="Buy") { MarketOrder(symbol, lots); priceForSecond = Close-pipsToTrade2*TickSize; orderType = "Buy"; } else if (type=="Sell") { MarketOrder(symbol, -lots); priceForSecond = Close+pipsToTrade2*TickSize; orderType = "Sell"; } } private void CloseAllTrades() { Liquidate(symbol); } private bool RSIBuyCheck(int loc, TradeBar data) { decimal rsiMain = _rsiwindow[loc]; int s; bool ob; decimal mom1; decimal mom2; // if (rsiMain>50) return false; for (int x=loc;x<=loc+2;x++) { if (_datawindow[x].Low<_datawindow[loc].Low) return false; } for (int x=loc+4;x<loc+candlesBack;x++) { if (_datawindow[x].Low<_datawindow[loc].Low) break; s = x; for (int y=x-2;y<=x+2;y++) { if (_datawindow[y].Low<_datawindow[x].Low) { x++; break; } } if (s!=x) { x--; continue; } ob = false; for (int y=loc;y<=x;y++) { if (_rsiwindow[y]<30) { ob=true; break; } } if (!ob) continue; mom1=_momwindow[loc]; mom2=_momwindow[x]; if (mom1<mom2) continue; lastKDB = x; return true; } return false; } private bool RSISellCheck(int loc, TradeBar data) { decimal rsiMain = _rsiwindow[loc]; int s; bool ob; decimal mom1; decimal mom2; // if (rsiMain<50) return false; // for (int x=loc;x<=loc+2;x++) { if (_datawindow[x].High>_datawindow[loc].High) return false; } // for (int x=loc+4;x<loc+candlesBack;x++) { if (_datawindow[x].High>_datawindow[loc].High) break; s = x; for (int y=x-2;y<=x+2;y++) { if (_datawindow[y].High>_datawindow[x].High) { x++; break; } } if (s!=x) { x--; continue; } ob = false; for (int y=loc;y<=x;y++) { if (_rsiwindow[y]>70) { ob=true; break; } } if (!ob) continue; mom1=_momwindow[loc]; mom2=_momwindow[x]; if (mom1>mom2) continue; lastKDS = x; return true; } return false; } private double ToJulianDate(DateTime date) { return date.ToOADate() + 2415018.5; } #region Properties #endregion } }