Індикатори користувача
Стиль DRAW_ARROW малює на графіку заданим кольором стрілки (символи набору Wingdings) за значенням індикаторного буфера. Товщину та колір символів можна задавати так само, як і для стилю DRAW_LINE – директивами компілятора або динамічно за допомогою функції PlotIndexSetInteger(). p align="justify"> Динамічне зміна властивостей графічної побудови дозволяє змінювати вид індикатора в залежності від поточної ситуації.
Код символу для виведення графік задається за допомогою властивості PLOT_ARROW.
//--- задамо код символу зі шрифту Wingdings для відображення в PLOT_ARROW PlotIndexSetInteger (0, PLOT_ARROW ,code);
За промовчанням значення PLOT_ARROW=159 (кружок).
Кожна стрілка фактично є символом, який має висоту і точку прив'язки, і може закривати собою деяку важливу інформацію на графіку (наприклад, ціну закриття на барі). Тому можна додатково вказати вертикальне усунення в пікселях, яке не залежить від масштабу графіка. На цю вказану кількість пікселів стрілки будуть візуально зміщені по вертикалі, хоча самі значення індикатора залишаться такими ж:
//--- задамо зміщення стрілок по вертикалі в пікселях PlotIndexSetInteger (0, PLOT_ARROW_SHIFT ,shift);
Негативне значення PLOT_ARROW_SHIFT означає зміщення стрілок вгору, позитивне значення зміщує стрілки вниз.
Стиль DRAW_ARROW можна використовувати як в окремому вікні графіка, так і в головному вікні. Порожні значення не відображаються і не відображаються у вікні даних, всі значення в індикаторних буферах потрібно встановлювати явним чином. Ініціалізація буферів порожнім значенням немає.
//--- встановимо порожнє значення PlotIndexSetDouble (індекс_побудови_DRAW_ARROW, PLOT_EMPTY_VALUE ,0);
Кількість буферів для побудови DRAW_ARROW — 1.
Приклад індикатора, що малює стрілки на кожному барі, у якого ціна закриття Close більша за ціну закриття попереднього бару. Колір, товщина, зсув і код символу всіх стрілок змінюються випадковим чином кожні N тиків.

У прикладі спочатку для графічної побудови plot1 зі стилем DRAW_ARROW властивості, колір та розмір задаються за допомогою директиви компілятора #property, а потім функції OnCalculate() властивості задаються випадковим чином. Параметр N винесений у зовнішні параметри індикатора для ручної установки (закладка "Параметри" у вікні властивостей індикатора).
#property description "Індикатор демонстрації DRAW_ARROW" #property description "Малює на графіку стрілки, що задаються символами Unicode" #property description "Колір, розмір, зсув та код символу стрілки змінюється випадковим чином" #property description "через кожні N тиків" #property description "Параметр code визначає базове значення: код=159 (кружок)"
#property indicator_chart_window #property indicator_buffers 1 #property indicator_plots 1 //--- plot Arrows #property indicator_label1 "Arrows" #property indicator_type1 DRAW_ARROW #property indicator_color1 clrGreen #property indicator_width1 1 //--- input параметри input int N = 5; // Кількість тиків для зміни input ushort code =159; // код символу для відображення в DRAW_ARROW //--- індикаторний буфер для побудови double ArrowsBuffer[]; //--- масив для зберігання квітів color colors[]=< clrRed, clrBlue, clrGreen >; //+--------------------------------------------------- -------------------+ // Custom indicator initialization function //+--------------------------------------------------- -------------------+ int OnInit() < //--- indicator buffers mapping SetIndexBuffer (0,ArrowsBuffer, INDICATOR_DATA ); //--- задаємо код символу для відображення в PLOT_ARROW PlotIndexSetInteger (0, PLOT_ARROW ,code); //--- задамо зміщення стрілок по вертикалі в пікселях PlotIndexSetInteger (0, PLOT_ARROW_SHIFT ,5); //--- встановимо як порожнє значення 0 PlotIndexSetDouble (0, PLOT_EMPTY_VALUE, 0); //--- 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[]) < static int ticks = 0; //--- вважаємо тики для зміни кольору, розміру, змішування та коду стрілки ticks++; //--- якщо накопичилося критичне число тиків if (ticks>= N ) < //--- міняємо властивості лінії ChangeLineAppearance(); //--- скидаємо лічильник тиків у нуль ticks = 0; >
//--- блок розрахунку значень індикатора int start = 1; if (prev_calculated>0) start=prev_calculated-1; //--- цикл розрахунку for ( int i=1;i close[i-1]) ArrowsBuffer[i]=close[i]; //---інакше вказуємо нульове значення else ArrowsBuffer[i]=0; > //--- return value prev_calculated for nextcall return (rates_total); > //+--------------------------------------------------- -------------------+ // Змінює зовнішній вигляд символів в індикаторі //+--------------------------------------------------- -------------------+ void ChangeLineAppearance() < //--- рядок для формування інформації про властивості індикатора string comm=""; //--- блок зміни кольору стрілки int number = MathRand (); // Отримаємо випадкове число //--- дільник числа дорівнює розміру масиву colors int size = ArraySize (colors); //--- отримаємо індекс для вибору нового кольору як залишок від цілісного поділу int color_index=number%size; //--- встановимо колір як властивість PLOT_LINE_COLOR PlotIndexSetInteger (0, PLOT_LINE_COLOR, colors[color_index]); //--- запишемо колір лінії comm=comm+ "\r\n" +(string)colors[color_index];
//--- блок зміни розміру стрілок number = MathRand (); //--- отримаємо товщину як залишок від цілісного поділу int width=number%5; // розмір визначається від 0 до 4 //--- встановимо колір як властивість PLOT_LINE_WIDTH PlotIndexSetInteger (0, PLOT_LINE_WIDTH, width); //--- запишемо розмір стрілок comm = comm + "Width =" + IntegerToString (width);
//--- блок зміни коду стрілки (PLOT_ARROW) number = MathRand (); //--- отримаємо залишок від цілісного поділу для обчислення нового коду стрілки (від 0 до 19) int code_add=number%20; //--- встановимо новий код символу як суму code+code_add PlotIndexSetInteger (0, PLOT_ARROW, code +code_add); //--- запишемо код символу PLOT_ARROW comm="\r\n" + "PLOT_ARROW=" + IntegerToString (code +code_add)+comm;
//--- блок зміни усунення стрілок по вертикаліу пікселях number = MathRand (); //--- отримаємо зсув як залишок від цілісного поділу int shift=20-number%41; //--- встановимо нове усунення від -20 до 20 PlotIndexSetInteger (0, PLOT_ARROW_SHIFT ,shift); //--- запишемо зсув PLOT_ARROW_SHIFT comm="\r\n" + "PLOT_ARROW_SHIFT=" + IntegerToString (shift)+comm;