- [Архив!] Любой вопрос новичка, чтоб не захламлять форум. Профи, не проходите мимо. Без вас никуда - 2.
- Индикатор Envelopes с уровнями
- Ошибки, баги, вопросы
Скорее всего, подойдет непосредственный вызов индикатора в самом советнике через функцию iCustom. Но, конечно же, для точного ответа нужно видеть код индикатора.
Скорее всего, подойдет непосредственный вызов индикатора в самом советнике через функцию iCustom. Но, конечно же, для точного ответа нужно видеть код индикатора.
Если я не ошибаюсь iCustom возвращает чесленное значение.
Цвет - это для пользователя. Для программы - это численное значение. В вашем случае имеется восемь буферов. Четыре буфера отображаются зеленым цветом, четыре - красным. Достаточно проверить, есть ли в каждом из буферов значение. Если есть "непустое" значение в буферах с индексами 0, 2, 4 и 6, то цвет - зеленый. Если есть "непустое" значение в буферах 1, 3, 5 и 7, то цвет - красный.
Пример вызова индикатора есть непосредственно в его коде:
iCustom(NULL, timeFrames[0], indicatorFileName, coeff, "returnBars", 0, 0)
Проверить, к сожалению, не могу. При запуске индикатор подвешивает терминал. Индикатор работает через рекурсию (неоднократный вызов самого же себя), что, естественно, сильно бьет по ресурсам.
Форум по трейдингу, автоматическим торговым системам и тестированию торговых стратегий
Как в индикаторе узнать текущий цвет индикаторной линии?
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() { }
MT4
Цвет - это для пользователя. Для программы - это численное значение. В вашем случае имеется восемь буферов. Четыре буфера отображаются зеленым цветом, четыре - красным. Достаточно проверить, есть ли в каждом из буферов значение. Если есть "непустое" значение в буферах с индексами 0, 2, 4 и 6, то цвет - зеленый. Если есть "непустое" значение в буферах 1, 3, 5 и 7, то цвет - красный.
Пример вызова индикатора есть непосредственно в его коде:
Проверить, к сожалению, не могу. При запуске индикатор подвешивает терминал. Индикатор работает через рекурсию (неоднократный вызов самого же себя), что, естественно, сильно бьет по ресурсам.
Пробовал что то типа того-
Contrast_TF1 = iCustom(NULL, 0, "##Contrast-mtf", coeff, 0, 0);
Но Именно цвет вытянуть не получилось (в смысле 0 или 1)
Ничего не понял, где что тут вызывает из индикатора и как это передать в советник???
GetBufferProperties(i).Color // i - номер буфера индикатора
Заменить только GetIndicatorName на имя файла индикатора (без расширения).
Пробовал что то типа того-
Но Именно цвет вытянуть не получилось (в смысле 0 или 1)
Цвет Вы никак не получите. Признак цвета получаете на основании того значения, которое вернула функция iCustom. Если значение "непустое" (не EMPTY_VALUE), то цвет есть. Какой именно цвет, определяется индексом буфера, к которому обращаетесь. Так, в Вашем примере индекс буфера 0. Значит, Вы ожидаете, что будет зеленый цвет (если iCustom вернула непустое значение). Если обратиться к буферу с индексом 1, то ожидается красный цвет и т. д.
Само собой, цвета здесь условные, ведь пользователь может поменять цветовые настройки. Вы получаете лишь признак того, что значение отображено индикатором. Если нужен именно цвет, то делайте более изощренно (через шаблоны), как предлагает fxsaber. Но там уже работа с файлами.
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Вы принимаете политику сайта и условия использования