Новая версия платформы MetaTrader 4 build 1335: Улучшения для Wine/macOS - страница 2

 
Renat Fatkhullin:

Вы категорически не понимаете принципа работы индикаторов. И не умеете полностью читать точные обьяснения.

А именно, что размеры расчетных буферов гарантируются только в OnCalculate. Мало того, ArraySize расчетного буфера может быть больше реально доступного количества баров - догадайтесь сами, почему. Поэтому, если хотите работать с буфером вне OnCalculate, запоминайте количество реально просчитанных в OnCalculate данных в отдельной переменной.

 Спасибо. Изменил архитектуру. Все работает без ошибок. 

Про " ArraySize расчетного буфера может быть больше реально доступного количества баров " знаю. Это не влияет на работу.

Ранее предполагал, что количество баров в буфере устанавливается правильно именно в OnInit, а в OnCalculate только корректируется.

То есть при переключении тф корректируется и количество баров в буфере именно в OnInit.

"  И не умеете полностью читать точные обьяснения ..."

Фраза "Обратите внимание, что система автоматически будет перестраивать буфер только для пересчета данных (первый раз..."  корректнее звучит так:

Обратите внимание, что система автоматически будет перестраивать буфер только для пересчета данных (при первичном выводе индикатора на график и при приходе новых данных в OnCalculate. Переключение тф  не влияет на размер буфера). 

И именно такая фраза уже не допускает трактовки. ТО есть необходима была расшифровка, что значит первый раз.

 

А почему ниже описанная конструкция стала выбирать ордера в случайном порядке? В предыдущих билдах i=0 был самые старым (первым) ордером. Из 10 открытых ордеров, i=0 оказался 4 (если сортировать по тикетам и по дате открытия), i=1 оказался 7 и так далее

for (int i = 0; i < OrdersTotal(); i++) {
        if (OrderSelect(i, SELECT_BY_POS)) {}
}
 
Pavel Komarovsky:

А почему ниже описанная конструкция стала выбирать ордера в случайном порядке? В предыдущих билдах i=0 был самые старым (первым) ордером. Из 10 открытых ордеров, i=0 оказался 4 (если сортировать по тикетам и по дате открытия), i=1 оказался 7 и так далее

Это не от билда зависит, а от того, какой способ сортировки выбран в окне "Терминал", вкладка "Торговля". Пользователь может установить сортировку по имени символа. В итоге первым в списке будет, скорее всего, другой ордер. А вот тот список ордеров, который получен программно, не зависит от способа сортировки, выбранного пользователем. 

 

Кто может объяснить следующее.

Программа:

//+------------------------------------------------------------------+
//|                                                    test_Bars.mq4 |
//|                        Copyright 2021, MetaQuotes Software Corp. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2021, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"
#property strict
#property indicator_chart_window

//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- indicator buffers mapping
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int OnCalculate(const int rates_total,
                const int prev_calculated,
                const datetime &time[],
                const double &open[],
                const double &high[],
                const double &low[],
                const double &close[],
                const long &tick_volume[],
                const long &volume[],
                const int &spread[])
  {
//---
Print(__LINE__,"  (int)ChartGetInteger(0,CHART_WIDTH_IN_PIXELS,0) = ",(int)ChartGetInteger(0,CHART_WIDTH_IN_PIXELS,0));

//--- return value of prev_calculated for next call
   return(rates_total);
  }
//+------------------------------------------------------------------+

Помещаю эту программу на график M15. 

Открываю окно с данным графиком. Во вкладке Эксперты выводится :

2021.05.25 00:20:55.387 test GBPUSD,M15: 36  (int)ChartGetInteger(0,CHART_WIDTH_IN_PIXELS,0) = 1417
2021.05.25 00:20:55.300 test GBPUSD,M15: 36  (int)ChartGetInteger(0,CHART_WIDTH_IN_PIXELS,0) = 1417
2021.05.25 00:20:55.169 test GBPUSD,M15: 36  (int)ChartGetInteger(0,CHART_WIDTH_IN_PIXELS,0) = 1417
2021.05.25 00:20:55.089 test GBPUSD,M15: 36  (int)ChartGetInteger(0,CHART_WIDTH_IN_PIXELS,0) = 1417

Перехожу на другой открытый график, на котором данная программа не установлена.

Во вкладке Эксперты выводится:

2021.05.25 00:26:00.451 test GBPUSD,M15: 36  (int)ChartGetInteger(0,CHART_WIDTH_IN_PIXELS,0) = 483
2021.05.25 00:25:22.314 test GBPUSD,M15: 36  (int)ChartGetInteger(0,CHART_WIDTH_IN_PIXELS,0) = 483
2021.05.25 00:23:36.134 test GBPUSD,M15: 36  (int)ChartGetInteger(0,CHART_WIDTH_IN_PIXELS,0) = 483
2021.05.25 00:23:21.094 test GBPUSD,M15: 36  (int)ChartGetInteger(0,CHART_WIDTH_IN_PIXELS,0) = 483

Можно поступить по-другому.

Открываем график M15 с программой. Компилируем программу. Выводится правильное значение = 1417.

Открываем любой другой график без данной программы.   Компилируем программу. Выводится НЕправильное значение = 483.


В предыдущей версии терминала это не наблюдалось.
 
Eugeni Neumoin:

Кто может объяснить следующее.

Открываем график M15 с программой. Компилируем программу. Выводится правильное значение = 1417.

Открываем любой другой график без данной программы.   Компилируем программу. Выводится НЕправильное значение = 483.

Я бы предположил, что значение 1417  показано для активного окна в режиме SW_SHOWMAXIMIZED. Когда это окно становится не активным, то его ширина определяется для режима SW_SHOWNORMAL. Ошибка это, или так и задумано, не знаю.

 
Eugeni Neumoin:

Кто может объяснить следующее.

Проверил на билде 1335. Не воспроизводится. Действия:

  1. Подключение индикатора к графику. Выводится значение 797.
  2. Активация любого другого окна. Выводится значение 797.
  3. Компиляция индикатора. Выводится значение 797.
  4. Возврат к окну индикатора и изменение его размера. Выводится значение 915.
 
bobsxxxx:

Я бы предположил, что значение 1417  показано для активного окна в режиме SW_SHOWMAXIMIZED. Когда это окно становится не активным, то его ширина определяется для режима SW_SHOWNORMAL. Ошибка это, или так и задумано, не знаю.

Не нахожу в справочнике MQL4, что означают   SW_SHOWNORMAL и  SW_SHOWMAXIMIZED.

 
Ihor Herasko:

Проверил на билде 1335. Не воспроизводится. Действия:

  1. Подключение индикатора к графику. Выводится значение 797.
  2. Активация любого другого окна. Выводится значение 797.
  3. Компиляция индикатора. Выводится значение 797.
  4. Возврат к окну индикатора и изменение его размера. Выводится значение 915.

С проблемой столкнулся примерно неделю назад. Ранее все работало. 

Сейчас test воспроизводит ошибку. Это просто перехожу в другое окно и идущие тики ошибку воспроизводят:

2021.05.25 15:36:31.732 test GBPUSD,M15: 36  (int)ChartGetInteger(0,CHART_WIDTH_IN_PIXELS,0) = 755
2021.05.25 15:36:30.550 test GBPUSD,M15: 36  (int)ChartGetInteger(0,CHART_WIDTH_IN_PIXELS,0) = 755
2021.05.25 15:36:28.140 test GBPUSD,M15: 36  (int)ChartGetInteger(0,CHART_WIDTH_IN_PIXELS,0) = 755
2021.05.25 15:36:28.109 test GBPUSD,M15: 36  (int)ChartGetInteger(0,CHART_WIDTH_IN_PIXELS,0) = 755
2021.05.25 15:36:28.077 test GBPUSD,M15: 36  (int)ChartGetInteger(0,CHART_WIDTH_IN_PIXELS,0) = 755
2021.05.25 15:36:27.960 test GBPUSD,M15: 36  (int)ChartGetInteger(0,CHART_WIDTH_IN_PIXELS,0) = 755
2021.05.25 15:36:23.591 test GBPUSD,M15: 36  (int)ChartGetInteger(0,CHART_WIDTH_IN_PIXELS,0) = 755
2021.05.25 15:36:23.511 test GBPUSD,M15: 36  (int)ChartGetInteger(0,CHART_WIDTH_IN_PIXELS,0) = 755
2021.05.25 15:36:19.048 test GBPUSD,M15: 36  (int)ChartGetInteger(0,CHART_WIDTH_IN_PIXELS,0) = 1417
2021.05.25 15:36:18.963 test GBPUSD,M15: 36  (int)ChartGetInteger(0,CHART_WIDTH_IN_PIXELS,0) = 1417
2021.05.25 15:36:16.112 test GBPUSD,M15: 36  (int)ChartGetInteger(0,CHART_WIDTH_IN_PIXELS,0) = 1417

А вот на основной программе, в которой и был обнаружен сбой, ошибка перестала воспроизводиться.

==================

По большому счету, это не проблема. Кусок кода, влияющий на эту ошибку уберу. Сейчас уже не могу вспомнить, зачем этот кусок кода  несколько лет назад вставил.

   if (sdvig>(int)ChartGetInteger(0,CHART_WIDTH_IN_PIXELS)) sdvig=(int)ChartGetInteger(0,CHART_WIDTH_IN_PIXELS);

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

Это лишнее. Добивался максимальной автоматизации вывода ...

Проявляться ошибка стала после перекомпиляции. То есть, на нескольких графиках выведена программа. Перекомпилирую. Потом проверяю вывод на всех графиках. Возникала ошибка.

Но если перекомпиляция производится с открытым графиком, на котором возникала ошибка, ошибка не наблюдается. Если просто ставил программу на графики, то ошибка не проявляется.

==============

Когда окно находится в фокусе, ошибка не проявляется. При перекомпиляции присутствуют окна с программой, которые не находятся в фокусе.

В этих окнах происходит переустановка программы после перекомпиляции.

И ошибочное значение вызывает смещение некоторых панелек с кнопками.

 
Eugeni Neumoin:

С проблемой столкнулся примерно неделю назад. Ранее все работало. 

Сейчас test воспроизводит ошибку. Это просто перехожу в другое окно и идущие тики ошибку воспроизводят:

А вот на основной программе, в которой и был обнаружен сбой, ошибка перестала воспроизводиться.

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

Да, помнится, когда-то давно что-то подобное было. Возможно, это ошибка из разряда "исчезающего дефекта". В этом случае очень малы шансы на ее исправление.

 

@Slava   Что могло случиться? До обеда писал индикатор, пользовался отладчиком без проблем… И вдруг после обеда вот такое в отладчике


Ни одна переменная не может быть оценена… При отладке советника всё вроде работает, а на двух индикаторах не хочет. Как это можно исправить?

2021.06.01 14:32:37.340 Windows 7 Professional x64, IE 11, 4 x AMD FX-4170 Quad-Core Processor , Memory: 10731 / 12255 Mb, Disk: 45 / 465 Gb, GMT+3
2021.06.01 14:32:37.340 MetaTrader 4 build 1335 started (MetaQuotes Software Corp.)

Перезагрузка компа не помогла. Переустановку ОС прошу не предлагать. Слишком муторно…


PS: Странная ситуация… Запустил какую-то копию МТ4, сколько не обновлялась уже не узнать, терминал обновился, запустился получился билд 1335. Запустил отладку штатного индикатора, нормально. Скопировал свой индикатор, запустил отладку… тоже нормально. Запустил ту копию терминала и МЕ… НЕТ………… не работает. Где и что удалить, чтобы отладчик потерял тараканов?

PSPS: Я в шоке… Со второго запуска отладчика и в этом отладчике не стал показывать значения переменных.


PSPSPS: Я ещё раз в шоке. Намучился я с этой бедой до психического срыва. Ставил дважды новые терминалы, копировал туда тот злосчастный индикатор и шаблоны, в том числе Debug.tpl … И вот при очередной установке МТ в новую папку решил сделать новый шаблон……………………………… И о счастье, с новым шаблоном работает без проблем. Заменил шаблон в терминале с которого началась эта беда и … вы не поверите, но и этот отладчик начал работать.

На долго-ли¿ Откуда и каких тараканов нахватал? Хотелось-бы услышать разработчиков. Может кто захочет поэкспериментировать с тем шаблоном.

Файлы:
Debug.tpl  2 kb