/*
* QUANTCONNECT.COM - Democratizing Finance, Empowering Individuals.
* Lean Algorithmic Trading Engine v2.0. Copyright 2014 QuantConnect Corporation.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using Newtonsoft.Json;
using QuantConnect.Data.Market;
using QuantConnect.Orders;
namespace QuantConnect.Algorithm.CSharp
{
///
/// This algorithm demonstrates how you can get your symbol list each day from a remote server
/// using the WebClient
///
public class EquitiesLabAlgorithm : QCAlgorithm
{
public const string EquitiesLabKey = @"ENTER YOUR EQUITIES LAB KEY HERE";
public const string EquitiesLabScreener = @"ENTRY YOUR EQUITIES LAB SCREEN KEY HERE";
public const string EquitiesLabUrlFormat = @"https://www.equitieslab.com/play/prod/RestControl/get?key={0}&screener={1}&date={2}&metadata=false";
private DateTime tradedToday;
private EquitiesLabResponse _todaysResponse;
public override void Initialize()
{
UniverseSettings.Resolution = Resolution.Hour;
SetStartDate(2015, 01, 05);
SetEndDate(2015, 11, 09);
SetCash(1000*1000);
AddUniverse("equities-lab-universe", date =>
{
using (var client = new WebClient())
{
//2014-12-30
var file = client.DownloadString(String.Format(EquitiesLabUrlFormat, EquitiesLabKey, EquitiesLabScreener, date.ToString("yyyy-MM-dd")));
var response = JsonConvert.DeserializeObject(file);
_todaysResponse = new EquitiesLabResponse();
_todaysResponse.Securities = response.Securities.Where(x => ValidSymbols.Contains(x.Ticker)).ToList();
return _todaysResponse.Securities.Select(x => x.Ticker);
}
});
// cancell all orders at EOD
Schedule.Event("Cancel Open Orders").EveryDay().At(TimeSpan.FromHours(16)).Run(() =>
{
foreach (var ticket in Transactions.GetOrderTickets(x => x.Status.IsOpen()))
{
ticket.Cancel();
}
});
}
public void OnData(TradeBars slice)
{
if (tradedToday.Date != Time.Date)
{
// leave a small buffer of cash
var targetPercentage = 1m/(_todaysResponse.Securities.Count + 1);
foreach (var target in _todaysResponse.Securities.Where(x => ValidSymbols.Contains(x.Ticker)))
{
// rebalance portfolio to equal weights
SetHoldings(target.Ticker, targetPercentage);
}
tradedToday = Time.Date;
}
else
{
foreach (var target in _todaysResponse.Securities.Where(x => ValidSymbols.Contains(x.Ticker)))
{
// set stop loss / profit orders
var security = Securities[target.Ticker];
if (!security.Invested) continue;
if (security.Close < target.StopLoss || security.Close > target.StopGain)
{
MarketOrder(target.Ticker, -security.Holdings.Quantity, true);
}
}
}
}
public override void OnOrderEvent(OrderEvent orderEvent)
{
if (orderEvent.Status.IsFill())
{
// if we receive a fill cancel the other outstanding order
Transactions.CancelOpenOrders(orderEvent.Symbol);
}
}
class EquitiesLabResponse
{
[JsonProperty(PropertyName = "securities")]
public List Securities = new List();
}
class EquitiesLabTarget
{
[JsonProperty(PropertyName = "ticker")]
public string Ticker;
[JsonProperty(PropertyName = "stop_loss")]
public decimal StopLoss;
[JsonProperty(PropertyName = "stop_gain")]
public decimal StopGain;
}
public static readonly HashSet ValidSymbols = new HashSet
{
{"NP"},
{"PKX"},
{"RYN"},
{"HCLP"},
{"OLN"},
{"MLM"},
{"SCOK"},
{"NEU"},
{"SSLT"},
{"MON"},
{"HSC"},
{"TX"},
{"CLW"},
{"ROCK"},
{"FNV"},
{"WOR"},
{"HMY"},
{"TAHO"},
{"AAON"},
{"STLD"},
{"MAS"},
{"TS"},
{"GLT"},
{"PGEM"},
{"CHMT"},
{"NRP"},
{"BBL"},
{"EMN"},
{"SYT"},
{"SNMX"},
{"ARLP"},
{"USCR"},
{"DD"},
{"DOW"},
{"NOR"},
{"DEL"},
{"KOP"},
{"AA"},
{"OCIP"},
{"FMSA"},
{"USLM"},
{"SCL"},
{"GPRE"},
{"SHW"},
{"PPP"},
{"JHX"},
{"UFPI"},
{"OMG"},
{"GOLD"},
{"X"},
{"SLCA"},
{"RGLD"},
{"WY"},
{"TREC"},
{"TMST"},
{"RPM"},
{"CSTM"},
{"CYT"},
{"TNH"},
{"AUY"},
{"GSM"},
{"WLKP"},
{"AVD"},
{"SCHN"},
{"KALU"},
{"USG"},
{"GGB"},
{"FMC"},
{"HBM"},
{"VHI"},
{"ZEUS"},
{"FBR"},
{"MOS"},
{"RIO"},
{"GRA"},
{"BIOA"},
{"PAH"},
{"IPHS"},
{"GG"},
{"AWI"},
{"HUN"},
{"BTU"},
{"IIIN"},
{"IPI"},
{"PENX"},
{"POT"},
{"MTRN"},
{"CENX"},
{"APD"},
{"MT"},
{"ASPN"},
{"RS"},
{"GFF"},
{"EXP"},
{"BVN"},
{"CF"},
{"DDC"},
{"SWC"},
{"CCJ"},
{"CDE"},
{"RIOM"},
{"LYB"},
{"BCC"},
{"RTK"},
{"AG"},
{"RNO"},
{"FSM"},
{"CHNR"},
{"SHLM"},
{"LXU"},
{"UFS"},
{"SCCO"},
{"SZYM"},
{"ZINC"},
{"UAN"},
{"FELP"},
{"IBP"},
{"TREX"},
{"ABX"},
{"VMC"},
{"WLB"},
{"RYAM"},
{"AMRS"},
{"OMN"},
{"IOSP"},
{"SXCP"},
{"ECL"},
{"BAK"},
{"SLW"},
{"TC"},
{"AKS"},
{"OC"},
{"SQM"},
{"CE"},
{"PVG"},
{"GFI"},
{"SSRI"},
{"TROX"},
{"PX"},
{"ASH"},
{"YZC"},
{"SA"},
{"HL"},
{"AXTA"},
{"BECN"},
{"MUX"},
{"WDFC"},
{"CBT"},
{"SBGL"},
{"LPX"},
{"NTIC"},
{"CGA"},
{"OEC"},
{"IFF"},
{"VALE"},
{"CLF"},
{"CRH"},
{"CMC"},
{"DRD"},
{"HW"},
{"NCS"},
{"PGTI"},
{"NUE"},
{"CMP"},
{"MIL"},
{"MDM"},
{"CLD"},
{"SID"},
{"PPG"},
{"DOOR"},
{"AHGP"},
{"BHP"},
{"AGI"},
{"PAAS"},
{"NX"},
{"NTK"},
{"MTX"},
{"KS"},
{"ACH"},
{"FCX"},
{"SWM"},
{"PCL"},
{"SMG"},
{"ALB"},
{"SXC"},
{"ODC"},
{"MERC"},
{"CSTE"},
{"KGC"},
{"NEM"},
{"AXLL"},
{"KRA"},
{"AGU"},
{"WPP"},
{"CBPX"},
{"AEM"},
{"HNRG"},
{"BXC"},
{"RNF"},
{"SIAL"},
{"APOG"},
{"USAP"},
{"FUL"},
{"MBII"},
{"FF"},
{"STCK"},
{"FOE"},
{"SXT"},
{"BCPC"},
{"VAL"},
{"OCIR"},
{"SYNL"},
{"POL"},
{"TGEN"},
{"KWR"},
{"ARG"},
{"MEOH"},
{"ZEP"},
{"NWPX"},
{"EXK"},
{"PATK"},
{"WLK"},
{"ACI"},
{"TRQ"},
{"KMG"},
{"HWKN"},
{"RFP"},
{"KRO"},
{"MDU"},
{"HNH"},
{"BLDR"}
};
}
}