// Downloaded From https://www.WiseStockTrader.com
   //  HaConnorsRSI 3 Pos AMin  IBD Top Fifty 2011 - 2013

   // Uses optimization to match ranking system with stock selection list
   //  and combination buy and sell rules 

   //    Combined Systemms
      
   SetCustomBacktestProc("");
   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); 

  //  Hold 3

   Positions = 3;  //Optimize("Positions",5,1,10,1);
   PosQty = Positions;
   PositionSize = -100 / PosQty;


//  Screen Major Market using IJK - Remove comment slashes to include

 //  IJK = Foreign("IJK","CLOSE");
 //   Over = Optimize("Over",35,3,35,1);
 //   IJKema = EMA(IJK,Over);
 //  IJKmin = Optimize("IJKmin",5,5,220,1);
   IJKok = 1;  //ROC(IJKema,Over) > IJKmin;  //  Replace to activate

//  End of Screen    
  //  Heikin - Ashi Technique

    HaClose = (O + H + L + C) / 4;
    HaOpen = AMA( Ref( HaClose, -1 ), 0.5 );
    HaHigh = Max( H, Max( HaClose, HaOpen ) );
    HaLow = Min(  L, Min(HaClose, HaOpen) );

//  DeMark Pivot Points with HAT 

 X =   IIf( HaClose < HaOpen,HaHigh + 2 * HaLow + HaClose,0) ;
 X =   IIf( HaClose > HaOpen, 2 * HaHigh + HaLow + HaClose, X);
 X =   IIf( HaClose == HaOpen, HaHigh + HaLow + 2 * HaClose, X);
   HaPivot = X/4;
   HaSupport1 = X/2 - HaHigh;
   HaResist1 =  X/2 - HaLow;
  
  
   OldResist = Ref(HaResist1,-1);
   Below = HaSupport1;
   Upper = HaClose > OldResist;

   PctAbove = (HaClose - OldResist)*100 / OldResist;  //  Percent above OldResist

  //  Determination of Ranking Parameters using WMA

   AM3 = Optimize("Am3",2,2,21,1);
     Add3 = Optimize("Add3",2,2,21,1);
     Add4 = Optimize("Add4",13,2,21,1);
     Am5 = Am3 + Add3;
     Am8 = Am5 + Add4; 

   Vol3 = WMA(Volume,Am3);
   Vol5 = WMA(Volume,Am5);
   Vol8 = WMA(Volume,Am8);

    //  Price Stochastic

     Aprice = ( HaOpen + HaHigh + HaLow + HaClose) / 4;

     WSK3 = 100*(Aprice-LLV(Aprice,Am3))/(HHV(Aprice,Am3) - LLV(Aprice,Am3));
     WLSK3 = WMA( WSK3, Am3); 
     WLSD3 = WMA( WLSK3, Am3);

      WSK5 = 100*(Aprice-LLV(Aprice,Am5))/(HHV(Aprice,Am5) - LLV(Aprice,Am5));
     WLSK5 = WMA( WSK5, Am5); 
     WLSD5 = WMA( WLSK5, Am5);

      WSK8 = 100*(Aprice-LLV(Aprice,Am8))/(HHV(Aprice,Am8) - LLV(Aprice,Am8));
     WLSK8 = WMA( WSK8, Am8); 
     WLSD8 = WMA( WLSK8, Am8);
   
    Wvolume3 = WMA(Volume,Am3);

     WVSK3 = 100*(Wvolume3-LLV(Wvolume3,Am3))/(HHV(Wvolume3,Am3) - LLV(Wvolume3,Am3));
     WVLSK3 = WMA( WVSK3, Am3); 
     WVLSD3 = WMA( WVLSK3, Am3);

      WVSK5 = 100*(Wvolume3-LLV(Wvolume3,Am5))/(HHV(Wvolume3,Am5) - LLV(Wvolume3,Am5));
     WVLSK5 = WMA( WVSK5, Am5); 
     WVLSD5 = WMA( WVLSK5, Am5);

      WVSK8 = 100*(Wvolume3-LLV(Wvolume3,Am8))/(HHV(Wvolume3,Am8) - LLV(Wvolume3,Am8));
     WVLSK8 = WMA( WVSK8, Am8); 
     WVLSD8 = WMA( WVLSK8, Am8);
   
     MP3 = Optimize("MP3",8.2,0,10,0.1);
     MP5 = Optimize("MP5",6.9,0,10,0.1);
     MP8 = Optimize("MP8",5.7,0,10,0.1);
     MV3 = Optimize("MV3",2.7,0,10,0.1);
     MV5 = Optimize("MV5",0.2,0,10,0.1);
     MV8 = Optimize("MV8",4.9,0,10,0.1);
     


   RankP = MP3 * ROC(WLSD3,Am3) + MP5 * ROC(WLSD5,Am5) + MP8 * ROC(WLSD8,Am8);
   RankV = MV3 * ROC(WVLSD3,Am3) + MV5 * ROC(WVLSD5,Am5) + MV8 * ROC(WVLSD8,Am8);

   DeltaPrice = ROC(RankP,1);
   DeltaVolume = ROC(RankV,1);
   Mprice = IIf(DeltaPrice > 0,1 + DeltaPrice ,1);
   Mprice = IIf(Upper,Mprice + PctAbove,Mprice);
   MVolume = IIf(DeltaVolume > 0,1 + DeltaVolume,1);

   
   PctPct = Mprice * MVolume;
   
   PositionScore = PctPct;  

   MinPctPct = Optimize("MinPctPct",41200,1000,100000,100);
   AddPctPct = Optimize("AddpctPct",24000,500,95000,100);
   BuyPctPct = MinPctPct + AddPctpct;

    //   Connors RSI              ****************

   LenRSI = Optimize("RSI Closes Length", 67, 2, 100, 1);
   LenUD = Optimize("RSI UpClose Length", 37, 2, 100, 1);
   LenROC = Optimize("PerecentRank Length", 110, 10, 200, 1);

function ConnorsRSI(lenRSI, lenUD, lenROC)
{
	upDays = BarsSince(HaClose <= Ref(HaClose,-1));
	downDays = BarsSince(HaClose >= Ref(HaClose,-1));
	updownDays = IIf(upDays > 0, upDays, IIf(downDays > 0, -downDays, 0));
	crsi = ( PercentRank(ROC(HaClose,1), lenROC) + RSIa(updownDays,lenUD) + RSI(lenRSI))/3;
	
	return crsi;
}

/*
Plot( ConnorsRSI(LenRSI,LenUD,LenRank)
	, "ConnorsRSI("+LenRSI+","+LenUD+","+LenRank+")"
	, colorBlue, styleLine, 0, 100);
*/
  FromBelow = Optimize("FromBelow",8,5,50,1);
  FromAbove = Optimize("FromAbove",80,51,95,1);

  Buy = IJKok AND PctPct > BuypctPct AND (ConnorsRSI(lenRSI, lenUD, lenROC) > FromBelow);// AND Ref(ConnorsRSI(lenRSI, lenUD, lenROC),-1) < Ref(FromBelow,-1));
 // Sell = ConnorsRSI(lenRSI, lenUD, lenROC)  < FromAbove AND Ref(ConnorsRSI(lenRSI, lenUD, lenROC),-1) > Ref(FromAbove,-1);


  //  HaDelta Optimized
     HaDays = Optimize("HaDays",19,2,21,1);
     HaAdd  = Optimize("HaAdd",7,0,21,1); 
     HaSignalDays = HaDays + HaAdd;  
     HADelta_Line   = MA( HaClose - HaOpen, HaDays);
     HADelta_Signal = MA( HaDelta_Line, HaSignalDays);
     HaDelta_Histogram = HaDelta_Line - HaDelta_Signal;

     Sell1 = HaDelta_Line < HaDelta_Signal;
     Sell2 = PctPct < MinPctPct;
     INone = Optimize("InOne",0,0,1,1);
     InOther = Optimize("InOther",0,0,1,1);
     Sell1 = Sell1  * InOne;
     Sell2 = Sell2 * InOther;

     Sell = Sell1 OR Sell2;
     

	Short = 0;  
	Cover = 0;

   ExRem(Buy,Sell);
   ExRem(Sell,Buy); 
 

 //     ProfitN =  Optimize("ProfitN",17,15,390,1);
     HoldOut       = Optimize("HoldOut",7,     0,    8,     1);
 //  ApplyStop( 1,3,ProfitN,2,True, HoldOut );
	StopLoss   = Optimize("StopLoss", 10,     5,     10,     1);
	ApplyStop( 0, 1, StopLoss, 0, True, HoldOut );

	TrailStop  = Optimize("TrailStop", 29,    3,    30,     1);
	ApplyStop( 2, 1, TrailStop, 0, True, HoldOut );
	
    HoldStop   =  Optimize("HoldStop", 20,     3,    23,     1);
   ApplyStop( 3, 1, HoldStop, 0, True, HoldOut );

 

	//OldEquity = Foreign("~~~EQUITY","C");

   Filter = Buy OR 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(HaClose,"HaClose",1.2);
   AddColumn(PositionScore,"PctPct",1.0);