| Overall Statistics |
|
Total Trades 5658 Average Win 0% Average Loss -0.03% Compounding Annual Return -21.626% Drawdown 56.100% Expectancy -1 Net Profit -56.109% Sharpe Ratio -15.525 Loss Rate 100% Win Rate 0% Profit-Loss Ratio 0 Alpha -0.236 Beta -0.053 Annual Standard Deviation 0.016 Annual Variance 0 Information Ratio -3.145 Tracking Error 0.126 Treynor Ratio 4.598 Total Fees $14027.32 |
namespace QuantConnect
{
public class EMACrossLongAlgorithm : QCAlgorithm
{
// There's no need to create another instance of algorithm. We are already in the algorithm.
// So we create all variables we need here.
RollingWindow<TradeBar> History = new RollingWindow<TradeBar>(3);
string symbol = "MSFT";
ExponentialMovingAverage fastEma;
ExponentialMovingAverage slowEma;
int fastEmaPeriod = 8;
int slowEmaPeriod = 20;
//algorithm PnL settings
decimal targetProfit = 0.01m; // 1% target
decimal maximumLoss = 0.005m; // 0.5% stop
// Initialize function ----------------------------------------------------------------------------
public override void Initialize() // backtest kickstart
{
SetStartDate(2012, 3, 12);
SetEndDate(2015, 7, 28);
SetCash(25000);
AddSecurity(SecurityType.Equity, symbol, Resolution.Minute);
var fifteenConsolidator = ResolveConsolidator(symbol, TimeSpan.FromMinutes(15));
fastEma = new ExponentialMovingAverage(fastEmaPeriod);
slowEma = new ExponentialMovingAverage(slowEmaPeriod);
RegisterIndicator(symbol, fastEma, fifteenConsolidator, p => p.Value);
RegisterIndicator(symbol, slowEma, fifteenConsolidator, p => p.Value);
fifteenConsolidator.DataConsolidated += (s, e) => OnDataFifteen((TradeBar)e);
PlotIndicator(symbol, fastEma);
PlotIndicator(symbol, slowEma);
}
public bool MinimumProfitAchieved
{
get { return (Portfolio.TotalUnrealizedProfit / Portfolio.Cash) >= targetProfit; }
}
public bool MaximumLossAchieved
{
get { return (Portfolio.TotalUnrealizedProfit / Portfolio.Cash) <= -maximumLoss; }
}
// 15m timeframe handler -----------------------------------------------------------------------------
private void OnDataFifteen(TradeBar consolidated)
{
History.Add(consolidated);
if (fastEma.IsReady == false
|| slowEma.IsReady == false
|| History.Count < 3)
return;
decimal profit = Portfolio.TotalUnrealizedProfit;
decimal price = consolidated.Close;
decimal high = consolidated.High;
int holdings = Portfolio[symbol].Quantity;
decimal avg = (consolidated.Open + consolidated.Close) / 2;
decimal percentage = 0;
//Algorithm Entry Section:==========================================
//Entry Scenario Criteria ==========================================
// CM Check - Scenario 1: 8EMA Crossover 20EMA
// I replaced 'while' with 'if'. Tradebars will be coming, just check every tradebar.
if (holdings <=0) // Holdings will never be < 1. I think you meant 0.
{
if (fastEma >= slowEma)
{
// Most recent bar is History[0]. So make sure this is what you meant.
if (History[1].Close > History[2].Close)
{
if (avg > History[1].Close)
{
//percentage = 1.5m;
// Holdings should have values between -1 and 1. -- 1.5 is not correct.
// if you meant 1.5%, then use 0.015 for holdings value. But let's go full size.
percentage = 1;
SetHoldings(symbol, percentage);
}
}
}
}
//Algorithm Exit Section:===========================================
if (MinimumProfitAchieved)
{
//Order(symbol, -holdings);
// Just use Liquidate
// Or, equivalently SetHoldings(0). Or, close long and open short with SetHoldings(-1).
Liquidate(symbol);
}
if (MaximumLossAchieved)
{
//Order(symbol, -holdings);
Liquidate(symbol);
}
}
}
}