Вы упускаете торговые возможности:
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Регистрация
Вход
Вы принимаете политику сайта и условия использования
Если у вас нет учетной записи, зарегистрируйтесь
Сорри, надо было дефайны тоже включить. Когда tbIdx==TICK_BUF_SIZE, получается tbIdx &= TICK_BUF_MAX_IDX; => tbIdx == 0. Как вы поняли, это для работы с входным кольцевым буфером. Вообще, это из старого кода, когда я сочинял софт для слабеньких процов, типа для карманных плейров, там приходилось каждый такт экономить. На современных, скорее всего, будет срабатывать предсказание переходов в обычном if ))
<p><br>Внимательно читайте правила маркета, в частности пункт 4.2: запрещен вызов любых dll, включая системные. Таким образом, Вы нарушите правила самим фактом вызова dll, пустой или нет. По этой же причине, вызов реальной библиотеки, которую вы подсунете своему продукту в аттаче, будет также неприемлем.</p>
Честно говоря, мало что понял из вашего объяснения. Какая разница, дефайны это или не дефайны, если в них выражение всё-равно в скобках. Математически ничего не меняется. Результат, получаемый после вашей "оптимизации", не соответствует первоначальному результату в любом случае.
В дефайнах рекомендуется вычисляемые подстановки заключать в скобки, чтобы избежать влияния со стороны программы, куда дефайн вставляется. Надо понимать, что дефайн - это просто подстановка куска текста ДО компиляции. Это НЕ математическое выражение или функция.
Пример:
Теперь по теме. Когда tbIdx доходит до значения 0x1000, производится операция битовое И
tbIdx &= TICK_BUF_MAX_IDX;
или, раскрывая дефайн
tbIdx &= 0x0FFF;
Результат битовой операции 0x1000 & 0x0FFF будет равен нулю, индекс кольцевого буфера tbIdx перескакивает на нулевой элемент. Надеюсь, теперь все ясно.
Теперь по теме. Когда tbIdx доходит до значения 0x1000, производится операция битовое И
Что значит "когда доходит"? Операция вообще-то производится всегда, начиная с самой первой итерации.
Вы же в маркет продукт на продажу выставили, то есть не новичок, что в этом коде непонятного???
Когда tbIdx принимает максимальное значение TICK_BUF_SIZE, tbIdx обнуляется. Если и правда непонятно, а не прикалываетесь, вставьте цикл в скрипт и пройдетесь под дебаггером.
Ну, пока представитель MQ таких возражений не высказал. Ведь я в поставке для маркета не вызываю никакие DLL, да это и невозможно технически. Я вызываю библиотеку на MQL. А то, что пользователь скачал дополнения и установил их на свой страх и риск, я про это даже и не знаю, если он сам мне не сообщит из чувства благодарности. ИМХО, с юридической точки зрения я прав.
Какие комментарии вы ждете, когда фраза "запрещены любые DLL" была несколько раз скопирована сюда?
Ни одна программа, которая содержит в себе import блоки, не будет принята даже на техническом уровне.
Когда tbIdx принимает максимальное значение TICK_BUF_SIZE, tbIdx обнуляется. Если и правда непонятно, а не прикалываетесь, вставьте цикл в скрипт и пройдетесь под дебаггером.
Ещё раз повторю, оно обнуляется не "когда", а обнуляется с самого начала цикла. Вот вы меня как-раз очень удивляете. Вы хоть банальным принтом пробовали вывести значения вашей переменной?
Почему это она обнуляется с самого начала цикла?
Только напишите конкретно, без общих фраз. До цикла выполняется строка
int tbIdx = TickBufIdx; // например, tbIdx теперь равна 123, в цикле значение инкрементировалось
...
for (int n = 0; n < asize; n++)
{
tbIdx++; // == 124
tbIdx &= TICK_BUF_MAX_IDX; // Чему будет равно выражение 124 & 0x0FFF ?
Зачем мне принт для школьной арифметики...
Почему это она обнуляется с самого начала цикла?
Только напишите конкретно, без общих фраз. До цикла выполняется строка
int tbIdx = TickBufIdx; // например, tbIdx теперь равна 123
Речь не про "например", а про логику алгоритма. У вас нигде не указано, что tbIdx - это константа равная 123. И не видно никакой проверки вначале, типа if (tbIdx>0xFFF) return. А мы не телепаты.