| Overall Statistics |
|
Total Trades 2 Average Win 0% Average Loss 0% Compounding Annual Return 3.532% Drawdown 0.000% Expectancy 0 Net Profit 0.076% Sharpe Ratio 7.648 Loss Rate 0% Win Rate 0% Profit-Loss Ratio 0 Alpha 0.023 Beta 0.005 Annual Standard Deviation 0.003 Annual Variance 0 Information Ratio -5.055 Tracking Error 0.052 Treynor Ratio 5.168 Total Fees $2.00 |
// MUD: Try moving average on % change. (sell what is in portfolio and has been over market for more than 2 weeks.)
// => And buy what is under market for more than 2 weeks
// Set to raw data for universe
// Try Dual Thrust algo on universe
using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Threading;
namespace QuantConnect.Algorithm.CSharp
{
/// <summary>
/// Tests different exit parameters from a list of trades entries
/// </summary>
public class TradeOptimization : QCAlgorithm
{
private SecurityChanges _changes = SecurityChanges.None;
private readonly Dictionary<DateTime, List<string>> _backtestSymbolsPerDay = new Dictionary<DateTime, List<string>>();
TradeBars _bars = new TradeBars();
/// <summary>
/// Initialise the data and resolution required, as well as the cash and start-end dates for your algorithm. All algorithms must initialized.
/// </summary>
public override void Initialize()
{
// this sets the resolution for data subscriptions added by our universe
UniverseSettings.Resolution = Resolution.Daily;
UniverseSettings.Leverage = 1m;
// set our start and end for backtest mode
SetStartDate(2017,10,26);
SetEndDate(2017,11,02);
SetBenchmark("SPY");
// Getting List of Trades from file on Dropbox
const string url = @"https://www.dropbox.com/s/hzcvez7zadktpwd/tradeoptimization.csv?dl=1";
using (var client = new WebClient())
{
// backtest - first cache the entire file
if (_backtestSymbolsPerDay.Count == 0)
{
// fetch the file from dropbox only if we haven't cached the result already
var file = client.DownloadString(url);
// split the file into lines and add to our cache
foreach (var line in file.Split(new[] { '\n', '\r' }, StringSplitOptions.RemoveEmptyEntries))
{
//All the values in the downloaded file are surrounded in quotes, the replace function strips out double quotes (") from the string.
var csv = line.Replace("\"","").Replace("/", "-").ToCsv();
Console.WriteLine("Date from csv: " + DateTime.ParseExact(csv[0], "M-d-yyyy", null));
Console.WriteLine("Symbol from csv: " + csv[1]);
DateTime date = DateTime.ParseExact(csv[0], "M-d-yyyy", CultureInfo.InvariantCulture);
var symbol = csv[1];
if (!_backtestSymbolsPerDay.ContainsKey(date)){
_backtestSymbolsPerDay[date] = new List<string>();
}
_backtestSymbolsPerDay[date].Add(symbol);
}
}
}
// define a new custom universe that will trigger each day at midnight
AddUniverse("my-dropbox-universe", Resolution.Daily, dateTime =>
{
List<string> result;
if (_backtestSymbolsPerDay.TryGetValue(dateTime, out result))
{
Console.WriteLine(Time.Date + " - Result (" + dateTime.Date + "):" + result[0]);
foreach (DateTime keys in _backtestSymbolsPerDay.Keys){
Console.WriteLine("List of keys :" + keys.ToString("M-d-yyyy"));
}
return result;
}
return new List<string>();
});
}
public void OnData(TradeBars data)
{
Console.WriteLine(" Tradebar time: " + data.Time);
// reset changes
_changes = SecurityChanges.None;
}
// this event fires whenever we have changes to our universe
public override void OnSecuritiesChanged(SecurityChanges changes)
{
_changes = changes;
foreach (Security security in _changes.AddedSecurities)
{
if (security.Symbol.Value!="SPY"){
//MarketOrder(security.Symbol, 10);
MarketOnOpenOrder(security.Symbol, 10);
Console.WriteLine(Time.Date + " - AddedSecurities OnData:" + security.Symbol.Value + " - Qty: 10");
}
}
Console.WriteLine(Time.Date + " Security Change ");
}
}
}