Различия

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

Ссылка на это сравнение

Предыдущая версия справа и слева Предыдущая версия
atcl:tradebiff [2018/05/18 17:05]
nektomk
atcl:tradebiff [2018/05/19 11:06] (текущий)
nektomk
Строка 7: Строка 7:
 ===== Постановка задачи ===== ===== Постановка задачи =====
  
-Ставим себя на место заказчика и формулирует задачу:​+Ставим себя на место заказчика и формулируем задачу:​
   Нужно сделать программу которая будет следить за роботом   Нужно сделать программу которая будет следить за роботом
   и при выставлении/​изменении/​удалении ордеров   и при выставлении/​изменении/​удалении ордеров
   будет отправлять скриншот мне и двум инвесторам.   будет отправлять скриншот мне и двум инвесторам.
-Почти ​все ​заказчики формулируют задачи именно так (если не короче). С его точки зрения это просто,​ даже почти элементарно и __"​если бы он немного знал программирование он бы написал сам"​__. Поэтому он будет сильно удивлён и возмущён тем что вы укажите срок превышающий пару дней, плюс арендованный им на весь срок ​сервер,  и цену значительно больше 100 долларов. :-)+Почти ​любой ​заказчик ​сформулируют задачу именно так (если не короче). С его точки зрения это просто,​ даже почти элементарно и __"​если бы он немного знал программирование он бы написал сам"​__. Поэтому он будет сильно удивлён и возмущён тем что вы укажите срок превышающий пару дней, плюс аренду им сервера на весь срок, ​ и цену значительно больше 100 долларов. :-)
  
-Это одна из причин почему статей будет несколько и предназначены они будут отчасти заказчикам,​ чтобы ​показать какие подводные камни скрываются **в простой задаче** и немного про инженерию разработки.+Это одна из причин почему статей будет несколько и предназначены они будут отчасти заказчикам,​ чтобы ознакомить их какие подводные камни скрываются **в простой задаче** и немного про инженерию разработки.
  
-Возвращаясь к задаче,​ помимо краткой постановки,​ в процессе диалога ​также ​выясняем полный типичный сценарий использования :+Возвращаясь к задаче,​ помимо краткой постановки,​ в процессе диалога выясняем ​**полный типичный сценарий** использования :
   * пользователь подключается к VDS   * пользователь подключается к VDS
   * запускает MT4   * запускает MT4
Строка 42: Строка 42:
 ===== Подводные камни ===== ===== Подводные камни =====
  
-Заказчик - профессиональный трейдер,​ который знает своё дело и знает что часть работы можно автоматизировать обратившись к вам. Вы - профессиональный программист,​ владеющий отчасти трейдингом и отлично знающий торговую платформу. ​Область соприкосновения относительно небольшая.+Заказчик - профессиональный трейдер,​ который знает своё дело и знает что часть работы можно автоматизировать обратившись к вам. Вы - профессиональный программист,​ владеющий отчасти трейдингом и отлично знающий торговую платформу. ​Взаимная область соприкосновения относительно небольшая.
  
 Ненадо "​взрывать мозг"​ заказчику указывая на очевидные/​кажущиеся вам детали программы или нюансы протоколов и MetaTrader. Он этого незнает,​ знать не хочет и не должен. Это выходит за область его профессиональных знаний и личного любопытства. Нестоит пытаться описать неописуемое и согласовывать несогласуемое. ​ Ненадо "​взрывать мозг"​ заказчику указывая на очевидные/​кажущиеся вам детали программы или нюансы протоколов и MetaTrader. Он этого незнает,​ знать не хочет и не должен. Это выходит за область его профессиональных знаний и личного любопытства. Нестоит пытаться описать неописуемое и согласовывать несогласуемое. ​
Строка 48: Строка 48:
 То есть все проблемы реализации исключительно ваши. ​ То есть все проблемы реализации исключительно ваши. ​
  
-Пока буду готовить вторую часть "​марлезонского балета"​ попробуйте выписать на бумажке (или в коментах) те проблемы которые очевидно придётся решать. Можете считать это проф.тестом+Пока буду готовить вторую часть "​марлезонского балета"​ попробуйте выписать на бумажке (или в коментариях) те проблемы которые очевидно придётся решать. Можете считать это проф.тестом
  
 А пока, непосредственно про программирование:​ А пока, непосредственно про программирование:​
Строка 55: Строка 55:
  
 чтобы выполнить поставленную задачу будем периодически (по таймеру) выполнять следующий цикл: чтобы выполнить поставленную задачу будем периодически (по таймеру) выполнять следующий цикл:
-  * прчесть ордера+  * прочесть ордера 
 +  * сравнить с предыдущим списком ​
   * если что-то поменялось то    * если что-то поменялось то 
       * снять скриншот       * снять скриншот
Строка 62: Строка 63:
 ==== Проверка ордеров === ==== Проверка ордеров ===
  
-Для проверки изменений будет периодически сканировать ордера в рынке и сравнивать полученный список с предыдущим. Цикл чтения ордеров уже наверное набил оскомину - он типичный для всех советников и индикаторов. Будем выбирать только ордера с символом чарта и заданным в параметрах MAGIC.+Для проверки изменений будем периодически сканировать ордера в рынке и сравнивать полученный список с предыдущим. Цикл чтения ордеров уже наверное набил оскомину - он типичный для всех советников и индикаторов. Будем выбирать только ордера с символом чарта и заданным в параметрах MAGIC.
  
-Список будем формировать сразу как объект tcl. А для хранения и сравнения возьмём алгоритм из предыдущего примера.+Список будем формировать сразу как объект tcl. А для хранения и сравнения возьмём алгоритм из предыдущего примера ​(из TradePanel).
  
 на уровне tcl реализуем одну процедуру:​ на уровне tcl реализуем одну процедуру:​
Строка 70: Строка 71:
 proc SetOrders { orderList } ; proc SetOrders { orderList } ;
 </​code>​ </​code>​
-которая получит от нас 1 список - текущие ордера. Сравнит их с ранее её-же сохранённым списком и вернёт нам три списка:​ +которая получит от нас 1 список - все ​текущие ордера. Сравнит их с ранее её-же сохранённым списком и вернёт нам три списка:​ 
-  * новые ордера,​ то есть те тикетов которых не было в предыдущий раз и вдруг они появились. ​+  * новые ордера,​ то есть тетикетов которых не было в предыдущий раз и вдруг они появились. ​
   * изменённые ордера,​ тикеты есть в обоих списках,​ но что-то в них поменялось (например StopLoss)   * изменённые ордера,​ тикеты есть в обоих списках,​ но что-то в них поменялось (например StopLoss)
   * удалённые ордера,​ в старом списке тикет есть, в новом нет - счтаем что ордер удалён или закрыт   * удалённые ордера,​ в старом списке тикет есть, в новом нет - счтаем что ордер удалён или закрыт
Строка 80: Строка 81:
  
 Скриншот будем делать встроенной функцией MetaTrаder,​ у которой правда есть свои особенности:​ Скриншот будем делать встроенной функцией MetaTrаder,​ у которой правда есть свои особенности:​
-  * надо указывать размер и способ выравнивания. Мы будем делать полный скриншот всего чарта поэтому выравнивание не суть как важно +  * надо указывать размер и способ выравнивания изображения. Мы будем делать полный скриншот всего чарта поэтому выравнивание не суть как важно 
-  * формат картинки определяется по раширению файла, для передачи графиков подходит только png (зачем реализованы прочие - загадка)+  * формат картинки определяется по расширению файла, для передачи графиков подходит только png (зачем реализованы прочие ​форматы ​- загадка)
   * файл помещается в каталог Files и не всякое имя ему подходит. ​   * файл помещается в каталог Files и не всякое имя ему подходит. ​
 Если скриншот снялся удачно,​ то отправляем его по почте Если скриншот снялся удачно,​ то отправляем его по почте
Строка 87: Строка 88:
 ==== Отправка почты ==== ==== Отправка почты ====
  
-Отправка почты от клиента производится ​типично ​протоколом SMTP (Simple Mail Transfer Protocol). А сами письма при этом кодируются в соответсвии с протоколом MIME (Multipurpose Internet Mail Extensions). Обе эти "​штуковины"​ есть в стандартной библиотеке tcl, их и задействуем. Предварительно конечно изучив "​мат.часть",​ то есть почитав описания,​ стандартыдокументацию API.+Отправка почты от клиента производится протоколом SMTP (Simple Mail Transfer Protocol). А сами письма при этом кодируются в соответсвии с протоколом MIME (Multipurpose Internet Mail Extensions). Обе эти "​штуковины"​ есть в [[https://​core.tcl.tk/​tcllib/​doc/​tcllib-1-18/​embedded/​www/​toc.html|стандартной библиотеке tcl]], их и задействуем. Предварительно конечно изучив "​мат.часть",​ то есть почитав описания,​ стандарты ​и документацию API.
  
 |  Протокол ​   | Wikipedia | RFC | tcllib API | |  Протокол ​   | Wikipedia | RFC | tcllib API |
Строка 94: Строка 95:
  
 Для работы с почтой нам надо будет соединяться с сервером,​ и соответвенно уметь настраиваться под него ( то есть иметь возможность задавать разные настройки):​ Для работы с почтой нам надо будет соединяться с сервером,​ и соответвенно уметь настраиваться под него ( то есть иметь возможность задавать разные настройки):​
-  * собственно ​адрес сервера (их кстати может быть несколько альтернатив)+  * адрес сервера (их кстати может быть несколько альтернатив)
   * номер порта сервера (по умолчанию стандартный 25)   * номер порта сервера (по умолчанию стандартный 25)
-  * почти обязательно на сервере надо "​представиться"​ то есть логин и пароль +  * почти обязательно на сервере надо "​представиться"​ то сообщать логин и пароль 
-  * и весь диалог с сервером может шифроваться,​ по карйней мере должны уметь вкл/​выкл защиту соединения+  * и весь диалог с сервером может шифроваться,​ по крайней мере ​мы должны уметь вкл/​выкл защиту соединения
  
 Несмотря на значительный объём информации и ёмкость протоколов,​ API достаточно компактный и процедура отправки почты проста:​ Несмотря на значительный объём информации и ёмкость протоколов,​ API достаточно компактный и процедура отправки почты проста:​
Строка 107: Строка 108:
       * text/plain - собственно текст письма       * text/plain - собственно текст письма
       * image/png - наше вложение (передаваемый скриншот)       * image/png - наше вложение (передаваемый скриншот)
-когда вложений нет, то конверт "​плоский"​ - сразу text/plain содержащий текст письма.+когда вложений нет, то конверт "​плоский"​ - сразу ​следует ​text/plain содержащий текст письма.
  
-Информацию про тему, получателей и прочую помещаем как ​доп.заголовки при конверта или непосредственно при отправке+Информацию про тему, получателей и прочую помещаем как заголовки конверта или непосредственно при отправке
  
 Для реализации задумки на уровне tcl сделаем класс SMTP где будем хранить основные параметры сервера и соединений Для реализации задумки на уровне tcl сделаем класс SMTP где будем хранить основные параметры сервера и соединений
Строка 127: Строка 128:
 ===== Результат ==== ===== Результат ====
  
-Получилась толковая программа в виде индикатора,​ которая "​сидит в чарте"​ и рассылает письма с отчётом и скриншотом ​если вдруг чего-то в ордерах поменялось. Отличное средство на VDS, прям-таки must-have+Получилась толковая программа в виде индикатора,​ которая "​сидит в чарте"​ и если вдруг чего-то в ордерах поменялось ​то рассылает письма с отчётом и скриншотом. Отличное средство на VDS, прям-таки must-have
  
 {{:​atcl:​2018-05-18_16-28-51.png?​400|}} {{:​atcl:​2018-05-18_16-28-51.png?​400|}}
Строка 133: Строка 134:
 {{:​atcl:​2018-05-18_10-46-42.png?​400|}} {{:​atcl:​2018-05-18_10-46-42.png?​400|}}
  
-Исходники будут включены в ближайшее обновление ATcl, но естественно прикладываю к статье ​+Исходники будут включены в ближайшее обновление ATcl, но естественно прикладываю к статье {{ :​atcl:​tradebiff.zip }}; Для установки - просто распакуйте архив в каталог терминала.
-  * {{ :​atcl:​tradebiff.mq4 |TradeBiff.mq4}} , для порядка должен лежать ​в Indicators/​ATcl +
-  * {{ :​atcl:​tradebiff.tcl |TradeBiff.tcl}} , класс для ​работы ​с почтой и функции сверки ордеров, должен лежать в Libraries/​ATcl/​demo. Если положите в другое ​место то незабудьте откоректировать mq4+
  
 ===== Что дальше ? ===== ===== Что дальше ? =====
Строка 145: Строка 144:
 Хотя на разработку потрачен не один день и не два, но наш текущий результат это не более чем рабочий прототип ​ Хотя на разработку потрачен не один день и не два, но наш текущий результат это не более чем рабочий прототип ​
  
-до того чтобы "​передать заказчику в эксплуатацию"​ (сдать себе любимому) продукт надо ещё пахать и пахать.. Работы и материалов ещё на две-три статьи и серьёзных изменений в проекте.+до того чтобы "​передать заказчику в эксплуатацию"​ (сдать себе любимому) продукт надо ещё пахать и пахать.. Работы и материалов ​впереди ​на две-три статьи и несколько ​серьёзных изменений в проекте.
  
-Следущая статья (и этап работы) - уточнение объектной модели,​ реализация классов на Mql и их синхронизация с классами Tcl. И она точно не последняя,​ потому что то что выписывали на бумажке мы просто внедерением ОО не закроем.+Следущая статья (и этап работы) - разбор проблем, ​уточнение объектной модели,​ реализация классов на Mql и их синхронизация с классами Tcl. И она точно не последняя,​ потому что то что ​"выписывали на бумажке" ​мы простым внедерением ОО не закроем.