Используйте всегда MQL5 Wizard для создания болванки файла - и не будет никаких проблем:
//+------------------------------------------------------------------+ //| 1.mq5 | //| Copyright © 2020, Vladimir Karputov | //| | //+------------------------------------------------------------------+ #property copyright "Copyright © 2020, Vladimir Karputov" #property link "" #property version "1.00" #property indicator_chart_window #property indicator_buffers 8 #property indicator_plots 4 //--- plot Label1 #property indicator_label1 "Label1" #property indicator_type1 DRAW_COLOR_ARROW #property indicator_color1 clrRed,clrTurquoise,clrGoldenrod #property indicator_style1 STYLE_SOLID #property indicator_width1 1 //--- plot Label2 #property indicator_label2 "Label2" #property indicator_type2 DRAW_COLOR_ARROW #property indicator_color2 clrRed,clrTurquoise,clrIndigo #property indicator_style2 STYLE_SOLID #property indicator_width2 1 //--- plot Label3 #property indicator_label3 "Label3" #property indicator_type3 DRAW_COLOR_ARROW #property indicator_color3 clrRed,clrTurquoise,clrGoldenrod #property indicator_style3 STYLE_SOLID #property indicator_width3 1 //--- plot Label4 #property indicator_label4 "Label4" #property indicator_type4 DRAW_COLOR_ARROW #property indicator_color4 clrRed,clrTurquoise,clrIndigo #property indicator_style4 STYLE_SOLID #property indicator_width4 1 //--- input parameters input int Input1=9; //--- indicator buffers double Label1Buffer[]; double Label1Colors[]; double Label2Buffer[]; double Label2Colors[]; double Label3Buffer[]; double Label3Colors[]; double Label4Buffer[]; double Label4Colors[]; //+------------------------------------------------------------------+ //| Custom indicator initialization function | //+------------------------------------------------------------------+ int OnInit() { //--- indicator buffers mapping SetIndexBuffer(0,Label1Buffer,INDICATOR_DATA); SetIndexBuffer(1,Label1Colors,INDICATOR_COLOR_INDEX); SetIndexBuffer(2,Label2Buffer,INDICATOR_DATA); SetIndexBuffer(3,Label2Colors,INDICATOR_COLOR_INDEX); SetIndexBuffer(4,Label3Buffer,INDICATOR_DATA); SetIndexBuffer(5,Label3Colors,INDICATOR_COLOR_INDEX); SetIndexBuffer(6,Label4Buffer,INDICATOR_DATA); SetIndexBuffer(7,Label4Colors,INDICATOR_COLOR_INDEX); //--- setting a code from the Wingdings charset as the property of PLOT_ARROW PlotIndexSetInteger(0,PLOT_ARROW,159); PlotIndexSetInteger(1,PLOT_ARROW,159); PlotIndexSetInteger(2,PLOT_ARROW,159); PlotIndexSetInteger(3,PLOT_ARROW,159); //--- return(INIT_SUCCEEDED); } //+------------------------------------------------------------------+ //| Custom indicator iteration function | //+------------------------------------------------------------------+ 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 value of prev_calculated for next call return(rates_total); } //+------------------------------------------------------------------+
Добрый день. У меня, сугугбо из некоторого интереса, появилось желание научиться писать индикаторы у которых много буфером со значениями самого индикатора так и с большим количеством графических построений. Я взял шаблон с элементарным индикатором, который находит паттерн "внутренний бар" и выводит неоторую информацию о нём. Выложить весь код я могу, но я пишу с использованием самописных библиотеки и классов. Не каждый захочет такие вещи проверять..)
В общем то, есть вариант проще. Я взял элементарный пример. Буфер паттерна с медвежьим телом размещается в одном бфере, а с бычьим - в другом. Над и под каждым из этим паттернов будет отображаться цветная стрелочка. Над и под бычьим -я выбрал синюю, а над и под медвежьим - красную.
Вот свойства индикатора:
Функция OnInit():
Вот функция, в которой присваиваются значения индикаторам:
В функции setBuffers() видно, что при нахождении бара с медвежьим телом присваивается значение Хая бара на этом индексе и индексов стрелочек располагающихся над и под этим баром. По логике всё верно. Но не работает. В чём проблема?
Кстати, свойства индикаторов задаются с 1-го индекса, а не в 0-го. Но, в данном случае, если 4 буфера графических серий, и свойства задать как я указал выше, то будет появляться ошибка:
Хотя, у меня объявлена 4 графических серии. Как это так?
Для общего ознакомления я прикрепляю исходны код. Для компилирования я могу приложить то, что нужно.
До конца даже читать не могу.
Ошибка №1 Если вы решили делать два варианта «Над и под бычьим -я выбрал синюю, а над и под медвежьим - красную.» и при этом DRAW_COLOR_ARROW то буферов должно быть 4, а отображений достаточно 2, для стрелки сверху и стрелки снизу. А цвет задаётся в зависимости от типа бара (бычий\медвежий).
Ошибка №2 Буфер индикатора и буфер цвета связаны. Если индекс буфера построения 0, то индекс буфера цвета обязательно должен быть 1.
Исправьте код согласно этим замечаниям и можно будет смотреть дальше.
Используйте всегда MQL5 Wizard для создания болванки файла - и не будет никаких проблем:
Этот вариант я понимаю. Но не особо понятно, для чего мне дополнительные 2 буфера? Ведь для хранения данных (не цветов) наличия каждого вариант паттерна нужно лишь 2 буфера?
1-ый с медвежьим телом.
2-ой с бычьим телом.
А здесь, что бы добавить 2 дполнительные стрелочки приходится добавлять 2 дополнительных буфера. В чём польза?
До конца даже читать не могу.
Ошибка №1 Если вы решили делать два варианта «Над и под бычьим -я выбрал синюю, а над и под медвежьим - красную.» и при этом DRAW_COLOR_ARROW то буферов должно быть 4, а отображений достаточно 2, для стрелки сверху и стрелки снизу. А цвет задаётся в зависимости от типа бара (бычий\медвежий).
Ошибка №2 Буфер индикатора и буфер цвета связаны. Если индекс буфера построения 0, то индекс буфера цвета обязательно должен быть 1.
Исправьте код согласно этим замечаниям и можно будет смотреть дальше.
В принципе да. Уменьшил количество буферов. Всё теперь в порядке.
Пользовался бы MQL5 Wizard'ом наклепал бы лишних буфеорв. Хотя, с другой стороны, на начальном этапе это как-бы и удобно. Но хотелось понять а не просто слепить из шаблона как-нибудь..
Этот вариант я понимаю. Но не особо понятно, для чего мне дополнительные 2 буфера? Ведь для хранения данных (не цветов) наличия каждого вариант паттерна нужно лишь 2 буфера?
1-ый с медвежьим телом.
2-ой с бычьим телом.
А здесь, что бы добавить 2 дполнительные стрелочки приходится добавлять 2 дополнительных буфера. В чём польза?
Вы сами захотели использовать графический стиль DRAW_COLOR_ARROW - а этот стиль подразумевает использование ДВУХ БУФЕРОВ:
Количество требуемых буферов для построения DRAW_COLOR_ARROW — 2:
- один буфер для хранения значения цены, по которой рисуется символ (плюс смещение в пикселях, задаваемое свойством PLOT_ARROW_SHIFT);
- один буфер для хранения индекса цвета, которым рисуется стрелка (имеет смысл задавать только для непустых значений).
Именно потому, что Вы этого не понимаете, я рекомендовал Вам использовать MQL5 Wizard. И Wizard ничего не "клепает" - В данном случае Вы не до конца понимаете что Вы хотите и поэтому делаете ошибочные суждения и ошибки в конструировании.
Вы сами захотели использовать графический стиль DRAW_COLOR_ARROW - а этот стиль подразумевает использование ДВУХ БУФЕРОВ:
Всё верно. Я понимаю, что стиль рисования подразумевает использование 2 цветов.
Именно потому, что Вы этого не понимаете, я рекомендовал Вам использовать MQL5 Wizard. И Wizard ничего не "клепает" - В данном случае Вы не до конца понимаете что Вы хотите и поэтому делаете ошибочные суждения и ошибки в конструировании.
Видимо да. Значит нужно пересмотреть своё видение по этому поводу.
Вот смотрите. Например, в свойствах индикатора пишем так:
#property indicator_buffers 6 #property indicator_plots 2 #property indicator_type1 DRAW_COLOR_ARROW #property indicator_color1 clrRed, clrTurquoise, clrGoldenrod #property indicator_type2 DRAW_COLOR_ARROW #property indicator_color2 clrRed, clrTurquoise, clrIndigo
2 буфера индикатора используется для хранения значений самих паттернов и 2 индикаторных будфера используется для хранения обоихстрелочек (над и под каждым паттерном) и 2 серии отрисовки (на каждую стрелочки). По сути, получилось 2 буфера для хранения паттернов и 4 буфера на 2 стрелочеки т.е. на каждую стрелочку по 2 буфера. В теории, всё верно.
Вот функция инициализации:
int OnInit() { ptrSym = new SymbolInstance(_Symbol); IndicatorSetString(INDICATOR_SHORTNAME, "Inside bar"); IndicatorSetInteger(INDICATOR_DIGITS, _Digits); // === Связывание буферов с индексами, определение стилей ========================== SetIndexBuffer(0, bearishInsideBar_buffer, INDICATOR_DATA); // 1-ый буфер - "Внутренний бар" с медвежьим телом бара SetIndexBuffer(1, bullishInsideBar_buffer, INDICATOR_DATA); // 2-ой буфер - "Внутренний бар" с бычьим телом бара SetIndexBuffer(2, upperArrow_buffer, INDICATOR_DATA); // 3-ий буфер - Буфер верхней стрелочки SetIndexBuffer(3, upperArrowColor_buffer, INDICATOR_COLOR_INDEX); // 4-ый буфер - Цвет верхней стрелочки SetIndexBuffer(4, lowerArrow_buffer, INDICATOR_DATA); // 5-ой буфер - Буфер нижней стрелочки SetIndexBuffer(5, lowerArrowColor_buffer, INDICATOR_COLOR_INDEX); // 6-ой буфер - Цвет нижней стрелочки PlotIndexSetInteger(0, PLOT_DRAW_TYPE, DRAW_COLOR_ARROW); PlotIndexSetInteger(0, PLOT_ARROW, 218); PlotIndexSetInteger(0, PLOT_ARROW_SHIFT, -arrowShift); PlotIndexSetDouble(0, PLOT_EMPTY_VALUE, EMPTY_VALUE); PlotIndexSetInteger(1, PLOT_DRAW_TYPE, DRAW_COLOR_ARROW); PlotIndexSetInteger(1, PLOT_ARROW, 217); PlotIndexSetInteger(1, PLOT_ARROW_SHIFT, arrowShift); PlotIndexSetDouble(1, PLOT_EMPTY_VALUE, EMPTY_VALUE); ArraySetAsSeries(bearishInsideBar_buffer, true); ArraySetAsSeries(upperArrowColor_buffer, true); ArraySetAsSeries(bullishInsideBar_buffer, true); ArraySetAsSeries(lowerArrowColor_buffer, true); //--- return INIT_SUCCEEDED; }
А в этой функции в зависимости от типа появившегося паттерна должен задаваться цвет стрелочек:
void setBuffers(string patternType, // Тип паттерна int i) { // Индекс обрабатываемого бара if (patternType == BEARISH_INSIDE_BAR) { bearishInsideBar_buffer[i] = barHighPrice(i); bullishInsideBar_buffer[i] = EMPTY_VALUE; upperArrow_buffer[i] = barHighPrice(i); upperArrowColor_buffer[i] = 1; lowerArrow_buffer[i] = barLowPrice(i); lowerArrowColor_buffer[i] = 1; } else if (patternType == BULLISH_INSIDE_BAR) { bearishInsideBar_buffer[i] = EMPTY_VALUE; bullishInsideBar_buffer[i] = barLowPrice(i); upperArrow_buffer[i] = barHighPrice(i); upperArrowColor_buffer[i] = 0; lowerArrow_buffer[i] = barLowPrice(i); lowerArrowColor_buffer[i] = 0; } }
Сейчас у меня исчезли все стрелочки.
Может второй буфер стрелочек, который не хранит цвет нужно как-то иначе использовать? Что-то я запутался уже в этом..
Всё верно. Я понимаю, что стиль рисования подразумевает использование 2 цветов.
Видимо да. Значит нужно пересмотреть своё видение по этому поводу.
Вот смотрите. Например, в свойствах индикатора пишем так:
2 буфера индикатора используется для хранения значений самих паттернов и 2 индикаторных будфера используется для хранения обоихстрелочек (над и под каждым паттерном) и 2 серии отрисовки (на каждую стрелочки). По сути, получилось 2 буфера для хранения паттернов и 4 буфера на 2 стрелочеки т.е. на каждую стрелочку по 2 буфера. В теории, всё верно.
Вот функция инициализации:
А в этой функции в зависимости от типа появившегося паттерна должен задаваться цвет стрелочек:
Сейчас у меня исчезли все стрелочки.
Может второй буфер стрелочек, который не хранит цвет нужно как-то иначе использовать? Что-то я запутался уже в этом..
Настоятельно рекомендую создать болванку в MQL5 Wizard - таким образом избавитесь от глупых ошибок конструирования.
Настоятельно рекомендую создать болванку в MQL5 Wizard - таким образом избавитесь от глупых ошибок конструирования.
В конструкторе такое не задать. Там всегда буфер значений чередуется с цветом. Мне же нужно, что бы первыми были прописаны буфера для хранения значений наличия того или иного паттерна. Окрашивать его не целесообразно. Поэтому я и задался вопросом как это проверить. Как мне такое создать при помощи MQL5 Wizard ?
- www.mql5.com
В конструкторе такое не задать. Там всегда буфер значений чередуется с цветом. Мне же нужно, что бы первыми были прописаны буфера, в которые должны храниться значения наличия паттерна. Окрашивать его не целесообразно. Поэтому я и задался вопросом как это проверить. Как мне такое создать при помощи MQL5 Wizard ?
Повторю: сначала болванка, потом свободное творчество ...
Пример болванки есть в #1
Сначала всегда прописываются буфера рабочие, и только потом буфера вспомогательные.
- 2020.12.05
- www.mql5.com
Повторю: сначала болванка, потом свободное творчество ...
Пример болванки есть в #1
Сначала всегда прописываются буфера рабочие, и только потом буфера вспомогательные.
В конструкторе всё получилось. Но там задаётся лишь отрисовка чего-либо. У меня, кроме этого, как я написал имеются ещё и 2 буфера для хранения наличия паттернов.
Объявлю я буфера для хранения паттернов теперь в самом конце. Теперь появилась разница. До этого не было стрелочек вообще. На данный момент, появилось 2 стрелочки около обоих вариантов паттерна. Хотя, цвета должны отличаться.
Вот это у меня в свойствах индикатора:
#property indicator_buffers 6 #property indicator_plots 2 #property indicator_type1 DRAW_COLOR_ARROW #property indicator_color1 clrRed, clrTurquoise, clrGoldenrod #property indicator_type2 DRAW_COLOR_ARROW #property indicator_color2 clrRed, clrTurquoise, clrIndigo
Объявления буферов:
double upperArrow_buffer[]; // Буфер верхней стрелочки double upperArrowColors_buffer[]; // Буфер цвета верхней стрелочки double lowerArrow_buffer[]; // Буфер нижней стрелочки double lowerArrowColors_buffer[]; // Буфер цвета нижней стрелочки double bearishInsideBar_buffer[]; // Буфер паттерна "Внутренний бар" с медвежьим телом бара double bullishInsideBar_buffer[]; // Буфер паттерна "Внутренний бар" с бычьим телом бара
OnInit():
int OnInit() { ptrSym = new SymbolInstance(_Symbol); IndicatorSetString(INDICATOR_SHORTNAME, "Inside bar"); IndicatorSetInteger(INDICATOR_DIGITS, _Digits); // === Связывание буферов с индексами, определение стилей ========================== SetIndexBuffer(0, upperArrow_buffer, INDICATOR_DATA); // 1-ый буфер - Буфер верхней стрелочки SetIndexBuffer(1, upperArrowColors_buffer, INDICATOR_COLOR_INDEX); // 2-ой буфер - Цвет верхней стрелочки SetIndexBuffer(2, lowerArrow_buffer, INDICATOR_DATA); // 3-ий буфер - Буфер нижней стрелочки SetIndexBuffer(3, lowerArrowColors_buffer, INDICATOR_COLOR_INDEX); // 4-ый буфер - Цвет нижней стрелочки SetIndexBuffer(4, bearishInsideBar_buffer, INDICATOR_DATA); // 5-ый буфер - "Внутренний бар" с медвежьим телом бара SetIndexBuffer(5, bullishInsideBar_buffer, INDICATOR_DATA); // 6-ой буфер - "Внутренний бар" с бычьим телом бара PlotIndexSetInteger(0, PLOT_DRAW_TYPE, DRAW_COLOR_ARROW); PlotIndexSetInteger(0, PLOT_ARROW, 218); PlotIndexSetInteger(0, PLOT_ARROW_SHIFT, -arrowShift); PlotIndexSetDouble(0, PLOT_EMPTY_VALUE, EMPTY_VALUE); PlotIndexSetInteger(1, PLOT_DRAW_TYPE, DRAW_COLOR_ARROW); PlotIndexSetInteger(1, PLOT_ARROW, 217); PlotIndexSetInteger(1, PLOT_ARROW_SHIFT, arrowShift); PlotIndexSetDouble(1, PLOT_EMPTY_VALUE, EMPTY_VALUE); ArraySetAsSeries(upperArrow_buffer, true); ArraySetAsSeries(upperArrowColors_buffer, true); ArraySetAsSeries(lowerArrow_buffer, true); ArraySetAsSeries(lowerArrowColors_buffer, true); ArraySetAsSeries(bearishInsideBar_buffer, true); ArraySetAsSeries(bullishInsideBar_buffer, true); //--- return INIT_SUCCEEDED; }
В этой функции задаются значения буферам в зависимости от типа паттерна:
void setBuffers(string patternType, // Тип паттерна int i) { // Индекс обрабатываемого бара if (patternType == BEARISH_INSIDE_BAR) { bearishInsideBar_buffer[i] = barHighPrice(i); bullishInsideBar_buffer[i] = EMPTY_VALUE; upperArrow_buffer[i] = barHighPrice(i); upperArrowColors_buffer[i] = 0; lowerArrow_buffer[i] = barLowPrice(i); lowerArrowColors_buffer[i] = 0; } else if (patternType == BULLISH_INSIDE_BAR) { bullishInsideBar_buffer[i] = barLowPrice(i); bearishInsideBar_buffer[i] = EMPTY_VALUE; upperArrow_buffer[i] = barHighPrice(i); upperArrowColors_buffer[i] = 1; lowerArrow_buffer[i] = barLowPrice(i); lowerArrowColors_buffer[i] = 1; } }
На скрине вижу:
Цвет не меняется.. Почему? Ведь я всё верно, как я понимаю, объявил. Индексы цветов присваиваются разные в зависимости от типа паттерна..
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Вы принимаете политику сайта и условия использования
Добрый день. У меня, сугугбо из некоторого интереса, появилось желание научиться писать индикаторы у которых много буфером со значениями самого индикатора так и с большим количеством графических построений. Я взял шаблон с элементарным индикатором, который находит паттерн "внутренний бар" и выводит неоторую информацию о нём. Выложить весь код я могу, но я пишу с использованием самописных библиотеки и классов. Не каждый захочет такие вещи проверять..)
В общем то, есть вариант проще. Я взял элементарный пример. Буфер паттерна с медвежьим телом размещается в одном бфере, а с бычьим - в другом. Над и под каждым из этим паттернов будет отображаться цветная стрелочка. Над и под бычьим -я выбрал синюю, а над и под медвежьим - красную.
Вот свойства индикатора:
Функция OnInit():
Вот функция, в которой присваиваются значения индикаторам:
В функции setBuffers() видно, что при нахождении бара с медвежьим телом присваивается значение Хая бара на этом индексе и индексов стрелочек располагающихся над и под этим баром. По логике всё верно. Но не работает. В чём проблема?
Кстати, свойства индикаторов задаются с 1-го индекса, а не в 0-го. Но, в данном случае, если 4 буфера графических серий, и свойства задать как я указал выше, то будет появляться ошибка:
Хотя, у меня объявлена 4 графических серии. Как это так?
Для общего ознакомления я прикрепляю исходны код. Для компилирования я могу приложить то, что нужно.