// Downloaded From https://www.WiseStockTrader.com // Full Stochastic 3 Position 30 - 50 Top fifty 02/01/2013 2 months training // Optimize over CAR // Added Time Series Forecast 3 days out // Setup for Last Three Months on 02/04/2013 SetCustomBacktestProc(""); // Set up some added metrics if ( Status( "action" ) == actionPortfolio ) { bo = GetBacktesterObject(); bo.Backtest(); // run default backtest procedure st = bo.GetPerformanceStats( 0 ); // get stats for all trades myMetric = st.GetValue( "CAR" ) + 3 * st.GetValue( "MaxSystemDrawdownPercent" ); expectancy = st.GetValue("WinnersAvgProfit")*st.GetValue("WinnersPercent")/100 + st.GetValue("LosersAvgLoss")*st.GetValue("LosersPercent")/100; UPI = st.GetValue("UlcerPerformanceIndex"); UPIexp = UPI * expectancy; // Here we add custom metric to backtest report bo.AddCustomMetric( "My metric", myMetric ); bo.AddCustomMetric( "Ulcer Performance", UPI ); bo.AddCustomMetric( "Expectancy ($)", expectancy ); bo.AddCustomMetric( "UPIexpect", UPIexp ); } OptimizerSetEngine("cmae"); // OptimizerSetOption("MaxEval",7000); OptimizerSetOption("Runs",3); Positions = 3; // Optimize("Positions",1,1,5,1); PosQty = Positions; PositionSize = -100 / PosQty; // Full Stochastic pds = Optimize("pds",52,2,80,1); slw = Optimize("slw",31,1,38,1); slwD = Optimize("slwD",16,1,21,1); OB = Optimize("OB",76,5,88,1); OSsub = Optimize("OSSUB",7,5,70,1); OS = OB - OSsub; MaxFLSK = Optimize("MaxFLSK",21,2,44,1); FSK = 100*(C-LLV(L,pds))/(HHV(H,pds) - LLV(L,pds)); // FastStockK FLSK = EMA( FSK, slw); // FullStochK FLSD = EMA( FLSK, Slwd); // FullStochD WhenGoUp = FLSD < OS AND Cross(FSK,OS) AND FLSK >= Ref(FLSK,-1) AND FLSD >= Ref(FLSD,-1) OR Cross(FLSD,OS) AND FSK >= Ref(FSK,-1) AND FLSK >= Ref(FLSK,-1) AND FLSK < MaxFLSK; WhenGoDown = IIf(BarsSince(Cross(OS,FSK)) == 1 AND FLSK < OS,1,0) OR Cross(OS,FSK) AND FLSK < Ref(FLSK,-1) OR FLSK < OB AND FLSK > OS AND FLSK <= Ref(FLSK,-1) OR FSK > OB AND FLSK > OB AND FLSD > OB AND FSK < Ref(FSK,-1) AND FLSK < Ref(FLSK,-1) AND FLSD <= Ref(FLSD,-1) OR FSK > OB AND FLSK > OB AND FLSD > OB AND Cross(OB,FLSK); ExRem(WhenGoUP,WhenGoDOwn); ExRem(WhenGoDown,WhenGoUp); Turn = BarsSince(WhenGoUp); TTurn = Turn + 1 - 1; Tgo = TTurn; Five = Optimize("Five",2,2,5,1); UpFive = (NOT WhenGoDown) AND (TTurn > 0) AND (Tgo > Five); // Set up Stochastic 0 to 1 with Times Series Forecast; NormStoch = 0; NormStoch = (Close - LLV(Low,pds))/ (HHV(High,pds) - LLV(Low,pds)); // changed NormStoch = IIf(NormStoch < 0.001,0.001,NormStoch); ForeNmSth3 = TSF(NormStoch,3); Enough = Optimize("Enough",1.042,1.004,1.200,0.001); MaxForecast = Optimize("MaxForecast",0.33,0.05,0.35,0.01); ForeNmSth3 = IIf(ForeNmSth3 > MaxForecast,MaxForecast,ForeNmSth3); PlusForecast = ForeNmSth3 > NormStoch * Enough; // 62 - 20 Percent Deviation Ranking M1 = Optimize("M1",30,5,50,1); M2 = Optimize("M2",44,5,80,1); M3 = Optimize("M3",27,2,50,1); D1 = Optimize("D1",34,3,50,1); D2 = Optimize("D2",18,2,50,1); D3 = Optimize("D3",11,5,50,1); Rank1 = M1 * ROC(NormStoch,D1); Rank2 = M2 * ROC(NormStoch,D2); Rank3 = M3 * StDev(Close,D3)*100/EMA(Close,D3); // There is a question as to whither this metric should be plus or minus PositionScore = Rank1 + Rank2 + Rank3; MFIdays = Optimize("MFIdays",3,2,23,1); MFIconfirm = MFI(MFIdays) > 0; BuyDay = Optimize("BuyDay",9,3,31,1); Thirty = Optimize("Thirty",41,20,60,1); Buy = Close > Open AND PlusForecast AND UpFive AND MFIconfirm AND FLSK < Thirty AND Day() > BuyDay; // AND TurningUp; Held = BarsSince(Buy); MinHold = Optimize("MinHold",14,2,15,1); TestTime = Optimize("TestTime",19,MinHold,20,1); Perform = Optimize("Perform",2,1,25,1); // Eliminate lazy performing positions SellP = IIf(Held > MinHold AND ROC(C,TestTime) < Perform,1,0); Fifty = Optimize("Fifty",48,40,80,1); SellPoint = Optimize("SellPoint",6400,-1500,25000,10); Sell = ((Held > 3 AND PositionScore < SellPoint AND Ref(PositionScore,-1) > SellPoint) AND FLSK > Fifty) OR SellP OR WhenGoDown; ExRem(Buy, Sell); ExRem(Sell,Buy); Short = 0; Cover = 0; ProfitN = Optimize("ProfitN",199,15,390,1); HoldOut = Optimize("HoldOut",2, 0, 33, 1); ApplyStop( 1,3,ProfitN,2,True, HoldOut ); StopLoss = Optimize("StopLoss", 7, 2, 8, 1); ApplyStop( 0, 1, StopLoss, 0, True, HoldOut ); TrailStop = Optimize("TrailStop", 20, 5, 25, 1); ApplyStop( 2, 1, TrailStop, 0, True, HoldOut ); // HoldStop = Optimize("HoldStop", 293, 3, 293, 1); // ApplyStop( 3, 1, HoldStop, 0, True, HoldOut ); //OldEquity = Foreign("~~~EQUITY","C"); Filter = (PlusForecast > 0 AND Buy) OR (PlusForecast < 0 AND Sell); AddColumn(Close,"Close",1.2); AddColumn(Buy,"Buy",1.0); AddColumn(Sell,"Sell",1.0); AddColumn(Open,"Open",1.2); AddColumn(High,"High",1.2); AddColumn(Low,"Low",1.2); AddColumn(Close,"Close",1.2); AddColumn(FLSK,"FLSK",1.2); AddColumn(WhenGoUp,"WhenGoUp",1.0); AddColumn(Turn,"Turn",1.0); AddColumn(TTurn,"TTurn",1.0); AddColumn(MFIconfirm,"MFIcmf",1.0); AddColumn(WhenGoDown,"GoDown",1.0); AddColumn(NormStoch,"NStch",1.3); AddColumn(ForeNmSth3,"FStch3",1.3); AddColumn(PlusForecast,"PlsFre",1.3);