//+------------------------------------------------------------------+ //| SHI_Mod_vLine.mq4 | //| Copyright © 2004, Shurka & Kevin | //| Corrected&Upgraded by Modest | //| Additional idea Rosh | //+------------------------------------------------------------------+ // Modest- исправлен алгоритм нахождения опорной точки между // обнаруженными фракталами для построения линии канала // Добавлена возможность тестирования на истории при помощи программы MetaClick. // При тестировании линии канала продолжаются в будушее // Версия SHI_Mod_vLine: перемещение всего построения путем перетаскивания VLINE -идея Rosh'a #property copyright "Copyright © 2004, Shurka & Kevin " #property link "" #property indicator_chart_window #property indicator_buffers 1 #property indicator_color1 Red double ExtMapBuffer1[]; double UpLabel[]; extern int BarsForFract=0; extern bool DOT_Line_Ray=True; int CurrentBar=0; double Step=0; int B1=-1,B2=-1,iB1=0,iB2=0,flag=0; int UpDown=0; double P1=0,P2=0,PP=0,P1f=0,PPf=0; int i=0,AB=300,BFF=0; int ishift=0; double iprice=0; datetime T1,T2,Tf,myTime; string fileNAME; int myYear,myMonth,myDay,myHour,myMinute; //+------------------------------------------------------------------+ //| Custom indicator initialization function | //+------------------------------------------------------------------+ int init() { //---- indicators SetIndexStyle(0,DRAW_ARROW); SetIndexArrow(0,164); SetIndexBuffer(0,ExtMapBuffer1); SetIndexEmptyValue(0,0.0); SetIndexStyle(1,DRAW_ARROW,EMPTY,1,Blue); SetIndexBuffer(1,UpLabel); SetIndexArrow(1, 251); SetIndexEmptyValue(1,0); return(0); } //+------------------------------------------------------------------+ //| Custor indicator deinitialization function | //+------------------------------------------------------------------+ int deinit() { //---- FileDelete(fileNAME); //---- return(0); } void DelObj() { ObjectDelete("TL1"); ObjectDelete("TL2"); ObjectDelete("MIDL"); ObjectDelete("Lab1");ObjectDelete("Lab2");ObjectDelete("Lab3"); ObjectDelete("TL1f");ObjectDelete("TL2f"); //ObjectDelete("MyBarLine"); } //+------------------------------------------------------------------+ //| Custom indicator iteration function | //+------------------------------------------------------------------+ int start() { double iPP,Lab1Val,Lab2Val,Lab3Val; int MyBar,lastBarTime,h1,ii; string v1,fileFrame; ObjectCreate("MyBarLine",OBJ_VLINE,0,Time[1],High[1]); ObjectSet("MyBarLine",OBJPROP_COLOR,Aqua); ObjectSet("MyBarLine",OBJPROP_WIDTH,1); ObjectSet("MyBarLine",OBJPROP_STYLE,STYLE_DOT); //**************************************************************************************** // Чтение данных (строка) из внешнего файла, сформированного программой MetaClick, // путём тыка в бар (Z+LeftMouse) указывающей время, до которого строится индикатор. // Ищем нужный номер бара //**************************************************************************************** /* // Вэтой версии MetaClick не используется switch (Period()) // Формирование части имени внешнего файла { case PERIOD_M1: fileFrame=",M1";break; case PERIOD_M5: fileFrame=",M5";break; case PERIOD_M15: fileFrame=",M15";break; case PERIOD_M30: fileFrame=",M30";break; case PERIOD_H1: fileFrame=",H1";break; case PERIOD_H4: fileFrame=",H4";break; case PERIOD_D1: fileFrame=",Daily";break; case PERIOD_W1: fileFrame=",Weekly";break; case PERIOD_MN1: fileFrame=",Monthly";break; } fileNAME=Symbol()+fileFrame+".csv"; h1=FileOpen(Symbol()+fileFrame+".csv",FILE_CSV,";"); v1 = FileReadString(h1); FileClose(h1); Comment(v1); lastBarTime=StrToTime(v1); i=0; while (i<=Bars-1 ) {if (lastBarTime==Time[i]) { MyBar=i;break;} i++; } */ //**^^^*****^^ Закончили искать последний бар для построения индикатора **************** myTime=ObjectGet("MyBarLine",OBJPROP_TIME1); if(myTime>Time[0] || myTime< Time[Bars-1]) {ObjectDelete("MyBarLine"); Alert("SHI_Mod_vLine: TimeFrames are not correct"); return(0); } myYear=TimeYear(myTime); myMonth=TimeMonth(myTime);myDay=TimeDay(myTime); myHour=TimeHour(myTime); myMinute=TimeMinute(myTime); // Для возможноти переключения таймфреймов ОДНОГО И ТОГО ЖЕ ГРАФИКА надо выровнять // время расположения вертикальной линии на границу старшего таймфрейма. if (Period()==PERIOD_MN1 || Period()==PERIOD_W1) {Alert("SHI_Mod_vLine can''t work with Weekly and Monthly charts"); ObjectDelete("MyBarLine"); return(0);} switch (Period()) // { case PERIOD_M1: break; case PERIOD_M5: myMinute=MathFloor(myMinute/5)*5; break; case PERIOD_M15: myMinute=MathFloor(myMinute/15)*15; break; case PERIOD_M30: myMinute=MathFloor(myMinute/30)*30; break; case PERIOD_H1: myMinute=0; break; case PERIOD_H4: myHour=MathFloor(myHour/4)*4; myMinute=0; break; case PERIOD_D1: myHour=0; myMinute=0; break; case PERIOD_W1: /*i=0; while(i<=Bars-1) { if (TimeYear(Time[i])==myYear && TimeMonth(Time[i])==myMonth && myDay-TimeDay(Time[i])<=6 && myDay-TimeDay(Time[i])>=0) myDay=TimeDay(Time[i]); break; i++; //Неправильно!! }*/ break; case PERIOD_MN1: break; } ObjectDelete("MyBarLine"); myTime=StrToTime(myYear + "." + myMonth + "." + myDay + " " + myHour + ":" + myMinute); ObjectCreate("MyBarLine",OBJ_VLINE,0,myTime,High[0]); ObjectSet("MyBarLine",OBJPROP_COLOR,Aqua); ObjectSet("MyBarLine",OBJPROP_WIDTH,1); ObjectSet("MyBarLine",OBJPROP_STYLE,STYLE_DOT); //Отладка /* Alert(myYear + "." + myMonth + "." + myDay + " " + myHour + ":" + myMinute); myYear=TimeYear(myTime); myMonth=TimeMonth(myTime);myDay=TimeDay(myTime); myHour=TimeHour(myTime); myMinute=TimeMinute(myTime); Alert(myYear + "." + myMonth + "." + myDay + " " + myHour + ":" + myMinute); */ //return(0); i=0; while(Time[i]!=myTime) {i++;} MyBar=i; ArrayInitialize(UpLabel,0.0); if (Bars30) {Tf=Time[MyBar-30]; PPf=PP-Step*30; P1f=P1-Step*30; } else {Tf=Time[0];PPf=PP-Step*MyBar; P1f=P1-Step*MyBar; } ObjectCreate("TL1f",OBJ_TREND,0,T1,PP,Tf,PPf); ObjectSet("TL1f",OBJPROP_COLOR,Lime); ObjectSet("TL1f",OBJPROP_WIDTH,1); ObjectSet("TL1f",OBJPROP_STYLE,STYLE_DOT); ObjectSet("TL1f",OBJPROP_RAY,DOT_Line_Ray); ObjectCreate("TL2f",OBJ_TREND,0,T1,P1,Tf,P1f); ObjectSet("TL2f",OBJPROP_COLOR,Lime); ObjectSet("TL2f",OBJPROP_WIDTH,1); ObjectSet("TL2f",OBJPROP_STYLE,STYLE_DOT); ObjectSet("TL2f",OBJPROP_RAY,DOT_Line_Ray); //************************* Отмечаем кликнутый бар ************************************ /*if (MyBar>0) { ObjectCreate("MyBarLine",OBJ_VLINE,0,Time[MyBar],High[MyBar]); ObjectSet("MyBarLine",OBJPROP_COLOR,MediumOrchid); ObjectSet("MyBarLine",OBJPROP_WIDTH,1); ObjectSet("MyBarLine",OBJPROP_STYLE,STYLE_DOT); } */ //---- return(0); } //+------------------------------------------------------------------+