Загадочный биржевой индикатор - страница 2

 
fxsaber:
Пробовал - моргание исчезало. Но в причинах не разобрался. Не хочется думать, что это очередной баг.

Вот набросал:

// Индикатор в виде гистограммы показывает проторгованный оборот BUY и SELL

#property indicator_separate_window

#property indicator_buffers 2
#property indicator_plots 2

#property indicator_label1  "TurnOver_BUY"
#property indicator_type1 DRAW_HISTOGRAM
#property indicator_color1 clrYellow
#property indicator_style1 STYLE_SOLID
#property indicator_width1  1 

#property indicator_label2  "TurnOver_SELL"
#property indicator_type2 DRAW_HISTOGRAM
#property indicator_color2 clrRed
#property indicator_style2 STYLE_SOLID
#property indicator_width2  1 

double Buffer0[];
double Buffer1[];
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void OnInit()
  {
   SetIndexBuffer(0,Buffer0,INDICATOR_DATA);
   SetIndexBuffer(1,Buffer1,INDICATOR_DATA);

   IndicatorSetInteger(INDICATOR_DIGITS,Digits());
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
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[])
  {
   if(prev_calculated==0)
     {
      for(int i=0;i<rates_total;i++)
        {
         Buffer0[i]=MathRand();
         Buffer1[i]=-MathRand();
        }
      return(rates_total);
     }
   for(int i=prev_calculated-1;i<rates_total;i++)
     {
      Buffer0[i]=MathRand();
      Buffer1[i]=-MathRand();
     }

   return(rates_total);
  }
//+------------------------------------------------------------------+

моргание ушло. Подтверждаю.

Файлы:
TurnOver.mq5  5 kb
 

Добавим экстрима:

// Индикатор в виде гистограммы показывает проторгованный оборот BUY и SELL

#property indicator_separate_window

#property indicator_buffers 2
#property indicator_plots 2

#property indicator_label1  "TurnOver_BUY"
#property indicator_type1 DRAW_HISTOGRAM
#property indicator_color1 clrYellow
#property indicator_style1 STYLE_SOLID
#property indicator_width1  1 

#property indicator_label2  "TurnOver_SELL"
#property indicator_type2 DRAW_HISTOGRAM
#property indicator_color2 clrRed
#property indicator_style2 STYLE_SOLID
#property indicator_width2  1 

double Buffer0[];
double Buffer1[];

//--- input parameters 
input int      ticks=1000;  // количество запрашиваемых тиков 
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void OnInit()
  {
   SetIndexBuffer(0,Buffer0,INDICATOR_DATA);
   SetIndexBuffer(1,Buffer1,INDICATOR_DATA);

   IndicatorSetInteger(INDICATOR_DIGITS,Digits());
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
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[])
  {
   if(prev_calculated==0)
     {
      for(int i=0;i<rates_total;i++)
        {
         Buffer0[i]=MathRand();
         Buffer1[i]=-MathRand();
        }
      return(rates_total);
     }
   for(int i=prev_calculated-1;i<rates_total;i++)
     {
      Buffer0[i]=MathRand();
      Buffer1[i]=-MathRand();
     }

//--- массив для приема тиков 
   MqlTick tick_array[];
//--- запросим тики 
   int copied=CopyTicks(_Symbol,tick_array,COPY_TICKS_ALL,0,ticks);
//--- если тики получены, то выведем на график значения Bid и Ask   
   if(copied>0)
     {

     }
   else // сообщим об ошибке при получении тиков 
     {
      Comment("Не удалось загрузить тики. GetLastError()=",GetLastError());
     }

   return(rates_total);
  }
//+------------------------------------------------------------------+

полёт нормальный. Нет моргания.

Файлы:
TurnOver.mq5  5 kb
 

Форум по трейдингу, автоматическим торговым системам и тестированию торговых стратегий

Ошибки, баги, вопросы

fxsaber, 2016.09.27 18:30

Сделал вывод каждого тика, дофига!

2016.09.27 19:29:00.293 TurnOver (Si-12.16,M1)  MaxInterval = 69.541 ms.
2016.09.27 19:28:59.877 TurnOver (Si-12.16,M1)  MaxInterval = 53.212 ms.
2016.09.27 19:28:59.800 TurnOver (Si-12.16,M1)  MaxInterval = 52.833 ms.
2016.09.27 19:28:59.739 TurnOver (Si-12.16,M1)  MaxInterval = 73.088 ms.
2016.09.27 19:28:58.689 TurnOver (Si-12.16,M1)  MaxInterval = 67.036 ms.
2016.09.27 19:28:58.007 TurnOver (Si-12.16,M1)  MaxInterval = 53.553 ms.
2016.09.27 19:28:57.744 TurnOver (Si-12.16,M1)  MaxInterval = 53.815 ms.
2016.09.27 19:28:57.603 TurnOver (Si-12.16,M1)  MaxInterval = 53.030 ms.
2016.09.27 19:28:57.541 TurnOver (Si-12.16,M1)  MaxInterval = 53.485 ms.
2016.09.27 19:28:57.488 TurnOver (Si-12.16,M1)  MaxInterval = 52.938 ms.
2016.09.27 19:28:57.443 TurnOver (Si-12.16,M1)  MaxInterval = 79.087 ms.

Это почему же CopyTicks такой тормозной?! Проверил зависимость от количества тиков (count - входной параметр) - почти никакой. Так же тормозит и при малых значениях.


 
Karputov Vladimir:

Добавим экстрима:

полёт нормальный. Нет моргания.

У Вас from нулевой. Все тормоза, похоже, когда в CopyTicks входной from не нулевой.

Похоже, очень кривая реализация CopyTicks  в таком режиме, даже если запрашиваются тики со времени последнего вызова. Казалось бы, должно летать, ан нет. 

 
fxsaber:
У Вас from нулевой. Все тормоза, похоже, когда в CopyTicks входной from не нулевой.
Здесь получается другое направление копирования: когда "from==0", то запрос идёт, образно говоря, от самой правой части графика к левой части. А вот когда задаём копирование с определённой даты и количество, то копирование идёт с левой стороны (начиная с указанной даты) в право.


Щас проверим гипотезу...

// Индикатор в виде гистограммы показывает проторгованный оборот BUY и SELL

#property indicator_separate_window

#property indicator_buffers 2
#property indicator_plots 2

#property indicator_label1  "TurnOver_BUY"
#property indicator_type1 DRAW_HISTOGRAM
#property indicator_color1 clrYellow
#property indicator_style1 STYLE_SOLID
#property indicator_width1  1 

#property indicator_label2  "TurnOver_SELL"
#property indicator_type2 DRAW_HISTOGRAM
#property indicator_color2 clrRed
#property indicator_style2 STYLE_SOLID
#property indicator_width2  1 

double Buffer0[];
double Buffer1[];

//--- input parameters 
input int      ticks=1000;  // количество запрашиваемых тиков 
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void OnInit()
  {
   SetIndexBuffer(0,Buffer0,INDICATOR_DATA);
   SetIndexBuffer(1,Buffer1,INDICATOR_DATA);

   IndicatorSetInteger(INDICATOR_DIGITS,Digits());
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
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[])
  {
   if(prev_calculated==0)
     {
      for(int i=0;i<rates_total;i++)
        {
         Buffer0[i]=MathRand();
         Buffer1[i]=-MathRand();
        }
      return(rates_total);
     }
   for(int i=prev_calculated-1;i<rates_total;i++)
     {
      Buffer0[i]=MathRand();
      Buffer1[i]=-MathRand();
     }

//--- массив для приема тиков 
   MqlTick tick_array[];
//--- запросим тики
   datetime start=D'2016.09.27 19:00'; // с какой даты запрашивать тики
   int copied=CopyTicks(Symbol(),tick_array,COPY_TICKS_ALL,(ulong)start*1000,ticks);
//--- если тики получены, то выведем на график значения Bid и Ask   
   if(copied>0)
     {

     }
   else // сообщим об ошибке при получении тиков 
     {
      Comment("Не удалось загрузить тики. GetLastError()=",GetLastError());
     }

   return(rates_total);
  }
//+------------------------------------------------------------------+

 

Да, верно. Локализована проблема: при запросе из индикатора, по крайней мере при стиле рисования DRAW_HISTOGRAM, истории тиков при указании конструкции, где параметр "from" равен какой-то дате происходит моргание данных в окне "Окно данных".

Если применять в CopyTicks параметр "from"==0, моргания нет.


Файлы:
TurnOver.mq5  6 kb
 
Karputov Vladimir:
Здесь получается другое направление копирования: когда "from==0", то запрос идёт, образно говоря, от самой правой части графика к левой части. А вот когда задаём копирование с определённой даты и количество, то копирование идёт с левой стороны (начиная с указанной даты) в право.

Вправо всегда копируется: Ticks[0] - всегда самый "левый" (с наименьшим временем рождения) тик. Грубо говоря, Ticks[] всегда отсортирован по возрастанию времени рождения тиков.

Karputov Vladimir:

Локализована проблема: при запросе из индикатора, по крайней мере при стиле рисования DRAW_HISTOGRAM, истории тиков при указании конструкции, где параметр "from" равен какой-то дате происходит моргание данных в окне "Окно данных".

Если применять в CopyTicks параметр "from"==0, моргания нет.

Что же мне так везет на баги. Похоже, никто CopyTicks не применяет, раз бажные рапорты только от меня.

 
fxsaber:
Вправо всегда копируется: Ticks[0] - всегда самый "левый" (с наименьшим временем рождения) тик. Грубо говоря, Ticks[] всегда отсортирован по возрастанию времени рождения тиков.
Это он так уже записывается в буфер, а по сути запроса - это два разных направления: один запрашивает от сюда и вглубь, а второй запрашивает из глубины истории и до сюда.
 
Karputov Vladimir:
Это он так уже записывается в буфер, а по сути запроса - это два разных направления: один запрашивает от сюда и вглубь, а второй запрашивает из глубины истории и до сюда.
Можно, конечно, в данном случае переписать
GetFreshTicks
с вариантом from == 0, но это не дело совсем. Надо выправлять CopyTicks. В Сервисдеск снова?
 
fxsaber:
Можно, конечно, в данном случае переписатьс вариантом from == 0, но это не дело совсем. Надо выправлять CopyTicks. В Сервисдеск снова?

Да. И не забудьте примеры, на которых явно видно локализованная проблема (from=0 и from=определённая дата).

 

Добавлено: фсё, я спать. 

 
мне одному ТС напоминает по манере и всему остальному hrenfx?)) побольше бы таких героев (никакого сарказма,все реально). должен же кто-то пинать сервисдеск и разрабов чем-то помимо -нарисуйте мне тут в терминале стрелочку другого цвета или прилепите кнопку не сюда,а вооон-туда)