Как получить цвет индикатора?

 
Всем привет

Подскажите - имеется двухцветный пользовательский индикатор как из него получить (передать эксперту) цвет индикатора на текущий тик?
 
ohr:
Всем привет

Подскажите - имеется двухцветный пользовательский индикатор как из него получить (передать эксперту) цвет индикатора на текущий тик?
Всё зависит на каком языке надо получить и как написан индикатор.
 
Скорее всего, подойдет непосредственный вызов индикатора в самом советнике через функцию iCustom. Но, конечно же, для точного ответа нужно видеть код индикатора.
 
Ihor Herasko:
Скорее всего, подойдет непосредственный вызов индикатора в самом советнике через функцию iCustom. Но, конечно же, для точного ответа нужно видеть код индикатора.
Файлы:
 
Ihor Herasko:
Скорее всего, подойдет непосредственный вызов индикатора в самом советнике через функцию iCustom. Но, конечно же, для точного ответа нужно видеть код индикатора.
Если я не ошибаюсь iCustom возвращает чесленное значение.
 
ohr:
Если я не ошибаюсь iCustom возвращает чесленное значение.

Цвет - это для пользователя. Для программы - это численное значение. В вашем случае имеется восемь буферов. Четыре буфера отображаются зеленым цветом, четыре - красным. Достаточно проверить, есть ли в каждом из буферов значение. Если есть "непустое" значение в буферах с индексами 0, 2, 4 и 6, то цвет - зеленый. Если есть "непустое" значение в буферах 1, 3, 5 и 7, то цвет - красный.

Пример вызова индикатора есть непосредственно в его коде:

iCustom(NULL, timeFrames[0], indicatorFileName, coeff, "returnBars", 0, 0)

 Проверить, к сожалению, не могу. При запуске индикатор подвешивает терминал. Индикатор работает через рекурсию (неоднократный вызов самого же себя), что, естественно, сильно бьет по ресурсам.

 
MT4

Форум по трейдингу, автоматическим торговым системам и тестированию торговых стратегий

Как в индикаторе узнать текущий цвет индикаторной линии?

fxsaber, 2016.08.31 23:35

#property strict

#property indicator_chart_window
#property indicator_buffers 2

#define PATH "MQL4\\indicators\\"

string GetIndicatorName( void )
{
  const string StrName = ::MQLInfoString(MQL_PROGRAM_PATH);
  const int Pos = ::StringFind(StrName, PATH) + ::StringLen(PATH);
  
  return(::StringSubstr(StrName, Pos, ::StringLen(StrName) - Pos - 4));
}

void SeekToString( const int handle, const string Str )
{
  while (!::FileIsEnding(handle))
    if (::FileReadString(handle) == Str)
      break;
  
  return;
}  

struct BUFFER_STRUCT
{
  int Shift;
  int Type;
  color Color;
  ENUM_LINE_STYLE Style;
  int Width;
};

#define STRUCT_DEFINE(A,B)  struct A##2 { B Data[sizeof(A) / sizeof(B)]; }

const BUFFER_STRUCT GetBufferProperties( const uint Num = 0, const bool FlagSave = true )
{
  STRUCT_DEFINE(BUFFER_STRUCT, int) Res = {0};
  
  const string FileName = ::WindowExpertName() + ".tpl";

  if (FlagSave ? ::ChartSaveTemplate(0, "..\\MQL4\\Files\\" + FileName) : true)
  {
    const int handle = ::FileOpen(FileName, ::FILE_READ|::FILE_CSV);

    if (handle > 0)
    {
      ::SeekToString(handle, "name=" + ::GetIndicatorName());
      
      if (Num == 0)
        ::SeekToString(handle, "</expert>");
      else
      {
        const string TmpStr = "weight_" + (string)(Num - 1);
        
        while (!::FileIsEnding(handle))
          if (::StringFind(::FileReadString(handle), TmpStr) == 0)
            break;
      }
            
      if (!::FileIsEnding(handle))
      {
        static const string Property[] = {"shift", "draw", "color", "style", "weight"};
        const string StrNum = "_" + (string)Num + "=";
              
        for (int i = 0; i < ::ArraySize(Property); i++)
          Res.Data[i] = (int)::StringToInteger(::StringSubstr(::FileReadString(handle), ::StringLen(Property[i] + StrNum)));
      }
      
      ::FileClose(handle);
    }
  }
  
  return((BUFFER_STRUCT)Res);
}  

void OnInit()
{  
  string Str = "Colors:";
  
  for (int i = 0; i < indicator_buffers; i++)
    Str += " " + (string)i + "-" + (string)::GetBufferProperties(i).Color;
    
  Alert(Str);
}

void start()
{
}

 
fxsaber:
MT4

Ничего не понял, где что тут вызывает из индикатора и как это передать в советник???
 
Ihor Herasko:

Цвет - это для пользователя. Для программы - это численное значение. В вашем случае имеется восемь буферов. Четыре буфера отображаются зеленым цветом, четыре - красным. Достаточно проверить, есть ли в каждом из буферов значение. Если есть "непустое" значение в буферах с индексами 0, 2, 4 и 6, то цвет - зеленый. Если есть "непустое" значение в буферах 1, 3, 5 и 7, то цвет - красный.

Пример вызова индикатора есть непосредственно в его коде:

 Проверить, к сожалению, не могу. При запуске индикатор подвешивает терминал. Индикатор работает через рекурсию (неоднократный вызов самого же себя), что, естественно, сильно бьет по ресурсам.

Пробовал что то типа того- 

 

Contrast_TF1 = iCustom(NULL, 0, "##Contrast-mtf", coeff, 0, 0);

 Но Именно цвет вытянуть не получилось (в смысле 0 или 1)

 
ohr:
Ничего не понял, где что тут вызывает из индикатора и как это передать в советник???
Вызвать
GetBufferProperties(i).Color // i - номер буфера индикатора
Заменить только GetIndicatorName на имя файла индикатора (без расширения).
 
ohr:

Пробовал что то типа того- 

 

 Но Именно цвет вытянуть не получилось (в смысле 0 или 1)

Цвет Вы никак не получите. Признак цвета получаете на основании того значения, которое вернула функция iCustom. Если значение "непустое" (не EMPTY_VALUE), то цвет есть. Какой именно цвет, определяется индексом буфера, к которому обращаетесь. Так, в Вашем примере индекс буфера 0. Значит, Вы ожидаете, что будет зеленый цвет (если iCustom вернула непустое значение). Если обратиться к буферу с индексом 1, то ожидается красный цвет и т. д.

Само собой, цвета здесь условные, ведь пользователь может поменять цветовые настройки. Вы получаете лишь признак того, что значение отображено индикатором. Если нужен именно цвет, то делайте более изощренно (через шаблоны), как предлагает fxsaber. Но там уже работа с файлами.

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