Советник закрывает сделки, когда он увеличит Эквити на n долларов. Как реализовать, если в соседнем окне работает другой советник. Советник должен учитывать только свое увеличение эквити.

 
Советник должен закрыть все свои сделки когда он увеличит Эквити на 100 долларов (то есть заработает 100 долларов).

Если бы он был один в терминале, все было бы просто.

При запуске советника нужно было бы запомнить уровень средств AccountInfoDouble(ACCOUNT_EQUITY).

И потом  отслеживать изменение средств на счету.

Но как сделать если рядом работает другой советник?



Мой вариант. При запуске советника в ините запоминаем время запуска t.

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


потом суммируем профиты открытых и закрытых.


Хочу спросить у более опытных программистов, проканает такой вариант?


 Может есть более простой вариант?



 
igrok333:

Мой вариант. При запуске советника в ините запоминаем время запуска t.

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


потом суммируем профиты открытых и закрытых.


Хочу спросить у более опытных программистов, проканает такой вариант?


По большому счету все верно. Проблемы в нюансах. Например: что делать при переинициализации? При описанном варианте каждый новый Init() будет сбрасывать прогресс эквити в 0. Таким образом, напрашивается запись прогресса в глобальные переменные терминала или в файл. 

 
Ihor Herasko:

По большому счету все верно. Проблемы в нюансах. Например: что делать при переинициализации? При описанном варианте каждый новый Init() будет сбрасывать прогресс эквити в 0. Таким образом, напрашивается запись прогресса в глобальные переменные терминала или в файл. 

да. при смене таймфрейма происходит переинициализация (не знаю зачем это сделано разработчиками именно при смене таймфрейма)

Ну можно тогда на первом тике брать значение времени t, и потом устанавливать флаг в положение false.
так пойдет?
 
igrok333:
да. при смене таймфрейма происходит переинициализация (не знаю зачем это сделано разработчиками именно при смене таймфрейма)

Ну можно тогда на первом тике брать значение времени t, и потом устанавливать флаг в положение false.
так пойдет?

После успешного открытия позиции, писать эквити/баланс в глобальную переменную терминала, потом её сравнивать с прибылью по текущему символу и с определённым Magic.

Таким образом переинициализация не страшна.

Документация по MQL5: Глобальные переменные терминала
Документация по MQL5: Глобальные переменные терминала
  • www.mql5.com
Глобальные переменные существуют в клиентском терминале 4 недели с момента последнего обращения, после этого автоматически уничтожаются. Обращением к глобальной переменной считается не только установка нового значения, но и чтение значения глобальной переменной.
 

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

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

 
Alexey Viktorov:

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

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

нет. нужно проводить отслеживание сколько именно этот советник наторговал.
закрытые тоже.
 
Vitaly Muzichenko:

После успешного открытия позиции, писать эквити/баланс в глобальную переменную терминала, потом её сравнивать с прибылью по текущему символу и с определённым Magic.

Таким образом переинициализация не страшна.

А вот так прокатит?

"Ну можно тогда на первом тике брать значение времени t, и потом устанавливать флаг в положение false."
 
igrok333:
А вот так прокатит?

"Ну можно тогда на первом тике брать значение времени t, и потом устанавливать флаг в положение false."

Перегрузите терминал, и значения по нулям

 
igrok333:
нет. нужно проводить отслеживание сколько именно этот советник наторговал.
закрытые тоже.

За сутки? Или от определённого времени? Правильный вопрос ставится:

Форум по трейдингу, автоматическим торговым системам и тестированию торговых стратегий

Советник закрывает сделки, когда он увеличит Эквити на n долларов. Как реализовать, если в соседнем окне работает другой советник. Советник должен учитывать только свое увеличение эквити.

Ihor Herasko, 2018.01.11 21:00

По большому счету все верно. Проблемы в нюансах. Например: что делать при переинициализации? При описанном варианте каждый новый Init() будет сбрасывать прогресс эквити в 0. Таким образом, напрашивается запись прогресса в глобальные переменные терминала или в файл. 


Вместо того чтобы решать эту проблему, вы сетуете на разработчиков... А "завтра" появится необходимость переинициализации при смене периода и опять будут недовольства в адрес разработчиков... Ну не правильно-же это.

Наверное лучший вариант писать увеличение баланса и эквити в GV и при достижении определённого уровня, сбрасывать в 0. Тогда при инициализации читать эту GV и к ней плюсовать текущую прибыль.

Хотя тоже есть нюанс. Если во время выключенного терминала закрылась какая-то позиция, то она не будет учтена.

И тут напрашивается вопрос: А надо-ли это??? Ведь если советник принёс прибыль, то зачем его ограничивать, сдерживать? Пусть скачет галопом...

 
Alexey Viktorov:

За сутки? Или от определённого времени? Правильный вопрос ставится:


Вместо того чтобы решать эту проблему, вы сетуете на разработчиков... А "завтра" появится необходимость переинициализации при смене периода и опять будут недовольства в адрес разработчиков... Ну не правильно-же это.

Наверное лучший вариант писать увеличение баланса и эквити в GV и при достижении определённого уровня, сбрасывать в 0. Тогда при инициализации читать эту GV и к ней плюсовать текущую прибыль.

Хотя тоже есть нюанс. Если во время выключенного терминала закрылась какая-то позиция, то она не будет учтена.

И тут напрашивается вопрос: А надо-ли это??? Ведь если советник принёс прибыль, то зачем его ограничивать, сдерживать? Пусть скачет галопом...

ну можно же было сделать так, чтобы в свойствах  #property записывалось отсутствие потребности в переинициализации при смене таймфрейма.
 
igrok333ну можно же было сделать так, чтобы в свойствах  #property записывалось отсутствие потребности в переинициализации при смене таймфрейма.

В функции OnDeinit() анализируйте причину выхода. Если это переключение ТаймФрейма - записывайте (в файл или глобалы) нужные значения. В OnInit() анализируйте прошлую причину выхода и нужное восстанавливайте. А то так Вы и к движению планет начнете претензии предъявлять.

Причина обращения: