Puga/PugaFiles/Core.mqh

221 lines
7.7 KiB
MQL5
Raw Permalink Normal View History

2025-05-30 16:18:30 +02:00
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);}
};
//+------------------------------------------------------------------+
//+------------------------------------------------------------------+