//+-------------------------------------------------------------------+ //| ATL_v16.mq4 | //| nen | //| http:// | //+-------------------------------------------------------------------+ //| | //+-------------------------------------------------------------------+ //|AddLines - добавление линии на график | //+-------------------------------------------------------------------+ //| | //| Коды линий | //| 00 - линия, не привязанная к свечам | //| 01 - линия, проведенная через High-High | //| 02 - линия, проведенная через Low-Low | //| 03 - линия, проведенная через High-Low | //| 04 - линия, проведенная через Low-High | //| 05 - линия, проведенная через Close-Close | //| 06 - линия для вычисления ретресментов (не реализовано) | //+-------------------------------------------------------------------+ //| | //|ColorLines - задает цвет линии | //+-------------------------------------------------------------------+ //| "Properties Lines" | //+-------------------------------------------------------------------+ //| | //|NumberLines - задает номер линии, у которой будут изменены | //| параметры | //|ShowReactionLines - задает показ линий реакции | //| 0 - не показывать линии реакции | //| 1 - показать линии реакции | //| 2 - показать линии реакции1 и уровни | //| 3 - показать линии реакции2 и уровни | //| 4 - показать линии реакции и линии действия | //| 5 - показать линии реакции1, линию действия1 и уровни | //| 6 - показать линии реакции2, линию действия2 и уровни | //| 7 - показать линии реакции1, линию действия1 и уровни, | //| а также значения уровней | //| 8 - показать линии реакции2, линию действия2 и уровни, | //| а также значения уровней | //| 9 - показать линии действия1, линию равновесия и | //| уровни в противоположную сторону и значения уровней| //| 10 - показать только линию действия1 | //| | //| | //|PriceLabelOnLines - задает простановку ценового значения линии на | //| нулевом (текущем) баре | //| 1 или 3 - цена рассчитывается по минимальному таймфрейму, на | //| котором привязана линия | //| 2 или 4 - цена рассчитывается на текущем таймфрейме | //| | //|NameLines - задает наименование линии | //| 1 - LT - линия тренда | //| 2 - LC - линия целей | //| 3 - LP - линия притяжения | //| | //|VariantsOfProcessingLines - варианты обработки линии | //| 1 - построение горизонтальной и вертикальной линий | //| на пересечении линии притяжения с линией целей | //| | //| 8 - левая точка привязки линии зафиксирована, | //| правая точка касается рынка | //| | //| 9 - левая точка привязки линии зафиксирована, | //| правая точка касается рынка. На всех предыдущих | //| фракталах сохраняется трендовая линия. | //| | //|NumberLinesConnected - номер линии, с которой взаимодействует | //| линия NumberLines | //| | //|FiboTime - задает вывод четырех FiboTime | //| 1 - FiboTime привязываются к максимальному | //| отклонению от трендовой | //| 2 - FiboTime привязываются к экстремумам | //| 3 - выводится QuantityCycles циклических линий | //| | //+-------------------------------------------------------------------+ //| "Additional Properties Lines" | //+-------------------------------------------------------------------+ //|ShowNumberLines - задает вывод номера линии около первой точки | //| привязки этой линии | //| | //|ColorReactionLines - задает цвет линий реакции | //|ColorActionLines - задает цвет линий действия | //|ColorLevelLines - задает цвет надписей для уровней линий реакции | //| | //|infoLines - вывод информации о выбранно линии | //| | //| | //|WidthLines - задает толщину линии | //|StyleLines - задает стиль линии | //| | //|LevelReactionLines - задает значения уровней реакции | //|WidthReactionLines - задает толщину линий реакции | //|StyleReactionLines - задает стиль линий реакции | //|SizeLevelLines - задает размер шрифта надписей для уровней реакции | //| | //|PeakCurrentTime - задает, с какого таймфрейма берется цена для | //| привязки линии | //| true - с младшего таймфрейма | //| false - со старшего таймфрейма | //| | //|FiboTimeFree - задает значения уровней для FiboTime | //|FiboTimeColorList - задает значения цвета для FiboTime | //|WidthFiboTime - задает толщину линий уровней FiboTime | //|StyleFiboTime - задает стиль линий уровней FiboTime | //| | //|AllObjectsOfOneColor при =true цвет линий действия, линий реакции | //| и значений уровней реакции задается такой же | //| что и цвет трендовой линии | //| при =false цвет перечисленных объектов | //| задается каждый своим параметром | //| | //|QuantityCycles - задает количество циклических линий | //| | //|delta - задает количество пунктов для компенсации разбалансировки | //| котировок | //| | //+-------------------------------------------------------------------+ #property copyright "nen" #property link "http://" #property stacksize 65535 #property indicator_chart_window extern bool AddLines = false; extern color ColorLines = Red; extern string ______________0_____________ = "Properties Lines"; extern int NumberLines = 0; extern int ShowReactionLines = 0; extern int PriceLabelOnLines = 0; extern int NameLines = 0; // Предназначение линии. Наименование линии. Основное свойство линии. LC, LP extern int VariantsOfProcessingLines= 0; // Варианты обработки линии extern int NumberLinesConnected = 0; // Номер линии, с которой взаимодействует линия NumberLines extern int FiboTime = 0; extern string ______________1_____________ = "Additional Properties Lines"; extern bool AllObjectsOfOneColor = true; extern color ColorReactionLines = DodgerBlue; extern color ColorActionLines = DodgerBlue; extern color ColorLevelLines = DodgerBlue; extern int infoLines = 1; // вывод информации о линии и всего с этой линией связанного. extern int infoVariants = 0; extern int WidthLines = 0; extern int StyleLines = 2; extern string LevelReactionLines = "-0.382,-0.618,0.382,0.618,1.0,1.272,1.618,2.0,2.618,3.618,4.618"; extern int WidthReactionLines = 0; extern int StyleReactionLines = 2; extern int SizeLevelLines = 8; extern bool PeakCurrentTime = true; extern string FiboTimeColorList = "Gray,CadetBlue,DarkSlateGray,LightGoldenrod"; extern int WidthFiboTime = 0; extern int StyleFiboTime = 2; extern string FiboTimeFree = "0.618,1.0,1.618"; extern bool ShowNumberLines = true; extern int missedBars = 2; extern int QuantityCycles = 6; extern int delta = 5; string nameObj="", typeObj=""; bool moveATL=true, newBar=false, Transformation=false, TransformationMax=false; string countLines="000"; // Номер для новой линии string TF[]={"0","1","2","3","4","5","6","7","8"}; string txtTF[]={"M1","M5","M15","M30","H1","H4","D1","W1","MN1"}; datetime NewBarTF[9]; int QuantityLinesTF[9]; // количество линий с минимальным таймфреймом string numTF,numTF0,numTF1,numTF2; string friendLines="000"; // Номер для линии, с которой взаимодействует выбранная линия string PropertiesLines="0000000000"; // Свойства линии // Массив чисел, заданных пользователем double fi[]; string fitxt[]; string fitxt100[]; int Sizefi; // datetime _tf[]={PERIOD_M1,PERIOD_M5,PERIOD_M15,PERIOD_M30,PERIOD_H1,PERIOD_H4,PERIOD_D1,PERIOD_W1,PERIOD_MN1}; bool _atl[1]; // массив признаков наличия линии. int _csw[1,3]; // массив Color-Style-Width линий int _type[1]; // массив типов линий int _friend[1]; // массив номеров связанных линий int _numTf[1,3]; // массив numTF int _pl[1,10]; // массив свойств линий double _cena[1,2]; // массив цен привязки линий datetime _time[1,2]; // массив времени привязки линий string _name[1]; // массив наименований линий double _h1[1,2]; // массив значений отклонения линий Action int col; // размерность массивов. Количество линий string prefics="_#"; string cCenaAdd1="",cCenaAdd2=""; int cCenaLen=8; int vX, vY; // Координаты метки X int chartchange=0; double coordinataCena1, coordinataCena2, cCena1, cCena2; datetime coordinataTime1, coordinataTime2, cTime1, cTime2; color aColorLines; int aStyleLines, aWidthLines; color ColorList[]; int ColorSize, ftSize; double ft[]; string fttxt[]; string accountCompany=""; bool changeAccount=false; bool ShowNumberLines_=false; bool PriceLabelOnLines_=false; bool VariantsOfProcessingLines_=false; double lBar, hBar; int tfZZ=8; //Номер минимального таймфрейма, на котором привязана линия datetime tiZZ; // Координаты пересечения двух линий в будущем double cenaX; datetime timeX; //string otladka=""; //+------------------------------------------------------------------+ //| Custom indicator initialization function | //+------------------------------------------------------------------+ int init() { string aa,aa1; int aa2, i; typeObj="00"; vX=30; vY=30; // Координаты метки X // if (StringLen(DoubleToStr(High[1],Digits))<7) cCenaAdd="0"; numTF=_period(Period()); aColorLines=ColorLines; aStyleLines=StyleLines; aWidthLines=WidthLines; ShowNumberLines_=true; string nameCheckLabel="CheckLabel"; if (ObjectFind(nameCheckLabel)==0) { ObjectSet(nameCheckLabel, OBJPROP_COLOR, Red); WindowRedraw(); } if (NumberLines<0) NumberLines=0; if (ShowReactionLines<0) ShowReactionLines=0; if (ShowReactionLines>10) ShowReactionLines=10; if (PriceLabelOnLines<0) PriceLabelOnLines=0; if (PriceLabelOnLines>4) PriceLabelOnLines=4; if (FiboTime<0) FiboTime=0; if (FiboTime>3) FiboTime=3; if (NameLines<0) NameLines=0; if (NameLines>3) NameLines=3; if (VariantsOfProcessingLines<0) VariantsOfProcessingLines=0; if (VariantsOfProcessingLines>9) VariantsOfProcessingLines=9; if (ArraySize(NewBarTF)>0) ArrayInitialize(NewBarTF,0); // if (ShowReactionLines>0) i=-1; aa2=0; Sizefi=0; while (aa2>=0) { aa2=StringFind(LevelReactionLines, ",",i+1); if (aa2>=0) {i=aa2;Sizefi++;} else { if (StringLen(LevelReactionLines)-i>0) { if (StrToDouble(StringSubstr(LevelReactionLines,i+1))>0) Sizefi++; ArrayResize(fi,Sizefi); ArrayResize(fitxt,Sizefi); ArrayResize(fitxt100,Sizefi); aa1=LevelReactionLines; for (i=0;i=0) aa1=StringSubstr(aa1,aa2+1); } } } } i=-1; aa2=0; ftSize=0; while (aa2>=0) { aa2=StringFind(FiboTimeFree, ",",i+1); if (aa2>=0) {i=aa2;ftSize++;} else { if (StringLen(FiboTimeFree)-i>0) { if (StrToDouble(StringSubstr(FiboTimeFree,i+1))>0) ftSize++; ArrayResize(ft,ftSize); ArrayResize(fttxt,ftSize); aa1=FiboTimeFree; for (i=0;i=0) aa1=StringSubstr(aa1,aa2+1); } aa2=-1; } } } i=-1; aa2=0; ColorSize=0; while (aa2>=0) { aa2=StringFind(FiboTimeColorList, ",",i+1); if (aa2>=0) {i=aa2;ColorSize++;} else { if (StringLen(FiboTimeColorList)-i>0) { if (StrToDouble(StringSubstr(FiboTimeColorList,i+1))>0) ColorSize++; ArrayResize(ColorList,ColorSize); aa1=FiboTimeColorList; for (i=0;i=0) aa1=StringSubstr(aa1,aa2+1); } aa2=-1; } } } _createArray(); if (missedBars<0) missedBars=0; if (QuantityCycles<0) QuantityCycles=0; if (UninitializeReason()==3) chartchange=2; if (UninitializeReason()==5) chartchange=1; return(0); } //+------------------------------------------------------------------+ //| Custom indicator deinitialization function | //+------------------------------------------------------------------+ int deinit() { //---- int i; bool x=false; for (i=0; iiLow(NULL,_tf[tiZZ],0) || hBar0) && col>0) { lBar=iLow(NULL,_tf[tfZZ],0); hBar=iHigh(NULL,_tf[tfZZ],0); // Корректировка линий реакции _reaction_1(); // Проcтановка ценовых меток на линиях // if (tiZZ!=iTime(NULL,_tf[tfZZ],0)) { tiZZ=iTime(NULL,_tf[tfZZ],0); if (PriceLabelOnLines_) {_PriceLabelOnLines_1();} } // Варианты обработки линии if (VariantsOfProcessingLines_) _VariantsOfProcessingLines(); } // Проверка привязки линий и изменение свойств линий if (moveATL) updating_objects(numTF); if (infoLines>0) _infoLines(); // установка переключателей if (chartchange>0) { moveATL=true; chartchange--; } else moveATL=false; AddLines=false; return(0); } //-------------------------------- //-------------------------------------------------------- // Проверка, есть ли удаленные линии и удаление графических // объектов, связанных с отсутствующей линией. Начало. //-------------------------------------------------------- void delete_line() { int i; string nameObj; for (i=0; i0; i++) { nameObj=ObjectName(i); if (StringSubstr(nameObj,0,2)==prefics) { k=StrToInteger(StringSubstr(nameObj,4,3)); if (j0) ArrayInitialize(_atl,false); for (i=0; i<=obj_total; i++) { nameObj=ObjectName(i); if (StringSubstr(nameObj,0,2)==prefics) { k=StrToInteger(StringSubstr(nameObj,4,3))-1; _writeArray(k); } } // Проверка, есть ли удаленные линии и удаление графических объектов, связанных с отсутствующей линией delete_line(); } //-------------------------------------------------------- // Формирование массивов свойств линий. Конец. //-------------------------------------------------------- //-------------------------------------------------------- // Удаление графических объектов, связанных с отсутствующей линией. Начало. //-------------------------------------------------------- void _delete_obj(int i) { int k=i+1; if (k<10) countLines="00"+k; else if (k<100) countLines="0"+k; else if (k<1000) countLines=""+k; ObjectDelete("_NumberLines_"+countLines); ObjectDelete("PLOL_"+countLines); ObjectDelete("vLine"+k); ObjectDelete("hLine"+k); delete_a_reaction(); ObjectDelete("ft1_"+countLines); ObjectDelete("ft2_"+countLines); ObjectDelete("ft3_"+countLines); ObjectDelete("ft4_"+countLines); } //-------------------------------------------------------- // Удаление графических объектов, связанных с отсутствующей линией. Конец. //-------------------------------------------------------- //-------------------------------------------------------- // Формирование массивов свойств линий. Начало. //-------------------------------------------------------- void _arrayResize(int j) { ArrayResize(_atl,j); ArrayResize(_csw,j); ArrayResize(_type,j); ArrayResize(_friend,j); ArrayResize(_numTf,j); ArrayResize(_pl,j); ArrayResize(_cena,j); ArrayResize(_time,j); ArrayResize(_name,j); ArrayResize(_h1,j); } //-------------------------------------------------------- // Формирование массивов свойств линий. Конец. //-------------------------------------------------------- //-------------------------------------------------------- // Запись в массив свойств линий. Начало. //-------------------------------------------------------- void _writeArray(int k) { int i; if (StringLen(nameObj)<59) {ObjectDelete(nameObj);return;} // массив признаков наличия линии. 1 измерение - признак наличия линии, 2 - признак проверки _atl[k]=true; // массив Color-Style-Width линий _csw[k,0]=ObjectGet(nameObj,OBJPROP_COLOR); _csw[k,1]=ObjectGet(nameObj,OBJPROP_STYLE); _csw[k,2]=ObjectGet(nameObj,OBJPROP_WIDTH); // массив типов линий _type[k]=StrToInteger(StringSubstr(nameObj,2,2)); // массив номеров связанных линий _friend[k]=StrToInteger(StringSubstr(nameObj,7,3)); // массив numTF _numTf[k,0]=StrToInteger(StringSubstr(nameObj,20,1)); _numTf[k,1]=StrToInteger(StringSubstr(nameObj,21,1)); _numTf[k,2]=StrToInteger(StringSubstr(nameObj,22,1)); // массив времени привязки линий _time[k,0]=StrToInteger(StringSubstr(nameObj,23,10)); _time[k,1]=StrToInteger(StringSubstr(nameObj,41,10)); // массив цен привязки линий _cena[k,0]=StrToDouble(StringSubstr(nameObj,33,cCenaLen)); _cena[k,1]=StrToDouble(StringSubstr(nameObj,51,cCenaLen)); // массив наименований линий _name[k]=nameObj; if (tfZZ>_numTf[k,0]) {tfZZ=_numTf[k,0];} // номер минимального таймфрейма, на котором привязана линия // массив свойств линий for (i=0;i<10;i++) { _pl[k,i]=StringGetChar(StringSubstr(_name[k],10+i,1),0)-48; } } //-------------------------------------------------------- // Запись в массивы свойств линий. Конец. //-------------------------------------------------------- //-------------------------------------------------------- // Обновление объектов-линий и изменение свойств линий. Начало. //-------------------------------------------------------- void updating_objects(string tfwork) { int j, k, tf; int cc1, cc2, co1, co2; string txt, t0; // tfZZ=8; VariantsOfProcessingLines_=false; PriceLabelOnLines_=false; for (k=0; k0) ArrayInitialize(QuantityLinesTF,0); typeObj=StringSubstr(txt,2,2); // новые координаты cTime1=ObjectGet(txt,OBJPROP_TIME1); cTime2=ObjectGet(txt,OBJPROP_TIME2); cCena1=NormalizeDouble(ObjectGet(txt,OBJPROP_PRICE1),Digits); cCena2=NormalizeDouble(ObjectGet(txt,OBJPROP_PRICE2),Digits); // старые координаты coordinataTime1=_time[k,0]; coordinataTime2=_time[k,1]; coordinataCena1=_cena[k,0]; coordinataCena2=_cena[k,1]; // Значения цены для сравнения. Обход ошибки представления переменных double. cc1=MathRound(cCena1/Point); cc2=MathRound(cCena2/Point); co1=MathRound(coordinataCena1/Point); co2=MathRound(coordinataCena2/Point); numTF0=StringSubstr(txt,20,1); // минимальный ТФ, на котором привязана линия. numTF1=StringSubstr(txt,21,1); // начальный ТФ, на котором произошла первичная привязка линии if (numTF1=="-") numTF1=numTF2; numTF2=StringSubstr(txt,22,1); // ТФ, по которому выставляется цена привязки линии countLines=StringSubstr(txt,4,3); friendLines=StringSubstr(txt,7,3); PropertiesLines=StringSubstr(txt,10,10); aColorLines=_csw[k,0]; aStyleLines=_csw[k,1]; aWidthLines=_csw[k,2]; // Проверка привязки линий if (cTime1!=coordinataTime1 || cc1!=co1 || cTime2!=coordinataTime2 || cc2!=co2) { // записываем текущий ТФ в numTF0 и: // если линия привязана (не 00), то записываем новые вычисленные координаты, // // если линия = 00, то записываем новые координаты // значение numTF2 = numTF0 // Print("======2====== или =changeAccount="); // Print("countLines=",countLines); coordinataTime1=cTime1; coordinataTime2=cTime2; coordinataCena1=cCena1; coordinataCena2=cCena2; search_bar(_tf[StrToInteger(tfwork)]); numTF0=tfwork; numTF1=tfwork; numTF2=tfwork; ObjectDelete(txt); if (ObjectFind(txt)>-1) continue; _cCenaAdd(); nameObj=prefics+typeObj+countLines+friendLines+PropertiesLines+numTF0+numTF1+numTF2+time_str(coordinataTime1)+cCenaAdd1+DoubleToStr(coordinataCena1,Digits)+time_str(coordinataTime2)+cCenaAdd2+DoubleToStr(coordinataCena2,Digits); if (StringLen(nameObj)<59) {ObjectDelete(nameObj);continue;} Create_lines(); } else if (cTime1==coordinataTime1 && cc1==co1 && cTime2==coordinataTime2 && cc2==co2 && tfwork0 && _type[k]<6) { // Print("======\/======"); // Преобразование. Привязываем линии по младшему ТФ. Transformation=true; search_bar(_tf[_numTf[k,1]]); numTF0=StringSubstr(txt,20,1); numTF2=numTF0; ObjectDelete(txt); _cCenaAdd(); nameObj=prefics+typeObj+countLines+friendLines+PropertiesLines+numTF0+numTF1+numTF2+time_str(coordinataTime1)+cCenaAdd1+DoubleToStr(coordinataCena1,Digits)+time_str(coordinataTime2)+cCenaAdd2+DoubleToStr(coordinataCena2,Digits); Create_lines(); Transformation=false; } else if (!PeakCurrentTime && numTF2!=numTF1 && _type[k] && _type[k]<6) { // Print("======/\======"); // Преобразование. Привязываем линии по старшему ТФ. TransformationMax=true; search_bar(_tf[_numTf[k,1]]); numTF0=StringSubstr(txt,20,1); numTF2=numTF1; ObjectDelete(txt); _cCenaAdd(); nameObj=prefics+typeObj+countLines+friendLines+PropertiesLines+numTF0+numTF1+numTF2+time_str(coordinataTime1)+cCenaAdd1+DoubleToStr(coordinataCena1,Digits)+time_str(coordinataTime2)+cCenaAdd2+DoubleToStr(coordinataCena2,Digits); Create_lines(); TransformationMax=false; } // if (tfZZ>_numTf[k,0]) {tfZZ=_numTf[k,0];} // номер минимального таймфрейма, на котором привязана линия //----- // Изменение свойств линий // if (StrToInteger(typeObj)>0) _PropertiesLine(); _PropertiesLine(); // подсчет количества линий с одинаковым минимальным таймфреймом // numTF0=StringSubstr(nameObj,20,1); if (_type[k]>0) { if (_pl[k,2]>0) { QuantityLinesTF[StrToInteger(numTF0)]++; PriceLabelOnLines_=true; } if (_type[k]==1 || _type[k]==2) { if (_pl[k,4]>0 && !VariantsOfProcessingLines_) { VariantsOfProcessingLines_=true; } } } if (ShowNumberLines_) _NumberLines(); //----- } } if (!PriceLabelOnLines_ && ArraySize(NewBarTF)>0) ArrayInitialize(NewBarTF,0); NumberLines=0; changeAccount=false; ShowNumberLines_=false; } //-------------------------------------------------------- // Обновление объектов-линий и изменение свойств линий. Конец. //-------------------------------------------------------- //-------------------------------------------------------- // Изменение свойств линий. Начало. //-------------------------------------------------------- void _PropertiesLine() { int i, k, n; string txt, pl=""; k=StrToInteger(countLines)-1; if (_type[k]>0 && _type[k]<3) { n=0; // Построение линий реакции if (ShowReactionLines>0 && NumberLines>0 && NumberLines==StrToInteger(countLines)) { txt=nameObj; if (_pl[k,n]>0 && _pl[k,n]==ShowReactionLines) _pl[k,n]=0; else _pl[k,n]=ShowReactionLines; pl=StringSetChar(pl,0,_pl[k,n]+48); // pl=""+_pl[k,n]; nameObj=StringSetChar(txt,10+n,StringGetChar(pl,0)); ObjectDelete(txt); Create_lines(); _reaction(); } else if (_pl[k,n]>0) { _reaction(); } n=1; // Построение FiboTime if (FiboTime>0 && NumberLines>0 && NumberLines==StrToInteger(countLines)) { txt=nameObj; if (_pl[k,n]>0 && _pl[k,n]==FiboTime) _pl[k,n]=0; else _pl[k,n]=FiboTime; pl=StringSetChar(pl,0,_pl[k,n]+48); // pl=""+_pl[k,n]; nameObj=StringSetChar(txt,10+n,StringGetChar(pl,0)); ObjectDelete(txt); Create_lines(); _fiboTimeMulty(); } else if (_pl[k,n]>0) { _fiboTimeMulty(); } n=3; // Присвоение имени для линии if (NameLines>0 && NumberLines>0 && NumberLines==StrToInteger(countLines)) { txt=nameObj; if (_pl[k,n]>0 && _pl[k,n]==NameLines) _pl[k,n]=0; else _pl[k,n]=NameLines; pl=StringSetChar(pl,0,_pl[k,n]+48); // pl=""+_pl[k,n]; nameObj=StringSetChar(txt,10+n,StringGetChar(pl,0)); ObjectDelete(txt); Create_lines(); } n=4; // Варианты обработки линии if (VariantsOfProcessingLines>0 && NumberLines>0 && NumberLines==StrToInteger(countLines)) { txt=nameObj; if (_pl[k,n]>0 && _pl[k,n]==VariantsOfProcessingLines) { if (VariantsOfProcessingLines==1) { ObjectDelete("vLine"+(k+1)); ObjectDelete("hLine"+(k+1)); } _pl[k,n]=0; } else {_pl[k,n]=VariantsOfProcessingLines;} pl=StringSetChar(pl,0,_pl[k,n]+48); // pl=""+_pl[k,n]; nameObj=StringSetChar(txt,10+n,StringGetChar(pl,0)); ObjectDelete(txt); Create_lines(); _VariantsOfProcessingLines(); // Варианты обработки линии } else if (_pl[k,n]>0) { _VariantsOfProcessingLines(); } // Привязка линии NumberLines к линии NumberLinesConnected if (NumberLinesConnected>0 && NumberLines>0 && NumberLines==StrToInteger(countLines)) { txt=nameObj; // friendLines=StringSubstr(txt,7,3); if (friendLines!="000" && StrToInteger(friendLines)==NumberLinesConnected) friendLines="000"; else { friendLines=""+NumberLinesConnected; int len_friendLines=StringLen(friendLines); if (len_friendLines==1) friendLines="00"+NumberLinesConnected; else if (len_friendLines==2) friendLines="0"+NumberLinesConnected; } nameObj=StringSubstr(txt,0,7)+friendLines+StringSubstr(txt,10); ObjectDelete(txt); Create_lines(); } } if (_type[k]>0) { n=2; // Проcтановка ценовых меток на линиях if (PriceLabelOnLines>0 && NumberLines>0 && NumberLines==StrToInteger(countLines)) { txt=nameObj; if (_pl[k,n]>0 && _pl[k,n]==PriceLabelOnLines) _pl[k,n]=0; else _pl[k,n]=PriceLabelOnLines; pl=StringSetChar(pl,0,_pl[k,n]+48); // pl=""+_pl[k,n]; nameObj=StringSetChar(txt,10+n,StringGetChar(pl,0)); ObjectDelete(txt); Create_lines(); _PriceLabelOnLines(); // Проcтановка ценовых меток на выбранной линии } else if (_pl[k,n]>0) { _PriceLabelOnLines(); } } // Удаление объектов у смещенных линий, если после смещения линии объекты с такой линией не должны выводиться if (_type[k]==0) { ObjectDelete("PLOL_"+countLines); } if (_type[k]==0 || _type[k]>2) { delete_a_reaction(); ObjectDelete("ft1_"+countLines); ObjectDelete("ft2_"+countLines); ObjectDelete("ft3_"+countLines); ObjectDelete("ft4_"+countLines); } } //-------------------------------------------------------- // Изменение свойств линий. Конец. //-------------------------------------------------------- /* extern int NameLines = 0; // Предназначение линии. Наименование линии. Основное свойство линии. extern int VariantsOfProcessingLines= 0; // Варианты обработки линии extern int NumberLinesConnected = 0; // Номер линии, с которой взаимодействует линия NumberLines */ //-------------------------------------------------------- // Варианты обработки линии. Начало. /* Здесь набросал возможные варианты дальнейшего развития индикатора. Это не значит, что это будет реализовано. VariantsOfProcessingLines= 1 - обе точки привязаны Для линии притяжения, связанной с другой линией, строятся горизонтальная и вертикальная линии на пересечении связанных линий. 2 - левая точка привязана, правая перемещается на очередную потенциальную т.4 (для LC) или т.5 (для LP) по Адверзе. Перемещение происходит после закрытия бара. 3 - обе точки перемещаются по Адвезре. Этот режим, когда для линии целей задана линия тренда. Перемещение происходит после закрытия бара. Также этот режим задается для линии притяжения. Пункты 4-5-6-7 для линии тренда 4 - автоматическое создание линий притяжения и линий целей. Линия притяжения и линия целей одна. 5 - то же что и 4 пункт + левая точка линии тренда привязана. Правая точка может перемещаться в соответствии с тактикой Адверза. 6 - то же что и 4 пункт + построение фиб для первой расчетной точки 6. 7 - то же что и 5 пункт + построение фиб для первой расчетной точки 6. //8 - левая точка привязана, правая перемещается. Перемещение происходит постоянно. */ //-------------------------------------------------------- void _VariantsOfProcessingLines() { int i, j, k, m, n, point1, point2, point_mem, numFr; string txt; double tangens, tangens0, tangens_mem, cena0, cena_mem; datetime mtf, tf0, tf_mem; bool flag_9; for (k=0;k0) { // Построение горизонтальной и вертикальной линий на пересечении линии притяжения с линией целей // Только для линии притяжения (_pl[k,3]==3) if (_pl[k,4]==1 && _pl[k,3]==3) { numFr=_friend[k]-1; if (_numTf[k,0]<=_numTf[numFr,0]) { mtf=_tf[_numTf[numFr,0]]; } else { mtf=_tf[_numTf[k,0]]; } if (_coordinataX(numFr, k, mtf)) { string vLine, hLine; vLine="vLine"+(k+1); ObjectDelete(vLine); ObjectCreate(vLine,OBJ_VLINE,0,timeX,cenaX); ObjectSet(vLine,OBJPROP_COLOR,_csw[k,0]); ObjectSet(vLine,OBJPROP_STYLE,_csw[k,1]); ObjectSet(vLine,OBJPROP_WIDTH,_csw[k,2]); hLine="hLine"+(k+1); ObjectDelete(hLine); ObjectCreate(hLine,OBJ_HLINE,0,timeX,cenaX); ObjectSet(hLine,OBJPROP_COLOR,_csw[k,0]); ObjectSet(hLine,OBJPROP_STYLE,_csw[k,1]); ObjectSet(hLine,OBJPROP_WIDTH,_csw[k,2]); } } // Левая точка привязки линии целей зафиксирована. Находим первую возможную точку 4. // Если в свойствах линии целей имеется связь с линией притяжения, то эта линия притяжения // будет построена через точку 5 при условии возможности ее построения (линии должны пересекаться в будущем). // Только для линии целей и связанной с ней линией притяжения. else if (_pl[k,4]==2) { } // Левая точка привязки линии целей зафиксирована. Находим последнюю возможную точку 4. // Если в свойствах линии целей имеется связь с линией притяжения, то эта линия притяжения // будет построена через точку 5 при условии возможности ее построения (линии должны пересекаться в будущем). // Только для линии целей и связанной с ней линией притяжения. else if (_pl[k,4]==3) { } // Левая точка привязки линии зафиксирована, правая точка касается рынка. // Только для линий Low-Low (_type[k]==2) и High-High (_type[k]==1) // 8 - линия перемещается. 9 - сохраняются линии на старых экстремумах. else if (_pl[k,4]==8 || _pl[k,4]==9) { if (Period()>=_tf[_numTf[k,0]]) { mtf=_tf[_numTf[k,1]]; } else continue; // правая точка привязки линии перемещается при текущем тф>=минимальному тф для данной линии. point1=iBarShift(Symbol(),mtf,_time[k,0],false); point2=iBarShift(Symbol(),mtf,_time[k,1],false); if (point1<0 || point2<0) return; if (point1==point2) continue; point_mem=point2; cena_mem=_cena[k,1]; tf_mem=_time[k,1]; if (_type[k]==1) tangens=(_cena[k,1]-_cena[k,0])/(point1-point2); else if (_type[k]==2) tangens=(_cena[k,0]-_cena[k,1])/(point1-point2); tangens0=tangens; if (chartchange>0) { for (i=point1-1;i>=0;i--) { if (_type[k]==1) { if ((_cena[k,0]+tangens0*(point1-i))iLow(Symbol(),mtf,i)) { cena0=iLow(Symbol(),mtf,i); tf0=iTime(Symbol(),mtf,i); tangens0=(_cena[k,0]-cena0)/(point1-i); if (_pl[k,4]==9) { if (i=0;i--) { if (_type[k]==1) tangens_mem=(iHigh(Symbol(),mtf,i)-_cena[k,0])/(point1-i); else if (_type[k]==2) tangens_mem=(_cena[k,0]-iLow(Symbol(),mtf,i))/(point1-i); if (tangens_mem>tangens0) { tangens0=tangens_mem; tf0=iTime(Symbol(),mtf,i); if (_type[k]==1) cena0=iHigh(Symbol(),mtf,i); else if (_type[k]==2) cena0=iLow(Symbol(),mtf,i); if (_pl[k,4]==9) { if (itangens && chartchange<=0) { //изменилась вторая координата _numTf[k,0]=_numTf[k,1]; _numTf[k,2]=_numTf[k,1]; _time[k,1]=tf0; _cena[k,1]=cena0; coordinataTime1=_time[k,0]; coordinataTime2=_time[k,1]; coordinataCena1=_cena[k,0]; coordinataCena2=_cena[k,1]; _cCenaAdd(); aColorLines=_csw[k,0]; aStyleLines=_csw[k,1]; aWidthLines=_csw[k,2]; nameObj=_name[k]; txt=StringSubstr(nameObj,0,20)+_numTf[k,0]+_numTf[k,1]+_numTf[k,2]+time_str(coordinataTime1)+cCenaAdd1+DoubleToStr(coordinataCena1,Digits)+time_str(coordinataTime2)+cCenaAdd2+DoubleToStr(coordinataCena2,Digits); countLines=StringSubstr(txt,4,3); ObjectDelete(nameObj); nameObj=txt; Create_lines(); } } } } } //-------------------------------------------------------- // Варианты обработки линии. Конец. //-------------------------------------------------------- //-------------------------------------------------------- // Проcтановка ценовых меток на выбранной линии. Начало. // Выбор линии. //-------------------------------------------------------- void _PriceLabelOnLines_1() { int k; for (k=0; k0 && _pl[k,2]>0) _PriceLabelOnLines(); } } } //-------------------------------------------------------- // Проcтановка ценовых меток на выбранной линии. Конец. // Выбор линии. //-------------------------------------------------------- //-------------------------------------------------------- // Проcтановка ценовых меток на выбранной линии. Начало. //-------------------------------------------------------- void _PriceLabelOnLines() { int i, k, point1, point2, mtf, aSizePLOL; string nameObj1="PLOL_"+countLines, nameObj2, nameObj3, cCenaPLOL; double tangens, cCenaPLOL1=ObjectGetValueByShift(nameObj,0); k=StrToInteger(countLines)-1; if (ObjectFind(nameObj1)>=0) { aSizePLOL=ObjectGet(nameObj1,OBJPROP_FONTSIZE); } else { aSizePLOL=SizeLevelLines; } // numTF0=StringSubstr(nameObj,20,1); // минимальный ТФ, на котором привязана линия. mtf=_tf[StrToInteger(StringSubstr(nameObj,20,1))]; cTime1=ObjectGet(nameObj,OBJPROP_TIME1); cTime2=ObjectGet(nameObj,OBJPROP_TIME2); point1=iBarShift(Symbol(),Period(),cTime1,false); point2=iBarShift(Symbol(),Period(),cTime2,false); // удаление меток на старшем тф (где линия становится вертикальной) ObjectDelete(nameObj1); if (point1<0 || point2<0) return; if (point1==point2) {ObjectDelete(nameObj1); return;} aColorLines=_csw[k,0]; if (_pl[k,2]>0) { ObjectCreate(nameObj1,OBJ_TEXT,0,iTime(Symbol(),mtf,0),cCenaPLOL1); ObjectSet(nameObj1, OBJPROP_COLOR,aColorLines); } else return; cCena1=ObjectGet(nameObj,OBJPROP_PRICE1); cCena2=ObjectGet(nameObj,OBJPROP_PRICE2); point1=iBarShift(Symbol(),mtf,cTime1,false); point2=iBarShift(Symbol(),mtf,cTime2,false); if (point1<0 || point2<0) return; if (point1==point2) return; tangens=(cCena2-cCena1)/(point1-point2); cCenaPLOL=DoubleToStr(cCena2+point2*tangens,Digits); if (_pl[k,2]==1 || _pl[k,2]==3) { ObjectSetText(nameObj1,cCenaPLOL,aSizePLOL,"Arial", _csw[k,0]); } else if (_pl[k,2]==2 || _pl[k,2]==4) { ObjectSetText(nameObj1,DoubleToStr(cCenaPLOL1,Digits),aSizePLOL,"Arial", _csw[k,0]); } if (_pl[k,2]==3 || _pl[k,2]==4) { // Reaction1 и Reaction2 if (_pl[k,0]==1 || _pl[k,0]==4) { nameObj2="Reaction1_"+countLines; nameObj3=nameObj1+"R1"; cCenaPLOL1=ObjectGetValueByShift(nameObj2,0); ObjectDelete(nameObj3); ObjectCreate(nameObj3,OBJ_TEXT,0,iTime(Symbol(),mtf,0),cCenaPLOL1); if (_pl[k,2]==3) { cCenaPLOL=DoubleToStr(cCena2+point2*tangens+_h1[k,0],Digits); ObjectSetText(nameObj3,cCenaPLOL,aSizePLOL,"Arial", _csw[k,0]); } else if (_pl[k,2]==4) { ObjectSetText(nameObj3,DoubleToStr(cCenaPLOL1,Digits),aSizePLOL,"Arial", _csw[k,0]); } ObjectSet(nameObj3, OBJPROP_COLOR,aColorLines); nameObj2="Reaction2_"+countLines; if (ObjectFind(nameObj2)==0) { nameObj3=nameObj1+"R2"; cCenaPLOL1=ObjectGetValueByShift(nameObj2,0); ObjectDelete(nameObj3); ObjectCreate(nameObj3,OBJ_TEXT,0,iTime(Symbol(),mtf,0),cCenaPLOL1); if (_pl[k,2]==3) { cCenaPLOL=DoubleToStr(cCena2+point2*tangens+_h1[k,1],Digits); ObjectSetText(nameObj3,cCenaPLOL,aSizePLOL,"Arial", _csw[k,0]); } else if (_pl[k,2]==4) { ObjectSetText(nameObj3,DoubleToStr(cCenaPLOL1,Digits),aSizePLOL,"Arial", _csw[k,0]); } ObjectSet(nameObj3, OBJPROP_COLOR,aColorLines); } } // Action1 и Action2 if (_pl[k,0]>3) { nameObj2="Action1_"+countLines; if (ObjectFind(nameObj2)==0) { nameObj3=nameObj1+"A1"; cCenaPLOL1=ObjectGetValueByShift(nameObj2,0); ObjectDelete(nameObj3); ObjectCreate(nameObj3,OBJ_TEXT,0,iTime(Symbol(),mtf,0),cCenaPLOL1); if (_pl[k,2]==3) { cCenaPLOL=DoubleToStr(cCena2+point2*tangens-_h1[k,0],Digits); ObjectSetText(nameObj3,cCenaPLOL,aSizePLOL,"Arial", _csw[k,0]); } else if (_pl[k,2]==4) { ObjectSetText(nameObj3,DoubleToStr(cCenaPLOL1,Digits),aSizePLOL,"Arial", _csw[k,0]); } ObjectSet(nameObj3, OBJPROP_COLOR,aColorLines); } nameObj2="Action2_"+countLines; if (ObjectFind(nameObj2)==0) { nameObj3=nameObj1+"A2"; cCenaPLOL1=ObjectGetValueByShift(nameObj2,0); ObjectDelete(nameObj3); ObjectCreate(nameObj3,OBJ_TEXT,0,iTime(Symbol(),mtf,0),cCenaPLOL1); if (_pl[k,2]==3) { cCenaPLOL=DoubleToStr(cCena2+point2*tangens-_h1[k,1],Digits); ObjectSetText(nameObj3,cCenaPLOL,aSizePLOL,"Arial", _csw[k,0]); } else if (_pl[k,2]==4) { ObjectSetText(nameObj3,DoubleToStr(cCenaPLOL1,Digits),aSizePLOL,"Arial", _csw[k,0]); } ObjectSet(nameObj3, OBJPROP_COLOR,aColorLines); } } // Уровни Reaction1 if (_pl[k,0]==2 || _pl[k,0]==5 || _pl[k,0]==7 || _pl[k,0]==9) { for (i=0; true; i++) { nameObj2="Reaction1_"+countLines+i; if (ObjectFind(nameObj2)==0) { nameObj3=nameObj1+"R1"+i; cCenaPLOL1=ObjectGetValueByShift(nameObj2,0); ObjectDelete(nameObj3); ObjectCreate(nameObj3,OBJ_TEXT,0,iTime(Symbol(),mtf,0),cCenaPLOL1); if (_pl[k,2]==3) { if (_pl[k,0]==9) { cCenaPLOL=DoubleToStr(cCena2+point2*tangens-_h1[k,0]-_h1[k,0]*StrToDouble(ObjectDescription(nameObj2))/100,Digits); } else { cCenaPLOL=DoubleToStr(cCena2+point2*tangens+_h1[k,0]*StrToDouble(ObjectDescription(nameObj2))/100,Digits); } ObjectSetText(nameObj3,cCenaPLOL,aSizePLOL,"Arial", _csw[k,0]); } else if (_pl[k,2]==4) { ObjectSetText(nameObj3,DoubleToStr(cCenaPLOL1,Digits),aSizePLOL,"Arial", _csw[k,0]); } ObjectSet(nameObj3, OBJPROP_COLOR,aColorLines); } else break; } } // Уровни Reaction2 if (_pl[k,0]==3 || _pl[k,0]==6 || _pl[k,0]==8) { for (i=0; true; i++) { nameObj2="Reaction2_"+countLines+i; if (ObjectFind(nameObj2)==0) { nameObj3=nameObj1+"R2"+i; cCenaPLOL1=ObjectGetValueByShift(nameObj2,0); ObjectDelete(nameObj3); ObjectCreate(nameObj3,OBJ_TEXT,0,iTime(Symbol(),mtf,0),cCenaPLOL1); if (_pl[k,2]==3) { cCenaPLOL=DoubleToStr(cCena2+point2*tangens+_h1[k,1]*StrToDouble(ObjectDescription(nameObj2))/100,Digits); ObjectSetText(nameObj3,cCenaPLOL,aSizePLOL,"Arial", _csw[k,0]); } else if (_pl[k,2]==4) { ObjectSetText(nameObj3,DoubleToStr(cCenaPLOL1,Digits),aSizePLOL,"Arial", _csw[k,0]); } ObjectSet(nameObj3, OBJPROP_COLOR,aColorLines); } else break; } } } } //-------------------------------------------------------- // Проcтановка ценовых меток на выбранной линии. Конец. //-------------------------------------------------------- //-------------------------------------------------------- // Построение линий реакции. Начало. // Выбор линии. //-------------------------------------------------------- void _reaction_1() { int k; for (k=0; k0 && _pl[k,0]>0) _reaction(); } } } //-------------------------------------------------------- // Построение линий реакции. Конец. // Выбор линии. //-------------------------------------------------------- //-------------------------------------------------------- // Построение линий реакции. Начало. //-------------------------------------------------------- void _reaction() { int i, j, k, point1, point2, mtf, point3, point4; int aColorReactionLines, aStyleReactionLines, aWidthReactionLines, aColorReactionLines2, aStyleReactionLines2, aWidthReactionLines2; int aColorActionLines, aStyleActionLines, aWidthActionLines, aColorActionLines2, aStyleActionLines2, aWidthActionLines2; int aColorLevelLines, aSizeLevelLines; double h1=0, h2=0, wr=0, tangens; string nameObj1,nameObj2,nameObj3,nameObj4,nameObj5,nameObj6,txt; bool fl=false; // флаг сигнала о появлении Action2 k=StrToInteger(countLines)-1; _h1[k,0]=0; _h1[k,1]=0; // numTF0=StringSubstr(nameObj,20,1); // минимальный ТФ, на котором привязана линия. mtf=_tf[StrToInteger(StringSubstr(nameObj,20,1))]; cTime1=ObjectGet(nameObj,OBJPROP_TIME1); cTime2=ObjectGet(nameObj,OBJPROP_TIME2); cCena1=ObjectGet(nameObj,OBJPROP_PRICE1); cCena2=ObjectGet(nameObj,OBJPROP_PRICE2); point1=iBarShift(Symbol(),mtf,cTime1,false); point2=iBarShift(Symbol(),mtf,cTime2,false); point3=iBarShift(Symbol(),Period(),cTime1,false); point4=iBarShift(Symbol(),Period(),cTime2,false); nameObj1="Reaction1_"+countLines; nameObj2="Reaction2_"+countLines; nameObj3="Action1_"+countLines; nameObj4="Action2_"+countLines; nameObj5="Level_"+countLines; nameObj6="nAct_"+countLines; i=number_Obj(nameObj1); if (i>0) { if (AllObjectsOfOneColor) aColorReactionLines=_csw[k,0]; else aColorReactionLines=ObjectGet(ObjectName(i),OBJPROP_COLOR); aStyleReactionLines=ObjectGet(ObjectName(i),OBJPROP_STYLE); aWidthReactionLines=ObjectGet(ObjectName(i),OBJPROP_WIDTH); } else { if (AllObjectsOfOneColor) aColorReactionLines=_csw[k,0]; else aColorReactionLines=ColorReactionLines; aStyleReactionLines=StyleReactionLines; aWidthReactionLines=WidthReactionLines; } i=number_Obj(nameObj2); if (i>0) { if (AllObjectsOfOneColor) aColorReactionLines2=_csw[k,0]; else aColorReactionLines2=ObjectGet(ObjectName(i),OBJPROP_COLOR); aStyleReactionLines2=ObjectGet(ObjectName(i),OBJPROP_STYLE); aWidthReactionLines2=ObjectGet(ObjectName(i),OBJPROP_WIDTH); } else { if (AllObjectsOfOneColor) aColorReactionLines2=_csw[k,0]; else aColorReactionLines2=ColorReactionLines; aStyleReactionLines2=StyleReactionLines; aWidthReactionLines2=WidthReactionLines; } i=number_Obj(nameObj3); if (i>0) { if (AllObjectsOfOneColor) aColorActionLines=_csw[k,0]; else aColorActionLines=ObjectGet(ObjectName(i),OBJPROP_COLOR); aStyleActionLines=ObjectGet(ObjectName(i),OBJPROP_STYLE); aWidthActionLines=ObjectGet(ObjectName(i),OBJPROP_WIDTH); } else { if (AllObjectsOfOneColor) aColorActionLines=_csw[k,0]; else aColorActionLines=ColorActionLines; aStyleActionLines=StyleReactionLines; aWidthActionLines=WidthReactionLines; } i=number_Obj(nameObj4); if (i>0) { if (AllObjectsOfOneColor) aColorActionLines2=_csw[k,0]; else aColorActionLines2=ObjectGet(ObjectName(i),OBJPROP_COLOR); aStyleActionLines2=ObjectGet(ObjectName(i),OBJPROP_STYLE); aWidthActionLines2=ObjectGet(ObjectName(i),OBJPROP_WIDTH); } else { if (AllObjectsOfOneColor) aColorActionLines2=_csw[k,0]; else aColorActionLines2=ColorActionLines; aStyleActionLines2=StyleReactionLines; aWidthActionLines2=WidthReactionLines; } i=number_Obj(nameObj5); if (i>0) { if (AllObjectsOfOneColor) aColorLevelLines=_csw[k,0]; else aColorLevelLines=ObjectGet(ObjectName(i),OBJPROP_COLOR); aSizeLevelLines=ObjectGet(ObjectName(i),OBJPROP_FONTSIZE); } else { if (AllObjectsOfOneColor) aColorLevelLines=_csw[k,0]; else aColorLevelLines=ColorLevelLines; aSizeLevelLines=SizeLevelLines; } delete_a_reaction(); if (point1<0 || point2<0) return; if (point3==point4 || point1==point2 || _pl[k,0]==0) return; tangens=(cCena2-cCena1)/(point1-point2); if (typeObj=="01") { for(i=point1;i>=point2;i--) { wr=(cCena1+tangens*(point1-i))-iLow(Symbol(),mtf,i); if (wr>h1) h1=wr; } _h1[k,0]=h1; wr=0; j=0; for(i=point2;i>0;i--) { wr=cCena2+tangens*(point2-i)-iLow(Symbol(),mtf,i); if (wr>h2) {h2=wr;j=i;} if (wr<0) {fl=true; break;} } _h1[k,1]=h2; } else if (typeObj=="02") { for(i=point1;i>=point2;i--) { wr=(cCena1+tangens*(point1-i))-iHigh(Symbol(),mtf,i); if (wr0;i--) { wr=(cCena2+tangens*(point2-i))-iHigh(Symbol(),mtf,i); if (wr0) {fl=true; break;} } _h1[k,1]=h2; } // Reaction1 if (_pl[k,0]==1 || _pl[k,0]==4) { ObjectCreate(nameObj1,OBJ_TREND,0,cTime1,cCena1+h1,cTime2,cCena2+h1); ObjectSetText(nameObj1, countLines); ObjectSet(nameObj1, OBJPROP_COLOR, aColorReactionLines); ObjectSet(nameObj1,OBJPROP_STYLE, aStyleReactionLines); ObjectSet(nameObj1,OBJPROP_WIDTH, aWidthReactionLines); ObjectCreate(nameObj6+3,OBJ_TEXT,0,cTime1,cCena1+h1); ObjectSetText(nameObj6+3,"R1",aSizeLevelLines,"Arial", aColorLevelLines); // (Reaction2) if (fl && j>0) { ObjectCreate(nameObj2,OBJ_TREND,0,cTime1,cCena1+h2,cTime2,cCena2+h2); ObjectSetText(nameObj2, countLines); ObjectSet(nameObj2, OBJPROP_COLOR, aColorReactionLines2); ObjectSet(nameObj2,OBJPROP_STYLE, aStyleReactionLines2); ObjectSet(nameObj2,OBJPROP_WIDTH, aWidthReactionLines2); ObjectCreate(nameObj6+4,OBJ_TEXT,0,cTime1,cCena1+h2); ObjectSetText(nameObj6+4,"R2",aSizeLevelLines,"Arial", aColorLevelLines); } } else if (_pl[k,0]==2 || _pl[k,0]==5 || _pl[k,0]==7) { for (i=0;i0) { for (i=0;i0) { ObjectCreate(nameObj4,OBJ_TREND,0,cTime1,cCena1-h2,cTime2,cCena2-h2); ObjectSetText(nameObj4, countLines); ObjectSet(nameObj4, OBJPROP_COLOR, aColorActionLines2); ObjectSet(nameObj4,OBJPROP_STYLE, aStyleActionLines2); ObjectSet(nameObj4,OBJPROP_WIDTH, aWidthActionLines2); ObjectCreate(nameObj6+2,OBJ_TEXT,0,cTime1,cCena1-h2); ObjectSetText(nameObj6+2,"A2",aSizeLevelLines,"Arial", aColorLevelLines); } } //-------------------------------------------------------- // Построение линий реакции. Конец. //-------------------------------------------------------- //-------------------------------------------------------- // фибо-Time. Начало. //-------------------------------------------------------- void _fiboTimeMulty() { double h1=0, h2=0, wr=0, wr2=0, tangens, ch1, ch2; int ih1=0, ih2=0; int i, k, point1, point2, mtf; string nameObj1,nameObj2,nameObj3,nameObj4; int aColorft1, aColorft2, aColorft3, aColorft4; int aStyleft1, aStyleft2, aStyleft3, aStyleft4; int aWidthft1, aWidthft2, aWidthft3, aWidthft4; k=StrToInteger(countLines)-1; mtf=_tf[StrToInteger(StringSubstr(nameObj,20,1))]; cTime1=ObjectGet(nameObj,OBJPROP_TIME1); cTime2=ObjectGet(nameObj,OBJPROP_TIME2); cCena1=ObjectGet(nameObj,OBJPROP_PRICE1); cCena2=ObjectGet(nameObj,OBJPROP_PRICE2); point1=iBarShift(Symbol(),mtf,cTime1,false); point2=iBarShift(Symbol(),mtf,cTime2,false); nameObj1="ft1_"+countLines; nameObj2="ft2_"+countLines; nameObj3="ft3_"+countLines; nameObj4="ft4_"+countLines; if (ObjectFind(nameObj1)==0) { aColorft1=ObjectGet(nameObj1,OBJPROP_LEVELCOLOR); aStyleft1=ObjectGet(nameObj1,OBJPROP_LEVELSTYLE); aWidthft1=ObjectGet(nameObj1,OBJPROP_LEVELWIDTH); ObjectDelete(nameObj1); } else { aColorft1=ColorList[0]; aStyleft1=StyleFiboTime; aWidthft1=WidthFiboTime; } if (ObjectFind(nameObj2)==0) { aColorft2=ObjectGet(nameObj2,OBJPROP_LEVELCOLOR); aStyleft2=ObjectGet(nameObj2,OBJPROP_LEVELSTYLE); aWidthft2=ObjectGet(nameObj2,OBJPROP_LEVELWIDTH); ObjectDelete(nameObj2); } else { aColorft2=ColorList[1]; aStyleft2=StyleFiboTime; aWidthft2=WidthFiboTime; } if (ObjectFind(nameObj3)==0) { aColorft3=ObjectGet(nameObj3,OBJPROP_LEVELCOLOR); aStyleft3=ObjectGet(nameObj3,OBJPROP_LEVELSTYLE); aWidthft3=ObjectGet(nameObj3,OBJPROP_LEVELWIDTH); ObjectDelete(nameObj3); } else { aColorft3=ColorList[2]; aStyleft3=StyleFiboTime; aWidthft3=WidthFiboTime; } if (ObjectFind(nameObj4)==0) { aColorft4=ObjectGet(nameObj4,OBJPROP_LEVELCOLOR); aStyleft4=ObjectGet(nameObj4,OBJPROP_LEVELSTYLE); aWidthft4=ObjectGet(nameObj4,OBJPROP_LEVELWIDTH); ObjectDelete(nameObj4); } else { aColorft4=ColorList[3]; aStyleft4=StyleFiboTime; aWidthft4=WidthFiboTime; } if (point1<0 || point2<0) return; if (point1==point2) return; tangens=(cCena2-cCena1)/(point1-point2); if (_pl[k,1]>0) { if (typeObj=="01") { if (_pl[k,1]==1) { for(i=point1;i>=point2;i--) { wr=(cCena1+tangens*(point1-i))-iLow(Symbol(),mtf,i); if (wr>h1) {h1=wr; ih1=i;} } wr2=0; h2=0; for(i=point2;i>0;i--) { wr2=cCena2+tangens*(point2-i)-iLow(Symbol(),mtf,i); if (wr2>h2) {h2=wr2;ih2=i;} if (wr2<0) break; } } else { ih1=search_Low(mtf,point1,point2); h1=(cCena1+tangens*(point1-ih1))-iLow(Symbol(),mtf,ih1); wr2=0; ih2=0; for(i=point2;i>0;i--) { wr2=cCena2+tangens*(point2-i)-iLow(Symbol(),mtf,i); if (wr2<0) {ih2=search_Low(mtf,point2,i); h2=cCena2+tangens*(point2-ih2)-iLow(Symbol(),mtf,ih2); break;} } } ch1=-h1*2/3; ch2=-h2; } else if (typeObj=="02") { if (_pl[k,1]==1) { for(i=point1;i>=point2;i--) { wr=iHigh(Symbol(),mtf,i)-(cCena1+tangens*(point1-i)); if (wr>h1) {h1=wr; ih1=i;} } wr2=0; h2=0; for(i=point2;i>0;i--) { wr2=iHigh(Symbol(),mtf,i)-(cCena2+tangens*(point2-i)); if (wr2>h2) {h2=wr2;ih2=i;} if (wr2<0) break; } } else { ih1=search_High(mtf,point1,point2); h1=iHigh(Symbol(),mtf,ih1)-(cCena1+tangens*(point1-ih1)); wr2=0; ih2=0; for(i=point2;i>0;i--) { wr2=iHigh(Symbol(),mtf,i)-(cCena2+tangens*(point2-i)); if (wr2<0) {ih2=search_High(mtf,point2,i); h2=iHigh(Symbol(),mtf,ih2)-(cCena2+tangens*(point2-ih2)); break;} } } ch1=h1*2/3; ch1=h2; } ObjectCreate(nameObj1,OBJ_FIBOTIMES,0,cTime1,cCena1,cTime2,cCena1); ObjectSet(nameObj1,OBJPROP_COLOR,CLR_NONE); if (_pl[k,1]!=3) { ObjectSet(nameObj1,OBJPROP_LEVELCOLOR,aColorft1); ObjectSet(nameObj1,OBJPROP_LEVELSTYLE,aStyleft1); ObjectSet(nameObj1,OBJPROP_LEVELWIDTH,aWidthft1); ObjectSet(nameObj1,OBJPROP_FIBOLEVELS, ftSize); ObjectCreate(nameObj2,OBJ_FIBOTIMES,0,cTime1,cCena1+ch1,iTime(Symbol(),mtf,ih1),cCena1+ch1); ObjectSet(nameObj2,OBJPROP_COLOR,CLR_NONE); ObjectSet(nameObj2,OBJPROP_LEVELCOLOR,aColorft2); ObjectSet(nameObj2,OBJPROP_LEVELSTYLE,aStyleft2); ObjectSet(nameObj2,OBJPROP_LEVELWIDTH,aWidthft2); ObjectSet(nameObj2,OBJPROP_FIBOLEVELS, ftSize); ObjectCreate(nameObj3,OBJ_FIBOTIMES,0,iTime(Symbol(),mtf,ih1),cCena1+ch1/2,cTime2,cCena1+ch1/2); ObjectSet(nameObj3,OBJPROP_COLOR,CLR_NONE); ObjectSet(nameObj3,OBJPROP_LEVELCOLOR,aColorft2); ObjectSet(nameObj3,OBJPROP_LEVELSTYLE,aStyleft2); ObjectSet(nameObj3,OBJPROP_LEVELWIDTH,aWidthft2); ObjectSet(nameObj3,OBJPROP_FIBOLEVELS, ftSize); if (wr2<0) { ObjectCreate(nameObj4,OBJ_FIBOTIMES,0,iTime(Symbol(),mtf,ih1),cCena2+ch2,iTime(Symbol(),mtf,ih2),cCena2+ch2); ObjectSet(nameObj4,OBJPROP_COLOR,CLR_NONE); ObjectSet(nameObj4,OBJPROP_LEVELCOLOR,aColorft2); ObjectSet(nameObj4,OBJPROP_LEVELSTYLE,aStyleft2); ObjectSet(nameObj4,OBJPROP_LEVELWIDTH,aWidthft2); ObjectSet(nameObj4,OBJPROP_FIBOLEVELS, ftSize); } i=0; for (i=0;i0) { ObjectSet(nameObj1,OBJPROP_LEVELCOLOR,aColorLines); ObjectSet(nameObj1,OBJPROP_LEVELSTYLE,aStyleLines); ObjectSet(nameObj1,OBJPROP_LEVELWIDTH,aWidthLines); ObjectSet(nameObj1,OBJPROP_FIBOLEVELS,QuantityCycles+1); i=0; for (i=0;i<=QuantityCycles;i++) { ObjectSet(nameObj1,OBJPROP_FIRSTLEVEL+i,i); if (i>0) ObjectSetFiboDescription(nameObj1, i, ""+i); } } } } //-------------------------------------------------------- // фибо-Time. Конец. //-------------------------------------------------------- //-------------------------------------------------------- // Поиск бара. Начало. // возвращает false - бар не найден // true - бар найден //-------------------------------------------------------- bool search_bar(int tf) { datetime t1=cTime1,t2=cTime2; int cc1,cc2,co1,co2; cc1=MathRound(cCena1/Point); cc2=MathRound(cCena2/Point); int j=iBarShift(Symbol(),tf,cTime1,false), k=iBarShift(Symbol(),tf,cTime2,false); // Проверка High co1=MathRound(iHigh(Symbol(),tf,j)/Point); co2=MathRound(iHigh(Symbol(),tf,k)/Point); if ((co1==cc1 && co2==cc2) || (TransformationMax && typeObj=="01")) { if (TransformationMax) { t1=cTime1; coordinataCena1=search_high_Max(tf, cTime1); } else { t1=search_high(tf, cTime1, cCena1); } if (newBar) { if (TransformationMax) { t2=cTime2; coordinataCena2=search_high_Max(tf, cTime2); } else { t2=search_high(tf, cTime2, cCena2); } if (newBar) { if (t1!=t2) { numTF0=numTF; coordinataTime1=t1; coordinataTime2=t2; } else { newBar=false; return(false); } } } typeObj="01"; return(true); } // Проверка Low co1=MathRound(iLow(Symbol(),tf,j)/Point); co2=MathRound(iLow(Symbol(),tf,k)/Point); if ((co1==cc1 && co2==cc2) || (TransformationMax && typeObj=="02")) { if (TransformationMax) { t1=cTime1; coordinataCena1=search_low_Max(tf, cTime1); } else { t1=search_low(tf, cTime1, cCena1); } if (newBar) { if (TransformationMax) { t2=cTime2; coordinataCena2=search_low_Max(tf, cTime2); } else { t2=search_low(tf, cTime2, cCena2); } if (newBar) { if (t1!=t2) { numTF0=numTF; coordinataTime1=t1; coordinataTime2=t2; } else { newBar=false; return(false); } } } typeObj="02"; return(true); } // Проверка High-Low co1=MathRound(iHigh(Symbol(),tf,j)/Point); co2=MathRound(iLow(Symbol(),tf,k)/Point); if ((co1==cc1 && co2==cc2) || (TransformationMax && typeObj=="03")) { if (TransformationMax) { t1=cTime1; coordinataCena1=search_high_Max(tf, cTime1); } else { t1=search_high(tf, cTime1, cCena1); } if (newBar) { if (TransformationMax) { t2=cTime2; coordinataCena2=search_low_Max(tf, cTime2); } else { t2=search_low(tf, cTime2, cCena2); } if (newBar) { if (t1!=t2) { numTF0=numTF; coordinataTime1=t1; coordinataTime2=t2; } else { newBar=false; return(false); } } } typeObj="03"; return(true); } // Проверка Low-High co1=MathRound(iLow(Symbol(),tf,j)/Point); co2=MathRound(iHigh(Symbol(),tf,k)/Point); if ((co1==cc1 && co2==cc2) || (TransformationMax && typeObj=="04")) { if (TransformationMax) { t1=cTime1; coordinataCena1=search_low_Max(tf, cTime1); } else { t1=search_low(tf, cTime1, cCena1); } if (newBar) { if (TransformationMax) { t2=cTime2; coordinataCena2=search_high_Max(tf, cTime2); } else { t2=search_high(tf, cTime2, cCena2); } if (newBar) { if (t1!=t2) { numTF0=numTF; coordinataTime1=t1; coordinataTime2=t2; } else { newBar=false; return(false); } } } typeObj="04"; return(true); } // Проверка Close-Close co1=MathRound(iClose(Symbol(),tf,j)/Point); co2=MathRound(iClose(Symbol(),tf,k)/Point); if ((co1==cc1 && co2==cc2) || (TransformationMax && typeObj=="05")) { if (TransformationMax) { t1=cTime1; coordinataCena1=search_close_Max(tf, cTime1); } else { t1=search_close(tf, cTime1, cCena1); } if (newBar) { if (TransformationMax) { t2=cTime1; coordinataCena2=search_close_Max(tf, cTime2); } else { t2=search_close(tf, cTime2, cCena2); } if (newBar) { if (t1!=t2) { numTF0=numTF; coordinataTime1=t1; coordinataTime2=t2; } else { newBar=false; return(false); } } } typeObj="05"; return(true); } if (typeObj!="06") {typeObj="00";} return(false); } //-------------------------------------------------------- // Поиск бара. Конец. //-------------------------------------------------------- //-------------------------------------------------------- // Преобразование максимумов. Начало. // возвращает цену максимума на старшем ТФ //-------------------------------------------------------- double search_high_Max(int tf, datetime t) { newBar=true; return (iHigh(Symbol(),tf,iBarShift(Symbol(),tf,t,false))); } //-------------------------------------------------------- // Преобразование максимумов. Конец. // возвращает цену максимума на старшем ТФ //-------------------------------------------------------- //-------------------------------------------------------- // Преобразование минимумов. Начало. // возвращает цену максимума на старшем ТФ //-------------------------------------------------------- double search_close_Max(int tf, datetime t) { newBar=true; return (iClose(Symbol(),tf,iBarShift(Symbol(),tf,t,false))); } //-------------------------------------------------------- // Преобразование минимумов. Конец. // возвращает цену максимума на старшем ТФ //-------------------------------------------------------- //-------------------------------------------------------- // Преобразование минимумов. Начало. // возвращает цену максимума на старшем ТФ //-------------------------------------------------------- double search_low_Max(int tf, datetime t) { newBar=true; return (iLow(Symbol(),tf,iBarShift(Symbol(),tf,t,false))); } //-------------------------------------------------------- // Преобразование минимумов. Конец. // возвращает цену максимума на старшем ТФ //-------------------------------------------------------- //-------------------------------------------------------- // Поиск максимума. Начало. // возвращает время и задает // newBar=false - бар не найден // true - бар найден //-------------------------------------------------------- datetime search_high(int tf, datetime t, double c) { int j=0,k=0, i, n=-1, mtf; // j - номер бара на текущем ТФ (минимальном) // k - номер бара на старшем ТФ double c1; bool w=false; newBar=false; if (Transformation) { if (numTF>numTF0) mtf=_tf[StrToInteger(numTF0)]; else mtf=Period(); } else { mtf=Period(); } if (t==iTime(Symbol(),mtf,0)) j=0; else j=iBarShift(Symbol(),mtf,t,false); if (t==iTime(Symbol(),tf,0)) k=0; else k=iBarShift(Symbol(),tf,t,false); datetime t2, tm=iTime(Symbol(),tf,k); t2=tm+tf*60; i=j; while (i>0 && iTime(Symbol(),mtf,i)t2) return (0); n=j; c1 = iHigh(Symbol(),mtf,j); if (tf==PERIOD_MN1) { while (i>=0 && TimeMonth(iTime(Symbol(),mtf,i))==TimeMonth(t)) { if (c1=0 && iTime(Symbol(),mtf,i)-1) { if (c1>=c-delta*Point && c1<=c+delta*Point) { newBar=true; if (w && (c1>iHigh(Symbol(),mtf,j) || MathRound(c1/Point)!=MathRound(c/Point) || iTime(Symbol(),mtf,n)!=t)) w=false; if (w) { if (PeakCurrentTime) { numTF2=numTF; } else { numTF2=numTF1; } return (t); } else { if (Transformation) { if (PeakCurrentTime) { if (numTF>numTF0) numTF2=numTF0; else numTF2=numTF; if (MathRound(cCena1/Point)==MathRound(c/Point)) { coordinataCena1=iHigh(Symbol(),mtf,n); } else { coordinataCena2=iHigh(Symbol(),mtf,n); } } } else { if (PeakCurrentTime) { if (numTFnumTF0) mtf=_tf[StrToInteger(numTF0)]; else mtf=Period(); } else { mtf=Period(); } if (t==iTime(Symbol(),mtf,0)) j=0; else j=iBarShift(Symbol(),mtf,t,false); if (t==iTime(Symbol(),tf,0)) k=0; else k=iBarShift(Symbol(),tf,t,false); datetime t2, tm=iTime(Symbol(),tf,k); t2=tm+tf*60; i=j; while (i>0 && iTime(Symbol(),mtf,i)t2) return (0); n=j; c1 = iLow(Symbol(),mtf,j); if (tf==PERIOD_MN1) { while (i>=0 && TimeMonth(iTime(Symbol(),mtf,i))==TimeMonth(t)) { if (c1>iLow(Symbol(),mtf,i)) {c1=iLow(Symbol(),mtf,i); n=i;} i--; } } else { for (i=j;i>=0 && iTime(Symbol(),mtf,i)iLow(Symbol(),mtf,i)) {c1=iLow(Symbol(),mtf,i); n=i;} } } if (n>-1) { if (c1<=c+delta*Point && c1>=c-delta*Point) { newBar=true; if (w && (c1numTF0) numTF2=numTF0; else numTF2=numTF; if (MathRound(cCena1/Point)==MathRound(c/Point)) { coordinataCena1=iLow(Symbol(),mtf,n); } else { coordinataCena2=iLow(Symbol(),mtf,n); } } } else { if (PeakCurrentTime) { if (numTFnumTF0) mtf=_tf[StrToInteger(numTF0)]; else mtf=Period(); } else { mtf=Period(); } if (t==iTime(Symbol(),mtf,0)) j=0; else j=iBarShift(Symbol(),mtf,t,false); if (t==iTime(Symbol(),tf,0)) k=0; else k=iBarShift(Symbol(),tf,t,false); datetime t2, tm=iTime(Symbol(),tf,k); t2=tm+tf*60; i=j; while (i>0 && iTime(Symbol(),mtf,i)t2) return (0); n=j; if (tf==PERIOD_MN1) { while (i>=0 && TimeMonth( iTime(Symbol(),mtf,i))==TimeMonth(t)) {n=i; i--;} } else { for (i=j;i>=0 && iTime(Symbol(),mtf,i)-1) { if (c>=iLow(Symbol(),mtf,n) && c<=iHigh(Symbol(),mtf,n)) { newBar=true; if (Transformation) { if (PeakCurrentTime) { if (numTF>numTF0) numTF2=numTF0; else numTF2=numTF; if (MathRound(cCena1/Point)==MathRound(c/Point)) { coordinataCena1=iClose(Symbol(),mtf,n); } else { coordinataCena2=iClose(Symbol(),mtf,n); } } } else { if (PeakCurrentTime) { if (numTF0 && count<10) countLines="00"+count; else if (count>9 && count<100) countLines="0"+count; else if (count>99 && count<1000) countLines=""+count; else countLines="***"; } //-------------------------------------------------------- // Задание номера линии. Конец. //-------------------------------------------------------- //-------------------------------------------------------- // Создание объекта-линии. Начало. //-------------------------------------------------------- void Create_lines() { /* int i=StrToInteger(StringSubstr(nameObj,4,3)); Print ("i=",i); if (i<=col && i>0) { if (_atl[i-1]) return; } */ ObjectCreate(nameObj,OBJ_TREND,0,coordinataTime1,coordinataCena1,coordinataTime2,coordinataCena2); ObjectSetText(nameObj, countLines); ObjectSet(nameObj, OBJPROP_COLOR,aColorLines); ObjectSet(nameObj,OBJPROP_STYLE,aStyleLines); ObjectSet(nameObj,OBJPROP_WIDTH,aWidthLines); _writeArray(StrToInteger(countLines)-1); _NumberLines(); } //-------------------------------------------------------- // Создание объекта-линии. Конец. //-------------------------------------------------------- //-------------------------------------------------------- // Расчет координат новой линии. Начало. //-------------------------------------------------------- void coordinaty_lines() { int BarsPerChart=WindowBarsPerChart(); int VisibleBarFirst=WindowFirstVisibleBar(); if (VisibleBarFirst=0; i--) { txt=ObjectName(i); if (StringFind(txt,"Reaction1_"+countLines)>-1) ObjectDelete (txt); if (StringFind(txt,"Reaction2_"+countLines)>-1) ObjectDelete (txt); if (StringFind(txt,"Action1_"+countLines)>-1) ObjectDelete (txt); if (StringFind(txt,"Action2_"+countLines)>-1) ObjectDelete (txt); if (StringFind(txt,"nAct_"+countLines)>-1) ObjectDelete (txt); if (StringFind(txt,"PLOL_"+countLines+"R1")>-1) ObjectDelete (txt); if (StringFind(txt,"PLOL_"+countLines+"R2")>-1) ObjectDelete (txt); if (StringFind(txt,"PLOL_"+countLines+"A1")>-1) ObjectDelete (txt); if (StringFind(txt,"PLOL_"+countLines+"A2")>-1) ObjectDelete (txt); if (StringFind(txt,"Level_"+countLines)>-1) level++; } if (level>0) { Sizefi=level; ArrayResize(fi,level); ArrayResize(fitxt,level); ArrayResize(fitxt100,level); for (i=ObjectsTotal(); i>=0; i--) { txt=ObjectName(i); if (StringFind(txt,"Level_"+countLines)>-1) { fitxt100[m]=ObjectDescription(txt); fi[m]=StrToDouble(fitxt100[m])/100; ObjectDelete (txt); level--; m++; if (level==0) break; } } } } //-------------------------------------------------------- // Удаление линий реакции. Конец. //-------------------------------------------------------- //-------------------------------------------------------- // Поиск минимумов. Начало. //-------------------------------------------------------- int search_Low(int tf, int p1, int p2) { double c=0; int i, j; for (i=p1;i>=p2;i--) { if (c>iLow(Symbol(),tf,i)) {j=i; c=iLow(Symbol(),tf,i);} } return (j); } //-------------------------------------------------------- // Поиск минимумов. Конец. //-------------------------------------------------------- //-------------------------------------------------------- // Поиск максимумов. Начало. //-------------------------------------------------------- int search_High(int tf, int p1, int p2) { double c=0; int i, j; for (i=p1;i>=p2;i--) { if (c=0; i--) { if (StringFind(ObjectName(i),txt)>-1) return (i); } return (-1); } //-------------------------------------------------------- // Номер объекта. Конец. //-------------------------------------------------------- //-------------------------------------------------------- // Определение смены счета. Начало. //-------------------------------------------------------- void RefreshAccountInfo() { static int acc=0; if (accountCompany!=AccountCompany()|| acc!=AccountNumber()) { if (acc>0) { chartchange=2; changeAccount=true; moveATL=true; } // Print("AccountNumber()=",AccountNumber()); // Print("AccountCompany()=",AccountCompany()); accountCompany=AccountCompany(); acc=AccountNumber(); } } //-------------------------------------------------------- // Определение смены счета. Конец. //-------------------------------------------------------- //-------------------------------------------------------- // Простановка номеров линий. Начало. //-------------------------------------------------------- void _NumberLines() { string NumberLines, txt, txt1=""; txt=StringSubstr(nameObj,13,1); if (txt=="1") txt1="LT_"; else if (txt=="2") txt1="LC_"; else if (txt=="3") txt1="LP_"; NumberLines="_NumberLines_"+countLines; ObjectDelete(NumberLines); if (iBarShift(Symbol(),Period(),coordinataTime1,false)==iBarShift(Symbol(),Period(),coordinataTime2,false)) return; if (ShowNumberLines) { ObjectCreate(NumberLines,OBJ_TEXT,0,coordinataTime1,coordinataCena1); ObjectSetText(NumberLines, txt1+StrToInteger(countLines),SizeLevelLines,"Arial",aColorLines); } } //-------------------------------------------------------- // Простановка номеров линий. Конец. //-------------------------------------------------------- //-------------------------------------------------------- // Вывод информации о линии. Начало. //-------------------------------------------------------- void _infoLines() { int k=infoLines-1, tf0,tf1, h1, h2, numFr; tf0=_numTf[k,0]; tf1=_numTf[k,1]; string info="\n\nNumberLines = "+infoLines+" / min TF : "+txtTF[tf0]+" / max TF : "+txtTF[tf1]+"\n"; string info1=" / ", info2=""; bool yes=false; string tf; datetime mtf; if (infoLines>col || infoLines<=0) {infoVariants=-1; return;} if (!_atl[k]) {infoVariants=0; return;} if (infoVariants==0) { if (_friend[k]>0) { info2="NumberLinesConnected = "+_friend[k]+"\n"; info=info+info2; } if (_pl[k,0]>0) { info2="ShowReactionLines = "+_pl[k,0]; h1=MathRound(MathAbs(_h1[k,0])/Point); h2=MathRound(MathAbs(_h1[k,1])/Point); if (h1>0) { info=info+info2+" / H1 = "+h1; if (h2>0 && (_pl[k,0]==1 || _pl[k,0]==4 || _pl[k,0]==6 || _pl[k,0]==8)) { info=info+" / H2 = "+h2; } } if (h1>0 || h2>0) { info=info+"\n"; yes=false; } else { info=info+info2; yes=true; } } if (_pl[k,1]>0) { info2="FiboTime = "+_pl[k,1]; if (yes) { info=info+info1; } info=info+info2; yes=true; } if (_pl[k,2]>0) { info2="PriceLabelOnLines = "+_pl[k,2]; if (yes) { info=info+info1; } info=info+info2; yes=true; } if (_pl[k,3]>0) { if (_pl[k,3]==1) { info2="LT"; } else if (_pl[k,3]==2) { info2="LC"; } else if (_pl[k,3]==3) { info2="LP"; } if (yes) { info2=info1; } else info=info+"NameLines = "+info2; yes=true; } if (_pl[k,4]>0) { info2="VariantsOfProcessingLines = "+_pl[k,4]; if (yes) { info=info+info1+info2; } else { info=info+info2; } yes=true; } if (_pl[k,3]==3) { numFr=_friend[k]-1; if (_numTf[k,0]<=_numTf[numFr,0]) { tf=txtTF[_numTf[numFr,0]]; mtf=_tf[_numTf[numFr,0]]; } else { tf=txtTF[_numTf[k,0]]; mtf=_tf[_numTf[k,0]]; } if (_coordinataX(numFr, k, mtf)) { info=info+"\nX "+tf+" : "+DoubleToStr(cenaX,Digits)+" : "+TimeToStr(timeX,TIME_DATE|TIME_MINUTES); } } infoLines=0; } else if (infoVariants==1) { } Comment(info); } //-------------------------------------------------------- // Вывод информации о линии. Конец. //-------------------------------------------------------- //-------------------------------------------------------- // Расчет координат пересечения двух линий в будущем. Начало. //-------------------------------------------------------- bool _coordinataX(int numFr, int k, datetime mtf) { int pointLC1, pointLC2, pointLP1, pointLP2, _bar; double tangens_LC, tangens_LP, x1, x2, x3, cena; datetime deltaT; if (numFr<0) return (false); pointLC1=iBarShift(Symbol(),mtf,_time[numFr,0],false); pointLC2=iBarShift(Symbol(),mtf,_time[numFr,1],false); pointLP1=iBarShift(Symbol(),mtf,_time[k,0],false); pointLP2=iBarShift(Symbol(),mtf,_time[k,1],false); if ((pointLC1==pointLC2) || (pointLP1==pointLP2)) return (false); tangens_LC=(_cena[numFr,1]-_cena[numFr,0])/(pointLC1-pointLC2); tangens_LP=(_cena[k,1]-_cena[k,0])/(pointLP1-pointLP2); if (tangens_LP==tangens_LC || tangens_LP==0) return (false); if (MathAbs(tangens_LP)>MathAbs(tangens_LC)) { x1=_cena[numFr,0]+tangens_LC*(pointLC1-pointLP1); x2=_cena[k,0]; x3=(x1*tangens_LP - x2*tangens_LC)/(tangens_LP-tangens_LC); cena=(x3-x2)/tangens_LP; _bar=MathFloor(cena); deltaT=MathRound(mtf*60*(cena-_bar)); cenaX=_cena[k,0]+tangens_LP*_bar; cenaX=x3; if (pointLP1>=_bar) { timeX=iTime(Symbol(),mtf,pointLP1-_bar)+deltaT; } else { timeX=iTime(Symbol(),mtf,0)+(_bar-pointLP1)*mtf*60+deltaT; } } else return (false); return (true); } //-------------------------------------------------------- // Расчет координат пересечения двух линий в будущем. Конец. //-------------------------------------------------------- //-------------------------------------------------------- // Преобразование таймфрейма, выраженного в минутах в строковое значение. Начало. //-------------------------------------------------------- string _period(int tf) { switch (tf) { case 1 : {return (TF[0]);} case 5 : {return (TF[1]);} case 15 : {return (TF[2]);} case 30 : {return (TF[3]);} case 60 : {return (TF[4]);} case 240 : {return (TF[5]);} case 1440 : {return (TF[6]);} case 10080 : {return (TF[7]);} case 43200 : {return (TF[8]);} } } //-------------------------------------------------------- // Преобразование таймфрейма, выраженного в минутах в строковое значение. Конец. //--------------------------------------------------------