| 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 |
namespace QuantConnect
{
public partial class MovingAverageDemo : QCAlgorithm
{
string symbol = "SPY";
ExponentialMovingAverage emaFast = new ExponentialMovingAverage(10);
ExponentialMovingAverage emaSlow = new ExponentialMovingAverage(50);
//Initialize the data and resolution you require for your strategy:
public override void Initialize()
{
//Start and End Date range for the backtest:
SetStartDate(2014, 01, 01);
SetEndDate(2014, 04, 01);
//Cash allocation
SetCash(30000);
//Add as many securities as you like. All the data will be passed into the event handler:
AddSecurity(SecurityType.Equity, symbol, Resolution.Minute);
}
//Data Event Handler: New data arrives here. "TradeBars" type is a dictionary of strings so you can access it by symbol.
public void OnData(TradeBars data)
{
decimal price = data[symbol].Close;
int myholdings = Portfolio[symbol].Quantity;
emaFast.AddSample(price);
emaSlow.AddSample(price);
if(myholdings == 0 || myholdings < 0) {
if(emaFast.EMA > emaSlow.EMA) {
Order(symbol, Math.Abs(myholdings) + 100);
}
} else if(myholdings == 0 || myholdings > 0 ) {
if(emaFast.EMA < emaSlow.EMA) {
Order(symbol, -(100 + myholdings));
}
}
}
}
}
namespace QuantConnect {
using QuantConnect.Models;
public class ExponentialMovingAverage
{
private decimal _period;
private decimal _ema;
private int _samples;
public decimal EMA {
get { return _ema;}
}
public ExponentialMovingAverage(decimal period)
{
this._period = period; // formula constant equals period
this._samples = 0;
}
public decimal AddSample(decimal price)
{
if(_samples == 0) {
_ema = price;
} else {
_ema = (1/_period + ((_period -1)/_period) * _ema);
}
_samples++;
return _ema;
}
}
}