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

 

Не работает ArrayInitialize код прилагается если раскоментировать цикл то все нормально.

И еще при обьявлении переменных в классе и индикаторе на глобальном уровне с одинаковыми именами - выскакивает предупреждение .

#property indicator_separate_window
#property indicator_buffers 2
#property indicator_plots   2
//--- plot Line1
#property indicator_label1  "Line1"
#property indicator_type1   DRAW_LINE
#property indicator_color1  clrRed
#property indicator_style1  STYLE_SOLID
#property indicator_width1  1
//--- plot Line2
#property indicator_label2  "Line2"
#property indicator_type2   DRAW_LINE
#property indicator_color2  clrBlue
#property indicator_style2  STYLE_SOLID
#property indicator_width2  1
//--- indicator buffers
double         Line1Buffer[];
double         Line2Buffer[];
//+------------------------------------------------------------------+
int OnInit()
  {
   SetIndexBuffer(0,Line1Buffer,INDICATOR_DATA);
   SetIndexBuffer(1,Line2Buffer,INDICATOR_DATA);
   ArraySetAsSeries(Line1Buffer,true) ;
   ArraySetAsSeries(Line2Buffer,true) ;
   ArrayInitialize(Line1Buffer,EMPTY_VALUE) ;
   ArrayInitialize(Line2Buffer,EMPTY_VALUE);
   return(0);
  }
//+------------------------------------------------------------------+
int OnCalculate(const int rates_total,
                const int prev_calculated,
                const int begin,
                const double &price[])
  {
      ArraySetAsSeries(price,true) ;
      int i ;
     /* for(i=0; i<rates_total;i++)
         {
            Line1Buffer[i]=EMPTY_VALUE;
            Line2Buffer[i]=EMPTY_VALUE ;
         }*/
      for(i=0;i<100;i++)
         {
            Line1Buffer[i]=price[i] ;
         }
   return(rates_total);
  }
//+------------------------------------------------------------------+
 

 На выходных, пока не было тиков, отлаживал индикатор на демо-счетах, прогоняя на последнем билде двух экземпляров терминала MT5, но от разных компаний: MetaQuotes и EGlobal. Настройки везде одинаковые. Для верности проверял в офф-лайне, поэтому тиковый фактор исключён.

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

#property indicator_chart_window
#property indicator_buffers 1
#property indicator_plots   1

double Buffer[];
int handle;

int OnInit()
  {
   SetIndexBuffer(0,Buffer,INDICATOR_DATA);

   handle=iFractals(_Symbol,PERIOD_CURRENT);
   if(handle==INVALID_HANDLE) return(-1);

   return(0);
  }

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[])
  {
   Print(1);

   return(rates_total);
  }

 1. EGlobal.                                                                                                  2. MetaQuotes.EGlobal MetaQuotes

 Оба терминала полностью выгружал (проверял через Менеджер Задач по процессам в памяти), загружал по новой и на всякий случай перекомпилировал оба кода. В итоге - без изменений.

 
Тут ничего удивительного, так и должно быть. 
 

По разному работают MathRound() в 4-ке и в 5-ке, а должно бы одинаково.

4-шный код:

int start()
{
  double minlot=0.01;
  double step  =0.01;
  Print(minlot+step*MathRound((0.005 - minlot)/step));
  return(0);
}

5-шный код:

void OnStart()
{
  double minlot=0.01;
  double step  =0.01;
  Print(minlot+step*MathRound((0.005 - minlot)/step));
}
 
joo:

По разному работают MathRound() в 4-ке и в 5-ке, а должно бы одинаково.

4-шный код:

5-шный код:

Проблема тут:

  double y=MathRound(-0.5);
  Print("Округление -0.5 до ",y);

это значение по разному округляется в 4-ке и 5-ке.

 
Loky:
Тут ничего удивительного, так и должно быть. 
 А конкретнее?
 

Почему в МТ5 не сохраняется история ордеров и т.д., если прервать тестирование? В МТ4 сохранялось.

Также нет позиционирования в истории ордеров из графика тестирования - было удобно просматривать ордера в зоне крупных просадок, кликая по графику.

 

 Добрый вечер.

Объясните мне пожалуйста, Как работает метод SLeep() ?

ПО идее он должен приостанавливать работу эксперта на определенный интервал времени, или я не прав?


     {for (int sleep=0;sleep<10000;sleep++) 

        if (BarsCalculated(Handle)>=o_bars_reoptimizate)

        { Print(BarsCalculated(Handle)); break; } else Sleep(100);}

    

По данному коду, я жду результата такового - Если Количество Просчитанных баров определенного индикатора стало больше определенного значения, цикл прерывается; В ином случае происходит Задержка дальнейшего выполнения кода В размере 100мс  . Итого  возможная общая задержка 100*10000 мс....Достаточное время для просчета индикатора. Тогда почему код продолжает выполняться?( который следует за этим циклом) Или в тестере эта функция не работает так как я предполагаю. Заранее спасибо за разъяснения.

 
mi__x__an:

 

 Добрый вечер.

Объясните мне пожалуйста, Как работает метод SLeep() ?

ПО идее он должен приостанавливать работу эксперта на определенный интервал времени, или я не прав?


     {for (int sleep=0;sleep<10000;sleep++) 

        if (BarsCalculated(Handle)>=o_bars_reoptimizate)

        { Print(BarsCalculated(Handle)); break; } else Sleep(100);}

    

По данному коду, я жду результата такового - Если Количество Просчитанных баров определенного индикатора стало больше определенного значения, цикл прерывается; В ином случае происходит Задержка дальнейшего выполнения кода В размере 100мс  . Итого  возможная общая задержка 100*10000 мс....Достаточное время для просчета индикатора. Тогда почему код продолжает выполняться?( который следует за этим циклом) Или в тестере эта функция не работает так как я предполагаю. Заранее спасибо за разъяснения.

в индикаторах Sleep не работает
 

 Скрежет головного мозга вызывает документация, например, CopyBuffer: "Если необходимо произвести частичное копирование значений индикатора в другой массив (не индикаторный буфер), то для этих целей необходимо использовать промежуточный массив, в который копируется требуемое количество. И уже из этого массива-посредника произвести поэлементное копирование нужного количества значений в нужные места принимающего массива."

int  CopyBuffer(
   int       indicator_handle,     // handle индикатора
   int       buffer_num,           // номер буфера индикатора
   [...]
   );

 Если явно ссылаются на buffer_num, стало быть, безусловно подразумевается необходимость предварительного увязывания принимающего массива с индикаторным буфером под тем или иным порядковым номером через SetIndexBuffer под видом скорее всего INDICATOR_CALCULATIONS. Но "если необходимо произвести частичное копирование значений индикатора в другой массив (не индикаторный буфер)", то и речи быть не может ни о каком buffer_num, ибо он не индикаторный и мы его по определению ни с чем не увязывали.

 Противоречие?

 Двусмысленность?

 Или я совсем запрограммировался?

 Попытался самостоятельно найти чёткое определение индикаторного буфера и не смог. Таковым является любой, увязанный через SetIndexBuffer, или этого мало и надо, чтобы это был массив именно с идентификатором INDICATOR_DATA?

Причина обращения: