Помогите решить проблему при синхронизации кода с открытием бара - линия перестает рисоваться - страница 2

 
Maxim Kuznetsov:

приведя код, неплохо было-бы пояснить что вы от него хотели и что именно не получили. Простыми словами типа "хотел нарисовать два уровня, один между 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 будут меняться и соответственно будут менять значения буфера на каждом тике.
 
Alexey Viktorov:

Последний раз...

Смотри что получается

Бесплатный совет: Внимательно читай что советуют, старайся понять, а не просто воткнуть и проверить результат. Всегда читай до конца. Я тебе говорил о том, что надо в этом варианте работать с предыдущим баром, то-есть

Или не надо пытаться заставить его работать на открытии нового бара. Тогда при поступлении нового тика текущие OHLC будут меняться и соответственно будут менять значения буфера на каждом тике.

Вот теперь свой совет примени к себе и внимательно читай (ЭТО БЫЛ ПРИМЕР КОДА) я писал что работаю с тиками а не с данными бара, а значит я работаю с данными в реальном времени, но при открытии нового бара срабатывает вторая часть кода где обнуляються показатели и полученное значение должно занестись в буфер.

1. Данные собираются;

2. При появлении бара показатели обнуляются; 

3. Полученное значение не передается в буфер, а значит индикаторная линия не рисуется (ВОТ ГДЕ ПРОБЛЕМА).

Вне зависимости какой бар я укажу линия не будет рисоваться, поскольку данные для буфера обрабатываются при появлении нового бара. И возможно тут конфликт цикла и скрипта определения нового бара. Если считаете себя умным, то будьте добры, поступайте по умному! 

 
novichek:

Вот теперь свой совет примени к себе и внимательно читай (ЭТО БЫЛ ПРИМЕР КОДА) я писал что работаю с тиками а не с данными бара, а значит я работаю с данными в реальном времени, но при открытии нового бара срабатывает вторая часть кода где обнуляються показатели и полученное значение должно занестись в буфер.

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_buffers 2
#property indicator_plots   2
//--- 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 buffers
double bulls_middleline[],bears_middleline[];
double up,up_buffer,down,down_buffer;
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- indicator buffers mapping
   SetIndexBuffer(0,bulls_middleline);
   SetIndexBuffer(1,bears_middleline);
//---
   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[])
  {
//---
  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 call
   return(rates_total);
  }
 

И ещё вопрос.

А зачем цикл по всем барам если индикатор работает только с тиками а тики предыдущих баров не доступны. Разве что в МТ5 тестере...

 
Alexey Viktorov:

И ещё вопрос.

А зачем цикл по всем барам если индикатор работает только с тиками а тики предыдущих баров не доступны. Разве что в МТ5 тестере...

Да ты прав, можно было просто цикл убрать. Спасибо!