//+------------------------------------------------------------------+ //| Energy_Market_01_mail.mq4 | //+------------------------------------------------------------------+ #property copyright "Inkov Evgeni ew123@mail.ru" #property link "8-918-600-11-33" //+------------------------------------------------------------------+ #define Max_Razm_Mas 10000 //+------------------------------------------------------------------+ #property indicator_separate_window #property indicator_buffers 3 #property indicator_color1 Green #property indicator_width1 2 #property indicator_color2 Magenta #property indicator_width2 2 #property indicator_color3 Red #property indicator_width3 2 //..................................... extern int n_bar_sum = 5; // количество баров усреднения extern double porog_sum = 20.0; // порог для средних скоростей extern double porog_one = 60.0; // порог для одничного импульса скорости extern int sdvig_strel_up = 5; // сдвиг верхней первой стрелки extern int sdvig_strel_dw = 15; // сдвиг нижней первой стрелки extern int sdvig_strel_step = 8; // шаг вывода остальных стрелок и цифр extern bool ust_strel = true; // выводить стрелки на экран ? extern bool sound = true; // озвучивать стрелки ? extern int Razm_Mas = 100; // длина графика extern color Color_txt = Black; // цвет текста extern bool Mail = true; // отправлять сообщения на почту //..................................... double ExtBuffer0[]; // массив сумм double ExtBuffer1[]; // массив меток double ExtBuffer2[]; // массив превышения double Buffer [Max_Razm_Mas]; // массив скоростей double Buffer_i [Max_Razm_Mas]; // массив (импульсов) скоростей, превышающийх порог porog_one double Buffer1 [Max_Razm_Mas]; // массив минутных меток double Sum_Buffer [Max_Razm_Mas]; // массив сумм скоростей (среднее значение) //+------------------------------------------------------------------+ int kol_ms, pred_kol_ms; double delta_tick,delta_time; double pr, pred_pr, V, Sum_V; datetime time_pred_met, time_tek_met; string name; int kol_izm; string name_file="EM_01"; //+------------------------------------------------------------------+ int init() { if (n_bar_sum<1)n_bar_sum=1; IndicatorBuffers(3); SetIndexStyle(0,DRAW_HISTOGRAM); SetIndexStyle(1,DRAW_HISTOGRAM); SetIndexStyle(2,DRAW_HISTOGRAM); SetIndexBuffer(0,ExtBuffer0); SetIndexBuffer(1,ExtBuffer1); SetIndexBuffer(2,ExtBuffer2); IndicatorDigits(1); SetIndexEmptyValue(0,0); ArrayInitialize(ExtBuffer0,0); ArrayInitialize(ExtBuffer1,0); ArrayInitialize(Buffer, 0); ArrayInitialize(Buffer1, 0); ArrayInitialize(Sum_Buffer,0); IndicatorShortName("EM_01 ( "+(string)n_bar_sum+", "+ DoubleToStr(porog_sum,1)+", "+ DoubleToStr(porog_one,1)+" )"); SetLevelValue(1, porog_sum); SetLevelValue(2,-porog_sum); SetLevelValue(3, porog_one); SetLevelValue(4,-porog_one); Get_File(); return(0); } //+------------------------------------------------------------------+ int deinit() { Save_File(); return(0); } //+------------------------------------------------------------------+ int start() { // измерить время между тиками pred_kol_ms=kol_ms; kol_ms=GetTickCount(); if(kol_ms==pred_kol_ms) { kol_ms+=1000; } delta_time=kol_ms-pred_kol_ms; //............................... // определить величину тика pred_pr=pr; pr=Bid; delta_tick=NormalizeDouble((pr-pred_pr)/Point,0); //............................... if (pred_pr==0 || pred_kol_ms==0)return(0); // если переменные не установлены, повторить вход //............................... kol_izm=MathMin(Bars,MathMin(Razm_Mas,Max_Razm_Mas)); // определить длину графика //............................... // вычислить скорость изменения тика V=delta_tick/delta_time/Point; //............................... // занести скорость тика в массив скоростей ArrayCopy(Buffer,Buffer,1,0,kol_izm-1); // предварительно сдвинуть данные внутри массива Buffer[0]=V; //............................... // вычислить среднюю скорость за "n_bar_sum" тиков и занеси в массив средних скоростей ArrayCopy(Sum_Buffer,Sum_Buffer,1,0,kol_izm-1); // предварительно сдвинуть данные внутри массива Sum_V=0; for (int i=0;i= porog_one || V <= -porog_one) Buffer_i[0]=Sum_V; else Buffer_i[0]=0; //............................... // при необходимости вывести стрелки, звук и отправить сообщение на почту string mail_txt=""; if (Sum_V >= porog_sum) { if (ust_strel) { strel_up(241,sdvig_strel_up+2*sdvig_strel_step); // двойная стрелка вверх txt_up(Sum_V,sdvig_strel_up+3*sdvig_strel_step,Color_txt); } if (sound)PlaySound("email.wav"); mail_txt="Двойная вверх="+(string)Sum_V+" "; } if (V >= porog_one) { if (ust_strel) { strel_up(225,sdvig_strel_up); // одиночная стрелка вверх txt_up(V,sdvig_strel_up+sdvig_strel_step,Color_txt); } if (sound)PlaySound("news.wav"); mail_txt=mail_txt+"Одиночная вверх="+(string)V+" "; } //.................................... if (Sum_V <= -porog_sum) { if (ust_strel) { strel_dw(242,sdvig_strel_dw+2*sdvig_strel_step); // двойная стрелка вниз txt_dw(Sum_V,sdvig_strel_dw+3*sdvig_strel_step,Color_txt); } if (sound)PlaySound("timeout.wav"); mail_txt=mail_txt+"Двойная вниз="+(string)Sum_V+" "; } if (V <= -porog_one) { if (ust_strel) { strel_dw(226,sdvig_strel_dw); // одиночная стрелка вниз txt_dw(V,sdvig_strel_dw+sdvig_strel_step,Color_txt); } if (sound)PlaySound("alert2.wav"); mail_txt=mail_txt+"Одиночная вниз="+(string)V; } if (Mail && mail_txt!="")SendMail("От Energy_Market_01_mail", mail_txt); //............................... // в начале минуты, поставить метку time_tek_met=TimeCurrent(); if (time_pred_met==0)time_pred_met=StrToTime(TimeToStr(time_tek_met,TIME_DATE)+" "+TimeToStr(time_tek_met,TIME_MINUTES)); ArrayCopy(Buffer1,Buffer1,1,0,kol_izm-1); // предварительно сдвинуть данные внутри массива if (time_tek_met-time_pred_met>=60) { time_pred_met=StrToTime(TimeToStr(time_tek_met,TIME_DATE)+" "+TimeToStr(time_tek_met,TIME_MINUTES)); Buffer1[0]=Sum_Buffer[0]; } else Buffer1[0]=0; //............................... // вывести массив средних скоростей на экран ArrayCopy(ExtBuffer0,Sum_Buffer,0,0,kol_izm-1); ExtBuffer0[Razm_Mas-1]=0; //............................... // вывести массив минутных меток на экран ArrayCopy(ExtBuffer1,Buffer1,0,0,kol_izm-1); ExtBuffer1[Razm_Mas-1]=0; //............................... // вывести массив превышения скоростей на экран ArrayCopy(ExtBuffer2,Buffer_i,0,0,kol_izm-1); ExtBuffer2[Razm_Mas-1]=0; //............................... return(0); } //+------------------------------------------------------------------+ void strel_up(int kod, int sdv) { name="up"+(string)Minute()+"_"+DoubleToStr(kod,0); if (ObjectFind(name)<0)ObjectCreate(name,OBJ_ARROW,0,Time[0],Bid-sdv*Point); ObjectSet(name,OBJPROP_TIME1,Time[0]); ObjectSet(name,OBJPROP_PRICE1,Bid-sdv*Point); ObjectSet(name,OBJPROP_ARROWCODE,kod); ObjectSet(name,OBJPROP_COLOR,Green); } //------------------------- void strel_dw(int kod, int sdv) { name="dw"+(string)Minute()+"_"+DoubleToStr(kod,0); if (ObjectFind(name)<0)ObjectCreate(name,OBJ_ARROW,0,Time[0],Ask+sdv*Point); ObjectSet(name,OBJPROP_TIME1,Time[0]); ObjectSet(name,OBJPROP_PRICE1,Ask+sdv*Point); ObjectSet(name,OBJPROP_ARROWCODE,kod); ObjectSet(name,OBJPROP_COLOR,Red); } //------------------------- void txt_up(double n, int sdv, color col) { name="txt_up"+(string)Minute()+DoubleToStr(sdv,0); if (ObjectFind(name)<0)ObjectCreate(name,OBJ_TEXT,0,Time[0],Bid-sdv*Point); ObjectSet(name,OBJPROP_TIME1,Time[0]); ObjectSet(name,OBJPROP_PRICE1,Bid-sdv*Point); ObjectSetText(name,DoubleToStr(n,0),10,"Times New Roman",col); } //------------------------- void txt_dw(double n, int sdv, color col) { name="txt_dw"+(string)Minute()+DoubleToStr(sdv,0); if (ObjectFind(name)<0)ObjectCreate(name,OBJ_TEXT,0,Time[0],Ask+sdv*Point); ObjectSet(name,OBJPROP_TIME1,Time[0]); ObjectSet(name,OBJPROP_PRICE1,Ask+sdv*Point); ObjectSetText(name,DoubleToStr(n,0),10,"Times New Roman",col); } //------------------------- void Save_File() { // сохранение дынных в файле // первое значение - время записи (TimeCurrent()) // второе значение - кол. данных в группе (kol_izm) // 1-я группа - скорости (Buffer[]) // 2-я группа - метки (Buffer1[]) // 3-я группа - импульсы (Buffer_i[]) // 4-я группа - средние (Sum_Buffer[]) int file=FileOpen(name_file, FILE_BIN|FILE_WRITE); FileWriteInteger(file, TimeCurrent()); FileWriteInteger(file, kol_izm); FileWriteArray(file, Buffer, 0, kol_izm); FileWriteArray(file, Buffer1, 0, kol_izm); FileWriteArray(file, Buffer_i, 0, kol_izm); FileWriteArray(file, Sum_Buffer, 0, kol_izm); FileClose(file); } //------------------------- void Get_File() { // чтение дынных из файле // первое значение - время предыдущей записи // второе значение - кол. данных в группе (kol_izm) // 1-я группа - скорости (Buffer[]) // 2-я группа - метки (Buffer1[]) // 3-я группа - импульсы (Buffer_i[]) // 4-я группа - средние (Sum_Buffer[]) int file=FileOpen(name_file, FILE_BIN|FILE_READ); datetime t=FileReadInteger(file); if (TimeCurrent()-t>60) { FileClose(file); FileDelete(name_file); return; } int kol=FileReadInteger(file); FileReadArray(file, Buffer, 0, kol); FileReadArray(file, Buffer1, 0, kol); FileReadArray(file, Buffer_i, 0, kol); FileReadArray(file, Sum_Buffer, 0, kol); FileClose(file); } //-------------------------