https://velog.io/@wang_ki/rust-binance-project-algorithm
이전 포스팅에서 알고리즘을 통해 얻은 가격 데이터를 터미널에 출력을 했었다.
원격으로도 받으면 좋을 것 같아 telegram api를 활용하여 봇에게 메시지를 보내는 방식을 구현하였다.
Telegram에서 BotFather를 활용하여 알리미를 추가하는 방법은 여러가지 포스팅이 있으니 구글을 참조하면 될 것 같다.
telegram api를 활용하기 위해서는 Chat id가 필요하다. 즉, 봇의 id를 알아야한다. 이 부분도 구글에 검색하면 자세히 나와있다.
필요한 것은 bot token과 chat id이다.
간단한 telegram alert api를 만들었다.
#[derive(Clone)]
pub struct Telegram {
bot_token: String,
chat_id: String,
}
Telegram구조체에 bot_token과 chat_id필드를 가지고 있다.
pub async fn send_alert(&self, msg: &str) -> anyhow::Result<()> {
let url = format!("https://api.telegram.org/bot{}/sendMessage", self.bot_token);
let client = Client::new();
let value = json!({
"name": "ChatGpt",
"age": 3,
"skills": ["Rust", "c++", "python"]
});
let _ = client.post(url)
.json(&serde_json::json!({
"chat_id": self.chat_id,
"text": msg,
}))
.send()
.await?;
Ok(())
}
매개변수로 bot에게 받을 메시지를 넘겨주면 끝이다.
아주 EZ하게 사용할 수 있도록 만들었다.
사용해보고 싶다면 아래 깃헙 링크에 접속하면 된다.
조만간 정리하여 crates.io에 올릴 예정이다.
https://github.com/wangki-kyu/telegram_alert_api
let futures = res.into_iter()
.filter_map(|item| item.ok())
.filter_map(|item| item)
.flat_map(|t| {
let telegram_clone = Arc::clone(&telegram);
t.into_iter().map(move |algo| {
let telegram_clone2 = Arc::clone(&telegram_clone);
async move {
let json = serde_json::to_string_pretty(&algo).unwrap();
let result = format!("====== symbol: [{}], interval: [{}] ======\n{}", algo.get_symbol(), algo.get_interval(), json);
println!("{:?}", algo);
telegram_clone2.send_alert(result.as_str()).await.unwrap();
}
})
});
for t in futures {
t.await;
}
개발 중인 봇의 일부 코드이다. 세팅한 algorithm을 통과한 res값을 순회하며 async block 안에 telegram api를 호출 해준다.
최종적으로 futures를 돌면서 동기적으로 호출하게 된다. 정확히 telgram api가 어느 정도로 빠르게 호출이 되는지 확인해 봐야 할 것 같다. 확인 후 비동기적으로 빠르게 호출하도록 변경할 예정이다.

위 사진처럼 설정한 데이터가 봇 알리미를 통해서 오는 것을 확인할 수 있다.
진전이 많이 있는 것 같다. 최종적으로 매수 매도 신호까지 가야한다. 그리고 알고리즘에 100%라는 것은 없다고 생각한다. 지속적으로 알고리즘을 블록단위로 만들어서 빠르게 원하는 전략을 세울 수 있도록 해야겠다.
끝