100 lines
No EOL
6.1 KiB
MQL5
100 lines
No EOL
6.1 KiB
MQL5
//+------------------------------------------------------------------+
|
|
//| filters.mqh |
|
|
//| Rafael Morgado Silva |
|
|
//| |
|
|
//+------------------------------------------------------------------+
|
|
enum FILTER_TYPES
|
|
{
|
|
FTNone,//Nenhum
|
|
FTLiq,//Liquidez mínima
|
|
FTPre,//Preço mínimo
|
|
FTRent,//Rentabilidade positiva
|
|
FTHiVol,//Volatilidade alta
|
|
FTLowVol,//Volatilidade baixa
|
|
FTCross//Cruzamento de mé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é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);
|
|
}
|
|
}; |