Помощь по объекту "Кнопка"

 

Разбираюсь с этим объектом и столкнулся с проблемой - припереключении таймфрейма кнопка переходит в начальное состояние, кто как решил эту проблему?

Мне пока видется только запись в файл состояния кнопки и считывание при переключении. Еще один вариант с глобальными переменными, но что то не нашел как их создовать((

 

Если кнопка в советнике, то можно сохранять ее статус в переменных советника, созданных на глобальном уровне (не путать с глобальными переменными терминала). Но для советника можно еще проще - идентифицировать смену ТФ в OnDeinit() и не удалять кнопку.

В индикаторе такое не пройдет, т. к. он отключается при смене ТФ, подключаясь затем заново. Поэтому для него подойдет только запись состояния в сторонний ресурс (файл, глобальные переменные терминала, web).

Для работы с глобальными переменными терминала используются функции с названием, начинающихся с GlobalVariable. В документации по языку раздел так и называется "Глобальные переменные терминала".

 
Pavel Grigoriev:

Разбираюсь с этим объектом и столкнулся с проблемой - припереключении таймфрейма кнопка переходит в начальное состояние, кто как решил эту проблему?

Мне пока видется только запись в файл состояния кнопки и считывание при переключении. Еще один вариант с глобальными переменными, но что то не нашел как их создовать((

Как написали выше, достаточно не удалять кнопку. Причём это справедливо и для индикаторов тоже. 

//+------------------------------------------------------------------+
int OnInit()
  {
   ObjectCreate(0, "Baton", OBJ_BUTTON, 0, 0, 0);
   ObjectSetInteger(0, "Baton", OBJPROP_XDISTANCE, 20);
   ObjectSetInteger(0, "Baton", OBJPROP_YDISTANCE, 70);
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
int OnCalculate(const int rates_total,
                const int prev_calculated,
                const int begin,
                const double &price[])
  {
   return(rates_total);
  }
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
   if(reason != REASON_CHARTCHANGE && reason != REASON_TEMPLATE)
      ObjectsDeleteAll(0, "Baton", 0, OBJ_BUTTON);
  }
//+------------------------------------------------------------------+
При смене ТФ,кнопка не меняет свою отжатость/нажатость )))
 
Pavel Grigoriev:

Разбираюсь с этим объектом и столкнулся с проблемой - припереключении таймфрейма кнопка переходит в начальное состояние, кто как решил эту проблему?

Мне пока видется только запись в файл состояния кнопки и считывание при переключении. Еще один вариант с глобальными переменными, но что то не нашел как их создовать((

Зачем что-то придумывать, давно все придумано, сохраняйте состояние кнопки и загружайте при ее пересоздании. 

Самый удобный способ через глобальные переменные. Я делаю вот так, по такому шаблону.

void State(string sName,double lState)
  {
   string stest="";
   if(IsTesting())
      stest="tester";

   string sexpert=WindowExpertName();
   ::GlobalVariableSet(StringFormat("%s%s_%s_%s",stest,sexpert,_Symbol,sName),lState);
  }

double State(string sName)
  {
   string stest="";
   if(IsTesting())
      stest="tester";
   string sexpert=WindowExpertName();
   if(::GlobalVariableCheck(StringFormat("%s%s_%s_%s",stest,sexpert,_Symbol,sName)))
      return (double)::GlobalVariableGet(StringFormat("%s%s_%s_%s",stest,sexpert,_Symbol,sName));

   return 0.0;
  }

Первая функция сохраняет состояние (можете сделать и bool), вторая загружает состояние из переменной. 

При этом под тестер создается отдельная переменная, которую нужно удалять, чтобы не мешать работе робота если он на графике.