//+------------------------------------------------------------------+ //| ranking.mqh | //| Rafael Morgado Silva | //| | //+------------------------------------------------------------------+ class AssetData { public: string ticker; bool selected; double price; double rank; double rent; double r2; double mvol; double mtick; double atr; double sharp; double vol; double frac; MyData mydata; AssetData(void) { ticker=""; selected=false; price=0; rank=INT_MIN; rent=0; r2=0; mvol=0; mtick=0; atr=0; sharp=0; vol=0; frac=0; } void Reset(void) { selected=false; price=0; rank=INT_MIN; rent=0; r2=0; mvol=0; mtick=0; atr=0; sharp=0; vol=0; frac=0; } void operator=(const AssetData &r) { ticker=r.ticker; selected=r.selected; price=r.price; rank=r.rank; rent=r.rent; r2=r.r2; mvol=r.mvol; mtick=r.mtick; atr=r.atr; sharp=r.sharp; vol=r.vol; mydata=r.mydata; frac=r.frac; } void Save(int fhandle) { FileWrite(fhandle,ticker,selected,price,rank,rent,r2,mvol,mtick,atr,sharp,vol,frac); } void Load(int fhandle) { ticker=FileReadString(fhandle); selected=FileReadBool(fhandle); price=FileReadNumber(fhandle); rank=FileReadNumber(fhandle); rent=FileReadNumber(fhandle); r2=FileReadNumber(fhandle); mvol=FileReadNumber(fhandle); mtick=FileReadNumber(fhandle); atr=FileReadNumber(fhandle); sharp=FileReadNumber(fhandle); vol=FileReadNumber(fhandle); frac=FileReadNumber(fhandle); } }; class Table { public: //datetime LastUpdate; bool UseLiqFilter; bool UsePreFilter; bool UseLowVolFilter; AssetData data[]; RankTypes MyRank; RankSelectTypes MyRankSelection; MyTimer timer; Table(void){MyRank=RTRent_atr;MyRankSelection=RSTCharge;UseLiqFilter=true;UsePreFilter=true;UseLowVolFilter=true;return;} //void Read(string datafile,bool UseMC=false,int NumberMC=50) void Read(bool UseMC=false,int NumberMC=50) {//read data file if (UseMC) { ArrayResize(data,NumberMC); for(int i=0;i=i;j--) if(data[j-1].rank=i;j--) if((data[j-1].mvol*data[j-1].price)<(data[j].mvol*data[j].price)) //((MathPow(1.0+data[j-1].rent,250)-1.0)*data[j-1].r2)<((MathPow(1.0+data[j].rent,250)-1.0)*data[j].r2)) //(1.0/(data[j-1].mvol*data[j-1].price))<(1.0/(data[j].mvol*data[j].price))) { AssetData x; x=data[j]; data[j]=data[j-1]; data[j-1]=x; } } void Rank(ENUM_TIMEFRAMES timeframe, int period,ENUM_TIMEFRAMES timeframeatr,int patr,Periodicity Periodicidade) { for(int i=0;i0) { switch(VolType) { case VTFixed_Lots: data[i].vol=CalcVol(data[i].ticker,INT_MIN,Risk);break;//Quantidade fixa de lotes case VTFixed_Money: data[i].vol=CalcVol(data[i].ticker,data[i].price,Risk);break;//Capital dividido igualmente na carteira case VTOptim_ATR: data[i].vol=CalcVol(data[i].ticker,Atr(data[i].ticker,patr,timeframeatr),Risk);break;//Otimização usando ATR case VTOptim_Sigma: data[i].vol=CalcVol(data[i].ticker,Stddev(data[i].ticker,patr,timeframeatr),Risk);break;//Otimização usando sigma(Preço) case VTOptim_SigmaRel: data[i].vol=CalcVol(data[i].ticker,Stdrel(data[i].ticker,patr,timeframeatr),Risk);break;//Otimização usando sigma(ln(Preço)) case VTOptim_ATRRel: data[i].vol=CalcVol(data[i].ticker,Atr(data[i].ticker,patr,timeframeatr)/data[i].price,Risk);break;//Otimização usando ATR/preço case VTOptim_SigmaPrice:data[i].vol=CalcVol(data[i].ticker,Stddev(data[i].ticker,patr,timeframeatr)/data[i].price,Risk);break;//Otimização usando sigma(Preço)/preço } data[i].frac=data[i].vol*data[i].price/Money.Balance();//frac é a carga do ativo switch(MyRank) { case RTRent: data[i].rank=(MathPow(1.0+data[i].rent,250)-1.0)*data[i].r2;break;//-(rt[0].close-rt[period-1].close)/rt[0].close; case RTRent_atr: data[i].rank=((MathPow(1.0+data[i].rent,250)-1.0)*data[i].r2)/Atr(data[i].ticker,period,timeframe);break;//atr com period e timeframe case RTRent_mvol: data[i].rank=(MathPow(1.0+data[i].rent,250)-1.0)*data[i].r2/Stddev(data[i].ticker,period,timeframe);break;//(data[i].mvol*data[i].price) case RTRent_atr_mvol:data[i].rank=(MathPow(1.0+data[i].rent,250)-1.0)*data[i].r2/Stdrel(data[i].ticker,period,timeframe);break;//data[i].mtick//*data[i].mvol/data[i].atr;break; case RTHighVolidx: data[i].rank=Atr(data[i].ticker,period,timeframe);break; case RTLowVolidx: { double thisatr=Atr(data[i].ticker,period,timeframe); data[i].rank=((thisatr!=0)?(1.0/thisatr):INT_MIN); break; } case RTHighLiq: data[i].rank=data[i].mvol*data[i].price;break; case RTLowLiq: data[i].rank=1.0/(data[i].mvol*data[i].price);break; case RTHighNeg: data[i].rank=data[i].mtick;break; case RTLowNeg: data[i].rank=1.0/(data[i].mtick);break; case RTHighGap: data[i].rank=(rt[period-1].open-rt[period-2].close)/data[i].price;break; case RTLowGap: data[i].rank=(-rt[period-1].open+rt[period-2].close)/data[i].price;break; case RTHighGapLow: data[i].rank=(rt[period-1].open<=rt[period-2].low)?(rt[period-1].open-rt[period-2].low)/rt[period-2].low:INT_MIN;break; case RTLowGapLow: data[i].rank=Elasticity(data[i].ticker,period,timeframe);break;//(-rt[period-1].open+rt[period-2].low)/rt[period-2].low;break; case RTInvRent: data[i].rank=1.0/MathAbs((MathPow(1.0+data[i].rent,250)-1.0)*data[i].r2);break; case RTAleatory: data[i].rank=rand();break; case RTHighVolstd: { //double pricevector[]; //ArrayResize(pricevector,period); //for (int j=0;j=70)&&(UseNeutralization?data[i].ticker!=NeutralAsset1:true)&&(UseNeutralization?data[i].ticker!=NeutralAsset2:true)) data[i].Reset();// j++; } } } //---------- BubbleSort(); //LastUpdate=Periodicidade*(datetime)floor(TimeCurrent()/Periodicidade); return; } void Select(int nselect=0,double Capital=0/*,double FTLiqFrac=0.95,int FTPeriod=30,ENUM_TIMEFRAMES FTTimeframe=PERIOD_M5,string FTLiqSymbolref="IBOV"*/,double FTPreMin=4) { Filters TSPriceMin,TSLowVol;//TSLiquidity, //TSLiquidity.myfilter=FTLiq; //TSLiquidity.FTLiqFrac=FTLiqFrac; //TSLiquidity.FTPeriod=FTPeriod; //TSLiquidity.FTTimeframe=FTTimeframe; //TSLiquidity.FTLiqSymbolref=FTLiqSymbolref; TSPriceMin.myfilter=FTPre; TSPriceMin.FTPreMin=FTPreMin; TSLowVol.myfilter=FTRent; TSLowVol.FTTimeframe=PERIOD_D1; TSLowVol.FTPeriod=120; int count=0; double MyCharge=0; for(int i=0;i0) data[i].selected=true;else data[i].selected=false;break; case RSTCharge: { if (MyCharge<(0.9*Capital)) { data[i].selected=true; MyCharge+=data[i].vol*data[i].price; //if (MyCharge>Capital)//TODO, ou pode ser resolvido com o Renorm } else data[i].selected=false; break; } case RSTAll:data[i].selected=true;break; } if (UseNeutralization&&((data[i].ticker==NeutralAsset1)||(data[i].ticker==NeutralAsset2))) { if (data[i].ticker!="") data[i].selected=true; else data[i].selected=false; } } else data[i].selected=false; string prefix=StringSubstr(data[i].ticker,0,4); if (data[i].selected) for (int j=0;j0) { ArrayResize(data,datasize); for (int i=0;i