// Downloaded From https://www.WiseStockTrader.com
// Trade simulation. Helps you to record your real trades and test new trading approaches without any programming skills.
// Copyright Abnash Singh 20th February 2012
// Modified April 29,2013 - for allowing last bar trades and for excluding ATR stop optionally, when own stop loss system is used.
// You can download and use this AFL, but do not make any changes in the copyright information, even if you make changes in the code
// Upto 9 trades can be plotted in any time frame.
// Once installed on Amibroker insert the vertical Study lines with labels b1, b2 etc for Buy signals AND s1, s2 etc for Short signals AND 
// e1, e2 etc for the exit signals. The AFL automatically recognises the context of the exit for a Buy OR Sell Signal. 
// Remember that the Buy AND Sell signals are generated one bar after the vertical position of the Study line. 
// This has no practical impact on entering your trade signals.
// Next you can modify the trade entry AND exit values, if required in the parameter windows AND you have your trade journal ready!
// To re-use the AFL for another trading session, please remember to delete all the existing studies, 
// by right clicking in the display area AND selecting delete al studies AND resetting the parameter window.

SetBarsRequired(1000, 0 );  
setbuy = ParamTrigger("Buy", "Buy" );
setsell = ParamTrigger("Sell", "Sell" );
setshort = ParamTrigger("Short", "Short" );
setcover = ParamTrigger("Cover", "Cover" );
clear = ParamTrigger("Clear", "Clear" );
 
clearall = ParamTrigger("Clear All", "Clear All" );


showcandlechart=ParamList("Show Candle chart","YES|NO");
useATRstop=ParamToggle("ATR stop to be used ?","No|Yes",1);
stylecndl=ParamList("Bar/Candle chart","BAR|CANDLE");
BarLum1 		= Param("Bar Color Intensity", 8, 0, 10,01);
LineColor 		= ColorBlend(ColorRGB(50,60,60), ColorRGB(50,60,60), BarLum1);
UpBarColor		= ColorBlend(ColorRGB(5,36,5), ColorRGB(10,75,10), BarLum1);
DnBarColor		= ColorBlend(ColorRGB(36,5,5), ColorRGB(75,10,10), BarLum1);


tp1=Param("Trade 1 price ",0,0,20000);
ep1=Param("Exit 1 price ",0,0,20000);
tp2=Param("Trade 2 price ",0,0,20000);
ep2=Param("Exit 2 price ",0,0,20000);
tp3=Param("Trade 3 price ",0,0,20000);
ep3=Param("Exit 3 price ",0,0,20000);
tp4=Param("Trade 4 price ",0,0,20000);
ep4=Param("Exit 4 price ",0,0,20000);
tp5=Param("Trade 5 price ",0,0,20000);
ep5=Param("Exit 5 price ",0,0,20000);
tp6=Param("Trade 6 price ",0,0,20000);
ep6=Param("Exit 6 price ",0,0,20000);
tp7=Param("Trade 7 price ",0,0,20000);
ep7=Param("Exit 7 price ",0,0,20000);
tp8=Param("Trade 8 price ",0,0,20000);
ep8=Param("Exit 8 price ",0,0,20000);
tp9=Param("Trade 9 price ",0,0,20000);
ep9=Param("Exit 9 price ",0,0,20000);


bi = BarIndex();
qty = LastValue( bi );

y = Year(); 
m = Month(); 
d = Day(); 
r = Hour();
e = Minute();

sby = SelectedValue( y );
sbm = SelectedValue( m );
sbd = SelectedValue( d );
sbr = SelectedValue( r );
sbe = SelectedValue( e );


 qty = LastValue( bi );
 
Varname = Name()+ sby + sbm + sbd + sbr + sbe;

 
if( setbuy )
 {
   StaticVarSet( Varname, 1 );
 } 
 
if( setsell )
 {
   StaticVarSet( Varname, -1 );
 } 
 
if( setshort )
 {
   StaticVarSet( Varname, -2 );
 } 
 
if( setcover )
 {
   StaticVarSet( Varname, 2 );
 } 
 
if( clear )
 {
   StaticVarRemove( Varname );
 } 
 
if( clearall )
 {
   for( i = 0; i < qty; i++ ) StaticVarRemove( Name()+y[i] + m[i] + d[i] + r[i] + e[i]);
 
 } 
 
Buy = Sell = Short = Cover = exit =0;




profit=sessprofit=priceatbuy=priceatshort=priceatexit=tradecount=lastsig=pricetouse=maxprofit=lastmax=0;


shape=xp=ep=cp=0;
tradeline=Null;
BarColor		= IIf(Close > Open, UpBarColor, DnBarColor);
SetBarFillColor(BarColor);
avp=(O+C)/2;//you can choose to have avp=c instead of average
if (stylecndl=="BAR")stylec=styleBar;
else stylec=styleCandle;
if (showcandlechart=="YES")
{
	
	Plot(C, "Close", colorWhite, styleNoTitle | stylec); 
}
avp=(O+C)/2;
//ATR Stop begin
Multiple = Param( "Multiple", 3, 0.5, 10, 0.1 ); // How many ATR's to be allowed below the highest high since latest "buy" bar
ATRPeriods = Param( "ATR Periods", 20, 1, 50, 1 ); // How many periods to use for the ATR
Showtarget = ParamList ("Show Target Milestones ","Yes|No");
Step = Param( "Step for target milestones", 20, 0,50, 10 );// Step for profit progress, default is 20 points.

stopArray = Null;
atrArray = ATR( ATRPeriods );
HHArray = Null;
LLArray = Null;
exitArray = Null;
trendDirection = 0;
//ATr Stop end

dmy=ATR(10);
for (i=1;i<BarCount;i++)
{
	   	sig = StaticVarGet(Name()+y[i] + m[i] + d[i] + r[i] + e[i]);
	   	if( sig == 1 ) Buy[ i ] = True;
		if( sig == -2 ) Short[ i ] = True;
		if (sig==-1 OR sig==2)exit[i]=True;


	if (Lastsig!=0 AND !Buy[i] AND !Short[i])tradeline[i]=tradeline[i-1];
	if (Buy[i] OR Short[i])
	{
		tradecount=tradecount+1;
		if (tradecount==1){xp=tp1;ep=ep1;}
		else if (tradecount==2){xp=tp2;ep=ep2;}
		else if (tradecount==3){xp=tp3;ep=ep3;}
		else if (tradecount==4){xp=tp4;ep=ep4;}
		else if (tradecount==5){xp=tp5;ep=ep5;}
		else if (tradecount==6){xp=tp6;ep=ep6;}
		else {xp=0;ep=0;}
	}
	if (Buy[i]) 
	{
       // we just triggered a long trade. Set up starting values
       stopArray[i] = High[i] - ( Multiple * atrArray[i] );
       HHArray[i] = High[i]; // initialize the highest high array
       trendDirection = 1; // going long. Base bar flag is now set.


		if (xp>0)priceatbuy=tradeline[i]=xp;
		else priceatbuy=tradeline[i]=avp[i];//defaulting price to average price.
		if (Lastsig==-1)
		{
			profit=priceatshort-priceatbuy;
			sessprofit=sessprofit+profit;
			PlotText(WriteVal(profit,1.0),i,H[i]+10,colorYellow);


		}
		Lastsig=1;
	}
	if (Short[i])
	{

      // we just triggered a short trade. Set up starting values
       stopArray[i] = Low[i] + ( Multiple * atrArray[i] );
       LLArray[i] = Low[i]; // initialize the lowest low array
       trendDirection = 0 - 1; // going short. Base bar.

//		PlotText("1",i,H[i]+10,colorWhite);
		if (xp>0)priceatshort=tradeline[i]=xp;
		else priceatshort=tradeline[i]=avp[i];//defaulting price to average price.
		if (Lastsig==1)
		{
			profit=priceatshort-priceatbuy;
			sessprofit=sessprofit+profit;
			PlotText(WriteVal(profit,1.0),i,H[i]+2*dmy[i],colorYellow);
		}
		Lastsig=-1;
	}
	if (Lastsig==0)tradeline[i]=Null;
	if (exit[i])
	{
		if (ep>0)priceatexit=ep;
		else priceatexit=avp[i];
		if (Lastsig==1)
		{
			profit= priceatexit-priceatbuy;
			Sell[i]=1;
		}
		else if (Lastsig==-1)
		{
			profit= priceatshort-priceatexit;
			Cover[i]=1;
		}
		sessprofit=sessprofit+profit;
		PlotText(WriteVal(profit,1.0),i,H[i]+2*dmy[i],colorYellow);
		Lastsig=profit=0;
	}
	if (Lastsig==1)Cp[i]=avp[i]-priceatbuy;
	else if (Lastsig==-1)Cp[i]=priceatshort-avp[i];

    exitArray[i] = 0;

    if ( trendDirection > 0 AND useatrstop)
    {
        // keep track of the highest high, highest close, highest low, etc..
        if ( trendDirection > 1 )
        {
            // We are in the trade (2nd day or later)
            if ( Low[i] < stopArray[i-1] OR exit[i])
            {
                //stop got hit. Reset the trade.
                trendDirection = 0; // OK. wait until we trigger another trade.
                exitArray[i] = 1;
					if (Lastsig==1)
					{
						if (ep>0)pricetouse=ep;
						else pricetouse=avp[i];
						profit=pricetouse-priceatbuy;
						sessprofit=sessprofit+profit;
						PlotText(WriteVal(profit,1.0),i,H[i]+2*dmy[i],colorYellow);
					}
					Lastsig=0;
            }
            else
            {
                // keep track of the HHV since trade was entered.
                if ( High[i] > HHArray[i-1] )
                    HHArray[i] = High[i];
                else
                    HHArray[i] = HHArray[i-1];

                // Compute the stop based on the HHV.
                stopArray[i] = HHArray[i] - ( Multiple * atrArray[i] );
            }
        }

        trendDirection = trendDirection + 1;
    }

    if ( trendDirection < 0 AND useatrstop)
    {
        // keep track of the lowest low, lowest close, lowest high, etc..
        if ( trendDirection < 0 - 1 )
        {
            // We are in the trade (2nd day or later)
            if ( High[i] > stopArray[i-1] OR exit[i] )
            {
                // our stop got hit. Reset the trade.
                trendDirection = 0;
                exitArray[i] = 0 - 1;
					if (Lastsig==-1)
					{
						if (ep>0)pricetouse=ep;
						else pricetouse=avp[i];
						profit=priceatshort-pricetouse;
						sessprofit=sessprofit+profit;
						PlotText(WriteVal(profit,1.0),i,H[i]+2*dmy[i],colorYellow);
					}
					Lastsig=0;
            }
            else
            {
                // keep track of the LLV since trade was entered.
                if ( Low[i] < LLArray[i-1] )
                    LLArray[i] = Low[i];
                else
                    LLArray[i] = LLArray[i-1];

		// Compute the stop based on the LLV.
                stopArray[i] = LLArray[i] + ( Multiple * atrArray[i] );
            }
        }

        trendDirection = trendDirection - 1;
    }

    if ( trendDirection == 0 )
    {
        stopArray[i] = 0;
        LLArray[i] = 0;
        HHArray[i] = 0;
    }
		
	if(Buy[i] OR Short[i])Maxprofit=lastmax=0;
	if (Cp[i]>Maxprofit)Maxprofit=Cp[i];
//Profit milestones in steps of 20. Can be modified to be in steps of ATR's by replacing 20 with a variable ATR value
//Profits 2 contains the running profits. This can be used to devise a peak profit based exit.
	if (exitarray[i]==0 AND int(Maxprofit/step)*step>Lastmax AND Maxprofit>=step AND showtarget=="Yes")
	{
		Lastmax=int(Maxprofit/step)*step;
		PlotText(WriteVal(int(Maxprofit/step)*step,1.0),i,H[i]+2*ATRarray[i],colorYellow);
	}





}


if (Lastsig!=0)sessprofit=sessprofit+Cp[i-1];

Plot(avp, "Mid", ColorRGB(120,120,120), styleNoTitle  ); 
Plot(Tradeline, "Trade price", colorBlue ); 

shapebuy = IIf(Buy,shapeUpArrow,Null);
Shapesell= IIf(Sell,shapeHollowDownArrow,Null);
shapeshort = IIf(Short,shapeDownArrow,Null);
Shapecover= IIf(Cover,shapeHollowUpArrow,Null);

shape2= IIf(exit,shapeDownArrow,Null);
PlotShapes( shapeshort, colorRed, 0, High);
PlotShapes( shapebuy, colorGreen, 0, Low);
PlotShapes( shapesell, colorBlue, 0, High);
PlotShapes( shapecover, colorBlue, 0, Low);
PlotText(WriteVal(sessprofit,1.0)+"\n"+WriteVal(tradecount,1.0),i,H[BarCount-1]+2*dmy[BarCount-1],colorYellow);
if (useATRstop)
{
	Plot( IIf(stopArray!=0,stoparray,Null), "StopLine", ParamColor( "Stopline Color:", colorYellow ), ParamStyle( "Stop Style", styleDashed ) );
	PlotShapes( abs( exitArray )*shapeHollowCircle, colorYellow, 0, ValueWhen( stopArray, stopArray, 1 ), 0 );
}

Title = Date()+" Trade Plotter "+ Interval(format=2)+"  "+Name()+" O "+WriteVal(O,1.2)+" H "+WriteVal(H,1.2)+"  L "+WriteVal(L,1.2)+" C "+WriteVal(C,1.2)+" Mid price " +WriteVal(avp,1.2)+EncodeColor(colorYellow)+" Trade Price " +WriteVal(tradeline,1.2);