Найти тему

Пишу биржевого бота через chatgpt. В восторге от возможностей

Оглавление

В этой статье я, простой рабочий, расскажу о chatgpt. Поговорим о кодинге и деплое на Яндекс.Облако. Формат: логи моей переписки с chatgpt + мои комментарии

Идея

Прежде всего, хочу представиться. Меня зовут Вася, и я уже создавал своих личных помощников - биржевых ботов[^1^], которые работали с API[^2^] Тинькофф Инвестиций[^3^]. Допустим, один из моих ботов автоматически покупал по 1000 долларов каждые две недели (сразу после получения зарплаты и аванса). Другой бот размещал эти средства в долларовые облигации[^4^] или инвестиционные фонды.

Однако, сейчас это всё потеряло актуальность, и мне захотелось сделать что-то новое. Моя новая цель — создание бота для регулярной покупки китайских юаней[^5^]. Я решил начать с нуля, не опираясь на мои старые боты. Более того, мне захотелось опробовать современные технологии, такие как система Яндекс Функций[^6^] и поддержка разработки chatgpt[^7^].

  • [^1^]: Биржевой бот - это программный продукт, который автоматически выполняет операции на бирже согласно заранее заданным правилам.
  • [^2^]: API (Application Programming Interface) - набор готовых классов, процедур, функций, структур данных, принятых для работы с некими системами.
  • [^3^]: Тинькофф Инвестиции - платформа для инвестирования от российского банка Тинькофф.
  • [^4^]: ОФЗ (облигации федерального займа) - это государственные обязательства России, выпускаемые в рублях или иностранной валюте.
  • [^5^]: Юань (CNY) - валюта Китайской Народной Республики.
  • [^6^]: Яндекс Функции - это облачная платформа для развертывания функций, написанных на разных языках программирования. С помощью Яндекс Функций разработчики могут писать код, не заботясь о серверах и инфраструктуре.
  • [^7^]: Chatgpt - это набор технологий для разработки программ, использующих искусственный интеллект (AI) для имитации естественных разговоров с человеческими пользователями.

Создание биржевого бота шаг за шагом

  1. Идея - я придумал новую идею для своего следующего бота.
  2. Репозиторий[^8^] - создал репозиторий для хранения кода нового бота.
  3. Токены - получение токенов[^9^] для доступа к API и совершения операций с валютой.
  4. Кодирование - написал код бота, определив логику его действий и совершаемых операций.
  5. Вновый бот для работы в режиме реального времени, с помощью системы Яндекс Функций.
  • [^8^]: Репозиторий - это место для хранения и управления программным кодом, контролирующее изменения и версии различных частей кода.
  • [^9^]: Токен - специальный ключ, выдаваемый системой, который предоставляет боту доступ к API и возможность совершения операций на бирже.

Написание кода

Дальше я приведу просто логи моего общения с chatgpt. В этот раз я не писал код сам. И даже не настраивал окружение. Я просто задавал вопросы и правл ошибки

You

Есть такое описание апи:

{ "figi": "string", "quantity": "string", "price": { "nano": 6, "units": "units" }, "direction": "ORDER_DIRECTION_UNSPECIFIED", "accountId": "string", "orderType": "ORDER_TYPE_UNSPECIFIED", "orderId": "string", "instrumentId": "string" }

Урл для запроса: https://sandbox-invest-public-api.tinkoff.ru/rest/tinkoff.public.invest.api.contract.v1.OrdersService/PostOrder

Надо написать функцию на nodejs, которая выполнит запрос. Авторизационный токен возьмет из параметров окружения.

Figi: BBG0013HRTL0 quantity: 100 direction: ORDER_DIRECTION_BUY Остальные поля не заполняем

ChatGPT

Для выполнения запроса в Node.js, вы можете использовать библиотеку axios. Установите её с помощью команды:

npm install axiosbashCopyInsertNew

Затем создайте функцию для выполнения запроса. Вам нужно установить заголовок Authorization со значением токена из переменных окружения. Также укажите необходимые параметры запроса. Вот пример функции:

const axios = require('axios');

async function postOrder() {
const token = process.env.AUTH_TOKEN;
const url = 'https://sandbox-invest-public-api.tinkoff.ru/rest/tinkoff.public.invest.api.contract.v1.OrdersService/PostOrder';

const data = {
figi: 'BBG0013HRTL0',
quantity: '100',
direction: 'ORDER_DIRECTION_BUY'
};

try {
const response = await axios.post(url, data, {
headers: {
'Authorization': `Bearer ${token}`,
'Content-Type': 'application/json'
}
});

console.log(response.data);
} catch (error) {
console.error('Error posting order:', error.message);
}
}

postOrder();

Пожалуйста, убедитесь, что авторизационный токен установлен в переменных окружения перед выполнением функции.

You

Перепиши на тайп скрипте

ChatGPT

Для переписывания функции на TypeScript, сначала установите axios и его типы:

npm install axios
npm install --save-dev @types/axiosbashCopyInsertNew

Затем создайте файл postOrder.ts и напишите функцию с использованием TypeScript:

import axios, { AxiosResponse } from 'axios';

interface PostOrderResponse {
// Здесь определите структуру вашего ответа API, если это необходимо
}

async function postOrder(): Promise {
const token: string = process.env.AUTH_TOKEN!;
const url: string = 'https://sandbox-invest-public-api.tinkoff.ru/rest/tinkoff.public.invest.api.contract.v1.OrdersService/PostOrder';

const data: object = {
figi: 'BBG0013HRTL0',
quantity: '100',
direction: 'ORDER_DIRECTION_BUY'
};

try {
const response: AxiosResponse = await axios.post(url, data, {
headers: {
'Authorization': `Bearer ${token}`,
'Content-Type': 'application/json'
}
});

console.log(response.data);
} catch (error: unknown) {
if (error instanceof Error) {
console.error('Error posting order:', error.message);
}
}
}

postOrder();typescriptCopyInsertNew

Убедитесь, что TypeScript компилирует ваш код без ошибок, выполнив команду tsc (если tsc установлен глобально) или npx tsc (если tsc установлен локально). После успешной компиляции запустите скомпилированный JavaScript файл с помощью Node.js.

You

Напиши package.json, который может запустить этот код

ChatGpt

Создайте файл package.json в корне вашего проекта и добавьте следующее содержимое:

{
"name": "tinkoff-api",
"version": "1.0.0",
"description": "Node.js / TypeScript app to interact with Tinkoff API",
"main": "dist/postOrder.js",
"scripts": {
"build": "tsc",
"start": "node dist/postOrder.js",
"dev": "tsc && node dist/postOrder.js"
},
"dependencies": {
"axios": "^0.25.0"
},
"devDependencies": {
"@types/axios": "^0.14.0",
"typescript": "^4.6.2"
}
}

Данный файл содержит информацию о вашем проекте и зависимости, а также добавляет несколько npm скриптов для сборки и запуска вашего кода:

  • build: собирает ваш TypeScript код с помощью компилятора TypeScript (tsc).
  • start: запускает собранное приложение с помощью Node.js.
  • dev: компилирует и запускает ваше приложение.

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

npm install
npm run dev

Это установит зависимости и запустит ваш код после компиляции TypeScript.

You

Как мне положить токен переменную окружения. Чтоб он всегда был доступен локально

ChatGPT

Чтобы сохранить токен в переменной окружения и сделать его доступным локально для вашего приложения, вы можете использовать файл .env. Для этого установите пакет dotenv:

npm install dotenvbashCopyInsertNew

Создайте файл .env в корне вашего проекта и добавьте токен в нём:

AUTH_TOKEN=your_token_hereiniCopyInsertNew

Замените your_token_here на ваш реальный токен.

Теперь, в начале файла postOrder.ts, импортируйте и активируйте dotenv:

import dotenv from 'dotenv';
dotenv.config();

// Остальной код

Это загрузит содержимое файла .env в process.env Node.js, сделав токен доступным в вашем приложении. Обратите внимание, что файл .env должен быть добавлен в ваш .gitignore, чтобы случайно не раз

По итогу этого общения у меня был готовый код и инструкции по запуску. Но как задеплоить? Пара простых вопросов и код исполняется в облаке

You

Как создать Cloud Functions в яндекс облаке, которая будет - брать код из гитхаб - выполнять его по расписанию

ChatGPT

Для создания Cloud Functions в Яндекс.Облаке, которая будет брать код из GitHub и запускаться по расписанию, выполните следующие шаги:

1. Создайте функцию в Яндекс.Облаке

  1. Войдите в свою учетную запись Яндекс.Облака.
  2. Создайте новый сервисный аккаунт и получите его ключ.
  3. Создайте новую функцию в "Управление функциями".

2. Настройте исходный код из Github

  1. В вашем репозитории GitHub создайте zip-архив с кодом функции. Обязательно добавьте файл index.js и укажите имя экспортируемой функции в поле entrypoint.

exports.handler = async (event, context) => {
// Здесь ваш код
};javascriptCopyInsertNew

  1. В "Управление функциями" Яндекс.Облаке выберите опцию "Загрузить из файла" и загрузите ваш ZIP-архив.

3. Настройте триггер на основе расписания

  1. В разделе "Триггеры" Яндекс.Облака создайте новый триггер.
  2. Выберите "Триггер на основе расписания" и задайте расписание в формате Cron.
  3. Выберите функцию, созданную на шаге 1, в качестве обработчика событий.

Теперь ваша функция будет автоматически запускаться в соответствии с заданным расписанием.

Имейте в виду, что Cloud Functions в Яндекс.Облаке не имеют непосредственной интеграции с GitHub. Если вы хотите автоматически обновлять исходный код функции в облаке при обновлении репозитория, рассмотрите использование инструмента CI/CD для автоматической загрузки файлов.

-2

Ага, все понятно. Но надо делать архив. Надо бы, конечно, научиться его делать в azure pipline или где-то еще. Но сейчас лень. Спрошу, как его делать. Непросто, но удалось добиться правильного ответа

You

У меня есть такая структуру файлов: dist/index.js, package.json, package-lock.json Надо запаковать это в плоский архив одной командой на маке. Архив положи в корень под название ycf.zip

ChatGPT

Для того чтобы создать архив на macOS, вы можете использовать команду zip в терминале. Вот пример команды, которая создаст архив с названием ycf.zip и положит его в корень проекта:

zip -r ycf.zip dist/index.js package.json package-lock.jsonbashCopyInsertNew

Объяснение:

  • zip: команда для создания архива
  • -r: ключ для рекурсивного добавления файлов и папок в архив
  • ycf.zip: имя создаваемого архива
  • dist/index.js, package.json, package-lock.json: файлы и папки, которые нужно добавить в архив

You

Папку dist надо раскрыть. Чтоб в результирующем архиве был плоский список

ChatGPT

Чтобы создать плоский архив, где содержимое папки dist будет раскрыто, используйте следующую команду:

zip ycf.zip dist/* package.json package-lock.jsonbashCopyInsertNew

Объяснение:

  • zip: команда для создания архива
  • ycf.zip: имя создаваемого архива
  • dist/*: раскрытие содержимого папки dist, чтобы добавить все файлы в плоский список
  • package.json, package-lock.json: файлы, которые нужно добавить в архив

You

Файлы из папки dist должны подняться на уровень выше

ChatGPT

Для того чтобы поднять файлы из папки dist на уровень выше и создать плоский архив, нужно использовать команду find вместе с zip:

find dist -mindepth 1 -type f -exec zip ycf.zip {} package.json package-lock.json \; -exec mv ycf.zip ../ \;bashCopyInsertNew

Объяснение:

  • find: команда для поиска файлов и папок
  • dist: имя папки, из которой нужно выбрать файлы
  • -mindepth 1: пропуск папки dist и выбор только ее содержимого
  • -type f: выбор только файлов, не папок
  • -exec: выполнение команды zip для каждого найденного файла
  • ycf.zip: имя создаваемого архива
  • {} package.json package-lock.json: фигурные скобки являются плейсхолдером для найденных файлов, а package.json и package-lock.json добавляются каждому архиву
  • \;: завершение команды exec
  • -exec mv ycf.zip ../ \;: перемещение архива на уровень выше в структуре директорий

Обратите внимание, что данная команда создаст архив с файлами из папки dist без сохранения директории папки.

-3

Итак, вся работа завершена. Код написан, собран в архив и загружен в систему Яндекс Функций. Теперь остается лишь настроить триггеры[^10^], чтобы активировать работу бота.

После всех этих этапов, теперь каждый будний день на моем счету автоматически приобретается 100 юаней. Миссия выполнена, и мой новый биржевой бот успешно олицетворяет идею использования современных технологий для упрощения финансовых операций.

[^10^]: Триггеры - это принципы работы функций, которые определены пользователем и срабатывают при наступлении определённых условий, в данном случае – активация бота в определенное время для автоматической покупки валюты.