public static void AddStrategyHoldings(this Plotter plotter, SimulatorCore sim, Instrument asset) { var pcnt = asset.Position * asset.Close[0] / sim.NetAssetValue[0]; plotter.SelectChart("Exposure vs Time", "date"); plotter.SetX(sim.SimTime[0]); plotter.Plot(asset.Symbol, pcnt); }
/// <summary> /// Add new row with strategy holdings to plotter. This method should /// be called at least once per simulated trading day. /// </summary> /// <param name="plotter"></param> /// <param name="sim"></param> /// <param name="asset"></param> public static void AddStrategyHoldings(this Plotter plotter, SimulatorCore sim, Instrument asset) { var pcnt = asset.Position * asset.Close[0] / sim.NetAssetValue[0]; plotter.SelectChart(Plotter.SheetNames.EXPOSURE_VS_TIME, "date"); plotter.SetX(sim.SimTime[0]); plotter.Plot(asset.Symbol, pcnt); }
public static void AddStrategyHoldings(this Plotter plotter, SimulatorCore sim, IEnumerable <Instrument> assets) { plotter.SelectChart(Plotter.SheetNames.EXPOSURE_VS_TIME, "date"); plotter.SetX(sim.SimTime[0]); foreach (var i in assets) { var pcnt = i.Position * i.Close[0] / sim.NetAssetValue[0]; plotter.Plot(i.Symbol, pcnt); } //plotter.Plot("Total", sim.Positions.Sum(p => Math.Abs(p.Value * p.Key.Close[0] / sim.NetAssetValue[0]))); }
public static void AddPnLHoldTime(this Plotter plotter, SimulatorCore sim) { var tradeLog = LogAnalysis .GroupPositions(sim.Log, true) .OrderBy(i => i.Entry.BarOfExecution.Time); plotter.SelectChart(Plotter.SheetNames.PNL_HOLD_TIME, "Days Held"); foreach (var trade in tradeLog) { var pnl = (trade.Quantity > 0 ? 100.0 : -100.0) * (trade.Exit.FillPrice / trade.Entry.FillPrice - 1.0); var label = pnl > 0.0 ? "Profit" : "Loss"; plotter.SetX((trade.Exit.BarOfExecution.Time - trade.Entry.BarOfExecution.Time).TotalDays); plotter.Plot(label, pnl); } }
public static void AddOrderLog(this Plotter plotter, SimulatorCore sim) { plotter.SelectChart("Order Log", "date"); foreach (LogEntry entry in sim.Log) { plotter.SetX(string.Format("{0:MM/dd/yyyy}", entry.BarOfExecution.Time)); plotter.Plot("action", entry.Action); plotter.Plot("type", entry.InstrumentType); plotter.Plot("instr", entry.Symbol); plotter.Plot("qty", entry.OrderTicket.Quantity); plotter.Plot("fill", entry.FillPrice); plotter.Plot("gross", -entry.OrderTicket.Quantity * entry.FillPrice); plotter.Plot("commission", -entry.Commission); plotter.Plot("net", -entry.OrderTicket.Quantity * entry.FillPrice - entry.Commission); plotter.Plot("comment", entry.OrderTicket.Comment ?? ""); } }
public static void AddMfeMae(this Plotter plotter, SimulatorCore sim) { var tradeLog = LogAnalysis .GroupPositions(sim.Log, true) .OrderBy(i => i.Entry.BarOfExecution.Time); plotter.SelectChart(Plotter.SheetNames.PNL_MFE_MAE, "Max Excursion"); foreach (var trade in tradeLog) { var pnl = 100.0 * (trade.Exit.FillPrice / trade.Entry.FillPrice - 1.0); var label = pnl > 0.0 ? "Profit" : "Loss"; plotter.SetX(100.0 * (trade.HighestHigh / trade.Entry.FillPrice - 1.0)); plotter.Plot(label, pnl); plotter.SetX(100.0 * (trade.LowestLow / trade.Entry.FillPrice - 1.0)); plotter.Plot(label, pnl); } }
public static void AddPositionLog(this Plotter plotter, SimulatorCore sim) { var tradeLog = LogAnalysis .GroupPositions(sim.Log, true) .OrderBy(i => i.Entry.BarOfExecution.Time); plotter.SelectChart("Position Log", "entry date"); foreach (var trade in tradeLog) { plotter.SetX(string.Format("{0:MM/dd/yyyy}", trade.Entry.BarOfExecution.Time)); plotter.Plot("exit date", string.Format("{0:MM/dd/yyyy}", trade.Exit.BarOfExecution.Time)); plotter.Plot("days held", (trade.Exit.BarOfExecution.Time - trade.Entry.BarOfExecution.Time).TotalDays); plotter.Plot("Symbol", trade.Symbol); plotter.Plot("Quantity", trade.Quantity); plotter.Plot("% Profit", Math.Round((trade.Quantity > 0 ? 100.0 : -100.0) * (trade.Exit.FillPrice / trade.Entry.FillPrice - 1.0), 2)); plotter.Plot("Exit", trade.Exit.OrderTicket.Comment ?? ""); //plotter.Plot("$ Profit", trade.Quantity * (trade.Exit.FillPrice - trade.Entry.FillPrice)); } }
public static double CalcFitness(this SimulatorCore sim) { #if true double cagr = Math.Exp(252.0 / Math.Max(1, sim.TradingDays) * Math.Log(sim.NetAssetValue[0] / Globals.INITIAL_CAPITAL)) - 1.0; double mdd = Math.Max(0.01, sim.NetAssetValueMaxDrawdown); return(cagr / mdd); #else // calculate Keller ratio double R = Math.Exp( 252.0 / sim.TradingDays * Math.Log(sim.NetAssetValue[0] / Globals.INITIAL_FUNDS)); double K50 = sim.NetAssetValueMaxDrawdown <0.5 && R> 0.0 ? R * (1.0 - sim.NetAssetValueMaxDrawdown / (1.0 - sim.NetAssetValueMaxDrawdown)) : 0.0; double K25 = sim.NetAssetValueMaxDrawdown <0.25 && R> 0.0 ? R * (1.0 - 2.0 * sim.NetAssetValueMaxDrawdown / (1.0 - 2 * sim.NetAssetValueMaxDrawdown)) : 0.0; return(K25); #endif }