Занятие 5

Вход только для группы Мастерская Forex Роботов 3. Для входа пройдите авторизацию.
Аватара пользователя
Николай
Сообщения: 59
Зарегистрирован: 14 ноя 2016, 00:07

Занятие 5

Сообщение Николай » 08 май 2017, 19:36

Тема вебинара:
Работаем над функциями:
1) Создаем функцию получения данных по рыночным ордерам.
2) Создаем графические элементы - поле фона, кнопки.
3) Управления ордерами через графические элементы - кнопки.
ссылка в вебинарную комнату http://www.webinar.texno-forex.ru/masterskaya3/
У вас нет необходимых прав для просмотра вложений в этом сообщении.
Как и на чем заработать уже за первый месяц и делать это снова и снова Узнайте как
Регистрация и учебные материалы бесплатно.

Aleks
Сообщения: 5
Зарегистрирован: 01 дек 2016, 20:31

Re: Занятие 5

Сообщение Aleks » 09 май 2017, 13:02

ДЗ Занятие 5.
ДЗ Занятие 5.zip

Ещё такой вопрос. Раньше в советниках перед отправкой ордеров и их закрытием (OrderSend,OrderClose,OrderDelete,) вставляли
while(IsTradeContextBusy()){Sleep(10);} //Если торговый поток занят, ожидаем
RefreshRates(); //обновляем данные
Сейчас не надо использовать ожидание и обновление? Когда надо?
У вас нет необходимых прав для просмотра вложений в этом сообщении.

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

Re: Занятие 5

Сообщение Николай » 10 май 2017, 16:31

Функция Sleep(); не остановит выполнение текущего эксперта а
задерживает выполнение текущего эксперта на определенный интервал.

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

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

Re: Занятие 5

Сообщение Николай » 10 май 2017, 17:37

Моё домашнее задание я поместил в один фал переносом всех функций без включаемых файлов.
Это для того что-бы вы не создавали кучу папок в каталоге данных терминала просто поместите файл в папку в \MQL4\Experts

Описание домашнего занятия:
При нажатии кнопок OpenBUY OpenSell ордера открываются в нужном направлении.
Кнопка DelAll удаляет все ордера установленные экспертом.
Так-же реализована настройка ограничения количества ордеров по BUY и Sell .

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

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

Re: Занятие 5

Сообщение Valentin » 10 май 2017, 21:13

Aleks писал(а):ДЗ Занятие 5.
ДЗ Занятие 5.zip
Ещё такой вопрос. Раньше в советниках перед отправкой ордеров и их закрытием (OrderSend,OrderClose,OrderDelete,) вставляли
while(IsTradeContextBusy()){Sleep(10);} //Если торговый поток занят, ожидаем
RefreshRates(); //обновляем данные
Сейчас не надо использовать ожидание и обновление? Когда надо?


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

владимир-loka
Сообщения: 3
Зарегистрирован: 02 дек 2016, 19:39

Re: Занятие 5

Сообщение владимир-loka » 12 май 2017, 07:09

Здравствуйте. Мое домашнее задание
У вас нет необходимых прав для просмотра вложений в этом сообщении.

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

Re: Занятие 5

Сообщение Фёдор » 12 май 2017, 20:04

Здравствуйте, Валентин! С кнопками и другими заданиями справился без труда. Есть вопрос, точнее, просьба, не совсем по теме урока, хотя на уроке Вы это тоже делали. Я сделал контроль за открытием ордеров при нажатии кнопок в упрощённом варианте по следующему алгоритму:
1)В глобальных переменных советника задал флагам false
2)Если кнопка нажата, соответствующий флаг становится true.
3)Если соответствующий флаг true и ордеров меньше разрешённого количества и не превышен лимит ошибок - вызываем функцию открытия соответствующего ордера.
4)Если количество ордеров стало равно разрешённому количеству или превышен лимит ошибок, то флаг становится false независимо от других условий
5)Если ордер успешно открыт, то флаг становится false прямо в функции открытия ордера.
6)После каждого следующего нажатия кнопки количество зафиксированных ошибок (попыток открыть ордер) обнуляется.

Посмотрел - вроде, всё работает чётко. Отключением авто-торговли смоделировал ошибку - запрет открывать ордер при превышения лимита также работает. Скажите, пожалуйста, с точки зрения теории программирования и Вашего опыта - допустимо ли данное решение с одним флагом для каждой команды открытия ордера и насколько это надёжно? Если Вас не затруднит, рассмотрите, пожалуйста, мой пример при разборе домашних заданий на следующем вебинаре, так как тема открытия ордеров крайне важна. Заранее благодарю.
У вас нет необходимых прав для просмотра вложений в этом сообщении.

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

Re: Занятие 5

Сообщение Valentin » 13 май 2017, 07:49

Обязательно рассмотрим варианты решений, выберем оптимальный и продолжим работу.

Аватара пользователя
BERSERKER
Сообщения: 6
Зарегистрирован: 02 дек 2016, 13:26

Re: Занятие 5

Сообщение BERSERKER » 13 май 2017, 23:27

Домашнее задание.

Все поместил в один файл.

Dom ZD_Yr5.zip
У вас нет необходимых прав для просмотра вложений в этом сообщении.
Жаба - хотя и зверь маленький, но давит не хуже медведя.

Аватара пользователя
BERSERKER
Сообщения: 6
Зарегистрирован: 02 дек 2016, 13:26

Re: Занятие 5

Сообщение BERSERKER » 14 май 2017, 00:08

Правильно ли я понял?
Если мы используем для исполнения кода таймер то использовать команду
while (IsTradeContextBusy() ){Sleep (100);
нет смысла.
Если используем тики то она обязательна к применению.

Почему при функцию
int total=OrdersTotal();
использовали так, а не так
int total=OrdersTotal()-1; ?
Ведь нумерация ордеров начинается с нуля, или уже здесь ето изменили?


Когда нажимаеш на кнопку открыть ордер без задержки

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

   if(InstallBuy){          //Если флаг установки  Buy активный. То есть  InstallBuy=true
      time2+=1;
      if (time2>=2){InstallBuy=OpenOrdersBuy(Lot, 2, idExpert);}//Устанавливаем ордер Buy
   }else{
      time2=0;
   }

То не видно что команда исполняется или нет.
На сколько имеет смысл использовать такую задержку для отслеживания работы команды? Я проверил ее работу с маленькой задержкой
if (time2>=2)
то на скорость открытия ордера это не влияет. А удобство пользования значительно возрастает.


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

vlad878
Сообщения: 2
Зарегистрирован: 02 дек 2016, 04:52

Re: Занятие 5

Сообщение vlad878 » 16 май 2017, 03:53

Моя домашняя работа.

Вроде бы получилось, хотя не без труда. Проверил в разных вариантах.

Нашел неточность в функции CloseOders(..) – передаваемый параметр id не соответствовал используемому в функции idExpert. Поэтому можно было использовать при вызове функции любой id.
У вас нет необходимых прав для просмотра вложений в этом сообщении.

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

Re: Занятие 5

Сообщение Valentin » 18 май 2017, 11:28

BERSERKER писал(а):Правильно ли я понял?
Если мы используем для исполнения кода таймер то использовать команду
while (IsTradeContextBusy() ){Sleep (100);
нет смысла.
Если используем тики то она обязательна к применению.


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

BERSERKER писал(а):Почему при функцию
int total=OrdersTotal();
использовали так, а не так
int total=OrdersTotal()-1; ?
Ведь нумерация ордеров начинается с нуля, или уже здесь ето изменили?

На данный момент так и есть, с нуля.
То есть можно цикл задавать на один ордер меньше, но смысла в этом не вижу. Экономии по времени на этом практически не получим, если в MQL при очередном обновлении чего то намутят, тогда могут быть проблемы. В данном варианте функция OrderSelect(i,SELECT_BY_POS,MODE_TRADES) на лишний запрос возвратит значение false и цикл завершится.

BERSERKER писал(а):Когда нажимаеш на кнопку открыть ордер без задержки

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

   if(InstallBuy){          //Если флаг установки  Buy активный. То есть  InstallBuy=true
      time2+=1;
      if (time2>=2){InstallBuy=OpenOrdersBuy(Lot, 2, idExpert);}//Устанавливаем ордер Buy
   }else{
      time2=0;
   }

То не видно что команда исполняется или нет.
На сколько имеет смысл использовать такую задержку для отслеживания работы команды? Я проверил ее работу с маленькой задержкой
if (time2>=2)
то на скорость открытия ордера это не влияет. А удобство пользования значительно возрастает.

Ставить задержку или нет. это исключительно желание программиста или заказчика. как говорится на вкус и цвет каждому свое)))


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

[/quote]
Средствами MQL такой эффект сделать не получится, можно через API (как это реализовано, например в MouseTransfer или в ForexSlide) в но это уже совсем другая история.

DimaZar1
Сообщения: 1
Зарегистрирован: 24 апр 2017, 17:01

Re: Занятие 5

Сообщение DimaZar1 » 19 май 2017, 14:41

Валентин, добрый день!
Пара вопросов по 5 занятию:

1. для удаления объектов мы создавали отдельную функцию, где в цикле перебирали все объекты и удаляли их по маске.
не проще ли воспользоваться функцией ObjectsDeleteAll?
В ней можно указать тип объекта, например кнопку и все кнопки удалятся...
Кстати увидел эту функцию во всплывшей подсказке, когда Вы писали текст :)

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

Спасибо

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

Re: Занятие 5

Сообщение Valentin » 21 май 2017, 20:56

DimaZar1 писал(а):Валентин, добрый день!
Пара вопросов по 5 занятию:

1. для удаления объектов мы создавали отдельную функцию, где в цикле перебирали все объекты и удаляли их по маске.
не проще ли воспользоваться функцией ObjectsDeleteAll?
В ней можно указать тип объекта, например кнопку и все кнопки удалятся...
Кстати увидел эту функцию во всплывшей подсказке, когда Вы писали текст :)


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

DimaZar1 писал(а):2. при рисовании кнопок, если я меняю разрешение экрана (или работаю на разных компьютерах, с разными параметрами мониторов), размер кнопок остается прежний и они соответственно начинают налезать друг на друга. Как можно реализовать автоматическое изменение параметров кнопок, в зависимости от разрешения экрана?

Спасибо


От изменения разрешения экрана размер кнопок меняется пропорционально, наползать друг на друга они не будут, проблемы будут если использовать на разных компьютерах разный масштаб. Используйте 100% всегда и все будет хорошо)))


Вернуться в «Мастерская Forex Роботов 3»

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

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