Индикатор или Эксперт - страница 4

 

17 экспертов с вызовами iCustom - это не менее 34 запущенных программ, у которых масса закешированных буферов (особенно у индикаторов). Уверен, что кроме экспертов, на графики явно наложены те же самые кастомные индикаторы. Грубым итогом будет 17 экспертов + 17 индикаторов в экспертах + 17 индикаторов на графиках = 51 MQL4 программ, запущенных в одном терминале. За удовольствие работать с таким количеством собственного кода надо платить. В данном случае - памятью. И 300Mb - это совсем мало.


Это ли не кривость реализации? А точнее плохая концепция которая к этому привела.

Вывод который можно сделать - все расчты нужно делать внутри эксперта и не использовать iCustom.


Индикатор расчитывается 1 раз, только его последний бар пересчитывается когда нужно.
iCustom фактически просто созвращает значение из буфера индикатора, т.е. это очень быстро.
Если гдето используется индикатор А, то вычисляется он только 1 раз,
независимо от того, сколько iCustom и где мы напишем.

Ну и мы гарантированно видим то же самое, что и эксперт
(эксперт на тик позже у меня получалось).

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


Если я правильно понял Славу то не все так просто....
Индикатор расчитывается в потоке который имеет меньший приоритет чем эксперт.
И есть возможность в эксперте дожидаясь значения от индикатора пропустить
квант времени который выделили эксперту.
 
Это ли не кривость реализации? А точнее плохая концепция которая к этому привела.

Я так думаю, что ВАМ стоит поумерить свой пыл и перестать употреблять слова про "кривость". Идите и реализуйте что-либо лучше нас. А мы посмотрим. Надоели крикуны, кто не в состоянии сам что-то сделать, но уверенные в том, что им должны все забесплатно на блюдечке приподнести.

Если я правильно понял Славу то не все так просто....
Индикатор расчитывается в потоке который имеет меньший приоритет чем эксперт.
И есть возможность в эксперте дожидаясь значения от индикатора пропустить
квант времени который выделили эксперту.

Опять домыслы. Индикатор, вызываемый из эксперта, работает в контексте эксперта, в его потоке и ничего не пропускает.
 
Пришлите, пожалуйста, заархивированный полный рабочий профайл со всеми окнами и используемыми экспертами с индикаторами на stringo @ . Нужен именно полный профайл.

Отправил папки профайле, лог, конфиг.

На текущий момент
RAM = 75800K
VM = 598660K
CPU = 1:44:52
(примерно за сутки)
 
goldenlion, удачи вам. но не у нас.
 
Ренат, вы не правы.
goldenlion все правильно говорит,
а вы просто горячитесь.

goldenlion,
300Мег - это не кривость, это баг, и я надеюсь его найдут и исправят.
Реально МТ с 17 чартами, 34 индикаторами и 17 экспертами занимает 5-10 М оперативки и ~20М виртуальной памяти.

МТ действительно очень экономичен по ресурсам.
 
Ренат, вы не правы.
goldenlion все правильно говорит,
а вы просто горячитесь.

Все очень просто - за многократные попытки унизить нас и наши разработки - однозначный бан.
 
17 экспертов с вызовами iCustom - это не менее 34 запущенных программ, у которых масса закешированных буферов (особенно у индикаторов). Уверен, что кроме экспертов, на графики явно наложены те же самые кастомные индикаторы. Грубым итогом будет 17 экспертов + 17 индикаторов в экспертах + 17 индикаторов на графиках = 51 MQL4 программ, запущенных в одном терминале. За удовольствие работать с таким количеством собственного кода надо платить. В данном случае - памятью. И 300Mb - это совсем мало.

Дело тут в другом и ошибок нет - наращивайте память.

Менее чем за 20 часов работы МТ - VM использовано 526Мб,
и продолжает расти с той же скоростью.

Ренат, посоветуйте, сколько мне нужно поставить памяти в комп,
чтобы хватило хотя бы на неделю непрерывной работы?

И вы будете продолжать настаивать что это не баг а фича?
:))

вскрытие показало, что быстрый расход памяти происходит из-за её фрагментации. фрагментация происходит от распределения памяти под временную строку с последующим освобождением (утечка памяти здесь была - мы не освобождали временные строки). пример проблемы
      Log(5,"ASC_Trend_Prev = "+ASC_Trend_Prev+
         " buf0[i] = "+buf0[i]+" buf1[i] = "+buf1[i]);


в результате передачи всего одного строкового параметра были созданы, а потом уничтожены 5 временных строк.
данную проблему вылечил вот такой код

string str_parameter="                                                                                ";
...
      str_parameter="ASC_Trend_Prev = "+ASC_Trend_Prev;
      str_parameter=str_parameter+" buf0[i] = ";
      str_parameter=str_parameter+buf0[i];
      str_parameter=str_parameter+" buf1[i] = ";
      str_parameter=str_parameter+buf1[i];
      Log(5,str_parameter);


в связи с этим мы введём функцию StringConcatenate, чтобы не плодить временных строк

      str_parameter=StringConcatenate("ASC_Trend_Prev = "+ASC_Trend_Prev+" buf0[i] = "+buf0[i]+" buf1[i] = "+buf1[i]);


то есть, это баг, но не совсем наш

 

Информация очень существенная ! Из нее следует, что в эксперте
практически ничем нельзя пользоваться из того, что делает
индикатор полезным. Все надо делать своими руками.

зачем? чем отличается индикатор на графике и индикатор, вызванный из эксперта? практически только одним моментом - индикатор, вызванный из эксперта, не отрисовывается на графике! И ВСЁ.

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

Слава, Ваш ответ меня устраивает, поскольку проясняет суть дела.
Но этого недостаточно, поскольку теперь возникает куча новых
вопросов. Например:
Ни буферы, ни средства их использования получается в экспертах
использовать нельзя. Чего еще нельзя делать в экспертах ?
Как сами разработчики представляют стратегию использования
индикаторов и экспертов ? И т.д.

это не вопрос.

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

К пониманию разницы между экспертом и индикатором и стремятся все
на этом форуме. К сожалению как правило они получают не объяснения по
сути ( ведь сколько раз уже им, бестолковым, разработчики все объясняли ),
а полемику на тему "кто правее" или колкости Рената.

Ренат, если вы удалили goldenlion за некорректность, то по логике вещей
должны удалить и себя. Вы явно обошли его в этом соревновании.
 
вскрытие показало, что быстрый расход памяти происходит из-за её фрагментации. фрагментация происходит от распределения памяти под временную строку с последующим освобождением (утечка памяти здесь была - мы не освобождали временные строки). пример проблемы

Похоже на то.
Убрал вызов Log() из индикатора, утечка пропала.
Сейчас терминал (со всеми 17 чартами) использует 14280К виртуальной памяти,
и утечки нет.
в результате передачи всего одного строкового параметра были созданы, а потом уничтожены 5 временных строк.
данную проблему вылечил вот такой код

А такой записи недостаточно?
str = "ASC_Trend_Prev = "+ASC_Trend_Prev+
         " buf0[i] = "+buf0[i]+" buf1[i] = "+buf1[i];


Тут тоже будет утечка?

в связи с этим мы введём функцию StringConcatenate, чтобы не плодить временных строк

ИМХО, неудачный вариант (?).
1. просто неудобно везде это писать, громоздко получается и легко забыть.
2. проблема вроде бы так не снимается - то же выражение в качестве параметра функции используется.
3. проблема только в индикаторе вызываемом через iCustom, в эксперте есть такой же вызов Log() и это никак не проявляется.

Но в любом случае спасибо.

 

А такой записи недостаточно?
str = "ASC_Trend_Prev = "+ASC_Trend_Prev+
         " buf0[i] = "+buf0[i]+" buf1[i] = "+buf1[i];


Тут тоже будет утечка?


не утечка. но будут созданы и уничтожены 3 временные переменные. из-за переобразований.
поясняю, представленное выражение будет развёрнуто в примерно такой трёхадресный код
MOV_SI   Temp1,ASC_Trend_Prev
ADD_SSS  str,"ASC_Trend_Prev = ",Temp1
FREE        Temp1
ADD_SSS  str,str," buf0[i] = "
MOV_SI   Temp1,buf0[i]
ADD_SSS  str,str,Temp1
FREE        Temp1
ADD_SSS  str,str," buf1[i] = "
MOV_SI   Temp1,buf1[i]
ADD_SSS  str,str,Temp1
FREE        Temp1



в связи с этим мы введём функцию StringConcatenate, чтобы не плодить временных строк

ИМХО, неудачный вариант (?).
1. просто неудобно везде это писать, громоздко получается и легко забыть.

не пишите. никто не заставляет. но получите неоправданный расход памяти.

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

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

3. проблема только в индикаторе вызываемом через iCustom, в эксперте есть такой же вызов Log() и это никак не проявляется.

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

Но в любом случае спасибо.

Вам спасибо. будем работать над кодогенерацией