Ошибки, баги, вопросы - страница 589

 
Ashes:

Смотреть надо ширше (с)

Не вижу противопоказаний к запуску отдельного прогона через облако (разве что цена).  

Отдельный прогон в облаке будет медленнее во многих случаях, чем на локальном ядре.
 
joo:
Отдельный прогон в облаке будет медленнее во многих случаях, чем на локальном ядре.
Выше https://www.mql5.com/ru/forum/1111/page598#comment_125691 приведен сценарий. Обратите внимание на слово МОЖЕТ. Ограничение выглядит надуманным.
 

 Возникла проблема.

 В коде индикатора в OnCalculate() есть такая строка (а точнее несколько подобных):

ArrayInitialize(FractalsBuffer,EMPTY_VALUE);
FractalsBuffer является не вспомогательно-расчётным, а именно основным буфером, отвечающим непосредственно за графические построения, поэтому его необходимо обязательно связать:
SetIndexBuffer(0,FractalsBuffer,INDICATOR_DATA);

что и было сделано. Но у функции связывания есть некий прямой эффект, который иногда выступает в роли побочного (в плохом смысле слова). Посредством CopyBuffer(ind_handle,0,0,amount,FractalsBuffer) заполняется буфер не на всю длину истории таймфрейма, а лишь частично, из небольшого её сегмента, на величину amount. Но ArraySize(FractalsBuffer) наглядно убеждает нас в том, что размер буфера (то есть занятой физической памяти) будет соответствовать количеству баров всей истории, то есть окажется в итоге задействован по полной, включая неэффективную часть. Конечно, если потом работать со значениями буфера в цикле, вовсе не обязательно прочёсывать весь буфер, достаточно задать нужные границы и работать в них. Но во-первых, это не отменяет чудовищное перевыделение памяти, а во-вторых, неотвратимая в коде функция ArrayInitialize не позволяет инициализировать необходимым значением буфер частично, приходится тратить время и ватты на полную переинициализацию. От этого индикатор работает заметно медленнее. И в-третьих, цитата и справки из описания функции ArrayResize: "При этом необходимо иметь ввиду, что нельзя изменять размер для динамических массивов, назначенных в качестве индикаторных буферов функцией SetIndexBuffer()." Если же отказаться от SetIndexBuffer в пользу ручного манипулирования размером буфера посредством ArrayResize, рухнет сама графика индикатора.

 Пожалуйста, подскажите рецепт оздоровления. Или рассмотрите это как заявку для устранения данной проблемы в самом языке.
 
x100intraday:

Как-то фсё запущено..

1. Инициализировать буфер имеет смысл одын раз, при старте if(prev_calculated==0)

2. Можно установить с какого бара будут рисоваться данные, вроде так: PlotIndexSetInteger(0,PLOT_DRAW_BEGIN,rates_total-amount-1);

3. Все значение буфера в пределах amount присваивать явно, один раз по всей истории, дальше только новые, тогда инициализация не потребуется.

4. В настройках терминала уменьшить количество баров в окне :)

 
Swan:

Как-то фсё запущено..

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.  Эту идею отмёл ещё до написания предыдущего поста, ибо для индикатора нужны несколько последних (новых) баров истории, а лично для меня (визуальный аспект) нужны все или почти все бары. Мой человеческий интерес к барам в истории шире интересов технического индикатора к оным. Любоваться на бары и набрасывать индикатор я хочу в пределах одного чарта. Прихоть? Ординарная потребность.

 
x100intraday:

 1. Действительно: на уровне идеи - смысл имеет делать это лишь раз, но на практике всё не так-то просто, всё действительно запущено. Я лишь скопипастил из стандартного индикатора: C:\Program Files\MetaTrader 5\MQL5\Indicators\Examples\Fractals.mq5. Как чистить буфер перед новыми расчётами по-другому и более эффективно - не знаю.

   if(prev_calculated<7)// if(prev_calculated==0)// if(prev_calculated<1)// вопщем одинаково)
      //Initialize только при первом запуске. нуу или при случае какогнить ахтунга)
      {
      limit=2;//цикл начинается со второго элемента индикаторного массива
      //--- clean up arrays//в принципе здесь не очистка массива, 
                        //а значения EMPTY_VALUE присваивается 0 и 1 элементу массивов, мм.. и на последних трёх барах)
                        //остальные определяются далее в цикле..
      ArrayInitialize(ExtUpperBuffer,EMPTY_VALUE);
      ArrayInitialize(ExtLowerBuffer,EMPTY_VALUE);
      }
   else limit=rates_total-5;//иначе - в цикле пересчитываются только два последних значения

//зы: при появлении нового бара - новый элемент массива вроде как не определен, насколько мне известно не гарантируется, что он будет  ==EMPTY_VALUE
 2. Пока не успел ознакомиться с такой возможностью, но заранее смахивает всего-навсего на неотрисовку индикатора в ненужной зоне, но это никак не ограничит размер самого индикаторного буфера. Кроме того, мне принципиально удобнее работать с буфеом, который заполняется полезными данными впритык, без свободного запаса, иначе придётся вводить границы (о которых я говорил в предыдущем посте), а это не вписывается в общий уютный православный алгоритм: из четырёх буферов три будут прочёсываться в одном цикле с одинаковыми границами, а для одного я должен буду раскорячиться и сделать обособленный кривой цикл с другими границами, который ещё фиг куда втиснешь. Хотя да, на костылях тоже можно ползать...

Таки да, именно так.

Размеры индикаторного буфера определяются только количеством баров.

Один фих, какой-то размер надо будет задать.. Зачем делать кривой цикл с другими границами, когда можно прямой с теми же)

Православно задавать размер цикла, а не плясать от размера массива.. иначе индикатор будет основан на костылях


 3. Что значит явно? Я совершенно не ручаюсь за то, что не присваиваю явно. Вполне может быть, что именно явно и присваиваю. Поясните? Что касается подгрузки только новых значений - само собой я это использую, это здесь называют экономным алгоритмом.
      //---- Upper Fractal
      if(High[i]>High[i+1] && High[i]>High[i+2] && High[i]>=High[i-1] && High[i]>=High[i-2])
         ExtUpperBuffer[i]=High[i];//условие выполняется - присваиваем значение
      else ExtUpperBuffer[i]=EMPTY_VALUE;//не выполняется - таки тоже присваиваем значение)
//нет зависимости от Initialize, всем элементам в цикле явно присваивается значение.

Насчёт экономного алгоритма - вот прям таки не уверен, что используете

По всем барам индикатор расчитывается один раз - т.е. может немного тормозить при запуске на агромадной истории.

В дальнейшем пересчитывается пара значений - должно ж фсё лятать :)

 
Cmu4:

Что за баг с индикаторами??? Они то появляются, то исчезают. Причём только те, кто в отдельном окне!!!

Вот скрин того момента, когда индикаторы исчезли. Они то исчезают, то появляются.. произвольно. Есть видео так же..

  

 Внимание, исчезают базовые индикаторы!! Это значит, что баг существенен. С пользовательскими такая же беда.  

 

Господа разработчики, устраните этот баг плз, а то не солидно как-то.. 

К сожалению на скрине не видно.

Какой сервер? Какой аксесс сервер? Какая дата/время? Шла ли в это время подкачка истории?

Повторяется ли сейчас? Можете приложить логи терминала за эту дату?

 

Уважаемые  разработчики, обнаружил неприятную ошибку (недоработку) в компиляторе MQL5.

Если использовать конструкцию с условием  следующего  вида

if (Условие)      ;

{ оператор_1

……

Оператор_N }

То при компиляции кода не выдаются ошибки или предупреждения.

Но при этом, так как присутствует  символ « ; » (с наличием пробелов или без)  сразу после условия,  то {оператор_1…оператор_N} выполнятся всегда.

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

Благодарю за внимание!

 
Fia:

Уважаемые  разработчики, обнаружил неприятную ошибку (недоработку) в компиляторе MQL5.

Если использовать конструкцию с условием  следующего  вида

if (Условие)      ;

{ оператор_1

……

Оператор_N }

То при компиляции кода не выдаются ошибки или предупреждения.

Но при этом, так как присутствует  символ « ; » (с наличием пробелов или без)  сразу после условия,  то {оператор_1…оператор_N} выполнятся всегда.

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

Благодарю за внимание!


В данном случае все валидно. ; - пустой оператор.

Мы подумаем над вашим предложением (выдача ворнинга), но в данный момент это не самая приоритетная задача.

Документация по MQL5: Основы языка / Операторы / Оператор-выражение
Документация по MQL5: Основы языка / Операторы / Оператор-выражение
  • www.mql5.com
Основы языка / Операторы / Оператор-выражение - Документация по MQL5
 
alexvd:

В данном случае все валидно. ; - пустой оператор.

Мы подумаем над вашим предложением (выдача ворнинга), но в данный момент это не самая приоритетная задача.

Надеюсь не забудите, сделаете как было в MQL4 оно все-таки логично было сделано.


Подскажите еще такой момент, есть два отложенных ордера (цена, тип и объем их постановки одинаковые)

При достижении цены оба сработают, событие OnTrade() как отработает в этом случае?

В частности в историю исполненные отложенные ордера уйдут за одно событие OnTrade() или будит два вызова? (по логам у меня получается один вызов почему-то)

Благодарю за ответ!

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