Убрать смену показателей при смене ТФ

 

Добрый вечер, прошу вас добавить в индикатор функцию при которой бы кнопка(картинка) не меняла своих свойств при смене ТФ
Сейчас индикатор работает так:
Когда вы зальёте индикатор кнопка будет зеленого цвета, далее нажимаете 1 раз, она становится красная, еще 1 раз зеленая и показывается меню, нажимаем еще раз(красная)-->меняем ТФ и она почему то зеленая, хотя была на красном
КОГДА кнопка красная и если поменять ТФ она становится зеленой, а нужно чтобы она оставалась красная

//+------------------------------------------------------------------+
//|                                                          123.mq4 |
//|                                            Copyright 2019, Bdrby |
//|                                                https://www.ya.ru |
//+------------------------------------------------------------------+
#property copyright "Copyright 2019, Bdrby"
#property link      "https://www.ya.ru"
#property version   "1.00"
#property strict
#property indicator_chart_window
#resource "Button1.bmp"
#resource "Button2.bmp"
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- indicator buffers mapping
   Button(0,"LOGO",0,30,30,"::Button1.bmp","::Button2.bmp",13,13,0,0,false,CORNER_LEFT_UPPER,ANCHOR_CENTER,clrRed,STYLE_SOLID,1,false,false,true,0);

   for(int i=0;i<10;i++)
     {
      Button(0,"check"+(string)i,0,7000,7000,"::Button1.bmp","::Button2.bmp",13,13,0,0,false,CORNER_LEFT_UPPER,ANCHOR_CENTER,clrRed,STYLE_SOLID,1,false,false,true,0);
     }
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int OnCalculate(const int rates_total,
                const int prev_calculated,
                const datetime &time[],
                const double &open[],
                const double &high[],
                const double &low[],
                const double &close[],
                const long &tick_volume[],
                const long &volume[],
                const int &spread[])
  {
//---
   
//--- return value of prev_calculated for next call
   return(rates_total);
  }
//+------------------------------------------------------------------+
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnChartEvent(const int id,const long &lparam,const double &dparam,const string &sparam)
  {
   if(id==CHARTEVENT_OBJECT_CLICK)
     {
 
      for(int i=0;i<30;i++)
         if(!ObjectGetInteger(ChartID(),"LOGO",OBJPROP_STATE))
           {
            ObjectSetInteger(ChartID(),"check"+(string)i,OBJPROP_XDISTANCE,30);
            ObjectSetInteger(ChartID(),"check"+(string)i,OBJPROP_YDISTANCE,60+14*i);
           }
      else
        {
         ObjectSetInteger(ChartID(),"check"+(string)i,OBJPROP_XDISTANCE,7000);
         ObjectSetInteger(ChartID(),"check"+(string)i,OBJPROP_YDISTANCE,7000);
        }

     }
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
   ObjectDelete(ChartID(),"LOGO");

  }  
//+------------------------------------------------------------------+
bool Button(const long              chart_ID=0,               // ID графика 
                       const string            name="BmpLabel",          // имя метки 
                       const int               sub_window=0,             // номер подокна 
                       const int               x=0,                      // координата по оси X 
                       const int               y=0,                      // координата по оси Y 
                       const string            file_on="",               // картинка в режиме On 
                       const string            file_off="",              // картинка в режиме Off 
                       const int               width=0,                  // X-координата области видимости 
                       const int               height=0,                 // Y-координата области видимости 
                       const int               x_offset=10,              // смещение области видимости по X 
                       const int               y_offset=10,              // смещение области видимости по Y 
                       const bool              state=false,              // нажата/отжата 
                       const ENUM_BASE_CORNER  corner=CORNER_LEFT_UPPER, // угол графика для привязки 
                       const ENUM_ANCHOR_POINT anchor=ANCHOR_LEFT_UPPER, // способ привязки  
                       const color             clr=clrRed,               // цвет рамки при выделении 
                       const ENUM_LINE_STYLE   style=STYLE_SOLID,        // стиль линии при выделении 
                       const int               point_width=1,            // размер точки перемещения 
                       const bool              back=false,               // на заднем плане 
                       const bool              selection=false,          // выделить для перемещений 
                       const bool              hidden=true,              // скрыт в списке объектов 
                       const long              z_order=0)                // приоритет на нажатие мышью 
  {
//--- сбросим значение ошибки 
   ResetLastError();
//--- создадим графическую метку 
 

   if(ObjectCreate(chart_ID,name,OBJ_BITMAP_LABEL,sub_window,0,0))
     {

      //--- установим картинки для режимов On и Off 
      ObjectSetString(chart_ID,name,OBJPROP_BMPFILE,0,file_on);

      ObjectSetString(chart_ID,name,OBJPROP_BMPFILE,1,file_off);

      //--- установим координаты метки 
      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_XOFFSET,x_offset);
      ObjectSetInteger(chart_ID,name,OBJPROP_YOFFSET,y_offset);
      //--- установим, в каком сотоянии находится метка (нажатом или отжатом) 
      ObjectSetInteger(chart_ID,name,OBJPROP_STATE,state);
      //--- установим угол графика, относительно которого будут определяться координаты точки 
      ObjectSetInteger(chart_ID,name,OBJPROP_CORNER,corner);
      //--- установим способ привязки 
      ObjectSetInteger(chart_ID,name,OBJPROP_ANCHOR,anchor);
      //--- установим цвет рамки при включенном режиме выделения объекта 
      ObjectSetInteger(chart_ID,name,OBJPROP_COLOR,clr);
      //--- установим стиль линии рамки при включенном режиме выделения объекта 
      ObjectSetInteger(chart_ID,name,OBJPROP_STYLE,style);
      //--- установим размер точки привязки, с помощью которой можно перемещать объект 
      ObjectSetInteger(chart_ID,name,OBJPROP_WIDTH,point_width);
      //--- отобразим на переднем (false) или заднем (true) плане 
      ObjectSetInteger(chart_ID,name,OBJPROP_BACK,back);
      //--- включим (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);
      //--- установим приоритет на получение события нажатия мыши на графике 
      ObjectSetInteger(chart_ID,name,OBJPROP_ZORDER,z_order);
      //--- успешное выполнение 
      return(true);
     }
   return false;
  }
//+------------------------------------------------------------------+
 
vebster005:

Добрый вечер, прошу вас добавить в индикатор функцию при которой бы кнопка(картинка) не меняла своих свойств при смене ТФ
Сейчас индикатор работает так:
Когда вы зальёте индикатор кнопка будет зеленого цвета, далее нажимаете 1 раз, она становится красная, еще 1 раз зеленая и показывается меню, нажимаем еще раз(красная)-->меняем ТФ и она почему то зеленая, хотя была на красном
КОГДА кнопка красная и если поменять ТФ она становится зеленой, а нужно чтобы она оставалась красная

  1. Мне кажется, или Вы уже открывали подобную ветку? Сколько раз ещё будете засорять форум?
  2. При смене ТФ индикатор, равно как и советник, инициируется по новой. Чтобы Вам помогли (коль уж Вы сами не можете этого сделать) нужно обращаться во фриланс.

 
vebster005:

Добрый вечер, прошу вас добавить в индикатор функцию при которой бы кнопка(картинка) не меняла своих свойств при смене ТФ
Сейчас индикатор работает так:
Когда вы зальёте индикатор кнопка будет зеленого цвета, далее нажимаете 1 раз, она становится красная, еще 1 раз зеленая и показывается меню, нажимаем еще раз(красная)-->меняем ТФ и она почему то зеленая, хотя была на красном
КОГДА кнопка красная и если поменять ТФ она становится зеленой, а нужно чтобы она оставалась красная

в функцию деинициализации передается причина деинициализации. ее можно прочитать из переменной reason
void OnDeinit(const int reason)
так вот, если причина деинициализации - смена тф
if(reason == REASON_CHARTCHANGE)
то удаляеть обьекты с графика не нужно.

 
Nikolay Khrushchev:

в функцию деинициализации передается причина деинициализации. ее можно прочитать из переменной reason
void OnDeinit(const int reason)
так вот, если причина деинициализации - смена тф
if(reason == REASON_CHARTCHANGE)
то удаляеть обьекты с графика не нужно.

не получается я пробывал все виды удаления! 

 
Nikolay Khrushchev:

в функцию деинициализации передается причина деинициализации. ее можно прочитать из переменной reason
void OnDeinit(const int reason)
так вот, если причина деинициализации - смена тф
if(reason == REASON_CHARTCHANGE)
то удаляеть обьекты с графика не нужно.

кнопка удаляется потому что при смене ТФ у неё положение выкл, а на выкл положении 2-я кнопка не должна показываться

 
vebster005:

кнопка удаляется потому что при смене ТФ у неё положение выкл, а на выкл положении 2-я кнопка не должна показываться

void OnDeinit(const int reason)
  {
   if(reason != REASON_CHARTCHANGE) ObjectDelete(ChartID(),"LOGO");
  }  

вот такой должен быть ваш OnDeinit  вместо того что у вас есть.

 
Nikolay Khrushchev:

вот такой должен быть ваш OnDeinit  вместо того что у вас есть.

у меня такой варинат, попробую сейчас ваш

Файлы:
 
Nikolay Khrushchev:

вот такой должен быть ваш OnDeinit  вместо того что у вас есть.

Спасибо но нет, ваш вариант тоже не подходит

 
vebster005:

Спасибо но нет, ваш вариант тоже не подходит

отправьте ваши ресурсы

#resource "Button1.bmp"

#resource "Button2.bmp"

а то у меня ваш код вообще ничего не отображает, не вникал почему.
 
vebster005:

Спасибо но нет, ваш вариант тоже не подходит

Замените функцию

P.S. Исправил.

Более логично сделать так: замените OnInit()

int OnInit()
  {
//--- indicator buffers mapping
  if(ObjectFind(0,"LOGO")<0)
   Button(0,"LOGO",0,30,30,"::Button1.bmp","::Button2.bmp",13,13,0,0,false,CORNER_LEFT_UPPER,ANCHOR_CENTER,clrRed,STYLE_SOLID,1,false,false,true,0);

   for(int i=0;i<10;i++)
     {
     if(ObjectFind(0,"check"+(string)i)<0)
      Button(0,"check"+(string)i,0,7000,7000,"::Button1.bmp","::Button2.bmp",13,13,0,0,false,CORNER_LEFT_UPPER,ANCHOR_CENTER,clrRed,STYLE_SOLID,1,false,false,true,0);
     }
//---
   return(INIT_SUCCEEDED);
  }
 
Vitaly Muzichenko:

Замените функцию

P.S. Исправил.

Более логично сделать так: замените OnInit()

обратие внимание на его функцию Button. Все завязано на ObjectCreate,
если ObjectCreate выполнился, то обьекту задаются параметры, если нет - не задаются.
Если обьект уже есть на графике, то ObjectCreate не выполнится, вернет false.
Т.е. добавлять эти проверки не имеет смысла.

Причина обращения: