using System;
using System.Linq;
using QuantConnect.Indicators;
using QuantConnect.Models;
using QuantConnect.Data.Consolidators;
namespace QuantConnect.Algorithm.Examples
{
public class QCUMovingAverageCross : QCAlgorithm
{
private const string Symbol = "XPDUSD";
private ExponentialMovingAverage fast;
private SimpleMovingAverage slow;
private SimpleMovingAverage[] ribbon;
int Qty = 4;
public override void Initialize()
{
SetStartDate(2016, 01, 01);
SetEndDate(2018, 04, 15 );
SetBrokerageModel(BrokerageName.OandaBrokerage);
SetCash(1200);
AddSecurity(SecurityType.Cfd, Symbol, Resolution.Minute);
fast = EMA(Symbol, 25, Resolution.Daily);
slow = SMA(Symbol, 99, Resolution.Daily);
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)
{
if (!slow.IsReady) return;
if (previous.Date == data.Time.Date) return;
const decimal tolerance = 0.00015m;
var holdings = Portfolio[Symbol].Quantity;
if (holdings == 0 )
{
if (fast > slow * (1 + tolerance))
{
Log("BUY >> " + Securities[Symbol].Price);
Order(Symbol, Qty);
}
}
if (holdings > 0 && fast <= slow)
{
Log("SELL >> " + Securities[Symbol].Price);
Liquidate(Symbol);
}
Plot(Symbol, "Price", data[Symbol].Price);
Plot("Ribbon", "Price", data[Symbol].Price);
Plot(Symbol, fast, slow);
Plot("Ribbon", ribbon);
previous = data.Time;
}
}
}