// Downloaded From https://www.WiseStockTrader.com
//Gen_BRKOUT.AFL

#include_once <LibA.afl>;

pebstime = Hour()*60+Minute();

OptimizerSetEngine("cmae");

Lastticktime = Param("Lastticktime",9999,0,9999,1); //If like in SA there is a closing tick instead of a closing bar, then we execute immediately there instead of the usual delay of 1 bar
Firsttradetime = Param("FirstTradeTime",0,0,9999,1); //Never do any trade before this time
Lasttradetime = Param("LastTradeTime",9999,0,9999,1); //Never do any trade after this time
Firstsignaltime = Param("FirstSignalTime",0,0,9999,1); //do not trade on signals that trigger before this time, remember trade is entered usually 1 bar delay after signal
Lastsignaltime = Param("LastSignalTime",9999,0,9999,1); //do not trade on signals that trigger after this time, remember trade is entered usually 1 bar delay after signal
ExitatClose = ParamToggle("Exit at Close of Day","No|Yes");
xxxdelay = 1-(pebstime>=Lastticktime)*1; //Ignore the delay when last tick, otherwise that trade will only happen next morning

firststoptime = Param("First Stoptime",0,0,9999,1);
Laststoptime = Param("Last Stoptime",9999,0,9999,1);
TradeSL = Param("Trade stoploss",99999,0,99999,1);
TradeSP = Param("Trade stopprofit",99999,0,99999,1);
DaySL = Param("Day stoploss",99999,0,99999,1);
DaySP = Param("Day stopprofit",99999,0,99999,1);
MonthSL = Param("Month stoploss",99999,0,99999,1);
MonthSP = Param("Month stopprofit",99999,0,99999,1);


n_fn1_par = Param("Channel n",20,1,100,1);
n_fn2_par = Param("Channelwidth n",2,1,10,1);

n_fn1_opt = ParamToggle("Optimize Channel n","Yes|No");
n_fn2_opt = ParamToggle("Optimize Channelwidth","Yes|No");

if (n_fn1_opt==1){
n_fn1= n_fn1_par;
}
else
{
n_fn1 = Optimize("Channel n",n_fn1_par,1,100,1);
}

if (n_fn2_opt==1){
n_fn2 = n_fn2_par;
}
else
{
n_fn2 = Optimize("Channelwidth n",n_fn2_par,1,20,0.25);
}




fn1 = ParamList("Top BRK","HHV|BOLLINGER|KELTNER|FunctionHigh");
fn2 = ParamList("Bottom BRK","LLV|BOLLINGER|KELTNER|FunctionLow");


target_fn = ParamList("TargetFn","OHLC4|O|H|L|C|ema|sma|brkema|brkema2|brkema3|brkema4|frama|kama|tsf|dema|tema|wilder|hull");
n_targetfn_par = Param("n_TargetFn",20,1,100,1);
n_TargetFn_opt = ParamToggle("Optimize n_TargetFn","Yes|No");
if (n_TargetFn_opt==1){
n_targetfn = n_TargetFn_par;
}
else
{
n_targetfn = Optimize("n_TargetFn",n_targetFn_par,1,100,1);
}


Cntxt = ParamList("Context","None|Contextfilter|Contextfilter2");

symbol = ParamStr("Basesymbol",Name());

// trade on next bar open
SetTradeDelays( 0, 0, 0, 0 );
BuyPrice = SellPrice = Open; 
ShortPrice = CoverPrice = Open;

//Points only
PositionSize = MarginDeposit = 1;

SetForeign(symbol);

switch (target_fn){

case "OHLC4":
xxx = (O+H+L+C)/4;
break;
case "O":
xxx = O;
break;
case "H":
xxx=H;
break;
case "L":
xxx=L;
break;
case "C":
xxx = C;
break;
case "ema":
xxx = EMA(C,n_targetfn);
break;
case "sma":
xxx = MA(C,n_targetfn);
break;
case "brkema":
xxx = brkema(n_targetfn);
break;
case "brkema2":
xxx = brkema2(n_targetfn);
break;
case "brkema3":
xxx = brkema3(n_targetfn);
break;
case "brkema4":
xxx = brkema4(n_targetfn);
break;
case "frama":
xxx = frama(n_targetfn);
break;
case "kama":
xxx = kama(n_targetfn,2,30);
break;
case "tsf":
xxx = TSF(C,n_targetfn);
break;
case "dema":
xxx = DEMA(C,n_targetfn);
break;
case "tema":
xxx = TEMA(C,n_targetfn);
break;
case "wilder":
xxx = Wilders(C,n_targetfn);
break;
case "hull":
xxx = HullMA(C,n_targetfn,0);
break;

}

switch (fn1){
case "HHV":
_TRACE("top hhv");
aaa = Ref(HHV(H,n_fn1),-1);
break;
case "BOLLINGER":
_TRACE("top bollinger");
aaa = BBandTop(xxx,n_fn1,n_fn2);
break;
case "KELTNER":
_TRACE("top keltner");
CenterLine = MA( xxx, n_fn1 );
aaa = CenterLine + n_fn2 * ATR( n_fn1 );
break;
case "FunctionHigh":
_TRACE("functionhigh");
aaa = Ref(HHV(xxx,n_fn1),-1);
break;

}

switch (fn2){

case "LLV":
_TRACE("bottom llv");
bbb = Ref(LLV(L,n_fn1),-1);
break;
case "BOLLINGER":
_TRACE("bottom bollinger");
bbb = BBandBot(xxx,n_fn1,n_fn2);
break;
case "KELTNER":
_TRACE("bottom keltner");
CenterLine = MA( xxx, n_fn1 );
bbb = CenterLine - n_fn2 * ATR( n_fn1 );
break;
case "FunctionLow":
_TRACE("functionlow");
bbb = Ref(LLV(xxx,n_fn1),-1);
break;

}

Buysignal = (xxx>aaa) AND (pebstime>=firstsignaltime) AND (pebstime<=Lastsignaltime);
Sellsignal = (xxx<bbb) AND (pebstime>=firstsignaltime) AND (pebstime<=Lastsignaltime) OR ((pebstime>=Lastticktime) AND ExitAtClose );

Shortsignal = (xxx<bbb) AND (pebstime>=firstsignaltime) AND (pebstime<=Lastsignaltime);
Coversignal = (xxx>aaa) AND (pebstime>=firstsignaltime) AND (pebstime<=Lastsignaltime) OR ((pebstime>=Lastticktime) AND ExitAtClose);


//is this the best spot to remove the extra signals? i think so because after contextfilters you expect and do not want to remove consecutive buy or short signals 
Buysignal = ExRem(Buysignal,Shortsignal);
Shortsignal = ExRem(Shortsignal,Buysignal);


Longstate = Flip(Buysignal,(Sellsignal OR Shortsignal));
Shortstate = Flip(Shortsignal,(Coversignal OR BuySignal));

Totalstate = Longstate*1+Shortstate*(-1);
totalstate = Ref(totalstate,-xxxdelay); //apply trade delay before applying contextfilter as contextfilters already have trade delay built in




switch (Cntxt){
case "None":
break;
case "Contextfilter":
Totalstate = Contextfilter(Totalstate);
break;
case "Contextfilter2":
Totalstate = Contextfilter2(Totalstate);
break;
}

//apply stops; delay already built in here correctly? still need to adjust for lastticktime 0 delay
totalstate = TradeSLSP(totalstate,1,tradeSL,tradeSP,firststoptime,Laststoptime,Lastticktime);
totalstate = DaySLSP(totalstate,1,DaySL,DaySP,firststoptime,Laststoptime,Lastticktime);
totalstate = MonthSLSP(totalstate,1,MonthSL,MonthSP,firststoptime,Laststoptime,Lastticktime);


Buysignal = (totalstate>0) AND (pebstime>=firsttradetime) AND (pebstime<=Lasttradetime);
Sellsignal = (totalstate<=0) AND (pebstime>=firsttradetime) AND (pebstime<=Lasttradetime);

Shortsignal = (totalstate<0) AND (pebstime>=firsttradetime) AND (pebstime<=Lasttradetime);
Coversignal = (totalstate>=0) AND (pebstime>=firsttradetime) AND (pebstime<=Lasttradetime);

Buysignal = ExRem(Buysignal,Shortsignal);
Shortsignal = ExRem(Shortsignal,Buysignal);

RestorePriceArrays();


Buy = Buysignal;
Sell = Sellsignal;

Short = Shortsignal;
Cover = Coversignal;

Longstate = Flip(Buysignal,(Sellsignal OR Shortsignal));
Shortstate = Flip(Shortsignal,(Coversignal OR BuySignal));

Totalstate = Longstate*1+Shortstate*(-1);
//this totalstate already has the trade delay in

PlotOHLC(0,0,Totalstate,Totalstate,_DEFAULT_NAME(),IIf(Totalstate<0,colorRed,colorGreen),styleCloud);
//Plot(aaa,"aaa",ParamColor( "Color", colorCycle ), ParamStyle("Style") ); 
//Plot(bbb,"bbb",ParamColor( "Color", colorCycle ), ParamStyle("Style") ); 


SetChartBkColor(colorBlack);