Вы упускаете торговые возможности:
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Регистрация
Вход
Вы принимаете политику сайта и условия использования
Если у вас нет учетной записи, зарегистрируйтесь
Ну и где он работает? Линии рисует на каждом баре, а не по ТЗ. Или на картинке выше ТФ=Н1?
Пересчитайте на бумажке, чему будут равны limit и i на каждой итерации циклов.
Мой пример, показанный выше, так и не учтен, как я понимаю.
Галочки-стрелки можно рисовать с помощью индикаторных буферов, как и линии, соединяющие тени свечей.
PERIOD_H;. Ниже периода Н4 рисуется всё хорошо.
i = 0;
Limit это внешняя переменная по умолчанию = 5;
extern int barsToProcess = 5; //--- Кол-во отображаемых периодов (линий) .
"Галочки-стрелки можно рисовать с помощью индикаторных буферов, как и линии, соединяющие тени свечей. "
Я это понимаю так.
В буфер с индексом [Limit] присваивается значения хай из Массива.
double Buf_High[Limit] = mqlRates[0].high;
Как обвести на каждом баре, я понимаю. А вот, как на каждом Н4 баре нет.
PERIOD_H;. Ниже периода Н4 рисуется всё хорошо.
i = 0;
Limit это внешняя переменная по умолчанию = 5;
extern int barsToProcess = 5; //--- Кол-во отображаемых периодов (линий) .
"Галочки-стрелки можно рисовать с помощью индикаторных буферов, как и линии, соединяющие тени свечей. "
Я это понимаю так.
В буфер с индексом [Limit] присваивается значения хай из Массива.
double Buf_High[Limit] = mqlRates[0].high;
Как обвести на каждом баре, я понимаю. А вот, как на каждом Н4 баре нет.
Разберитесь как работают циклы, прежде, чем их использовать. i = 0 только первый раз, потом i++, до limit.
При первом запуске индикатора limit=Bars-counted_bars= Bars-0=Bars.
Цикл for при этом должен бы теоретически считать от 0 до кол-ва баров на графике. НО!!! Тут вмешивается второй цикл while, который пересчитывает как i, так и limit.
Зачем было так делать, кто научил, не пойму...
Пример на пальцах, задано: баров - 100, barsToProcess = 5.
В первый запуск индикатора counted_bars=0, не считали ещё, значит limit=100. Значит цикл for начале должен отработать 100 раз, от 0 до 99.
итерации цикла for:
1. i=0, limit=barsToProcess=5, while(i<5) - выполняется внутренний цикл с отрисовкой линий и галочек 5 раз, от 0 до 4, при этом каждый раз i++, по завершении while - i=5, limit=5.
2. i=5=limit - цикл for завершился.
ВСЁ! Дальше индикатор ничего не делает до следующего тика. Приходит тик, counted_bars=99, limit=Bars-counted_bars= 100-99=1.
Цикл for выполнится 1 раз, цикл while - ни разу (так как условие if(limit>barsToProcess) не выполнено). И так до выгрузки индикатора с графика или смены ТФ, в общем до переинициализации индикатора.
То есть фактически индикатор рисует один раз при загрузке на график свои линии-галочки и далее бездействует до переинициализации. И зачем такой индикатор нужен, спрашивается? С однократной отработкой и скрипт справится.
Код переписал. С циклом вроде всё верно.
Остался вопрос отрисовки "буферной" линии.
#property strict
#property indicator_chart_window
extern int Total_bars = 5; //--- Кол-во отображаемых Элементов в истории
//--- Глобальные переменные
string Name_VLine; //--- Имя Элементов
string Name_CHECK; //--- Имя Элементов
MqlRates mqlRates[1]; //Структура для хранения информации
#property indicator_buffers 1
#property indicator_type1 DRAW_LINE // тип графического построения - линия
#property indicator_color1 clrRed // цвет линии
#property indicator_style1 STYLE_SOLID // стиль линии
#property indicator_width1 1 // толщина линии
double Buff_High[];
//+------------------------------------------------------------------+
int OnInit()
{
return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
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[])
{
SetIndexBuffer(0,Buff_High);
SetIndexStyle(0,DRAW_LINE);
SetIndexStyle(0,DRAW_SECTION);
//+------------------------------------------------------------------+
int limit; //--- переменная старт кол-во баров. Линии рисуем о по всем барам
int counted_bars = IndicatorCounted(); //--- перем counted_bars = функц. Возвращает количество баров
if(counted_bars > 0) counted_bars --; //--- последний посчитанный бар будет пересчитан
//--- основной цикл
limit = Bars - counted_bars;
for(int i = 0; i <= limit; i ++)
{
if(limit > Total_bars) //--- Если кол-во баров на графике > Кол-ву выбранных элементов
{
limit = Total_bars-1; //--- тогда кол-во баров на графике = Кол-ву выбранных элементов
}
datetime t_Line = iTime(Symbol(),PERIOD_H4,i); //--- В ПЕРЕМ t_Line Будет Присваиваться значение времени открытия бара
CopyRates(_Symbol, PERIOD_H4, t_Line, 1, mqlRates); //--- Структура для хранения информации
//+------------------------ Рисуем вертикальную линии -----------------------------------------------------+
ObjectCreate (Name_VLine + " VLine" + DoubleToStr(i,0),OBJ_VLINE,0,t_Line,0); //--- Создаём обьект вертикальную линию
ObjectSet (Name_VLine + " VLine" + DoubleToStr(i,0),OBJPROP_STYLE,2); //--- Со стилем
ObjectSet (Name_VLine + " VLine" + DoubleToStr(i,0),OBJPROP_COLOR,DimGray); //--- Со цветом
ObjectSet (Name_VLine + " VLine" + DoubleToStr(i,0),OBJPROP_WIDTH,0); //--- С толщиной
ObjectSet (Name_VLine + " VLine" + DoubleToStr(i,0),OBJPROP_BACK,0); //--- С типом отображения. Объект на заднем плане
//--- кубики по хай (В место галочек нужно подставить кубики)
ObjectCreate (0,Name_CHECK + "H_CHECK" + DoubleToStr(i,0), OBJ_ARROW_CHECK, 0, t_Line, mqlRates[0].high, t_Line,mqlRates[0].high);
ObjectSetInteger(0,Name_CHECK + "H_CHECK" + DoubleToStr(i,0), OBJPROP_COLOR, clrGreen);
//--- кубики по лоу (В место галочек нужно подставить кубики)
ObjectCreate (0,Name_CHECK + "L_CHECK" + DoubleToStr(i,0), OBJ_ARROW_CHECK, 0, t_Line, mqlRates[0].low, t_Line,mqlRates[0].low);
ObjectSetInteger(0,Name_CHECK + "L_CHECK" + DoubleToStr(i,0), OBJPROP_COLOR, clrGreen);
// На ТФ Н4 линии рисуются по хайям,
// При смене ТФ линия рисуется на растоянии параметра Total_bars.
//--- Заполнение буфера
Buff_High[i] = mqlRates[0].high ;
}
return(rates_total);
}
//+------------------------------------------------------------------+
Зачем было так делать, кто научил, не пойму...
Я находил подходящий индикатор и "разбирал его", до момента, пока останется тот фрагмент, который мне нужен. Далее собирал фрагменты кодов и получал примерно то, что нужно. Как то так.
"Я мотаю на ус" .
Код переписал. С циклом вроде всё верно.
Остался вопрос отрисовки "буферной" линии.
Для вставки кода есть кнопка SRC на верхней панели окна редактирования сообщения, вставляет код красиво и без пустых строк.
Линию наверное придётся тоже объектами рисовать (трендовая), запоминать предыдущие время/цену в отдельных переменных и использовать как координаты второй точки.
Для замены галочки на другой символ - OBJ_ARROW и ARROW_CODE.
Для вставки кода есть кнопка SRC на верхней панели окна редактирования сообщения, вставляет код красиво и без пустых строк.
Линию наверное придётся тоже объектами рисовать (трендовая), запоминать предыдущие время/цену в отдельных переменных и использовать как координаты второй точки.
Для замены галочки на другой символ - OBJ_ARROW и ARROW_CODE.
А чем не нравится
1
Отрезки между непустыми значениями линии
А чем не нравится
1
Отрезки между непустыми значениями линии
Я не знаю как её применить.
А чем не нравится
1
Отрезки между непустыми значениями линии
Линию наверное придётся тоже объектами рисовать (трендовая), запоминать предыдущие время/цену в отдельных переменных и использовать как координаты второй точки.
Идея хорошая. Я попробую если получится.
По сути чем рисовать ризницы нет. Лишь бы работало как надо.
Alex_Profit:
Я не знаю как её применить.
Просто в OnInit() вместо
SetIndexStyle(0, DRAW_LINE);
написать
SetIndexStyle(0, DRAW_SECTION);
Почему-то без изменений