Приветствую Вас в своем блоге.
Параллельно с основной работой я периодически занимаюсь написанием торговых роботов с использованием Metastock. Аналитики мне дают алгоритмы, а я их реализовываю средствами построителя пользовательских индикторов.
Целью создания этого поста является, прежде всего, отображение концепции разработки торговых роботов с использованием MetaStock и внешних функций, предоставляемых сторонними разработчиками. В статье пойдет речь о роботе написанном с использованием функций из библиотеки TAutoTraderDLL.
Тут, я уже описывал использование TAutoTraderDLL, сейчас пойдет речь о более совершенном роботе.
После того как мы получили указанную DLL-ку появилась необходимость ее протестировать. Я взялся за мануал к метастоку, а один из зенакомых финансовых аналитиков за подбор легкой, и в тоже время "рабочей" стратегии. Стратегия основана на применении скользящей средней (Moving Averages) и MACD-гистограммы.
Описание стратегии:
Инструменты:
Параллельно с основной работой я периодически занимаюсь написанием торговых роботов с использованием Metastock. Аналитики мне дают алгоритмы, а я их реализовываю средствами построителя пользовательских индикторов.
Целью создания этого поста является, прежде всего, отображение концепции разработки торговых роботов с использованием MetaStock и внешних функций, предоставляемых сторонними разработчиками. В статье пойдет речь о роботе написанном с использованием функций из библиотеки TAutoTraderDLL.
Тут, я уже описывал использование TAutoTraderDLL, сейчас пойдет речь о более совершенном роботе.
После того как мы получили указанную DLL-ку появилась необходимость ее протестировать. Я взялся за мануал к метастоку, а один из зенакомых финансовых аналитиков за подбор легкой, и в тоже время "рабочей" стратегии. Стратегия основана на применении скользящей средней (Moving Averages) и MACD-гистограммы.
Описание стратегии:
Инструменты:
- Moving Averages с периодом 90;
- MACD-гистограмма;
- График изменения цены по бумаге.
Сигналы на вход в позицию на покупку:
- Цена > Moving Averages(90);
- MACD-гистограмма > 0;
Сигналы на выход из позиции на покупку:
- Цена > Moving Averages(90);
- MACD-гистограмма = 0;
Короткие позиции мы будем рассматривать позже (но возможно уже вне контекста этой стратегии).
Итак, в процессе построения робота я буду пользоваться двумя функциями предоставляемыми TAutoTraderDLL:
MSPushOrder - Отправка заявок из MetaStock в Quik;
MSGetCurrentPortfolio - получение значения текущего портфеля по инструменту.
Более подробно о них можно почитать ТУТ.
Вот собственно исходник созданного мной индикатора:
MAPeriod := 90; {Период скользящей средней} HPortf := 40; {Максимальное количество бумаг в портфеле} HLim := 10; {Количество БУМАГ на которые можно открыться} LLim := 0; {Минимальный предел в БУМАГАХ} CntLot:=1; {Количество лотов в позиции} {Контроль позиций} {Используем функцию MSGetCurrentPortfolio для получения текущего состояния портфеля} CP := ExtFml("TAutoTrader.MSGetCurrentPortfolio", "YYYYYY", "SBER", "XXXXXXX"); {"Константы" для анализа позиций} By := 1; Sl := -1; Go := 2; Lock := 0; {Анализируем...} {Если СР находтся между минимальным и максимальным пределом, то разрешаем торговлю (Go) Если СР >= верхнему пределу = только продаем Если СР <= нижнему пределу = только покупаем, Иначе - блокировка действий} BuySellResolution := If((CP < HLim) AND (CP > LLim), Go, If(CP >= HLim, Sl, If(CP<=LLim, By, Lock) ) ); {Дополнительный "Предохранитель"} BuySellResolution := If(HLim <= LLim OR HLim = 0, 0, BuySellResolution); {Получаем значение скользящей средней} MA90 := Mov(C, MAPeriod, S); {Получаем значение MACD - гистограммы} MACDH := MACD()-Mov(MACD(),9,E); {Определяем покупка или продажа} BuySell := 0; BuySell := If((Cross(MACDH, 0)) AND (Mov(C,1,S) > MA90),1,BuySell); BuySell := If((Cross(0, MACDH)) AND (Mov(C,1,S) > MA90),-1,BuySell); {Ограничение открытых позиций} {Если BuySellResolution = 2 - разрешаем все, Если BuySellResolution = 1 - только покупку, Если BuySellResolution = -1 - только продажу, иначе блокировка} BuySell:= If(BuySellResolution = 2, BuySell, If((BuySellResolution = 1) AND (BuySell = 1), 1, If((BuySellResolution = -1) AND (BuySell = -1), -1, 0) ) ); {Количество лотов за одну транзакцию} CntLot:= If(BuySell<>0,CntLot,0); {Определяем цены при покупке и продаже} PR := 0; PR := If(BuySell = 1, C*0.9999, PR); PR := If(BuySell = -1, C*1.0001, PR); {Отправка транзакции} tmp := ExtFml( "TAutoTrader.MSPushOrder", "YYYYYYY", "EQBR", "SBER", "L", LastValue(PR), LastValue(CntLot), 2,LastValue(BuySell), "XXXXXXX"); MA90;
Я пока новичек в работе с метастоком, поэтому если Вы заметите ошибки или в чем-то поправите, я буду только рад.
Комментариев нет:
Отправить комментарий