Вы упускаете торговые возможности:
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Регистрация
Вход
Вы принимаете политику сайта и условия использования
Если у вас нет учетной записи, зарегистрируйтесь
Смотреть надо ширше (с)
Не вижу противопоказаний к запуску отдельного прогона через облако (разве что цена).
Отдельный прогон в облаке будет медленнее во многих случаях, чем на локальном ядре.
Возникла проблема.
В коде индикатора в OnCalculate() есть такая строка (а точнее несколько подобных):
FractalsBuffer является не вспомогательно-расчётным, а именно основным буфером, отвечающим непосредственно за графические построения, поэтому его необходимо обязательно связать:что и было сделано. Но у функции связывания есть некий прямой эффект, который иногда выступает в роли побочного (в плохом смысле слова). Посредством CopyBuffer(ind_handle,0,0,amount,FractalsBuffer) заполняется буфер не на всю длину истории таймфрейма, а лишь частично, из небольшого её сегмента, на величину amount. Но ArraySize(FractalsBuffer) наглядно убеждает нас в том, что размер буфера (то есть занятой физической памяти) будет соответствовать количеству баров всей истории, то есть окажется в итоге задействован по полной, включая неэффективную часть. Конечно, если потом работать со значениями буфера в цикле, вовсе не обязательно прочёсывать весь буфер, достаточно задать нужные границы и работать в них. Но во-первых, это не отменяет чудовищное перевыделение памяти, а во-вторых, неотвратимая в коде функция ArrayInitialize не позволяет инициализировать необходимым значением буфер частично, приходится тратить время и ватты на полную переинициализацию. От этого индикатор работает заметно медленнее. И в-третьих, цитата и справки из описания функции ArrayResize: "При этом необходимо иметь ввиду, что нельзя изменять размер для динамических массивов, назначенных в качестве индикаторных буферов функцией SetIndexBuffer()." Если же отказаться от SetIndexBuffer в пользу ручного манипулирования размером буфера посредством ArrayResize, рухнет сама графика индикатора.
Пожалуйста, подскажите рецепт оздоровления. Или рассмотрите это как заявку для устранения данной проблемы в самом языке.Как-то фсё запущено..
1. Инициализировать буфер имеет смысл одын раз, при старте if(prev_calculated==0)
2. Можно установить с какого бара будут рисоваться данные, вроде так: PlotIndexSetInteger(0,PLOT_DRAW_BEGIN,rates_total-amount-1);
3. Все значение буфера в пределах amount присваивать явно, один раз по всей истории, дальше только новые, тогда инициализация не потребуется.
4. В настройках терминала уменьшить количество баров в окне :)
Как-то фсё запущено..
1. Инициализировать буфер имеет смысл одын раз, при старте if(prev_calculated==0)
2. Можно установить с какого бара будут рисоваться данные, вроде так: PlotIndexSetInteger(0,PLOT_DRAW_BEGIN,rates_total-amount-1);
3. Все значение буфера в пределах amount присваивать явно, один раз по всей истории, дальше только новые, тогда инициализация не потребуется.
4. В настройках терминала уменьшить количество баров в окне :)
1. Действительно: на уровне идеи - смысл имеет делать это лишь раз, но на практике всё не так-то просто, всё действительно запущено. Я лишь скопипастил из стандартного индикатора: C:\Program Files\MetaTrader 5\MQL5\Indicators\Examples\Fractals.mq5. Как чистить буфер перед новыми расчётами по-другому и более эффективно - не знаю.
2. Пока не успел ознакомиться с такой возможностью, но заранее смахивает всего-навсего на неотрисовку индикатора в ненужной зоне, но это никак не ограничит размер самого индикаторного буфера. Кроме того, мне принципиально удобнее работать с буфеом, который заполняется полезными данными впритык, без свободного запаса, иначе придётся вводить границы (о которых я говорил в предыдущем посте), а это не вписывается в общий уютный православный алгоритм: из четырёх буферов три будут прочёсываться в одном цикле с одинаковыми границами, а для одного я должен буду раскорячиться и сделать обособленный кривой цикл с другими границами, который ещё фиг куда втиснешь. Хотя да, на костылях тоже можно ползать...
3. Что значит явно? Я совершенно не ручаюсь за то, что не присваиваю явно. Вполне может быть, что именно явно и присваиваю. Поясните? Что касается подгрузки только новых значений - само собой я это использую, это здесь называют экономным алгоритмом.
4. Эту идею отмёл ещё до написания предыдущего поста, ибо для индикатора нужны несколько последних (новых) баров истории, а лично для меня (визуальный аспект) нужны все или почти все бары. Мой человеческий интерес к барам в истории шире интересов технического индикатора к оным. Любоваться на бары и набрасывать индикатор я хочу в пределах одного чарта. Прихоть? Ординарная потребность.
1. Действительно: на уровне идеи - смысл имеет делать это лишь раз, но на практике всё не так-то просто, всё действительно запущено. Я лишь скопипастил из стандартного индикатора: C:\Program Files\MetaTrader 5\MQL5\Indicators\Examples\Fractals.mq5. Как чистить буфер перед новыми расчётами по-другому и более эффективно - не знаю.
Таки да, именно так.
Размеры индикаторного буфера определяются только количеством баров.
Один фих, какой-то размер надо будет задать.. Зачем делать кривой цикл с другими границами, когда можно прямой с теми же)
Православно задавать размер цикла, а не плясать от размера массива.. иначе индикатор будет основан на костылях
Насчёт экономного алгоритма - вот прям таки не уверен, что используете
По всем барам индикатор расчитывается один раз - т.е. может немного тормозить при запуске на агромадной истории.
В дальнейшем пересчитывается пара значений - должно ж фсё лятать :)
Что за баг с индикаторами??? Они то появляются, то исчезают. Причём только те, кто в отдельном окне!!!
Вот скрин того момента, когда индикаторы исчезли. Они то исчезают, то появляются.. произвольно. Есть видео так же..
Внимание, исчезают базовые индикаторы!! Это значит, что баг существенен. С пользовательскими такая же беда.
Господа разработчики, устраните этот баг плз, а то не солидно как-то..
К сожалению на скрине не видно.
Какой сервер? Какой аксесс сервер? Какая дата/время? Шла ли в это время подкачка истории?
Повторяется ли сейчас? Можете приложить логи терминала за эту дату?
Уважаемые разработчики, обнаружил неприятную ошибку (недоработку) в компиляторе MQL5.
Если использовать конструкцию с условием следующего вида
if (Условие) ;
{ оператор_1
……
Оператор_N }
То при компиляции кода не выдаются ошибки или предупреждения.
Но при этом, так как присутствует символ « ; » (с наличием пробелов или без) сразу после условия, то {оператор_1…оператор_N} выполнятся всегда.
В MQL4 при этом выдается предупреждение, хотелось бы, чтоб и в MQL5 тоже выдавалось при этом ошибка или предупреждение! (а то я полдня потерял пока разобрался в чем ошибка у меня в коде)
Благодарю за внимание!
Уважаемые разработчики, обнаружил неприятную ошибку (недоработку) в компиляторе MQL5.
Если использовать конструкцию с условием следующего вида
if (Условие) ;
{ оператор_1
……
Оператор_N }
То при компиляции кода не выдаются ошибки или предупреждения.
Но при этом, так как присутствует символ « ; » (с наличием пробелов или без) сразу после условия, то {оператор_1…оператор_N} выполнятся всегда.
В MQL4 при этом выдается предупреждение, хотелось бы, чтоб и в MQL5 тоже выдавалось при этом ошибка или предупреждение! (а то я полдня потерял пока разобрался в чем ошибка у меня в коде)
Благодарю за внимание!
В данном случае все валидно. ; - пустой оператор.
Мы подумаем над вашим предложением (выдача ворнинга), но в данный момент это не самая приоритетная задача.
В данном случае все валидно. ; - пустой оператор.
Мы подумаем над вашим предложением (выдача ворнинга), но в данный момент это не самая приоритетная задача.
Надеюсь не забудите, сделаете как было в MQL4 оно все-таки логично было сделано.
Подскажите еще такой момент, есть два отложенных ордера (цена, тип и объем их постановки одинаковые)
При достижении цены оба сработают, событие OnTrade() как отработает в этом случае?
В частности в историю исполненные отложенные ордера уйдут за одно событие OnTrade() или будит два вызова? (по логам у меня получается один вызов почему-то)
Благодарю за ответ!