EIS (Elder’s Impuse System) с помощью Python и C

EIS — Ипульсная Система Элдера была представлена и объяснена в книгах А. Элдера. Система показывает импульс движения цены и может принимать три цветовых значения:

  • красный — разрешен шорт, запрещен лонг;
  • синий — разрешены оба направления;
  • зеленый — запрещен шорт, разрешен лонг.

Ниже подробные пояснения и примеры кода.

Система стремится упростить торговлю в канале на коротких промежутках времени с удержанием сделки 1-5 дней. Сигналы меняются достаточно быстро и в среднесроке будут давать множество ложных срабатываний.

Из чего состоит

В основе системы лежат:

  • EMA(13) — экспоненциальная скользящая средняя за 13 дней от цены закрытия.
  • MACD с параметрами 12, 26 и 9, то есть EMA(12) от цены закрытия, EMA(26) от цены закрытия и сигнальная EMA(9) от разницы длинной и короткой EMA.

Сигналы:

  • Красный — EMA(13) изменяется вниз (текущее значение ниже предыдущего) и гистограмма MACD изменяется вниз (текущее значение ниже предыдущего).
  • Синий — EMA(13) и гистограмма MACD изменяются в разных направлениях.
  • Зеленый — EMA(13) изменяется вверх (текущее значение выше предыдущего) и гистограмма MACD изменяется вверх (текущее значение выше предыдущего).

Как работает

Система используется как фильтр для открытия позиций. Автор раскрашивает бары или свечи графика в соответствии с цветом сигнала. Пример ниже показывает, что на краю канала или при входе в канал синий бар может показывать верную точку входа (синие стрелки). В случае, когда синяя не переходит в сигнал направления сделки (красный — шорт, зеленый — лонг) или даже принимает противоположный цвет, то, возможно, стоит закрыть позицию.

EA: EIS в канале
Сигналы EIS при торговле в канале

Как реализовать на Python

Для этого нам понадобится пакет talib, который можно установить командой ниже, предварительно установив библиотеку TA-Lib:

pip install talib

Пример кода в блокноте IPython (Jupyter). Подключение к базе данных, подсказки, где взять эту самую базу данных и получение истории цен подробнее описаны здесь. Полная версия блокнота доступна в репозитории. Ниже описана обработка истории цены и получение массива со значением EIS: -1 — красный; 0 — синий; 1 — зеленый.

# get price history
p = prices(['EA'], date(2016, 11, 15), 200)

# prepare dict with necessary data
arr = {
    'dt': np.array([x[1] for x in p]),
    'close': np.array([x[5] for x in p])
}
arr['ema13'] = talib.EMA(arr['close'], 13)
arr['macd'], arr['signal'], arr['macdhist'] = talib.MACD(arr['close'], 12, 26, 9)

# accumulate difference from previous day
change_fields = ['ema13', 'macdhist']
for f in change_fields:
    arr['change_' + f] = np.insert(arr[f][1:] - arr[f][:-1], 0, 0)

# change nan to 0 for comparison
arr['change_ema13'][np.isnan(arr['change_ema13'])] = 0
arr['change_macdhist'][np.isnan(arr['change_macdhist'])] = 0

# get eis
arr['eis'] = np.where(
    (arr['change_ema13'] > 0) & (arr['change_macdhist'] > 0), 
    1,
    np.where(
        (arr['change_ema13'] < 0) & (arr['change_macdhist'] < 0), 
        -1, 
        0))

# print dict with eis value by date
dict(zip(arr['dt'], arr['eis']))

Как реализовать на C

Предварительно установим библиотеку TA-Lib. Теперь задача решается двумя вызовами нужных индикаторов, EMA(13) и MACD(12, 26, 9), и анализом полученных массивов.

Пример кода на C. На вход передаем указатели на массив EMA(13) и гистограммы MACD(12, 26, 9).

/**
    Generate EIS signals
*/
void eis(double *ema, double *macdhist, unsigned length, double **out)
{
    double *ptr_prev_ema = &ema[0];
    double *ptr_prev_hist = &macdhist[0];
    int i = 1;


    // Start from 1, except 0
    for (double *ptr = *out+1; ptr != *out+length; ++ptr, ++i) {
        if (*ptr_prev_ema > ema[i] && *ptr_prev_hist > macdhist[i]) {
            *ptr = -1;
        } else if (*ptr_prev_ema < ema[i] && *ptr_prev_hist < macdhist[i]) {
            *ptr = 1;
        } else {
            *ptr = 0;
        }
        ptr_prev_ema = &ema[i];
        ptr_prev_hist = &macdhist[i];
    }

}

Репозиторий

Весь код доступен в репозитории. Вы можете использовать его на свой страх и риск.

Напишите в комментариях, может ли пригодиться EIS в алготорговле?