PHP

Определение тенденции рынка ценных бумаг с помощью PHP: EMA

Мы будем использовать PHP для расчета 8-дневных и 21-дневных экспоненциальных скользящих средних, чтобы определить бычье/медвежье пересечение для акций.

Что такое скользящие средние?

Скользящие средние позволяют вам визуализировать поведение цены финансового инструмента в течение определенного периода времени. Этот индикатор широко используется в техническом анализе и называется «запаздывающим» индикатором, поскольку он основан на исторических ценах.

Двумя широко используемыми средними являются простая скользящая средняя (SMA) и экспоненциальная скользящая средняя (EMA). SMA — это простое среднее значение ценной бумаги за определенный период. EMA аналогична SMA, но придает большее значение более свежим ценам.

Примеры SMA и EMA

Самый простой способ понять SMA и EMA — это посмотреть на пример. Мы возьмем цены закрытия вымышленной ценной бумаги за последние 15 дней следующим образом:

  • Неделя 1: 10, 12, 15, 11, 18
  • Неделя 2: 21, 17, 15, 10, 7
  • Неделя 3: 8, 9, 15, 17, 20

В этом примере 10-дневная SMA будет средней ценой закрытия за предыдущие 10 дней. SMA после первого дня будет соответствовать предыдущим 10 дням, исключая первый день из списка.

Таблица, иллюстрирующая значения SMA и EMA

EMA немного более вовлечена. Она включает в себя расчет весового множителя перед определением EMA с использованием цены, значения веса и EMA предыдущего дня. К счастью, вам не нужно беспокоиться о базовой арифметике. PHP имеет библиотеку под названием Trader для расчетов технического анализа.

8-дневная и 21-дневная EMA

8-дневные и 21-дневные EMA — очень популярные краткосрочные индикаторы, используемые как на фондовом рынке, так и на рынке криптовалют.

Основными сигналами являются:

  • Когда 8-дневная линия пересекает вверх 21-дневную. Это указывает на бычье пересечение и на то, что цена, вероятно, вырастет (сигнал на покупку).
  • Когда 8-дневная линия пересекает вниз 21-дневную линию. Это указывает на медвежье пересечение и на то, что цена, вероятно, снизится (сигнал на продажу).

Глядя на график выше, я отметил, где пересекаются 8-дневная (синяя) и 21-дневная (красная линии), что приводит к тренду.

Подготовка окружения PHP

Мы будем использовать расширение PHP Trader для расчета EMA. Вы можете убедиться, что он установлен, проверив вывод phpinfo():

Исторические данные о ценах для примера мы будем брать через API CryptoCompare. Следующий запрос покажет нам цены BTC в долларах США за последние 60 дней:

https://min-api.cryptocompare.com/data/histoday?fsym=BTC&tsym=USD&limit=60

JSON из CryptoCompare

 Определение EMA

Добавьте следующий код, чтобы прочитать ответ от CryptoCompare API:

$response = json_decode(file_get_contents('https://min-api.cryptocompare.com/data/histoday?fsym=BTC&tsym=USD&limit=60'));

Этот запрос вернет ответ следующим образом, если вы выполните print_r($response):

Мы декодировали JSON объект, следующим шагом будет создание массива цен закрытия:

$prices = [];
foreach ($response->Data as $v) {
    $prices[] = $v->close;
}

Сохранив цены закрытия, мы сможем использовать PHP-функцию trader_ema() для определения 8-дневных и 21-дневных EMA:

$ema8 = trader_ema($prices, 8);
$ema21 = trader_ema($prices, 21);

Небольшое предостережение: по умолчанию расширение Trader использует точность до 3 знаков после запятой.

Для работы с монетами, которые отображаются с точностью до нескольких знаков после запятой. Например XRP и XLM, вы можете установить точность во время выполнения:

ini_set('trader.real_precision', '8');

Или отредактировав файл php.ini:

trader.real_precision=8

Теперь, когда у нас есть массивы EMA, мы возьмем последние две из каждой, чтобы установить EMA предыдущего дня и текущую EMA:

$current_8 = array_pop($ema8);
$current_21 = array_pop($ema21);
$previous_8 = array_pop($ema8);
$previous_21 = array_pop($ema21);

После этого мы можем проверить, произошло ли пересечение, и отреагировать соответствующим образом:

if ($current_8 > $current_21 && $previous_8 < $previous_21) {
    echo 'Buy';
} elseif ($current_8 < $current_21 && $previous_8 > $previous_21) {
    echo 'Sell';
} else {
    echo 'Do Nothing';
}

Финальный код

ini_set('trader.real_precision', '8');
$response = json_decode(file_get_contents('https://min-api.cryptocompare.com/data/histoday?fsym=BTC&tsym=USD&limit=60'));
$prices = [];

foreach ($response->Data as $k => $v) {
    $prices[] = $v->close;
}

$ema8 = trader_ema($prices, 8);
$ema21 = trader_ema($prices, 21);

$current_8 = array_pop($ema8);
$current_21 = array_pop($ema21);
$previous_8 = array_pop($ema8);
$previous_21 = array_pop($ema21);

echo 'Current 8-day: ' . $current_8 . '\n';
echo 'Current 21-day: ' . $current_21 . '\n';
echo 'Previous 8-day: ' . $previous_8 . '\n';
echo 'Previous 21-day: ' . $previous_21 . '\n';

if ($current_8 > $current_21 && $previous_8 < $previous_21) {
    echo 'Buy';
} elseif ($current_8 < $current_21 && $previous_8 > $previous_21) {
    echo 'Sell';
} else {
    echo 'Do Nothing';
}
To top