| Overall Statistics |
|
Total Trades 1 Average Win 0% Average Loss 0% Compounding Annual Return 14.172% Drawdown 10.300% Expectancy 0 Net Profit 0% Sharpe Ratio 1.115 Loss Rate 0% Win Rate 0% Profit-Loss Ratio 0 Alpha 0.137 Beta 0.028 Annual Standard Deviation 0.126 Annual Variance 0.016 Information Ratio 0.106 Tracking Error 0.175 Treynor Ratio 5.068 Total Fees $4.26 |
//This code will demo these:
//1) Event handling in f-sharp
//2) basic structure of f-sharp class
//3) how to use QuantConnect.Data.Consolidators in f-sharp
//4) Magic sprintf function
namespace QuantConnect.Algorithm.FSharp//.Custom
open System
open System.Collections.Generic
open QuantConnect//#4
open QuantConnect.Securities
open QuantConnect.Data.Market
open QuantConnect.Algorithm//#3
open QuantConnect.Indicators
open QuantConnect.Orders
open QuantConnect.Data.Consolidators
type RenkoConsolidatorFSharp() = //() is the constructor of RenkoConsolidatorFSharp class
//#3, reference
inherit QCAlgorithm() // () is the constructor of QCAlgorithm
override this.Initialize() =
//when you type this, the intellisence shows list of available properties, method of this class and base class
this.SetStartDate(2012,01,01)
this.SetEndDate(2013,01,01)
// AddSecurity return object "QuantConnect.Securities.Security"
// use "|> ignore " to omit non-used return
this.AddSecurity(SecurityType.Equity,"SPY") |> ignore
let _spy = this.Symbol("SPY")
//type "Renko", and press "Ctrl" + "Space", VS will do auto-complete for you
let renkoClose = new RenkoConsolidator(2.5m)
renkoClose.DataConsolidated <- new EventHandler<RenkoBar>(
fun (a: obj) (bar :RenkoBar) -> this.HandleRenkoClose(bar)
)
this.SubscriptionManager.AddConsolidator(_spy,renkoClose)
// break SPY into (2*o + h + l + 3*c)/7
let renko7bar =
new RenkoConsolidator<TradeBar>(
barSize = 2.5m,
selector = (fun x -> (2m * x.Open + x.High + x.Low + 3m *x.Close)/7m),
volumeSelector = (fun(y) -> y.Volume))
renko7bar.DataConsolidated <- new EventHandler<RenkoBar>(
fun (a: obj) (bar :RenkoBar) -> this.HandleRenko7Bar(bar)
)
// register the consolidator for updates
this.SubscriptionManager.AddConsolidator(_spy,renko7bar);
/// We're doing our analysis in the OnRenkoBar method, but the framework verifies that this method exists, so we define it.
member this.OnData(data: TradeBars) =
this.Log("On Data Triggered")
/// This function is called by our renkoClose consolidator defined in Initialize()
member this.HandleRenkoClose(data : RenkoBar) =
this.Log("RenkoClose Triggered")
if not this.Portfolio.Invested then
this.SetHoldings(data.Symbol,1.0)
//magic string format function "sprintf"
//https://msdn.microsoft.com/en-us/library/ee370560.aspx
let result = sprintf "CLOSE - %O - %f %f" data.Time data.Open data.Close
this.Log(result)
member this.HandleRenko7Bar(data : RenkoBar) =
this.Log("HandleRenko7Bar Triggered")
//another way to pipe backward
this.Log <| sprintf "CLOSE - %O - %f %f" data.Time data.Open data.Close