Запрет торговли советниками. Программная реализация

Обсуждаем вопросы связанные с разработкой программного кода.
Serge
Сообщения: 3
Зарегистрирован: 10 мар 2017, 13:57

Запрет торговли советниками. Программная реализация

Сообщение Serge » 10 мар 2017, 14:27

Ситуация такая. Торгую корзинами валют. Одновременно открыто в среднем 20 графиков, к каждому из графиков прикреплён свой советник.
Каждый день возникает ситуация, когда профит по Эквити начинает измеряться 10-15% от депозита. То есть на 3-4-х графиках минус, 3-4 графика в нуле, на остальных графиках (10-15 штук) - небольшой профит, но который даёт плюс "несколько процентов к депозиту". Ни стоп-лоссы, ни тэйк-профиты не отработаны.

Задача. Закрыть одновременно все позиции и сразу же запретить торговлю советниками.

Всё успешно реализовано. Ну, закрытие всех позиций не рассматриваем - это просто. Обсуждаем, как запретить торговлю советниками ЛЮБЫМ способом: отжатием кнопки "автоторговля" в терминале, одновременным закрытием терминалов, одновременным отсоединением всех советников от своих графиков или как-то ещё.

Я реализовал запрет торговли советниками через глобальные переменные так:
- открываем произвольный график и в начале дня прикрепляем к нему советника, анализирующего Эквити и закрывающего все позиции
- если Эквити превысила определённое значение, этот самый "контролирующий" советник изменяет значение глобальной переменной с 1 на 0
- первой строкой во всех моих торгующих советниках прописан if, проверяющий значение глобальной переменной, и если оно равно 0, то происходит простой return, то есть советники продолжают быть прикреплёнными к графикам и кнопка терминала "Автоторговля" не отключена.

Вопрос. Как проще реализовать запрет торговли советниками?

Аватара пользователя
Николай
Сообщения: 59
Зарегистрирован: 14 ноя 2016, 00:07

Re: Запрет торговли советниками. Программная реализация

Сообщение Николай » 11 мар 2017, 09:14

Не понятно что вы конкретно хотите у вас написано противоречие
Закрыть одновременно все позиции

и
Ну, закрытие всех позиций не рассматриваем - это просто.


но по моему просто можно прописать в советнике

Код: Выделить всё

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


а если вы запретите торговать советником нажатием на кнопку то ордера не удалятся с графика

да и удалять советник с графика не обязательно достаточно запретить ему торговать и удалить его ордера если конечно это надо
Как и на чем заработать уже за первый месяц и делать это снова и снова Узнайте как
Регистрация и учебные материалы бесплатно.

Serge
Сообщения: 3
Зарегистрирован: 10 мар 2017, 13:57

Re: Запрет торговли советниками. Программная реализация

Сообщение Serge » 11 мар 2017, 10:49

Николай писал(а):Не понятно что вы конкретно хотите у вас написано противоречие
[Закрыть одновременно все позиции]
и
[Ну, закрытие всех позиций не рассматриваем - это просто.]


"...не рассматриваем" - это не в смысле, что мне это не нужно, а просто предложение не обсуждать это. "Закрытие всех позиций" мной уже реализовано. Поэтому, и не обсуждаем это в этой теме.

Николай писал(а):а если вы запретите торговать советником нажатием на кнопку то ордера не удалятся с графика

да и удалять советник с графика не обязательно достаточно запретить ему торговать и удалить его ордера если конечно это надо
[/quote]

"Нажатие на кнопку" и "запретить ему торговать" - это ручные действия, требующие присутствия у компьютера. Мне же нужно, чтобы советники прекращали торговать, когда я отсутствую, при достижении определённого значения Эквити.

Аватара пользователя
Николай
Сообщения: 59
Зарегистрирован: 14 ноя 2016, 00:07

Re: Запрет торговли советниками. Программная реализация

Сообщение Николай » 11 мар 2017, 14:49

Я Вам написал как сделать на уровне программного кода советника

Код: Выделить всё

 if, проверяющий значение глобальной переменной, и если оно равно 0,
 создаём переменную которая запретит торговлю советника (переменная = false)
 и ниже этой переменной прописываем функцию для удаления всех ордеров этого советника

в коде где в написано открытие ордеров перед функцией прописываем условие если переменная ровна true тогда разрешаем торговлю

то есть получится так ваш советник который рассчитывает эквити счёта подаёт сигнал в глобальную переменную
советник который торгует считывает эту глобальную переменную и по определённому условию в вашем случае (если оно равно 0)
тогда мы созаём переменную для запрета торговли и закрываем ордера

а для нажатие кнопок на терминале я думаю без дополнительного ПО не обойтись
Как и на чем заработать уже за первый месяц и делать это снова и снова Узнайте как
Регистрация и учебные материалы бесплатно.

Serge
Сообщения: 3
Зарегистрирован: 10 мар 2017, 13:57

Re: Запрет торговли советниками. Программная реализация

Сообщение Serge » 11 мар 2017, 18:38

Николай писал(а):Я Вам написал как сделать на уровне программного кода советника
[ if, проверяющий значение глобальной переменной, и если оно равно 0,
создаём переменную которая запретит торговлю советника (переменная = false)
и ниже этой переменной прописываем функцию для удаления всех ордеров этого советника]

в коде где в написано открытие ордеров перед функцией прописываем условие если переменная ровна true тогда разрешаем торговлю

то есть получится так ваш советник который рассчитывает эквити счёта подаёт сигнал в глобальную переменную
советник который торгует считывает эту глобальную переменную и по определённому условию в вашем случае (если оно равно 0) тогда мы созаём переменную для запрета торговли и закрываем ордера


Спасибо, Николай за Ваше предложение по коду. Но именно так сделано мной уже год назад и отлично работает.
Повторю вопрос из начала темы. Как проще реализовать запрет торговли советниками?

Николай писал(а):а для нажатие кнопок на терминале я думаю без дополнительного ПО не обойтись


А по использованию дополнительного ПО (подключению DLL в частности) ждём ответа Валентина и других участников.

Аватара пользователя
Valentin
Администратор
Сообщения: 26
Зарегистрирован: 13 ноя 2016, 22:42

Re: Запрет торговли советниками. Программная реализация

Сообщение Valentin » 12 мар 2017, 21:48

Да, для управления кнопкой чисто средствами MQL не обойтись.
Я набросал простенькую программку, она каждые 5 секунд меняет состояние кнопки Авто-торговля.
Используются внешние библиотеки, поэтому при установке советника проследите что бы во вкладке Безопасность стояла галочка "Разрешить импорт функций из DLL"
На базе этого примера, я думаю не составит труда использовать его в своих разработках.
Обратите внимание что на включение что на отключение кнопки используется одна и та же команда (в примере строка дублируется) что бы ее впопад подавать нужно проверять состояние кнопки. Если удалить условие, например, включения кнопки, то при вызове функции она будет только отключаться (если включена), что и нужно для условия, заданного в теме. В общем приспосабливайте под свои нужды...
У вас нет необходимых прав для просмотра вложений в этом сообщении.

Фёдор
Сообщения: 4
Зарегистрирован: 30 мар 2017, 12:54

Re: Запрет торговли советниками. Программная реализация

Сообщение Фёдор » 30 мар 2017, 15:03

Ситуация такая. Торгую корзинами валют. Одновременно открыто в среднем 20 графиков, к каждому из графиков прикреплён свой советник.
Каждый день возникает ситуация, когда профит по Эквити начинает измеряться 10-15% от депозита. То есть на 3-4-х графиках минус, 3-4 графика в нуле, на остальных графиках (10-15 штук) - небольшой профит, но который даёт плюс "несколько процентов к депозиту". Ни стоп-лоссы, ни тэйк-профиты не отработаны.

Задача. Закрыть одновременно все позиции и сразу же запретить торговлю советниками.

Всё успешно реализовано. Ну, закрытие всех позиций не рассматриваем - это просто. Обсуждаем, как запретить торговлю советниками ЛЮБЫМ способом: отжатием кнопки "автоторговля" в терминале, одновременным закрытием терминалов, одновременным отсоединением всех советников от своих графиков или как-то ещё.

Я реализовал запрет торговли советниками через глобальные переменные так:
- открываем произвольный график и в начале дня прикрепляем к нему советника, анализирующего Эквити и закрывающего все позиции
- если Эквити превысила определённое значение, этот самый "контролирующий" советник изменяет значение глобальной переменной с 1 на 0
- первой строкой во всех моих торгующих советниках прописан if, проверяющий значение глобальной переменной, и если оно равно 0, то происходит простой return, то есть советники продолжают быть прикреплёнными к графикам и кнопка терминала "Автоторговля" не отключена.

Вопрос. Как проще реализовать запрет торговли советниками?


Да, однозначно следящий за эквити советник должен создавать глобальную переменную достижения прибыли, иначе просто может произойти программный "тянитолкай", если вдруг во время закрытия позиций одним советником на другом возникнет сигнал на открытие сделки. Здесь всё верно. Но, чтобы запретить открывать новые сделки, думаю, что необязательно отключать авто-торговлю. Достаточно прописать значение глобальной переменной в каждом советнике где происходит обработка условий для открытия сделки в операторе if, либо, там, где идёт вызов функции открытия ордеров. Всё это можно найти, просмотрев коды каждого советника, выделяя Ctrl+F нужные функции. В следящем за эквити советнике надо сделать в экстернах логическую переменную bool для ручного возврата глобальной переменной в исходное положение, либо просто прописать условия так, что если глобальная переменная в терминале изменится (допустим, вручную, через F3), она уже не вернётся в прежнее положение достигнутого эквити, в вашем случае, 0. Либо можно прописать, что если эквити на счёте меньше цели, допустим, на следующий день решили увеличить эту цифру в настройках, то глобальная переменная меняется опять на 1. Всё зависит от особенностей следящего советника - он закрывает сделки по достижению цели в валюте депозита или в процентах от него, считает прибыль за какое-то определённое время или без привязки к срокам. Я уже имею некоторый опыт в реализации тэйка по эквити и в моём случае я задал два значения глобальной переменной контроля за достижением тэйка по аналогии с true/false, то есть true, достигнут - это >=1, а по аналогии с false, то есть, ещё не достигнут <=0.

Ещё одно решение могу предложить - удалить все советники с графиков, если глобальная переменная стала со значением достигнутого тэйка. Пример реализации функции ExpertRemove() в одном из советников во вложении. При использовании этой функции также важно, чтобы каждый советник до своего удаления не успел открыть новую сделку.

Если так уж нужно именно отключать авто-торговлю в терминале, то могу предложить советник с открытым кодом, к-рый я скачал в кодобазе. Не помню его алгоритм и код в подробностях, запомнил только, что он кликает на кнопку авто-торговли. Возможно, механизм такой же, как предложил Валентин в предыдущем посте. Посмотрите. Полезно иметь разные варианты решения. Также, приложу два других советника, в к-рых я немного изменил код и поставил выполнение функций закрытия в таймер вместо OnTick и OnStart. Там, возможно, потребуется увеличить время миллисекунд в таймере до 250 или 500. В одном из советтников реализовано закрытие терминала (надо разрешить DLL), в другом есть удаление советника с графика после отработки функций. Поизучайте, может, пригодиться.
У вас нет необходимых прав для просмотра вложений в этом сообщении.


Вернуться в «В помощь программисту.»

Кто сейчас на конференции

Сейчас этот форум просматривают: Alexa [Bot] и 0 гостей