Скачать MetaTrader 5

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

Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий
Получи статус продавца и начни продавать свои сигналы!
JohnGotti
60
JohnGotti 2015.03.29 09:55 

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

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

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

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

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

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

 

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

Alexandr Bryzgalov
27515
Alexandr Bryzgalov 2015.03.29 10:16  
JohnGotti:

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

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

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

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

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

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

 

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

Есть ещё глобальные переменные терминала те что GlobalVariable
Sergey Eremin
4362
Sergey Eremin 2015.03.29 10:22  

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

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

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

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

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

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

Artyom Trishkin
Модератор
75718
Artyom Trishkin 2015.03.29 10:35  
Всегда рассчитываю нужные данные из того окружения, которое имеем на данный момент. И даже в тестере работает с приемлемой скоростью. Плюс - не парюсь по поводу потери данных и износа винчестера.
JohnGotti
60
JohnGotti 2015.03.29 10:39  
Лучше будет тогда проработать оба варианта и выбрать потом наиболее простой и эффективный.
Sergey Eremin
4362
Sergey Eremin 2015.03.29 10:47  

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

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

-Aleks-
7001
-Aleks- 2015.03.29 20:24  
Для контр трендовой стратегии я выбрал решение - индикатор, показывающий точки, где должны были быть открыты ордера.
Artyom Trishkin
Модератор
75718
Artyom Trishkin 2015.03.29 21:21  
-Aleks-:
Для контр трендовой стратегии я выбрал решение - индикатор, показывающий точки, где должны были быть открыты ордера.
У меня есть такой. А в чём преимущество "видеть когда должны были быть открыты ордера" ? Ведь в будущем мы ещё не знаем когда их открыть. Можно чуть подробней?
-Aleks-
7001
-Aleks- 2015.03.29 21:31  
artmedia70:
У меня есть такой. А в чём преимущество "видеть когда должны были быть открыты ордера" ? Ведь в будущем мы ещё не знаем когда их открыть. Можно чуть подробней?
Если говорить про мой случай, то при использовании сетки с неравномерным шагом бывает важно определить размер лота с учетом того, что были открыты не все ордера или часть из них уже закрыта - т.е. работа с истории ордеров невозможна, а раз ожидаемое событие ещё ожидается (да-да коррекция), то есть смысл пропустив пару сигналов увеличить лот так, как будто не было этого пропуска, но с корректировкой на компенсации виртуально открытых позиций (которых и не было).
Artyom Trishkin
Модератор
75718
Artyom Trishkin 2015.03.29 22:56  
-Aleks-:
Если говорить про мой случай, то при использовании сетки с неравномерным шагом бывает важно определить размер лота с учетом того, что были открыты не все ордера или часть из них уже закрыта - т.е. работа с истории ордеров невозможна, а раз ожидаемое событие ещё ожидается (да-да коррекция), то есть смысл пропустив пару сигналов увеличить лот так, как будто не было этого пропуска, но с корректировкой на компенсации виртуально открытых позиций (которых и не было).
А-а-а, ясно. Спасибо.
12
Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий