Любой вопрос новичка, чтоб не захламлять форум. Профи, не проходите мимо. Без вас никуда - 6. - страница 561

 
Forexman77:

Уважаемые, нужна Ваша помощь.

Оптимизирую советника по индикатору, код индикатора ниже.

Оптимизация происходит медленно, в советнике сделал код, чтобы индикатор пересчитывался на новом баре, что не совсем подходит.

Просьба, посмотреть код индикатора, что в нем можно сделать, чтобы пересчет происходил быстрее.


почему ВЫ решили что это индикатор виноват?
 
Vladon:

посчитать количество символов, + размер шрифта, как то так?

Размер шрифта не дает нужного знания. Нужно нарисовать несколько объектов один над другим. Точка привязки есть только у первого объекта. Как получить точку привязки 2-го и последующих объектов?
 
Vladon:


Принудительное завершение советника в случае когда сам пользователь выгружает эксперта.

лучше данные записывать непосредственно в старте.

Не получается через start. Та-же картина.
----------------------------------------------------
stringo 25.03.2014 13:28

Время работы deinit ограничено 10 секундами.

В тестере при нормальном завершении стоп-флаг не выставляется поэтому deinit спокойно завершается.

----------------------------------------------------

Может быть ограничение в 10 секунд наложено на работу любой функции?
 
Здравствуйте! При изучении MQL4 возник небольшой вопрос. Задача размещена в учебнике на этом сайте. Вот условие: Задача 25. Составить программу, в которой реализуются следующие условия: если курс поднялся выше заданного уровня, то выдать сообщение, в котором словами обозначено превышение над уровнем (до 100 пунктов); в остальных случаях сообщить, что курс не превышает заданный уровень.
А вот предложенное решение:
//--------------------------------------------------------------------
extern double Level=1.3200;                     // Заданный уровень 
string Text[101];                               // Объявление массива
//--------------------------------------------------------------------
int init()                                      // Спец. ф-ия init()
  {                                             // Присвоение значений
   Text[1]="один ";            Text[15]="пятнадцать ";
   Text[2]="два ";             Text[16]="шестнадцать ";
   Text[3]="три ";             Text[17]="семнадцать ";
   Text[4]="четыре ";          Text[18]="восемнадцать ";
   Text[5]="пять ";            Text[19]="девятнадцать ";
   Text[6]="шесть ";           Text[20]="двадцать ";
   Text[7]="семь ";            Text[30]="тридцать ";
   Text[8]="восемь ";          Text[40]="сорок ";
   Text[9]="девять ";          Text[50]="пятьдесят ";
   Text[10]="десять ";         Text[60]="шестьдесят";
   Text[11]="одиннадцать ";    Text[70]="семьдесят ";
   Text[12]="двенадцать ";     Text[80]="восемьдесят ";
   Text[13]="тринадцать ";     Text[90]="девяносто";
   Text[14]="четырнадцать ";   Text[100]= "сто";
   // Вычисление значений
   for(int i=20; i<=90; i=i+10)                // Цикл по десяткам
     {
      for(int j=1; j<=9; j++)                  // Цикл по единицам
         Text[i+j]=Text[i] + Text[j];          // Вычисление значения   
     }
   return;                                     // Выход из init()
  }
//--------------------------------------------------------------------
int start()                                     // Спец. ф-ия start()
  {
   int Delta=NormalizeDouble((Bid-Level)/Point,0);// Превышение 
//--------------------------------------------------------------------
   if (Delta>=0)                                // Цена не выше уровня
     {
      Alert("Цена ниже уровня");                // Сообщение
      return;                                   // Выход из start()
     }
//--------------------------------------------------------------------
   if (Delta<100)                               // Цена более 100
     {
      Alert("Более ста пунктов");               // Сообщение
      return;                                   // Выход из start()
     }
//--------------------------------------------------------------------
   Alert("Плюс ",Text[Delta],"pt.");            // Вывод на экран
   return;                                      // Выход из start()
  }
//---------------------------------------------------------------------
По-моему в условных операторах неправильно проставлены знаки сравнения. Они должны быть с точностью до наоборот. Скажите прав ли я? И если нет, то почему так?  
 
Vladon:

почему ВЫ решили что это индикатор виноват?

Вот к примеру оптимизировал AMA, гораздо быстрее оптимизация, хотя индикатор сложный.

Точно не буду утверждать, что индикатор виноват. Опыта пока у меня маловато.

Но, как его ускорить? Все ли правильно сделал здесь или что-то можно изменить?

В принципе достаточно, чтобы индикатор расчитывался по последним 100 барам, но если ставлю вместо 500 цифру 100 значения пропадают.

extern int Limit=70;

if(counted_bars<0) return(-1);
   if(counted_bars>0) counted_bars--;
 
   limit1=Bars-counted_bars-1;
   if (limit1>Limit && Limit>0) limit1=Limit;
   limit2=limit1;
   limit3=limit2;
   limit4=limit3;
   if(limit1>0) 
     {
      limit1=500-Period_MA_1-1;
      limit2=limit1-p2;
      limit3=limit2-p3;
      limit4=limit3-p4;
     }
Если на такой скорости проводить оптимизацию, к ее завершению борода до пола вырастет и заработанные мульены не пригодятся) Ну, или рынок совсем другой станет.
 
alxm:
Добрый день. Подскажите, можно ли как то программно определить или рассчитать ширину/высоту на графике графического объекта OBJ_TEXT?

Текст наверное нет, а вот лейбл пожалуйста

docs.mql4.com/ru/constants/objectconstants/enum_object_property

Свойстве OBJPROP_XSIZE и OBJPROP_YSIZE

 
Vladon:


Спасибо за помощь с оператором цикла, все нормально получилось.
 
Forexman77:



Но, как его ускорить? Все ли правильно сделал здесь или что-то можно изменить?



Ну здесь сразу видна лажа при пересчете, к примеру добавился бар.

limit1=Bars-counted_bars-1;

лимит1 будет равен двум... А затем

 if(limit1>0) 
     {
      limit1=500-Period_MA_1-1;

Вобщем пересчет сделан полностью неправильно...

 
Vladon:



Большое спасибо, хорошего дня :) >
 
splxgf:


Ну здесь сразу видна лажа при пересчете, к примеру добавился бар.

лимит1 будет равен двум... А затем

Вобщем пересчет сделан полностью неправильно...

А как правильно? Для этого спрашиваю. Не совсем хорошо знаю как считать индикаторы.

Предположу:
limit1=Bars-counted_bars;

должно быть так?

А вот здесь вообще не знаю

if(limit1>0) 
     {
      limit1=500-Period_MA_1-1;
Если в целом, мне достаточно, чтобы индикатор расчитывался по последним 100 барам.
Причина обращения: