//+------------------------------------------------------------------+ //| Spread recorder.mq4 | //| positiveday - forexometro.it | //| | //+------------------------------------------------------------------+ #property copyright "positiveday - forexometro.it" #property link "" //---- input parameters extern int StartHour = 21; extern int EndHour = 3; extern string DecimalPointChar = ","; extern int OffsXStatus = 10; extern int OffsYStatus = 10; extern int StatusCorner = 0; extern string StatusFont = "Courier New"; extern color StatusColor = White; extern int StatusSizeChar = 10; int FileSpread; double MyPoint; bool InitOK; double SpreadArray[900][2]; double Spread,MaxSpread,MinSpread; int PrecBarTimeSlow,LastTickTime,TickCounter; bool FileAperto; int init() { //---- if(!IsConnected())return(0); if (Digits < 4) MyPoint = 0.01; if (Digits > 3) MyPoint = 0.0001; MinSpread = 100; StatoTextOut("=== Spread recorder by positiveday - © 2010 ===",1); InitOK=true; return(0); } int deinit() { //---- for (int i = ObjectsTotal(OBJ_LABEL); i >= 0;i--) if (StringFind(ObjectName(i),WindowExpertName(), 0) >= 0)ObjectDelete(ObjectName(i)); //---- return(0); } int start() { bool RecordTimeOk; if(!IsConnected())return; if(Period() != PERIOD_M15) { StatoTextOut("Wrong timeframe! Only 15M chart",2); StatoTextOut("Wrong timeframe! Only 15M chart",3); StatoTextOut("Wrong timeframe! Only 15M chart",4); return; } if(InitOK==false)init(); int DeltaTime = TimeCurrent()-LastTickTime; LastTickTime = TimeCurrent(); SpreadArray[TickCounter][0] = Spread; SpreadArray[TickCounter][1] = DeltaTime; TickCounter++; Spread = ( Ask - Bid ) / MyPoint ; if (MaxSpread < Spread) MaxSpread = Spread; if (MinSpread > Spread) MinSpread = Spread; StatoTextOut("Spread now :" + DoubleToStr(Spread,1),2); StatoTextOut("Spread Max :" + DoubleToStr(MaxSpread,1),3); StatoTextOut("Spread Min :" + DoubleToStr(MinSpread,1),4); RecordTimeOk = false; if ( StartHour > EndHour) { if(Hour() >= StartHour || Hour() < EndHour) RecordTimeOk=true; } if ( StartHour < EndHour) { if(Hour() >= StartHour && Hour() < EndHour) RecordTimeOk=true; } if ( StartHour == EndHour) RecordTimeOk=true; if(PrecBarTimeSlow < Time[0]) { PrecBarTimeSlow = Time[0]; }else return(false); TickCounter = 0; // calcolo spread medio double AvgSpread;int TotalTime; for (int T = 0 ; T < 900 ; T++ ) { AvgSpread = AvgSpread + SpreadArray[T][0] * SpreadArray[T][1]; TotalTime = TotalTime + SpreadArray[T][1]; SpreadArray[T][0] = 0.0 ; SpreadArray[T][1] = 0.0 ; } AvgSpread /= TotalTime; StatoTextOut("Spread Avg :" + DoubleToStr(AvgSpread,1),5); // se non è il momento di salvare i dati si esce if (!RecordTimeOk) { MaxSpread=Spread; MinSpread=Spread; StatoTextOut("Not recording time",6); if (FileAperto) { FileClose(FileSpread); FileAperto = false; } return; } // qui si salvano i dati StatoTextOut("Recording active!",6); if (!FileAperto) { FileSpread = FileOpen( AccountCompany() + " " + B2S(IsDemo()) + " - " + Symbol() + " - spread dalle ore " + StartHour + " del " + StringSubstr( TimeToStr(TimeCurrent(),TIME_DATE),8 ,2) + "-" + StringSubstr( TimeToStr(TimeCurrent(),TIME_DATE),5 ,2) + "-" + StringSubstr( TimeToStr(TimeCurrent(),TIME_DATE),0 ,4) + " alle ore "+ EndHour + ".csv", FILE_WRITE|FILE_CSV,';' ); FileWrite(FileSpread,"Date","SpreadMax","SpreadMin","SperadAvg"); FileAperto = true ; } FileWrite(FileSpread,ChangePointData(TimeToStr(TimeCurrent(),TIME_DATE|TIME_MINUTES)),ChangePointNum(DoubleToStr(MaxSpread,1)),ChangePointNum(DoubleToStr(MinSpread,1)),ChangePointNum(DoubleToStr(AvgSpread,1))); FileFlush(FileSpread); MaxSpread=Spread; MinSpread=Spread; return(0); } //+------------------------------------------------------------------+ string B2S (bool Valore) { if (Valore == true) return ("Demo"); return ("Real"); } string ChangePointNum (string Numero) { if(DecimalPointChar == "" || DecimalPointChar == ".") return(Numero); return(StringSetChar(Numero, StringFind(Numero,"."), StringGetChar( DecimalPointChar, 0))); } string ChangePointData (string Data) { Data = StringSetChar(Data, 4,47); Data = StringSetChar(Data, 7,47); return (Data); } void StatoTextOut(string Testo, int Riga) { string NomeOggetto = WindowExpertName() + "Status" + Riga; if (ObjectFind(NomeOggetto) == -1) { ObjectCreate(NomeOggetto, OBJ_LABEL, 0, 0, 0); ObjectSet(NomeOggetto, OBJPROP_XDISTANCE, OffsXStatus); ObjectSet(NomeOggetto, OBJPROP_YDISTANCE, OffsYStatus + (Riga * StatusSizeChar) + (3 * Riga) ); ObjectSet(NomeOggetto, OBJPROP_CORNER, StatusCorner); } ObjectSetText(NomeOggetto, Testo, StatusSizeChar, StatusFont, StatusColor); }