Мы будем использовать 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 дням, исключая первый день из списка.
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
Определение 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';
}