Что происходит при отключении интернета

 

Сегодня наблюдал такую картину.

С пятницы оставил работать три совы. Алгоритмы абсолютно одинаковые у всех трех, только включаются в разное время на разных графиках. Одна сова была в рабочем состоянии, т.е. прекратила торговлю с вечера пятницы и должна был возобновить ее в понедельник (что и произошло). Две других не торговали и должны были начать торговлю в 8 утра в понедельник. Когда возобновилась торговля в понедельник, то первая сова продолжила работу, никаких проблем не наблюдалось, две других мирно спали дожидаясь восьми утра. Где-то в 5 утра пропал интернет, который появился только в 10. И тут началось следующее - уже торговавшая сова сошла с ума сразу.  Одна из спящих начала торговлю, но сошла с ума минут через десять. Третья начала торговать и работала в нормальном режиме. Правда, как выяснилось через минуту, метатрейдер висел и не позволял отключить "уехавших" сов. Пришлось выключать комп.

Мне казалось, что если интернет пропадает, то соответственно  никаких тиков не приходит. А когда они начинают приходить, то все должно просто возобновить работу. Разве это не так?

 
Reactor555:

Мне казалось, что если интернет пропадает, то соответственно  никаких тиков не приходит. А когда они начинают приходить, то все должно просто возобновить работу. Разве это не так?

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

 
Alexey Viktorov:

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


Можно конкретнее, так программировать это как?  совы у меня очень простые. Каждый тик проверяют сколько ордеров закрылось и либо ничего не делают либо добавляют ордер.  Что надо допрограммировать в ontick,  чтобы после прерывания связи совы с ума не сходили?

 
Reactor555:

Можно конкретнее, так программировать это как?  совы у меня очень простые. Каждый тик проверяют сколько ордеров закрылось и либо ничего не делают либо добавляют ордер.  Что надо допрограммировать в ontick,  чтобы после прерывания связи совы с ума не сходили?

Конкретней не получится не видя кода.

А в общих чертах, примерно так:

При перезапуске всё своё советник должен собрать в кучку. И строго следить за магиками и символами на которые запущен советник.

Соответственно проверка на "свой-чужой" должна проводиться и на магик, и на символ.

Проверка исполнения приказов с обработкой ошибок.

Перед отправкой приказа желательно проверить свободен-ли поток. Но собственно это тоже входит в обработку ошибок.

 

Я так и делаю. Разница лишь в том, что у меня не стоит проблемы свой-чужой. Я все ордера отбираю строго по номерам тикетов. Каждый советник работает только с ордерами которые он сам создал, и никакими другими. Разумеется проверяю  Свободен ли поток, и код ошибки. Но как оказалось сегодня утром этого мало. Сама ситуация, когда терминал вдруг повис, а советники делают непонятно что, она как-то выходит за рамки здравого смысла. Советники работали так, как будто несколько переменных потеряли свои значения. Другими словами я понимал что они делают, но ужас в том что делать они этого были не должны. Учитывая что работают они очень давно, предположить что в коде какая-то ошибка я не могу. Если предположить, что из-за отключения интернета, некоторые переменные могут терять свои значения, то какой смысл в программировании. Это может означать что весь этот терминал один сплошной глюк. 

Видимо придется самому вынимать провод, имитируя отключение интернета, смотреть что при этом происходит, и что-то выдумывать.

 
Reactor555:

Я так и делаю. Разница лишь в том, что у меня не стоит проблемы свой-чужой. Я все ордера отбираю строго по номерам тикетов. Каждый советник работает только с ордерами которые он сам создал, и никакими другими. Разумеется проверяю  Свободен ли поток, и код ошибки. Но как оказалось сегодня утром этого мало. Сама ситуация, когда терминал вдруг повис, а советники делают непонятно что, она как-то выходит за рамки здравого смысла. Советники работали так, как будто несколько переменных потеряли свои значения. Другими словами я понимал что они делают, но ужас в том что делать они этого были не должны. Учитывая что работают они очень давно, предположить что в коде какая-то ошибка я не могу. Если предположить, что из-за отключения интернета, некоторые переменные могут терять свои значения, то какой смысл в программировании. Это может означать что весь этот терминал один сплошной глюк. 

Видимо придется самому вынимать провод, имитируя отключение интернета, смотреть что при этом происходит, и что-то выдумывать.

А что будет если советник открыл ордер, запомнил его тикет и пришлось перегрузить терминал? После перезагрузки советник соберёт свои ордера в кучку?

А дальнейшее обсуждение без кода не имеет смысла. Да и с кодом не означает что я буду его внимательно изучать весь. Может выложишь основные куски, где и какие переменные могли потерять значения? Но это из серии очевидное невероятное. Так быть не может. Повесить терминал советник может из-за неправильной обработки ошибок. Например, достигнуто предельное количество открытых ордеров, а советник продолжает долбить пока не поставит ордер... Глупей примера я не могу придумать, это первое что пришло в голову и совсем не означает что эта ошибка имеется в твоём коде.

 

потеря данных из объявленных, даже из тех что перед инициализацией, переменных это вполне стандартный случай, надо хранить данные так чтоб их было невозможно потерять, например в глобальных переменных или выгружать данные в файл, потому как случись что, то система должна безболезненно восстановить свою работу а не слетать с катушек

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

с уважением.
 

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

пс. начинать торговать нужно через 5-10 секунд после коннекта.

 

Andrey Kisselyov:
загружать тикеты в массивы, создавать какие то переменные не имеет смысла


с уважением.

Честно говоря я так и делал. Все ключевые параметры хранил в переменных, номера тикетов хранил в массивах. Никак не предполагал что их данные могут по каким-либо причинам теряться или изменяться помимо моей воли. Крепко задумался... никак не предполагал что искусство написания советника заключается Не в логике стратегии торговли, А в умении обрабатывать возможные глюки.

Спасибо за советы. С уважением ко всем.

 
Taras Slobodyanik:

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

пс. начинать торговать нужно через 5-10 секунд после коннекта.

Я думал над этим. Весь вопрос в том, как часто проверять наличие коннекта. Ведь в теории Может даже получится Так, что проверив Коннект или занятость потока непосредственно перед выставлением ордера, к моменту  выполнения следующей строки кода коннекта, уже не будет. А если такое допустить, то встает вопрос тире А какой смысл тогда вообще всё это проверять? Только лишь для того чтобы снизить вероятность возникновения такой ситуации?

Мне всё же кажется дикостью ситуация, когда значения переменных самопроизвольно меняются в процессе выполнения программы. Одно дело если за время отсутствия связи что-то такое произошло, с чем советник не справился. Другое дело когда отсутствие связи повлекло изменение целого ряда значений переменных или массивов. У меня в голове не укладывается Как такое возможно. Если переменной присвоить значение, то она должна его хранить до тех пор пока программа не закончит свою работу или пользователь (программа) сам не поменяет ее значение.. Это основа любого программирования.