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

 

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

Подскажите, пожалуйста, как в индикаторе наладить его работу только на открытии бара, а не на каждом тике и как сделать, чтобы он не бегал каждый раз (на каждом новом баре) по всей истории?

Заранее благодарю.

Ростислав


 
Rost17:  Подскажите, пожалуйста, как в индикаторе наладить его работу только на открытии бара, а не на каждом тике и как сделать, чтобы он не бегал каждый раз (на каждом новом баре) по всей истории?
datetime t;
Сначала о барах. При формировании нового бара в Time[0] записывается новое значение - время открытия бара.
OnCalculate(...)
{
  if(Time[0] == t) return(0); // Если этот БАР обработан --> выход
  t = Time[0];

Теперь по всей истории: тормозить будет
 
STARIJ:
datetime t;
Сначала о барах. При формировании нового бара в Time[0] записывается новое значение - время открытия бара.
OnCalculate(...)
{
  if(Time[0] == t) return(0); // Если этот БАР обработан --> выход
  t = Time[0];

Теперь по всей истории: тормозить будет

Спасибо за быстрый ответ. Я же и спрашиваю, как сделать, чтоб НЕ тормозил и не бегал по всей истории при появлении нового бара, а просто обрабатывал новый бар...

Сейчас организовано так: for(int i=limit-1; i>=0; i--) и как я понимаю, это значит, что на каждом открытии бара, все значения по всей истории будут пересчитаны снова, а нужно сделать работу только по последнему бару...

 
Rost17:  Я же и спрашиваю, как сделать, чтоб НЕ тормозил и не бегал по всей истории при появлении нового бара, а просто обрабатывал новый бар...

Вот как рассчитывается на последнем баре:

//| Bears Power                                                      |
//+------------------------------------------------------------------+
int OnCalculate(.....)
  {
   int limit=rates_total-prev_calculated; // Количество баров, которые будем считать = ВсегоБаров - РанееПросчитано
   if(rates_total<=InpBearsPeriod) return(0);

   if(prev_calculated>0) limit++; // Если давно считаем, то захватим и предыдущий бар для точности
   for(int i=0; i<limit; i++)
     {
      ExtTempBuffer[i]=iMA(NULL,0,InpBearsPeriod,0,MODE_EMA,PRICE_CLOSE,i);
      ExtBearsBuffer[i]=low[i]-ExtTempBuffer[i];
     }
   return(rates_total);
  }
 
STARIJ:

Давайте сначала рассмотрим строку

чтоб мне было понятней переписал так

Ага!!! Теперь начинаю понимать... В цикле переменная a меняется от 1 до 6. При значениях этой переменной 1, 5 и 6 какие-либо действия отсутствуют. Тогда просто

или в Вашем стиле

Результат будет тот же, но выполнится быстрее

Теперь Вам надо избавиться от функции Statistic ?  Нужно написать ее тело подряд три раза, заменить в каждой из трех частей формальные параметры фактическими и удалить дублирование объявлений переменных. Общий код будет чуть длиннее, но выполнение ускорится. Есть смысл выбросить print() - кто же именно в это время будет журнал сообщений смотреть? - или заменить на Alert(), чтоб на экран вылазило.  Еще там переменная namZz2 - ее значение меняется?


Мне наоборот нужно оставить статистик а сделать перебор массивов в статистике() а не через стат(). По тупому я знаю что можна три раза переписать как Вы сказали но проблема в том что скорее всего по результатм сбора статистики прийдется еще массивы добавлять и я рано или поздно вернусь на исходные. Потому и озвучиваю задачу конкретно а вы мне предлагаете простые пути которые я и так знаю они к сожалению приведут меня к началу. Потому и смотрю вперед чтобы не возвращать в будущем к этому!

 

for(int a=1;a<6;a++)
{
   if(a==2){Statistic(mZz2,namZz2);}
   if(a==3){Statistic(mZz3,namZz3);}
   if(a==4){Statistic(mZz4,namZz4);}
}

как этот код вставить в статистик !? чтоб было одной процедурой вы в начало как я вопрос озвучил посмотрите пожалуйста !

 
STARIJ:

Вот как рассчитывается на последнем баре:

Спасибо большое! У меня очень старый исходник индикатора. Не могли бы Вы его поправить так, чтоб он не пересчитывал каждый раз всю историю, работал только по закрытию бара и ставил стрелочку только на том баре, после закрытия которого сигнал появился? Ну, и в новом стиле, с OnCalculate... Я готов компенсировать затраты Вашего времени... Если Вы согласны, то как это лучше сделать? Можно послать в личку или где?
 
Игорь:

Вот выдержка из рабочего кода ! Как собрать это в одной void Statistic без промежуточной void Stat !? То что Вы предлагаете мне нужно весь код перетачивать чтобы все массивы в один собрать и потом оттуда выцарапывать !

Приведенная вами выдержка из рабочего кода либо неверная либо ваша функция Statistic() ничего не делает кроме принта при вызове из Stat().

У вас она завершает работу сразу после return; в любом случае. 

Вы полностью код приведите чтобы было понятно что вы хотите.

 

К сведению. Слишком много веток на форуме для помощи новичкам по MQL4.

Данная ветка теперь не поддерживается и закрыта.


Просьба все свои вопросы направлять в любую из нижеследующих активных веток:

https://www.mql5.com/ru/forum/160683

https://www.mql5.com/ru/forum/160587

Все последующие посты в этой ветке будут удаляться.


 
 помогите может у уже купленного ордера через 2 часа поменяться цена покупки
 
хочу картинку с маинкрафтовским персонажем и кайло в руки когда профит прёт. как сделать ?
Причина обращения: