ChatGTPをつかってBinanceむけの取引Botを作ってみる。

ChatGPTの月20ドルに課金してみた。2023年に世の中のルールが変わったことに気がついた。

昨年サラリーマンの中間管理職を辞めたので、プログラマに戻って、もういちど技術者としてどこまでやれるか頑張ってみようと考えていた。2023年の最初の3ヶ月で世の中のルールが変わっていた。

以下ChatGPTとの会話の画面ショット。

まずは画面ショット。最後にどこまで動くか確認してみよう。




コード全体

Cargo.toml

[dependencies]
reqwest = { version = "0.11", features = ["json"] }
serde_json = "1.0"
tokio = { version = "1", features = ["full"] }

mail.rs

use std::env;

use reqwest::header::{HeaderMap, HeaderValue, AUTHORIZATION};
use serde_json::Value;
use tokio;

const BINANCE_BASE_URL: &str = "https://fapi.binance.com";

async fn get_price(symbol: &str) -> Result<f64, Box<dyn std::error::Error>> {
    let url = format!("{}/fapi/v1/ticker/price?symbol={}", BINANCE_BASE_URL, symbol);
    let response = reqwest::get(&url).await?;
    let data: Value = response.json().await?;

    let price = data["price"].as_str().unwrap().parse::<f64>()?;

    Ok(price)
}

async fn place_order(api_key: &str, symbol: &str, price: f64) -> Result<(), Box<dyn std::error::Error>> {
    let url = format!("{}/fapi/v1/order", BINANCE_BASE_URL);
    let client = reqwest::Client::new();

    let mut headers = HeaderMap::new();
    headers.insert(AUTHORIZATION, HeaderValue::from_str(&format!("Bearer {}", api_key))?);

    let params = [
        ("symbol", symbol),
        ("side", "BUY"),
        ("type", "LIMIT"),
        ("timeInForce", "GTC"),
        ("quantity", "1"),
        ("price", &price.to_string()),
    ];

    let response = client.post(&url).headers(headers).form(&params).send().await?;

    println!("Order response: {:?}", response.text().await?);

    Ok(())
}

#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
    let api_key = env::var("BINANCE_API_KEY").expect("BINANCE_API_KEY must be set");
    let symbol = "BTCUSDT";
    let threshold_price: f64 = 30000.0; // Set your threshold price here

    loop {
        let current_price = get_price(symbol).await?;

        println!("Current price: {}", current_price);

        if current_price <= threshold_price {
            println!("Threshold reached, placing order");
            match place_order(&api_key, symbol, current_price).await {
                Ok(()) => println!("Order placed successfully"),
                Err(e) => eprintln!("Error placing order: {}", e),
            }
        }

        tokio::time::sleep(std::time::Duration::from_secs(5)).await;
    }
}

本当にうごくかな?

多分GTPにお願いすればやってくれそうだけど、自分でプロジェクトディレクトリを作成し、できたファイルにGTPがつくってくれたコードをcargo.toml とmain.rsへコピー。

 % cargo new botgtp
     Created binary (application) `botgtp` package

環境変数 BINANCE_API_KEYを設定して、実行!!
なんと、コンパイルエラーなしで一発で動く。

% cargo run        
    Finished dev [unoptimized + debuginfo] target(s) in 0.17s
     Running `target/debug/botgtp`
Current price: 26018.4
Threshold reached, placing order
Order response: "{\"code\":-2014,\"msg\":\"API-key format invalid.\"}"
Order placed successfully
Current price: 26013.8
Threshold reached, placing order
Order response: "{\"code\":-2014,\"msg\":\"API-key format invalid.\"}"
Order placed successfully
Current price: 26011.4
Threshold reached, placing order
Order response: "{\"code\":-2014,\"msg\":\"API-key format invalid.\"}"
Order placed successfully
Current price: 26015
Threshold reached, placing order
Order response: "{\"code\":-2014,\"msg\":\"API-key format invalid.\"}"
Order placed successfully
Current price: 26017.9
Threshold reached, placing order
Order response: "{\"code\":-2014,\"msg\":\"API-key format invalid.\"}"
Order placed successfully

エラーが出た!!。(なぜか)安心した。

さらに修正させてみる。

おい!! 知っているならば最初からやれよっ。

これから、飲みに行くので今日はここまでだけど、ここまでの所要時間30分。もう単なるプログラマは価値をうまないことを実感してしまった。



いいなと思ったら応援しよう!