Любые вопросы новичков по MQL4 и MQL5, помощь и обсуждение по алгоритмам и кодам - страница 614
Вы упускаете торговые возможности:
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Регистрация
Вход
Вы принимаете политику сайта и условия использования
Если у вас нет учетной записи, зарегистрируйтесь
Ну это вы показали не критические ошибки.
Как работает функция, вы сами ответили:
В тестере норм. Вот так вот происходит на деле.
Ну в этом случае нужно разбираться с кодом, принтовать( Print(...) ) все значения, и смотреть откуда лезет ошибка
В тестере норм. Вот так вот происходит на деле.
Вам ответили же:
Форум по трейдингу, автоматическим торговым системам и тестированию торговых стратегий
Любые вопросы новичков по MQL4, помощь и обсуждение по алгоритмам и кодам
Alexey Viktorov, 2018.09.06 21:00
Направление в котором надо думать: Если профит меньше нуля... какого размера будет массив во время сортировки???
И какого размера будет массив если ордеров вообще нет???Добрый день! Советник называется неваляшка, но работает не так как планировалось. удваивается лот если закрывается в минус, но последующее закрытие по ТП почему-то не позволяет возвращать минусовые сделки, закрытые до этого. Подскажите что не так, не могу разобраться. Заранее благодарю всех откликнувшихся.
Я не очень понимаю, что именно выполняет эта функция. Но как говорил автор - задача перекрывать ордера убыточные - прибыльными между символами. Буду рад, если поможете исправить и понять функцию
Вы не понимаете, а я не хочу понимать что выполняет эта функция. Вам ей пользоваться. Вы её выбрали себе. Как можно пользоваться чем-то не понимая для чего это надо.
Я только сказал откуда, по какой причине возникает ошибка.
Ещё одно пояснение:
1. Объявлен массив. В коде выделено зелёным. Пока он нулевой длинны в первом измерении. Строка выделенная синим не понятно для чего. Если сбросить размер массива, то для этого существует ArrayFree() Но даже эта функция будет бесполезна так-как только-что объявленный динамический массив имеет нулевую длину.
2. Если ордеров нет, то код выделенный красным выполняться не будет. Соответственно размер массива останется нулевым.
3. Сортировка массива предусмотрена на каждом тике. Это следует из кода... И что можно сортировать в пустом кармане??? Разве-что 2 перепелиных яйца...
А вот такой текст ошибки... Ну что можно сказать? Разработчики не предусмотрели что кто-то сможет попытаться сортировать пустой массив. Специального сообщения для этого не придумали.
Вы не понимаете, а я не хочу понимать что выполняет эта функция. Вам ей пользоваться. Вы её выбрали себе. Как можно пользоваться чем-то не понимая для чего это надо.
Я только сказал откуда, по какой причине возникает ошибка.
Ещё одно пояснение:
1. Объявлен массив. В коде выделено зелёным. Пока он нулевой длинны в первом измерении. Строка выделенная синим не понятно для чего. Если сбросить размер массива, то для этого существует ArrayFree() Но даже эта функция будет бесполезна так-как только-что объявленный динамический массив имеет нулевую длину.
2. Если ордеров нет, то код выделенный красным выполняться не будет. Соответственно размер массива останется нулевым.
3. Сортировка массива предусмотрена на каждом тике. Это следует из кода... И что можно сортировать в пустом кармане??? Разве-что 2 перепелиных яйца...
А вот такой текст ошибки... Ну что можно сказать? Разработчики не предусмотрели что кто-то сможет попытаться сортировать пустой массив. Специального сообщения для этого не придумали.
Алексей, не верно. ArrayFree() служит для высвобождения памяти от массива в случае, когда этот массив уже не нужен, что нужно очень редко, и точно не в данном случае.
Для обнуления массива нужно использовать ZeroMemory(a), ArrayInitialize(a,xxx), а для изменения размера в первом измерении - ArrayResize(a,xxx).
Впрочем, эта поправка не влияет на ход твоих рассуждений - они верны.
Алексей, не верно. ArrayFree() служит для высвобождения памяти от массива в случае, когда этот массив уже не нужен, что нужно очень редко, и точно не в данном случае.
Для обнуления массива нужно использовать ZeroMemory(a), ArrayInitialize(a,xxx), а для изменения размера в первом измерении - ArrayResize(a,xxx).
Впрочем, эта поправка не влияет на ход твоих рассуждений - они верны.
Согласно документации
ArrayFree
Освобождает буфер любого динамического массива и устанавливает размер нулевого измерения в 0.
Согласно документации
Может я выразился не достаточно грамотно и ты меня не так понял.И дальше там же:
Примечание
При написании скриптов и индикаторов необходимость в использовании функции ArrayFree() может возникнуть не часто: так как при завершении работы скрипта вся использованная память сразу же освобождается, а в пользовательских индикаторах основная работа с массивами представляет собою доступ к индикаторным буферам, размеры которых автоматически управляются исполняющей подсистемой терминала.
Если в программе необходимо самостоятельно управлять памятью в сложных динамических условиях, то функция ArrayFree() позволит явным образом и немедленно освобождать память, занятую ненужным уже динамическим массивом.
Освобождает буфер любого динамического массива и устанавливает размер нулевого измерения в 0
Понимаешь? Ты прочёл вторую часть, а первую - важную - пропустил? Высвобождает выделенную под массив память. Его всё... нету... Место в памяти, выделенное под массив, высвобождается и далее может быть занято другими данными. Зачем каждый раз при входе в функцию заново перераспределять память под этот массив? Ведь ты её высвобождать предлагаешь. А нужно лишь размер менять - ArrayResize() или обнулять массив - ArrayInitialize(), ZeroMemory(). При этом место в памяти под массив не будет высвобождаться и будет оставаться зарезервированным под этот массив до завершения работы программы.
И дальше там же:
Примечание
При написании скриптов и индикаторов необходимость в использовании функции ArrayFree() может возникнуть не часто: так как при завершении работы скрипта вся использованная память сразу же освобождается, а в пользовательских индикаторах основная работа с массивами представляет собою доступ к индикаторным буферам, размеры которых автоматически управляются исполняющей подсистемой терминала.
Если в программе необходимо самостоятельно управлять памятью в сложных динамических условиях, то функция ArrayFree() позволит явным образом и немедленно освобождать память, занятую ненужным уже динамическим массивом.
Освобождает буфер любого динамического массива и устанавливает размер нулевого измерения в 0
Понимаешь? Ты прочёл вторую часть, а первую - важную - пропустил? Высвобождает выделенную под массив память. Его всё... нету... Место в памяти, выделенное под массив, высвобождается и далее может быть занято другими данными. Зачем каждый раз при входе в функцию заново перераспределять память под этот массив? Ведь ты её высвобождать предлагаешь. А нужно лишь размер менять - ArrayResize() или обнулять массив - ArrayInitialize(), ZeroMemory(). При этом место в памяти под массив не будет высвобождаться и будет оставаться зарезервированным под этот массив до завершения работы программы.
Ну хорошо... А если локальный массив объявляется при каждом обращении к функции или, самое невероятное, на каждом тике... так ведь память под массив распределяется при каждом объявлении массива. Разве не так? И какая разница освобождать память или нет, но память перераспределять каждый раз...
Основной посыл был в том, что этого делать не надо... а если уж делаете, то лучше сделать это посредством ArrayFree()
Вот что интересно: если локальный массив объявляется при каждом обращении к функции, соответственно память резервируется под него каждый раз. А какие адреса при этом используются??? Те-же что и при первом объявлении массива или какие получится?
Добрый день! Советник называется неваляшка, но работает не так как планировалось. удваивается лот если закрывается в минус, но последующее закрытие по ТП почему-то не позволяет возвращать минусовые сделки, закрытые до этого. Подскажите что не так, не могу разобраться. Заранее благодарю всех откликнувшихся.
Попробуйте проверять на удвоение раньше, чем на начальную лотность. Закрытие по времени смотрите.