Помогите научиться программировать. - страница 4

 

Dmitry Fedoseev:
Пересчитывает каждый раз, или не пересчитывают

Вы так ничего и не поняли. Свет клином на PositionTotal() не сошелся. Я просто отметил, что так делать - плохо.

Dmitry Fedoseev:
Но вместо того, что бы привести убойный эксперимент

Что в моем эксперименте вас не устраивает? Разве компилятор заоптимизировал-закэшил результат первого вызова?

вот такое он точно оптимизирует: for (int i = 0; i < 1+2 ; i++) {}

или такое: const int X = 1 ; for (int i = 0; i < X+2; i++) {}

а такое точно нет: int X = 1 ; for (int i = 0; i < X+1; i++) {} ибо не телепат, и хз чего и где там с этим X может происходить, вдруг оно модифицируется в теле цикла или опосредованно по ссылке/указателю например? Будет как миленький на каждую итерацию производить сложение 'X+1'. Даже если убрать '+1' все равно использовать будет текущее значение 'X', если эта икс не объявлена как константа.

И уж тем более не кэширует результат, возвращаемый функцией, Карл! (предвосхищая ваше "а если for (int index=f();;)" - тут вызов ровно один раз, при инициализации index).

Dmitry Fedoseev:
А компилятор - имелось в виду, что он оптимизирует код и происходит непосредственное обращение к переменной, а не через функцию

ну да, конечно, компилятор точно знает ситуацию на рынке и уверен, что вызов функции всегда возвращает одно значение, зачем тогда вообще эту функцию вызывать более одного раза, достаточно в OnInit() разок, запомнить себе результат, и ладушки!

И ему все равно, что даже в рамках выполнения самого цикла может быть, в вашем случае с PositionsTotal(), каких-то ордеров уже нет - выбиты по стопам, закрыты руками или другим советником например - и остальные будут тупо не обработаны, так как их всех ВНЕЗАПНО! стало меньше?

Dmitry Fedoseev:
Это хорошо заметно с функцией ArraySize(),  с ней не получается обнаружить разницу между вызовом функции и использованием переменной. Но с PositionsTotsl() этого нет, увы. 

каким боком связаны размер какого-то средне-отфонарного массива и количество текущих открытых позиций? Вы обращаетесь к элементам массива по индексу, ну обратитесь, например, array[999] при размере 3 элемента. Если этот array на самом деле "умный" тип, класс там например с оператором '[]' где происходит проверка на допустимость, тогда ладно. А если нет? Да в любом случае у вас классический пример шиткода. Чего уж тут лужу газифицировать то, признались бы и не пыжились.

 
Tio Nisla:

Dmitry Fedoseev:
Пересчитывает каждый раз, или не пересчитывают

Вы так ничего и не поняли. Свет клином на PositionTotal() не сошелся. Я просто отметил, что так делать - плохо.

Dmitry Fedoseev:
Но вместо того, что бы привести убойный эксперимент

Что в моем эксперименте вас не устраивает? Разве компилятор заоптимизировал-закэшил результат первого вызова?

вот такое он точно оптимизирует: for (int i = 0; i = 1+2; i++) {}

или такое: const int X = 1 ; for (int i = 0; i = X+2; i++) {}

а такое точно нет: int X = 1 ; for (int i = 0; i = X+1; i++) {} ибо не телепат, и хз чего и где там с этим X может происходить, вдруг оно модифицируется в теле цикла или опосредованно по ссылке/указателю например? Будет как миленький на каждую итерацию производить сложение 'X+1'. Даже если убрать '+1' все равно использовать будет текущее значение 'X', если эта икс не объявлена как константа.

И уж тем более не кэширует результат, возвращаемый функцией, Карл! (предвосхищая ваше "а если for (int index=f();;)" - тут вызов ровно один раз, при инициализации index).

Dmitry Fedoseev:
А компилятор - имелось в виду, что он оптимизирует код и происходит непосредственное обращение к переменной, а не через функцию

ну да, конечно, компилятор точно знает ситуацию на рынке и уверен, что вызов функции всегда возвращает одно значение, зачем тогда вообще эту функцию вызывать более одного раза, достаточно в OnInit() разок, запомнить себе результат, и ладушки!

И ему все равно, что даже в рамках выполнения самого цикла может быть, в вашем случае с PositionsTotal(), каких-то ордеров уже нет - выбиты по стопам, закрыты руками или другим советником например - и остальные будут тупо не обработаны, так как их всех ВНЕЗАПНО! стало меньше?

Dmitry Fedoseev:
Это хорошо заметно с функцией ArraySize(),  с ней не получается обнаружить разницу между вызовом функции и использованием переменной. Но с PositionsTotsl() этого нет, увы. 

каким боком связаны размер какого-то средне-отфонарного массива и количество текущих открытых позиций? Вы обращаетесь к элементам массива по индексу, ну обратитесь, например, array[999] при размере 3 элемента. Если этот array на самом деле "умный" тип, класс там например с оператором '[]' где происходит проверка на допустимость, тогда ладно. А если нет? Да в любом случае у вас классический пример шиткода. Чего уж тут лужу газифицировать то, признались бы и не пыжились.

Если на PositionTotal() свет клином не сошелся, тогда вы совсем промахнулись. Потому функцию ArraySize() можно вызывать на каждом повторении цикла и от этого скорость не меняется. 

Ваш эксперимент меня не устраивает по причине его отсутствия.

Все остальные ваши фантазии не интересны, потому что это фантазии (причем дикие и очень далекие от реальности, и даже ошибочные).

Вам бы в детский садик.

 
Dmitry Fedoseev:

Со знанием чего? Если это алгоритма в природе не существует, а его надо придумать самостоятельно, и именно он определяет все.

Со знанием того, как грамотно написать нужный код на интересующем языке.

Не понял, нет такого алгоритма, который сможет сделать это? 

Как собирать информацию о сделках и пользоваться ей? Мне нужно собрать информацию о всех позициях советника, их объеме, прибыли, типе, цене открытия. А потом обратиться к информации о самой свежей позиции, или самой большой позиции.

Так автор с этим вопросом тему и создал вообще-то.

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

 
Nikolay Mitrofanov:

Со знанием того, как грамотно написать нужный код на интересующем языке.

Не понял, нет такого алгоритма, который сможет сделать это? 

Так автор с этим вопросом тему и создал вообще-то.

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

А так вы все еще о том, как позиции посчитать? Ну тогда извините.

Интересные эти искушенные, которые все еще хотят знать... а до сих пор не знают. И это все тоже про подсчет позиций?

Извините еще раз, я не ошибся, под фразой "реализация алгоритма" вы подразумеваете функцию подсчета позиций? То есть написать ли функцию PositionsTots() в цикле или использовать переменную - вы это называете алгоритмом?
 
Dmitry Fedoseev:

А так вы все еще о том, как позиции посчитать? Ну тогда извините.

Интересные эти искушенные, которые все еще хотят знать... а до сих пор не знают. И это все тоже про подсчет позиций?

Так о чем вы спорите, если вопрос исчерпан?) ЛОЛ.

Есть задача получения данных о позициях. 

Есть функция языка для получения количества открытых позиций, которая используется в цикле.

Есть вопрос как в цикле ее использовать правильно: в первом параметре цикла for или по втором - там, где проверяется условие.

Странно, что вы не понимаете что от вас хотят))) 

Вы пишете, что она затратна, потому что число непостоянно. Но почему, не можете объяснить. 

Можете объяснить почему она затратная? 

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

Вы думаете, что разработчики не подумали об этом? 

Откуда такая уверенность, что функция затратная и делает перерасчет, а не просто берет значение из оперативной памяти терминала? 

Пока что вместо ответа по существу я прочитал пустую болтовню.

 
Nikolay Mitrofanov:

Так о чем вы спорите, если вопрос исчерпан?) ЛОЛ.

Вот в этом-то и весь юмор ситуации - вторые сутки на четвертую страницу симпозиум о том, как позиции посчитать. Очень интересно.

 
Dmitry Fedoseev:

Если на PositionTotal() свет клином не сошелся, тогда вы совсем промахнулись. Потому функцию ArraySize() можно вызывать на каждом повторении цикла и от этого скорость не меняется. 

Ваш эксперимент меня не устраивает по причине его отсутствия.

Все остальные ваши фантазии не интересны, потому что это фантазии (причем дикие и очень далекие от реальности, и даже ошибочные).

ArraySize(), если массив не динамический и не классового типа, оно при объявлении самого массива уже есть константа. Но и это еще ничего не значит, так как ArraySize(array) и sizeof(array) - две большие разницы. Первая вызывается но вы этого не видите, вторая вычисляется на этапе компиляции.

int arr[5];

PrintFormat("sizeof(array): %d, num_elem = %d\n", sizeof(arr), sizeof(arr) / sizeof(int));
PrintFormat("ArraySize(): %d\n", ArraySize(arr));
ArrayResize(arr, 7);
PrintFormat("ArraySize(): %d\n", ArraySize(arr));
PrintFormat("sizeof(array): %d, num_elem = %d\n", sizeof(arr), sizeof(arr) / sizeof(int));
ArrayResize(arr, 3);
PrintFormat("ArraySize(): %d\n", ArraySize(arr));
PrintFormat("sizeof(array): %d, num_elem = %d\n", sizeof(arr), sizeof(arr) / sizeof(int));

2021.05.03 22:01:37.253 show_the_shitz EURJPY,H4: initialized
2021.05.03 22:01:37.253 show_the_shitz EURJPY,H4: sizeof(array): 20, num_elem = 5
2021.05.03 22:01:37.253 show_the_shitz EURJPY,H4: ArraySize(): 3
2021.05.03 22:01:37.253 show_the_shitz EURJPY,H4: sizeof(array): 20, num_elem = 5
2021.05.03 22:01:37.253 show_the_shitz EURJPY,H4: ArraySize(): 7
2021.05.03 22:01:37.252 show_the_shitz EURJPY,H4: ArraySize(): 5
2021.05.03 22:01:37.252 show_the_shitz EURJPY,H4: sizeof(array): 20, num_elem = 5

Так что рассказывайте свою альтернативную точку зрения в другом месте.

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

И чего я распинаюсь? Не хочет человек видеть и думать. Ну и ладно, пусть порождает код, работа которого зависит от фазы луны, времени по средне-марсианскому меридиану и чесотки на левой задней пятке. Обидно только, что многие, особенно новички, не задумываясь копипастят *внокод в свои проекты, а потом ломают голову что не так.

 
Tio Nisla:

ArraySize(), если массив не динамический и не классового типа, оно при объявлении самого массива уже есть константа. Но и это еще ничего не значит, так как ArraySize(array) и sizeof(array) - две большие разницы. Первая вызывается но вы этого не видите, вторая вычисляется на этапе компиляции.

Так что рассказывайте свою альтернативную точку зрения в другом месте.

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

И чего я распинаюсь? Не хочет человек видеть и думать. Ну и ладно, пусть порождает код, работа которого зависит от фазы луны, времени по средне-марсианскому меридиану и чесотки на левой задней пятке. Обидно только, что многие, особенно новички, не задумываясь копипастят *внокод в свои проекты, а потом ломают голову что не так.

Убойный аргумент! Нет слов... Зачем к нединамическому массиву применять ArraySize()? Даже не представляю, как до такого можно додуматься. А уж sizeof() тут каким боком? У вас там все нормально?

И это не моя точка зрения, а давно проверенная участниками форума. Только искать эту ветку я не буду.

Но могу подсказать, что с кэшированием это все никак не связано вообще. 

 
Nikolay Mitrofanov:

 А по мне, так хорошо, что человек пытается разобраться и копает глубже..

Не обращая на мелочи внимания, у кодера потом водит в привычку писать код как попало. А потом причесывать код - значит делать двойную работу и зачастую не только автору, а тем, кому с кодом работать еще повезет.

Зачем писать как попало, если можно разобраться как правильно и сразу написать хорошо и с пониманием деталей?)

Совет ваш.. ну такое.. ИМХО


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

Федосеев прав. Совсем не обязательно, да и не сразу получится причесать код как этого хотелось-бы. А со временем приходит понимание, что сделанное когда-то лучше написать чуток иначе. И каждый новый код будет уже причёсанный изначально.

 

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

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