using MarketData.Generator.CMTrend; using MarketData.Utils; using System; using System.Collections.Generic; using System.Linq; namespace MarketData { public static class CMTrendHelper { public static void HandleCMTSession(CommandArgs commandArgs) { if (!commandArgs.Has("SESSIONFILE")) {MDTrace.WriteLine(LogLevel.DEBUG,String.Format("Missing SESSIONFILE"));return;} CMTTrendModel trendModel=new CMTTrendModel(); trendModel.DisplaySession(commandArgs.Coalesce("SESSIONFILE")); } public static void HandleRunCMTrend(CommandArgs commandArgs) { String mode; if(!commandArgs.Has("MODE")) { if(!commandArgs.Has("MODE")) MDTrace.WriteLine(LogLevel.DEBUG,"MODE is a required paramater."); MDTrace.WriteLine(LogLevel.DEBUG,"RUNMMTREND /MODE:DAILY|BACKTEST|RUNTRENDTEMPLATE|ANALYZE|DISPLAY|CLOSEPOSITION /SELLDATE:{CLOSEPOSITION} /PRICE:{CLOSEPOSITION} /SYMBOL:{for mode ANALYZE,CLOSEPOSITION} /TRADEDATE:{for mode DAILY,RUNTRENDTEMPLATE,ANALYZE,CLOSEPOSITION) /STARTDATE:(for mode BACKTEST) /ENDDATE:(for mode BACKTEST) /INITIALCASH: /SESSIONFILE: MAXOPENPOSITIONS: /MAXDAILYPOSITIONS: Runs Mark Minervini trend"); return; } mode=commandArgs.Get("MODE"); if("ENTRYTEST".Equals(mode)) { CMTParams cmtParams=new CMTParams(); if(!commandArgs.Has("SYMBOL")||!commandArgs.Has("STARTDATE")) { if(!commandArgs.Contains("SYMBOL")) MDTrace.WriteLine(LogLevel.DEBUG,"SYMBOL is a required parameter when MODE=ENTRYTEST"); if(!commandArgs.Contains("STARTDATE")) MDTrace.WriteLine(LogLevel.DEBUG,"STARTDATE is a required parameter when MODE=ENTRYTEST"); return; } CMTTrendModel trendModel=new CMTTrendModel(); trendModel.EntryTest(commandArgs.Get("SYMBOL"),commandArgs.Get("STARTDATE")); } else if("CLOSEPOSITION".Equals(mode)) { CMTParams cmtParams=new CMTParams(); if(!commandArgs.Has("PURCHASEDATE,SYMBOL,SESSIONFILE,PRICE,SELLDATE")) { if(!commandArgs.Contains("PURCHASEDATE")) MDTrace.WriteLine(LogLevel.DEBUG,"PURCHASEDATE is a required parameter when MODE=CLOSEPOSITION"); if(!commandArgs.Contains("SYMBOL")) MDTrace.WriteLine(LogLevel.DEBUG,"SYMBOL is a required parameter when MODE=CLOSEPOSITION"); if(!commandArgs.Contains("SESSIONFILE")) MDTrace.WriteLine(LogLevel.DEBUG,"SESSIONFILE is a required parameter when MODE=CLOSEPOSITION"); if(!commandArgs.Contains("PRICE")) MDTrace.WriteLine(LogLevel.DEBUG,"PRICE is a required parameter when MODE=CLOSEPOSITION"); if(!commandArgs.Contains("SELLDATE")) MDTrace.WriteLine(LogLevel.DEBUG,"SELLDATE is a required parameter when MODE=CLOSEPOSITION"); return; } CMTTrendModel trendModel=new CMTTrendModel(); trendModel.ClosePosition(commandArgs.Get("SYMBOL"),commandArgs.Get("PURCHASEDATE"),commandArgs.Get("SELLDATE"),commandArgs.Get("PRICE"),commandArgs.Get("SESSIONFILE")); } else if("DAILY".Equals(mode)) { CMTParams cmtParams=new CMTParams(); if(!commandArgs.Has("TRADEDATE,SESSIONFILE")) { if(!commandArgs.Contains("TRADEDATE")) MDTrace.WriteLine(LogLevel.DEBUG,"TRADEDATE is a required parameter when MODE=DAILY"); if(!commandArgs.Contains("SESSIONFILE")) MDTrace.WriteLine(LogLevel.DEBUG,"SESSIONFILE is a required parameter when MODE=DAILY"); return; } if(commandArgs.Contains("INITIALCASH")) cmtParams.InitialCash=commandArgs.Get("INITIALCASH"); if(commandArgs.Contains("MAXDAILYPOSITIONS")) cmtParams.MaxDailyPositions=commandArgs.Get("MAXDAILYPOSITIONS"); if(commandArgs.Contains("MAXOPENPOSITIONS")) cmtParams.MaxOpenPositions=commandArgs.Get("MAXOPENPOSITIONS"); if(commandArgs.Has("ONLYTRADESYMBOLS")) cmtParams.OnlyTradeSymbols=commandArgs.Get("ONLYTRADESYMBOLS"); if(commandArgs.Contains("POSITIONRISKPERCENTDECIMAL")) { cmtParams.PositionRiskPercentDecimal=commandArgs.Get("POSITIONRISKPERCENTDECIMAL"); } if(commandArgs.Contains("ENTRYTYPE")) { List entryTypes=Utility.ToList(commandArgs.Get("ENTRYTYPE")); List constraints=new List { "OVEREXTENDED","MVP","NARROWRANGE","MACD","PRICETREND","VOLUMETREND" }; bool results=entryTypes.All(i => constraints.ContainsIgnoreCase(i)); if(!results) { MDTrace.WriteLine(LogLevel.DEBUG,"ENTRYTYPE must consist of one or more OVEREXTENDED, MVP, NarrowRange, MACD, PriceTrend, VolumeTrend"); return; } cmtParams.EntryType=commandArgs.Get("ENTRYTYPE"); } CMTTrendModel trendModel=new CMTTrendModel(); if(commandArgs.Contains("USETRADEONLYSECTORS")) { cmtParams.UseTradeOnlySectors=commandArgs.Get("USETRADEONLYSECTORS"); if(cmtParams.UseTradeOnlySectors) { cmtParams.UseTradeOnlySectorsSectors=commandArgs.Get("USETRADEONLYSECTORSSECTORS"); } } CMTTrendModelResult result=trendModel.RunDaily(commandArgs.Get("TRADEDATE"),commandArgs.Get("SESSIONFILE"),cmtParams); } else if("BACKTEST".Equals(mode)) { CMTParams cmtParams=new CMTParams(); bool sellAtEndOfSimulation=true; if(!commandArgs.Has("STARTDATE,ENDDATE,SESSIONFILE")) { if(!commandArgs.Contains("STARTDATE")) MDTrace.WriteLine(LogLevel.DEBUG,"STARTDATE is a required parameter"); if(!commandArgs.Contains("ENDDATE")) MDTrace.WriteLine(LogLevel.DEBUG,"ENDDATE is a required parameter"); if(!commandArgs.Contains("SESSIONFILE")) MDTrace.WriteLine(LogLevel.DEBUG,"SESSIONFILE is a required parameter"); return; } CMTTrendModel trendModel=new CMTTrendModel(); if(commandArgs.Contains("USETRADEONLYSECTORS")) { cmtParams.UseTradeOnlySectors=commandArgs.Get("USETRADEONLYSECTORS"); if(cmtParams.UseTradeOnlySectors) { cmtParams.UseTradeOnlySectorsSectors=commandArgs.Get("USETRADEONLYSECTORSSECTORS"); } } if(commandArgs.Contains("USEPROFITMAXIMIZATION")) { cmtParams.UseProfitMaximization=commandArgs.Get("USEPROFITMAXIMIZATION"); if(commandArgs.Contains("USEPROFITMAXIMIZATIONEXPRESSION")) { cmtParams.UseProfitMaximizationExpression=commandArgs.Get("USEPROFITMAXIMIZATIONEXPRESSION"); } } if(commandArgs.Contains("MAXDAILYPOSITIONS")) cmtParams.MaxDailyPositions=commandArgs.Get("MAXDAILYPOSITIONS"); if(commandArgs.Contains("MAXOPENPOSITIONS")) cmtParams.MaxOpenPositions=commandArgs.Get("MAXOPENPOSITIONS"); if(commandArgs.Contains("BENCHMARKMOVINGAVERAGEDAYS")) cmtParams.BenchmarkMovingAverageDays=commandArgs.Get("BENCHMARKMOVINGAVERAGEDAYS"); if(commandArgs.Contains("BENCHMARKMOVINGAVERAGEHORIZON")) cmtParams.BenchmarkMovingAverageHorizon=commandArgs.Get("BENCHMARKMOVINGAVERAGEHORIZON"); if(commandArgs.Has("ONLYTRADESYMBOLS")) cmtParams.OnlyTradeSymbols=commandArgs.Get("ONLYTRADESYMBOLS"); if(commandArgs.Contains("POSITIONRISKPERCENTDECIMAL")) { cmtParams.PositionRiskPercentDecimal=commandArgs.Get("POSITIONRISKPERCENTDECIMAL"); } if(commandArgs.Contains("ENTRYTYPE")) { List entryTypes=Utility.ToList(commandArgs.Get("ENTRYTYPE")); List constraints=new List { "OVEREXTENDED","MVP","NARROWRANGE","MACD","PRICETREND","VOLUMETREND" }; bool results=entryTypes.All(i => constraints.ContainsIgnoreCase(i)); if(!results) { MDTrace.WriteLine(LogLevel.DEBUG,"ENTRYTYPE must consist of one or more OVEREXTENDED, MVP, NarrowRange, MACD, PriceTrend, VolumeTrend"); return; } cmtParams.EntryType=commandArgs.Get("ENTRYTYPE"); } if(commandArgs.Contains("SELLATENDOFSIMULATION")) { sellAtEndOfSimulation=commandArgs.Get("SELLATENDOFSIMULATION"); } CMTTrendModelResult result=trendModel.RunBacktestMode(commandArgs.Get("STARTDATE"),commandArgs.Get("ENDDATE"),sellAtEndOfSimulation,commandArgs.Get("SESSIONFILE"),cmtParams); } else if("DISPLAY".Equals(mode)) { if(!commandArgs.Contains("SESSIONFILE")) { MDTrace.WriteLine(LogLevel.DEBUG,"SESSIONFILE is a required parameter"); return; } CMTTrendModel trendModel=new CMTTrendModel(); trendModel.DisplaySession(commandArgs.Get("SESSIONFILE")); } else if("RUNTRENDTEMPLATE".Equals(mode)) { if(!commandArgs.Contains("TRADEDATE")) { MDTrace.WriteLine(LogLevel.DEBUG,"TRADEDATE is a required parameter when MODE=DAILY"); return; } CMTTrendModel trendModel=new CMTTrendModel(); trendModel.RunTrendTemplate(commandArgs.Get("TRADEDATE")); } else { MDTrace.WriteLine(LogLevel.DEBUG,"RUNCMTREND /MODE:DAILY|BACKTEST /TRADEDATE:{for mode DAILY) /STARTDATE:(for mode BACKTEST) /ENDDATE:(for mode BACKTEST) /INITIALCASH: /SESSIONFILE: /MAXPOSITIONS Runs Mark Minervini trend"); } return; } } }