Страницы

28 марта 2012 г.

MetaStock - TAutoTraderDLL. Первый осознанный биржевой робот.

Приветствую Вас в своем блоге.
       Параллельно с основной работой я периодически занимаюсь написанием торговых роботов с использованием 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;

Я пока новичек в работе с метастоком, поэтому если Вы заметите ошибки или в чем-то поправите, я буду только рад. 

Комментариев нет:

Отправить комментарий