Biblioteca2/Include/filters.mqh

100 lines
6.1 KiB
MQL5
Raw Permalink Normal View History

2025-05-30 14:43:36 +02:00
<EFBFBD><EFBFBD>//+------------------------------------------------------------------+
//| filters.mqh |
//| Rafael Morgado Silva |
//| |
//+------------------------------------------------------------------+
enum FILTER_TYPES
{
FTNone,//Nenhum
FTLiq,//Liquidez m<EFBFBD>nima
FTPre,//Pre<EFBFBD>o m<EFBFBD>nimo
FTRent,//Rentabilidade positiva
FTHiVol,//Volatilidade alta
FTLowVol,//Volatilidade baixa
FTCross//Cruzamento de m<EFBFBD>dia
};
class Filters
{
public:
string symbol;
FILTER_TYPES myfilter;
double FTPreMin,FTLiqFrac;
int FTPeriod;//,FTVolPAtr1,FTVolPAtr2;
ENUM_TIMEFRAMES FTTimeframe;
string FTLiqSymbolref;
Filters(void)
{
myfilter=FTNone;
symbol=Symbol();
FTPreMin=4;
FTLiqFrac=0.95;
FTPeriod=30;
FTTimeframe=PERIOD_D1;
FTLiqSymbolref="IBOV";
}
void operator=(const Filters &r)
{
myfilter=r.myfilter;
symbol=r.symbol;
FTPreMin=r.FTPreMin;
FTLiqFrac=r.FTLiqFrac;
FTPeriod=r.FTPeriod;
FTTimeframe=r.FTTimeframe;
FTLiqSymbolref=r.FTLiqSymbolref;
}
bool Filter(ENUM_OP_TYPES OpType)
{
bool ret=false;//false=nofilter;true=block
switch(myfilter)
{
case FTNone:break;
case FTLiq://liquidez relativa ao ibov
{
if (Bars(symbol,FTTimeframe,TimeLocal()-FTPeriod*24*3600,TimeLocal())<
FTLiqFrac*Bars(FTLiqSymbolref,FTTimeframe,TimeLocal()-FTPeriod*24*3600,TimeLocal()))
return (true);
break;
}
case FTPre:
{
MqlRates rt[];
if(CopyRates(symbol,PERIOD_D1,0,1,rt)==1)
if (rt[0].close<FTPreMin) return(true);
break;
}
case FTRent:
{
MqlRates rt[];
if(CopyRates(symbol,FTTimeframe,0,FTPeriod,rt)==FTPeriod)
{
double slope,r2,sharp,mvol,mtick;
MSQ(rt,slope,r2,sharp,mvol,mtick,FTPeriod);
slope=MathPow(1.0+slope,250)-1.0;
slope*=r2;
if (slope<0) return (true);
}
break;
}
case FTHiVol://filtra alta volatilidade
{
if(Atr(symbol,13,FTTimeframe)>Atr(symbol,55,FTTimeframe)) return(true);//Alta volatilidade
break;
}
case FTLowVol://filtra baixa volatilidade
{
if(Atr(symbol,13,FTTimeframe)<Atr(symbol,55,FTTimeframe)) return(true);//Alta volatilidade
break;
}
case FTCross://filtra por cruzamento de m<EFBFBD>dia
{
double Avg50=Avg(symbol,50,PERIOD_D1),Avg100=Avg(symbol,100,PERIOD_D1);
if ((OpType==Buy)&&(Avg50<=Avg100)) return(true);
if ((OpType==Sell)&&(Avg50>=Avg100)) return(true);
break;
}
}
return(ret);
}
};