using System;
using System.Collections;
using System.Collections.Generic;
using System.Globalization;
using QuantConnect.Algorithm;
using QuantConnect.Data;
using QuantConnect.Data.Market;
using QuantConnect.Indicators;
using QuantConnect.Securities;
namespace QuantConnect
{
public class UVXYwithCatango : QCAlgorithm
{
private string symbol="UVXY";
private string spy_symbol="SPY";
private double percent=0.8; // total use 20% of cash to short uvxy in the total Portfolio;
// private int quantity=500;
private int trigger=0;
private int vixtrigger=0;
decimal currCatango;
RelativeStrengthIndex rsi;
public override void Initialize()
{
SetCash(1000000);
SetStartDate(2011,01,01);
SetEndDate(2015, 03, 31);
AddData<VIX>("VIX");
AddSecurity(SecurityType.Equity, symbol, Resolution.Minute);
AddSecurity(SecurityType.Equity, spy_symbol, Resolution.Minute);
// rsi = RSI("SPY",14, MovingAverageType.Simple, Resolution.Daily);
// SetWarmUp(TimeSpan.FromDays(30));
Schedule.On(DateRules.EveryDay("UVXY"), TimeRules.AfterMarketOpen("UVXY",0), () =>
{
trigger=-1;
//Log(Time.ToString()+"");
});
Schedule.On(DateRules.EveryDay("UVXY"), TimeRules.BeforeMarketClose("UVXY",0), () =>
{
trigger=1;
//Log(Time.ToString()+"");
});
}
public void OnData(VIX data)
{
//currCatango=(data.vix_n/data.vix_f)-1;
//Log("current catango: "+currCatango+ data.Time+"\t"+currCatango+"\t"+Convert.ToDouble(currCatango));
//Log(data.Value+"");
currCatango=data.Value;
if(Convert.ToDouble(currCatango)<=0.05)
{
//Log("current catango: "+currCatango+ data.Time+"\t"+currCatango+"\t"+Convert.ToDouble(currCatango));
vixtrigger=1;
}
else
vixtrigger=-1;
}
public void OnData(TradeBars data)
{
// if (!rsi.IsReady) return;
// if(Time.Hour==9&&Time.Minute==35)
// Log(Time.ToString()+""+"HELLO");
double avaiblecash=Convert.ToDouble(percent*Convert.ToDouble(Portfolio.Cash));
double price=Convert.ToDouble(Portfolio[symbol].Price);
int quantity=Convert.ToInt32(avaiblecash/price);
//int quantity=(percent*Convert.ToDouble(Portfolio.Cash))/Convert.ToDouble(Portfolio[symbol].Price);
if(trigger==-1&&vixtrigger==-1&&!Portfolio.HoldStock)
{
Log(currCatango+"rsi"+rsi);
// Log(Portfolio[symbol].Price+"");
Order(symbol,-quantity);
// Log(Time.ToString()+""+"short"+quantity);
}
else if (trigger==1&&Portfolio.HoldStock)
{
Liquidate("UVXY");
//Order(symbol,Portfolio.quantity);
// Log(Time.ToString()+""+"close"+quantity);
}
}
public class VIX : BaseData
{
public decimal Catango = 0;
public decimal vix_n=0;
public decimal vix_f=0;
string format ="yyyy-MM-dd";
public string url="";
CultureInfo provider = CultureInfo.InvariantCulture;
public VIX()
{
this.Symbol = "VIX";
}
public override SubscriptionDataSource GetSource(SubscriptionDataConfig config, DateTime date, bool isLiveMode)
{
return new SubscriptionDataSource(url, SubscriptionTransportMedium.RemoteFile);
}
public override BaseData Reader(SubscriptionDataConfig config, string line, DateTime date, bool isLiveMode)
{
var index = new VIX();
try
{
string[] data = line.Split(',');
//Dates must be in the format YYYY-MM-DD. If your data source does not have this format, you must use
//DateTime.ParseExact() and explicit declare the format your data source has.
string dateString = data[0].Replace("$","");
index.Time = DateTime.ParseExact(dateString, format, provider);
index.Symbol = "VIX";
index.vix_n=Convert.ToDecimal(data[1]);
index.vix_f=Convert.ToDecimal(data[2]);
index.Value=(index.vix_n/index.vix_f)-1;
}
catch
{
}
return index;
}
}
}
}