приведя код, неплохо было-бы пояснить что вы от него хотели и что именно не получили. Простыми словами типа "хотел нарисовать два уровня, один между high и open, другой ещё как-то там, а рисуется зелёная тыква". Получить ответ на несформулированный вопрос можно только на форуме телепатов :-)
и ещё раз про то "что не угадал" : в приведённом примере OnCalculate вызывается только при открытии нового бара (то есть не на тики). У вас каждый раз бар новый.Всегда. Переменные не инициализованы и при первом обращении могут содержать мусор.
ps. не злоупотребляйте болдом и оформительством текста - не очень удобно читать
Пишу еще раз , что это пример кода, но суть та же скрипт работает с тиками и собирает показатели но при появлении нового бара он передает данные в буффер и обнуляет показатели. Данные он собирает и обнуляет показатели, но в буффер данные не поступают.
//+------------------------------------------------------------------+//| Накопитель показателей |//+------------------------------------------------------------------+
up = (open[i] + high[i]) / 2; // Открылся новый бар, индекс ему i, open[i] равен high[i] Что получил в результате???
down = (open[i] + low[i]) / 2; // и здесь то-же самое...
Бесплатный совет: Внимательно читай что советуют, старайся понять, а не просто воткнуть и проверить результат. Всегда читай до конца. Я тебе говорил о том, что надо в этом варианте работать с предыдущим баром, то-есть
//+------------------------------------------------------------------+//| Накопитель показателей |//+------------------------------------------------------------------+
up = (open[i+1] + high[i+1]) / 2;
down = (open[i+1] + low[i+1]) / 2;
Или не надо пытаться заставить его работать на открытии нового бара. Тогда при поступлении нового тика текущие OHLC будут меняться и соответственно будут менять значения буфера на каждом тике.
Бесплатный совет: Внимательно читай что советуют, старайся понять, а не просто воткнуть и проверить результат. Всегда читай до конца. Я тебе говорил о том, что надо в этом варианте работать с предыдущим баром, то-есть
Или не надо пытаться заставить его работать на открытии нового бара. Тогда при поступлении нового тика текущие OHLC будут меняться и соответственно будут менять значения буфера на каждом тике.
Вот теперь свой совет примени к себе и внимательно читай(ЭТО БЫЛ ПРИМЕР КОДА) я писал что работаю с тиками а не с данными бара, а значит я работаю с данными в реальном времени, но при открытии нового бара срабатывает вторая часть кода где обнуляються показатели и полученное значение должно занестись в буфер.
1. Данные собираются;
2. При появлении бара показатели обнуляются;
3. Полученное значение не передается в буфер, а значит индикаторная линия не рисуется (ВОТ ГДЕ ПРОБЛЕМА).
Вне зависимости какой бар я укажу линия не будет рисоваться, поскольку данные для буфера обрабатываются при появлении нового бара. И возможно тут конфликт цикла и скрипта определения нового бара. Если считаете себя умным, то будьте добры, поступайте по умному!
Вот теперь свой совет примени к себе и внимательно читай(ЭТО БЫЛ ПРИМЕР КОДА) я писал что работаю с тиками а не с данными бара, а значит я работаю с данными в реальном времени, но при открытии нового бара срабатывает вторая часть кода где обнуляються показатели и полученное значение должно занестись в буфер.
1. Данные собираются;
2. При появлении бара показатели обнуляются;
3. Полученное значение не передается в буфер, а значит индикаторная линия не рисуется (ВОТ ГДЕ ПРОБЛЕМА).
Вне зависимости какой бар я укажу линия не будет рисоваться, поскольку данные для буфера обрабатываются при появлении нового бара. И возможно тут конфликт цикла и скрипта определения нового бара.Если считаете себя умным, то будьте добры, поступайте по умному!
Да конечно считаю себя умным... Но сейчас не об этом. Давай по порядку.
1. Собираешь тики на текущем баре... хорошо.
2. При появлении нового бара пишешь это в буфер... не плохо.
Появился новый бар, начинается набор данных уже нового бара... Что может быть проще поменять последовательность действий???
1. При появлении нового бара записываются данные в буфер.
2. Начинаем набирать данные с этого нового бара.
И ВСЁ!!!
#property copyright"Copyright 2016, MetaQuotes Software Corp."#property link"https://www.mql5.com"#property version"1.00"#property strict#property indicator_chart_window#property indicator_buffers2#property indicator_plots2//--- plot Label1#property indicator_label1 "bulls_middleline"#property indicator_type1 DRAW_LINE#property indicator_color1 clrGreen#property indicator_style1 STYLE_SOLID#property indicator_width1 1//--- plot Label2#property indicator_label2 "bears_middleline"#property indicator_type2 DRAW_LINE#property indicator_color2 clrRed#property indicator_style2 STYLE_SOLID#property indicator_width2 1//--- indicator buffersdouble bulls_middleline[],bears_middleline[];
double up,up_buffer,down,down_buffer;
//+------------------------------------------------------------------+//| Custom indicator initialization function |//+------------------------------------------------------------------+intOnInit()
{
//--- indicator buffers mappingSetIndexBuffer(0,bulls_middleline);
SetIndexBuffer(1,bears_middleline);
//---return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+//| Custom indicator iteration function |//+------------------------------------------------------------------+intOnCalculate(constint rates_total,
constint prev_calculated,
constdatetime &time[],
constdouble &open[],
constdouble &high[],
constdouble &low[],
constdouble &close[],
constlong &tick_volume[],
constlong &volume[],
constint &spread[])
{
//---int i,
limit = prev_calculated == 0// Переменной limit, при условии что prev_calculated равно нулю
? rates_total-1// будет присвоено значение rates_total(количество баров в окне) минус 1
: prev_calculated; // иначе будет присвоено prev_calculated(количество не посчитанных баровfor(i = limit-1; i >= 0; i--) // цикл
{
//+------------------------------------------------------------------+//| Объявление нового бара |//+------------------------------------------------------------------+ if(rates_total > prev_calculated)
{
bulls_middleline[i] = (up_buffer + up) / 2;
up_buffer = bulls_middleline[i];
bears_middleline[i] = (down_buffer + down) / 2;
down_buffer = bears_middleline[i];
}
//+------------------------------------------------------------------+//| Накопитель показателей |//+------------------------------------------------------------------+
up = (open[i] + high[i]) / 2;
down = (open[i] + low[i]) / 2;
}
//--- return value of prev_calculated for next callreturn(rates_total);
}
Для авторизации и пользования сайтом MQL5.com необходимо разрешить использование файлов Сookie.
Пожалуйста, включите в вашем браузере данную настройку, иначе вы не сможете авторизоваться.
Вы вошли в аккаунт. Двухфакторная аутентификация отключена. Настройте её заново и отсканируйте новый QR-код или продолжите с отключённой двухфакторной аутентификацией.
приведя код, неплохо было-бы пояснить что вы от него хотели и что именно не получили. Простыми словами типа "хотел нарисовать два уровня, один между high и open, другой ещё как-то там, а рисуется зелёная тыква". Получить ответ на несформулированный вопрос можно только на форуме телепатов :-)
и ещё раз про то "что не угадал" : в приведённом примере OnCalculate вызывается только при открытии нового бара (то есть не на тики). У вас каждый раз бар новый.Всегда. Переменные не инициализованы и при первом обращении могут содержать мусор.
ps. не злоупотребляйте болдом и оформительством текста - не очень удобно читать
Последний раз...
Смотри что получается
Бесплатный совет: Внимательно читай что советуют, старайся понять, а не просто воткнуть и проверить результат. Всегда читай до конца. Я тебе говорил о том, что надо в этом варианте работать с предыдущим баром, то-есть
Или не надо пытаться заставить его работать на открытии нового бара. Тогда при поступлении нового тика текущие OHLC будут меняться и соответственно будут менять значения буфера на каждом тике.Последний раз...
Смотри что получается
Бесплатный совет: Внимательно читай что советуют, старайся понять, а не просто воткнуть и проверить результат. Всегда читай до конца. Я тебе говорил о том, что надо в этом варианте работать с предыдущим баром, то-есть
Или не надо пытаться заставить его работать на открытии нового бара. Тогда при поступлении нового тика текущие OHLC будут меняться и соответственно будут менять значения буфера на каждом тике.Вот теперь свой совет примени к себе и внимательно читай (ЭТО БЫЛ ПРИМЕР КОДА) я писал что работаю с тиками а не с данными бара, а значит я работаю с данными в реальном времени, но при открытии нового бара срабатывает вторая часть кода где обнуляються показатели и полученное значение должно занестись в буфер.
1. Данные собираются;
2. При появлении бара показатели обнуляются;
3. Полученное значение не передается в буфер, а значит индикаторная линия не рисуется (ВОТ ГДЕ ПРОБЛЕМА).
Вне зависимости какой бар я укажу линия не будет рисоваться, поскольку данные для буфера обрабатываются при появлении нового бара. И возможно тут конфликт цикла и скрипта определения нового бара. Если считаете себя умным, то будьте добры, поступайте по умному!
Вот теперь свой совет примени к себе и внимательно читай (ЭТО БЫЛ ПРИМЕР КОДА) я писал что работаю с тиками а не с данными бара, а значит я работаю с данными в реальном времени, но при открытии нового бара срабатывает вторая часть кода где обнуляються показатели и полученное значение должно занестись в буфер.
1. Данные собираются;
2. При появлении бара показатели обнуляются;
3. Полученное значение не передается в буфер, а значит индикаторная линия не рисуется (ВОТ ГДЕ ПРОБЛЕМА).
Вне зависимости какой бар я укажу линия не будет рисоваться, поскольку данные для буфера обрабатываются при появлении нового бара. И возможно тут конфликт цикла и скрипта определения нового бара. Если считаете себя умным, то будьте добры, поступайте по умному!
Да конечно считаю себя умным... Но сейчас не об этом. Давай по порядку.
1. Собираешь тики на текущем баре... хорошо.
2. При появлении нового бара пишешь это в буфер... не плохо.
Появился новый бар, начинается набор данных уже нового бара... Что может быть проще поменять последовательность действий???
1. При появлении нового бара записываются данные в буфер.
2. Начинаем набирать данные с этого нового бара.
И ВСЁ!!!
И ещё вопрос.
А зачем цикл по всем барам если индикатор работает только с тиками а тики предыдущих баров не доступны. Разве что в МТ5 тестере...
И ещё вопрос.
А зачем цикл по всем барам если индикатор работает только с тиками а тики предыдущих баров не доступны. Разве что в МТ5 тестере...