Скачать MetaTrader 5

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

Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий
Опубликовал программу в Маркете? Опубликуй ее и в блоге - виджет поможет!
ohr
299
ohr 2016.09.22 08:58 
Всем привет

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

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

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

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

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

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

fxsaber
4487
fxsaber 2016.09.22 10:15  
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()
{
}

ohr
299
ohr 2016.09.22 10:58  
fxsaber:
MT4

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

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

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

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

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

 

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

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

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

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

 

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

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

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

12
Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий