Overall Statistics |
Total Trades 802 Average Win 0.24% Average Loss -0.01% Compounding Annual Return 6.039% Drawdown 38.700% Expectancy 25.749 Net Profit 92.330% Sharpe Ratio 0.436 Loss Rate 9% Win Rate 91% Profit-Loss Ratio 28.40 Alpha 0.072 Beta 0.604 Annual Standard Deviation 0.165 Annual Variance 0.027 Information Ratio 0.439 Tracking Error 0.165 Treynor Ratio 0.119 Total Fees $802.86 |
using System.Drawing; // for Color namespace QuantConnect { public class Teststochnoloss : QCAlgorithm { private int _kPeriod = 14; private int _dPeriod = 3; private int _overBought = 20; //a optimiser private decimal _targetProfit = 0.01m; //0.02m=0.2% //Target profit for strategy. When achieve this exit. private decimal _weight = 0m; private Dictionary<Symbol, Stochastic> _sto = new Dictionary<Symbol, Stochastic>(); private Dictionary<Symbol, decimal> _targetPrice = new Dictionary<Symbol, decimal>(); public override void Initialize() { SetStartDate(2006, 1, 16); SetCash(10000); // Cash allocation //SetBenchmark("AAPL"); // Customize benchmark SetWarmup(20); // Warmup for the stochastic //ini broker model SetBrokerageModel(BrokerageName.InteractiveBrokersBrokerage, AccountType.Cash); foreach(var ticker in "IRBT,JLL,HAIN,DIS".Split(',')) //IRBT,JLL,HAIN,DIS { // Subscribe the ticker with resolution higher than 30 min (minute, for example) AddSecurity(SecurityType.Equity, ticker, Resolution.Minute,true,1,false); //AddSecurity(SecurityType.Equity, ticker, Resolution.Minute); //security.SetLeverage(1m); //- Create consolidators: var consolidator = new TradeBarConsolidator(TimeSpan.FromMinutes(30)); // Create indicator var sto = new Stochastic("STO_" + ticker, 14, _kPeriod, _dPeriod); // Add indicator to a dictionary to later reference _sto.Add(ticker, sto); _targetPrice.Add(ticker, 0m); // Register indicator for automatic updates at consolidator frequency RegisterIndicator(ticker, sto, consolidator); // Subscribe consolidator to this ticker. SubscriptionManager.AddConsolidator(ticker, consolidator); // consolidator.DataConsolidated += OnConsolidorData; var plotter = new Chart(ticker); plotter.AddSeries(new Series("D", SeriesType.Line, " ",Color.Red)); plotter.AddSeries(new Series("K", SeriesType.Line, " ",Color.Blue)); plotter.AddSeries(new Series("Over Bought", SeriesType.Line, " ",Color.Black)); plotter.AddSeries(new Series("Buy", SeriesType.Scatter, index:0)); plotter.AddSeries(new Series("Sell", SeriesType.Scatter, index:0));// sur graph plot pas rouge AddChart(plotter); } _weight = 1m / Securities.Count; } public void OnData(TradeBars data) { if (IsWarmingUp) return; foreach (var bar in data.Values) { var close = bar.Close; var symbol = bar.Symbol; if (!Portfolio[symbol].Invested) { var sto = _sto[symbol]; if (!sto.IsReady) continue; if (sto.StochK > sto.StochD && sto.StochD < _overBought) { SetHoldings(symbol, _weight); } } else { if (close >= _targetPrice[symbol]) { Liquidate(symbol); } } } } // Every 30 minutes data arrives here public void OnConsolidorData(object s, TradeBar bar) { var sto = _sto[bar.Symbol]; Plot(bar.Symbol, "Price", bar.Close); Plot(bar.Symbol,"D", sto.StochD); Plot(bar.Symbol,"K", sto.StochD); Plot(bar.Symbol,"Over Bought", _overBought); } public override void OnOrderEvent(OrderEvent orderEvent) { if (orderEvent.Status == OrderStatus.Filled) { var symbol = orderEvent.Symbol; var price = orderEvent.FillPrice; if (orderEvent.Direction == OrderDirection.Buy) { _targetPrice[symbol] = price * (1 + _targetProfit); Plot(symbol, "Buy", price); Log(string.Format("{0} -> Buy {1} for {2}, target at {3}", Time.ToString("Y"), symbol, price, _targetPrice[symbol])); } if (orderEvent.Direction == OrderDirection.Sell) { Plot(symbol, "Sell", price); } } } } }