Вы упускаете торговые возможности:
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Регистрация
Вход
Вы принимаете политику сайта и условия использования
Если у вас нет учетной записи, зарегистрируйтесь
В смысле что ожидаю? Я же написал выше, что мне нужны 300 последних (текущих) актуальных значений, а не 300 первых (начальных), при том, что я обращаюсь к массиву по смещению 299-0, а получаю данные по смещению от "конца массива" до "конца массива - 300" значений (в моём случае от 4999 до 4700), то есть по смещению 299 находится значение которое должно находиться по смещению 4999 и аналогично по смещению 0 находится значение, которое должно находится по смещению 4700. Актуально при сокращении количества расчёта массивов получать не начальные исторические данные, а текущие, спрашивается с какой целью идёт расчёт самых старых значений при том, что расчёт текущих не производится?
Если-бы из того что ты написал было понятно, то и вопросов не возникало-бы.
Тебя просили показать пример кода, а ты показал только кусок примера. Об остальном можно только догадаться что всё это в цикле. При каком значении i ты хочешь получить последние, текущие значения??? При i = 4700 или где?
Если-бы из того что ты написал было понятно, то и вопросов не возникало-бы.
Тебя просили показать пример кода, а ты показал только кусок примера. Об остальном можно только догадаться что всё это в цикле. При каком значении i ты хочешь получить последние, текущие значения??? При i = 4700 или где?
Если вы пользовались указанными функциями с ограничением длины расчётного массива на практике, то поймёте о чём речь, иначе какой смысл теоретических рассуждений?.. Да и что непонятного в моём куске кода? Я привёл абсолютно идентичные участки с той лишь разницей, что в первом случае я не использую ограничение длины на расчёт массива. В данном случае абсолютно не важно какой период расчёта, сдвиг средней или метод усреднения, т.к. в обоих случаях они одинаковы? Значение сдвиг, как я написал выше, аналогично используется абсолютно одинаковое. Забейте указанные строки в любой индикатор, который сделан нормально и считает только новые бары, замените "i" на вашу переменную смещения в цикле, замените функцию GetValue(i) хотя бы на Open[i], сделайте три указанных массива 3 отображаемыми буферами индикатора и посмотрите как отработает первый вариант и второй. Впрочем вот пример полного кода самого простого варианта индикатора в двух вариантах для упрощения понимания сути проблемы:
//так работает нормально://так не работает нормально:
После нанесения индикаторов на график идите в начало (влево) графика и посмотрите на 1 индикатор от 12 бара и далее, именно с него начинается "непустое" заполнение 2 и 3 массива, примерно запомните несколько первых значений, отличных от 0, далее переместите график к текущим котировкам и посмотрите значения начиная от 300 бара, так вот значения 2 (нижнего) индикатора будут равны тем, которые вы видели в начале графика у 1 индикатора, а по идее значения должны совпадать с текущими. Надеюсь понятно пояснил. Кроме того, если нанести графики на он-лайн чарт, то первый будет отрабатывать нормально, а второй "зависнет при своих".
Представлю Ваш код в более удобочитаемом виде и в новой нотации (и вправду, сколько уже можно пользоваться в индикаторах этим анахронизмом int start()???):
Индикатор 1:
Индикатор 2:
И результат выполнения:
о
Если вы пользовались указанными функциями
Если-бы не пользовался не задавал-бы вопросов с целью натолкнуть на правильное решение.
Какой смысл брать 300 баров если расчёт нужен периодом 12??? Даже если надо именно так, "потомучто" то надо понимать какие 12 элементов будут в расчёте среднего значения. И очень правильная была подсказка о направлении индексации массива.
Для понимания поделай эксперименты с подсчётом вручную на бумаге или на калькуляторе, ну или в Excel`e.
Вот смотрю я на ответы и понимаю, что я тут просто теряю время, пытаясь показать суть проблемы, а получая в ответ "красоту" кода (спасибо конечно, но предлагаемый код написан за пару минут только для отображения сути проблемы и ну никак не требует удобочитаемости или прочих преобразований)...
А особо порадовал ответ перед моим постом... Какой калькулятор, какие ручные расчёты, какая индексация? Уважаемые пользователи, вникайте пожалуйста в суть ситуации, чтобы не тратить зря не только своё время, но и чужое. Перечитайте внимательнее мои разжеванные посты, но если сложно, отвечу кратко: направление индексации массива в обоих случаях правильное, размер необходимых расчётов и остальные изменяемые параметры, как это показано в первичном коде задаётся внешними переменными, вариант создания своей функции обсуждался выше (и по сути является единственным верным решением), но, повторюсь, хотелось бы получить это от встроенных в МТ4.
В общем всем спасибо, подведу итоги: или сервисдеск или свои аналоги функций.
А меня удручает ответ перед моим постом...
Ну если ты на столько упрям, => в сервисдеск, а там на такие вопросы отвечают исключительно от скуки, а скучают они редко.
Ну попробую ещё раз...
iMAOnArray() берёт, в твоём случае 300 баров и высчитывает среднее значение последних 12-ти баров из трёхсот. Чтобы получить среднее первых 12-ти баров нужно перевернуть индексацию массива, ArraySetAsSeries(BufferMA, false); или взять всего 12 баров.
Вот и получается, что вместо того чтобы вникнуть, понять как работает, как пользоваться, ты просто заявляешь что не работает или работает не правильно. А неправильно это не по-твоему...
Дальше про красоту кода: Ты думаешь кому-то интересно ломать глаза читая твой код, когда всё написано в одну строку??? Ошибаешься. Я лично не читал. Спасибо барабашке за его терпение по несколько раз в день направлять всех ... не туда куда послал-бы я.
Хотел ответить очень "подробно", но потом перечитав посты ещё раз, удалил свой ответ, и окончательно понял, что только теряю тут время, объясняя несколько раз одно и тоже разными словами...
PS Всем спасибо и действительное спасибо "Барабашке" (Владимиру), он молодец, но вся эта ситуация не стоила его труда, буду ему ещё более благодарен, если его не затруднит сделать, скрин в ключе предыдущего, добавив третий вариант и показав, что будет если последовать совету со сменой направления индексации. Дабы поставить точку в вопросе работы функции.
Хотел ответить очень "подробно", но потом перечитав посты ещё раз, удалил свой ответ, и окончательно понял, что только теряю тут время, объясняя несколько раз одно и тоже разными словами...
PS Всем спасибо и действительное спасибо "Барабашке" (Владимиру), он молодец, но вся эта ситуация не стоила его труда, буду ему ещё более благодарен, если его не затруднит сделать, скрин в ключе предыдущего, добавив третий вариант и показав, что будет если последовать совету со сменой направления индексации. Дабы поставить точку в вопросе работы функции.
Вариант 3:
И общий результат:
Нет, Владимир. Чуток не так.
В этом случае надо ArraySetAsSeries(массив, false); применять к массиву из трёхсот элементов среди которых считается iMAOnArray(). Но для этого лучше использовать CopyOpen() а не цикл заполнения массива.
Как я понимаю, в этом варианте лучше будет