コード例 #1
0
ファイル: GlueLogic.cs プロジェクト: vu-le/TuringTrader
        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);
        }
コード例 #2
0
ファイル: GlueLogic.cs プロジェクト: slam/TuringTrader
        /// <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);
        }
コード例 #3
0
ファイル: GlueLogic.cs プロジェクト: yutiansut/TuringTrader
        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])));
        }
コード例 #4
0
ファイル: GlueLogic.cs プロジェクト: yutiansut/TuringTrader
        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);
            }
        }
コード例 #5
0
ファイル: GlueLogic.cs プロジェクト: yutiansut/TuringTrader
 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 ?? "");
     }
 }
コード例 #6
0
ファイル: GlueLogic.cs プロジェクト: yutiansut/TuringTrader
        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);
            }
        }
コード例 #7
0
ファイル: GlueLogic.cs プロジェクト: yutiansut/TuringTrader
        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));
            }
        }
コード例 #8
0
ファイル: GlueLogic.cs プロジェクト: yutiansut/TuringTrader
        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
        }