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

 
Reactor555:

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

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

В большинстве своём глюк не деталь, а тот кто её устанавливает.

Пишите правильно коды, и не в 20 строк, а как положено и со всеми проверками.

Перевидев много кодов за свою деятельность, видел и такие:

tic= OrderSend(Symbol(),OP_BUY,Lot,Ask,slippage,0,0,NULL,Magic,0,clrNONE);
if(tic>0) saveTic = tic;

...
OrderClose(saveTic,OrderLots(),Bid,slippage,Blue);

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

 
Reactor555:

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

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

Начните с изучения документации.

https://www.mql5.com/ru/docs/runtime/running

Раздел про загрузку и выгрузку программ, пункт про реконнект к счету.

 
Andrey Barinov:
Начните с изучения документации.

https://www.mql5.com/ru/docs/runtime/running



Спасибо. Очень полезно. Некоторые вопросы прояснило.

 

Vitaly Muzichenko:


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


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

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

Честно говоря, я даже не понимаю такой ошибки - поток занят. Те, кто писал обработчик событий никогда не слышали, что бывают алгоритмы обработки очередей FIFO или FILO?

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

Это конечно здорово, если кому-то удается писать советников так, что можно выключить комп, потом включить советника на другом компе и советник начнет работать как ни в чем не бывало. Но как передавать константы? Зашифроввывать их в магик что ли?.. или в комментарии к ордерам? А если нужны данные из закрытых ордеров? Лазить по всей истории?.. ну хорошо допустим... Это все сложно но выполнимо.
А как передать динамичекую информацию? Ведь ни магик ни комментарий модифицировать нельзя. Нет такой функции. Открывать "левый" ордер на большом удалении от рынка, в комментариях которого прописывать динамические переменные? неужели так кто-то делает?

 
Reactor555:

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

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

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


Если каждая сова запоминает тикет-то это наверняка нужно делать не в массивах а в файлах с перечнем тикетов для каждой совы,но проще "метить" сделки коментами,которые различает каждая из сов!С Уважением!

 
Nikolay Gaylis:

Если каждая сова запоминает тикет-то это наверняка нужно делать не в массивах а в файлах с перечнем тикетов для каждой совы,но проще "метить" сделки коментами,которые различает каждая из сов!С Уважением!


Можете пояснить, чем массивы плохи?

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

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

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

Массивы - идеальное решение.

 
Reactor555:

Можете пояснить, чем массивы плохи?

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

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

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

Массивы - идеальное решение.


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

 

Никак не соглашусь в идеальности массивов в Вашем случае...

 

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

bool NEWBAR(string Sy,int Pe)
  {
   if(progon==false && time_bar[s_s]<TimeCurrent()-Pe*60)
     {time_bar[s_s]=iTime(Sy,Pe,0);progon=true;}else {progon=false;}
   return(progon);
  }

            if(NEWBAR(S,P)==true)
              {
// код проверки ордеров
              }
 
Nikolay Gaylis:

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

Я делаю это так

// Изменения в рынке по количеству
  if(OrdersTotal()!=TotalPos) { // не мучаем цикл каждый тик
   // здесь цикл и заполнение
   TotalPos=OrdersTotal(); // запомним количество
  }
Причина обращения: