Избранное трейдера xfo
Наконец-то, меня выпустили из бана. Ну тут уж я сам оказался дурён и нелюбомудрен. В общем, сам виноват…
Это я к тому, что выкладываю следующую часть с опозданием. Прошу меня за это простить.
Итак, мы решили спекульнуть РИшечкой, чтобы выиграть денюшек на хлебушек.
Лирическое отступление. Да, я не описАлся, ещё мой любимый Альберт Айнстан говорил, что «Все события в природе носят вероятностный характер». Поэтому биржевая торговля – это Игра, Игра и ещё раз Игра! Не работа, не бизнес, а именно ИГРА! С вероятностными исходами.
Ничего плохого или предосудительного в этом не вижу. Шахматы, например, это тоже тяжелая, кропотливая, но игра. В которой, чтобы чего добиться, нужно много и упорно учиться и тренироваться. Но учиться – Игре. И играть, играть, играть…
Или шпионы-разведчики-контразведчики, которые ведут радиоигру и пускают дезу. Тоже игра.
Привет всем! В предыдущих статьях я описывал свой тестер, разработанный на C#, и, несколько раз подчёркивал, что переключение между двумя режимами (тестирование/торговля) может быть простым. Код стратегий не должен зависеть от того, кто поставщик маркет-даты и куда уходят заявки – в тестовую базу или на сервер брокера. Конечно, это лишь один из подходов, и кому-то он покажется странным, но, главное его достоинство заключается в том, что тестирование приближается к реальности, что даёт более достоверные результаты. Вопрос в следующем: как, имея один и тот же код, получать разные по функциональности программы? Один из вариантов – использовать инверсию управления и внедрение зависимостей! Об этом сегодня и пойдёт речь.
Приведу пример нехорошего (иногда, говорят – с запашком) кода:
class Strategy { public Strategy() { var mgr = new TestOrderManadger(); mgr.PlaceOrder(...); } }
Здесь плохо то, что класс Strategy зависит от класса TestOrderManadger. В такой реализации нельзя начать использовать какой-нибудь другой менеджер заявок (AnotherOrderManadger) без перекомпиляции библиотеки с классом Strategy. Тем более тут нарушается принцип единства ответственности – класс Strategy, помимо своей прямой обязанности, также, создаёт внутри себя зависимости. Чтобы исправить ситуацию, можно использовать интерфейсы:
interface IOrderMandger { void PlaceOrder(); } class TestOrderManadger : IOrderMandger { public void PlaceOrder(){} } class Strategy { public Strategy(IOrderMandger orderMandger) { var mgr = orderMandger; mgr.PlaceOrder(...); } }