для начинающих. StockSharphttps://stocksharp.ru/handlers/atom.ashx?category=tag&id=для начинающих&type=communityCopyright @ StockSharp Platform LLC 2010 - 20242024-03-29T13:33:32Zhttps://stocksharp.ru/images/logo.pnghttps://stocksharp.ru/topic/284/StockSharp в школе алготрейдеров Финам. Как это было!2016-03-23T13:45:35Z2024-01-21T14:24:40ZЮрий Басанговhttps://stocksharp.ru/users/7/info@stocksharp.ruПривет всем! Сегодня мы хотим рассказать вам о завершении важного образовательного проекта в котором команда StockSharp принимала активное участие!<br />На прошлой неделе наш преподаватель прочитал последнюю лекцию алгоритмического блока в <a target="_blank" rel="nofollow" href="https://stocksharp.ru/away/?u=AQAAAAAAAAAR6NPBH_hY1LPd7ZlenayqgwdBUTOVzcLUhnhkiuSxxCXWTPWOMnHsXFhQkbRDjYM" title="http://www.finam.ru/services/promo0007d/"><span style="color:blue"><b>школе алготрейдеров Финам</b></span></a>!<br /><br />Сама школа - это абсолютно новый, уникальный проект для всего российского фондового рынка. Несколько профильных блоков обучения, опытные преподаватели и многое другое создают все условия для становления профессиональных алготрейдеров. <br /><br />Конечно для нашей команды участие в этом проекте означало очень высокую степень доверия к нам, <a href="http://stocksharp.ru" title="http://stocksharp.ru"><span style="color:blue">нашей платформе</span></a>, <a href="https://stocksharp.ru/store/" title="https://stocksharp.ru/store/"><span style="color:blue">нашим продуктам</span></a>, <a href="http://edu.stocksharp.com" title="http://edu.stocksharp.com"><span style="color:blue">нашим курсам</span></a>. С другой стороны, это был серьезный вызов, испытание, которое мы прошли с достоинством! <br /><br />Сегодня мы делимся с вами тем, как это было и приглашаем на наши новые мероприятия, курсы, вебинары, активнее пользоваться нашими продуктами. Это бесплатно!<br /><br /><div align="center"><a href='https://stocksharp.ru/file/103537/img_3417_s_jpg/' class='lightview' data-lightview-options="skin: 'mac'" data-lightview-group='mixed'><img src="https://stocksharp.ru/file/103537/img_3417_s_jpg/?size=500x500" alt=""/></a><br /><br /><a href='https://stocksharp.ru/file/103538/img_3418_s_jpg/' class='lightview' data-lightview-options="skin: 'mac'" data-lightview-group='mixed'><img src="https://stocksharp.ru/file/103538/img_3418_s_jpg/?size=500x500" alt=""/></a><br /><br /><a href='https://stocksharp.ru/file/103539/img_3421_s_jpg/' class='lightview' data-lightview-options="skin: 'mac'" data-lightview-group='mixed'><img src="https://stocksharp.ru/file/103539/img_3421_s_jpg/?size=500x500" alt=""/></a><br /><br /><a href='https://stocksharp.ru/file/103540/img_3423_s_jpg/' class='lightview' data-lightview-options="skin: 'mac'" data-lightview-group='mixed'><img src="https://stocksharp.ru/file/103540/img_3423_s_jpg/?size=500x500" alt=""/></a></div><br /><br /><span style="color:green"><b>До новых встреч!!!</b></span>https://stocksharp.ru/topic/281/III Всероссийская конференция по алгоритмической торговле2016-02-26T14:10:20Z2024-01-21T13:55:25ZЮрий Басанговhttps://stocksharp.ru/users/7/info@stocksharp.ru<div align="center"><a href='https://stocksharp.ru/file/103528/anons_png/' class='lightview' data-lightview-options="skin: 'mac'" data-lightview-group='mixed'><img src="https://stocksharp.ru/file/103528/anons_png/?size=500x500" alt=""/></a></div><br /><br />27 февраля 2016 года в отеле «Балчуг Кемпински Москва» (ул. Балчуг, д. 1) состоится III Всероссийская конференция по алгоритмической торговле. <br />Организаторами выступают АО «ФИНАМ» и ОАО «ИК «Ай Ти Инвест». В рамках конференции участники обсудят темы определения справедливой цены и построения алгоритмов, программных и «железных» решений для алготрейдинга и HFT-торговли. <br /><br />Команда StockSharp представит абсолютно новый продукт - <b><span style="color:blue"><span style="color:blue"><a href="https://stocksharp.ru/store/%D0%B4%D0%B8%D0%B7%D0%B0%D0%B9%D0%BD%D0%B5%D1%80-%D1%81%D1%82%D1%80%D0%B0%D1%82%D0%B5%D0%B3%D0%B8%D0%B9/" title="Дизайнер - бесплатная программа для создания торговых стратегий без программирования">Дизайнер</a></span></span></b> (визуальный дизайнер торговых стратегий).<br /><br />Ознакомиться с программой конференции и зарегистрироваться можно <a target="_blank" rel="nofollow" href="https://stocksharp.ru/away/?u=AQAAAAAAAABNztwpfok8rjZVHveP56JoxYxA0AwtvMIW6CbW0Ls_ZdzVL-jSG-PFbCnkKwfRxzNvOaWtTLQ9cOYLwYzHTXlj" title="http://www.itinvest.ru/conference-algorithmic-trading-2016/"><span style="color:blue">на странице мероприятия</span></a><br /><br />Дата и время встречи: 27 февраля 2016 г., 10:30– 21:00.<br /><br />Ждем вас!https://stocksharp.ru/topic/6907/S#.Designer. Скачивание данных и тестирование на истории. Видео 2.2016-09-07T13:12:56Z2016-10-31T12:20:55ZЮрий Басанговhttps://stocksharp.ru/users/7/info@stocksharp.ru<iframe width="640" height="390" src="//www.youtube.com/embed/6phLoMdcFAk" frameborder="0" allowfullscreen></iframe>https://stocksharp.ru/topic/6904/S#.Designer. Скачивание, установка, запуск. Видео 1.2016-09-05T12:03:55Z2016-09-06T09:56:00ZЮрий Басанговhttps://stocksharp.ru/users/7/info@stocksharp.ru<iframe width="640" height="390" src="//www.youtube.com/embed/CqS-DEs60VY" frameborder="0" allowfullscreen></iframe>https://stocksharp.ru/topic/296/Зачем создавать торговых роботов своими руками, если можно купить, заказать или получить бесплатно?2015-09-17T21:23:56Z2016-08-26T03:51:39ZMikhail Sukhovhttps://stocksharp.ru/users/201/info@stocksharp.ru<div align="center"><a href='https://stocksharp.ru/file/103484/payroll_question_png/' class='lightview' data-lightview-options="skin: 'mac'" data-lightview-group='mixed'><img src="https://stocksharp.ru/file/103484/payroll_question_png/?size=500x500" alt=""/></a></div><br /><br />Пожалуй, это самый частый вопрос того, кто только-только начинает делать первые шаги в алгоритмическом трейдинге. Почему нужно <a href="http://stocksharp.com/edu/" title="http://stocksharp.com/edu/">учиться писать роботов самостоятельно</a>, чем просто пойти по легкому пути с делегированием? Действительно, а почему нет?<br /><br />Давайте попытаемся ответить по порядку на эти три разных вопроса.<br /><br /><span style="font-size:120%"><b>1 - Купить торговый робот</b></span><br /><br />Сейчас в интернете множества различных сайтов с десятками, а то и сотнями готовых роботов. Бери - не хочу. Но давайте на минутку зададимся вопросом - а нет ли здесь подвода? Ведь, если роботы действительно приносят прибыль (с другом стороны, зачем нам покупать робота, который теряет деньги?), то зачем создателям их продавать? Почему создатели, вместо торговли на бирже своими роботами, занимаются их продажами?<br /><br />Ответ прост. Продающиеся торговые роботы, как правило, <b>если и были зарабатывающими, то в прошлом</b>. Или же они имеют вид некого комбайна из десятка различных параметров. И ваш депозит трейдера успеет быстрее подойти к нулю, чем вы успеете найти комбинацию, дающая профит вашей торговле.<br /><br /><span style="font-size:120%"><b>2 - Заказать разработку</b></span><br /><br />Как и в предыдущем вопросе здесь кроется одно очень большое НО. Программисты не придумывают прибыльный алгоритм. Если бы они это умели, он зарабатывали на бирже. Поэтому вам потребуется самостоятельно разработать стратегию торговли на бирже, протестировать ее на истории, и, будучи на 99% уверенным в ее робастости, отдать на разработку.<br /><br />Но постойте! Как вы сможете проверить алгоритм, если вы не можете написать код самостоятельно? А если вы можете написать код стратегии, протестировать ее, то зачем же тогда делать заказ?<br /><br />Ответ так же прост. Не делайте заказы на роботов, если вы сами можете их разрабатывать. И, аналогично, <b>если вы не можете делать роботов - не делайте заказы на них</b>. Вы не сможете придумать качественную торговую стратегию, и ваши деньги, заплаченные программисту, вылетят в трубу.<br /><br />Мы в <a href="http://stocksharp.com/robot/" title="http://stocksharp.com/robot/">нашем сервисе</a> предупреждает об рисках заказа роботов теми, кто ни разу не писал своего до этого.<br /><br /><span style="font-size:120%"><b>3 - Получить торговый робот бесплатно</b></span><br /><br />Сейчас бесплатно можно получить готового робота от брокера. Или же скачать откуда-то в интернете. В чем подвод тут?<br /><br />Нужно всегда помнить - бесплатный сыр бывает только в мышеловке. Вариантов тут несколько. Или робот псевдо-бесплатен (переходим к пункту Купить торговый робот), или он бесполезен и написан начинающим алготрейдером, или он преследует цели набора комиссии для брокера (особенно, если робот высокочастотен), или он является частью учебного пособия.<br /><br />Наиболее <b>полезным для начинающих будет только последний вариант с учебным пособием</b>. Потому что этот вариант не будет иметь скрытого мотива. И данный робот, хоть и будет иметь аналогичное качество всем остальным роботам (что можно купить или заказать), но будет иметь неоспоримый плюс - <a href="http://stocksharp.com/edu/" title="http://stocksharp.com/edu/">попытаться вас научить делать роботов самостоятельно</a>.<br /><br />Надеюсь, данная статья помогла систематизировать ваши представления о роботов. Успехов в алгоритмическом трейдинге!https://stocksharp.ru/topic/292/Новая фича на сайте - связь брокеров и трейдеров2016-06-21T13:56:06Z2016-06-21T13:56:24ZMikhail Sukhovhttps://stocksharp.ru/users/201/info@stocksharp.ruМы связали через наши <a href="http://stocksharp.ru/products/pricing/" title="http://stocksharp.ru/products/pricing/">брокерские лицензии</a> трейдеров с брокерами.<br /><br /><div align="center"><a href='https://stocksharp.ru/file/103578/social-networks-5210992_jpg/' class='lightview' data-lightview-options="skin: 'mac'" data-lightview-group='mixed'><img src="https://stocksharp.ru/file/103578/social-networks-5210992_jpg/?size=500x500" alt=""/></a></div><br /><br />С помощью новой фичи теперь вы можете:<br /><ol><br /><li>Понять, какие брокера более востребованы у алгоритмических трейдеров. Актуально <b>при первоначальном выборе брокера</b>.<br /><li>Узнать у коллег по цеху об новых технологических фишках вашего брокера.<br /></ol><br /><br />Напишите свое мнение о наших фичах на сайте, и что еще хотели видеть на сайте.https://stocksharp.ru/topic/290/Не пропусти! FIX протокол - вебинар от StockSharp!2016-05-18T10:36:11Z2016-05-18T10:36:11ZЮрий Басанговhttps://stocksharp.ru/users/7/info@stocksharp.ru<span style="font-size:120%">Друзья!<br /><br /><a href='https://stocksharp.ru/file/103569/2a00f86c358347e5a47da619cdc4174f_png/' class='lightview' data-lightview-options="skin: 'mac'" data-lightview-group='mixed'><img src="https://stocksharp.ru/file/103569/2a00f86c358347e5a47da619cdc4174f_png/?size=500x500" alt=""/></a><br /><br />Второй вебинар по <a href="http://stocksharp.ru/products/pricing/" title="http://stocksharp.ru/products/pricing/"><span style="color:blue">коннекторам от StockSharp</span></a> уже на подходе! На нем мы расскажем вам о таком подключении как <b>FIX протокол</b>.<br /><br /><b>Приняв участие в вебинаре вы:</b><br /><br /><ul><li>получите пример торгового приложения.<br /><li>узнаете, что такое FIX протокол и с чем его едят.<br /><li>узнаете основы работы с коннектором FIX от StockSharp.<br /><li>научитесь подключать торговых роботов по данному протоколу и узнаете почему FIX подключением пользуются профессионалы.</ul><br /><b>Программа вебинара:</b><br /><br />1. Описание протокола FIX и требования к инфраструктуре.<br />2. Коннектор FIX от StockSharp и порядок работы с ним.<br />3. Стандартные функции коннектора: соединение, получение портфелей и инструментов, получение биржевых данных, управление заявками.<br />4. Взаимозаменяемость коннекторов: один код – разные коннекторы.<br />5. Совместное использование коннекторов: один код – несколько коннекторов: связка FIX и Plaza2 CGate<br />6. Демонстрация примеров. Арбитраж<br /><br />Бонус: для всех посетителей вебинара компания StockSharp предлагает <span style="color:red"><em>скидку 15%</em></span> на коннектор FIX и <em><span style="color:red">10%</span></em> на любой HFT-коннектор (предложение действительно до конца мая)!<br />Для получения Бонуса пишите на <a href="mailto:lesson@stocksharp.com">lesson@stocksharp.com</a><br /><br />Ждем всех! Делитесь в соцсетях, зовите друзей! Вместе интереснее!<br /><br /><a target="_blank" rel="nofollow" href="https://stocksharp.ru/away/?u=AQAAAAAAAAAR6NPBH_hY1LPd7ZlenayqYzkiu-swji93Y39W0LTAwevCpPuybUmfMFk4_0Pxjmk_5-Ox2xOO8pYR6V7ZxIvw" title="http://www.finam.ru/webinars/lesson1125/item4124"><span style="color:blue">Записаться сейчас!</span></a><br /><br />После записи рекомендуем посмотреть предыдущий <a href="http://stocksharp.ru/articles/10498/konnektory-stocksharp-zapis'-vebinara/" title="http://stocksharp.ru/articles/10498/konnektory-stocksharp-zapis'-vebinara/"><span style="color:blue">вебинар</span></a> по коннекторам StockSharp!</span>https://stocksharp.ru/topic/294/Коннекторы StockSharp. Запись вебинара.2016-05-18T10:31:35Z2016-05-18T10:31:35ZЮрий Басанговhttps://stocksharp.ru/users/7/info@stocksharp.ru<span style="font-size:120%">Друзья! Для тех кто по разным причинам не смог присутствовать на нашем вебинаре, сегодня мы выкладываем его запись.<br /><br /><iframe width="640" height="390" src="//www.youtube.com/embed/gSuaGKvQgiA" frameborder="0" allowfullscreen></iframe><br /><br />В вебинаре рассказывается про наши коннекторы и базовые основы работы с ними. <br /><a href="http://stocksharp.com/file.aspx?t=forum&fid=2420" title="http://stocksharp.com/file.aspx?t=forum&fid=2420"><br /><span style="color:blue">Материалы для скачивания</span></a>.<br /></span>https://stocksharp.ru/topic/288/Близкие контакты третьей степени! Коннекторы StockSharp!2016-04-27T14:59:53Z2016-04-27T14:59:53ZЮрий Басанговhttps://stocksharp.ru/users/7/info@stocksharp.ru<span style="font-size:120%">Друзья!<br /><br /><a href='https://stocksharp.ru/file/103562/blizkie-kontaktyi-tretej-stepe_jpg/' class='lightview' data-lightview-options="skin: 'mac'" data-lightview-group='mixed'><img src="https://stocksharp.ru/file/103562/blizkie-kontaktyi-tretej-stepe_jpg/?size=500x500" alt=""/></a><br /><br /><span style="color:green"><b>28 апреля в 16 часов 30 минут</b></span> по московскому времени при информационной и прочей поддержке компании ФИНАМ мы проведем <br />Бесплатный, открытый вебинар, посвященный работе с <a href="http://stocksharp.ru/products/pricing/" title="http://stocksharp.ru/products/pricing/"><span style="color:blue"><b>коннекторами StockSharp</b></span></a>.<br /><br />Приняв участие в вебинаре вы:<br /><ul><li><b>получите</b> пример торгового приложения<br /><li><b>узнаете</b> основы работы с коннекторами StockSharp<br /><li><b>научитесь</b> подключать торговых роботов и легко переносить их на другое подключение</ul><br /><b>Программа вебинара:</b><br />1. Описание линейки коннекторов S#: QUIK, TRANSAQ, SMARTCOM, PLAZA 2, MICEX, TWIME, FIX, CQG, RITHMIC, ITCH.<br />2. Стандартные функции коннектора: соединение, получение портфелей и инструментов, получение биржевых данных, управление заявками.<br />3. Взаимозаменяемость коннекторов: один код – разные коннекторы.<br />4. Совместное использование коннекторов: один код – несколько коннекторов.<br />5. Демонстрация примеров.<br /><br />Бонус: для всех записавшихся на мероприятие мы дарим <span style="color:red">скидку</span> на любой HFT коннектор* в <span style="color:red">10%</span> до конца майских праздников!<br /><br />Ждем всех! Делитесь в соцсетях, зовите друзей! Вместе интереснее!</span><br /><br /><b><a target="_blank" rel="nofollow" href="https://stocksharp.ru/away/?u=AQAAAAAAAAAR6NPBH_hY1LPd7ZlenayqYzkiu-swji93Y39W0LTAwQSpIg4c2Yj5kdhXBnqci66dAX3s3bbkz5NnHy-ru3-W" title="http://www.finam.ru/webinars/lesson1125/item3880"><span style="color:blue"><span style="font-size:140%">Записаться сейчас!</span></span></a></b><br /><br /><span style="font-size:70%">* - предложение распространяется на коннекторы без исходных кодов</span>https://stocksharp.ru/topic/287/S#.Designer уже доступен для бета-тестов. Плюс плюшки!2016-04-12T11:54:50Z2016-04-12T11:54:50ZЮрий Басанговhttps://stocksharp.ru/users/7/info@stocksharp.ruДрузья!!! <br /><span style="float:right; padding:10px"><a href='https://stocksharp.ru/file/103558/designer_2_png/' class='lightview' data-lightview-options="skin: 'mac'" data-lightview-group='mixed'><img src="https://stocksharp.ru/file/103558/designer_2_png/?size=500x500" alt=""/></a></span><br />Наш абсолютно новый продукт - <a href="http://stocksharp.ru/products/designer/" title="http://stocksharp.ru/products/designer/">S#.Designer</a> доступен для широкого бета-тестирования. <br />Первичное тестирование прошло на ура: красиво, быстро, без ошибок!<br /> <br />Напомню, S#.Designer - предназначен для создания <span style="color:green"><b>любых</b></span> торговых стратегий с помощью визуального конструктора.<br />Сделать своего торгового робота сможет даже начинающий трейдер!<br /><br />С удовольствием приглашаем всех вас составить собственное мнение о функционале, простоте работы, дизайне нашего решения.<br /><br />Ваше мнение очень ценно для нас, поэтому для <b>ВСЕХ</b>, кто оставит хотя бы один отзыв про S#.Designer мы <span style="color:red"><b>подарим скидку в 25%</b></span> на <b>ВСЕ</b> наши продукты, распространяемые без исходных кодов, <b><span style="color:green">от обучения до коннекторов</span></b>!<br />Просим вас не стесняться высказываться на нашем форуме, <a target="_blank" rel="nofollow" href="https://stocksharp.ru/away/?u=AQAAAAAAAAC7842qPnTOqy96rW5n7tNaBMh-yj4vDZAsMipK6FOFyA" title="https://telegram.me/stocksharp">чате</a>, <a target="_blank" rel="nofollow" href="https://stocksharp.ru/away/?u=AQAAAAAAAABKgc1ywU6EW9JhPb0H3isgsPIrUBc1VW-PRzH3xcv8slCJ9fB8qF6S3ApwbyHsUkg" title="https://vk.com/topic-38045320_33378317">группе ВКонтакте</a>, <a target="_blank" rel="nofollow" href="https://stocksharp.ru/away/?u=AQAAAAAAAADXauufGKHUtcUhUrk9mlXNyKC5pyEb_ARjCd8hP9oAAkNLW-fTB7w6ashXZ3o6lLVkjzyS-OBaCPVtvv5OKWlt" title="https://www.facebook.com/stocksharp/app/318350928226520/">Фейсбук</a>.<br /><br />20 Мая 2016 года мы подведем первичные итоги бета-тестирования и самый активный участник, которого выберете вы, получит от нас <span style="color:green"><b>приз в 10 000 рублей живыми деньгами!</b></span><br /><br />Помимо этого, мы обращаемся к вам за помощью! Помогите нам сделать тестирование действительно широким, расскажите об этом друзьям в соц. сетях, сделав репост нашей новости.<br />Среди всех, сделавших репост, мы случайным образом выберем победителя, которому вручим <span style="color:green"><b>5 000 рублей!</b></span><br /><br />Дерзайте! Тестируйте! Создавайте собственные алгоритмы! <br />И не забывайте писать нам о собственных впечатлениях! <br /><br />Вперед!<br /><a href="http://stocksharp.ru/products/download/" title="http://stocksharp.ru/products/download/">Скачать S#.Designer</a>!https://stocksharp.ru/topic/286/Маленькое изменение. Большой прорыв!2016-04-08T12:20:46Z2016-04-08T12:20:46ZЮрий Басанговhttps://stocksharp.ru/users/7/info@stocksharp.ru<span style="font-size:120%">Всем привет!<br /><span style="float:right; padding:10px"><a href='https://stocksharp.ru/file/103554/4264_jpg/' class='lightview' data-lightview-options="skin: 'mac'" data-lightview-group='mixed'><img src="https://stocksharp.ru/file/103554/4264_jpg/?size=500x500" alt=""/></a></span><br />С сегодняшнего дня мы решили внести небольшое изменение в политику нашего <a href="http://stocksharp.ru/chat/" title="http://stocksharp.ru/chat/"><u><span style="color:blue">чата</span></u></a>!<br />Мы убрали предлог "НЕ". Всего один маленький предлог.<br /><br />Основное правило нашего чата звучало:<br />"Технические вопросы <b>НЕ</b> допускаются", теперь оно звучит так: "Технические вопросы <b>допускаются</b>"<br /><br />Надеемся, что активные пользователи нашей платформы смогут помочь друг другу в нелегком деле алготрейдинга.<br />Наша команда конечно будет присутствовать в чате и возможно будет даже отвечать на технику, но такую обязанность мы на себя не берем! Прошу помнить об этом и не обижаться, если что.<br /><br />В сам чат можно попасть по <a target="_blank" rel="nofollow" href="https://stocksharp.ru/away/?u=AQAAAAAAAAC7842qPnTOqy96rW5n7tNaBMh-yj4vDZAsMipK6FOFyA" title="https://telegram.me/stocksharp"><u><span style="color:blue">ссылке</span></u></a>! Ждем вас!</span>https://stocksharp.ru/topic/275/Основы алготорговли2015-10-29T13:53:29Z2015-10-29T13:53:29ZMikhail Sukhovhttps://stocksharp.ru/users/201/info@stocksharp.ruСегодня стартует наш <a target="_blank" rel="nofollow" href="https://stocksharp.ru/away/?u=AQAAAAAAAAAR6NPBH_hY1LPd7ZlenayqDBM3aiHmTzaXDo8eqYreLRa1N3-_3lJy8bXHNIAxu-gojGc6YqUgvB7GyOB-sQvT" title="http://www.finam.ru/webinars/course45/program160">курс вебинаров</a> у <a href="http://stocksharp.com/broker/finam/" title="http://stocksharp.com/broker/finam/">брокера Финам</a>, который ведет <a href="http://stocksharp.com/users/675-%25D0%25A1%25D0%25B0%25D0%25BC%25D1%2583%25D0%25BD%25D0%25B4%25D0%25B6%25D1%258F%25D0%25BD%2520%25D0%2590%25D1%2580%25D1%2582%25D0%25B5%25D0%25BC/" title="http://stocksharp.com/users/675-%25D0%25A1%25D0%25B0%25D0%25BC%25D1%2583%25D0%25BD%25D0%25B4%25D0%25B6%25D1%258F%25D0%25BD%2520%25D0%2590%25D1%2580%25D1%2582%25D0%25B5%25D0%25BC/">Артем Самунджян</a>.<br /><br /><div align="center"><a href='https://stocksharp.ru/file/103490/education_jpg/' class='lightview' data-lightview-options="skin: 'mac'" data-lightview-group='mixed'><img src="https://stocksharp.ru/file/103490/education_jpg/?size=500x500" alt=""/></a></div><br /><br /><b>Описание курса</b><br /><br />Будущее биржевой торговли – за роботами! Достаточно одного взгляда на доходность автоматических торговых систем в конкурсе «Лучший частный инвестор», в котором торговые алгоритмы показывают невероятные результаты. В такой ситуации каждый уважающий себя трейдер должен уметь создавать автоматическую торговую систему или иметь представление о том, как такие стратегии разрабатываются.<br /><br />Пройдя онлайн-курс «Основы алготорговли. Создаем роботов с использованием платформы S#!», вы сможете достаточно быстро разобраться в тонкостях создания различных роботизированных алгоритмов. Научитесь различать их по типам: свечные, HFT, арбитражные. Получите чёткую пошаговую систему действий "1 - 2 - 3", позволяющую построить собственного торгового робота. По окончании курса у вас будет подробная инструкция, как технически-правильно реализовать работу своего алгоритма с помощью торгового робота на платформе S#.<br /><br />После каждого вебинара участникам курса будет предложено домашнее мини-задание, которое поможет на практике закрепить полученные знания.<br /><br /><b><div align="center"><span style="font-size:160%"><a target="_blank" rel="nofollow" href="https://stocksharp.ru/away/?u=AQAAAAAAAAAR6NPBH_hY1LPd7ZlenayqDBM3aiHmTzaXDo8eqYreLRa1N3-_3lJy8bXHNIAxu-gojGc6YqUgvB7GyOB-sQvT" title="http://www.finam.ru/webinars/course45/program160">Приходите к нам</a>.</span></div></b>https://stocksharp.ru/topic/249/Приглашаем вас в чат алготрейдеров2013-12-06T13:21:27Z2013-12-06T13:21:27ZВалентин Мирошниченкоhttps://stocksharp.ru/users/6156/info@stocksharp.ruМы создали <a href="http://chat.stocksharp.com/" title="http://chat.stocksharp.com/">чат алготрейдеров</a>!<br /><br />Чат открыт для всех желающих. <a href="http://stocksharp.com/chat/" title="http://stocksharp.com/chat/">Подробнее, как подключиться</a>.<br /><br />Ждем вас в онлайне!https://stocksharp.ru/topic/328/Особый мани-менеджмент, или фиксированно-пропорциональный метод2013-07-25T17:41:09Z2013-07-25T17:41:09ZНиколай_Флёровhttps://stocksharp.ru/users/6456/info@stocksharp.ru<a href='https://stocksharp.ru/file/102614/0_b59ef_7f86a721_xl_png/' class='lightview' data-lightview-options="skin: 'mac'" data-lightview-group='mixed'><img src="https://stocksharp.ru/file/102614/0_b59ef_7f86a721_xl_png/?size=500x500" alt="Метод Райана Джонса" title="Метод Райана Джонса" /></a><br /><br />Многие опытные и публичные трейдеры говорят, что управление капталом может погубить прибыльную стратегию. Некоторые даже говорят, что можно из плохой стратегии сделать хорошую с помощью мани-менеджмента. <br />Мое мнение - важно не бояться просадок, а реагировать на них.<br />И желательно реагировать по заранее намеченному плану, а не паникой, жадностью и другими прелестями человеческой психологии.<br /><br />Почему нормальные люди не торгуют на все плечо?<br />Все просто - чем больше позиция на которую мы входим, тем больше возможный убыток, тем более, если у нас прибыльных сделок только 20-30% от общего числа сделок.<br />А если попадем в серию убыточных сделок, то счету не поздоровится. <br /><br />Все слышали фразу типа "Давай прибыли течь, убытки уменьшай". Но мало кто задумывался, что это универсальной правило, применимое не только к сделке, но и к управлению капиталом. <br />Некоторые считают, что именно наращивание позиции в звездные моменты стратегии и уменьшение позиций во время глубоких просадок - единственно правильное решение.<br />В качестве примера, трендовые стратегии в последний квартал 2012 года. Никто не кричал "Яхуу, беру на все.." наоборот, многие вообще переждали этот период.<br /><br />После того, как мы провели оптимизацию, проверили стратегию на устойчивость, как могли - максимальная просадка по стратегии к примеру - 15%. Какую просадку мы можем ожидать по счету? Правильно, ожидаемая просадка всегда должна составлять 100%. Это сделано таким образом, мы всегда должны подготовить план на случай экстренной ситуации.<br />Что может привести наш счет к такому плачевному состоянию? Ответ, затянувшаяся череда убыточных сделок, ну и конечно - большое плечо.<br /><br />Пример, описанный во всех книгах наглядно показывает: заработав 25% к капиталу и проиграв 20%, мы оказываемся даже в минусе, за счет комиссии, проскальзывания, оплаты PlazaII, инфраструктуры, нашего вложенного времени, которое могли бы потратить на другие цели. Объяснение этому процессу довольно простое - процент прибыльной и убыточной сделки рассчитывается по разному значению капитала на счете. (После прибыльной сделки капитал увеличился, а значит и возрос риск).<br />И чем больше плечо, тем убыток от ошибки пересчета больше.<br />Как же быть?<br /><br />Товарищ Райан Джонс говорит, что все уже сделал за нас и написал про это книгу, содержащую "волшебную" формулу с использованием которой мы можем одновременно работать и с плечом и не боятся длинной череды убыточных сделок.<br />Ознакомимся с не подробнее.<br /><a href='https://stocksharp.ru/file/102591/0_b59d6_e24cb2b0_xl_png/' class='lightview' data-lightview-options="skin: 'mac'" data-lightview-group='mixed'><img src="https://stocksharp.ru/file/102591/0_b59d6_e24cb2b0_xl_png/?size=500x500" alt="Формула для расчета уровней по которым уже рассчитываем количество контрактов" title="Формула для расчета уровней по которым уже рассчитываем количество контрактов" /></a><br /><br />Мани-менеджмент Мистера Джонса называется Фиксированно-Пропорциональный метод. В системе мани-менеджментов он занимает следующую позицию:<br /><a href='https://stocksharp.ru/file/102592/0_b59d7_fb2fb612_xl_png/' class='lightview' data-lightview-options="skin: 'mac'" data-lightview-group='mixed'><img src="https://stocksharp.ru/file/102592/0_b59d7_fb2fb612_xl_png/?size=500x500" alt="Схема разновидностей манименеджмента" title="Схема разновидностей манименеджмента" /></a><br /><br />Фиксированно-Фракционный метод его не устроил по причине того, что, как он пишет "этот метод требует неравномерных доходов при различном числе контрактов". Если проще, то Ф-Ф метод требует с 10000 доход 10000 с одного контракта для перехода с одного уровня на другой, затем ту же сумму, но уже с 2-х контрактов, то есть по 5000 с контракта и так далее. В связи с этим, чтобы начать торговать более-менее крупной суммой уходит довольное большое количество времени, хотя в это время мы как раз могли хорошо заработать, ну или потерять.<br /><br />Суть Фиксированно-пропорционального метода:<br /><a href='https://stocksharp.ru/file/102615/0_b59f5_fbb3aeff_xl_png/' class='lightview' data-lightview-options="skin: 'mac'" data-lightview-group='mixed'><img src="https://stocksharp.ru/file/102615/0_b59f5_fbb3aeff_xl_png/?size=500x500" alt="Визуальное представление уровней фиксированно-пропорционального метода" title="Визуальное представление уровней фиксированно-пропорционального метода" /></a><br /><br />Данные уровни - это точки перехода от одного количества контрактов к другому в большую или меньшую сторону. Увеличение и уменьшение количества контрактов зависит от того, упал наш капитал или вырос и насколько он вырос. Как правило, непосредственно от последней сделки. Если мы получили прибыль, количество контрактов увеличивается, если получили убыток - уменьшается.<br /><a href='https://stocksharp.ru/file/102594/0_b59d9_7182ad74_l_png/' class='lightview' data-lightview-options="skin: 'mac'" data-lightview-group='mixed'><img src="https://stocksharp.ru/file/102594/0_b59d9_7182ad74_l_png/?size=500x500" alt="Как работает уровень" title="Как работает уровень" /></a><br /><br />Вот, наглядный пример, как такие уровни можно было бы рассчитать:<br /><a href='https://stocksharp.ru/file/102593/0_b59d8_abce999c_l_png/' class='lightview' data-lightview-options="skin: 'mac'" data-lightview-group='mixed'><img src="https://stocksharp.ru/file/102593/0_b59d8_abce999c_l_png/?size=500x500" alt="Расчет уровней в ручном режиме" title="Расчет уровней в ручном режиме" /></a><br />Delta - представлена в виде % от капитала, но по сути - его можно рассчитать по-разному, главное, чтобы число это было неизменным.<br />10000 - начальный капитал<br /><br /><b>Проблемы написания такого мани-менеджмента в Wealth-lab:</b><br />Дело в том, что желательно мани-менеджмент в Wealth-lab прописывать в виде такого элемента, как PosSezer - это специальный компонент с помощью которого можно применить мани-менеджмент любой сложности к стратегии. В связи с этим я столкнулся с несколькими проблемами:<br /> - я не умел еще писать PosSizer<br /> - использование готовых PosSizer- это черный ящик, если досконально не разбирать их код<br /> - их нет в StockSharp, а значить тестирование с использованием PosSizer может отличаться от подобного мани-менеджмента, написанного на S#, для реальной торговли.<br />Поэтому я приступил к написанию универсального метода.<br /><br />Дальше больше:<br />В Wealth-lab размер позиции определяется, уже после того, как стратегия просчитала все позиции в режиме Raw Profit Mode:<br /><a href='https://stocksharp.ru/file/102598/0_b59de_6fc9ab49_xl_png/' class='lightview' data-lightview-options="skin: 'mac'" data-lightview-group='mixed'><img src="https://stocksharp.ru/file/102598/0_b59de_6fc9ab49_xl_png/?size=500x500" alt="Вырезка из Quick Ref" title="Вырезка из Quick Ref" /></a><br /><br />То есть не в реальном времени, а накладывая мани-менеджмент, комиссии и статистические данные, уже на готовые сделки. Мне же было нужно размер позиции менять в зависимости от изменений самой эквити. Решением стало создать свою собственную эквити , рассчитывая ее из эквити по каждой сделке.<br /><br />И в заключении:<br />Wealth написан на C#, значит мы можем в работе своей использовать всю мощь этого языка, но даже опытные разработчики могут задаться вопросом работает ли он например с System.Linq. Я бы не задавался бы этим вопросом, если бы мне не пришлось с ним столкнуться. Зная точно, что Linq должен работать в Wealth, я не мог понять почему все-таки у меня получается ошибка.<br />А вот и решение:<br /><a href='https://stocksharp.ru/file/102596/0_b59dc_61a3a5af_xl_png/' class='lightview' data-lightview-options="skin: 'mac'" data-lightview-group='mixed'><img src="https://stocksharp.ru/file/102596/0_b59dc_61a3a5af_xl_png/?size=500x500" alt="Шаг № 1" title="Шаг № 1" /></a><br /><br /><a href='https://stocksharp.ru/file/102595/0_b59db_8090363b_xl_png/' class='lightview' data-lightview-options="skin: 'mac'" data-lightview-group='mixed'><img src="https://stocksharp.ru/file/102595/0_b59db_8090363b_xl_png/?size=500x500" alt="Шаг № 2" title="Шаг № 2" /></a><br /><br /><a href='https://stocksharp.ru/file/102597/0_b59dd_fc61814f_xl_png/' class='lightview' data-lightview-options="skin: 'mac'" data-lightview-group='mixed'><img src="https://stocksharp.ru/file/102597/0_b59dd_fc61814f_xl_png/?size=500x500" alt="Шаг № 3" title="Шаг № 3" /></a><br /><br />Далее идем по этому вот пути:<br />C:\Windows\Microsoft.NET\Framework64\v4.0.30319<br /><br />Находим там System.Core:<br /><a href='https://stocksharp.ru/file/102599/0_b59df_e9ad04d5_xl_png/' class='lightview' data-lightview-options="skin: 'mac'" data-lightview-group='mixed'><img src="https://stocksharp.ru/file/102599/0_b59df_e9ad04d5_xl_png/?size=500x500" alt="Шаг № 4" title="Шаг № 4" /></a><br /><br />В StockSharp препятствий для написания выявлено не было, реализовалось изящно:<br /><br /><a href='https://stocksharp.ru/file/102600/0_b59e0_69f407a1_xl_png/' class='lightview' data-lightview-options="skin: 'mac'" data-lightview-group='mixed'><img src="https://stocksharp.ru/file/102600/0_b59e0_69f407a1_xl_png/?size=500x500" alt="Код метода" title="Код метода" /></a><br />*Для Wealth-lab код практически идентичен. Коду быть.<br /><br /><b>Самое время сравнить результаты:</b><br /><a href='https://stocksharp.ru/file/102606/0_b59e6_bb374ee6_m_png/' class='lightview' data-lightview-options="skin: 'mac'" data-lightview-group='mixed'><img src="https://stocksharp.ru/file/102606/0_b59e6_bb374ee6_m_png/?size=500x500" alt="HotDayEnter" title="HotDayEnter" /></a><br /><br /><a href='https://stocksharp.ru/file/102601/0_b59e1_d33ae33f_l_png/' class='lightview' data-lightview-options="skin: 'mac'" data-lightview-group='mixed'><img src="https://stocksharp.ru/file/102601/0_b59e1_d33ae33f_l_png/?size=500x500" alt="Расположение стратегий мани-менеджмента в следующем порядке" title="Расположение стратегий мани-менеджмента в следующем порядке" /></a><br /><a href='https://stocksharp.ru/file/102609/0_b59e9_ffc70f69_xl_png/' class='lightview' data-lightview-options="skin: 'mac'" data-lightview-group='mixed'><img src="https://stocksharp.ru/file/102609/0_b59e9_ffc70f69_xl_png/?size=500x500" alt="Performance, Ударный день, 2 мани-менеджмента" title="Performance, Ударный день, 2 мани-менеджмента" /></a><br /><br />А теперь посмотрим динамику контрактов, которыми торговали стратегии:<br /><a href='https://stocksharp.ru/file/102608/0_b59e8_51f88552_xl_png/' class='lightview' data-lightview-options="skin: 'mac'" data-lightview-group='mixed'><img src="https://stocksharp.ru/file/102608/0_b59e8_51f88552_xl_png/?size=500x500" alt="Количество контрактов, которыми стратегии разрешено торговать" title="Количество контрактов, которыми стратегии разрешено торговать" /></a><br /><br />А также, сравнение по периодам:<br /><a href='https://stocksharp.ru/file/102607/0_b59e7_4ab78d37_xl_png/' class='lightview' data-lightview-options="skin: 'mac'" data-lightview-group='mixed'><img src="https://stocksharp.ru/file/102607/0_b59e7_4ab78d37_xl_png/?size=500x500" alt="Сравнение результатов в квартальном разрезе" title="Сравнение результатов в квартальном разрезе" /></a><br /><br /><a href='https://stocksharp.ru/file/102602/0_b59e2_87b00ee3_m_png/' class='lightview' data-lightview-options="skin: 'mac'" data-lightview-group='mixed'><img src="https://stocksharp.ru/file/102602/0_b59e2_87b00ee3_m_png/?size=500x500" alt="Donchian chanel" title="Donchian chanel" /></a><br /><br /><a href='https://stocksharp.ru/file/102601/0_b59e1_d33ae33f_l_png/' class='lightview' data-lightview-options="skin: 'mac'" data-lightview-group='mixed'><img src="https://stocksharp.ru/file/102601/0_b59e1_d33ae33f_l_png/?size=500x500" alt=""/></a><br /><a href='https://stocksharp.ru/file/102603/0_b59e3_8ea50e24_xl_png/' class='lightview' data-lightview-options="skin: 'mac'" data-lightview-group='mixed'><img src="https://stocksharp.ru/file/102603/0_b59e3_8ea50e24_xl_png/?size=500x500" alt="Performance, канал Дончиана, 2 мани-менеджмента" title="Performance, канал Дончиана, 2 мани-менеджмента" /></a><br /><br />Динамика изменения числа торгуемых контрактов:<br /><a href='https://stocksharp.ru/file/102604/0_b59e4_14be9308_xl_png/' class='lightview' data-lightview-options="skin: 'mac'" data-lightview-group='mixed'><img src="https://stocksharp.ru/file/102604/0_b59e4_14be9308_xl_png/?size=500x500" alt="Количество контрактов, которыми стратегии разрешено торговать" title="Количество контрактов, которыми стратегии разрешено торговать" /></a><br /><br />Сравнение по периодам:<br /><a href='https://stocksharp.ru/file/102605/0_b59e5_7d078230_xl_png/' class='lightview' data-lightview-options="skin: 'mac'" data-lightview-group='mixed'><img src="https://stocksharp.ru/file/102605/0_b59e5_7d078230_xl_png/?size=500x500" alt="Сравнение в квартальном разрезе" title="Сравнение в квартальном разрезе" /></a><br /><br /><a href='https://stocksharp.ru/file/102610/0_b59ea_db993473_m_png/' class='lightview' data-lightview-options="skin: 'mac'" data-lightview-group='mixed'><img src="https://stocksharp.ru/file/102610/0_b59ea_db993473_m_png/?size=500x500" alt="Parabolic SAR" title="Parabolic SAR" /></a><br /><br /><a href='https://stocksharp.ru/file/102601/0_b59e1_d33ae33f_l_png/' class='lightview' data-lightview-options="skin: 'mac'" data-lightview-group='mixed'><img src="https://stocksharp.ru/file/102601/0_b59e1_d33ae33f_l_png/?size=500x500" alt=""/></a><br /><a href='https://stocksharp.ru/file/102611/0_b59eb_30f1bc21_xl_png/' class='lightview' data-lightview-options="skin: 'mac'" data-lightview-group='mixed'><img src="https://stocksharp.ru/file/102611/0_b59eb_30f1bc21_xl_png/?size=500x500" alt="Performance, parabolic, 2 мани-менеджмента" title="Performance, parabolic, 2 мани-менеджмента" /></a><br /><br />Динамика изменения числа торгуемых контрактов:<br /><a href='https://stocksharp.ru/file/102612/0_b59ec_10ed615a_xl_png/' class='lightview' data-lightview-options="skin: 'mac'" data-lightview-group='mixed'><img src="https://stocksharp.ru/file/102612/0_b59ec_10ed615a_xl_png/?size=500x500" alt="Количество контрактов, которыми стратегии разрешено торговать" title="Количество контрактов, которыми стратегии разрешено торговать" /></a><br /><br />А также, сравнение по периодам:<br /><a href='https://stocksharp.ru/file/102613/0_b59ed_b251ff82_xl_png/' class='lightview' data-lightview-options="skin: 'mac'" data-lightview-group='mixed'><img src="https://stocksharp.ru/file/102613/0_b59ed_b251ff82_xl_png/?size=500x500" alt="Сравнение в квартальном разрезе" title="Сравнение в квартальном разрезе" /></a><br /><br />В наше распоряжение мы получаем довольно гибкий инструмент, который еще нужно уметь правильно настроить. <br />Во-первых контракты могут наращиваться не по 1-му, а скажем по 2 или 3. Также, мы можем решить для себя с какого контракта мы больше не будем снижать их число, по умолчанию - это 1.<br />И в третьих, можно регулировать начальный торговый объем, то есть начнем с такого объема, который будет уменьшаться прямо с первой сделки. Например, начнем с 10 контрактов и если сразу попадем в неблагоприятный период, стратегия защищая капитал, спустит вас до 1-го контракта.<br /><br />Использовать его можно по-разному. Из графиков видно, что данный подход скорее помогает защитить нам капитал, чем увеличить доходность. Я думаю, он будет интересен при торговле портфелем инструментов. В тот момент, когда какая-нибудь из стратегий начинает сливать, она сбрасывает капитал, давай другой стратегии, которая сейчас в тренде, подхватить свободный капитал и использовать его по назначению. То есть, происходит естественное перераспределение капитала, по результат работы стратегий.<br /><br />В результате своего исследования, лично я уяснил то, что может мани-менеджмент и может погубить прибыльную стратегию, но из убыточной стратегии прибыльную не может сделать даже самый хитрособранный мани-менеджмет.<br />Статистики, я мог бы еще много показать, но лучше выложу код.)<br /><br />Стратегии использовались те же, что и в статье <a href="http://stocksharp.com/forum/3823/Diviersifikatsiia-v-pomoshch--trieidieru/" title="http://stocksharp.com/forum/3823/Diviersifikatsiia-v-pomoshch--trieidieru/">про портфели стратегий</a>, они заходят в позицию лимитками, также учтены комиссии(для фьючерса на индекс ртс) и проскальзывание.<br /><br /><a target="_blank" rel="nofollow" href="https://stocksharp.ru/away/?u=AQAAAAAAAADPSDpWMWjYmE3Esu0urmEdLJCqSS1B9fKPpOs9NDgJTQ" title="http://yadi.sk/d/Rhmw8pbB7C_7i">DonchianWLD</a><br /><a target="_blank" rel="nofollow" href="https://stocksharp.ru/away/?u=AQAAAAAAAADPSDpWMWjYmE3Esu0urmEdbYLAxuijVY_U3Nma65HAMw" title="http://yadi.sk/d/-1TkudVf7C_8A">Ударный деньWLD</a><br /><a target="_blank" rel="nofollow" href="https://stocksharp.ru/away/?u=AQAAAAAAAADPSDpWMWjYmE3Esu0urmEdfCglhRHkKFWlZ5fVFbNJ9Q" title="http://yadi.sk/d/go_xfjB57C_9A">ParabolicWLD</a><br /><br />Спасибо за внимание!https://stocksharp.ru/topic/361/Торговые роботы Шаг 1. Тестирование торговой системы2012-03-18T14:34:45Z2012-12-17T15:07:15ZStockSharphttps://stocksharp.ru/users/341/info@stocksharp.ruМне кажется, что эта статья будет больше всего интересна новичкам в алготрединге. Общаясь с людьми, недавно заинтересовавшимися торговыми роботами, я зачастую сталкивался с тем, что они не до конца понимают, что такое торговый робот и как его создают, поэтому я позволил себе немного рассуждений и пояснений на тему тестирования и создания робота. Если хотите освободить себя от моих рассуждений, переходите к главе - ТЕСТИРОВАНИЕ ТОРГОВОЙ СИСТЕМЫ, Эта часть будет полностью посвящена практике тестирования и работе с платформой. <br /><br />Почему Торговые роботы. <br /><br />Часто, когда заходит разговор о торговом роботе, его главным преимуществом называют отсутствие психологических моментов в его работе. Нет страха, жадности или сомнений. Действительно, это существенные плюсы при торговле через торгового робота. Но главное преимущество торгового робота заключается в том, что мы можем протестировать алгоритм его работы на исторических данных. Таким образом, мы увидим, работает наша торговая система или нет. Если работает, то мы увидим её слабые и сильные стороны и найдем способ улучшить доходность системы. Используя программы для тестирования торговых систем, мы пройдем эти шаги гораздо быстрее, чем, если бы мы проверяли нашу систему в режиме реального времени. Мы сэкономим наши силы, время и деньги. Поэтому тестирование торговых стратегий является очень важным этапом на пути создания торгового робота.<br /><br /><b>ВВЕДЕНИЕ</b><br /><br /><b>Занимайтесь исследованием рынка</b><br /><br /> Многие новички, приходя на рынок, не имеют четкой торговой системы для принятия решений – покупать или продавать бумагу; когда выходить из сделки, если она прибыльная; когда выходить из сделки, если он показывает убыток. Новоиспеченный трейдер обучается прямо во время торгов – он принимает решения, основываясь на интуиции и на своём небольшом торговом опыте. Заработав на сделке, он запоминает определенный случай и старается применить его в будущем; получив убыток, он будет стараться избегать таких ситуаций. Но был ли тот случай, когда он смог заработать, действительной закономерностью или всего лишь единичным случаем из ста, когда ошибившись два раза, мы получили нужный результат? То же самое можно сказать по поводу отрицательного опыта – возможно, всё было сделано правильно, но именно в этот раз что-то сработало не так как надо, и мы не заработали. Начинающий трейдер не задается этим вопросом, и может взять за правило избегать прибыльных стратегий и следовать убыточным, основываясь на своём опыте. Причем те ситуации, которые наблюдает новичок, складываются на основе множества факторов: новости, индикаторы (часто это не один индикатор), наблюдение за стаканом, наблюдение за американским рынком, поведение самой цены. Человеку свойственно окружать себя тоннами информации, чтобы быть уверенным в своей правоте. Но, принимая решение на основе всех этих данных, и заработав или потеряв на сделке, как можно понять, благодаря чему именно мы заработали, и где была совершена ошибка, если мы потеряли деньги? Возникает множество сочетаний информации, которой вы используете, вычленить нужные моменты из этой массы становиться трудно. Осознание своих ошибок и создание прибыльной торговой системы при таком подходе занимает огромное количество времени и стоит немалых денег.<br /> Итак, как же нам научиться зарабатывать на рынке, затратив при этом наименьшее количество времени и денег? Ответ настолько очевиден и прост, что я недоумеваю, почему этим занимается так мало людей! Чтобы научиться работать на рынке, обрести понимание рынка, надо заниматься его исследованием. Под исследованием я подразумеваю не просто наблюдение за рынком, а проверка сделанных выводов на основе прошлой истории, путем совершения бумажных сделок в прошлом, и анализом всех полученных результатов. Если вы недавно пришли на рынок, и у вас нет торговой системы, то вам необходимо придумать стратегию самим или взять за основу чужую систему. После чего требуется исследование, насколько хорошо эта система работает. Проверяя идею на истории, нам не надо ждать следующего дня, недели, месяца, чтобы увидеть первые результаты. Работая с историей, можно прогнать год торгов за несколько часов и узнать, какой результат можно ожидать от вашей системы. Так почему же этим занимается так мало людей? Проанализировав систему, вы лишаетесь иллюзий по поводу того, сможете ли вы заработать деньги, у вас не остается надежды на какое-то чудо. А также, работа на рынке лишается азарта, элемента игры. Мало кому хочется терять надежду на то, что “на рынке заработать просто”, не хочется превращать интересную игру в работу. Именно эти два желания – быстро разбогатеть и получить адреналин являются причиной постоянного потока “мяса” на рынок. На фондовом рынке находиться не меньше мечтателей, чем в любом казино. <br /><br /><b>ПОДГОТОВКА К ТЕСТИРОВАНИЮ</b><br /><br /><b>Выбор бумаги для тестирования</b><br /><br /> На фондовом рынке большое количество ценных бумаг и производных от этих ценных бумаг. У каждой бумаги своя специфика, свой характер движения. Это значит, что торговые системы, которые работают на одной бумаге, могут быть бесполезны на другой. Есть похожие по своему “характеру” бумаги, на которых будет работать один и тот же подход. Перед тем как создавать торговую систему, нам надо определиться, с каким инструментом мы будем работать. Советовать, чтобы на бумаге были сильные, резкие движения, или же наоборот, движения были плавные, нельзя. К какому рынку подойдет ваша система выясняется только тестированием. Желательно, чтобы бумага была ликвидная. Как вы позже сможете убедиться, потери при входе и выходе из-за проскальзывания значительно уменьшают прибыль и увеличивают убыток. Также стоит обращать внимание на комиссию – комиссия также может сильно сказываться на доходности системы. <br /> Свои системы мы создаем для фьючерса на индекс РТС. Он был выбран как наиболее ликвидный инструмент на российском рынке. Проскальзывание для систем устанавливается в размере 50п для входа и 50п для выхода. Реальное проскальзывание устанавливается опытным путем. <br /><br /><b>ТЕСТИРОВАНИЕ ТОРГОВОЙ СИСТЕМЫ. ПОДГОТОВКА ПЛАТФОРМЫ</b><br /><br /><b>Выбор программы для тестирования стратегии</b><br /><br /> Для графического отображения исторических данных и тестирования стратегии нам понадобится программа. Выбор программы зависит от разных факторов, каждая программа имеет свои плюсы и минусы. Ниже перечислены наиболее распространенные программы для разработки систем. <br />Omega Tradestation, Metastock, Amibroker, Wealth-Lab Developer<br />В апреле 2012 года выходит StockSharp Studio, и вы сможете создавать и тестировать системы в одном месте. А пока мы будем тестировать систему на другой платформе.<br /><br />Мы работаем на Wealth-Lab. Это один из признанных лидеров среди программ-тестировщиков. Основной его плюс – язык C#. Только ради этого плюса можно остановить свой выбор на этой программе. Данный язык – стандартный язык программирования, помощь по нему вы можете найти не столько на сайте программы wealth-lab, сколько на программистских сайтах и всемирно известных библиотеках (MSDN).<br /><br />Данный язык позволяет <br /><br /><ul><li>с лёгкостью тестировать написанный код на наличие ошибок;<br /><li>писать стратегии любой сложности – от стандартных систем на свечках, до стратегий на объёмах (маркет профиль);<br /><li>легко переносить протестированную стратегию в вашего робота (об этом на следующих семинарах).<br /></ul><br /><br /><b>После выбора программы нам необходимо загрузить котировки.</b><br /><br />Скачать котировки можно с помощью Гидры ( <a href="http://stocksharp.com/doc/ " title="http://stocksharp.com/doc/ ">http://stocksharp.com/doc/ </a> Подробное описание работы с программой по ссылке )<br /><br /><b>Загрузка полученных данных в программу</b><br /><br />На выходе мы получим текстовый файл с примерно следующим содержанием<br />ТФ 5 минут, тиккер – РТС. Формат даты, как можно увидеть, ГГГГММДД, формат времени ЧЧММСС.<br />Разделитель – запятая.<br /><br /><div class="code"><strong>Код</strong><div class="innercode"><pre class="brush:sql">
<DATE>,<TIME>,<OPEN>,<HIGH>,<LOW>,<CLOSE>,<VOL>
20090115,103000,55575.00000,55575.00000,55150.00000,55360.00000,7275
20090115,103500,55285.00000,55750.00000,55275.00000,55730.00000,6387
20090115,104000,55725.00000,55760.00000,55500.00000,55500.00000,6454
20090115,104500,55500.00000,55845.00000,55470.00000,55665.00000,3748
20090115,105000,55670.00000,55760.00000,55500.00000,55535.00000,4427
20090115,105500,55535.00000,55740.00000,55500.00000,55700.00000,3572
20090115,110000,55700.00000,56105.00000,55685.00000,56105.00000,6600
20090115,110500,56120.00000,56300.00000,56105.00000,56150.00000,7304
20090115,111000,56145.00000,56200.00000,55910.00000,55950.00000,4422
20090115,111500,55940.00000,55985.00000,55770.00000,55815.00000,4347
20090115,112000,55815.00000,55890.00000,55730.00000,55790.00000,4694
20090115,112500,55750.00000,55835.00000,55640.00000,55640.00000,3574
20090115,113000,55655.00000,55680.00000,55060.00000,55060.00000,7683</pre>
</div></div><br /><br />Покажем, как загрузить данные в эту программу.<br /><br />При первом запуске вы увидите примерно следующую картинку.<br /><br /><a href='https://stocksharp.ru/file/101758/testirovanie-sistemy-1_png/' class='lightview' data-lightview-options="skin: 'mac'" data-lightview-group='mixed'><img src="https://stocksharp.ru/file/101758/testirovanie-sistemy-1_png/?size=500x500" alt="Торговые роботы тестирование систем 1" title="Торговые роботы тестирование систем 1" /></a><br /> <br />Мы собираемся загрузить котировки, для этого нажимаем на Data Manager . <b>Next -> Create a new DataSet</b>.<br />В красном прямоугольнике выделены уже существующие DataSet. Также их видно правее в окошке DataSet. Когда мы проделаем всю операцию, новый датасет появится в этом окне.<br /><br /><a href='https://stocksharp.ru/file/101759/testirovanie-sistemy-2_png/' class='lightview' data-lightview-options="skin: 'mac'" data-lightview-group='mixed'><img src="https://stocksharp.ru/file/101759/testirovanie-sistemy-2_png/?size=500x500" alt="тестирование систем 2" title="тестирование систем 2" /></a><br /> <br />После нажатия Create a new DataSet, появится окно. У нас txt файл, поэтому выбираем ASCII Files. <br /><b>Next -></b> указываем путь к котировкам . <br /><b>Next -></b> после выбора папки в окошке появятся файлы, которые можно использовать. <br /><br /><em>Подсказка: в одной папке должны лежать файлы полностью сходные по формату. После того как мы выбрали папку, Велс обработает все файлы в этой папке. Позже, чтобы добавить какой-то новый файл у которого такие же параметры, достаточно будет просто закинуть его в папку из которой вы загружаете историю сейчас - и Велс сразу добавит его в DataSet. Чтобы создать датасет с другим форматом, надо сохранять файл в другую папку.</em><br /><br /><a href='https://stocksharp.ru/file/101760/testirovanie-sistemy-3_png/' class='lightview' data-lightview-options="skin: 'mac'" data-lightview-group='mixed'><img src="https://stocksharp.ru/file/101760/testirovanie-sistemy-3_png/?size=500x500" alt="тестирование систем 3" title="тестирование систем 3" /></a><br /><a href='https://stocksharp.ru/file/101761/testirovanie-sistemy-4_png/' class='lightview' data-lightview-options="skin: 'mac'" data-lightview-group='mixed'><img src="https://stocksharp.ru/file/101761/testirovanie-sistemy-4_png/?size=500x500" alt="тестирование систем 4" title="тестирование систем 4" /></a><br /><a href='https://stocksharp.ru/file/101762/testirovanie-sistemy-5_png/' class='lightview' data-lightview-options="skin: 'mac'" data-lightview-group='mixed'><img src="https://stocksharp.ru/file/101762/testirovanie-sistemy-5_png/?size=500x500" alt="тестирование систем 5" title="тестирование систем 5" /></a><br /> <br /><b> Next -> </b> выбираем интервал, который мы выбрали при загрузке. У нас это 5 минут. Если у вас файл с 5 минутами, то из него можно создавать файлы старшего ТФ, но не наоборот. Создавать файлы старшего ТФ из младших тоже не советуется, т.к. Велс криво склеивает. Лучше отдельно загрузить старший ТФ. <br /><b>Next -> </b> появится окно, где нам надо прописать формат для программы. В нашем случае нам надо добавить 1 - Add Field в список Field Order. Наш формат <DATE>,<TIME>,<OPEN>,<HIGH>,<LOW>,<CLOSE>,<VOL>. У нас не хватает Time. Выбираем его и двигаем с помощью кнопки 2 , все наименования в формате должны быть по порядку. В окошке 3, выбираем нужный нам формат. У нас ГГГГММДД, формат времени ЧЧММСС.<br /><a href='https://stocksharp.ru/file/101768/testirovanie-sistemy-6_png/' class='lightview' data-lightview-options="skin: 'mac'" data-lightview-group='mixed'><img src="https://stocksharp.ru/file/101768/testirovanie-sistemy-6_png/?size=500x500" alt="торговые роботы, тестирование торговой системы 6" title="торговые роботы, тестирование торговой системы 6" /></a><br /><a href='https://stocksharp.ru/file/101769/testirovanie-sistemy-7_png/' class='lightview' data-lightview-options="skin: 'mac'" data-lightview-group='mixed'><img src="https://stocksharp.ru/file/101769/testirovanie-sistemy-7_png/?size=500x500" alt="торговые роботы, тестирование торговой системы 7" title="торговые роботы, тестирование торговой системы 7" /></a><br />В соответствующих окошках выбираем yyyyMMdd и Hmmss. Обращаю ваше внимание, формат можно выбрать из выпадающего окна, а можно напечатать самому. Нижние три окна у нас в нужном формате. Осталось поправить только в Ignore Firs Lines in File поставить 1. <br />На этом процедура создания DataSet завершена.<br /><br />Для того, чтобы написанная на коде стратегия работала корректно, необходимо занести информацию об инструменте в Велс. Для этого заходим в <b>Tools -> Sumbol info Manager</b>, появится окошко. Сюда необходимо заносить данные для всех новых DataSet. Тип, устанавливаем Фьючерс (или акции, елси вы будете тестировать их). Маржа - сейчас среднее значение 9000 (минус в том, что маржа считается постоянной, и при 50 000 по РТС и при 100 000, при этом мы понимаем, что фактически она меняется). Point Value для фьючерсов 0,6. Тик равен 5 в нашем случае. Decimilars (знаков после запятой ) у нас 0 . В Symbol нужно написать точно такое же название как в DataSet.<br />После того как мы прописали информацию, Велс будет знать как именно расчитавать профиты и лоси для системы.<br /><a href='https://stocksharp.ru/file/101770/testirovanie-sistemy-8_png/' class='lightview' data-lightview-options="skin: 'mac'" data-lightview-group='mixed'><img src="https://stocksharp.ru/file/101770/testirovanie-sistemy-8_png/?size=500x500" alt="тестирование торговой системы 8" title="тестирование торговой системы 8" /></a><br /><br />Осталось задать проскальзывание. <b>Tools -> Preferences -> Slippage</b>. Ставим галочку для первого случая и ставим нужное нам проскальзывание. For Futures - > 10, проскальзывание в тиках = 50п.<br /> <br /><b>ТЕСТИРОВАНИЕ ТОРГОВОЙ СТРАТЕГИИ. ПРИМЕР</b><br /><br />К этому моменту у нас всё готово для тестирования стратегии. Но самой торговой системы у нас нет. Откуда же брать идеи для создания торговых систем? Лучший способ для начинающего системщика – взять за основу чужую торговую систему и попытаться поработать с ней. Позже, на основе ваших собственных наблюдений, вы будете создавать уникальные ТС. <br />Создание стратегии<br />Идея <br />Для создания ТС у нас должна быть идея, предположение, которое необходимо проверить. Наша идея основывается на наблюдении, что на рынке бывают дни с большим диапазоном, когда цена практически с самого открытия идет в одном направлении и закрывается рядом с максимальной точкой. Задача торговой системы состоит в том, чтобы поймать это движение – ударный день.<br />Центральные условия стратегии<br />Станет ли день ударным мы не знаем. Мы должны найти правила, соблюдение которых позволит нам получить систему с положительным матожиданием. На данном этапе, у нас есть только примерное представление, как стратегия должна работать. Все наши предположения нам предстоит проверить.<br />Предположения <br />- Если день ударный, то мы должны войти в него с самого утра. Если нам не удалось войти до определенного времени, день скорее всего не ударный.<br />- вход в лонг осуществляется выше уровня открытия, вход в шорт осуществляется ниже открытия. Уровень открытия служит как фильтр – если мы находимся выше, вероятность расти больше чем вероятность упасть и наоборот.<br />- вход в лонг осуществляется выше средней скользящей, вход в шорт осуществляется ниже средней скользящей. Средняя скользящая (157 – МА), используется как дополнительный фактор определения тренда.<br /><br /><b>Точка входа</b><br /><a href='https://stocksharp.ru/file/101771/testirovanie-sistemy-9_png/' class='lightview' data-lightview-options="skin: 'mac'" data-lightview-group='mixed'><img src="https://stocksharp.ru/file/101771/testirovanie-sistemy-9_png/?size=500x500" alt="торговые роботы, тестирование торговой системы 9" title="торговые роботы, тестирование торговой системы 9" /></a><br />Если выполняются все центральные условия для входа, нам нужно найти последнее условие, которое спустит курок, и мы войдем в позу. Для этого нам нужно формализовать точку входа. В зависимости от условий, для входа мы используем бычье или медвежье поглощение. Вход в лонг – бычье поглощение. Вход в шорт – медвежье поглощение.<br /><br /><br /><b>Установка стопа</b><br /><br />Одно из наших основных предположений было о размере стопа: так как мы собираемся взять ударный день, предполагается, что движение в нашу сторону будет сильным и без существенных откатов, что даст нам возможность входить с небольшим риском. Размер стопа будет устанавливаться в процентах. Если расстояние от дальней тени до точки входа меньше чем параметр стопа, то стоп ставится за тень. Начальный размер стопа возьмём = 0,2-0,3%, что примерно равно 300 – 450п.<br />Выход из позиции<br />Еще в самом начале мы сказали, что ударный день начинается и заканчивается близко к своим максимумам. Поэтому логично будет сделать выход в конце дня, в 23.45.<br />Второй тип выхода – если цена движется не в нашу сторону, то мы выходим по стоп приказу.<br /><br />На этом описание стратегии можно закончить, необходимые начальные правила для реализации их в тестере были оговорены. Дальнейшее изменение и дополнение стратегии будет вестись по результатам тестирования.<br /><br /><b>Краткое описание стратегии</b><br /><br />Ловим дни с большим диапазоном.<br />- вход в лонг выше открытия дня, вход в шорт ниже открытия дня<br />- Цена выше/ниже 157 средней. <br />- искать точку входа до определенного времени t.<br />- вход в лонг - бычьей моделью поглощения.<br />- входа в шорт - медвежьея модель поглощения.<br />- стоп = 0,2-0,3% от точки входа.<br />- выход в конце дня.<br /><br />Графическое представление <br />Для удобства сделал картинку, как это всё должно выглядеть при реализации в тестере. Наглядно показывает выполнение центральных условий, точку входа и установку стопа.<br /><br /><a href='https://stocksharp.ru/file/101772/testirovanie-sistemy-10_png/' class='lightview' data-lightview-options="skin: 'mac'" data-lightview-group='mixed'><img src="https://stocksharp.ru/file/101772/testirovanie-sistemy-10_png/?size=500x500" alt="торговые роботы, тестирование торговой системы 10" title="торговые роботы, тестирование торговой системы 10" /></a><br /><br />Написание кода по алгоритму<br /><br />Проверка кода. <br />Напишем код для тестирования.<br />Код находится в Приложении в конце статьи.<br />После написания кода, нужно обязательно проверить, как он работает. Проверка осуществляется вручную. <br />Как выглядит работа кода, вы можете увидеть на картинке представленной ниже.<br /><br /><a href='https://stocksharp.ru/file/101773/testirovanie-sistemy-11_png/' class='lightview' data-lightview-options="skin: 'mac'" data-lightview-group='mixed'><img src="https://stocksharp.ru/file/101773/testirovanie-sistemy-11_png/?size=500x500" alt="торговые роботы, тестирование торговой системы 11" title="торговые роботы, тестирование торговой системы 11" /></a><br /><br /><b>Методы расчета размера позиции в системе</b><br /><br />После того как вы убедитесь, что код работает должным образом, можно приступить к анализу полученных данных.<br /><br />Нас интересует результаты системы, её доходность и просадка. Чтобы увидеть нужные нам результаты, необходимо зайти во вкладку Performance. Тут нужно сказать о способах, которыми расчитаываются результаты выполнения кода. При выборе разных способов, мы будем получать разные результаты на одной стратегии. Рассмотрим вкладку – Position Size. <br /><br /> Starting Capital – сумма с который вы будете тестировать систему. <br /><br />1 – первый тип расчета позиции. Размер позиции будет постоянно выполнятся исходя из суммы указаной в fixed dollar . Если у нас ГО 7500, и в fixed dollar прописано 10 000, то размер позиции всегда будет = 1 контракту.<br /><br />2- Размер позиции постоянно равен определенному количеству контрактов. 100 cоntracts в нашем случае было бы равносильно 750 000 в fixed dollars.<br /><br />Эти два метода используются для того, чтобы увидеть – как было бы если вы постоянно торговали фиксированной суммой/сайзом. Третий способ отличается от передидущих двух, для тестирования систем мы используем именно его. Percent of Equity – размер позиции расчитывается изходя из имеющейся суммы, которая меняется по ходу тестирования. Если изначально у нас было 100 000 и на 50% от депозита размер позиции равен 6 контрактам, на сумме 200 000, он будет равен 12 контрактам. Тоесть в этом методе используется реинвестирование, и мы увидим какую доходность покажет система, если постоянно вкладывать заработаные деньги в систему. Также при таком подходе мы видим, какая может быть действительная просадка у системы. Этот вопрос расмотрим поподробнее.<br /><br />Drawdown <br /><br /><a href='https://stocksharp.ru/file/101774/testirovanie-sistemy-12_png/' class='lightview' data-lightview-options="skin: 'mac'" data-lightview-group='mixed'><img src="https://stocksharp.ru/file/101774/testirovanie-sistemy-12_png/?size=500x500" alt="торговые роботы, тестирование торговой системы 12" title="торговые роботы, тестирование торговой системы 12" /></a><br /><br />Размер просадки при 1 и 2 методе расчета размера позиции в сравнение с 3 методом.<br /><br />Наиболее наглядно просадку системы в графическом отображении видно во вкладке Drawdown. Просадка системы – сколько процентов мы потеряли, после максимума на счете. Впадины – отображение просадки, наибольшие впадины образовывались после последовательности убыточных сделок.<br />На данной картинке видно, что при использовании второго метода расчета позиции, максимальная просадка в системе была в самом начале.<br /><br />Картинки приведены с другой системы, не с той, что сейчас разбираем мы!<br /><br /><a href='https://stocksharp.ru/file/101775/testirovanie-sistemy-13_png/' class='lightview' data-lightview-options="skin: 'mac'" data-lightview-group='mixed'><img src="https://stocksharp.ru/file/101775/testirovanie-sistemy-13_png/?size=500x500" alt="торговые роботы, тестирование торговой системы 13" title="торговые роботы, тестирование торговой системы 13" /></a><br /><br />Посмотрим на эту же систему, где размер позиции рассчитывался исходя из процента размера депозита.<br /><br /><a href='https://stocksharp.ru/file/101776/testirovanie-sistemy-14_png/' class='lightview' data-lightview-options="skin: 'mac'" data-lightview-group='mixed'><img src="https://stocksharp.ru/file/101776/testirovanie-sistemy-14_png/?size=500x500" alt="торговые роботы, тестирование торговой системы 14" title="торговые роботы, тестирование торговой системы 14" /></a><br /><br />Сразу видно сильное различие. На обеих картинках приведена одна система. Так в чем же дело? При расчете размера позиции от депозита мы постоянно рискуем одинаковой частью депозита вне зависимости от его размера. При первом и втором методе, если система заработала некоторую сумму, например 100 000, при начальном капитале в 100 000, итого 200 000, и мы продолжает работать фиксированным количеством контрактов – 6 контрактов, при этом часть используемого депозита постоянно уменьшается, соответственно уменьшаются размер возможной просадки.<br />При первом и втором методе размер просадки сильно зависит от того, в какой момент мы начали тестировать систему. При третьем методе, мы видим, какую просадку мы могли получить, если бы вошли в рынок на протяжении всего периода тестирования, соответственно нет такого недостатка, как момент начала тестирования.<br /><br />Это одна из причин, почему мы используем третий метод расчета размера позиции при тестировании.<br />Performance<br />Наиболее полную информацию о результатах тестирования системы можно увидеть на вкладке Performance. <br />Рассмотрим некоторые строки из данной вкладки.<br /><br />Backtest Performance Report | Range – временные рамки, в которых проводилось тестирование. * Сами временные рамки задаются слева в Data Range. Data Range заданный вами может не совпадать с Range.<br /><br />Net profit – сколько денег заработала система с момента начала тестирования.<br /><br />Net profit % - сколько процентов заработала система с момента начала тестирования.<br /><br />Annualized Gain – Средний % годовых от стратегии. * если стратегия тестируется на промежутке меньше чем год, в данной строке пишется, сколько было бы на конец года, если стратегия продолжала работать с такой доходностью, как и в доступный тестируемый промежуток.<br /><br />Number of trades – количество совершенных сделок.<br /><br />Average Profit – средняя прибыль за одну сделку.<br /><br />Win/Loss Rate – процент прибыльных/убыточных сделок <br /><br />Average Profit/Loss – средний профит/лосс по итогам всех <br />прибыльных/убыточных сделок.<br /><br />Max consecutive Winners/Losses – максимальное количество подряд прибыльных/убыточных сделок.<br /><br />Maximum drawdown – максимальная просадка системы.<br /><br />Итак, на картинке снизу, мы видим результаты тестирования стратегии (тестирование проводилось на промежутке 2009 – 2010 год). Результаты совсем не те, на что мы рассчитывали: огромная просадка, при практически нулевом профите. В чем проблема, почему стратегия, так плохо работает, ведь были соблюдены все условия, и код проверен, работает правильно?!<br /><br />Результаты тестирования нас не удовлетворили. Давайте попробуем улучшить нашу стратегию. Существует несколько способов улучшения результатов стратегии <br />– тестирование параметров.<br />– изменение условий работы стратегии.<br /><br /><a href='https://stocksharp.ru/file/101777/testirovanie-sistemy-15_png/' class='lightview' data-lightview-options="skin: 'mac'" data-lightview-group='mixed'><img src="https://stocksharp.ru/file/101777/testirovanie-sistemy-15_png/?size=500x500" alt="торговые роботы, тестирование торговой системы 15" title="торговые роботы, тестирование торговой системы 15" /></a><br /><br />Сначала попробуем оптимизировать параметры системы. Параметров в нашей системе 3 (5)<br />– МА период скользящей средней: Может так оказаться, что МА с другим периодом лучше работает.<br />– Время, до какого времени мы ищем сигнал: Возможно, что ждать сигнала до 2х часов излишне. Параметр время разбит отдельно для коротких и длинных позиций.<br />– Риск. Размер стопа после входа в позу: Стоп в нашем случае не превышает заданного параметра.<br />Оптимизация параметров<br />Важно научиться, по результатам оптимизации не только выбирать наиболее прибыльные значения параметров, но и также находить некоторые закономерности, которые могут помочь нам улучшить стратегию.<br /><br />В любой системе есть параметры. Про параметры в системе следует сказать следующее: <br />А – параметры должны иметь под собой какое-то обоснование. Например, параметр время – работать после N часов дня, не имеет смысла, т.к. если это ударный день, то мы уже должны были войти в позицию, и нас не должно было выбить по стопу. Иначе – это не ударный день, искать входов не имеет смысла. Назначение этого параметра – найти время, до которого стоит искать признаки ударного дня, и после которого становится больше ложных сигналов.<br />Б – параметр можно переоптимизировать – подогнать под определенный промежуток времени, когда он будет хорошо работать, но в другое время будет работать намного хуже. Нужно избегать таких ситуаций. <br />В – система должна работать прибыльно на большом наборе значений параметра. Что значит - если есть параметр с 10ю различными значениями, система должна работать на большинстве из этих значений. <br />Г – чем их меньше, тем лучше. Увеличение количества параметров делает систему менее устойчивой.<br /><br />Проведем оптимизацию наших параметров<br /><br />Для того чтобы открылась вкладка Optimization, необходимо нажать на Optimize в левом нижнем углу. <br /><br />Optimization control – настройка, выбор тех параметров что мы будем тестировать. Чтобы оптимизация проходила быстрее, стоит выбирать один-два параметра и тестировать их. Чтобы удалить параметры, которые мы не хотим тестировать, выделяем его и нажимаем Remove Selected Parameter. Восстановить начальный вид можно нажав Rollback Changes. После того как мы произвели необходимые настройки, нажимаем Begin Optimization.<br /><br />Results – результаты тестирования в текстовом виде.<br /><br />1 Parameter Graph - на шкале отображается результат тестирования только одного параметра.<br /><br />2 Parameter Graph – Отображаются сразу два параметра.<br /><br /><a href='https://stocksharp.ru/file/101778/testirovanie-sistemy-16_png/' class='lightview' data-lightview-options="skin: 'mac'" data-lightview-group='mixed'><img src="https://stocksharp.ru/file/101778/testirovanie-sistemy-16_png/?size=500x500" alt="торговые роботы, тестирование торговой системы 16" title="торговые роботы, тестирование торговой системы 16" /></a><br /><br />Быстрее и нагляднее всего тестировать пару параметров. Например, Время - Риск лонг, Время_S - Риск шорт, Время – Время_S . Надо понимать, что если мы изменим один параметр, то он потянет за собой другой параметр. Поэтому тестировать лучше всего как раз такие пары, где один параметр влияет на другой. <br /><br />Небольшое лирическое отступление - Этот семинар пишется онлайн, я сейчас поэтапно делаю всё, о чем пишу. После этого места я уже успел написать 5 страниц с картинками, когда понял, что пошел по неправильному пути, начал оптимизацию с пары Время – Время_S – абсолютная глупость. После того, как прооптимизировал этот параметр, пришлось еще несколько раз к нему возвращаться, т.к. я изменил риск и параметр время опять изменился. Поэтому я написал замечание выше. Думай головой, как говорится, и сэкономишь много времени. У нас бывало так, что, не проверив, как следует, код, мы принимались его тестировать, потом оказывалось, что в коде ошибка и все результаты приходилось выкидывать, а это много времени. <br /><br />Я еще постараюсь сделать больше ошибок, чтобы их потом не сделали вы. А сейчас пойдем по более корректному пути.<br /><br />Оптимизация Время – Риск Лонг<br /><br /><a href='https://stocksharp.ru/file/101779/testirovanie-sistemy-17_png/' class='lightview' data-lightview-options="skin: 'mac'" data-lightview-group='mixed'><img src="https://stocksharp.ru/file/101779/testirovanie-sistemy-17_png/?size=500x500" alt="торговые роботы, тестирование торговой системы 17" title="торговые роботы, тестирование торговой системы 17" /></a><br /><br />Черными линиями отмечена область, выше которой находятся положительные параметры, ниже отрицательные. Если вы помните, я говорил, что параметр должен быть прибыльным на большем наборе значений параметра. В данном случае у нас прибыльная стратегия, если параметр от 10 часов до 14 часов. Обратите внимание, - работа до 11 часов, находится в отрицательной зоне, но не потому, что стратегия сливает, если так работать, а потому что у нас сейчас плохо работают продажи. И если работать до 11 часов по покупкам, стратегия не выходит суммарно в плюс.<br /><br />Если отключить в стратегии продажи, то картинка изменится именно таким образом – работа до 14 часов находится в положительной зоне при всех значениях риска.<br /><br /><a href='https://stocksharp.ru/file/101780/testirovanie-sistemy-18_png/' class='lightview' data-lightview-options="skin: 'mac'" data-lightview-group='mixed'><img src="https://stocksharp.ru/file/101780/testirovanie-sistemy-18_png/?size=500x500" alt="торговые роботы, тестирование торговой системы 18" title="торговые роботы, тестирование торговой системы 18" /></a><br /> <br />В стратегии УД, по нашему алгоритму, не бывает таких ситуаций, что если мы войдем в Лонг, то потом можем пропустить сигнал в шорт. Т.е. сам алгоритм, сделан таким образом, что при всех параметрах такая ситуация невозможна. Поэтому в данной стратегии можно отключить продажи, не повлияв не покупки. Я отключил продажи именно для того, чтобы вы убедились в том, что работать до 11 часов прибыльно, хотя это было ясно и по первой картинке. <br /><a href='https://stocksharp.ru/file/101781/testirovanie-sistemy-19_png/' class='lightview' data-lightview-options="skin: 'mac'" data-lightview-group='mixed'><img src="https://stocksharp.ru/file/101781/testirovanie-sistemy-19_png/?size=500x500" alt="торговые роботы, тестирование торговой системы 19" title="торговые роботы, тестирование торговой системы 19" /></a><br />График оптимизации с другой стороны, чтобы лучше рассмотреть результаты по риску.<br />Лучший параметр для риска по покупкам – 0,8-0,9%. <br /><br />Какие выводы можно сделать по оптимизации Время – Риск<br /><br />1 – Стратегия является прибыльной, если работать до 14 часов. При этом прибыль растет до 12 часов - посмотреть, почему прибыль начинает падать после 12 часов.<br />2 – При параметре время до 14 часов, на всех значениях риска, стратегия является прибыльной. Это хорошо, параметр должен быть прибыльным на большом наборе своих значений.<br />3 – Есть четкая тенденция, при увеличении параметра риска, прибыль растет – посмотреть, почему так происходит. <br /><br />Проводя тестирование систем, и оптимизируя параметры, старайтесь понять, почему именно стратегия начинает лучше работать при тех или иных изменениях. По результатам оптимизации выбираем значение для Времени = 12 часам, для Риска по покупкам = 0,9%.<br /><br /><a href='https://stocksharp.ru/file/101782/testirovanie-sistemy-20_png/' class='lightview' data-lightview-options="skin: 'mac'" data-lightview-group='mixed'><img src="https://stocksharp.ru/file/101782/testirovanie-sistemy-20_png/?size=500x500" alt="торговые роботы, тестирование торговой системы 20" title="торговые роботы, тестирование торговой системы 20" /></a><br /><br />Для того чтобы понять, что именно изменилось, при новых параметрах, посмотрим Performance. <br /><br />Когда мы изменили время работы с 14 часов до 12 часов, у нас уменьшилось в два раза количество сделок. При этом уменьшится количество прибыльных сделок, но оказалось лучше отказаться от половины прибыльных сделок, чтобы не получить в два раза больше лосей. <br /><br />Если изменить риск с 0,2% до 0,8%, то количество сделок уменьшится еще больше, при том, что количество прибыльных сделок возрастет. Почему так произошло? Если просмотреть входы в сделки руками, то можно увидеть ситуации, когда поставим маленький стоп, мы получали после этого еще много лосей и в итоге так и не ловили УД. Если бы мы поставили больший стоп, то смогли бы поймать УД и не получили бы лосей.<br /><br /><a href='https://stocksharp.ru/file/101783/testirovanie-sistemy-21_png/' class='lightview' data-lightview-options="skin: 'mac'" data-lightview-group='mixed'><img src="https://stocksharp.ru/file/101783/testirovanie-sistemy-21_png/?size=500x500" alt="торговые роботы, тестирование торговой системы 21" title="торговые роботы, тестирование торговой системы 21" /></a><br />Из полученных нами данных можно сделать выводы <br /><br /> - вход в УД надо искать до 12 часов. После 12, пытаться войти в УД не имеет смысла.<br />Этот вывод совпадает с нашим предположением, что ловить ударный день надо в самом начале. Два дополнительных часа перед терминалом не дадут никаких преимуществ.<br /><br />- Маленький риск не всегда хорошо. Давайте подумаем, почему вход с большим риском в данном случае оказался лучше? В стратегии УД, мы ищем импульс в определенную сторону, одним из признаков импульса – сильное открытие в какую-то сторону. Возможно второй признак, когда движение в эту сторону резкое – получаются паттерны с большими рисками. И, несмотря на то, что стоп большой, именно этот большой стоп даёт нам дополнительное смещение вероятностей. Ставить же маленький стоп, на определенную величину невыгодно, после того как произошло резкое движение, стоп часто может быть выбит на откате.<br /><br />В самом начале темы про оптимизацию параметров, я сказал, что важно научиться по результатам оптимизации определять не только лучшие параметры, но также научиться видеть некоторые закономерности, которые помогут улучшить нашу систему.<br /><br />Посмотрим на оптимизацию со стороны времени еще раз. Видно, что основную прибыль дают сделки от 11 до 12 часов. С 10 до 11 прибыль есть, но по сравнению с периодом 11-12 часов, она незначительна. Сможем ли мы с помощью этого наблюдения улучшить стратегию для покупок еще больше?<br /><br /><a href='https://stocksharp.ru/file/101784/testirovanie-sistemy-22_png/' class='lightview' data-lightview-options="skin: 'mac'" data-lightview-group='mixed'><img src="https://stocksharp.ru/file/101784/testirovanie-sistemy-22_png/?size=500x500" alt="торговые роботы, тестирование торговой системы 22" title="торговые роботы, тестирование торговой системы 22" /></a><br /><br />Пропишем в коде условие, не входить до 11 часов.<br />Результаты нашего изменения приведены на картинке выше.<br />Количество убыточных сделок уменьшилось, количество прибыльных сделок тоже уменьшилось, но общий итог положительный – доходность выросла. Причины данного явления обсудим позже, посмотрим, как это проявляется на продажах.<br /><br />Оптимизация Время – Риск Шорт<br /><br />Повторяем процедуру для продаж.<br /> <br /><a href='https://stocksharp.ru/file/101785/testirovanie-sistemy-23_png/' class='lightview' data-lightview-options="skin: 'mac'" data-lightview-group='mixed'><img src="https://stocksharp.ru/file/101785/testirovanie-sistemy-23_png/?size=500x500" alt="торговые роботы, тестирование торговой системы 23" title="торговые роботы, тестирование торговой системы 23" /></a><br /><br />Проведя анализ, сделаем выводы для шортов. На этот раз обойдемся без подробных объяснений: принцип, причины и выводы похожи на результаты работы по покупкам.<br /><br />В результате оптимизации я сделал следующие изменения в коде<br />- время для продаж до 14 часов.<br />- время для продаж с 11 часов<br />- риск для продаж 0,7%<br /><br />Для того чтобы увидеть изменения результатов после проведения оптимизации для продаж, без влияния не него изменений проведённых по покупкам, отключим сигналы для покупок и сравним результаты до и после.<br />По Performance видно, что у нас опять уменьшилось количество сделок, увеличился процент прибыльных сделок. Изменения такие же, как после работы с покупками, что дает основание думать, что причина, почему стратегия улучшилась одна. То есть выводы для продаж будут схожи с покупками.<br /><br /><a href='https://stocksharp.ru/file/101786/testirovanie-sistemy-24_png/' class='lightview' data-lightview-options="skin: 'mac'" data-lightview-group='mixed'><img src="https://stocksharp.ru/file/101786/testirovanie-sistemy-24_png/?size=500x500" alt="торговые роботы, тестирование торговой системы 24" title="торговые роботы, тестирование торговой системы 24" /></a><br /><br />Performance после изменений: времени работы, рисков для покупок и продаж.<br /><br /><a href='https://stocksharp.ru/file/101787/testirovanie-sistemy-25_png/' class='lightview' data-lightview-options="skin: 'mac'" data-lightview-group='mixed'><img src="https://stocksharp.ru/file/101787/testirovanie-sistemy-25_png/?size=500x500" alt="торговые роботы, тестирование торговой системы 25" title="торговые роботы, тестирование торговой системы 25" /></a><br /><br />Перед тем как приступить к проверке последнего параметра – Фильтра по МА, хочу сделать небольшое отступление и рассказать одну особенность WealthLab по расчету прибыли и просадок в Performance отдельно по покупкам и продажам.<br /><br /><a href='https://stocksharp.ru/file/101788/testirovanie-sistemy-26_png/' class='lightview' data-lightview-options="skin: 'mac'" data-lightview-group='mixed'><img src="https://stocksharp.ru/file/101788/testirovanie-sistemy-26_png/?size=500x500" alt="торговые роботы, тестирование торговой системы 26" title="торговые роботы, тестирование торговой системы 26" /></a><br /><br />Откуда -280%<br /><br />В WealthLab есть отдельный расчет просадок и прибыли по покупкам и продажам. Это сделано для удобства, чтобы можно было видеть, как они работают по отдельности. Есть одна тонкость, которая не является критической, но которую следует понимать.<br /><br />Посмотрите на картинку выше, слева, в столбце по продажам, указана просадка, как работает шорт. Справа тот же столбец, только NetProfit сильно изменился, при этом мы ничего не меняли в алгоритме для продаж, и, как видно из той же картинки, количество сделок не изменилось. Дело в том, что, несмотря на то, что статистика для покупок и продаж ведется отдельно, при работе кода и появлении сигнала на продажу, вход в позицию осуществляется объемом с учетом заработанных ранее денег. После того как мы прооптимизировали алгоритм для покупок, и результаты сильно выросли, в том месте где мы раньше входили объемом в 13 лотов (пример), мы теперь будет входить объемом 26, т.к. до этого мы успели заработать с помощью покупок. При этом просадка считается от суммы, которую заработали продажи.<br /><br />Оптимизация Фильтр МА<br /><br /><a href='https://stocksharp.ru/file/101789/testirovanie-sistemy-27_png/' class='lightview' data-lightview-options="skin: 'mac'" data-lightview-group='mixed'><img src="https://stocksharp.ru/file/101789/testirovanie-sistemy-27_png/?size=500x500" alt="торговые роботы, тестирование торговой системы 27" title="торговые роботы, тестирование торговой системы 27" /></a><br /><br />МА служит как некий индикатор тренда – если цена находится ниже средней, значит краткосрочный тренд нисходящий, наоборот – восходящий. Нам необходимо входить в позицию там, где у нас есть перевес вероятности, фильтр должен помогать нам находить этот перевес.<br />Число 157 объясняется количеством пятиминуток за один рабочий день (сейчас время торгов изменилось, количество 5м. тоже изменилось). Посмотрим, как работает стратегия на других параметрах.<br />Сейчас мы тестируем только один параметр, поэтому смотрим результаты в <br />1 Graph Parametr.<br /><br />По результатам оптимизации <br />- на всех значениях параметра стратегия работает в плюс, это хорошо.<br />- параметр 157 один из лучших, 250 работает еще лучше, но незначительно.<br /><br />Поставим значение параметра МА = 250.<br /><br />Выводы после оптимизации параметров.<br /><br />У нас получилось улучшить стратегию УД с помощью оптимизации параметров. Также, по графикам оптимизации мы смогли увидеть некоторые закономерности, которые помогли нам улучшить результаты системы.<br /><br />Начальный Алгоритм :<br />- вход в лонг выше открытия дня, вход в шорт ниже открытия дня <br />- Цена выше/ниже 157 средней. +++ Параметр работает, оставляем. <br />- искать точку входа до определенного времени t. +++ Выявили оптимальное время работы. С 11 до 12 для покупок и с 11 до 14 для продаж.<br />- Вход в лонг по бычьей модели поглощения.<br />- Вход в шорт по медвежьей модели поглощения.<br />- стоп = 0,2 – 0,3% от точки входа. --- оказалось что вход с маленьким стопом не оправдывает себя. Параметр был существенно изменен.<br />- выход в конце дня.<br /><br />Интересным нововведением было – не входить в первый час торгов. Ранее мы не стали обсуждать это явление. На самом деле существует такое понятие как час дурака, это название появилось после исследования, которое показывало, что волатильностью в первый час торгов очень сильная и довольно трудно прогнозируемое. Заработать в это время можно в большей степени случайным образом, повезет/не повезет. Можете поискать в сети информацию на данную тему.<br /><br /><br />Как еще улучшить стратегию?<br /><br />Хотя результаты стратегии стали намного лучше - 375% годовых, просадка оставляет желать лучшего – 43% это очень много. После того как мы исчерпали возможности оптимизации существующих параметров, вернемся к вкладке Chart, посмотрим как работает наша стратегия, возможно, после того как мы поработали с параметрами и можем отвлечься от них, мы увидим новые возможности для улучшения стратегии.<br /><br /><a href='https://stocksharp.ru/file/101790/testirovanie-sistemy-28_png/' class='lightview' data-lightview-options="skin: 'mac'" data-lightview-group='mixed'><img src="https://stocksharp.ru/file/101790/testirovanie-sistemy-28_png/?size=500x500" alt="торговые роботы, тестирование торговой системы 28" title="торговые роботы, тестирование торговой системы 28" /></a><br /><br /> Во время просмотра Chart, мне попадались случаи подобные этому – когда у нас был хороший профит (в данном случае чистых 4,5%), а потом нас выбивало по стопу. Сразу возникает мысль – а что если сделать перенос в БУ после прохождения ценой некоторого расстояния? Или, что если мы будем фиксировать цель не в конце дня, а по математической цели, например, после 4% движения.<br /><br />Перед тем, как начать программировать идею, надо посмотреть, насколько часто бывали такие случаи, может быть это единичный случай, и тогда не стоит даже пробовать программировать идею. Есть способ гораздо более удобный для наших целей, чем просмотр графика. <br /><br /><br /><a href='https://stocksharp.ru/file/101791/testirovanie-sistemy-29_png/' class='lightview' data-lightview-options="skin: 'mac'" data-lightview-group='mixed'><img src="https://stocksharp.ru/file/101791/testirovanie-sistemy-29_png/?size=500x500" alt="торговые роботы, тестирование торговой системы 29" title="торговые роботы, тестирование торговой системы 29" /></a><br /><br />Во вкладке trades, есть два столбца MAE% и MFE%.<br /><br />МАЕ% - означает, на сколько процентов цена уходила в сторону стопа. <br /><br />MFE% - означает, на сколько процентов максимально цена уходила в нужную нам сторону от точки входа.<br /><br />На приведенной картинке, видно, что были трейды, когда цена уходили на 4,5% , 2,3%, 3,7%, потом разворачивалась и мы получали убыток. Если просмотреть все трейды, становится видно, что такие случаи имеют место быть, поэтому попробовать запрограммировать перенос в БУ после прохождения определенного %, стоит. Также попробуем запрограммировать выход по математической цели.<br /><br />Перенос стопа в БУ, после прохождения ценой N%.<br />Если цена проходит определенный путь от точки входа, то стоп переносится в БУ. Зададим это условие как параметр, допишем в код тестера. <br />Удостоверившись, что код работает правильно, протестируем новый параметр.<br /> <br /><a href='https://stocksharp.ru/file/101792/testirovanie-sistemy-30_png/' class='lightview' data-lightview-options="skin: 'mac'" data-lightview-group='mixed'><img src="https://stocksharp.ru/file/101792/testirovanie-sistemy-30_png/?size=500x500" alt="торговые роботы, тестирование торговой системы 30" title="торговые роботы, тестирование торговой системы 30" /></a><br /><br />По результатам теста видно, что существенно никаких изменений, при переносе стопа в БУ нет. В таких случаях лучше отказаться от параметра, т.к. больше количество параметров делает систему менее устойчивой.<br /><br />Закрытие позиции при достижении математической цели.<br />Сейчас, если мы находимся в позе, то выход осуществляется в конце дня. Попробуем выходить из позиции по достижению математической цели.<br />Дописываем этот параметр в код тестера, и тестируем его.<br /> <br /><a href='https://stocksharp.ru/file/101793/testirovanie-sistemy-31_png/' class='lightview' data-lightview-options="skin: 'mac'" data-lightview-group='mixed'><img src="https://stocksharp.ru/file/101793/testirovanie-sistemy-31_png/?size=500x500" alt="торговые роботы, тестирование торговой системы 31" title="торговые роботы, тестирование торговой системы 31" /></a><br /><br />По результатам теста видно, что лучшие значения параметра это 9%, что, по сути, является максимальным значением. Если фиксировать прибыль при достижении 5-6-7%, к увеличению профита это не приведет, к уменьшению просадки тоже. <br /><br />Вывод по новым двум параметрам<br />Как вы смогли убедиться, смысла в переносе стопа в БУ и выходу по математической цели нет. Как было сказано в начале – вводимые параметры должны иметь под собой какое-то обоснование. Поиск точки входа в начале дня, для того чтобы поймать ударный день, имеет под собой обоснование. Выходить из позиции, потому что цена прошла определенный процент движения, не имеет под собой обоснования. Цель должна рассчитываться исходя из текущих условий, также как и перенос в БУ должен производиться после событий, которые сигнализируют о возможном развороте.<br /><br /><b>Проверка правильности написания кода.</b><br /><br />После изменений в коде надо удостовериться, что код работает правильно. После каждого изменения в коде, надо проверять, что код работает правильно, иначе есть большая и неприятная возможность заниматься анализированием и оптимизацией неправильно работающего кода. Проверять можно полностью ручным методом, можно в помощь ручному методу использовать возможности WealthLab. <br />Например, возьмём результаты работы кода до внесения изменений по переносу стопа в БУ и после, установив в новой версии параметр переноса на значение 10%. 10% у нас за время тестируемой истории не было ни разу, поэтому результаты работы кода в обоих случаях должны быть одинаковыми.<br />На приведенном ниже рисунке мы видим, что все значении остались прежними, это косвенно подтверждает, что явных ошибок в измененном коде нет.<br />Можно посмотреть во вкладке trades MAE% и MFE%. Установив параметр (например, 2%) при всех MFE больше 2%, в колонке Profit видно, что стопило нас на уровне безубытка. <br /><br />Проверка кода на наличие ошибок по перфомансу.<br /><br /><a href='https://stocksharp.ru/file/101794/testirovanie-sistemy-32_png/' class='lightview' data-lightview-options="skin: 'mac'" data-lightview-group='mixed'><img src="https://stocksharp.ru/file/101794/testirovanie-sistemy-32_png/?size=500x500" alt="торговые роботы, тестирование торговой системы 32" title="торговые роботы, тестирование торговой системы 32" /></a><br /><br />Проверка кода на наличие ошибок по MAE – MFE.<br /> <br /><a href='https://stocksharp.ru/file/101795/testirovanie-sistemy-33_png/' class='lightview' data-lightview-options="skin: 'mac'" data-lightview-group='mixed'><img src="https://stocksharp.ru/file/101795/testirovanie-sistemy-33_png/?size=500x500" alt="торговые роботы, тестирование торговой системы 33" title="торговые роботы, тестирование торговой системы 33" /></a><br /><br /><b>Заключение</b><br /><br />Торговый робот, это всего лишь автоматизация вашей стратегии. Способ реализации робота несомненно важен, от выбора платформы зависит надежность и возможность реализовать Ваши алгоритмы. Но, идея стратегии лежит на первом месте, а тестирование идеи, как мы убедились, может дать нам очень многое. <br /><br />Удачи в ваших исследованиях<br /><br />Горбунов Алексей<br /><br /><b>StockSharp Торговые роботы </b><br /><br />Приложение: код для тестирования торговой системы<br /><br /><div class="code"><strong>Код</strong><div class="innercode"><pre class="brush:csharp">
using System;
using System.Drawing;
using WealthLab;
using WealthLab.Indicators;
using WealthLab.Properties;
using System.Drawing;
namespace WealthLab.Strategies
{
public class FirstStrategy : WealthScript
{
StrategyParameter paramMA;
StrategyParameter paramTime;
StrategyParameter paramTimeShort;
StrategyParameter paramRisk;
StrategyParameter paramRiskS;
public FirstStrategy()
{
paramMA = CreateParameter("MA", 1, 1, 500, 10);
paramTime = CreateParameter("Время", 12, 10, 19, 1);
paramTimeShort = CreateParameter("Время_S", 11, 10, 19, 1);
paramRisk = CreateParameter("Риск лонг", 0.2, 0.2, 1, 0.1);
paramRiskS = CreateParameter("Риск шорт", 0.2, 0.2, 1, 0.1);
}
protected override void Execute()
{
DataSeries ma = SMA.Series(Open, paramMA.ValueInt);
PlotSeries (PricePane, SMA.Series(Open, paramMA.ValueInt), Color.Blue, LineStyle.Solid, 2);
double sp = 0;
double stop = 0;
PlotStops();
for(int bar = 1; bar < Bars.Count - 1; bar++)
{
if (Bars.IntradayBarNumber(bar) == 0)
{
sp = Bars.Open[bar];
}
\
if (IsLastPositionActive)
{
Position p = LastPosition;
if (p.PositionType == PositionType.Short)
{
if (!CoverAtStop(bar, p, stop))
{
if (Bars.IsLastBarOfDay(bar))
{
CoverAtMarket(bar, p);
}
}
}
else //Long
{
if (!SellAtStop(bar, p, stop))
{
if (Bars.IsLastBarOfDay(bar))
{
SellAtMarket(bar, p);
}
}
}
}
else
{
double high = Bars.High[bar];
double low = Bars.Low[bar];
if (!Bars.IsLastBarOfDay(bar) && high < sp)
{
if (Bars.Open[bar - 1] < Bars.Close[bar - 1] && Bars.Open[bar - 1] > Bars.Close[bar] &&
Bars.Date[bar + 1].Hour < paramTimeShort.ValueInt && Close[bar] < ma[bar] )
{
stop = Math.Max(Bars.High[bar], Bars.High[bar - 1]);
double openPrice = Bars.Open[bar + 1];
double exitPrice = stop;
if (openPrice / exitPrice > 1 - paramRiskS.Value / 100)
{
RiskStopLevel = stop;
ShortAtMarket(bar + 1);
}
else
{
stop = openPrice / (1 - paramRiskS.Value / 100);
RiskStopLevel = stop;
ShortAtMarket(bar + 1);
}
}
}
if (!Bars.IsLastBarOfDay(bar) && low > sp)
{
if (Bars.Open[bar - 1] > Bars.Close[bar - 1] && Bars.Open[bar - 1] < Bars.Close[bar] &&
Bars.Date[bar + 1].Hour < paramTime.ValueInt && Close[bar] > ma[bar] )
{
stop = Math.Min(Bars.Low[bar], Bars.Low[bar - 1]);
double openPrice = Bars.Open[bar + 1];
double exitPrice = stop;
if (exitPrice / openPrice > 1 - paramRisk.Value / 100)
{
RiskStopLevel = stop;
BuyAtMarket(bar + 1);
}
else
{
stop = (1 - paramRisk.Value / 100) * openPrice;
RiskStopLevel = stop;
BuyAtMarket(bar + 1);
}
}
}
}
}
}
}
}
</pre>
</div></div>https://stocksharp.ru/topic/360/Создание роботов с помощью S#. Введение2012-03-18T21:58:29Z2012-12-17T15:07:11ZFinDirectorhttps://stocksharp.ru/users/473/info@stocksharp.ruРешил написать несколько простых статей о том, как можно разрабатывать роботов с использованием библиотеки S#.<br />В саму библиотеку уже входят примеры, но они достаточно простые и их нельзя использовать в реальном приложении.<br /><br />Предложенная архитектура робота включает следующие особенности:<br /><ul><li>Интерфейс в стиле METRO UI.<br /><li>Паттерн MVVM для написания интерфейса робота.<br /><li>Корректная обработка исключительных ситуаций.<br /><li>Робот позволяет запускать множество различных стратегий на разных торговых системах, разных портфелях и разных инструментах, с различными параметрами, а также позволяет задавать все эти настройки в конфигурационном XML-файле (достаточная гибкость).<br /><li>Хранение состояния робота.<br /><li>Абсолютно компактный и тривиальный код.</ul><br />Приведу пример конфигурационного файла. В этом примере задается одна стратегия StrikeStrategy. Для нее задается Quik в качестве торговой системы, задается портфель, инструмент RIM2. Для получения исторических данных устанавливается провайдер, получащий данные с ФИНАМа; у него установлены свойства на получение дневных данных по инструменту RIM2. Свое состояние стратегия хранит в ветке реестра Software\FinDirector\StrikeStrategy. Размер позиции равен 20% от капитала в портфеле. Стратегия работает на 5-минутках.<br /><br /> <div class="code"><strong>Код</strong><div class="innercode"><pre class="brush:xml">
<FinDirector:StrategyLoader
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:FinDirector="clr-namespace:FinDirector;assembly=FinDirector"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:System="clr-namespace:System;assembly=mscorlib"
xmlns:Implementation="clr-namespace:FinDirector.Algo.Implementation;assembly=FinDirector.Algo"
xmlns:Strategies="clr-namespace:FinDirector.Algo.Strategies;assembly=FinDirector.Algo">
<FinDirector:StrategyLoader.Resources>
<Implementation:QuikTraderBuilder x:Key="MyQuik" Title="Мой Quik"
Path="***" Login="***" Password="***" />
<Implementation:PortfolioSelector x:Key="MyFortsPortfolio" Title="Пенсионный фонд кота Мурзика"
PortfolioName="***" />
<!--RIM2 FinamSecurityCode-->
<System:Int32 x:Key="FinamRTSCode">80996</System:Int32>
<Implementation:SecuritySelector x:Key="fRTS"
SecurityCode="RIM2" />
<Implementation:SecuritySelector x:Key="Si"
SecurityCode="SiM2" />
</FinDirector:StrategyLoader.Resources>
<FinDirector:StrategyLoader.Strategies>
<Strategies:StrikeStrategy
TraderBuilder="{StaticResource MyQuik}"
PortfolioSelector="{StaticResource MyFortsPortfolio}"
SecuritySelector="{StaticResource fRTS}"
TimeFrame="0:5:0">
<Strategies:StrikeStrategy.HistoryCandleProvider>
<Implementation:FinamHistoryCandleProvider TimeFrame="1.0:0:0" FinamSecurityCode="{StaticResource FinamRTSCode}" />
</Strategies:StrikeStrategy.HistoryCandleProvider>
<Strategies:StrikeStrategy.SettingsProvider>
<Implementation:RegistrySettingsProvider SubKey = "Software\FinDirector\StrikeStrategy" />
</Strategies:StrikeStrategy.SettingsProvider>
<Strategies:StrikeStrategy.VolumeSizer>
<Implementation:MarginVolumeSizer Ratio="0.2" />
</Strategies:StrikeStrategy.VolumeSizer>
</Strategies:StrikeStrategy>
</FinDirector:StrategyLoader.Strategies>
</FinDirector:StrategyLoader></pre>
</div></div><br /><span style="font-size:120%"><div align="right"><b>Автор статьи — Вадим Чижов</b></div></span>https://stocksharp.ru/topic/359/Создание роботов с помощью S#. Часть 1. Обработка исключений2012-03-18T21:58:32Z2012-12-17T15:07:06ZFinDirectorhttps://stocksharp.ru/users/473/info@stocksharp.ruСамое главное в роботе — это обработка исключений. У нас в роботе могут быть запущено множество различных стратегий, и исключение в одном из роботов или ошибка в UI потоке не должны приводить к падению всей программы. Тем не менее именно такое поведение характерно по умолчанию для .NET программы.<br />Далее считаем, что наш робот является WPF – приложением! В качестве теста используем следующий код:<br /><div class="code"><strong>Код</strong><div class="innercode"><pre class="brush:csharp">
private void Window_Loaded(object sender, RoutedEventArgs e)
{
Task.Factory.StartNew(ThrowException);
ThrowException();
}
void ThrowException()
{
throw new Exception("ops!");
}</pre>
</div></div><br />Вначале мы кидаем исключение в отдельном потоке (а в стратегиях события могут вызываться асинхронно), а затем в UI потоке. Приложение упадет. Чтобы это исправить, необходимо сделать следующие правки. <br />В файле App.xaml.cs написать:<br /><div class="code"><strong>Код</strong><div class="innercode"><pre class="brush:csharp">
protected override void OnStartup(StartupEventArgs e)
{
base.OnStartup(e);
#if (DEBUG != true)
// Don't handle the exceptions in Debug mode because otherwise the Debugger wouldn't
// jump into the code when an exception occurs.
DispatcherUnhandledException += AppDispatcherUnhandledException;
AppDomain.CurrentDomain.UnhandledException += AppDomainUnhandledException;
#endif
}
private void AppDispatcherUnhandledException(object sender, DispatcherUnhandledExceptionEventArgs e)
{
HandleException(e.Exception, false);
e.Handled = true;
}
private static void AppDomainUnhandledException(object sender, UnhandledExceptionEventArgs e)
{
HandleException(e.ExceptionObject as Exception, e.IsTerminating);
}
private static void HandleException(Exception e, bool isTerminating)
{
if (e == null) return;
Trace.TraceError(e.ToString());
if (!isTerminating)
{
MessageBox.Show(string.Format(CultureInfo.CurrentCulture, "Неизвестная ошибка: {0}", e.ToString()),
"FinDirector", MessageBoxButton.OK, MessageBoxImage.Error);
}
}</pre>
</div></div><br /><br />Тем не менее, это не спасет от крэша наше приложение при необработанных исключениях не в UI потоке. В файл app.confg необходимо добавить строки:<br /><div class="code"><strong>Код</strong><div class="innercode"><pre class="brush:xml">
<runtime>
<legacyUnhandledExceptionPolicy enabled="1" />
</runtime></pre>
</div></div><br />Теперь:<br /><ul><li>приложение не будет падать при не критических исключениях (таких как OutOfMemory, StackOverflow);<br /><li>мы получим сообщение об ошибке, а не проглотим его.</ul><br /><span style="font-size:120%"><div align="right"><b>Автор статьи — Вадим Чижов</b></div></span>https://stocksharp.ru/topic/358/Создание роботов с помощью S#. Часть 2. Базовый класс для всех стратегий2012-03-18T21:58:41Z2012-12-17T15:07:01ZFinDirectorhttps://stocksharp.ru/users/473/info@stocksharp.ruВсе наши стратегии будем наследовать от класса StandardStrategy. Зачем он нужен? Дело в том, что все стратегии часто должны уметь делать одни и теже вещи: брать откуда-то торговую систему, портфель, инструмент, исторические свечки, хранить состояние, устанавливать размер позиции. Чтобы не решать каждый раз эти проблемы, можно сделать так:<br /><div class="code"><strong>Код</strong><div class="innercode"><pre class="brush:csharp">
public abstract class StandardStrategy : Strategy
{
public virtual string Description { get { return Name; } }
public ITraderBuilder TraderBuilder { get; set; }
public IPortfolioSelector PortfolioSelector { get; set; }
public ISecuritySelector SecuritySelector { get; set; }
public IVolumeSizer VolumeSizer { get; set; }
public IHistoryCandleProvider HistoryCandleProvider { get; set; }
public ISettingsProvider SettingsProvider { get; set; }
public Unit PriceDelta { get; set; }
protected StandardStrategy()
{
PriceDelta = 0.1.Percents();
}
}</pre>
</div></div><br /><br />ITraderBuilder будет уметь волшебным образом создавать торговую систему:<br /><div class="code"><strong>Код</strong><div class="innercode"><pre class="brush:csharp">
public interface ITraderBuilder : IDisposable
{
string Title { get; }
ITrader Trader { get; }
ICandleManager CandleManager { get; }
void RunTerminal();
ITrader BuildTrader();
event Action IsConnectedChanged;
}</pre>
</div></div><br /><br />IPortfolioSelector будет находить портфель:<br /><br /><div class="code"><strong>Код</strong><div class="innercode"><pre class="brush:csharp">
public interface IPortfolioSelector
{
string Title { get; }
Portfolio GetPortfolio(ITrader trader);
}</pre>
</div></div><br />ISecuritySelector находить инструмент:<br /><br /><div class="code"><strong>Код</strong><div class="innercode"><pre class="brush:csharp">
public interface ISecuritySelector
{
string Title { get; }
Security GetSecurity(ITrader trader);
}</pre>
</div></div><br /><br />IVolumeSizer расчитывать размер позиции:<br /><div class="code"><strong>Код</strong><div class="innercode"><pre class="brush:csharp">
public interface IVolumeSizer
{
int GetVolume(Portfolio portfolio, Security security);
}</pre>
</div></div><br />IHistoryCandleProvider получать исторические свечки:<br /><div class="code"><strong>Код</strong><div class="innercode"><pre class="brush:csharp">
public interface IHistoryCandleProvider
{
List<TimeFrameCandle> GetHistoryCandles(DateTime beginDate, DateTime endDate);
}</pre>
</div></div><br />ISettingsProvider хранить состояние стратегии:<br /><div class="code"><strong>Код</strong><div class="innercode"><pre class="brush:csharp">
public interface ISettingsProvider
{
string ReadSetting(string name);
void WriteSetting(string name, string value);
}</pre>
</div></div><br /><br />Представим, что у нас уже есть реалзации всех этих интерфесов (этим мы займемся позже). Как будет выглядить конкретная стратегия?<br /><div class="code"><strong>Код</strong><div class="innercode"><pre class="brush:csharp">
public class StrikeStrategy : StandardStrategy
{
public override string Description
{
get { return "Стратегия для ловли ударного дня"; }
}
CandleToken candleToken;
DateTime strategyStartTime;
public TimeSpan TimeFrame { get; set; }
public StrikeStrategy()
{
TimeFrame = TimeSpan.FromMinutes(5);
}
protected override void OnStarting()
{
try
{
Trader = TraderBuilder.BuildTrader();
if (Trader == null)
throw new ApplicationException(string.Format("Отсутствует трейдер {0}.", TraderBuilder.Title));
strategyStartTime = Trader.MarketTime;
Portfolio = PortfolioSelector.GetPortfolio(Trader);
if (Portfolio == null)
throw new ApplicationException(string.Format("Отсутствует портфель {0}.", PortfolioSelector.Title));
Security = SecuritySelector.GetSecurity(Trader);
if (this.Security == null)
throw new ApplicationException(string.Format("Отсутствует инструмент {0}.", SecuritySelector.Title));
Trader.RegisterQuotes(Security);
if (VolumeSizer != null)
{
Volume = VolumeSizer.GetVolume(Portfolio, Security);
this.AddInfoLog("Объем: {0}", Volume);
}
if (TraderBuilder.CandleManager.IsTimeFrameCandlesRegistered(Security, TimeFrame))
{
candleToken = TraderBuilder.CandleManager.GetToken(typeof(TimeFrameCandle), Security, TimeFrame);
}
else
{
candleToken = TraderBuilder.CandleManager.RegisterTimeFrameCandles(Security, TimeFrame);
}
this.When(candleToken.CandlesFinished())
.Do<IEnumerable<Candle>>(OnCandlesFinished);
}
catch (ApplicationException ex)
{
this.AddErrorLog(ex.Message);
}
base.OnStarting();
}
void OnCandlesFinished(IEnumerable<Candle> newCandles)
{
foreach (Candle candle in newCandles)
{
OnCandleFinished(candle);
}
}
void OnCandleFinished(Candle candle)
{
DateTime currentDate = candle.Time;
if (candle.Time < strategyStartTime)
return;
...
}
}</pre>
</div></div><br /><br /><span style="font-size:120%"><div align="right"><b>Автор статьи — Вадим Чижов</b></div></span>https://stocksharp.ru/topic/357/Создание роботов с помощью S#. Часть 3. Реализация интерфейсов2012-03-18T21:58:56Z2012-12-17T15:06:55ZFinDirectorhttps://stocksharp.ru/users/473/info@stocksharp.ruТеперь приступим к реализации интерфейсов из 2 части статьи “Создание роботов с помощью S#. Часть 2. Базовый класс для всех стратегий”. Здесь западные специалисты рекомендуют вначале реализовывать тестовые версии интерфейсов. И писать сразу UNIT-тесты. Смотрите пример SampleEmulationTesting из библиотеки S#. Но ведь программист — это высшая форма существования разума во Вселенной, и поэтому, в принципе не может ошибаться. Сразу в бой!<br /><br /><b>QuikTraderBuilder</b><br />Реализуем создание торговой системы Quik. Основной метод:<br /><div class="code"><strong>Код</strong><div class="innercode"><pre class="brush:csharp">
public ITrader BuildTrader()</pre>
</div></div><br />Нужно учитывать, что метод могут одновременно вызвать из разных потоков и создавать только 1 Quik.<br /><div class="code"><strong>Код</strong><div class="innercode"><pre class="brush:csharp">
public sealed class QuikTraderBuilder : ITraderBuilder, ILogSource
{
private object lockObject = new object();
private Task task;
private bool isConnected;
public string Path { get; set; }
public string Login { get; set; }
public string Password { get; set; }
public string DdeServer { get; set; }
public string DllName { get; set; }
private string title;
public string Title
{
get { return title ?? Login; }
set { title = value; }
}
public ITrader Trader { get; private set; }
public ICandleManager CandleManager { get; private set; }
public event Action IsConnectedChanged;
public ITrader BuildTrader()
{
lock (lockObject)
{
if (task == null)
task = Task.Factory.StartNew(CreateTrader);
}
task.Wait();
return Trader;
}
private void CreateTrader()
{
QuikTerminal terminal = RunTerminalInternal();
QuikTrader quikTrader;
WriteLog(ErrorTypes.None, "Создаем шлюз взаимодействия с системой Quik.");
if (!string.IsNullOrEmpty(DdeServer))
{
if (!string.IsNullOrEmpty(DllName))
quikTrader = new QuikTrader(terminal.DirectoryName, DdeServer, DllName);
else
quikTrader = new QuikTrader(terminal.DirectoryName, DdeServer);
}
else
{
quikTrader = new QuikTrader(terminal.DirectoryName);
}
quikTrader.SecuritiesTable.Columns.Add(DdeSecurityColumns.MarginBuy);
quikTrader.SecuritiesTable.Columns.Add(DdeSecurityColumns.MinPrice);
quikTrader.SecuritiesTable.Columns.Add(DdeSecurityColumns.MaxPrice);
quikTrader.ReConnectionSettings.Interval = TimeSpan.FromSeconds(10);
quikTrader.ReConnectionSettings.WorkingTime = Exchange.Rts.WorkingTime;
quikTrader.Connected += () =>
{
UpdateIsConnected(null);
if (!quikTrader.IsExportRunning)
{
WriteLog(ErrorTypes.None, "Запускаем экспорт данных.");
quikTrader.StartExport();
Verify(quikTrader.Terminal);
}
};
quikTrader.ConnectionError += ex => UpdateIsConnected(ex);
quikTrader.Disconnected += () => UpdateIsConnected(null);
Trader = quikTrader;
CandleManager = new CandleManager(quikTrader);
WriteLog(ErrorTypes.None, "Производим подключение.");
quikTrader.Connect();
}
private void UpdateIsConnected(Exception ex)
{
var trader = Trader;
bool isConnectedNew = trader != null && trader.IsConnected;
if (isConnected != isConnectedNew)
{
isConnected = isConnectedNew;
WriteLog(ErrorTypes.None, isConnectedNew ? "Соединение подключено." : "Соединение отключено.");
RaiseIsConnectedChanged();
if (ex != null) WriteLog(ErrorTypes.Error, ex.Message);
}
}
private void RaiseIsConnectedChanged()
{
var handler = IsConnectedChanged;
if (handler != null) handler();
}
public void RunTerminal()
{
RunTerminalInternal();
}
private QuikTerminal RunTerminalInternal()
{
QuikTerminal terminal = QuikTerminal.Get(Path);
if (!terminal.IsLaunched)
terminal.Launch();
if (!terminal.IsConnected)
terminal.Login(Login, Password);
return terminal;
}
private void Verify(QuikTerminal terminal)
{
var errors = terminal.GetTableSettings();
foreach (var error in errors)
{
string message = string.Format("Таблица {0}. {1}", error.Table.Caption, error.Error.Message);
WriteLog(ErrorTypes.Warning, message);
}
}
public void Dispose()
{
if (task != null)
task.Dispose();
if (CandleManager != null)
CandleManager.Dispose();
if (Trader != null)
Trader.Dispose();
}
#region ILogSource
public Ecng.Collections.INotifyList<ILogSource> Childs
{
get { return null; }
}
private Guid id = Guid.NewGuid();
public Guid Id
{
get { return id; }
}
public event Action<LogMessage> Log;
public string Name
{
get { return Title; }
}
public ILogSource Parent
{
get { return null; }
}
private void RaiseLog(LogMessage logMessage)
{
var handler = Log;
if (handler != null)
handler(logMessage);
}
private void WriteLog(ErrorTypes errorType, string message)
{
LogMessage logMessage = new LogMessage(this, DateTime.Now, errorType, message);
RaiseLog(logMessage);
}
#endregion
}</pre>
</div></div><br /><br />Создание других торговых систем оставим читателю в качестве домашнего задания.<br /><br /><b>PortfolioSelector</b><br />Реализуем получение портфеля по его имени. Основной момент: ждем, когда будет инициализирована сумма на счете, т.к. она нужна для определения размера позиции.<br /><div class="code"><strong>Код</strong><div class="innercode"><pre class="brush:csharp">
public class PortfolioSelector : IPortfolioSelector
{
private string title;
public string Title
{
get { return title ?? PortfolioName; }
set { title = value; }
}
public string PortfolioName { get; set; }
public Portfolio GetPortfolio(ITrader trader)
{
Portfolio result = FindPortfolio(trader);
if (result != null)
return result;
ManualResetEvent manualResetEvent = new ManualResetEvent(false);
Action<IEnumerable<Portfolio>> onPortfoliosChanged = p =>
{
if (FindPortfolio(trader) != null)
manualResetEvent.Set();
};
trader.NewPortfolios += onPortfoliosChanged;
trader.PortfoliosChanged += onPortfoliosChanged;
manualResetEvent.WaitOne(TimeSpan.FromSeconds(30));
trader.NewPortfolios -= onPortfoliosChanged;
trader.PortfoliosChanged -= onPortfoliosChanged;
result = FindPortfolio(trader);
return result;
}
private Portfolio FindPortfolio(ITrader trader)
{
return trader.Portfolios.FirstOrDefault(p => p.Name == PortfolioName && p.BeginAmount.Value != 0);
}
}</pre>
</div></div><br /><b>SecuritySelector</b><br />Поиск инструмента по его коду. Реализация аналогична PortfolioSelector.<br /><div class="code"><strong>Код</strong><div class="innercode"><pre class="brush:csharp">
public class SecuritySelector : ISecuritySelector
{
private string title;
public string Title
{
get { return title ?? SecurityCode; }
set { title = value; }
}
public string SecurityCode { get; set; }
public Security GetSecurity(ITrader trader)
{
Security result = FindSecurity(trader);
if (result != null)
return result;
ManualResetEvent manualResetEvent = new ManualResetEvent(false);
Action<IEnumerable<Security>> onNewSecurities = s =>
{
if (FindSecurity(trader) != null)
manualResetEvent.Set();
};
trader.NewSecurities += onNewSecurities;
manualResetEvent.WaitOne(TimeSpan.FromSeconds(30));
trader.NewSecurities -= onNewSecurities;
result = FindSecurity(trader);
return result;
}
private Security FindSecurity(ITrader trader)
{
return trader.Securities.FirstOrDefault(s => s.Code == SecurityCode);
}
}</pre>
</div></div><br /><b>MarginVolumeSizer</b><br />Определение размера позиции по лимиту открытых позиций и гарантийному обеспечению.<br /><div class="code"><strong>Код</strong><div class="innercode"><pre class="brush:csharp">
public class MarginVolumeSizer : IVolumeSizer
{
public double Ratio { get; set; }
public decimal MaxCapital { get; set; }
public MarginVolumeSizer()
{
MaxCapital = decimal.MaxValue;
}
public int GetVolume(Portfolio portfolio, Security security)
{
decimal capital = Math.Min(portfolio.BeginAmount.Value, MaxCapital);
int quantity = (int)(capital * (decimal)Ratio / security.MarginBuy);
return quantity;
}
}</pre>
</div></div><br /><b>RegistrySettingsProvider</b><br />Чтение и запись состояния стратегии из реестра.<br /><div class="code"><strong>Код</strong><div class="innercode"><pre class="brush:csharp">
public class RegistrySettingsProvider : ISettingsProvider
{
public string SubKey { get; set; }
public RegistrySettingsProvider()
{
SubKey = @"Software\FinDirector";
}
public string ReadSetting(string name)
{
using (RegistryKey registryKey = Registry.CurrentUser.CreateSubKey(SubKey))
{
return (string)registryKey.GetValue(name);
}
}
public void WriteSetting(string name, string value)
{
using (RegistryKey registryKey = Registry.CurrentUser.CreateSubKey(SubKey))
{
registryKey.SetValue(name, value);
}
}
}</pre>
</div></div><br /><b>FinamHistoryCandleProvider</b><br />Получение исторических свечей с сайта финама. Реализацию не выкладываю, т.к. много кода.<br /><div class="code"><strong>Код</strong><div class="innercode"><pre class="brush:csharp">
public class FinamHistoryCandleProvider : IHistoryCandleProvider
{
public int FinamSecurityCode { get; set; }
public TimeSpan TimeFrame { get; set; }
public FinamHistoryCandleProvider()
{
FinamSecurityCode = 17455;
TimeFrame = TimeSpan.FromHours(1);
}
public List<TimeFrameCandle> GetHistoryCandles(DateTime beginDate, DateTime endDate)
{
…
}</pre>
</div></div><br /><br /><span style="font-size:120%"><div align="right"><b>Автор статьи — Вадим Чижов</b></div></span>https://stocksharp.ru/topic/356/Создание роботов с помощью S#. Часть 4. Использование XAML для загрузки стратегий2012-03-18T21:58:59Z2012-12-17T15:06:48ZFinDirectorhttps://stocksharp.ru/users/473/info@stocksharp.ruВ реальном приложении у нас будет много стратегий со своими параметрами, которые проще всего загрузить из XAML файла.<br />XAML — это декларативный язык разметки. Он упрощает создание пользовательского интерфейса для нашего приложения.<br /><br />К настоящему моменту мы уже проделали большую работу по разделению бизнес-логики от UI и теперь можем в форме писать кода типа:<br /><br /><div class="code"><strong>Код</strong><div class="innercode"><pre class="brush:csharp">
StandardStrategy strategy;
StandardStrategy CreateStrategy()
{
var strategy = new StrikeStrategy()
{
TraderBuilder = new QuikTraderBuilder()
{
Path = "***",
Login = "***",
Password = "***"
},
PortfolioSelector = new PortfolioSelector()
{
PortfolioName = "***"
},
SecuritySelector = new SecuritySelector()
{
SecurityCode = "RIM2"
},
HistoryCandleProvider = new FinamHistoryCandleProvider()
{
TimeFrame = TimeSpan.FromHours(1),
FinamSecurityCode = 80996
},
SettingsProvider = new RegistrySettingsProvider()
{
SubKey = @"Software\FinDirector\StrikeStrategy"
},
VolumeSizer = new MarginVolumeSizer()
{
Ratio = 0.2,
MaxCapital = 1000000
},
TimeFrame = TimeSpan.FromMinutes(5)
};
return strategy;
}
private void Window_Loaded(object sender, RoutedEventArgs e)
{
strategy = CreateStrategy();
}
protected override void OnClosed(EventArgs e)
{
base.OnClosed(e);
if (strategy != null && strategy.TraderBuilder != null)
strategy.TraderBuilder.Dispose();
}
private void btnStart_Click(object sender, RoutedEventArgs e)
{
if (strategy.ProcessState == ProcessStates.Stopped)
Task.Factory.StartNew(strategy.Start);
}
private void btnStop_Click(object sender, RoutedEventArgs e)
{
strategy.Stop();
}</pre>
</div></div><br /><br />Получилось совсем немного кода. Тем не менее в реальном приложении у нас будет много стратегий и у каждой будет куча параметров. Чтобы не зашивать их в коде, проще всего загрузить их из XAML файла, таком как в примере из статьи <a href="http://stocksharp.com/lesson/article.aspx?aid=4" title="http://stocksharp.com/lesson/article.aspx?aid=4">“Создание роботов с помощью S#. Введение”</a>.<br /><br /><div class="code"><strong>Код</strong><div class="innercode"><pre class="brush:csharp">
public class StrategyLoader : FrameworkElement
{
public StrategyList Strategies { get; set; }
public StrategyLoader()
{
Strategies = new StrategyList();
}
public static StrategyLoader Load(string location)
{
return (StrategyLoader)XamlReader.Load(new XmlTextReader(location));
}
}
[Serializable]
public class StrategyList : List<StandardStrategy> { }</pre>
</div></div><br /><br />Теперь изменим метод CreateStrategy нашей формы:<br /><br /><div class="code"><strong>Код</strong><div class="innercode"><pre class="brush:csharp">
StandardStrategy CreateStrategy()
{
var strategy = StrategyLoader.Load("Strategies.config").Strategies.FirstOrDefault();
return strategy;
}</pre>
</div></div><br /><br /> А в файл Strategies.config поместим все настройки. В коде формы теперь нет ничего лишнего.<br /><br /><span style="font-size:120%"><div align="right"><b>Автор статьи: Вадим Чижов</b></div></span>