Странные примеры от разработчиков.. - страница 2

 

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

Просто, в то время структурное программирование только создавалось, об объектно-ориентированном программировании и слухов не возникало и все широко использовали оператор GOTO. 

В день начисления зарплаты выслуга лет начфина составила ровно 30 лет, а в GOTO было только больше 30 и меньше. 

Мораль: 1. Абсолютно все специалисты, плотно знакомые с программированием на процедурных языках, всегда учитывают все непредвиденные факторы, вплоть до падения Тунгусского метеорита на Форт Нокс. Пытаются. 

2. Насчет ООП додумайте сами. Не затруднит? 

 

Алексей Тарабанов:

2. Насчет ООП додумайте сами. Не затруднит? 

Нет, конечно. Пришлось.. Что бы научится писать индюк в индюке. Проект предстоит достаточно сложный. Что бы не заморачиваться по этому поводу, проще поглядеть как это сделал кто-то. Я стараюсь логику писать, а попутные вопросы, которые уже пройдены давно не лопатить. Как говорится, не зачем изобретать велосипед, когда он уже есть.

Свой вариант я приложил..

Файлы:
MACD.mq5  14 kb
 
Viktar Dzemikhau:

Нет, конечно. Пришлось.. Что бы научится писать индюк в индюке. Проект предстоит достаточно сложный. Что бы не заморачиваться по этому поводу, проще поглядеть как это сделал кто-то. Я стараюсь логику писать, а попутные вопросы, которые уже пройдены давно не лопатить. Как говорится, не зачем изобретать велосипед, когда он уже есть.

Свой вариант я приложил..

Ваш вариант сверху. Внизу стандартный.


 
Alexey Kozitsyn:

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

В 5ке без перезагрузки - неважно. С каждым новым баром количество баров в окне увеличивается и таки теоретически может быть и уменьшено до заданного.

Alexey Kozitsyn:

Сейчас достаточно prev_calculated <= 0. По крайней мере я пишу так и проблем с этим не замечал.

Алексей Тарабанов:

Все просто, горячие эстонские парни: первое условие выделяет диапазон недопустимых значений, а второе - диапазон рабочих значений. 

В первом случае пересчитывается все, а во втором - только то, что не было обработано ранее. 

согласен)

 
Сергей Таболин:

Ваш вариант сверху. Внизу стандартный.


Согласен. Пропарил. На улицк шёл, прогуляться и подумать.. Поспешил. Вот правильный вариант.

Единственное, так я изменил в блоке:

    if (countedBars == 0)
      return 0;
    else
      return countedBars - 2;
  }

Эту строку:

      return countedBars - 1;

На:

      return countedBars - 2;

Разницы в вычислении не обнаружено. Я так всегда делаю.

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

Файлы:
MACD.mq5  16 kb
 
Aleksey Lebedev:

В 5ке без перезагрузки - неважно. С каждым новым баром количество баров в окне увеличивается и таки теоретически может быть и уменьшено до заданного.

согласен)

Я и говорю про пятерку. И это важно. Запустите простой индикатор:

#property indicator_chart_window
#property indicator_plots 0
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- indicator buffers mapping

//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
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(__FUNCTION__,": rt = ",rates_total,", pc = ",prev_calculated);
//--- return value of prev_calculated for next call
   return(rates_total);
  }
//+------------------------------------------------------------------+

Посмотрите, какое значение будет возвращено терминалом. Далее, измените настройку "Макс. баров в окне" сначала на большее значение, чем было, потом на меньшее. И посмотрите, что будет возвращать индикатор. Если хотите запустить сегодня - нажимайте кнопку "Обновить".

Про какое "теоретически" Вы говорите? Приведите конкретный пример, когда количество баров на чарте вдруг уменьшилось.

 
Viktar Dzemikhau:

...........

Я ради интереса переписал МАКД и он стал меньше в раза 2, чем был. Удивляюсь, нафига так раздувать код..

.......

Вверху Ваш, внизу стандартный.

Где именно раздутие?

 
Сергей Таболин:

Вверху Ваш, внизу стандартный.

Где именно раздутие?

Там была какая-то левая кодировка. Изменил на UTF без BOM. Теперь размер уменьшился до 8кб ))

Если пойти дальше.. Можно вынести в библиотеку обе функции, которые я написал и размер станет уже меньше. Но суть не в этом.

Вы же понимаете, что ООП придумано не для того, что бы сэкономить место на написании индикатора в 120 строк, а для крупных проектов, где повторяются какие-то вещи. Так вот, кто привык писать объектно меня поймёт. А кто привык писать процедурно.. тоже может понять))

Тем более, здесь в плане производительности нет разницы никакой т.к. рассчёты те же. Размер больше лишь за счёт пробелов, которые я добавляю между блоками для читабельности кода и за счёт того, что добавлены функции, т.е. названия их и параметры в каждой строки. Опять-таки для удобства. А если захотеть, можно запачковать при надобности серьёзнее. Но в этом нет резона, как я вижу.

Но вот есть один момент. Там таймсерии копируются с буферов машек с 0-го индекса по последний. ВОт тут как-бы косяк. Можно было бы докопировать только то, что не скопировано. Но это мне щяс влом делать т.к. занят я логикой того, что щяс пишу. Поэтому оставлю этот вопрос на когда-нить потом, если понадобится.

 
Aleksey Lebedev:

В 5ке без перезагрузки - неважно. С каждым новым баром количество баров в окне увеличивается и таки теоретически может быть и уменьшено до заданного.

Чушь полнейшая. Я написал в том индикаторе, что выше приводил принт:

  Print("barsCount = ", barsCount, " ; countedBars = ", countedBars);

В окне 100000 баров. А в принте 5011 с чего-то вдруг. Почему принтует левое значение.. хз

Суть такова, что в процессе работы индикатора я менял с 100 тыс баров до 5 тыс. баров и принтуется одинаковое значение баров. Посему эту строку можно вычёркидвать т.к. она абсолютно левая и не нужная вообще.

Я имею ввиду:

  if (countedBars > barsCount || countedBars < 0)
 
Viktar Dzemikhau:

Чушь полнейшая. Я написал в том индикаторе, что выше приводил принт:

В окне 100000 баров. А в принте 5011 с чего-то вдруг. Почему принтует левое значение.. хз

Суть такова, что в процессе работы индикатора я менял с 100 тыс баров до 5 тыс. баров и принтуется одинаковое значение баров. Посему эту строку можно вычёркидвать т.к. она абсолютно левая и не нужная вообще.

Я имею ввиду:

Кроме rates_total, prev_calculated есть ещё величины, которые стоит отслеживать, если есть непонимание процесса: количество баров на графике, название символа и таймфрейм. 

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