IsConnected() или IsTradeAllowed() всегда false ! Глюк в системе ?.. или в моем уме ?..

 

Странная ситуация какая-то...

IsConnected() или IsTradeAllowed() упорно возвращают false...

Хотя никаких причин для этого нет совершенно...

При всем при этом GetLastError() возвращает значени 0 !

После перезагрузки терминала, все начинает работать нормально. ..

На этом форуме (или на форуме LiteForex) я уже встречал месяц назад один пост, где парень описывал подобную ситуацию...

Тогда не обратил на это сообщение особого внимания.

Помню только, что парня тогда засмущали, мол все в порядке просто советник у него косолапый и что-то он там не правильно напрограммировал. У него кстати GetLastError() тоже возвращал 0.

И тут вдруг у меня аналогичный случай.

Вообщем моя ситуация такова.

Описываю:

Написал две недели назад новый советник. Алгоритм простой, торгует по принципу доливок. Интересно было испытать эту тактику. Поставил две недели назад на демо. На евро – доллар. Торговал без ошибок (хотя обработка ошибок в советнике заложена мощная), аж душа радовалась.

Примерно через неделю торгов наблюдая ситуацию. Советник упорно выводит в файл лога запрограммированное мной сообщение “функция IsConnected( ) или IsTradeAllowed( ) вернула значение false! Торговля невозможна”.

При этом выводится значение GetLastError(), и оно равно 0.

Видимых причин никаких нет. Советник совершенно не бомбил торговый сервер запросами перед тем как случилась эта ситуация. Более того, у меня заложена трехминутная пауза, если ошибка повторяется часто в течении 20 минут. Так вот после паузы, ситуация не меняется. Вобщем пару часов наблюдал за этим делом и паузами советника. Ошибка не уходила. Интернет разумеется был. Потом перезагрузил советник и все заработало нормально.

Проверил программный код.

Все вроде предельно просто... программной ошибки вроде быть не может...

Код примерно следующий

if (IsConnected()==false || IsTradeAllowed()==false)

{

Print(“функция IsConnected( ) или IsTradeAllowed( ) вернула значение false! Торговля невозможна”);

.......

}

Тогда не придал этому особого значения... подумал мало ли... может какой глюк однократный.

А сегодня (спустя примерно неделю после предыдущего раза) ночью эта ситуация повторилась снова.

И продолжалась до самого утра.

GetLastError() тоже возвращал 0.

Потом я перезагрузил терминал (билд 211).... после этого все снова заработало нормально.

Отмечу еще один важный момент... торговал на двух графиках, двумя экземплярами советника, на одном постоянно в селл, на другом постоянно в бай.

Кто-то скорее всего предположит, что оба советника пытались получить одновременный доступ к торговому потоку и это продолжалось на каждом тике часами. Но тут тогда я отмечу следующие три момента:

  1. Советник, если торговый поток занят, делает паузу. Причем пауза у разных экземпляров советника различна (чтоб не пытаться снова получить доступ одновременно с другим советником к торговому потоку). Если это не помогает, то и вовсе не торгует в течении нескольких минут (эта пауза тоже различна у различных экземпляров советника).
  2. Если предположить все же, что советники не поделили торговый поток, то почему только один из них выводил сообщение в файл лога, а не оба ?
  3. Если даже советники и не поделили торговый поток, то почему GetLastError() возвращает 0 ??

Вообщем такая вот странная ситуация.

Повторяется редко.

Лечиться перезагрузкой терминала.

Может у кого-то есть подобный опыт ?.. или какие-то мысли по данной ситуации ??

Интересно услышать Ваши комментарии.

 

bool IsTradeAllowed( )
Возвращается TRUE, если эксперту разрешено торговать и поток для выполнения торговых операций свободен, иначе возвращает FALSE.

Я, например, успешно использую эту функцию для определения состояния кнопки советников (советник с фингалом:) Возможно, Вы это не анализировали, а нажимали эту кнопку автоматически.


===========

У меня просматривается подобная проблема. В выходные дни не удаётся распознать факт разрешения на торги.

      TRADEALLOWED= MarketInfo( SYMB, MODE_TRADEALLOWED );  // Разрешение торгов по указанному инструменту

TRADEALLOWED вычисляется равным 1 у одних брокеров и 0 у других брокеров (предположительно, они там у себя не нажали кнопку в конце пятницы). При этом оба брокера возвращают ошибку 133 (торговля запрещена) в ответ на любой тоговый приказ.

===========

Есть ещё отдельный вопрос. Какое минимальное количество лотов можно указать для частичного закрытия ордера?

Альпари, например, даёт мин.лот = 0.1 и мин.шаг = 0.01. Закрыть ордер на количество лотов, меньше 0.1, не удаётся. Ни с панели, ни из программы.

 
SK. писал (а):

Есть ещё отдельный вопрос. Какое минимальное количество лотов можно указать для частичного закрытия ордера?
Альпари, например, даёт мин.лот = 0.1 и мин.шаг = 0.01. Закрыть ордер на количество лотов, меньше 0.1, не удаётся. Ни с панели, ни из программы.

И это логично ;)
От 0.1 с шагом 0.01.

Т.е. 0.1, 0.11, 0.12, 0.13 и т.д.
 
MaxsiM:

Странная ситуация какая-то...

Посмотрите похожую тему - Проверка состояния IsTradeAllowed()
 
komposter:
SK. писал (а):

Есть ещё отдельный вопрос. Какое минимальное количество лотов можно указать для частичного закрытия ордера?
Альпари, например, даёт мин.лот = 0.1 и мин.шаг = 0.01. Закрыть ордер на количество лотов, меньше 0.1, не удаётся. Ни с панели, ни из программы.

И это логично ;)
От 0.1 с шагом 0.01.

Т.е. 0.1, 0.11, 0.12, 0.13 и т.д.


Да не очень-то логично..

Если ордер открыт, например, на 2.57 лота, то сделать из него 2.50 невозможно.

А бывает надо, например, в соотв. с моей ситемой приоритетов очереди закрытия:

Дано Buy 2.57 и Sell 2.53 открыты одновременно, оба без стоп-приказов. Пользователь активизирует функцию "Закрыть всё". Задача решается по принципу "не навреди", а именно, сначала закрывается хвостик размером 0.04 лота, а потом встречно зеркальные ордера, каждый по 2.53. Принцип "не навреди" в данном случае предполагает именно такой порядок, т.к. безвредное "зеркало" достигается после одной торговой операции, что лучше, чем после двух (сначала встречно 2.53, а потом хвостик 0.04). Вот и необходимость.

 
komposter:
MaxsiM:

Странная ситуация какая-то...

Посмотрите похожую тему - Проверка состояния IsTradeAllowed()


komposter большое спасибо что откликнулись. Тему прочитал, но к сожалению, там совсем о другом пишется. В указанной Вами теме просто рассматривается для чего нужна функция IsTradeAllowed() и как она работает. Это я вроде объективно понимаю (по крайней мере я на это надеюсь))). Меня больше тревожит нетривиальность ошибки (более правильно будет написать её формальное отсутствие) в моём случае.

На другом форуме, по поисковому запросу IsTradeAllowed(), нашел следующее высказывание

"И ещё не забудьте учесть в Вашем алгоритме автоматическую перезагрузку терминала. А то когда ДЦ сервер перезагружает, у клиента терменал начинает "глючить" типа: при отправке ордера сообщение появляеться что, "нет связи" хотя видно что на графике цена меняеться, да и експерт вроде как прочитываеться, значит тики поступают. И это будет продолжаться пока не перезагрузишь терменал. Так что такая например ситуация, Вам не 70% просадки сделает а все 170%"...

Вот это, к моему превеликому сожалению, больше подходит под мой случай.

Я бы хотел верить, что написанное это не правда.

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

Какие есть соображения ?

 
SK. писал (а):

Да не очень-то логично..

Да, такой ситуации я не предусмотрел. Согласен.
 

Я на данный момент наблюдаю такую ситуацию.

Есть комп1 и комп2. На обоих вынь икспи со всеми обновлениями. Комп2 - это мой рабочий. Комп1 - это типа сервер. На нём две сетевые карты: одна смотрит в ADSL-момед, а другая в свичь, ну типа в локалку. На комп1 поднята НАТ. Это я описал окружение.

Теперь сама ситуация. С комп2 МТ4 нормально связывается с торговыми серверами. А с комп1 связь устанавливается очень долго - больше 3 минут. После установки связи при попытке выставить ордер или открыться с рынка сообщение "Нет связи". Иногда после перезагрузки МТ4 удаётся торгануть, потом опять "Нет связи". На комп2 всё отлично связывается и торгуется.

Теперь тоже самое другими словами. Инет с сервера хандрит. С клиентской машины через сервер всё ОК.

 
у меня подобная конфигурации сети
я запускал МТ4 и на сервере и на компьютерах из локалки - работает одинаково хорошо
 

А у меня на сервере только МТ4 не хочет работать. Всё остальное работает. Сейчас НАТ вырубил. Пробую просто выход в инет, без всего. Всё работает. Аська, сайты. А МТ4 через три раза на пятый.

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

 

Добавлю лог, из которого видно, что терминал коннектился более 5 минут

2008.01.05 02:32:21 '77393': login (4.00, #2A98C7B2)
2008.01.05 02:24:41 '77393': connect failed [Нет связи]
2008.01.05 02:24:17 Expert e-CloseByPercentProfit GBPUSD,H1: loaded successfully
2008.01.05 02:24:17 MetaTrader 4.00 build 211 started

А настройки IE не могут сказаться на качестве коннекта МТ4?