Пример автоматизированной торговой стратегии на ATF

17 мая 2010, 00:00

Основа любого индикатора — это функция 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, пересечение которого с 0 и говорит о пересечении линий 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);
                        }
}
}