Аварийный перезапуск, сохранение/восстановление переменных?

 

Здравствуйте, уважаемые трейдеры.

Наверное, это старая тема для опытных, но новая для меня.

Кто как решает проблему аварийной остановки работы терминала (внезапный сбой программы или машины, на которой она работает) с последующим перезапуском? Мой советник работает по принципу серии сделок, последняя из которых должна закончится профитом. Перед профитной сделкой иногда (если ошибиться со входом и параметрами входа) возникает несколько убыточных сделок, серия может продолжаться от нескольких минут до 2-3 дней. На протяжении этого времени в памяти машины есть несколько вычесленных переменных, которые нужны программе для успешной работы, в случае перезапуска терминала они будут утеряны и стратегия нарушена. 

Мои предположения:

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

2. Вычислять все переменные заново, исходя из рынка и истории сделок. Недостатки: значительное уложение кода,  много вариантов, геморой в общем.

 

Возможно, я пытаюсь изобрести велосипед? 

 
JohnGotti:

Здравствуйте, уважаемые трейдеры.

Наверное, это старая тема для опытных, но новая для меня.

Кто как решает проблему аварийной остановки работы терминала (внезапный сбой программы или машины, на которой она работает) с последующим перезапуском? Мой советник работает по принципу серии сделок, последняя из которых должна закончится профитом. Перед профитной сделкой иногда (если ошибиться со входом и параметрами входа) возникает несколько убыточных сделок, серия может продолжаться от нескольких минут до 2-3 дней. На протяжении этого времени в памяти машины есть несколько вычесленных переменных, которые нужны программе для успешной работы, в случае перезапуска терминала они будут утеряны и стратегия нарушена. 

Мои предположения:

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

2. Вычислять все переменные заново, исходя из рынка и истории сделок. Недостатки: значительное уложение кода,  много вариантов, геморой в общем.

 

Возможно, я пытаюсь изобрести велосипед? 

Есть ещё глобальные переменные терминала те что GlobalVariable
 

Если переменных не много, то можно посмотреть в сторону глобальных переменных терминала

В противном случае - файлы. Файл не обязательно закрывать только в конце работы программы, можно "записал-закрыл". Записывать же также не обязательно только в конце работы программы, можно по мере того, как состояние нужных переменных меняется.

У себя в программах я объявляю структуру со всеми нужными мне данными и по мере необходимости делаю запись посредством FileWriteStruct. Запись делаю при каждом изменении данных в экземпляре структуры (правда тут тоже нужно голову иметь - если 10000 раз подряд меняются данные, то лучше записывать хотя бы не чаще раза в несколько секунд). Соответственно, при старте программы считываем в экземляр нашей структуры также все данные через FileReadStruct. После чтения проверяем данные на валидность и если что-то не то, то рассчитываем с нуля (что возможно). Но ошибок при чтении не было ещё ни разу (использую такой подход больше года).

Глобальные переменные клиентского терминала - Документация на MQL4
  • docs.mql4.com
Глобальные переменные клиентского терминала - Документация на MQL4
 

Спасибо, направили в нужную сторону. 

У меня на MQL5 пока программа (под 4 сделаю на днях). Как я понял из справочника, глобальные переменные терминала, как и  переменные программы, "висят" в ОЗУ, пока их принудительно не скинем по GlobalVariablesFlush  на диск? В таком случае, получается, что в любом случае нужно использовать запись в файл после смены переменных, и слабое место тогда одно - сбой непосредственно в момент записи, что маловероятно (учитывая что "нужные переменные" меняются только при совершении сделки, а рыночные писать смысла нет, их нужно брать с рынка) ?

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

Вообще же можно совмещать: если данных, записанных ранее нет, или они невалидны, то пересчитать.

Вопрос только в целесообразности. Иногда и правда решения со сбросом на диск почти никак не влияют на скорость, особенно если рассчитали начальное значение при старте советника и дальше погнали корректировать в процессе работы в ОЗУ. Частный пример - размер максимального эквити, просчитали при первом тике после старта советника по истории сделок и данным о High/Low цен инструментов, а дальше только корректировать по текущей ситуации.

 
Для контр трендовой стратегии я выбрал решение - индикатор, показывающий точки, где должны были быть открыты ордера.
 
-Aleks-:
Для контр трендовой стратегии я выбрал решение - индикатор, показывающий точки, где должны были быть открыты ордера.
У меня есть такой. А в чём преимущество "видеть когда должны были быть открыты ордера" ? Ведь в будущем мы ещё не знаем когда их открыть. Можно чуть подробней?
 
artmedia70:
У меня есть такой. А в чём преимущество "видеть когда должны были быть открыты ордера" ? Ведь в будущем мы ещё не знаем когда их открыть. Можно чуть подробней?
Если говорить про мой случай, то при использовании сетки с неравномерным шагом бывает важно определить размер лота с учетом того, что были открыты не все ордера или часть из них уже закрыта - т.е. работа с истории ордеров невозможна, а раз ожидаемое событие ещё ожидается (да-да коррекция), то есть смысл пропустив пару сигналов увеличить лот так, как будто не было этого пропуска, но с корректировкой на компенсации виртуально открытых позиций (которых и не было).
 
-Aleks-:
Если говорить про мой случай, то при использовании сетки с неравномерным шагом бывает важно определить размер лота с учетом того, что были открыты не все ордера или часть из них уже закрыта - т.е. работа с истории ордеров невозможна, а раз ожидаемое событие ещё ожидается (да-да коррекция), то есть смысл пропустив пару сигналов увеличить лот так, как будто не было этого пропуска, но с корректировкой на компенсации виртуально открытых позиций (которых и не было).
А-а-а, ясно. Спасибо.
Причина обращения: