Индикатор повреждается - страница 3

 
AnkaSoftware:

JIC, Пожалуйста, обратите внимание, что проблема не возникает на 32-битных платформах. Я предоставил некоторый код в одном из предыдущих сообщений.

У вас есть две (или более) отдельные машины, которые не обязательно получают абсолютно одинаковые данные. Например, 64-битная система может находиться на загруженном узле VPS, который периодически теряет трафик и/или соединения, например, потому что физический узел работает на предельном уровне использования процессора или пропускной способности. (Существует множество других возможных объяснений; это лишь одно из них).

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

В заключение вернусь к своему первоначальному утверждению: нет никаких причин, по которым 64-битная Windows должна вызывать проблемы, подобные тем, которые вы описываете. Многие люди писали на этом форуме, что MT4 не работает должным образом на платформах x, y и z, но в итоге выяснялось, что проблема была в их коде. Вы либо обнаружили первую за несколько лет добросовестную ошибку MQL4 в зрелом программном обеспечении, которым пользуются буквально миллионы людей, либо проблема в вашем коде. По имеющимся на данный момент доказательствам - например, отдельным вашим сообщениям о том, что проблема возникает то через 16 часов, то через 3-4 часа - вероятность того, что проблема вызвана случайными колебаниями в данных, которые вы не учитываете должным образом, подавляющая.
 

AnkaSoftware:

a) Коррупция индикаторов происходит только на платформе Windows 64 bit

d) Код используется следующим образом

Декларации

<code>

#property indicator_chart_window



  1. Не устанавливать в \Program Files* на Vista/Win7
  2. void DrawMoveEx(double& serie[], int start, int end, double startlevel, double endlevel) {
    double a = (endlevel - startlevel) / (start - end);
    double y;
    int bar;
    for(int x = 0; x <= start - end; x++) {
    y = a * x;
    bar = start - x;
    serie[bar] = startlevel + y;
    }
    }
    Не совсем понятно, что вы пытаетесь здесь сделать. Во-первых, вы вычисляете много значений (начало...конец), но храните только ОДНО (serie[bar]) Я бы закодировал его:
    void DrawMoveEx(double& serie[], int start, int end, double startlevel, double endlevel) {
       double a = (endlevel - startlevel) / (start - end);
       for(int x = start; x <= end; x++) serie[x] = a * x + startlevel;
    }

 
Прилагается пример индикатора, который воспроизводит проблему. На 64-битной платформе Windows прикрепите индикатор к графику M1 и дайте ему поработать в течение 4+ часов.
Файлы:
 
AnkaSoftware:
Прилагается пример индикатора, который воспроизводит проблему. На 64-битной платформе Windows прикрепите индикатор к графику M1 и дайте ему поработать 4+ часа.
Извините, у меня не хватает терпения выделить для этого чистую 64-битную машину и ждать 4 или более часов.

Однако, если этот индикатор действительно воспроизводит проблему, то я должен согласиться, что это интересно. Я не могу сразу понять, где может скрываться какая-то внутренняя проблема. (Предполагая, как и раньше, что вы точно исключили такие вещи, как корреляция между возникновением проблемы и недавним всплеском связи между MT4 и брокером. Вы упомянули о своей вере в CNS; вы не подтвердили, что журнал MT4 не содержит упоминаний о проблемах с соединением, которые, в свою очередь, могли бы вызвать обратное заполнение истории баров).

Если вы хотите пойти по пути проблемы MT4, то, скорее всего, она связана с передачей массивов индикаторов по ссылке. Массивы в MQL4 обладают странными свойствами, например, они всегда статичны, и я полагаю, что, возможно, существует странная скрытая проблема с передачей специальных массивов индикаторного буфера по ссылке, которая вызывает проблемы только на Win64. Хотя почему операционная система должна иметь значение в подобном контексте, остается полной загадкой.

Я бы попробовал изменить DrawMoveEx() так, чтобы она больше не принимала ссылку на массив индикаторов, а вместо этого были отдельные функции, такие как DrawMoveEx_Down1(), DrawMoveEx_Up1() и т.д., которые просто обращаются к буферам как к глобальным переменным. Если это что-то меняет, то поздравляю, вы почти наверняка нашли ошибку в MT4. Возможно, уже вторую за сегодня.
 
AnkaSoftware:
Прилагается пример индикатора, который воспроизводит проблему. На 64-битной платформе Windows прикрепите индикатор к графику M1 и дайте ему поработать в течение 4+ часов.
На Windows 7 Ultimate 64 bit индикатор работает уже более 5 часов, никаких проблем.
 
RaptorUK:
Работает уже более 5 часов на Windows 7 Ultimate 64 bit, никаких проблем.

JIC a) По вашему совету изменил код, удалив передачу ссылки, проблема не решена. Модифицированный код прилагается.

б) Отсутствие баров, на которые вы ссылаетесь, скорее всего, связано с условием отсутствия торговли, поэтому брокер не отправлял бары. ИМХО, в случае потери связи, отсутствующие бары будут доступны после восстановления связи. Если вы посмотрите мой пример кода, там нет зависимости от того, что бары смежные.

Raptor, Спасибо за тестирование. Возможно, вам нужно войти в систему, чтобы увидеть ошибку. Я смог воспроизвести проблему на Windows Server 2008 R2 Enterprise. Так что это может быть проблема операционной системы. Не подскажете, откуда можно получить список рекомендуемых патчей для MT4, для конкретной платформы.

.

Файлы:
 
AnkaSoftware:

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

Такого списка не существует. Просто существует одна версия MT4, которая работает на всех версиях Windows, и нет никаких особых причин, почему их должно быть несколько. Не существует версий или патчей для конкретных ОС.
 
AnkaSoftware:
Прилагается пример индикатора, который воспроизводит проблему. На 64-битной платформе Windows прикрепите индикатор к графику M1, и пусть он работает в течение 4+ часов.
Все еще работает нормально, насколько я могу судить... как мне воспроизвести ошибку?
 
RaptorUK:
Все еще работает нормально, насколько я могу судить... Как воспроизвести ошибку?
Вам не нужно ничего делать. Кроме как увеличить график, чтобы увидеть, произошла ли ошибка.
 
AnkaSoftware:
Вам не нужно ничего делать. Кроме как увеличить масштаб графика, чтобы увидеть, произошла ли ошибка.

Если я ищу линии, которые кажутся оторванными от столбцов графика (как в вашем первом сообщении), то я не получаю никаких проблем.