221 lines
7.7 KiB
MQL5
221 lines
7.7 KiB
MQL5
|
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);}
|
||
|
};
|
||
|
//+------------------------------------------------------------------+
|
||
|
|
||
|
//+------------------------------------------------------------------+
|