Поскольку торговые системы я разрабатываю довольно таки давно. Так же давно стоял вопрос как это дело автоматизировать. До недавнего времени на нашем фондовым рынке это был сложный вопрос. Для того, чтобы сделать робота на том же языке qpile, языке программы quik нужно быть программистом. Заказывать чужого робота, это примерно тоже что и играть в казино. Всегда нужно знать на каких принципах он работает, чтобы как минимум знать когда этого робота отключить. Иначе, в случае если рынок изменится, вы рискуете получить большие потери. Постоянно прибыльных торговых систем просто не бывает, рынок меняется и системы время от времени приходится как то оптимизировать, пересматривать или же выключать в определённые моменты. Если вы не делали своего робота своими руками то будучи обычным трейдером вы это вряд ли сможете. Недавно появилась программа TSLAB на мой взгляд, там есть многое, кроме того что нужно простому трейдеру - удобства написания торговой системы. Для того чтобы написать там что-то более менее серьёзное нужно использовать API и опять же быть программистом. Хотелось бы что-то более простое наподобие языка Метастока или же языка амиброкера AFL. Я делал роботов например на связке quik-amibroker, но торговый робот связка работает обычно не очень стабильно и обладает множеством недостатков, вроде невозможности контролировать количество торговых лотов, свободные средства на депозите и т.д. И этот простой способ написания торгового робота появился с появлением языка ATF в торговом терминале Transaq используемым Финамом. Для меня лично это было открытием несколько месяцев назад. Язык пкоа ещё довольно таки сырой, но писать автоматические торговые системы на нём всё таки уже можно. Одного робота я написал несколько месяцев назад и он тестировался на реальном счёте с небольшим депозитом в 30 тыс. р. результаты вполне хорошие. Робот на языке ATF работает достаточно стабильно. В любой момент легко включается и отключается. Здесь приведу выдержку из описания AFL с сайта транзака:_____________________________________________________________________________________________ Пример автоматизированной торговой стратегии на ATF Основа любого индикатора — это функция calc(), которая в нашем случае содержит формулу, задающую значения линий индикаторов line[i] для каждого бара. function calc() { //Это быстрая линия MACD: line[0] = MovAvg(ind_ema, 12, pt_close) - MovAvg(ind_ema, 26, pt_close); //Это медленная линия MACD: line[1] = MovAvg(ind_ema, 9, line[0]); } Следующим шагом зададим условия покупки/продажи и выведем информацию об их выполнениина экран. function calc() { // сигналы: //Быстрая линия пересекла медленную снизу вверх: if (line[0] > line[1] and line[0][-1] < line[1][-1]) { signal::alert("Покупай " + getSecName()); } // Быстрая линия пересекла медленную сверху вниз:: if (line[0] < line[1] and line[0][-1] > line[1][-1]) { signal::alert("Продавай " + getSecName()); } } Код ATF с помощью функции signal::alert выводит на экран сообщение с рекомендацией покупки либо продажи при пересечении линий MACD. Обратите внимание на индикаторы line[0][-1] и line[1][-1] – с их помощью мы получаем значения линий 0 и 1 на предыдущем баре. Сравнение этих значений помогает определить сверху или снизу быстрая линия MACD пересекает медленную. Функция getSecName() возвращает имя текущей бумаги. Для того чтобы автоматизировать процесс, доверив ATF совершение сделок, достаточно заменить команду signal на команду trade_action. С помощью функции IndRef воспользуемся встроенным в TRANSAQ индикатором MACD Histogram, пересечение которого с нулем и говорит о пересечении линий MACD, - это упростит код стратегии. function calc() { line[0] = IndRef("macdhistogram", 12, 26, 9, ind_ema, ind_ema, ind_ema, pt_close)[0]; if (line[0] > 0 and line[0][-1] < 0) { trade_action::buy(1, ::lots); } if (line[0] < 0 and line[0][-1] > 0) { trade_action::sell(1, ::lots); } } Можно сделать стратегию сложнее и открывать позиции только при наличии выраженного тренда. Для этой цели будем проверять значение индикатора ADX (индекс направленного движения), введя в код стратегии дополнительное условие: if (IndRef("adx", 27)[1] > 20 or getSecBalance() > 0) Обратите внимание на функцию getSecBalance(), которая возвращает значение количества бумаг, находящихся в портфеле. Она введена в код алгоритма для того, чтобы упростить условия выхода из позиции. Если робот ATF уже что-то купил, команда на закрытие сделки будет подаваться вне зависимости от значения индикатора ADX. Используемое слово «or» указывает на то, что для выполнения кода нам достаточно одного из двух условий. Итоговый алгоритм, который совершает сделки после пересечения линий MACD при условии выраженного тренда, выглядит следующим образом: function calc() {line[0] = IndRef("macdhistogram", 12, 26, 9, ind_ema, ind_ema, ind_ema, pt_close)[0]; if (IndRef("adx", 27)[1] > 20 or getSecBalance() > 0) { if (line[0] > 0 and line[0][-1] < 0) { trade_action::buy(1, ::lots); } if (line[0] < 0 and line[0][-1] > 0) { trade_action::sell(1, ::lots); } } } _____________________________________________________________________________________________ В следующих постах с этими тегами буду разбирать конкретные примеры с которыми столкнулся в процессе написания роботов на ATF. Пока думаю создавать ли ещё сообщество на эту тему. Их и так три у меня. Если кто знает какие сообщества занимаются написанием МТС, скиньте в личку пожалуйста.