Скачать MetaTrader 5

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

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

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

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

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

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



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

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


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


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


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



Ihor Herasko
16502
Ihor Herasko  
igrok333:

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

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


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


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


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

igrok333
1009
igrok333  
Ihor Herasko:

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

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

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

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

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

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

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

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

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

igrok333
1009
igrok333  
Alexey Viktorov:

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

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

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

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

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

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

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

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

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

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

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

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

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

Ihor Herasko, 2018.01.11 21:00

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


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

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

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

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

igrok333
1009
igrok333  
Alexey Viktorov:

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


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

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

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

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

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

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

Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий