//+------------------------------------------------------------------+ //| TimeLines.mq4 | //| Denis Orlov | //| http://denis-or-love.narod.ru | /* Автоматическая разлиновка графика по времени, таймер и АНЕКДОТ!!!. файл Anecdote.txt следует сохранить в папке experts\files в директории вашего терминала. Например : С:\Program Files\ Broco Trader (или что там у Вас :-) \experts\files Сам идикатор следует поместить в папку experts\indicators. Подробно: http://codebase.mql4.com/ru/6166 Automatic marking of the chart by the time and the timer. In detail: http://codebase.mql4.com/6095 *** Все мои индикаторы: http://codebase.mql4.com/ru/author/denis_orlov *** ПОЛЬЗУЙТЕСЬ И ПРОЦВЕТАЙТЕ! *** All my indicators: http://codebase.mql4.com/author/denis_orlov *** USE AND PROSPER! */ //+------------------------------------------------------------------+ #property copyright "Denis Orlov" #property link "http://denis-or-love.narod.ru" #include //for ErrorDescription #property indicator_chart_window #property indicator_buffers 1 #property indicator_color1 Green double Smile[]; #define Pr "TimeLines " extern string FileName="Anecdote.txt"; extern int period=15; extern bool ShowAnecdotes=True; extern bool ShowSmiles=True; extern bool ShowLines=True; extern color LineColor=Blue; extern int LineWidth=1; extern int LineStyle=2; extern int History=100; extern bool Back=true;//Рисовать как фон datetime per; string Arr[]; //+------------------------------------------------------------------+ //| Custom indicator initialization function | //+------------------------------------------------------------------+ int init() { //---- indicators /*if(period<=Period()|| period<5) Alert( "Индикатор TimeLines не будет работать на этом ТФ"+"\n"+ "со значением \"period\"="+period+"\n"+ "Измените это значение, пожалуйста."+"\n"+ "Indicator TimeLines will not work on this TF"+"\n"+ "with the value of the \"period\"="+period+"\n"+ "Change this value, please.");*/ if(ShowAnecdotes) { int fname=FileOpen(FileName,FILE_BIN|FILE_READ); if(fname>0) { string str; ArrayResize(Arr,0); while(!FileIsEnding(fname)) { str=GetStringFromFile(fname); while(StringFind(str,"\t")>-1 && StringLen(str)>1) str=_StringReplace(str,"\t","\n"); if(StringLen(str)<5) continue; int Size=ArraySize(Arr); ArrayResize(Arr,Size+1); Arr[Size]=str; } // Alert(Size+1); } else { int err=GetLastError(); Comment("Ошибка открытия файла \""+FileName+"\"\n"+ "Error of opening file ",err,": ",ErrorDescription(err)); } } //if(ShowAnecdotes) IndicatorShortName("Anecdote "+PeriodToStr(period)); SetIndexBuffer(0,Smile); SetIndexStyle(0,DRAW_ARROW,STYLE_DOT,2); SetIndexArrow(0,74); SetIndexLabel(0,"Smile Time "+PeriodToStr(period)); //---- return(0); } //+------------------------------------------------------------------+ //| Custom indicator deinitialization function | //+------------------------------------------------------------------+ int deinit() { //---- Delete_My_Obj(Pr+PeriodToStr(period)); //---- return(0); } //+------------------------------------------------------------------+ //| Custom indicator iteration function | //+------------------------------------------------------------------+ int start() { if(period<=Period() || period<5) return(0); int Counted_bars=IndicatorCounted(); if(Counted_bars>0) { if(per==Time[0]) return(0); per= Time[0]; CheckAndDraw(Time[0]); return(0); } int i=Bars-Counted_bars-1; // Индекс первого непосчитанного if(History>0 && i>History-1) // Если много баров то .. i=History-1; while(i>=0) // Цикл по непосчитанным барам { CheckAndDraw(Time[i]); i--; } //---- return(0); } //+------------------------------------------------------------------+ void CheckAndDraw(datetime t) { int TM=TimeMinute(t),TH=TimeHour(t); bool draw=false; if(period==5) { if(TM==0 || TM==5 || TM==10 || TM==15 || TM==20 || TM==25 || TM==30 ||TM==35 ||TM==40 ||TM==45||TM==50||TM==55) draw=true; } if(period==15) { if( TM==0 || TM==15 ||TM==30 ||TM==45) draw=true; } if(period==30) { if( TM==0 || TM==30) draw=true; } if(period==60) { if(TM==0) draw=true; } if(period==240) { if(TM==0 && (TH==0 || TH==4 || TH==8 || TH==12 || TH==16 || TH==20 || TH==24)) draw=true; } if(period==1440) { if(TH==0 && TM==0) draw=true; } if(period==10080) { if(TH==0 && TM==0 && TimeDayOfWeek(t)==1) draw=true; } if(period==43200) { if(TH==0 && TM==0 && TimeDay(t)==1) draw=true; } string LName=Pr+PeriodToStr(period)+" "+TimeToStr(t,TIME_DATE|TIME_MINUTES); if(ShowLines && draw && ObjectFind(LName)<0) { ObjectCreate(LName,OBJ_VLINE,0,t,0); ObjectSet(LName,OBJPROP_COLOR,LineColor); ObjectSet(LName,OBJPROP_WIDTH,LineWidth); if(Back==true)ObjectSet(LName,OBJPROP_BACK,Back); if(LineWidth<2) ObjectSet(LName,OBJPROP_STYLE,LineStyle); // ObjectSetText( LName, DoubleToStr(TM,0)); } datetime nt=t+period*60; LName=Pr+PeriodToStr(period)+" "+TimeToStr(nt,TIME_DATE|TIME_MINUTES); if(ShowAnecdotes && draw && Time[0]==t && ObjectFind(LName)<0) { MathSrand((int)TimeLocal()); int i=MathRand(); while(i>ArraySize(Arr)-1) i=MathRand(); //Comment("Анекдот №"+Arr[i]); Alert("Smile Time "+PeriodToStr(period)+": "+TimeToStr(Time[0],TIME_DATE|TIME_MINUTES)+" ! Анекдот №"+Arr[i]); if(ShowSmiles) Smile[0]=High[1]+(High[1]-Low[1])*3; } if(ShowLines && draw && ObjectFind(LName)<0) { ObjectCreate(LName,OBJ_VLINE,0,nt,0); ObjectSet(LName,OBJPROP_COLOR,LineColor); ObjectSet(LName,OBJPROP_WIDTH,LineWidth); if(Back==true)ObjectSet(LName,OBJPROP_BACK,Back); if(LineWidth<2) ObjectSet(LName,OBJPROP_STYLE,LineStyle); // ObjectSetText( LName, DoubleToStr(TM,0)); } } //---------------------- void Delete_My_Obj(string Prefix) {//Alert(ObjectsTotal()); for(int k=ObjectsTotal()-1; k>=0; k--) // По количеству всех объектов { string Obj_Name=ObjectName(k); // Запрашиваем имя объекта string Head=StringSubstr(Obj_Name,0,StringLen(Prefix));// Извлекаем первые сим if(Head==Prefix)// Найден объект, .. { ObjectDelete(Obj_Name); //Alert(Head+";"+Prefix); } } } //------------------------------- string PeriodToStr(int Per) { switch(Per) // Расчёт для.. { // .. различных ТФ case 1: return("M1"); break;// Таймфрейм М1 case 5: return("M5"); break;// Таймфрейм М5 case 15: return("M15"); break;// Таймфрейм М15 case 30: return("M30"); break;// Таймфрейм М30 case 60: return("H1"); break;// Таймфрейм H1 case 240: return("H4"); break;// Таймфрейм H4 case 1440: return("D1"); break;// Таймфрейм D1 case 10080: return("W1"); break;// Таймфрейм W1 case 43200: return("МN"); break;// Таймфрейм МN default: return("M1"); } } ///----------------------------- //+----------------------------------------------------------------------------+ //| Читает строковый блок из файла до знака переноса каретки #13#10 | //| Параметры: | //| fh - описатель открытого ранее файла | //| | //+----------------------------------------------------------------------------+ string GetStringFromFile(int &fh) { string str="",s; while(!FileIsEnding(fh)) { s=FileReadString(fh,1); int Ch=StringGetChar(s, 0); if(Ch!=13 && Ch!=10) str=str+s; else return(str); } return(str); } //+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ string _StringReplace(string text,string oldstr,string newstr) { int pos=StringFind(text,oldstr); if(pos>-1) { string str=StringSubstr(text,0,pos)+newstr+StringSubstr(text,pos+StringLen(oldstr)); return(str); } return(text); } //+------------------------------------------------------------------+