| Overall Statistics |
|
Total Trades 5422 Average Win 0.01% Average Loss -0.01% Annual Return -38.407% Drawdown 36.400% Expectancy -0.956 Net Profit -36.578% Sharpe Ratio -28.4 Loss Rate 98% Win Rate 2% Profit-Loss Ratio 1.34 Trade Frequency Hourly trades |
using System;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
namespace QuantConnect
{
using QuantConnect.Securities;
using QuantConnect.Models;
/**
* Simple Moving Average Cross
**/
public partial class BasicTemplateAlgorithm : QCAlgorithm, IAlgorithm
{
string symbol = "XLF";
List<decimal> fast_sma_values = new List<decimal>();
List<decimal> slow_sma_values = new List<decimal>();
int fast_sma_period = 50;
int slow_sma_period = 200;
decimal last_fast_sma = Decimal.Zero;
decimal last_slow_sma = Decimal.Zero;
//Initialize the data and resolution you require for your strategy:
public override void Initialize()
{
//Initialize the start, end dates for simulation; cash and data required.
SetStartDate(2013, 06, 01);
SetEndDate(DateTime.Now.Date.AddDays(-1));
SetCash(30000); //Starting Cash in USD.
AddSecurity(SecurityType.Equity, symbol, Resolution.Tick); //Minute, Second or Tick
SetRunMode(RunMode.Parallel); //Series or Parallel for intraday strategies.
}
//Handle Tick Events - Only when you're requesting tick data
public override void OnTick(Dictionary<string, List<Tick>> ticks)
{
foreach (Tick tick in ticks[symbol]) {
//get current values of sma
decimal current_fast_sma = __getFastSma(tick.Price);
decimal current_slow_sma = __getSlowSma(tick.Price);
if (!last_fast_sma.Equals(Decimal.Zero) && !last_slow_sma.Equals(Decimal.Zero) &&
!current_fast_sma.Equals(Decimal.Zero) && !current_slow_sma.Equals(Decimal.Zero))
{
//check fast cross over slow
if ((last_fast_sma < last_slow_sma) && (current_fast_sma > current_slow_sma))
{
//BUY
if ((!Securities.ContainsKey(symbol)) || (Securities[symbol].Holdings.Quantity == 0)) {
Order(symbol, 50, OrderType.Market);
}
//BUY or EXIT SHORT
//Order(symbol, 50, OrderType.Market);
}
//check slow cross over fast
else if ((last_fast_sma > last_slow_sma) && (current_fast_sma < current_slow_sma))
{
//SELL
if ((Securities.ContainsKey(symbol)) && (Securities[symbol].Holdings.Quantity > 0)) {
Order(symbol, -50, OrderType.Market);
}
//SHORT SELL or SELL
//Order(symbol, -50, OrderType.Market);
}
}
//updates last values of sma
last_fast_sma = current_fast_sma;
last_slow_sma = current_slow_sma;
}
if (!ticks.ContainsKey(symbol)) {
Debug("OtherSymbols=" + ticks.Keys);
}
}
/* get the current value of fast sma*/
public decimal __getFastSma(decimal price)
{
fast_sma_values.Add(price);
//check count
if (fast_sma_values.Count <= fast_sma_period) {
return Decimal.Zero;
}
//calcule sma
fast_sma_values.RemoveAt(0);
return (fast_sma_values.Sum() / fast_sma_values.Count);
}
/* get the current value of slow sma*/
public decimal __getSlowSma(decimal price)
{
slow_sma_values.Add(price);
//check count
if (slow_sma_values.Count <= slow_sma_period) {
return Decimal.Zero;
}
//calcule sma
slow_sma_values.RemoveAt(0);
return (slow_sma_values.Sum() / slow_sma_values.Count);
}
//Handle TradeBar Events: a TradeBar occurs on a time-interval (second or minute bars)
public override void OnTradeBar(Dictionary<string, TradeBar> data) {}
}
}