Вопрос : почему-то идет загрузка огромных объемов данных с сервера - страница 3

 
jartmailru:

Ох ёлки-палки... точно :-). Копи-паст, однако.

Но если эту строчку закомментировать, то результат в плане закачки данных тот же :-).

Так что код можно, в общем-то, не менять.

Не поможет. Все равно мертвый цикл выходит так как функция вызывает сама себя бесконечно.
 
Andrei01:
Не поможет. Все равно мертвый цикл выходит так как функция вызывает сама себя бесконечно.

Докажите логами.

Print("start()"); в начале функции.

И что будет в логе?

Моё мнение- что будет один start(). 

 
jartmailru:

Докажите логами.

Print("start()"); в начале функции.

И что будет в логе?

Моё мнение- что будет один start().

Ну как? Шо пишет лог?
 
Andrei01:
Ну как? Шо пишет лог?

Советник в том виде, как я его приложил- работает.

А вот вашу теорию подтвердите проверкой-- я намекаю на ваше утверждение 

"Все равно мертвый цикл выходит так как функция вызывает сама себя бесконечно."

 

Это не теория... Вы на код гляньте сначала разок... Есть бесконечный вызов функцией самой себя. Отрицать очевидное надеюсь не будете?

Даже проверки никакие не требуются.

 
Andrei01:

Это не теория... Вы на код гляньте сначала разок... Есть бесконечный вызов функцией самой себя. Отрицать очевидное надеюсь не будете?

Даже проверки никакие не требуются.

Стараюсь проверять. Если есть возможность- автоматическими тестами. 

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

 
jartmailru:

Стараюсь проверять. Если есть возможность- автоматическими тестами. 

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

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

Только у меня  SendMessage() была.

 

Попробуйте при первом входе в start создавать критическую секцию, а при повторных вызовах, если секция занята, просто выходите из start - эта функция нереентерабельна, т.е. виртуальная машина терминала не сохраняет инфу о том, что она уже вошла однажды в start и еще не вышла. Вот кусочек сишного кода, который я у себя использовал в dll:

CRITICAL_SECTION csLock;
static int Lock = 0;

MT4_EXPFUNC int __stdcall SetLock(void)
{
  EnterCriticalSection(&csLock);
  Lock++;
  TRACE("++Lock = %d", Lock);
  LeaveCriticalSection(&csLock);
  return Lock;
}

MT4_EXPFUNC int __stdcall CheckLock(void)
{
  return Lock;
}

MT4_EXPFUNC int __stdcall ClearLock(void)
{
  EnterCriticalSection(&csLock);
  Lock--;
  TRACE("--Lock = %d", Lock);
  LeaveCriticalSection(&csLock);
  return Lock;
}
А еще для приостановки тестера в визуальном режиме можно просто программно нажимать кнопку паузы - такой вариант не подходит?
 
marketeer:

А еще для приостановки тестера в визуальном режиме можно просто программно нажимать кнопку паузы - такой вариант не подходит?

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

(например, останавливаемся на открытии 1ого бара начала сессии).

И так же модифицировать + показывать изменения.

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

Если использовать паузу, то команда будет выполняться не совсем там, где нужно,

а с запозданием. Потиковая эмуляция- слишком долго. Достает.

.

На всякий случай:

- эмуляцию тика эксперта в моем примере можно комментировать- результат не меняется

- зацикливания не происходит, ф-ция старт выполняется один раз и висит в цикле.

.

Единственный вопрос- почему терминал качает слишком много данных... 

 

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

Кроме того, он бесконечно (ежесекундно) бомбардирует окно терминала недокументированной командой CHART REFRESH, заставляя его принудительно синхронизировать/перепроверять базу истории. Совершенно неудивительно, что трафик будет расти от таких бомбардировок.

Так писать нельзя.

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