Добрый день!
Прошу помочь в решении вопроса. Заранее благодарю за ответы!
Пытаюсь написать 2 графические кнопки, предназначенные для рисования на графике горизонтальных уровней. У каждой кнопки свой набор уровней. При нажатии уровни рисуются, при отжатии удаляются.
Не могу написать код так, чтобы при нажатии одной кнопки отжималась другая (если нажата).
Пробую прописать через OBJPROP_STATE, но почему то, когда нажимаю сперва "вторую" из кнопок, а затем "первую", то "вторая" нормально отжимается, а когда нажимаю сперва "первую", то "вторую" становится невозможно нажать.
Прошу подсказать, как правильно написать код для моей цели.
надо было весь код привести..
сильно подозреваю, что у вас там не хватает else. Получается что при нажатии одной кнопки меняете состояние другой и тут же видите что её состояние поменялось и возвращаете всё обратно.
PS/ форум неплохо развивает телепатические способности, что должно положительно влиять на торговлю. Так скоро можно вообще от роботов
отказаться :-)
надо было весь код привести..
сильно подозреваю, что у вас там не хватает else. Получается что при нажатии одной кнопки меняете состояние другой и тут же видите что её состояние поменялось и возвращаете всё обратно.
PS/ форум неплохо развивает телепатические способности, что должно положительно влиять на торговлю. Так скоро можно вообще от
роботов отказаться :-)
Прошу прощения, думал будет достаточно. Привожу весь код:
#property copyright "" #property link "" #property version "1.00" #property strict //+------------------------------------------------------------------+ //| Expert initialization function | //+------------------------------------------------------------------+ int OnInit() { return(INIT_SUCCEEDED); } //+------------------------------------------------------------------+ //| Expert tick function | //+------------------------------------------------------------------+ void OnTick() { } //+------------------------------------------------------------------+ //| ChartEvent function | //+------------------------------------------------------------------+ void OnChartEvent(const int id, const long &lparam, const double &dparam, const string &sparam) { ButtonCreate_UP(); if(ObjectGet("Name_UP",OBJPROP_STATE)==true) { ObjectSetInteger(0,"Name_Down",OBJPROP_STATE,false); ChartRedraw(0); ObjectCreate(0,"UP",OBJ_HLINE,0,0,Bid); ObjectSetInteger(0,"UP",OBJPROP_COLOR,clrMidnightBlue); ObjectSetInteger(0,"UP",OBJPROP_STYLE,STYLE_DASHDOT); ObjectCreate(0,"SLUP",OBJ_HLINE,0,0,Bid-383*Point); ObjectSetInteger(0,"SLUP",OBJPROP_COLOR,clrCrimson); ObjectSetInteger(0,"SLUP",OBJPROP_STYLE,STYLE_DASHDOT); ObjectCreate(0,"TPUP",OBJ_HLINE,0,0,Bid+621*Point); ObjectSetInteger(0,"TPUP",OBJPROP_COLOR,clrSeaGreen); ObjectSetInteger(0,"TPUP",OBJPROP_STYLE,STYLE_DASHDOT); } if(ObjectGet("Name_UP",OBJPROP_STATE)==false) { ObjectDelete(0,"UP"); ObjectDelete(0,"SLUP"); ObjectDelete(0,"TPUP"); } ButtonCreate_Down(); if(ObjectGet("Name_Down",OBJPROP_STATE)==true) { ObjectSetInteger(0,"Name_UP",OBJPROP_STATE,false); ChartRedraw(0); ObjectCreate(0,"Down",OBJ_HLINE,0,0,Bid); ObjectSetInteger(0,"Down",OBJPROP_COLOR,clrMidnightBlue); ObjectSetInteger(0,"Down",OBJPROP_STYLE,STYLE_DASHDOT); ObjectCreate(0,"SLDown",OBJ_HLINE,0,0,Bid+383*Point); ObjectSetInteger(0,"SLDown",OBJPROP_COLOR,clrCrimson); ObjectSetInteger(0,"SLDown",OBJPROP_STYLE,STYLE_DASHDOT); ObjectCreate(0,"TPDown",OBJ_HLINE,0,0,Bid-621*Point); ObjectSetInteger(0,"TPDown",OBJPROP_COLOR,clrSeaGreen); ObjectSetInteger(0,"TPDown",OBJPROP_STYLE,STYLE_DASHDOT); } if(ObjectGet("Name_Down",OBJPROP_STATE)==false) { ObjectDelete(0,"Down"); ObjectDelete(0,"SLDown"); ObjectDelete(0,"TPDown"); } } //+------------------------------------------------------------------+ //| Expert deinitialization function | //+------------------------------------------------------------------+ void OnDeinit(const int reason) { ObjectDelete(0,"Name_UP"); ObjectDelete(0,"Name_Down"); } //+------------------------------------------------------------------+ //+******************************************************************+ //| Создает кнопку | //+******************************************************************+ bool ButtonCreate_UP(const long chart_ID=0, // ID графика const string name="Name_UP", // имя кнопки const int sub_window=0, // номер подокна const int x=500, // координата по оси X const int y=657, // координата по оси Y const int width=70, // ширина кнопки const int height=43, // высота кнопки const ENUM_BASE_CORNER corner=CORNER_LEFT_UPPER, // угол графика для привязки const string text="Up", // текст const string font="Cambira", // шрифт const int font_size=11, // размер шрифта const color clr=clrBlack, // цвет текста const color back_clr=clrMediumSeaGreen, // цвет фона const color border_clr=clrNONE, // цвет границы const bool state=false, // нажата/отжата const bool back=false, // на заднем плане const bool selection=false, // выделить для перемещений const bool hidden=true) // скрыт в списке объектов { //--- сбросим значение ошибки ResetLastError(); //--- создадим кнопку if(ObjectCreate(chart_ID,name,OBJ_BUTTON,sub_window,0,0)) { //--- установим координаты кнопки ObjectSetInteger(chart_ID,name,OBJPROP_XDISTANCE,x); ObjectSetInteger(chart_ID,name,OBJPROP_YDISTANCE,y); //--- установим размер кнопки ObjectSetInteger(chart_ID,name,OBJPROP_XSIZE,width); ObjectSetInteger(chart_ID,name,OBJPROP_YSIZE,height); //--- установим угол графика, относительно которого будут определяться координаты точки ObjectSetInteger(chart_ID,name,OBJPROP_CORNER,corner); //--- установим текст ObjectSetString(chart_ID,name,OBJPROP_TEXT,text); //--- установим шрифт текста ObjectSetString(chart_ID,name,OBJPROP_FONT,font); //--- установим размер шрифта ObjectSetInteger(chart_ID,name,OBJPROP_FONTSIZE,font_size); //--- установим цвет текста ObjectSetInteger(chart_ID,name,OBJPROP_COLOR,clr); //--- установим цвет фона ObjectSetInteger(chart_ID,name,OBJPROP_BGCOLOR,back_clr); //--- установим цвет границы ObjectSetInteger(chart_ID,name,OBJPROP_BORDER_COLOR,border_clr); //--- отобразим на переднем (false) или заднем (true) плане ObjectSetInteger(chart_ID,name,OBJPROP_BACK,back); //--- переведем кнопку в заданное состояние ObjectSetInteger(chart_ID,name,OBJPROP_STATE,state); //--- включим (true) или отключим (false) режим перемещения кнопки мышью ObjectSetInteger(chart_ID,name,OBJPROP_SELECTABLE,selection); ObjectSetInteger(chart_ID,name,OBJPROP_SELECTED,selection); //--- скроем (true) или отобразим (false) имя графического объекта в списке объектов ObjectSetInteger(chart_ID,name,OBJPROP_HIDDEN,hidden); } //--- успешное выполнение return(true); } //*********************************************************************************************************************** //*********************************************************************************************************************** bool ButtonCreate_Down(const long chart_ID=0, // ID графика const string name="Name_Down", // имя кнопки const int sub_window=0, // номер подокна const int x=570, // координата по оси X const int y=657, // координата по оси Y const int width=70, // ширина кнопки const int height=43, // высота кнопки const ENUM_BASE_CORNER corner=CORNER_LEFT_UPPER, // угол графика для привязки const string text="Down", // текст const string font="Cambira", // шрифт const int font_size=11, // размер шрифта const color clr=clrBlack, // цвет текста const color back_clr=clrFireBrick, // цвет фона const color border_clr=clrNONE, // цвет границы const bool state=false, // нажата/отжата const bool back=false, // на заднем плане const bool selection=false, // выделить для перемещений const bool hidden=true) // скрыт в списке объектов { //--- сбросим значение ошибки ResetLastError(); //--- создадим кнопку if(ObjectCreate(chart_ID,name,OBJ_BUTTON,sub_window,0,0)) { //--- установим координаты кнопки ObjectSetInteger(chart_ID,name,OBJPROP_XDISTANCE,x); ObjectSetInteger(chart_ID,name,OBJPROP_YDISTANCE,y); //--- установим размер кнопки ObjectSetInteger(chart_ID,name,OBJPROP_XSIZE,width); ObjectSetInteger(chart_ID,name,OBJPROP_YSIZE,height); //--- установим угол графика, относительно которого будут определяться координаты точки ObjectSetInteger(chart_ID,name,OBJPROP_CORNER,corner); //--- установим текст ObjectSetString(chart_ID,name,OBJPROP_TEXT,text); //--- установим шрифт текста ObjectSetString(chart_ID,name,OBJPROP_FONT,font); //--- установим размер шрифта ObjectSetInteger(chart_ID,name,OBJPROP_FONTSIZE,font_size); //--- установим цвет текста ObjectSetInteger(chart_ID,name,OBJPROP_COLOR,clr); //--- установим цвет фона ObjectSetInteger(chart_ID,name,OBJPROP_BGCOLOR,back_clr); //--- установим цвет границы ObjectSetInteger(chart_ID,name,OBJPROP_BORDER_COLOR,border_clr); //--- отобразим на переднем (false) или заднем (true) плане ObjectSetInteger(chart_ID,name,OBJPROP_BACK,back); //--- переведем кнопку в заданное состояние ObjectSetInteger(chart_ID,name,OBJPROP_STATE,state); //--- включим (true) или отключим (false) режим перемещения кнопки мышью ObjectSetInteger(chart_ID,name,OBJPROP_SELECTABLE,selection); ObjectSetInteger(chart_ID,name,OBJPROP_SELECTED,selection); //--- скроем (true) или отобразим (false) имя графического объекта в списке объектов ObjectSetInteger(chart_ID,name,OBJPROP_HIDDEN,hidden); } //--- успешное выполнение return(true); }
Прошу прощения, думал будет достаточно. Привожу весь код:
Совершенно неправильная логика.
Кнопки создавать надо в OnInit а реагировать на нажатие в OnChartEvent
Вот кусок моего кода. Следить за скобками я не буду, главное откуда взято и что сделано
void OnChartEvent(const int id, const long & lparam, const double & dparam, const string & sparam) { if(id == CHARTEVENT_OBJECT_CLICK) { if(sparam == prefix + "BUY") // Если клик по кнопке BUY { if(ObjectGetInteger(0, sparam, OBJPROP_STATE) == true)// Если нажата кнопка BUY { ObjectSetInteger(0, prefix + "BUY", OBJPROP_BGCOLOR, clrDimGray); // поменять ей цвет ObjectSetInteger(0, prefix + "SELL", OBJPROP_STATE, false); // отжать кнопку SELL ObjectSetInteger(0, prefix + "SELL", OBJPROP_BGCOLOR, clrDimGray); // и поменять ей цвет return; }
Совершенно неправильная логика.
Кнопки создавать надо в OnInit а реагировать на нажатие в OnChartEvent
Вот кусок моего кода. Следить за скобками я не буду, главное откуда взято и что сделано
Я не программист), но за критику, отклик и пример Спасибо БОЛЬШОЕ!
Теперь все работает!
Я не программист), но за критику, отклик и пример Спасибо БОЛЬШОЕ!
Теперь все работает!
Да это и не похоже на критику. А в качестве критики вопрос такой: Зачем для создания кнопок две функции, по одной на каждую кнопку? Посмотрите
какая в них разница. Имя, координата Х и координата Y. Беглым взглядом я больше ничего не увидел.
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Вы принимаете политику сайта и условия использования
Добрый день!
Прошу помочь в решении вопроса. Заранее благодарю за ответы!
Пытаюсь написать 2 графические кнопки, предназначенные для рисования на графике горизонтальных уровней. У каждой кнопки свой набор уровней. При нажатии уровни рисуются, при отжатии удаляются.
Не могу написать код так, чтобы при нажатии одной кнопки отжималась другая (если нажата).
Пробую прописать через OBJPROP_STATE, но почему то, когда нажимаю сперва "вторую" из кнопок, а затем "первую", то "вторая" нормально отжимается, а когда нажимаю сперва "первую", то "вторую" становится невозможно нажать.
Прошу подсказать, как правильно написать код для моей цели.