Скачать MetaTrader 5

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

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

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

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

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

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

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

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

fxsaber
10779
fxsaber  
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
307
ohr  
fxsaber:
MT4

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

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

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

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

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

 

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

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

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

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

 

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

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

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

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