Ошибки, баги, вопросы - страница 1343

 
StrategyTester:

Здравствуйте.

Вопрос по МТ5 и его Тестеру.

Есть самописный мультивалютный эксперт, вызывающий самописный мультивалютный индикатор, расчитывающий некие соотношения между двумя валютными парами. В процессе тестирования и отладки обнаружил проблему: в Терминале в какой-то момент времени линия "А" выше линии "Б", а в тестере в тот-же момент времени и при тех же настройках индикатора при включенной визуализации линия "А" ниже линии "Б". И в целом: вид линий индикатора в Терминале кардинально отличается от вида в Тестере. Вопрос: это глюк Тестера МТ5 или ошибки в коде?


Уточню: наблюдается именно перерисовка индикатора.

 
Karputov Vladimir:
Всегда индикатор рисуется так, как в терминале. Возможно в тестере Вам нужно испробовать несколько режимов (все тики, математические цены и так далее).
Попробовал "Все тики", "OHLC на М1", "Только цены открытия". Результат тот-же - индикатор перерисовывается. Опция "Математические вычисления" не активна, не доступна.
 
StrategyTester:
Попробовал "Все тики", "OHLC на М1", "Только цены открытия". Результат тот-же - индикатор перерисовывается. Опция "Математические вычисления" не активна, не доступна.
В таком случае код в студию.
 

Вопрос к разработчикам:  при каких условиях история по символу считается несинхронизированной,  т.е.  SeriesInfoInteger(symbol, period, SERIES_SYNCHRONIZED) возвращает false?

Дело в том, что у меня время от времени возникает ситуация, когда по некоторому символу постоянно выдаётся false по всем таймфреймам,  хотя история для него имеется (Bars и другие функции возвращают ненулевые значения).  В чём может быть причина?

 

И ещё такая проблемка. Может у кого тоже встречается.  В индикаторе при чтении истории по нескольким символам/таймфреймам через CopyTime, CopyClose и т.д.  часто происходит моргание индикатора.   Это не результат отрисовки (пересчёт баров там не происходит), а просто всё изображение пропадает на доли секунды, и затем снова появляется.  А бывает что и не на доли, а на целые секунды.  Обычно это наблюдается при прокрутке графика.   Если же запрашиваемых таймсерий мало, то проблема не возникает. 

Хотелось бы услышать комментарий разработчиков, как это может быть связано.

 
Karputov Vladimir:
В таком случае код в студию.

Прилагаю иллюстрацию различий в терминале и тестере и код индикатора.

//+------------------------------------------------------------------+
//|                                             Indicator1_6test.mq5 |
//+------------------------------------------------------------------+
#property copyright ""
#property link      ""
#property version   "1.6"
#property indicator_separate_window
#property indicator_separate_window
#property indicator_buffers 2
#property indicator_plots 2
#property indicator_color1 SkyBlue
#property indicator_color2 Yellow
#property indicator_type1 DRAW_LINE
#property indicator_type2 DRAW_LINE
//---
enum TT{_close=0,_open=1,_high=2,_low=3};
//---
input string activ1="GBPUSD",activ2="EURUSD";
input TT PriceType=_close;
input int Len=100;
//---
double ratio[],avr[];string NN[]={"rr1","rr2","aa1","aa2"};
//---
void setv(int i,double v){ObjectSetDouble(0,NN[i],OBJPROP_PRICE,v);}
//---
int OnInit()
{
   SetIndexBuffer(0,ratio);
   PlotIndexSetString(0,PLOT_LABEL,"Ratio");
   SetIndexBuffer(1,avr);
   PlotIndexSetString(1,PLOT_LABEL,"Avr");
   ArraySetAsSeries(ratio,1);
   ArraySetAsSeries(avr,1);
   for(int i=0;i<4;i++)ObjectCreate(0,NN[i],22,0,0,0);
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[])
{
int limit=0;double zz[4];

  if(prev_calculated==0){limit=MathMin(Bars(activ1,0),Bars(activ2,0));limit--;}
  else limit=rates_total-prev_calculated;
  if(limit==0)limit=1;
  double Price1[],Price2[]; ArraySetAsSeries(Price1,1); ArraySetAsSeries(Price2,1);
  getV(Price1,Price2,limit);
  for(int i=0;i<limit;i++){if(Price1[i]>0&&Price2[i]>0)ratio[i]=Price1[i]/Price2[i];else ratio[i]=ratio[i+1];}
  
  double sred=0,sum=0; 
  for(int i=0;i<limit;i++)
      {
      sred=0;
      avr[i]=SimpleMA(i,Len,ratio);
      
      for(int j=i;j<i+Len;j++)
        {
        if(j>=ArraySize(ratio))break;
      if(ratio[j]==0||ratio[j]==EMPTY_VALUE){sred=0;break;}
      sred=1;
        }
      }
      
  if(prev_calculated!=0)for(int i=0;i<10;i++)if(ratio[i]==0)ratio[i]=ratio[i+1];
  
zz[0]=ratio[1];zz[1]=ratio[2]; zz[2]=avr[1];zz[3]=avr[2];
for(int i=0;i<4;i++)setv(i,zz[i]);
return(rates_total);
}
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void getV(double&Price1[],double&Price2[],int limit)
{
if(PriceType==_close){CopyClose(activ1,PERIOD_CURRENT,0,limit,Price1);CopyClose(activ2,PERIOD_CURRENT,0,limit,Price2);}
if(PriceType==_open){CopyOpen(activ1,PERIOD_CURRENT,0,limit,Price1);CopyOpen(activ2,PERIOD_CURRENT,0,limit,Price2);}
if(PriceType==_high){CopyHigh(activ1,PERIOD_CURRENT,0,limit,Price1);CopyHigh(activ2,PERIOD_CURRENT,0,limit,Price2);}
if(PriceType==_low){CopyLow(activ1,PERIOD_CURRENT,0,limit,Price1);CopyLow(activ2,PERIOD_CURRENT,0,limit,Price2);}
}
//---
double SimpleMA(const int position,const int period,const double &price[])
  {
//---
   double result=0.0;
//--- check position
      //--- calculate value
      if(position+period+1>ArraySize(price))return(0);
      for(int i=0; i<period; i++) result+=price[position+i];
      result/=period;
   return(result);
  }
//---
 

Вообще с функциями

Copy

есть и другие проблемы,

я столкнулся с тем что при вызове этой функции она может "заморозить" советник, писал программу с использованием большого числа символов и делал расчеты на истории буквально за 3 последних дня на каждом символе,

так вот бывали моменты когда все зависало на несколько минут , с трудом определил что это функции Copy .  При этом функция спакойно обрабатывала 150-200 символов затем зависала, зависания происходили на разных символах...

время зависания колебалось от 5 секунд до 2-3 минут...

 
Copy функции в экспертах синхронные и ожидают подкачки данных, если их нет.
 
StrategyTester:

Прилагаю иллюстрацию различий в терминале и тестере и код индикатора.

Ошибка в функции:

//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void getV(double&Price1[],double&Price2[],int limit)
  {
   if(PriceType==_close)
     {
      CopyClose(activ1,PERIOD_CURRENT,0,limit,Price1);
      CopyClose(activ2,PERIOD_CURRENT,0,limit,Price2);
     }
   if(PriceType==_open)
     {
      CopyOpen(activ1,PERIOD_CURRENT,0,limit,Price1);
      CopyOpen(activ2,PERIOD_CURRENT,0,limit,Price2);
     }
   if(PriceType==_high)
     {
      CopyHigh(activ1,PERIOD_CURRENT,0,limit,Price1);
      CopyHigh(activ2,PERIOD_CURRENT,0,limit,Price2);
     }
   if(PriceType==_low)
     {
      CopyLow(activ1,PERIOD_CURRENT,0,limit,Price1);
      CopyLow(activ2,PERIOD_CURRENT,0,limit,Price2);
     }
  }

Вы пытаетесь с наскоку копировать данные другого символа. Так делать нельзя. Данные нужно сначала загрузить, подготовить, удостовериться... Вот описание: Организация доступа к данным 

 
Karputov Vladimir:

Ошибка в функции:

Вы пытаетесь с наскоку копировать данные другого символа. Так делать нельзя. Данные нужно сначала загрузить, подготовить, удостовериться... Вот описание: Организация доступа к данным 

Спасибо за подсказку. Буду смотреть.
Причина обращения: