Смена OBJ_BITMAP_LABEL при смене фона терминала - страница 5

 
Ihor Herasko:

Метка отображается, но ее не видно. Посмотрите в списке объектов (Ctrl+B) - она есть.

В коде указано, что если цвет фона черный, то сделать цвет метки черным, а если белый фон, то сделать цвет метки белым. А нужно то наоборот.

Спасибо что ответили, Пожалуйста посмотрите где ошибка, в int init может что-то не так? 

#property copyright "2016 , Ihor Herasko"
#property link      "http://www.ya.ru"
#property version   "1.0"
#property strict
#property indicator_chart_window
//+------------------------------------------------------------------+
//|  indicator Properties                                            |
//+------------------------------------------------------------------+

//--- Смена цвета текста в зависимости от фона
color g_clrOldColor;
color clrNewColor;
//--- Смена цвета текста в зависимости от фона

//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int init()
  {

//--- Смена цвета текста в зависимости от фона
      clrNewColor = color(ChartGetInteger(0, CHART_COLOR_BACKGROUND));  // тут мы задаем переменную на фон и считываем её
      if (clrNewColor != g_clrOldColor) // тут сравниваем
      {
         color strFileCL = (clrNewColor ==  C'0,0,0')? Black : White;  // если фон черный тогда 1 цвет, иначе 2-й цвет

   LabelCreate(0,"label0",0,50,50,CORNER_LEFT_UPPER,"Статистика","Tahoma",8,clrNewColor,0.0,ANCHOR_LEFT_UPPER,false,false,true,0);

         ChartRedraw();
         g_clrOldColor = clrNewColor;
      }
//--- Смена цвета текста в зависимости от фона

   return(0);
  }
//+------------------------------------------------------------------+
//|  indicator Delete function                                       |
//+------------------------------------------------------------------+
int deinit()
  {
   return(0);
  }
//+------------------------------------------------------------------+
//| indicator Create function                                        |
//+------------------------------------------------------------------+
int start()
  {
   return(0);
  }
//+------------------------------------------------------------------+

//+------------------------------------------------------------------+
                     //пользоватеьский индюк//
//+------------------------------------------------------------------+
bool LabelCreate(const long              chart_ID=0,               // ID графика
                 const string            name="Label",             // имя метки
                 const int               sub_window=0,             // номер подокна
                 const int               x=0,                      // координата по оси X
                 const int               y=0,                      // координата по оси Y
                 const ENUM_BASE_CORNER  corner=CORNER_LEFT_UPPER, // угол графика для привязки
                 const string            text="Label",             // текст
                 const string            font="Arial",             // шрифт
                 const int               font_size=10,             // размер шрифта
                 const color             clr=clrRed,               // цвет
                 const double            angle=0.0,                // наклон текста
                 const ENUM_ANCHOR_POINT anchor=ANCHOR_LEFT_UPPER, // способ привязки
                 const bool              back=false,               // на заднем плане
                 const bool              selection=false,          // выделить для перемещений
                 const bool              hidden=true,              // скрыт в списке объектов
                 const long              z_order=0)                // приоритет на нажатие мышью
  {
//--- сбросим значение ошибки
   ResetLastError();
//--- создадим текстовую метку
   if(!ObjectCreate(chart_ID,name,OBJ_LABEL,sub_window,0,0))
     {
      Print(__FUNCTION__,
            ": не удалось создать текстовую метку! Код ошибки = ",GetLastError());
      return(false);
     }
//--- установим координаты метки
   ObjectSetInteger(chart_ID,name,OBJPROP_XDISTANCE,x);
   ObjectSetInteger(chart_ID,name,OBJPROP_YDISTANCE,y);
//--- установим угол графика, относительно которого будут определяться координаты точки
   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);
//--- установим угол наклона текста
   ObjectSetDouble(chart_ID,name,OBJPROP_ANGLE,angle);
//--- установим способ привязки
   ObjectSetInteger(chart_ID,name,OBJPROP_ANCHOR,anchor);
//--- установим цвет
   ObjectSetInteger(chart_ID, name, OBJPROP_COLOR, (clrNewColor ==  C'0,0,0')? clrWhite : clrBlack); 
//--- отобразим на переднем (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);
  }
 
vebster005:

Спасибо что ответили, Пожалуйста посмотрите где ошибка, в int init может что-то не так? 

  1. Код из init нужно перенести в OnChartEvent(), причем доделать реакцию на событие изменения графика. Нужно проверить, какое событие пришло в OnChartEvent(). Пример кода я уже давал.
  2. Не использовать устаревшие функции обработки событий init, deinit, start. Вместо них используются OnInit(), OnDeinit. Для советника - OnTick(), для индикатора - OnCalculate().
  3. Проблема в установке цвета. Вы сами пишите в комментарии, что если черный цвет графика, то установить цвет 1. И тут же устанавливаете черный цвет. Конечно, черный на черном видно не будет.
  4. Все цветовые константы имеют названия, начинающиеся с "clr". Черный - clrBlack, красный - clrRed и т. д.
 
Ihor Herasko:

  1. Код из init нужно перенести в OnChartEvent(), причем доделать реакцию на событие изменения графика. Нужно проверить, какое событие пришло в OnChartEvent(). Пример кода я уже давал.
  2. Не использовать устаревшие функции обработки событий init, deinit, start. Вместо них используются OnInit(), OnDeinit. Для советника - OnTick(), для индикатора - OnCalculate().
  3. Проблема в установке цвета. Вы сами пишите в комментарии, что если черный цвет графика, то установить цвет 1. И тут же устанавливаете черный цвет. Конечно, черный на черном видно не будет.
  4. Все цветовые константы имеют названия, начинающиеся с "clr". Черный - clrBlack, красный - clrRed и т. д.

Посмотрите пожалуйста уже ближе или же я ушёл вовсе в другом направлении

#property strict
#property indicator_chart_window
color g_clrOldColor;
string g_sCurrentFile;
color clrNewColor;

int OnInit(void)
{
   g_clrOldColor = color(ChartGetInteger(0, CHART_COLOR_BACKGROUND));
   color strFile = (g_clrOldColor == C'0,0,0')? "clsWhite" : "clsBlack";
   LabelCreate(0,"label0",0,50,50,CORNER_LEFT_UPPER,"Статистика","Tahoma",8,strFile,0.0,ANCHOR_LEFT_UPPER,false,false,true,0);
   return(INIT_SUCCEEDED);
}

void OnDeinit(const int reason)
{

}


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(rates_total);
}

void OnChartEvent(const int id, const long& lparam, const double& dparam, const string& sparam)
{
   if (id == CHARTEVENT_CHART_CHANGE)
   {  
      clrNewColor = color(ChartGetInteger(0, CHART_COLOR_BACKGROUND));
      if (clrNewColor != g_clrOldColor)
      {
         string strFile = (clrNewColor ==  C'0,0,0')? "clsWhite" : "clsBlack";
   LabelCreate(0,"label0",0,50,50,CORNER_LEFT_UPPER,"Статистика","Tahoma",8,clrNewColor,0.0,ANCHOR_LEFT_UPPER,false,false,true,0);
   //ObjectSetInteger(0,"label0", OBJPROP_COLOR, (clrNewColor ==  C'0,0,0')? clrWhite : clrBlack);
         ChartRedraw();
         g_sCurrentFile = strFile;
         g_clrOldColor = clrNewColor;
      }

      
      
   }
}


bool LabelCreate(const long              chart_ID=0,               // ID графика
                 const string            name="Label",             // имя метки
                 const int               sub_window=0,             // номер подокна
                 const int               x=0,                      // координата по оси X
                 const int               y=0,                      // координата по оси Y
                 const ENUM_BASE_CORNER  corner=CORNER_LEFT_UPPER, // угол графика для привязки
                 const string            text="Label",             // текст
                 const string            font="Arial",             // шрифт
                 const int               font_size=10,             // размер шрифта
                 const color             clr=clrRed,               // цвет
                 const double            angle=0.0,                // наклон текста
                 const ENUM_ANCHOR_POINT anchor=ANCHOR_LEFT_UPPER, // способ привязки
                 const bool              back=false,               // на заднем плане
                 const bool              selection=false,          // выделить для перемещений
                 const bool              hidden=true,              // скрыт в списке объектов
                 const long              z_order=0)                // приоритет на нажатие мышью
  {
//--- сбросим значение ошибки
   ResetLastError();
//--- создадим текстовую метку
   if(!ObjectCreate(chart_ID,name,OBJ_LABEL,sub_window,0,0))
     {
      Print(__FUNCTION__,
            ": не удалось создать текстовую метку! Код ошибки = ",GetLastError());
      return(false);
     }
//--- установим координаты метки
   ObjectSetInteger(chart_ID,name,OBJPROP_XDISTANCE,x);
   ObjectSetInteger(chart_ID,name,OBJPROP_YDISTANCE,y);
//--- установим угол графика, относительно которого будут определяться координаты точки
   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);
//--- установим угол наклона текста
   ObjectSetDouble(chart_ID,name,OBJPROP_ANGLE,angle);
//--- установим способ привязки
   ObjectSetInteger(chart_ID,name,OBJPROP_ANCHOR,anchor);
//--- установим цвет
   //ObjectSetInteger(chart_ID,name,OBJPROP_COLOR,clr);
   ObjectSetInteger(chart_ID,name, OBJPROP_COLOR, (clrNewColor ==  C'0,0,0')? clrWhite : clrBlack);  
//--- отобразим на переднем (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);
  }
 
vebster005:

Посмотрите пожалуйста уже ближе или же я ушёл вовсе в другом направлении

Две ошибки:

color strFile = (g_clrOldColor == C'0,0,0')? "clsWhite" : "clsBlack";

и:

string strFile = (clrNewColor ==  C'0,0,0')? "clsWhite" : "clsBlack";

В первом случае переменной типа цвет присваивается строка. Там, как минимум, предупреждение компилятора должно быть. Во втором случае создается переменная, которая далее нигде не используется.

Происходит то, о чем я и говорил: Вы пытаетесь действовать наобум, в надежде угадать правильный вариант. Не угадаете. Только учиться, начинайте с азов, т. к. ошибки допускаете элементарные. Это, конечно, в том случае, если создание программ вызывает интерес. Если интереса нет, то даже не пытайтесь.

 
Ihor Herasko:

Две ошибки:

и:

В первом случае переменной типа цвет присваивается строка. Там, как минимум, предупреждение компилятора должно быть. Во втором случае создается переменная, которая далее нигде не используется.

Происходит то, о чем я и говорил: Вы пытаетесь действовать наобум, в надежде угадать правильный вариант. Не угадаете. Только учиться, начинайте с азов, т. к. ошибки допускаете элементарные. Это, конечно, в том случае, если создание программ вызывает интерес. Если интереса нет, то даже не пытайтесь.

Случаено добавил color и да, когда компилировал были предупреждения, какие еще ошибки?
Я не пытаюсь наугад, я так думаю что я  понимаю как оно работает, цепочку, но видимо не правильно понимаю раз вариант который выше не работает

 
vebster005:

Случаено добавил color и да, когда компилировал были предупреждения, какие еще ошибки?
Я не пытаюсь наугад, я так думаю что я  понимаю как оно работает, цепочку, но видимо не правильно понимаю раз вариант который выше не работает

В программировании нужно начинать с мелочей. "Общее стратегическое видение" здесь никак не поможет. Почитайте о типах данных и, если поймете, то разберитесь с функциями ObjectSetInteger(), ObjectSetDouble(), ObjectSetString(), ObjectGetInteger(), ObjectGetDouble() и ObjectGetString(). Как только разберетесь, ничья помощь уже не понадобится. По заданному Вами здесь вопросу уже все есть. А вот с мелочами (синтаксисом кода) у Вас беда.

 
Ihor Herasko:

В программировании нужно начинать с мелочей. "Общее стратегическое видение" здесь никак не поможет. Почитайте о типах данных и, если поймете, то разберитесь с функциями ObjectSetInteger(), ObjectSetDouble(), ObjectSetString(), ObjectGetInteger(), ObjectGetDouble() и ObjectGetString(). Как только разберетесь, ничья помощь уже не понадобится. По заданному Вами здесь вопросу уже все есть. А вот с мелочами (синтаксисом кода) у Вас беда.

аааа((( не получается у меня, подскажите пожалуйста хотя бы в какой части кода ошибка а там я уже буду думать

пожалуйста
 
vebster005:

аааа((( не получается у меня, подскажите пожалуйста хотя бы в какой части кода ошибка а там я уже буду думать

пожалуйста

Так я ведь привел две строки. Всего две строки. И в обоих ошибки, одни и те же.

 
Ihor Herasko:

Так я ведь привел две строки. Всего две строки. И в обоих ошибки, одни и те же.

Посмотрите пожалуйста еще раз код, точно только в этом ошибка? я ставлю как думаю не работает, ставлю по всякому(как вообще возможно) не работает, точно ли дело в этих 2-х строчках. Прошу вас посмотрите еще раз код

 
vebster005:

Посмотрите пожалуйста еще раз код, точно только в этом ошибка? я ставлю как думаю не работает, ставлю по всякому(как вообще возможно) не работает, точно ли дело в этих 2-х строчках. Прошу вас посмотрите еще раз код

Нет уж, впрягайтесь сами )) Там все просто как 2х2. Включайте уже мозги, в конце концов. Если нет, то Вам во Фриланс. Там как раз за Вас все и сделают.

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