// 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);