class Core { private: MqlRates priceInfo[]; //Indi Data int bb_handle; int macd_handle; int ema_handle; int rsi_handle; double ema[]; double rsi[]; double upper[]; double lower[]; double mid[]; double macd[]; double sig[]; //Divergance Check double pri; double indi; double rsii; double pr[2]; double ind[2]; double rsi_data[2]; double lowest; double highest; public: int Signal(string symbol, ENUM_TIMEFRAMES tf) { //Create Indicator Handlers bb_handle = iBands(symbol,PERIOD_M30,20,0,2,PRICE_CLOSE); macd_handle = iMACD(symbol,tf,12,26,9,PRICE_CLOSE); ema_handle = iMA(symbol,PERIOD_M30,200,0,MODE_EMA,PRICE_CLOSE); rsi_handle = iRSI(symbol,tf, 14, PRICE_CLOSE); //Alining Arrays ArraySetAsSeries(priceInfo, true); ArraySetAsSeries(rsi, true); ArraySetAsSeries(ema, true); ArraySetAsSeries(upper,true); ArraySetAsSeries(mid,true); ArraySetAsSeries(lower,true); ArraySetAsSeries(macd,true); ArraySetAsSeries(sig,true); //Copying Handler Buffers to Arrays CopyRates(symbol, tf, 0, 3, priceInfo); CopyBuffer(rsi_handle,0,0,3,rsi); CopyBuffer(ema_handle,0,0,3,ema); CopyBuffer(bb_handle,1,0,3,upper); CopyBuffer(bb_handle,0,0,3,mid); CopyBuffer(bb_handle,2,0,3,lower); CopyBuffer(macd_handle,0,0,3,macd); CopyBuffer(macd_handle,1,0,3,sig); //Calculating Signal pri = ((pri == 0 && macd[0] < 0 && macd[0] < sig[0] && priceInfo[1].low < priceInfo[2].low) || (pri != 0 && macd[0] < 0 && macd[0] < sig[0] && priceInfo[1].low < pri)) ? priceInfo[1].low : ((pri == 0 && macd[0] > 0 && macd[0] > sig[0] && priceInfo[1].high > priceInfo[2].high) || (pri != 0 && macd[0] > 0 && macd[0] > sig[0] && priceInfo[1].high > pri)) ? priceInfo[1].high : pri; indi = ((indi == 0 && macd[0] < 0 && macd[0] < sig[0] && macd[1] < macd[2]) || (indi != 0 && macd[0] < 0 && macd[0] < sig[0] && macd[1] < indi) || (indi == 0 && macd[0] > 0 && macd[0] > sig[0] && macd[1] > macd[2]) || (indi != 0 && macd[0] > 0 && macd[0] > sig[0] && macd[1] > indi)) ? macd[1] : indi; rsii = ((rsii == 0 && macd[0] < 0 && macd[0] < sig[0] && macd[1] < macd[2]) || (rsii != 0 && macd[0] < 0 && macd[0] < sig[0] && rsi[1] < rsii) || (rsii == 0 && macd[0] > 0 && macd[0] > sig[0] && macd[1] > macd[2]) || (rsii != 0 && macd[0] > 0 && macd[0] > sig[0] && rsi[1] > rsii)) ? rsi[1] : rsii; if((macd[2] < 0 && macd[1] > 0) || (macd[2] > 0 && macd[1] < 0)) { pri = 0; indi = 0; rsii = 0; pr[0] = 0; pr[1] = 0; ind[0] = 0; ind[1] = 0; rsi_data[0] = 0; rsi_data[1] = 0; } if(pr[1] == 0 && ((macd[0] < 0 && macd[2] < sig[2] && macd[1] > sig[1]) || (macd[0] > 0 && macd[2] > sig[2] && macd[1] < sig[1]))) { pr[1] = pri; ind[1] = indi; rsi_data[1] = rsii; pri = 0; indi = 0; rsii = 0; } if(pr[1] != 0 && ((macd[0] < 0 && macd[2] < sig[2] && macd[1] > sig[1]) || (macd[0] > 0 && macd[2] > sig[2] && macd[1] < sig[1]))) { pr[0] = pri; ind[0] = indi; rsi_data[0] = rsii; pri = 0; indi = 0; rsii = 0; } if(pr[0] != 0 && pr[1] != 0) { int loi = ArrayMinimum(pr, 0, WHOLE_ARRAY); lowest = pr[loi]; int hai = ArrayMaximum(pr, 0, WHOLE_ARRAY); highest = pr[hai]; } if(TimeCurrent() == priceInfo[0].time && pr[0] != 0 && pr[1] != 0) { if(ind[1] > 0 && priceInfo[0].close > mid[0] && priceInfo[0].close < upper[0]) { if((pr[1] > pr[0] && ind[1] < ind[0] && rsi_data[1] < rsi_data[0] && rsi_data[0] > 70) || (pr[1] < pr[0] && ind[1] > ind[0] && rsi_data[1] > rsi_data[0] && rsi_data[1] > 70)) { //Bear = true; //Print("************************"); //Print("Bear M1: ", bear1); //Print("Price Array M1 is Full, current: ", pr[0], ", past: ", pr[1]); //Print("Indicator Array M1 is Full, current: ", ind[0], ", past: ", ind[1]); pri = 0; indi = 0; rsii = 0; pr[0] = 0; pr[1] = 0; ind[0] = 0; ind[1] = 0; rsi_data[0] = 0; rsi_data[1] = 0; return(-1); } else { pri = 0; indi = 0; rsii = 0; pr[0] = 0; pr[1] = 0; ind[0] = 0; ind[1] = 0; rsi_data[0] = 0; rsi_data[1] = 0; return(0); } } else if(ind[1] < 0 && priceInfo[0].close < mid[0] && priceInfo[0].close > lower[0]) { if((pr[1] > pr[0] && ind[1] < ind[0] && rsi_data[1] < rsi_data[0] && rsi_data[0] < 30) || (pr[1] < pr[0] && ind[1] > ind[0] && rsi_data[1] > rsi_data[0] && rsi_data[1] < 30)) { //Bull = true; //Print("************************"); //Print("Bull M1: ", bull1); //Print("Price Array M1 is Full, current: ", pr[0], ", past: ", pr[1]); //Print("Indicator Array M1 is Full, current: ", ind[0], ", past: ", ind[1]); pri = 0; indi = 0; rsii = 0; pr[0] = 0; pr[1] = 0; ind[0] = 0; ind[1] = 0; rsi_data[0] = 0; rsi_data[1] = 0; return(1); } else { pri = 0; indi = 0; rsii = 0; pr[0] = 0; pr[1] = 0; ind[0] = 0; ind[1] = 0; rsi_data[0] = 0; rsi_data[1] = 0; return(0); } } else { //Print("************************"); //Print("Bull/Bear M1: ", bull1, bear1); //Print("Price Array M1 is Full, current: ", pr[0], ", past: ", pr[1]); //Print("Indicator Array M1 is Full, current: ", ind[0], ", past: ", ind[1]); pri = 0; indi = 0; rsii = 0; pr[0] = 0; pr[1] = 0; ind[0] = 0; ind[1] = 0; rsi_data[0] = 0; rsi_data[1] = 0; return(0); } } return(0); } double Ema() {return(ema[0]);} double Upper() {return(upper[0]);} double Mid() {return(mid[0]);} double Lower() {return(lower[0]);} double Lowest() {return(lowest);} double Highest() {return(highest);} }; //+------------------------------------------------------------------+ //+------------------------------------------------------------------+