Created
March 7, 2018 07:50
-
-
Save westonplatter/8fbd38b087584fd1f245d244a1ccd9f5 to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
using System; | |
using System.Linq; | |
using QuantConnect.Indicators; | |
using QuantConnect.Models; | |
namespace QuantConnect.Algorithm.Examples | |
{ | |
/// <summary> | |
/// | |
/// QuantConnect University: EMA + SMA Cross | |
/// | |
/// In this example we look at the canonical 15/30 day moving average cross. This algorithm | |
/// will go long when the 15 crosses above the 30 and will liquidate when the 15 crosses | |
/// back below the 30. | |
/// </summary> | |
public class QCUMovingAverageCross : QCAlgorithm | |
{ | |
private Symbol symbol; | |
private ExponentialMovingAverage fast; | |
private ExponentialMovingAverage slow; | |
private SimpleMovingAverage[] ribbon; | |
public override void Initialize() | |
{ | |
// set up our analysis span | |
SetStartDate(2017, 01, 01); | |
SetEndDate(2018, 01, 01); | |
//SetBenchmark(time => 25000); | |
SetCash(100); | |
var fx = AddForex("EURUSD", Resolution.Minute, Market.Oanda); | |
symbol = fx.Symbol; | |
fast = EMA(symbol, 5, Resolution.Minute); | |
slow = EMA(symbol, 30, Resolution.Minute); | |
// the following lines produce a simple moving average ribbon, this isn't | |
// actually used in the algorithm's logic, but shows how easy it is to make | |
// indicators and plot them! | |
// note how we can easily define these indicators to receive hourly data | |
int ribbonCount = 7; | |
int ribbonInterval = 15*8; | |
ribbon = new SimpleMovingAverage[ribbonCount]; | |
for(int i = 0; i < ribbonCount; i++) | |
{ | |
ribbon[i] = SMA(symbol, (i + 1)*ribbonInterval, Resolution.Hour); | |
} | |
} | |
private DateTime previous; | |
public void OnData(Slice data) | |
{ | |
// a couple things to notice in this method: | |
// 1. We never need to 'update' our indicators with the data, the engine takes care of this for us | |
// 2. We can use indicators directly in math expressions | |
// 3. We can easily plot many indicators at the same time | |
// wait for our slow ema to fully initialize | |
if (!slow.IsReady) return; | |
// only once per day | |
if (previous.Date == Time.Date) return; | |
// define a small tolerance on our checks to avoid bouncing | |
const decimal tolerance = 0.00015m; | |
var holdings = Portfolio[symbol].Quantity; | |
// we only want to go long if we're currently short or flat | |
if (holdings <= 0) | |
{ | |
// if the fast is greater than the slow, we'll go long | |
if (fast > slow * (1 + tolerance)) | |
{ | |
Log("BUY >> " + Securities[symbol].Price); | |
SetHoldings(symbol, 1.0); | |
} | |
} | |
// we only want to liquidate if we're currently long | |
// if the fast is less than the slow we'll liquidate our long | |
if (holdings > 0 && fast < slow) | |
{ | |
Log("SELL >> " + Securities[symbol].Price); | |
Liquidate(symbol); | |
} | |
//Plot(symbol, "Price", data[symbol].Price); | |
//Plot("Ribbon", "Price", data[symbol].Price); | |
// easily plot indicators, the series name will be the name of the indicator | |
Plot(symbol, fast, slow); | |
Plot("Ribbon", ribbon); | |
previous = Time; | |
} | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment